diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..6fbe15766b6362a2d31add3de93739eb5567b87a --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +*.iml +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures +gradle.xml + diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000000000000000000000000000000000000..ab4cdc2cff368a6c619dba978a7d64d2a1295be8 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +Elove \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000000000000000000000000000000000000..96cc43efa6a0885098044e976cd780bb42c68a70 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml new file mode 100644 index 0000000000000000000000000000000000000000..e7bedf3377d40335424fd605124d4761390218bb --- /dev/null +++ b/.idea/copyright/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000000000000000000000000000000000000..76e722ccd2e88b1795b1d0c19e6f45de8c57eccf --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000000000000000000000000000000000000..5d19981032aa01b060f5a568641d7a8840cc90dc --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000000000000000000000000000000000000..058d10b06c55bd200be7cdd0f4a48ee6cac3b97f --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000000000000000000000000000000000000..7f68460d8b38ac04e3a3224d7c79ef719b1991a9 --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000000000000000000000000000000000000..94a25f7f4cb416c083d265558da75d457237d671 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/.gitignore b/JQ_ELOVE/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..796b96d1c402326528b4ba3c12ee9d92d0e212e9 --- /dev/null +++ b/JQ_ELOVE/.gitignore @@ -0,0 +1 @@ +/build diff --git a/JQ_ELOVE/.idea/.name b/JQ_ELOVE/.idea/.name new file mode 100644 index 0000000000000000000000000000000000000000..7921640ab760462942898d060bd7c5f5fc6feb6b --- /dev/null +++ b/JQ_ELOVE/.idea/.name @@ -0,0 +1 @@ +JQ_ELOVE \ No newline at end of file diff --git a/JQ_ELOVE/.idea/compiler.xml b/JQ_ELOVE/.idea/compiler.xml new file mode 100644 index 0000000000000000000000000000000000000000..96cc43efa6a0885098044e976cd780bb42c68a70 --- /dev/null +++ b/JQ_ELOVE/.idea/compiler.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/.idea/copyright/profiles_settings.xml b/JQ_ELOVE/.idea/copyright/profiles_settings.xml new file mode 100644 index 0000000000000000000000000000000000000000..e7bedf3377d40335424fd605124d4761390218bb --- /dev/null +++ b/JQ_ELOVE/.idea/copyright/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/JQ_ELOVE/.idea/encodings.xml b/JQ_ELOVE/.idea/encodings.xml new file mode 100644 index 0000000000000000000000000000000000000000..97626ba45445dc9f3afa66e6a149914dc39e3df6 --- /dev/null +++ b/JQ_ELOVE/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/.idea/misc.xml b/JQ_ELOVE/.idea/misc.xml new file mode 100644 index 0000000000000000000000000000000000000000..6eabdcd6ca3b00fce8be8c95fb1c2443e8bc3ee6 --- /dev/null +++ b/JQ_ELOVE/.idea/misc.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/.idea/workspace.xml b/JQ_ELOVE/.idea/workspace.xml new file mode 100644 index 0000000000000000000000000000000000000000..4157fb9463e9d53806a1377b8222d4948313a3d6 --- /dev/null +++ b/JQ_ELOVE/.idea/workspace.xml @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1465279585854 + + + + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/build.gradle b/JQ_ELOVE/build.gradle new file mode 100644 index 0000000000000000000000000000000000000000..061ecda15f333b1e53351c8f0146e06a6ae0368e --- /dev/null +++ b/JQ_ELOVE/build.gradle @@ -0,0 +1,140 @@ +apply plugin: 'com.android.application' + +def releaseTime() { + return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC")) +} + +android { + + signingConfigs { + standard { + keyAlias 'standard' + keyPassword 'android' + storeFile file('D:/appsign/android.jks') + storePassword 'android' + } + } + aaptOptions.cruncherEnabled = false + aaptOptions.useNewCruncher = false + compileSdkVersion 25 + buildToolsVersion "25.0.2" + defaultConfig { + applicationId "com.jiuqi.elove" + minSdkVersion 17 + targetSdkVersion 25 + versionCode 34 + versionName "3.2.1" +// // dex突破65535的限制 + multiDexEnabled true + manifestPlaceholders = [UMENG_CHANNEL_VALUE: "default_channel"] + + ndk { + abiFilters "armeabi" + } + } + productFlavors { + xiaomi {} + _360 {} + baidu {} + wandoujia {} + official {} + yingyongbao {} + anzhi {} + huawei {} + + } + productFlavors.all { + flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name] + } + + buildTypes { + release { + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + signingConfig signingConfigs.standard +// buildConfigField "boolean", "LOG_DEBUG", "false" +// minifyEnabled true + zipAlignEnabled true + // 移除无用的resource文件 + shrinkResources false + applicationVariants.all { variant -> + variant.outputs.each { output -> + def outputFile = output.outputFile + if (outputFile != null && outputFile.name.endsWith('.apk')) { + // 输出apk名称为elove_v1.0_2015-01-15_wandoujia.apk + def fileName = "elove_v${defaultConfig.versionName}_${releaseTime()}_${variant.productFlavors[0].name}.apk" + output.outputFile = new File(outputFile.parent, fileName) + } + } + } + } + debug { + signingConfig signingConfigs.standard + } + } + sourceSets { + main { + jniLibs.srcDirs = ['libs']//就是你存放so文件夹的不同cup目录地址 + } + } + configurations { +// all*.exclude group: 'com.android.support', module: 'support-v4' +// //解决资源加载器解压时重复的问题java.util.zip.ZipException: duplicate entry: android/support/annotation/ColorRes.class +// all*.exclude group: 'com.android.support', module: 'support-annotations' + } + dexOptions { + javaMaxHeapSize "4g" + } +// 趣拍需要 + //其它配置 + packagingOptions { + exclude 'META-INF/LICENSE' + exclude 'META-INF/NOTICE' + } + + repositories { + maven { url "https://jitpack.io" } + } + + repositories { flatDir { dirs 'libs' } } + +} + +dependencies { + compile fileTree(include: ['*.jar'], dir: 'libs') + compile project(path: ':easeui') + compile files('libs/jpush-android-2.1.7.jar') + compile files('libs/alipaySdk-20160825.jar') + compile project(':Qupaisdk-release') + compile(name: 'newsagent', ext: 'aar') + compile(name: 'adagent', ext: 'aar') + compile 'com.android.support:appcompat-v7:25.3.1' + compile 'com.android.support:support-v4:25.3.1' + compile 'com.android.support:recyclerview-v7:25.3.1' + compile 'com.android.support:design:25.3.1' + compile 'com.android.support:cardview-v7:25.3.1' + compile 'com.android.support:multidex:1.0.1' +// compile 'com.android.support.constraint:constraint-layout:1.0.2' + compile 'com.google.code.gson:gson:2.7' + compile 'com.baoyz.actionsheet:library:1.1.5' + compile 'com.umeng.analytics:analytics:latest.integration' + compile 'com.fasterxml.jackson.core:jackson-databind:2.6.4' + compile 'com.google.dagger:dagger-compiler:2.0.1' + compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.4' + compile 'com.google.code.findbugs:jsr305:3.0.0' + compile 'com.github.PhilJay:MPAndroidChart:v2.1.6' + compile 'com.huxq17.android:SwipeCardsView:1.3.4' + compile 'com.jakewharton:butterknife:8.6.0' + compile 'com.gyf.barlibrary:barlibrary:2.3.0' + compile 'com.squareup.okhttp3:logging-interceptor:3.8.1' + compile 'de.hdodenhof:circleimageview:2.1.0' + compile 'com.squareup.okhttp3:okhttp:3.9.0' + compile 'com.squareup.okhttp:okhttp:2.4.0' + compile 'org.greenrobot:eventbus:3.0.0' + compile 'com.contrarywind:Android-PickerView:3.2.5' + compile 'com.github.pinguo-zhouwei:MZBannerView:v2.0.0' + compile 'com.tbruyelle.rxpermissions:rxpermissions:0.9.3@aar' + compile 'io.reactivex:rxjava:1.0.14' + compile 'com.google.android:flexbox:0.2.6' + testCompile 'junit:junit:4.12' + annotationProcessor 'com.jakewharton:butterknife-compiler:8.6.0' +} diff --git a/JQ_ELOVE/gradle/wrapper/gradle-wrapper.jar b/JQ_ELOVE/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..13372aef5e24af05341d49695ee84e5f9b594659 Binary files /dev/null and b/JQ_ELOVE/gradle/wrapper/gradle-wrapper.jar differ diff --git a/JQ_ELOVE/gradle/wrapper/gradle-wrapper.properties b/JQ_ELOVE/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000000000000000000000000000000000..122a0dca2e800b3ccf474321fc5e63551f507d29 --- /dev/null +++ b/JQ_ELOVE/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Mon Dec 28 10:00:20 PST 2015 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip diff --git a/JQ_ELOVE/gradlew b/JQ_ELOVE/gradlew new file mode 100644 index 0000000000000000000000000000000000000000..9d82f78915133e1c35a6ea51252590fb38efac2f --- /dev/null +++ b/JQ_ELOVE/gradlew @@ -0,0 +1,160 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/JQ_ELOVE/gradlew.bat b/JQ_ELOVE/gradlew.bat new file mode 100644 index 0000000000000000000000000000000000000000..8a0b282aa6885fb573c106b3551f7275c5f17e8e --- /dev/null +++ b/JQ_ELOVE/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/JQ_ELOVE/libs/SocialSDK_QQZone_3.jar b/JQ_ELOVE/libs/SocialSDK_QQZone_3.jar new file mode 100644 index 0000000000000000000000000000000000000000..a080eb442f60b2ff8e8e380cdf41daa528588cae Binary files /dev/null and b/JQ_ELOVE/libs/SocialSDK_QQZone_3.jar differ diff --git a/JQ_ELOVE/libs/SocialSDK_Sina.jar b/JQ_ELOVE/libs/SocialSDK_Sina.jar new file mode 100644 index 0000000000000000000000000000000000000000..58f7e38c0525424304cefa6a6f6c4c6ca6fe005f Binary files /dev/null and b/JQ_ELOVE/libs/SocialSDK_Sina.jar differ diff --git a/JQ_ELOVE/libs/SocialSDK_WeiXin_1.jar b/JQ_ELOVE/libs/SocialSDK_WeiXin_1.jar new file mode 100644 index 0000000000000000000000000000000000000000..0cd8a5ce23a91c5f71315b611dcd6cbddfb42ac9 Binary files /dev/null and b/JQ_ELOVE/libs/SocialSDK_WeiXin_1.jar differ diff --git a/JQ_ELOVE/libs/SocialSDK_WeiXin_2.jar b/JQ_ELOVE/libs/SocialSDK_WeiXin_2.jar new file mode 100644 index 0000000000000000000000000000000000000000..17c50346ed2a832842ef1c02d96b41a2c6c270bc Binary files /dev/null and b/JQ_ELOVE/libs/SocialSDK_WeiXin_2.jar differ diff --git a/JQ_ELOVE/libs/adagent.aar b/JQ_ELOVE/libs/adagent.aar new file mode 100644 index 0000000000000000000000000000000000000000..813e2d918994972f8894f7907569a23bb3de6da3 Binary files /dev/null and b/JQ_ELOVE/libs/adagent.aar differ diff --git a/JQ_ELOVE/libs/alipaySdk-20160825.jar b/JQ_ELOVE/libs/alipaySdk-20160825.jar new file mode 100644 index 0000000000000000000000000000000000000000..e74f32a0fcd43ca9c70c0973d43aca9a9ba36c8a Binary files /dev/null and b/JQ_ELOVE/libs/alipaySdk-20160825.jar differ diff --git a/JQ_ELOVE/libs/aliyun-oss-sdk-android-2.2.0.jar b/JQ_ELOVE/libs/aliyun-oss-sdk-android-2.2.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..a3414a9e985a07a12430ad1f2051d79d7f422cdf Binary files /dev/null and b/JQ_ELOVE/libs/aliyun-oss-sdk-android-2.2.0.jar differ diff --git a/JQ_ELOVE/libs/armeabi/libBaiduMapSDK_base_v4_5_2.so b/JQ_ELOVE/libs/armeabi/libBaiduMapSDK_base_v4_5_2.so new file mode 100644 index 0000000000000000000000000000000000000000..31df3f96f4727a47a1f6576688bc6ee6b92a162b Binary files /dev/null and b/JQ_ELOVE/libs/armeabi/libBaiduMapSDK_base_v4_5_2.so differ diff --git a/JQ_ELOVE/libs/armeabi/libBaiduMapSDK_map_v4_5_2.so b/JQ_ELOVE/libs/armeabi/libBaiduMapSDK_map_v4_5_2.so new file mode 100644 index 0000000000000000000000000000000000000000..d9b6825a6e8dda9afd3d2cbfbde5e3c3924a9d5b Binary files /dev/null and b/JQ_ELOVE/libs/armeabi/libBaiduMapSDK_map_v4_5_2.so differ diff --git a/JQ_ELOVE/libs/armeabi/libjpush217.so b/JQ_ELOVE/libs/armeabi/libjpush217.so new file mode 100644 index 0000000000000000000000000000000000000000..34d56e71fae3e099f1f3bac7149dbb64b5dfb669 Binary files /dev/null and b/JQ_ELOVE/libs/armeabi/libjpush217.so differ diff --git a/JQ_ELOVE/libs/armeabi/liblocSDK7b.so b/JQ_ELOVE/libs/armeabi/liblocSDK7b.so new file mode 100644 index 0000000000000000000000000000000000000000..1a9a34ae05e3589eb54b20946232dc59a5c8faa5 Binary files /dev/null and b/JQ_ELOVE/libs/armeabi/liblocSDK7b.so differ diff --git a/JQ_ELOVE/libs/armeabi/libqupai-media-jni.so b/JQ_ELOVE/libs/armeabi/libqupai-media-jni.so new file mode 100644 index 0000000000000000000000000000000000000000..d75a7c1f8573fff5e6e1c3780451cb0d721d5af2 Binary files /dev/null and b/JQ_ELOVE/libs/armeabi/libqupai-media-jni.so differ diff --git a/JQ_ELOVE/libs/armeabi/libqupai-media-thirdparty.so b/JQ_ELOVE/libs/armeabi/libqupai-media-thirdparty.so new file mode 100644 index 0000000000000000000000000000000000000000..d6cbe53f94cc1a6ad12bec830022ac7efc2e853f Binary files /dev/null and b/JQ_ELOVE/libs/armeabi/libqupai-media-thirdparty.so differ diff --git a/JQ_ELOVE/libs/armeabi/libweibosdkcore.so b/JQ_ELOVE/libs/armeabi/libweibosdkcore.so new file mode 100644 index 0000000000000000000000000000000000000000..94192f93213dbbe274d8d30891e9a0b467e8055a Binary files /dev/null and b/JQ_ELOVE/libs/armeabi/libweibosdkcore.so differ diff --git a/JQ_ELOVE/libs/fastjson-1.1.34.android.jar b/JQ_ELOVE/libs/fastjson-1.1.34.android.jar new file mode 100644 index 0000000000000000000000000000000000000000..bf50c46fe88be8b0315f5b2a079414f835608f5e Binary files /dev/null and b/JQ_ELOVE/libs/fastjson-1.1.34.android.jar differ diff --git a/JQ_ELOVE/libs/jpush-android-2.1.7.jar b/JQ_ELOVE/libs/jpush-android-2.1.7.jar new file mode 100644 index 0000000000000000000000000000000000000000..dc17b8096106fc06d67ed9b8edb95516a7a08202 Binary files /dev/null and b/JQ_ELOVE/libs/jpush-android-2.1.7.jar differ diff --git a/JQ_ELOVE/libs/mta-sdk-1.6.2.jar b/JQ_ELOVE/libs/mta-sdk-1.6.2.jar new file mode 100644 index 0000000000000000000000000000000000000000..49b77879d8fab493bfe0ee21eb6aacc1cb18e6f0 Binary files /dev/null and b/JQ_ELOVE/libs/mta-sdk-1.6.2.jar differ diff --git a/JQ_ELOVE/libs/newsagent.aar b/JQ_ELOVE/libs/newsagent.aar new file mode 100644 index 0000000000000000000000000000000000000000..bcc169a6e214eca6ea05b359065d19c15520ca22 Binary files /dev/null and b/JQ_ELOVE/libs/newsagent.aar differ diff --git a/JQ_ELOVE/libs/open_sdk_r5509.jar b/JQ_ELOVE/libs/open_sdk_r5509.jar new file mode 100644 index 0000000000000000000000000000000000000000..550530a70e832f12469e72da856ce94498ce9ee3 Binary files /dev/null and b/JQ_ELOVE/libs/open_sdk_r5509.jar differ diff --git a/JQ_ELOVE/libs/umeng_social_sdk.jar b/JQ_ELOVE/libs/umeng_social_sdk.jar new file mode 100644 index 0000000000000000000000000000000000000000..96beedabaa53dcea8dd6f937e9972c77b56a64dc Binary files /dev/null and b/JQ_ELOVE/libs/umeng_social_sdk.jar differ diff --git a/JQ_ELOVE/libs/weiboSDKCore_3.1.4.jar b/JQ_ELOVE/libs/weiboSDKCore_3.1.4.jar new file mode 100644 index 0000000000000000000000000000000000000000..6300cf2e27b759e623863dc76d3c470877dc065c Binary files /dev/null and b/JQ_ELOVE/libs/weiboSDKCore_3.1.4.jar differ diff --git a/JQ_ELOVE/libs/zxing.jar b/JQ_ELOVE/libs/zxing.jar new file mode 100644 index 0000000000000000000000000000000000000000..e7b7afc79e4136c58854f435b5a833b4a766dc00 Binary files /dev/null and b/JQ_ELOVE/libs/zxing.jar differ diff --git a/JQ_ELOVE/local.properties b/JQ_ELOVE/local.properties new file mode 100644 index 0000000000000000000000000000000000000000..e9b05d2c0d23b1bd183be49ec3611c1e6178e418 --- /dev/null +++ b/JQ_ELOVE/local.properties @@ -0,0 +1,11 @@ +## This file is automatically generated by Android Studio. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must *NOT* be checked into Version Control Systems, +# as it contains information specific to your local configuration. +# +# Location of the SDK. This is only used by Gradle. +# For customization when using a Version Control System, please read the +# header note. +#Tue Jun 07 14:06:25 CST 2016 +sdk.dir=D\:\\sdk diff --git a/JQ_ELOVE/proguard-rules.pro b/JQ_ELOVE/proguard-rules.pro new file mode 100644 index 0000000000000000000000000000000000000000..64a93c368d0111eb3bde2c0058349cad7656b0be --- /dev/null +++ b/JQ_ELOVE/proguard-rules.pro @@ -0,0 +1,53 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in F:\sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} +-keep class com.hyphenate.** {*;} +-dontwarn com.hyphenate.** +-keep class com.baidu.** {*;} +-keep class vi.com.** {*;} +-dontwarn com.baidu.** + +-dontoptimize +-dontpreverify + +-dontwarn cn.jpush.** +-keep class cn.jpush.** { *; } + +#==================gson========================== +-dontwarn com.google.** +-keep class com.google.gson.** {*;} + +#==================protobuf====================== +-dontwarn com.google.** +-keep class com.google.protobuf.** {*;} + +-keep class com.alibaba.sdk.android.oss.** { *; } +-dontwarn okio.** +-dontwarn org.apache.commons.codec.binary.** + +-libraryjars libs/alipaySDK-20160825.jar + +-keep class com.alipay.android.app.IAlixPay{*;} +-keep class com.alipay.android.app.IAlixPay$Stub{*;} +-keep class com.alipay.android.app.IRemoteServiceCallback{*;} +-keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;} +-keep class com.alipay.sdk.app.PayTask{ public *;} +-keep class com.alipay.sdk.app.AuthTask{ public *;} + +-keep class com.tencent.mm.sdk.** { + *; +} \ No newline at end of file diff --git a/JQ_ELOVE/src/androidTest/java/cn/com/jiuqi/elove/ApplicationTest.java b/JQ_ELOVE/src/androidTest/java/cn/com/jiuqi/elove/ApplicationTest.java new file mode 100644 index 0000000000000000000000000000000000000000..0cd412a42b829951c28198ab7fb7e28ebc0050b4 --- /dev/null +++ b/JQ_ELOVE/src/androidTest/java/cn/com/jiuqi/elove/ApplicationTest.java @@ -0,0 +1,13 @@ +package cn.com.jiuqi.elove; + +import android.app.Application; +import android.test.ApplicationTestCase; + +/** + * Testing Fundamentals + */ +public class ApplicationTest extends ApplicationTestCase { + public ApplicationTest() { + super(Application.class); + } +} \ No newline at end of file diff --git a/JQ_ELOVE/src/main/AndroidManifest.xml b/JQ_ELOVE/src/main/AndroidManifest.xml new file mode 100644 index 0000000000000000000000000000000000000000..e5992f9bf88b0ec91cc05c4aaa4c19b351712c80 --- /dev/null +++ b/JQ_ELOVE/src/main/AndroidManifest.xml @@ -0,0 +1,879 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/assets/area.json b/JQ_ELOVE/src/main/assets/area.json new file mode 100644 index 0000000000000000000000000000000000000000..42bc6f79a7b2ac204834d6e29b1f66541187522e --- /dev/null +++ b/JQ_ELOVE/src/main/assets/area.json @@ -0,0 +1,2831 @@ +[{"AreaID":110114, "name":"昌平区", "CityID":110100, "AreaSort":110000}, +{"AreaID":110115, "name":"大兴区", "CityID":110100, "AreaSort":110000}, +{"AreaID":110116, "name":"怀柔区", "CityID":110100, "AreaSort":110000}, +{"AreaID":110117, "name":"平谷区", "CityID":110100, "AreaSort":110000}, +{"AreaID":110108, "name":"海淀区", "CityID":110100, "AreaSort":110000}, +{"AreaID":110111, "name":"房山区", "CityID":110100, "AreaSort":110000}, +{"AreaID":110107, "name":"石景山区", "CityID":110100, "AreaSort":110000}, +{"AreaID":110112, "name":"通州区", "CityID":110100, "AreaSort":110000}, +{"AreaID":110113, "name":"顺义区", "CityID":110100, "AreaSort":110000}, +{"AreaID":110109, "name":"门头沟区", "CityID":110100, "AreaSort":110000}, +{"AreaID":110106, "name":"丰台区", "CityID":110100, "AreaSort":110000}, +{"AreaID":110105, "name":"朝阳区", "CityID":110100, "AreaSort":110000}, +{"AreaID":110118, "name":"密云区", "CityID":110100, "AreaSort":110000}, +{"AreaID":110119, "name":"延庆区", "CityID":110100, "AreaSort":110000}, +{"AreaID":110102, "name":"西城区", "CityID":110100, "AreaSort":110000}, +{"AreaID":110101, "name":"东城区", "CityID":110100, "AreaSort":110000}, +{"AreaID":120102, "name":"河东区", "CityID":120100, "AreaSort":120000}, +{"AreaID":120103, "name":"河西区", "CityID":120100, "AreaSort":120000}, +{"AreaID":120118, "name":"静海区", "CityID":120100, "AreaSort":120000}, +{"AreaID":120104, "name":"南开区", "CityID":120100, "AreaSort":120000}, +{"AreaID":120117, "name":"宁河区", "CityID":120100, "AreaSort":120000}, +{"AreaID":120105, "name":"河北区", "CityID":120100, "AreaSort":120000}, +{"AreaID":120101, "name":"和平区", "CityID":120100, "AreaSort":120000}, +{"AreaID":120112, "name":"津南区", "CityID":120100, "AreaSort":120000}, +{"AreaID":120111, "name":"西青区", "CityID":120100, "AreaSort":120000}, +{"AreaID":120110, "name":"东丽区", "CityID":120100, "AreaSort":120000}, +{"AreaID":120116, "name":"滨海新区", "CityID":120100, "AreaSort":120000}, +{"AreaID":120106, "name":"红桥区", "CityID":120100, "AreaSort":120000}, +{"AreaID":120115, "name":"宝坻区", "CityID":120100, "AreaSort":120000}, +{"AreaID":120114, "name":"武清区", "CityID":120100, "AreaSort":120000}, +{"AreaID":120113, "name":"北辰区", "CityID":120100, "AreaSort":120000}, +{"AreaID":120225, "name":"蓟县", "CityID":120100, "AreaSort":120000}, +{"AreaID":131128, "name":"阜城县", "CityID":131100, "AreaSort":131100}, +{"AreaID":131102, "name":"桃城区", "CityID":131100, "AreaSort":131100}, +{"AreaID":131126, "name":"故城县", "CityID":131100, "AreaSort":131100}, +{"AreaID":131181, "name":"冀州市", "CityID":131100, "AreaSort":131100}, +{"AreaID":131127, "name":"景县", "CityID":131100, "AreaSort":131100}, +{"AreaID":131124, "name":"饶阳县", "CityID":131100, "AreaSort":131100}, +{"AreaID":131125, "name":"安平县", "CityID":131100, "AreaSort":131100}, +{"AreaID":131122, "name":"武邑县", "CityID":131100, "AreaSort":131100}, +{"AreaID":131123, "name":"武强县", "CityID":131100, "AreaSort":131100}, +{"AreaID":131182, "name":"深州市", "CityID":131100, "AreaSort":131100}, +{"AreaID":131121, "name":"枣强县", "CityID":131100, "AreaSort":131100}, +{"AreaID":130202, "name":"路南区", "CityID":130200, "AreaSort":130200}, +{"AreaID":130203, "name":"路北区", "CityID":130200, "AreaSort":130200}, +{"AreaID":130224, "name":"滦南县", "CityID":130200, "AreaSort":130200}, +{"AreaID":130225, "name":"乐亭县", "CityID":130200, "AreaSort":130200}, +{"AreaID":130223, "name":"滦县", "CityID":130200, "AreaSort":130200}, +{"AreaID":130283, "name":"迁安市", "CityID":130200, "AreaSort":130200}, +{"AreaID":130229, "name":"玉田县", "CityID":130200, "AreaSort":130200}, +{"AreaID":130281, "name":"遵化市", "CityID":130200, "AreaSort":130200}, +{"AreaID":130208, "name":"丰润区", "CityID":130200, "AreaSort":130200}, +{"AreaID":130209, "name":"曹妃甸区", "CityID":130200, "AreaSort":130200}, +{"AreaID":130227, "name":"迁西县", "CityID":130200, "AreaSort":130200}, +{"AreaID":130207, "name":"丰南区", "CityID":130200, "AreaSort":130200}, +{"AreaID":130204, "name":"古冶区", "CityID":130200, "AreaSort":130200}, +{"AreaID":130205, "name":"开平区", "CityID":130200, "AreaSort":130200}, +{"AreaID":130702, "name":"桥东区", "CityID":130700, "AreaSort":130700}, +{"AreaID":130705, "name":"宣化区", "CityID":130700, "AreaSort":130700}, +{"AreaID":130706, "name":"下花园区", "CityID":130700, "AreaSort":130700}, +{"AreaID":130731, "name":"涿鹿县", "CityID":130700, "AreaSort":130700}, +{"AreaID":130703, "name":"桥西区", "CityID":130700, "AreaSort":130700}, +{"AreaID":130730, "name":"怀来县", "CityID":130700, "AreaSort":130700}, +{"AreaID":130733, "name":"崇礼县", "CityID":130700, "AreaSort":130700}, +{"AreaID":130728, "name":"怀安县", "CityID":130700, "AreaSort":130700}, +{"AreaID":130732, "name":"赤城县", "CityID":130700, "AreaSort":130700}, +{"AreaID":130727, "name":"阳原县", "CityID":130700, "AreaSort":130700}, +{"AreaID":130726, "name":"蔚县", "CityID":130700, "AreaSort":130700}, +{"AreaID":130725, "name":"尚义县", "CityID":130700, "AreaSort":130700}, +{"AreaID":130724, "name":"沽源县", "CityID":130700, "AreaSort":130700}, +{"AreaID":130723, "name":"康保县", "CityID":130700, "AreaSort":130700}, +{"AreaID":130722, "name":"张北县", "CityID":130700, "AreaSort":130700}, +{"AreaID":130721, "name":"宣化县", "CityID":130700, "AreaSort":130700}, +{"AreaID":130729, "name":"万全县", "CityID":130700, "AreaSort":130700}, +{"AreaID":130532, "name":"平乡县", "CityID":130500, "AreaSort":130500}, +{"AreaID":130533, "name":"威县", "CityID":130500, "AreaSort":130500}, +{"AreaID":130530, "name":"新河县", "CityID":130500, "AreaSort":130500}, +{"AreaID":130531, "name":"广宗县", "CityID":130500, "AreaSort":130500}, +{"AreaID":130521, "name":"邢台县", "CityID":130500, "AreaSort":130500}, +{"AreaID":130522, "name":"临城县", "CityID":130500, "AreaSort":130500}, +{"AreaID":130523, "name":"内丘县", "CityID":130500, "AreaSort":130500}, +{"AreaID":130524, "name":"柏乡县", "CityID":130500, "AreaSort":130500}, +{"AreaID":130525, "name":"隆尧县", "CityID":130500, "AreaSort":130500}, +{"AreaID":130526, "name":"任县", "CityID":130500, "AreaSort":130500}, +{"AreaID":130582, "name":"沙河市", "CityID":130500, "AreaSort":130500}, +{"AreaID":130527, "name":"南和县", "CityID":130500, "AreaSort":130500}, +{"AreaID":130581, "name":"南宫市", "CityID":130500, "AreaSort":130500}, +{"AreaID":130528, "name":"宁晋县", "CityID":130500, "AreaSort":130500}, +{"AreaID":130534, "name":"清河县", "CityID":130500, "AreaSort":130500}, +{"AreaID":130529, "name":"巨鹿县", "CityID":130500, "AreaSort":130500}, +{"AreaID":130535, "name":"临西县", "CityID":130500, "AreaSort":130500}, +{"AreaID":130503, "name":"桥西区", "CityID":130500, "AreaSort":130500}, +{"AreaID":130502, "name":"桥东区", "CityID":130500, "AreaSort":130500}, +{"AreaID":130302, "name":"海港区", "CityID":130300, "AreaSort":130300}, +{"AreaID":130306, "name":"抚宁区", "CityID":130300, "AreaSort":130300}, +{"AreaID":130324, "name":"卢龙县", "CityID":130300, "AreaSort":130300}, +{"AreaID":130321, "name":"青龙满族自治县", "CityID":130300, "AreaSort":130300}, +{"AreaID":130304, "name":"北戴河区", "CityID":130300, "AreaSort":130300}, +{"AreaID":130322, "name":"昌黎县", "CityID":130300, "AreaSort":130300}, +{"AreaID":130303, "name":"山海关区", "CityID":130300, "AreaSort":130300}, +{"AreaID":131023, "name":"永清县", "CityID":131000, "AreaSort":131000}, +{"AreaID":131024, "name":"香河县", "CityID":131000, "AreaSort":131000}, +{"AreaID":131003, "name":"广阳区", "CityID":131000, "AreaSort":131000}, +{"AreaID":131022, "name":"固安县", "CityID":131000, "AreaSort":131000}, +{"AreaID":131081, "name":"霸州市", "CityID":131000, "AreaSort":131000}, +{"AreaID":131082, "name":"三河市", "CityID":131000, "AreaSort":131000}, +{"AreaID":131028, "name":"大厂回族自治县", "CityID":131000, "AreaSort":131000}, +{"AreaID":131002, "name":"安次区", "CityID":131000, "AreaSort":131000}, +{"AreaID":131025, "name":"大城县", "CityID":131000, "AreaSort":131000}, +{"AreaID":131026, "name":"文安县", "CityID":131000, "AreaSort":131000}, +{"AreaID":130608, "name":"清苑区", "CityID":130600, "AreaSort":130600}, +{"AreaID":130609, "name":"徐水区", "CityID":130600, "AreaSort":130600}, +{"AreaID":130681, "name":"涿州市", "CityID":130600, "AreaSort":130600}, +{"AreaID":130635, "name":"蠡县", "CityID":130600, "AreaSort":130600}, +{"AreaID":130607, "name":"满城区", "CityID":130600, "AreaSort":130600}, +{"AreaID":130636, "name":"顺平县", "CityID":130600, "AreaSort":130600}, +{"AreaID":130606, "name":"莲池区", "CityID":130600, "AreaSort":130600}, +{"AreaID":130624, "name":"阜平县", "CityID":130600, "AreaSort":130600}, +{"AreaID":130683, "name":"安国市", "CityID":130600, "AreaSort":130600}, +{"AreaID":130633, "name":"易县", "CityID":130600, "AreaSort":130600}, +{"AreaID":130623, "name":"涞水县", "CityID":130600, "AreaSort":130600}, +{"AreaID":130682, "name":"定州市", "CityID":130600, "AreaSort":130600}, +{"AreaID":130634, "name":"曲阳县", "CityID":130600, "AreaSort":130600}, +{"AreaID":130629, "name":"容城县", "CityID":130600, "AreaSort":130600}, +{"AreaID":130684, "name":"高碑店市", "CityID":130600, "AreaSort":130600}, +{"AreaID":130602, "name":"竞秀区", "CityID":130600, "AreaSort":130600}, +{"AreaID":130628, "name":"高阳县", "CityID":130600, "AreaSort":130600}, +{"AreaID":130637, "name":"博野县", "CityID":130600, "AreaSort":130600}, +{"AreaID":130627, "name":"唐县", "CityID":130600, "AreaSort":130600}, +{"AreaID":130638, "name":"雄县", "CityID":130600, "AreaSort":130600}, +{"AreaID":130626, "name":"定兴县", "CityID":130600, "AreaSort":130600}, +{"AreaID":130631, "name":"望都县", "CityID":130600, "AreaSort":130600}, +{"AreaID":130632, "name":"安新县", "CityID":130600, "AreaSort":130600}, +{"AreaID":130630, "name":"涞源县", "CityID":130600, "AreaSort":130600}, +{"AreaID":130107, "name":"井陉矿区", "CityID":130100, "AreaSort":130100}, +{"AreaID":130108, "name":"裕华区", "CityID":130100, "AreaSort":130100}, +{"AreaID":130105, "name":"新华区", "CityID":130100, "AreaSort":130100}, +{"AreaID":130184, "name":"新乐市", "CityID":130100, "AreaSort":130100}, +{"AreaID":130183, "name":"晋州市", "CityID":130100, "AreaSort":130100}, +{"AreaID":130109, "name":"藁城区", "CityID":130100, "AreaSort":130100}, +{"AreaID":130181, "name":"辛集市", "CityID":130100, "AreaSort":130100}, +{"AreaID":130104, "name":"桥西区", "CityID":130100, "AreaSort":130100}, +{"AreaID":130102, "name":"长安区", "CityID":130100, "AreaSort":130100}, +{"AreaID":130133, "name":"赵县", "CityID":130100, "AreaSort":130100}, +{"AreaID":130132, "name":"元氏县", "CityID":130100, "AreaSort":130100}, +{"AreaID":130123, "name":"正定县", "CityID":130100, "AreaSort":130100}, +{"AreaID":130131, "name":"平山县", "CityID":130100, "AreaSort":130100}, +{"AreaID":130126, "name":"灵寿县", "CityID":130100, "AreaSort":130100}, +{"AreaID":130130, "name":"无极县", "CityID":130100, "AreaSort":130100}, +{"AreaID":130125, "name":"行唐县", "CityID":130100, "AreaSort":130100}, +{"AreaID":130111, "name":"栾城区", "CityID":130100, "AreaSort":130100}, +{"AreaID":130110, "name":"鹿泉区", "CityID":130100, "AreaSort":130100}, +{"AreaID":130121, "name":"井陉县", "CityID":130100, "AreaSort":130100}, +{"AreaID":130128, "name":"深泽县", "CityID":130100, "AreaSort":130100}, +{"AreaID":130127, "name":"高邑县", "CityID":130100, "AreaSort":130100}, +{"AreaID":130129, "name":"赞皇县", "CityID":130100, "AreaSort":130100}, +{"AreaID":130929, "name":"献县", "CityID":130900, "AreaSort":130900}, +{"AreaID":130902, "name":"新华区", "CityID":130900, "AreaSort":130900}, +{"AreaID":130903, "name":"运河区", "CityID":130900, "AreaSort":130900}, +{"AreaID":130927, "name":"南皮县", "CityID":130900, "AreaSort":130900}, +{"AreaID":130928, "name":"吴桥县", "CityID":130900, "AreaSort":130900}, +{"AreaID":130926, "name":"肃宁县", "CityID":130900, "AreaSort":130900}, +{"AreaID":130925, "name":"盐山县", "CityID":130900, "AreaSort":130900}, +{"AreaID":130930, "name":"孟村回族自治县", "CityID":130900, "AreaSort":130900}, +{"AreaID":130924, "name":"海兴县", "CityID":130900, "AreaSort":130900}, +{"AreaID":130923, "name":"东光县", "CityID":130900, "AreaSort":130900}, +{"AreaID":130983, "name":"黄骅市", "CityID":130900, "AreaSort":130900}, +{"AreaID":130922, "name":"青县", "CityID":130900, "AreaSort":130900}, +{"AreaID":130984, "name":"河间市", "CityID":130900, "AreaSort":130900}, +{"AreaID":130921, "name":"沧县", "CityID":130900, "AreaSort":130900}, +{"AreaID":130981, "name":"泊头市", "CityID":130900, "AreaSort":130900}, +{"AreaID":130982, "name":"任丘市", "CityID":130900, "AreaSort":130900}, +{"AreaID":130828, "name":"围场满族蒙古族自治县", "CityID":130800, "AreaSort":130800}, +{"AreaID":130822, "name":"兴隆县", "CityID":130800, "AreaSort":130800}, +{"AreaID":130804, "name":"鹰手营子矿区", "CityID":130800, "AreaSort":130800}, +{"AreaID":130823, "name":"平泉县", "CityID":130800, "AreaSort":130800}, +{"AreaID":130802, "name":"双桥区", "CityID":130800, "AreaSort":130800}, +{"AreaID":130821, "name":"承德县", "CityID":130800, "AreaSort":130800}, +{"AreaID":130803, "name":"双滦区", "CityID":130800, "AreaSort":130800}, +{"AreaID":130826, "name":"丰宁满族自治县", "CityID":130800, "AreaSort":130800}, +{"AreaID":130827, "name":"宽城满族自治县", "CityID":130800, "AreaSort":130800}, +{"AreaID":130824, "name":"滦平县", "CityID":130800, "AreaSort":130800}, +{"AreaID":130825, "name":"隆化县", "CityID":130800, "AreaSort":130800}, +{"AreaID":130430, "name":"邱县", "CityID":130400, "AreaSort":130400}, +{"AreaID":130402, "name":"邯山区", "CityID":130400, "AreaSort":130400}, +{"AreaID":130428, "name":"肥乡县", "CityID":130400, "AreaSort":130400}, +{"AreaID":130403, "name":"丛台区", "CityID":130400, "AreaSort":130400}, +{"AreaID":130429, "name":"永年县", "CityID":130400, "AreaSort":130400}, +{"AreaID":130404, "name":"复兴区", "CityID":130400, "AreaSort":130400}, +{"AreaID":130434, "name":"魏县", "CityID":130400, "AreaSort":130400}, +{"AreaID":130406, "name":"峰峰矿区", "CityID":130400, "AreaSort":130400}, +{"AreaID":130424, "name":"成安县", "CityID":130400, "AreaSort":130400}, +{"AreaID":130433, "name":"馆陶县", "CityID":130400, "AreaSort":130400}, +{"AreaID":130425, "name":"大名县", "CityID":130400, "AreaSort":130400}, +{"AreaID":130481, "name":"武安市", "CityID":130400, "AreaSort":130400}, +{"AreaID":130432, "name":"广平县", "CityID":130400, "AreaSort":130400}, +{"AreaID":130426, "name":"涉县", "CityID":130400, "AreaSort":130400}, +{"AreaID":130431, "name":"鸡泽县", "CityID":130400, "AreaSort":130400}, +{"AreaID":130427, "name":"磁县", "CityID":130400, "AreaSort":130400}, +{"AreaID":130421, "name":"邯郸县", "CityID":130400, "AreaSort":130400}, +{"AreaID":130435, "name":"曲周县", "CityID":130400, "AreaSort":130400}, +{"AreaID":130423, "name":"临漳县", "CityID":130400, "AreaSort":130400}, +{"AreaID":140109, "name":"万柏林区", "CityID":140100, "AreaSort":140100}, +{"AreaID":140181, "name":"古交市", "CityID":140100, "AreaSort":140100}, +{"AreaID":140110, "name":"晋源区", "CityID":140100, "AreaSort":140100}, +{"AreaID":140108, "name":"尖草坪区", "CityID":140100, "AreaSort":140100}, +{"AreaID":140121, "name":"清徐县", "CityID":140100, "AreaSort":140100}, +{"AreaID":140122, "name":"阳曲县", "CityID":140100, "AreaSort":140100}, +{"AreaID":140105, "name":"小店区", "CityID":140100, "AreaSort":140100}, +{"AreaID":140123, "name":"娄烦县", "CityID":140100, "AreaSort":140100}, +{"AreaID":140107, "name":"杏花岭区", "CityID":140100, "AreaSort":140100}, +{"AreaID":140106, "name":"迎泽区", "CityID":140100, "AreaSort":140100}, +{"AreaID":140521, "name":"沁水县", "CityID":140500, "AreaSort":140500}, +{"AreaID":140502, "name":"城区", "CityID":140500, "AreaSort":140500}, +{"AreaID":140581, "name":"高平市", "CityID":140500, "AreaSort":140500}, +{"AreaID":140525, "name":"泽州县", "CityID":140500, "AreaSort":140500}, +{"AreaID":140524, "name":"陵川县", "CityID":140500, "AreaSort":140500}, +{"AreaID":140522, "name":"阳城县", "CityID":140500, "AreaSort":140500}, +{"AreaID":140881, "name":"永济市", "CityID":140800, "AreaSort":140800}, +{"AreaID":140882, "name":"河津市", "CityID":140800, "AreaSort":140800}, +{"AreaID":140829, "name":"平陆县", "CityID":140800, "AreaSort":140800}, +{"AreaID":140828, "name":"夏县", "CityID":140800, "AreaSort":140800}, +{"AreaID":140827, "name":"垣曲县", "CityID":140800, "AreaSort":140800}, +{"AreaID":140830, "name":"芮城县", "CityID":140800, "AreaSort":140800}, +{"AreaID":140821, "name":"临猗县", "CityID":140800, "AreaSort":140800}, +{"AreaID":140822, "name":"万荣县", "CityID":140800, "AreaSort":140800}, +{"AreaID":140802, "name":"盐湖区", "CityID":140800, "AreaSort":140800}, +{"AreaID":140825, "name":"新绛县", "CityID":140800, "AreaSort":140800}, +{"AreaID":140826, "name":"绛县", "CityID":140800, "AreaSort":140800}, +{"AreaID":140823, "name":"闻喜县", "CityID":140800, "AreaSort":140800}, +{"AreaID":140824, "name":"稷山县", "CityID":140800, "AreaSort":140800}, +{"AreaID":140311, "name":"郊区", "CityID":140300, "AreaSort":140300}, +{"AreaID":140321, "name":"平定县", "CityID":140300, "AreaSort":140300}, +{"AreaID":140322, "name":"盂县", "CityID":140300, "AreaSort":140300}, +{"AreaID":140303, "name":"矿区", "CityID":140300, "AreaSort":140300}, +{"AreaID":140302, "name":"城区", "CityID":140300, "AreaSort":140300}, +{"AreaID":140902, "name":"忻府区", "CityID":140900, "AreaSort":140900}, +{"AreaID":140924, "name":"繁峙县", "CityID":140900, "AreaSort":140900}, +{"AreaID":140925, "name":"宁武县", "CityID":140900, "AreaSort":140900}, +{"AreaID":140930, "name":"河曲县", "CityID":140900, "AreaSort":140900}, +{"AreaID":140922, "name":"五台县", "CityID":140900, "AreaSort":140900}, +{"AreaID":140931, "name":"保德县", "CityID":140900, "AreaSort":140900}, +{"AreaID":140932, "name":"偏关县", "CityID":140900, "AreaSort":140900}, +{"AreaID":140923, "name":"代县", "CityID":140900, "AreaSort":140900}, +{"AreaID":140921, "name":"定襄县", "CityID":140900, "AreaSort":140900}, +{"AreaID":140929, "name":"岢岚县", "CityID":140900, "AreaSort":140900}, +{"AreaID":140928, "name":"五寨县", "CityID":140900, "AreaSort":140900}, +{"AreaID":140927, "name":"神池县", "CityID":140900, "AreaSort":140900}, +{"AreaID":140926, "name":"静乐县", "CityID":140900, "AreaSort":140900}, +{"AreaID":140981, "name":"原平市", "CityID":140900, "AreaSort":140900}, +{"AreaID":140725, "name":"寿阳县", "CityID":140700, "AreaSort":140700}, +{"AreaID":140724, "name":"昔阳县", "CityID":140700, "AreaSort":140700}, +{"AreaID":140727, "name":"祁县", "CityID":140700, "AreaSort":140700}, +{"AreaID":140781, "name":"介休市", "CityID":140700, "AreaSort":140700}, +{"AreaID":140726, "name":"太谷县", "CityID":140700, "AreaSort":140700}, +{"AreaID":140721, "name":"榆社县", "CityID":140700, "AreaSort":140700}, +{"AreaID":140723, "name":"和顺县", "CityID":140700, "AreaSort":140700}, +{"AreaID":140722, "name":"左权县", "CityID":140700, "AreaSort":140700}, +{"AreaID":140728, "name":"平遥县", "CityID":140700, "AreaSort":140700}, +{"AreaID":140729, "name":"灵石县", "CityID":140700, "AreaSort":140700}, +{"AreaID":140702, "name":"榆次区", "CityID":140700, "AreaSort":140700}, +{"AreaID":140426, "name":"黎城县", "CityID":140400, "AreaSort":140400}, +{"AreaID":140481, "name":"潞城市", "CityID":140400, "AreaSort":140400}, +{"AreaID":140425, "name":"平顺县", "CityID":140400, "AreaSort":140400}, +{"AreaID":140424, "name":"屯留县", "CityID":140400, "AreaSort":140400}, +{"AreaID":140423, "name":"襄垣县", "CityID":140400, "AreaSort":140400}, +{"AreaID":140429, "name":"武乡县", "CityID":140400, "AreaSort":140400}, +{"AreaID":140402, "name":"城区", "CityID":140400, "AreaSort":140400}, +{"AreaID":140428, "name":"长子县", "CityID":140400, "AreaSort":140400}, +{"AreaID":140427, "name":"壶关县", "CityID":140400, "AreaSort":140400}, +{"AreaID":140421, "name":"长治县", "CityID":140400, "AreaSort":140400}, +{"AreaID":140411, "name":"郊区", "CityID":140400, "AreaSort":140400}, +{"AreaID":140430, "name":"沁县", "CityID":140400, "AreaSort":140400}, +{"AreaID":140431, "name":"沁源县", "CityID":140400, "AreaSort":140400}, +{"AreaID":141181, "name":"孝义市", "CityID":141100, "AreaSort":141100}, +{"AreaID":141182, "name":"汾阳市", "CityID":141100, "AreaSort":141100}, +{"AreaID":141102, "name":"离石区", "CityID":141100, "AreaSort":141100}, +{"AreaID":141121, "name":"文水县", "CityID":141100, "AreaSort":141100}, +{"AreaID":141130, "name":"交口县", "CityID":141100, "AreaSort":141100}, +{"AreaID":141122, "name":"交城县", "CityID":141100, "AreaSort":141100}, +{"AreaID":141123, "name":"兴县", "CityID":141100, "AreaSort":141100}, +{"AreaID":141124, "name":"临县", "CityID":141100, "AreaSort":141100}, +{"AreaID":141125, "name":"柳林县", "CityID":141100, "AreaSort":141100}, +{"AreaID":141126, "name":"石楼县", "CityID":141100, "AreaSort":141100}, +{"AreaID":141127, "name":"岚县", "CityID":141100, "AreaSort":141100}, +{"AreaID":141128, "name":"方山县", "CityID":141100, "AreaSort":141100}, +{"AreaID":141129, "name":"中阳县", "CityID":141100, "AreaSort":141100}, +{"AreaID":141029, "name":"乡宁县", "CityID":141000, "AreaSort":141000}, +{"AreaID":141028, "name":"吉县", "CityID":141000, "AreaSort":141000}, +{"AreaID":141032, "name":"永和县", "CityID":141000, "AreaSort":141000}, +{"AreaID":141023, "name":"襄汾县", "CityID":141000, "AreaSort":141000}, +{"AreaID":141022, "name":"翼城县", "CityID":141000, "AreaSort":141000}, +{"AreaID":141031, "name":"隰县", "CityID":141000, "AreaSort":141000}, +{"AreaID":141034, "name":"汾西县", "CityID":141000, "AreaSort":141000}, +{"AreaID":141021, "name":"曲沃县", "CityID":141000, "AreaSort":141000}, +{"AreaID":141033, "name":"蒲县", "CityID":141000, "AreaSort":141000}, +{"AreaID":141002, "name":"尧都区", "CityID":141000, "AreaSort":141000}, +{"AreaID":141027, "name":"浮山县", "CityID":141000, "AreaSort":141000}, +{"AreaID":141026, "name":"安泽县", "CityID":141000, "AreaSort":141000}, +{"AreaID":141025, "name":"古县", "CityID":141000, "AreaSort":141000}, +{"AreaID":141024, "name":"洪洞县", "CityID":141000, "AreaSort":141000}, +{"AreaID":141030, "name":"大宁县", "CityID":141000, "AreaSort":141000}, +{"AreaID":141081, "name":"侯马市", "CityID":141000, "AreaSort":141000}, +{"AreaID":141082, "name":"霍州市", "CityID":141000, "AreaSort":141000}, +{"AreaID":140203, "name":"矿区", "CityID":140200, "AreaSort":140200}, +{"AreaID":140225, "name":"浑源县", "CityID":140200, "AreaSort":140200}, +{"AreaID":140226, "name":"左云县", "CityID":140200, "AreaSort":140200}, +{"AreaID":140227, "name":"大同县", "CityID":140200, "AreaSort":140200}, +{"AreaID":140221, "name":"阳高县", "CityID":140200, "AreaSort":140200}, +{"AreaID":140212, "name":"新荣区", "CityID":140200, "AreaSort":140200}, +{"AreaID":140222, "name":"天镇县", "CityID":140200, "AreaSort":140200}, +{"AreaID":140223, "name":"广灵县", "CityID":140200, "AreaSort":140200}, +{"AreaID":140224, "name":"灵丘县", "CityID":140200, "AreaSort":140200}, +{"AreaID":140211, "name":"南郊区", "CityID":140200, "AreaSort":140200}, +{"AreaID":140202, "name":"城区", "CityID":140200, "AreaSort":140200}, +{"AreaID":140623, "name":"右玉县", "CityID":140600, "AreaSort":140600}, +{"AreaID":140624, "name":"怀仁县", "CityID":140600, "AreaSort":140600}, +{"AreaID":140621, "name":"山阴县", "CityID":140600, "AreaSort":140600}, +{"AreaID":140603, "name":"平鲁区", "CityID":140600, "AreaSort":140600}, +{"AreaID":140622, "name":"应县", "CityID":140600, "AreaSort":140600}, +{"AreaID":140602, "name":"朔城区", "CityID":140600, "AreaSort":140600}, +{"AreaID":150303, "name":"海南区", "CityID":150300, "AreaSort":150300}, +{"AreaID":150304, "name":"乌达区", "CityID":150300, "AreaSort":150300}, +{"AreaID":150302, "name":"海勃湾区", "CityID":150300, "AreaSort":150300}, +{"AreaID":150428, "name":"喀喇沁旗", "CityID":150400, "AreaSort":150400}, +{"AreaID":150402, "name":"红山区", "CityID":150400, "AreaSort":150400}, +{"AreaID":150429, "name":"宁城县", "CityID":150400, "AreaSort":150400}, +{"AreaID":150403, "name":"元宝山区", "CityID":150400, "AreaSort":150400}, +{"AreaID":150426, "name":"翁牛特旗", "CityID":150400, "AreaSort":150400}, +{"AreaID":150430, "name":"敖汉旗", "CityID":150400, "AreaSort":150400}, +{"AreaID":150424, "name":"林西县", "CityID":150400, "AreaSort":150400}, +{"AreaID":150425, "name":"克什克腾旗", "CityID":150400, "AreaSort":150400}, +{"AreaID":150422, "name":"巴林左旗", "CityID":150400, "AreaSort":150400}, +{"AreaID":150404, "name":"松山区", "CityID":150400, "AreaSort":150400}, +{"AreaID":150423, "name":"巴林右旗", "CityID":150400, "AreaSort":150400}, +{"AreaID":150421, "name":"阿鲁科尔沁旗", "CityID":150400, "AreaSort":150400}, +{"AreaID":152923, "name":"额济纳旗", "CityID":152900, "AreaSort":152900}, +{"AreaID":152921, "name":"阿拉善左旗", "CityID":152900, "AreaSort":152900}, +{"AreaID":152922, "name":"阿拉善右旗", "CityID":152900, "AreaSort":152900}, +{"AreaID":150823, "name":"乌拉特前旗", "CityID":150800, "AreaSort":150800}, +{"AreaID":150822, "name":"磴口县", "CityID":150800, "AreaSort":150800}, +{"AreaID":150825, "name":"乌拉特后旗", "CityID":150800, "AreaSort":150800}, +{"AreaID":150824, "name":"乌拉特中旗", "CityID":150800, "AreaSort":150800}, +{"AreaID":150821, "name":"五原县", "CityID":150800, "AreaSort":150800}, +{"AreaID":150802, "name":"临河区", "CityID":150800, "AreaSort":150800}, +{"AreaID":150826, "name":"杭锦后旗", "CityID":150800, "AreaSort":150800}, +{"AreaID":150502, "name":"科尔沁区", "CityID":150500, "AreaSort":150500}, +{"AreaID":150524, "name":"库伦旗", "CityID":150500, "AreaSort":150500}, +{"AreaID":150523, "name":"开鲁县", "CityID":150500, "AreaSort":150500}, +{"AreaID":150522, "name":"科尔沁左翼后旗", "CityID":150500, "AreaSort":150500}, +{"AreaID":150521, "name":"科尔沁左翼中旗", "CityID":150500, "AreaSort":150500}, +{"AreaID":150581, "name":"霍林郭勒市", "CityID":150500, "AreaSort":150500}, +{"AreaID":150526, "name":"扎鲁特旗", "CityID":150500, "AreaSort":150500}, +{"AreaID":150525, "name":"奈曼旗", "CityID":150500, "AreaSort":150500}, +{"AreaID":150223, "name":"达尔罕茂明安联合旗", "CityID":150200, "AreaSort":150200}, +{"AreaID":150222, "name":"固阳县", "CityID":150200, "AreaSort":150200}, +{"AreaID":150221, "name":"土默特右旗", "CityID":150200, "AreaSort":150200}, +{"AreaID":150205, "name":"石拐区", "CityID":150200, "AreaSort":150200}, +{"AreaID":150204, "name":"青山区", "CityID":150200, "AreaSort":150200}, +{"AreaID":150203, "name":"昆都仑区", "CityID":150200, "AreaSort":150200}, +{"AreaID":150202, "name":"东河区", "CityID":150200, "AreaSort":150200}, +{"AreaID":150207, "name":"九原区", "CityID":150200, "AreaSort":150200}, +{"AreaID":150206, "name":"白云鄂博矿区", "CityID":150200, "AreaSort":150200}, +{"AreaID":152202, "name":"阿尔山市", "CityID":152200, "AreaSort":152200}, +{"AreaID":152201, "name":"乌兰浩特市", "CityID":152200, "AreaSort":152200}, +{"AreaID":152224, "name":"突泉县", "CityID":152200, "AreaSort":152200}, +{"AreaID":152223, "name":"扎赉特旗", "CityID":152200, "AreaSort":152200}, +{"AreaID":152222, "name":"科尔沁右翼中旗", "CityID":152200, "AreaSort":152200}, +{"AreaID":152221, "name":"科尔沁右翼前旗", "CityID":152200, "AreaSort":152200}, +{"AreaID":150924, "name":"兴和县", "CityID":150900, "AreaSort":150900}, +{"AreaID":150923, "name":"商都县", "CityID":150900, "AreaSort":150900}, +{"AreaID":150922, "name":"化德县", "CityID":150900, "AreaSort":150900}, +{"AreaID":150921, "name":"卓资县", "CityID":150900, "AreaSort":150900}, +{"AreaID":150981, "name":"丰镇市", "CityID":150900, "AreaSort":150900}, +{"AreaID":150929, "name":"四子王旗", "CityID":150900, "AreaSort":150900}, +{"AreaID":150902, "name":"集宁区", "CityID":150900, "AreaSort":150900}, +{"AreaID":150927, "name":"察哈尔右翼中旗", "CityID":150900, "AreaSort":150900}, +{"AreaID":150928, "name":"察哈尔右翼后旗", "CityID":150900, "AreaSort":150900}, +{"AreaID":150925, "name":"凉城县", "CityID":150900, "AreaSort":150900}, +{"AreaID":150926, "name":"察哈尔右翼前旗", "CityID":150900, "AreaSort":150900}, +{"AreaID":150624, "name":"鄂托克旗", "CityID":150600, "AreaSort":150600}, +{"AreaID":150625, "name":"杭锦旗", "CityID":150600, "AreaSort":150600}, +{"AreaID":150626, "name":"乌审旗", "CityID":150600, "AreaSort":150600}, +{"AreaID":150627, "name":"伊金霍洛旗", "CityID":150600, "AreaSort":150600}, +{"AreaID":150602, "name":"东胜区", "CityID":150600, "AreaSort":150600}, +{"AreaID":150621, "name":"达拉特旗", "CityID":150600, "AreaSort":150600}, +{"AreaID":150622, "name":"准格尔旗", "CityID":150600, "AreaSort":150600}, +{"AreaID":150623, "name":"鄂托克前旗", "CityID":150600, "AreaSort":150600}, +{"AreaID":150125, "name":"武川县", "CityID":150100, "AreaSort":150100}, +{"AreaID":150105, "name":"赛罕区", "CityID":150100, "AreaSort":150100}, +{"AreaID":150104, "name":"玉泉区", "CityID":150100, "AreaSort":150100}, +{"AreaID":150103, "name":"回民区", "CityID":150100, "AreaSort":150100}, +{"AreaID":150121, "name":"土默特左旗", "CityID":150100, "AreaSort":150100}, +{"AreaID":150102, "name":"新城区", "CityID":150100, "AreaSort":150100}, +{"AreaID":150122, "name":"托克托县", "CityID":150100, "AreaSort":150100}, +{"AreaID":150123, "name":"和林格尔县", "CityID":150100, "AreaSort":150100}, +{"AreaID":150124, "name":"清水河县", "CityID":150100, "AreaSort":150100}, +{"AreaID":152528, "name":"镶黄旗", "CityID":152500, "AreaSort":152500}, +{"AreaID":152502, "name":"锡林浩特市", "CityID":152500, "AreaSort":152500}, +{"AreaID":152527, "name":"太仆寺旗", "CityID":152500, "AreaSort":152500}, +{"AreaID":152501, "name":"二连浩特市", "CityID":152500, "AreaSort":152500}, +{"AreaID":152529, "name":"正镶白旗", "CityID":152500, "AreaSort":152500}, +{"AreaID":152524, "name":"苏尼特右旗", "CityID":152500, "AreaSort":152500}, +{"AreaID":152523, "name":"苏尼特左旗", "CityID":152500, "AreaSort":152500}, +{"AreaID":152526, "name":"西乌珠穆沁旗", "CityID":152500, "AreaSort":152500}, +{"AreaID":152525, "name":"东乌珠穆沁旗", "CityID":152500, "AreaSort":152500}, +{"AreaID":152530, "name":"正蓝旗", "CityID":152500, "AreaSort":152500}, +{"AreaID":152531, "name":"多伦县", "CityID":152500, "AreaSort":152500}, +{"AreaID":152522, "name":"阿巴嘎旗", "CityID":152500, "AreaSort":152500}, +{"AreaID":150784, "name":"额尔古纳市", "CityID":150700, "AreaSort":150700}, +{"AreaID":150783, "name":"扎兰屯市", "CityID":150700, "AreaSort":150700}, +{"AreaID":150782, "name":"牙克石市", "CityID":150700, "AreaSort":150700}, +{"AreaID":150721, "name":"阿荣旗", "CityID":150700, "AreaSort":150700}, +{"AreaID":150781, "name":"满洲里市", "CityID":150700, "AreaSort":150700}, +{"AreaID":150722, "name":"莫力达瓦达斡尔族自治旗", "CityID":150700, "AreaSort":150700}, +{"AreaID":150723, "name":"鄂伦春自治旗", "CityID":150700, "AreaSort":150700}, +{"AreaID":150724, "name":"鄂温克族自治旗", "CityID":150700, "AreaSort":150700}, +{"AreaID":150725, "name":"陈巴尔虎旗", "CityID":150700, "AreaSort":150700}, +{"AreaID":150726, "name":"新巴尔虎左旗", "CityID":150700, "AreaSort":150700}, +{"AreaID":150702, "name":"海拉尔区", "CityID":150700, "AreaSort":150700}, +{"AreaID":150727, "name":"新巴尔虎右旗", "CityID":150700, "AreaSort":150700}, +{"AreaID":150703, "name":"扎赉诺尔区", "CityID":150700, "AreaSort":150700}, +{"AreaID":150785, "name":"根河市", "CityID":150700, "AreaSort":150700}, +{"AreaID":211102, "name":"双台子区", "CityID":211100, "AreaSort":211100}, +{"AreaID":211121, "name":"大洼县", "CityID":211100, "AreaSort":211100}, +{"AreaID":211103, "name":"兴隆台区", "CityID":211100, "AreaSort":211100}, +{"AreaID":211122, "name":"盘山县", "CityID":211100, "AreaSort":211100}, +{"AreaID":210782, "name":"北镇市", "CityID":210700, "AreaSort":210700}, +{"AreaID":210711, "name":"太和区", "CityID":210700, "AreaSort":210700}, +{"AreaID":210781, "name":"凌海市", "CityID":210700, "AreaSort":210700}, +{"AreaID":210727, "name":"义县", "CityID":210700, "AreaSort":210700}, +{"AreaID":210726, "name":"黑山县", "CityID":210700, "AreaSort":210700}, +{"AreaID":210703, "name":"凌河区", "CityID":210700, "AreaSort":210700}, +{"AreaID":210702, "name":"古塔区", "CityID":210700, "AreaSort":210700}, +{"AreaID":211303, "name":"龙城区", "CityID":211300, "AreaSort":211300}, +{"AreaID":211302, "name":"双塔区", "CityID":211300, "AreaSort":211300}, +{"AreaID":211321, "name":"朝阳县", "CityID":211300, "AreaSort":211300}, +{"AreaID":211322, "name":"建平县", "CityID":211300, "AreaSort":211300}, +{"AreaID":211324, "name":"喀喇沁左翼蒙古族自治县", "CityID":211300, "AreaSort":211300}, +{"AreaID":211381, "name":"北票市", "CityID":211300, "AreaSort":211300}, +{"AreaID":211382, "name":"凌源市", "CityID":211300, "AreaSort":211300}, +{"AreaID":210922, "name":"彰武县", "CityID":210900, "AreaSort":210900}, +{"AreaID":210904, "name":"太平区", "CityID":210900, "AreaSort":210900}, +{"AreaID":210905, "name":"清河门区", "CityID":210900, "AreaSort":210900}, +{"AreaID":210911, "name":"细河区", "CityID":210900, "AreaSort":210900}, +{"AreaID":210902, "name":"海州区", "CityID":210900, "AreaSort":210900}, +{"AreaID":210903, "name":"新邱区", "CityID":210900, "AreaSort":210900}, +{"AreaID":210921, "name":"阜新蒙古族自治县", "CityID":210900, "AreaSort":210900}, +{"AreaID":210881, "name":"盖州市", "CityID":210800, "AreaSort":210800}, +{"AreaID":210882, "name":"大石桥市", "CityID":210800, "AreaSort":210800}, +{"AreaID":210811, "name":"老边区", "CityID":210800, "AreaSort":210800}, +{"AreaID":210802, "name":"站前区", "CityID":210800, "AreaSort":210800}, +{"AreaID":210803, "name":"西市区", "CityID":210800, "AreaSort":210800}, +{"AreaID":210804, "name":"鲅鱼圈区", "CityID":210800, "AreaSort":210800}, +{"AreaID":211021, "name":"辽阳县", "CityID":211000, "AreaSort":211000}, +{"AreaID":211081, "name":"灯塔市", "CityID":211000, "AreaSort":211000}, +{"AreaID":211011, "name":"太子河区", "CityID":211000, "AreaSort":211000}, +{"AreaID":211004, "name":"宏伟区", "CityID":211000, "AreaSort":211000}, +{"AreaID":211005, "name":"弓长岭区", "CityID":211000, "AreaSort":211000}, +{"AreaID":211002, "name":"白塔区", "CityID":211000, "AreaSort":211000}, +{"AreaID":211003, "name":"文圣区", "CityID":211000, "AreaSort":211000}, +{"AreaID":210102, "name":"和平区", "CityID":210100, "AreaSort":210100}, +{"AreaID":210111, "name":"苏家屯区", "CityID":210100, "AreaSort":210100}, +{"AreaID":210103, "name":"沈河区", "CityID":210100, "AreaSort":210100}, +{"AreaID":210112, "name":"浑南区", "CityID":210100, "AreaSort":210100}, +{"AreaID":210113, "name":"沈北新区", "CityID":210100, "AreaSort":210100}, +{"AreaID":210114, "name":"于洪区", "CityID":210100, "AreaSort":210100}, +{"AreaID":210106, "name":"铁西区", "CityID":210100, "AreaSort":210100}, +{"AreaID":210124, "name":"法库县", "CityID":210100, "AreaSort":210100}, +{"AreaID":210104, "name":"大东区", "CityID":210100, "AreaSort":210100}, +{"AreaID":210122, "name":"辽中县", "CityID":210100, "AreaSort":210100}, +{"AreaID":210181, "name":"新民市", "CityID":210100, "AreaSort":210100}, +{"AreaID":210105, "name":"皇姑区", "CityID":210100, "AreaSort":210100}, +{"AreaID":210123, "name":"康平县", "CityID":210100, "AreaSort":210100}, +{"AreaID":211481, "name":"兴城市", "CityID":211400, "AreaSort":211400}, +{"AreaID":211421, "name":"绥中县", "CityID":211400, "AreaSort":211400}, +{"AreaID":211403, "name":"龙港区", "CityID":211400, "AreaSort":211400}, +{"AreaID":211402, "name":"连山区", "CityID":211400, "AreaSort":211400}, +{"AreaID":211422, "name":"建昌县", "CityID":211400, "AreaSort":211400}, +{"AreaID":211404, "name":"南票区", "CityID":211400, "AreaSort":211400}, +{"AreaID":210624, "name":"宽甸满族自治县", "CityID":210600, "AreaSort":210600}, +{"AreaID":210604, "name":"振安区", "CityID":210600, "AreaSort":210600}, +{"AreaID":210603, "name":"振兴区", "CityID":210600, "AreaSort":210600}, +{"AreaID":210681, "name":"东港市", "CityID":210600, "AreaSort":210600}, +{"AreaID":210682, "name":"凤城市", "CityID":210600, "AreaSort":210600}, +{"AreaID":210602, "name":"元宝区", "CityID":210600, "AreaSort":210600}, +{"AreaID":210411, "name":"顺城区", "CityID":210400, "AreaSort":210400}, +{"AreaID":210404, "name":"望花区", "CityID":210400, "AreaSort":210400}, +{"AreaID":210403, "name":"东洲区", "CityID":210400, "AreaSort":210400}, +{"AreaID":210402, "name":"新抚区", "CityID":210400, "AreaSort":210400}, +{"AreaID":210421, "name":"抚顺县", "CityID":210400, "AreaSort":210400}, +{"AreaID":210422, "name":"新宾满族自治县", "CityID":210400, "AreaSort":210400}, +{"AreaID":210423, "name":"清原满族自治县", "CityID":210400, "AreaSort":210400}, +{"AreaID":211202, "name":"银州区", "CityID":211200, "AreaSort":211200}, +{"AreaID":211204, "name":"清河区", "CityID":211200, "AreaSort":211200}, +{"AreaID":211223, "name":"西丰县", "CityID":211200, "AreaSort":211200}, +{"AreaID":211224, "name":"昌图县", "CityID":211200, "AreaSort":211200}, +{"AreaID":211281, "name":"调兵山市", "CityID":211200, "AreaSort":211200}, +{"AreaID":211221, "name":"铁岭县", "CityID":211200, "AreaSort":211200}, +{"AreaID":211282, "name":"开原市", "CityID":211200, "AreaSort":211200}, +{"AreaID":210311, "name":"千山区", "CityID":210300, "AreaSort":210300}, +{"AreaID":210302, "name":"铁东区", "CityID":210300, "AreaSort":210300}, +{"AreaID":210381, "name":"海城市", "CityID":210300, "AreaSort":210300}, +{"AreaID":210321, "name":"台安县", "CityID":210300, "AreaSort":210300}, +{"AreaID":210303, "name":"铁西区", "CityID":210300, "AreaSort":210300}, +{"AreaID":210304, "name":"立山区", "CityID":210300, "AreaSort":210300}, +{"AreaID":210323, "name":"岫岩满族自治县", "CityID":210300, "AreaSort":210300}, +{"AreaID":210505, "name":"南芬区", "CityID":210500, "AreaSort":210500}, +{"AreaID":210504, "name":"明山区", "CityID":210500, "AreaSort":210500}, +{"AreaID":210521, "name":"本溪满族自治县", "CityID":210500, "AreaSort":210500}, +{"AreaID":210503, "name":"溪湖区", "CityID":210500, "AreaSort":210500}, +{"AreaID":210502, "name":"平山区", "CityID":210500, "AreaSort":210500}, +{"AreaID":210522, "name":"桓仁满族自治县", "CityID":210500, "AreaSort":210500}, +{"AreaID":210224, "name":"长海县", "CityID":210200, "AreaSort":210200}, +{"AreaID":210281, "name":"瓦房店市", "CityID":210200, "AreaSort":210200}, +{"AreaID":210283, "name":"庄河市", "CityID":210200, "AreaSort":210200}, +{"AreaID":210203, "name":"西岗区", "CityID":210200, "AreaSort":210200}, +{"AreaID":210204, "name":"沙河口区", "CityID":210200, "AreaSort":210200}, +{"AreaID":210214, "name":"普兰店区", "CityID":210200, "AreaSort":210200}, +{"AreaID":210212, "name":"旅顺口区", "CityID":210200, "AreaSort":210200}, +{"AreaID":210213, "name":"金州区", "CityID":210200, "AreaSort":210200}, +{"AreaID":210211, "name":"甘井子区", "CityID":210200, "AreaSort":210200}, +{"AreaID":210202, "name":"中山区", "CityID":210200, "AreaSort":210200}, +{"AreaID":220781, "name":"扶余市", "CityID":220700, "AreaSort":220700}, +{"AreaID":220721, "name":"前郭尔罗斯蒙古族自治县", "CityID":220700, "AreaSort":220700}, +{"AreaID":220722, "name":"长岭县", "CityID":220700, "AreaSort":220700}, +{"AreaID":220723, "name":"乾安县", "CityID":220700, "AreaSort":220700}, +{"AreaID":220702, "name":"宁江区", "CityID":220700, "AreaSort":220700}, +{"AreaID":220403, "name":"西安区", "CityID":220400, "AreaSort":220400}, +{"AreaID":220402, "name":"龙山区", "CityID":220400, "AreaSort":220400}, +{"AreaID":220422, "name":"东辽县", "CityID":220400, "AreaSort":220400}, +{"AreaID":220421, "name":"东丰县", "CityID":220400, "AreaSort":220400}, +{"AreaID":220203, "name":"龙潭区", "CityID":220200, "AreaSort":220200}, +{"AreaID":220202, "name":"昌邑区", "CityID":220200, "AreaSort":220200}, +{"AreaID":220204, "name":"船营区", "CityID":220200, "AreaSort":220200}, +{"AreaID":220211, "name":"丰满区", "CityID":220200, "AreaSort":220200}, +{"AreaID":220282, "name":"桦甸市", "CityID":220200, "AreaSort":220200}, +{"AreaID":220283, "name":"舒兰市", "CityID":220200, "AreaSort":220200}, +{"AreaID":220284, "name":"磐石市", "CityID":220200, "AreaSort":220200}, +{"AreaID":220281, "name":"蛟河市", "CityID":220200, "AreaSort":220200}, +{"AreaID":220221, "name":"永吉县", "CityID":220200, "AreaSort":220200}, +{"AreaID":220105, "name":"二道区", "CityID":220100, "AreaSort":220100}, +{"AreaID":220106, "name":"绿园区", "CityID":220100, "AreaSort":220100}, +{"AreaID":220103, "name":"宽城区", "CityID":220100, "AreaSort":220100}, +{"AreaID":220182, "name":"榆树市", "CityID":220100, "AreaSort":220100}, +{"AreaID":220122, "name":"农安县", "CityID":220100, "AreaSort":220100}, +{"AreaID":220104, "name":"朝阳区", "CityID":220100, "AreaSort":220100}, +{"AreaID":220183, "name":"德惠市", "CityID":220100, "AreaSort":220100}, +{"AreaID":220102, "name":"南关区", "CityID":220100, "AreaSort":220100}, +{"AreaID":220112, "name":"双阳区", "CityID":220100, "AreaSort":220100}, +{"AreaID":220113, "name":"九台区", "CityID":220100, "AreaSort":220100}, +{"AreaID":220882, "name":"大安市", "CityID":220800, "AreaSort":220800}, +{"AreaID":220881, "name":"洮南市", "CityID":220800, "AreaSort":220800}, +{"AreaID":220822, "name":"通榆县", "CityID":220800, "AreaSort":220800}, +{"AreaID":220821, "name":"镇赉县", "CityID":220800, "AreaSort":220800}, +{"AreaID":220802, "name":"洮北区", "CityID":220800, "AreaSort":220800}, +{"AreaID":220503, "name":"二道江区", "CityID":220500, "AreaSort":220500}, +{"AreaID":220502, "name":"东昌区", "CityID":220500, "AreaSort":220500}, +{"AreaID":220524, "name":"柳河县", "CityID":220500, "AreaSort":220500}, +{"AreaID":220523, "name":"辉南县", "CityID":220500, "AreaSort":220500}, +{"AreaID":220582, "name":"集安市", "CityID":220500, "AreaSort":220500}, +{"AreaID":220581, "name":"梅河口市", "CityID":220500, "AreaSort":220500}, +{"AreaID":220521, "name":"通化县", "CityID":220500, "AreaSort":220500}, +{"AreaID":220323, "name":"伊通满族自治县", "CityID":220300, "AreaSort":220300}, +{"AreaID":220382, "name":"双辽市", "CityID":220300, "AreaSort":220300}, +{"AreaID":220302, "name":"铁西区", "CityID":220300, "AreaSort":220300}, +{"AreaID":220381, "name":"公主岭市", "CityID":220300, "AreaSort":220300}, +{"AreaID":220322, "name":"梨树县", "CityID":220300, "AreaSort":220300}, +{"AreaID":220303, "name":"铁东区", "CityID":220300, "AreaSort":220300}, +{"AreaID":222406, "name":"和龙市", "CityID":222400, "AreaSort":222400}, +{"AreaID":222402, "name":"图们市", "CityID":222400, "AreaSort":222400}, +{"AreaID":222403, "name":"敦化市", "CityID":222400, "AreaSort":222400}, +{"AreaID":222404, "name":"珲春市", "CityID":222400, "AreaSort":222400}, +{"AreaID":222405, "name":"龙井市", "CityID":222400, "AreaSort":222400}, +{"AreaID":222424, "name":"汪清县", "CityID":222400, "AreaSort":222400}, +{"AreaID":222426, "name":"安图县", "CityID":222400, "AreaSort":222400}, +{"AreaID":222401, "name":"延吉市", "CityID":222400, "AreaSort":222400}, +{"AreaID":220623, "name":"长白朝鲜族自治县", "CityID":220600, "AreaSort":220600}, +{"AreaID":220602, "name":"浑江区", "CityID":220600, "AreaSort":220600}, +{"AreaID":220622, "name":"靖宇县", "CityID":220600, "AreaSort":220600}, +{"AreaID":220681, "name":"临江市", "CityID":220600, "AreaSort":220600}, +{"AreaID":220621, "name":"抚松县", "CityID":220600, "AreaSort":220600}, +{"AreaID":220605, "name":"江源区", "CityID":220600, "AreaSort":220600}, +{"AreaID":231002, "name":"东安区", "CityID":231000, "AreaSort":231000}, +{"AreaID":231003, "name":"阳明区", "CityID":231000, "AreaSort":231000}, +{"AreaID":231004, "name":"爱民区", "CityID":231000, "AreaSort":231000}, +{"AreaID":231005, "name":"西安区", "CityID":231000, "AreaSort":231000}, +{"AreaID":231025, "name":"林口县", "CityID":231000, "AreaSort":231000}, +{"AreaID":231081, "name":"绥芬河市", "CityID":231000, "AreaSort":231000}, +{"AreaID":231083, "name":"海林市", "CityID":231000, "AreaSort":231000}, +{"AreaID":231085, "name":"穆棱市", "CityID":231000, "AreaSort":231000}, +{"AreaID":231084, "name":"宁安市", "CityID":231000, "AreaSort":231000}, +{"AreaID":231086, "name":"东宁市", "CityID":231000, "AreaSort":231000}, +{"AreaID":230402, "name":"向阳区", "CityID":230400, "AreaSort":230400}, +{"AreaID":230407, "name":"兴山区", "CityID":230400, "AreaSort":230400}, +{"AreaID":230404, "name":"南山区", "CityID":230400, "AreaSort":230400}, +{"AreaID":230403, "name":"工农区", "CityID":230400, "AreaSort":230400}, +{"AreaID":230421, "name":"萝北县", "CityID":230400, "AreaSort":230400}, +{"AreaID":230406, "name":"东山区", "CityID":230400, "AreaSort":230400}, +{"AreaID":230422, "name":"绥滨县", "CityID":230400, "AreaSort":230400}, +{"AreaID":230405, "name":"兴安区", "CityID":230400, "AreaSort":230400}, +{"AreaID":230833, "name":"抚远市", "CityID":230800, "AreaSort":230800}, +{"AreaID":230822, "name":"桦南县", "CityID":230800, "AreaSort":230800}, +{"AreaID":230811, "name":"郊区", "CityID":230800, "AreaSort":230800}, +{"AreaID":230881, "name":"同江市", "CityID":230800, "AreaSort":230800}, +{"AreaID":230828, "name":"汤原县", "CityID":230800, "AreaSort":230800}, +{"AreaID":230803, "name":"向阳区", "CityID":230800, "AreaSort":230800}, +{"AreaID":230882, "name":"富锦市", "CityID":230800, "AreaSort":230800}, +{"AreaID":230804, "name":"前进区", "CityID":230800, "AreaSort":230800}, +{"AreaID":230826, "name":"桦川县", "CityID":230800, "AreaSort":230800}, +{"AreaID":230805, "name":"东风区", "CityID":230800, "AreaSort":230800}, +{"AreaID":231102, "name":"爱辉区", "CityID":231100, "AreaSort":231100}, +{"AreaID":231121, "name":"嫩江县", "CityID":231100, "AreaSort":231100}, +{"AreaID":231124, "name":"孙吴县", "CityID":231100, "AreaSort":231100}, +{"AreaID":231123, "name":"逊克县", "CityID":231100, "AreaSort":231100}, +{"AreaID":231182, "name":"五大连池市", "CityID":231100, "AreaSort":231100}, +{"AreaID":231181, "name":"北安市", "CityID":231100, "AreaSort":231100}, +{"AreaID":232701, "name":"加格达奇区", "CityID":232700, "AreaSort":232700}, +{"AreaID":232721, "name":"呼玛县", "CityID":232700, "AreaSort":232700}, +{"AreaID":232723, "name":"漠河县", "CityID":232700, "AreaSort":232700}, +{"AreaID":232722, "name":"塔河县", "CityID":232700, "AreaSort":232700}, +{"AreaID":230381, "name":"虎林市", "CityID":230300, "AreaSort":230300}, +{"AreaID":230382, "name":"密山市", "CityID":230300, "AreaSort":230300}, +{"AreaID":230302, "name":"鸡冠区", "CityID":230300, "AreaSort":230300}, +{"AreaID":230321, "name":"鸡东县", "CityID":230300, "AreaSort":230300}, +{"AreaID":230303, "name":"恒山区", "CityID":230300, "AreaSort":230300}, +{"AreaID":230306, "name":"城子河区", "CityID":230300, "AreaSort":230300}, +{"AreaID":230307, "name":"麻山区", "CityID":230300, "AreaSort":230300}, +{"AreaID":230304, "name":"滴道区", "CityID":230300, "AreaSort":230300}, +{"AreaID":230305, "name":"梨树区", "CityID":230300, "AreaSort":230300}, +{"AreaID":230606, "name":"大同区", "CityID":230600, "AreaSort":230600}, +{"AreaID":230605, "name":"红岗区", "CityID":230600, "AreaSort":230600}, +{"AreaID":230621, "name":"肇州县", "CityID":230600, "AreaSort":230600}, +{"AreaID":230604, "name":"让胡路区", "CityID":230600, "AreaSort":230600}, +{"AreaID":230622, "name":"肇源县", "CityID":230600, "AreaSort":230600}, +{"AreaID":230603, "name":"龙凤区", "CityID":230600, "AreaSort":230600}, +{"AreaID":230602, "name":"萨尔图区", "CityID":230600, "AreaSort":230600}, +{"AreaID":230623, "name":"林甸县", "CityID":230600, "AreaSort":230600}, +{"AreaID":230624, "name":"杜尔伯特蒙古族自治县", "CityID":230600, "AreaSort":230600}, +{"AreaID":230108, "name":"平房区", "CityID":230100, "AreaSort":230100}, +{"AreaID":230109, "name":"松北区", "CityID":230100, "AreaSort":230100}, +{"AreaID":230128, "name":"通河县", "CityID":230100, "AreaSort":230100}, +{"AreaID":230129, "name":"延寿县", "CityID":230100, "AreaSort":230100}, +{"AreaID":230126, "name":"巴彦县", "CityID":230100, "AreaSort":230100}, +{"AreaID":230127, "name":"木兰县", "CityID":230100, "AreaSort":230100}, +{"AreaID":230110, "name":"香坊区", "CityID":230100, "AreaSort":230100}, +{"AreaID":230111, "name":"呼兰区", "CityID":230100, "AreaSort":230100}, +{"AreaID":230124, "name":"方正县", "CityID":230100, "AreaSort":230100}, +{"AreaID":230112, "name":"阿城区", "CityID":230100, "AreaSort":230100}, +{"AreaID":230125, "name":"宾县", "CityID":230100, "AreaSort":230100}, +{"AreaID":230184, "name":"五常市", "CityID":230100, "AreaSort":230100}, +{"AreaID":230104, "name":"道外区", "CityID":230100, "AreaSort":230100}, +{"AreaID":230113, "name":"双城区", "CityID":230100, "AreaSort":230100}, +{"AreaID":230123, "name":"依兰县", "CityID":230100, "AreaSort":230100}, +{"AreaID":230102, "name":"道里区", "CityID":230100, "AreaSort":230100}, +{"AreaID":230183, "name":"尚志市", "CityID":230100, "AreaSort":230100}, +{"AreaID":230103, "name":"南岗区", "CityID":230100, "AreaSort":230100}, +{"AreaID":230781, "name":"铁力市", "CityID":230700, "AreaSort":230700}, +{"AreaID":230708, "name":"美溪区", "CityID":230700, "AreaSort":230700}, +{"AreaID":230709, "name":"金山屯区", "CityID":230700, "AreaSort":230700}, +{"AreaID":230710, "name":"五营区", "CityID":230700, "AreaSort":230700}, +{"AreaID":230703, "name":"南岔区", "CityID":230700, "AreaSort":230700}, +{"AreaID":230712, "name":"汤旺河区", "CityID":230700, "AreaSort":230700}, +{"AreaID":230702, "name":"伊春区", "CityID":230700, "AreaSort":230700}, +{"AreaID":230711, "name":"乌马河区", "CityID":230700, "AreaSort":230700}, +{"AreaID":230714, "name":"乌伊岭区", "CityID":230700, "AreaSort":230700}, +{"AreaID":230713, "name":"带岭区", "CityID":230700, "AreaSort":230700}, +{"AreaID":230716, "name":"上甘岭区", "CityID":230700, "AreaSort":230700}, +{"AreaID":230707, "name":"新青区", "CityID":230700, "AreaSort":230700}, +{"AreaID":230715, "name":"红星区", "CityID":230700, "AreaSort":230700}, +{"AreaID":230706, "name":"翠峦区", "CityID":230700, "AreaSort":230700}, +{"AreaID":230705, "name":"西林区", "CityID":230700, "AreaSort":230700}, +{"AreaID":230722, "name":"嘉荫县", "CityID":230700, "AreaSort":230700}, +{"AreaID":230704, "name":"友好区", "CityID":230700, "AreaSort":230700}, +{"AreaID":231281, "name":"安达市", "CityID":231200, "AreaSort":231200}, +{"AreaID":231283, "name":"海伦市", "CityID":231200, "AreaSort":231200}, +{"AreaID":231282, "name":"肇东市", "CityID":231200, "AreaSort":231200}, +{"AreaID":231222, "name":"兰西县", "CityID":231200, "AreaSort":231200}, +{"AreaID":231223, "name":"青冈县", "CityID":231200, "AreaSort":231200}, +{"AreaID":231202, "name":"北林区", "CityID":231200, "AreaSort":231200}, +{"AreaID":231221, "name":"望奎县", "CityID":231200, "AreaSort":231200}, +{"AreaID":231226, "name":"绥棱县", "CityID":231200, "AreaSort":231200}, +{"AreaID":231224, "name":"庆安县", "CityID":231200, "AreaSort":231200}, +{"AreaID":231225, "name":"明水县", "CityID":231200, "AreaSort":231200}, +{"AreaID":230231, "name":"拜泉县", "CityID":230200, "AreaSort":230200}, +{"AreaID":230230, "name":"克东县", "CityID":230200, "AreaSort":230200}, +{"AreaID":230221, "name":"龙江县", "CityID":230200, "AreaSort":230200}, +{"AreaID":230281, "name":"讷河市", "CityID":230200, "AreaSort":230200}, +{"AreaID":230207, "name":"碾子山区", "CityID":230200, "AreaSort":230200}, +{"AreaID":230208, "name":"梅里斯达斡尔族区", "CityID":230200, "AreaSort":230200}, +{"AreaID":230225, "name":"甘南县", "CityID":230200, "AreaSort":230200}, +{"AreaID":230205, "name":"昂昂溪区", "CityID":230200, "AreaSort":230200}, +{"AreaID":230224, "name":"泰来县", "CityID":230200, "AreaSort":230200}, +{"AreaID":230206, "name":"富拉尔基区", "CityID":230200, "AreaSort":230200}, +{"AreaID":230223, "name":"依安县", "CityID":230200, "AreaSort":230200}, +{"AreaID":230203, "name":"建华区", "CityID":230200, "AreaSort":230200}, +{"AreaID":230229, "name":"克山县", "CityID":230200, "AreaSort":230200}, +{"AreaID":230204, "name":"铁锋区", "CityID":230200, "AreaSort":230200}, +{"AreaID":230202, "name":"龙沙区", "CityID":230200, "AreaSort":230200}, +{"AreaID":230227, "name":"富裕县", "CityID":230200, "AreaSort":230200}, +{"AreaID":230902, "name":"新兴区", "CityID":230900, "AreaSort":230900}, +{"AreaID":230921, "name":"勃利县", "CityID":230900, "AreaSort":230900}, +{"AreaID":230903, "name":"桃山区", "CityID":230900, "AreaSort":230900}, +{"AreaID":230904, "name":"茄子河区", "CityID":230900, "AreaSort":230900}, +{"AreaID":230503, "name":"岭东区", "CityID":230500, "AreaSort":230500}, +{"AreaID":230502, "name":"尖山区", "CityID":230500, "AreaSort":230500}, +{"AreaID":230505, "name":"四方台区", "CityID":230500, "AreaSort":230500}, +{"AreaID":230524, "name":"饶河县", "CityID":230500, "AreaSort":230500}, +{"AreaID":230506, "name":"宝山区", "CityID":230500, "AreaSort":230500}, +{"AreaID":230521, "name":"集贤县", "CityID":230500, "AreaSort":230500}, +{"AreaID":230523, "name":"宝清县", "CityID":230500, "AreaSort":230500}, +{"AreaID":230522, "name":"友谊县", "CityID":230500, "AreaSort":230500}, +{"AreaID":310120, "name":"奉贤区", "CityID":310100, "AreaSort":310000}, +{"AreaID":310110, "name":"杨浦区", "CityID":310100, "AreaSort":310000}, +{"AreaID":310109, "name":"虹口区", "CityID":310100, "AreaSort":310000}, +{"AreaID":310116, "name":"金山区", "CityID":310100, "AreaSort":310000}, +{"AreaID":310117, "name":"松江区", "CityID":310100, "AreaSort":310000}, +{"AreaID":310104, "name":"徐汇区", "CityID":310100, "AreaSort":310000}, +{"AreaID":310118, "name":"青浦区", "CityID":310100, "AreaSort":310000}, +{"AreaID":310101, "name":"黄浦区", "CityID":310100, "AreaSort":310000}, +{"AreaID":310107, "name":"普陀区", "CityID":310100, "AreaSort":310000}, +{"AreaID":310112, "name":"闵行区", "CityID":310100, "AreaSort":310000}, +{"AreaID":310113, "name":"宝山区", "CityID":310100, "AreaSort":310000}, +{"AreaID":310230, "name":"崇明县", "CityID":310100, "AreaSort":310000}, +{"AreaID":310105, "name":"长宁区", "CityID":310100, "AreaSort":310000}, +{"AreaID":310114, "name":"嘉定区", "CityID":310100, "AreaSort":310000}, +{"AreaID":310106, "name":"静安区", "CityID":310100, "AreaSort":310000}, +{"AreaID":310115, "name":"浦东新区", "CityID":310100, "AreaSort":310000}, +{"AreaID":320404, "name":"钟楼区", "CityID":320400, "AreaSort":320400}, +{"AreaID":320402, "name":"天宁区", "CityID":320400, "AreaSort":320400}, +{"AreaID":320411, "name":"新北区", "CityID":320400, "AreaSort":320400}, +{"AreaID":320481, "name":"溧阳市", "CityID":320400, "AreaSort":320400}, +{"AreaID":320413, "name":"金坛区", "CityID":320400, "AreaSort":320400}, +{"AreaID":320412, "name":"武进区", "CityID":320400, "AreaSort":320400}, +{"AreaID":320324, "name":"睢宁县", "CityID":320300, "AreaSort":320300}, +{"AreaID":320321, "name":"丰县", "CityID":320300, "AreaSort":320300}, +{"AreaID":320312, "name":"铜山区", "CityID":320300, "AreaSort":320300}, +{"AreaID":320303, "name":"云龙区", "CityID":320300, "AreaSort":320300}, +{"AreaID":320311, "name":"泉山区", "CityID":320300, "AreaSort":320300}, +{"AreaID":320302, "name":"鼓楼区", "CityID":320300, "AreaSort":320300}, +{"AreaID":320305, "name":"贾汪区", "CityID":320300, "AreaSort":320300}, +{"AreaID":320322, "name":"沛县", "CityID":320300, "AreaSort":320300}, +{"AreaID":320381, "name":"新沂市", "CityID":320300, "AreaSort":320300}, +{"AreaID":320382, "name":"邳州市", "CityID":320300, "AreaSort":320300}, +{"AreaID":321204, "name":"姜堰区", "CityID":321200, "AreaSort":321200}, +{"AreaID":321203, "name":"高港区", "CityID":321200, "AreaSort":321200}, +{"AreaID":321202, "name":"海陵区", "CityID":321200, "AreaSort":321200}, +{"AreaID":321282, "name":"靖江市", "CityID":321200, "AreaSort":321200}, +{"AreaID":321283, "name":"泰兴市", "CityID":321200, "AreaSort":321200}, +{"AreaID":321281, "name":"兴化市", "CityID":321200, "AreaSort":321200}, +{"AreaID":320508, "name":"姑苏区", "CityID":320500, "AreaSort":320500}, +{"AreaID":320509, "name":"吴江区", "CityID":320500, "AreaSort":320500}, +{"AreaID":320583, "name":"昆山市", "CityID":320500, "AreaSort":320500}, +{"AreaID":320506, "name":"吴中区", "CityID":320500, "AreaSort":320500}, +{"AreaID":320582, "name":"张家港市", "CityID":320500, "AreaSort":320500}, +{"AreaID":320507, "name":"相城区", "CityID":320500, "AreaSort":320500}, +{"AreaID":320581, "name":"常熟市", "CityID":320500, "AreaSort":320500}, +{"AreaID":320505, "name":"虎丘区", "CityID":320500, "AreaSort":320500}, +{"AreaID":320585, "name":"太仓市", "CityID":320500, "AreaSort":320500}, +{"AreaID":320213, "name":"梁溪区", "CityID":320200, "AreaSort":320200}, +{"AreaID":320211, "name":"滨湖区", "CityID":320200, "AreaSort":320200}, +{"AreaID":320281, "name":"江阴市", "CityID":320200, "AreaSort":320200}, +{"AreaID":320214, "name":"新吴区", "CityID":320200, "AreaSort":320200}, +{"AreaID":320282, "name":"宜兴市", "CityID":320200, "AreaSort":320200}, +{"AreaID":320206, "name":"惠山区", "CityID":320200, "AreaSort":320200}, +{"AreaID":320205, "name":"锡山区", "CityID":320200, "AreaSort":320200}, +{"AreaID":320722, "name":"东海县", "CityID":320700, "AreaSort":320700}, +{"AreaID":320723, "name":"灌云县", "CityID":320700, "AreaSort":320700}, +{"AreaID":320724, "name":"灌南县", "CityID":320700, "AreaSort":320700}, +{"AreaID":320706, "name":"海州区", "CityID":320700, "AreaSort":320700}, +{"AreaID":320707, "name":"赣榆区", "CityID":320700, "AreaSort":320700}, +{"AreaID":320703, "name":"连云区", "CityID":320700, "AreaSort":320700}, +{"AreaID":321081, "name":"仪征市", "CityID":321000, "AreaSort":321000}, +{"AreaID":321012, "name":"江都区", "CityID":321000, "AreaSort":321000}, +{"AreaID":321023, "name":"宝应县", "CityID":321000, "AreaSort":321000}, +{"AreaID":321003, "name":"邗江区", "CityID":321000, "AreaSort":321000}, +{"AreaID":321002, "name":"广陵区", "CityID":321000, "AreaSort":321000}, +{"AreaID":321084, "name":"高邮市", "CityID":321000, "AreaSort":321000}, +{"AreaID":321102, "name":"京口区", "CityID":321100, "AreaSort":321100}, +{"AreaID":321112, "name":"丹徒区", "CityID":321100, "AreaSort":321100}, +{"AreaID":321183, "name":"句容市", "CityID":321100, "AreaSort":321100}, +{"AreaID":321181, "name":"丹阳市", "CityID":321100, "AreaSort":321100}, +{"AreaID":321182, "name":"扬中市", "CityID":321100, "AreaSort":321100}, +{"AreaID":321111, "name":"润州区", "CityID":321100, "AreaSort":321100}, +{"AreaID":320829, "name":"洪泽县", "CityID":320800, "AreaSort":320800}, +{"AreaID":320826, "name":"涟水县", "CityID":320800, "AreaSort":320800}, +{"AreaID":320804, "name":"淮阴区", "CityID":320800, "AreaSort":320800}, +{"AreaID":320811, "name":"清浦区", "CityID":320800, "AreaSort":320800}, +{"AreaID":320803, "name":"淮安区", "CityID":320800, "AreaSort":320800}, +{"AreaID":320802, "name":"清河区", "CityID":320800, "AreaSort":320800}, +{"AreaID":320830, "name":"盱眙县", "CityID":320800, "AreaSort":320800}, +{"AreaID":320831, "name":"金湖县", "CityID":320800, "AreaSort":320800}, +{"AreaID":320925, "name":"建湖县", "CityID":320900, "AreaSort":320900}, +{"AreaID":320924, "name":"射阳县", "CityID":320900, "AreaSort":320900}, +{"AreaID":320923, "name":"阜宁县", "CityID":320900, "AreaSort":320900}, +{"AreaID":320922, "name":"滨海县", "CityID":320900, "AreaSort":320900}, +{"AreaID":320904, "name":"大丰区", "CityID":320900, "AreaSort":320900}, +{"AreaID":320903, "name":"盐都区", "CityID":320900, "AreaSort":320900}, +{"AreaID":320902, "name":"亭湖区", "CityID":320900, "AreaSort":320900}, +{"AreaID":320981, "name":"东台市", "CityID":320900, "AreaSort":320900}, +{"AreaID":320921, "name":"响水县", "CityID":320900, "AreaSort":320900}, +{"AreaID":320118, "name":"高淳区", "CityID":320100, "AreaSort":320100}, +{"AreaID":320117, "name":"溧水区", "CityID":320100, "AreaSort":320100}, +{"AreaID":320116, "name":"六合区", "CityID":320100, "AreaSort":320100}, +{"AreaID":320115, "name":"江宁区", "CityID":320100, "AreaSort":320100}, +{"AreaID":320102, "name":"玄武区", "CityID":320100, "AreaSort":320100}, +{"AreaID":320114, "name":"雨花台区", "CityID":320100, "AreaSort":320100}, +{"AreaID":320105, "name":"建邺区", "CityID":320100, "AreaSort":320100}, +{"AreaID":320113, "name":"栖霞区", "CityID":320100, "AreaSort":320100}, +{"AreaID":320104, "name":"秦淮区", "CityID":320100, "AreaSort":320100}, +{"AreaID":320111, "name":"浦口区", "CityID":320100, "AreaSort":320100}, +{"AreaID":320106, "name":"鼓楼区", "CityID":320100, "AreaSort":320100}, +{"AreaID":321311, "name":"宿豫区", "CityID":321300, "AreaSort":321300}, +{"AreaID":321302, "name":"宿城区", "CityID":321300, "AreaSort":321300}, +{"AreaID":321324, "name":"泗洪县", "CityID":321300, "AreaSort":321300}, +{"AreaID":321323, "name":"泗阳县", "CityID":321300, "AreaSort":321300}, +{"AreaID":321322, "name":"沭阳县", "CityID":321300, "AreaSort":321300}, +{"AreaID":320621, "name":"海安县", "CityID":320600, "AreaSort":320600}, +{"AreaID":320612, "name":"通州区", "CityID":320600, "AreaSort":320600}, +{"AreaID":320682, "name":"如皋市", "CityID":320600, "AreaSort":320600}, +{"AreaID":320611, "name":"港闸区", "CityID":320600, "AreaSort":320600}, +{"AreaID":320681, "name":"启东市", "CityID":320600, "AreaSort":320600}, +{"AreaID":320623, "name":"如东县", "CityID":320600, "AreaSort":320600}, +{"AreaID":320684, "name":"海门市", "CityID":320600, "AreaSort":320600}, +{"AreaID":320602, "name":"崇川区", "CityID":320600, "AreaSort":320600}, +{"AreaID":330624, "name":"新昌县", "CityID":330600, "AreaSort":330600}, +{"AreaID":330683, "name":"嵊州市", "CityID":330600, "AreaSort":330600}, +{"AreaID":330681, "name":"诸暨市", "CityID":330600, "AreaSort":330600}, +{"AreaID":330603, "name":"柯桥区", "CityID":330600, "AreaSort":330600}, +{"AreaID":330602, "name":"越城区", "CityID":330600, "AreaSort":330600}, +{"AreaID":330604, "name":"上虞区", "CityID":330600, "AreaSort":330600}, +{"AreaID":330204, "name":"江东区", "CityID":330200, "AreaSort":330200}, +{"AreaID":330205, "name":"江北区", "CityID":330200, "AreaSort":330200}, +{"AreaID":330203, "name":"海曙区", "CityID":330200, "AreaSort":330200}, +{"AreaID":330281, "name":"余姚市", "CityID":330200, "AreaSort":330200}, +{"AreaID":330225, "name":"象山县", "CityID":330200, "AreaSort":330200}, +{"AreaID":330226, "name":"宁海县", "CityID":330200, "AreaSort":330200}, +{"AreaID":330212, "name":"鄞州区", "CityID":330200, "AreaSort":330200}, +{"AreaID":330211, "name":"镇海区", "CityID":330200, "AreaSort":330200}, +{"AreaID":330283, "name":"奉化市", "CityID":330200, "AreaSort":330200}, +{"AreaID":330206, "name":"北仑区", "CityID":330200, "AreaSort":330200}, +{"AreaID":330282, "name":"慈溪市", "CityID":330200, "AreaSort":330200}, +{"AreaID":330122, "name":"桐庐县", "CityID":330100, "AreaSort":330100}, +{"AreaID":330104, "name":"江干区", "CityID":330100, "AreaSort":330100}, +{"AreaID":330103, "name":"下城区", "CityID":330100, "AreaSort":330100}, +{"AreaID":330111, "name":"富阳区", "CityID":330100, "AreaSort":330100}, +{"AreaID":330106, "name":"西湖区", "CityID":330100, "AreaSort":330100}, +{"AreaID":330110, "name":"余杭区", "CityID":330100, "AreaSort":330100}, +{"AreaID":330105, "name":"拱墅区", "CityID":330100, "AreaSort":330100}, +{"AreaID":330102, "name":"上城区", "CityID":330100, "AreaSort":330100}, +{"AreaID":330127, "name":"淳安县", "CityID":330100, "AreaSort":330100}, +{"AreaID":330185, "name":"临安市", "CityID":330100, "AreaSort":330100}, +{"AreaID":330108, "name":"滨江区", "CityID":330100, "AreaSort":330100}, +{"AreaID":330182, "name":"建德市", "CityID":330100, "AreaSort":330100}, +{"AreaID":330109, "name":"萧山区", "CityID":330100, "AreaSort":330100}, +{"AreaID":330922, "name":"嵊泗县", "CityID":330900, "AreaSort":330900}, +{"AreaID":330921, "name":"岱山县", "CityID":330900, "AreaSort":330900}, +{"AreaID":330903, "name":"普陀区", "CityID":330900, "AreaSort":330900}, +{"AreaID":330902, "name":"定海区", "CityID":330900, "AreaSort":330900}, +{"AreaID":330523, "name":"安吉县", "CityID":330500, "AreaSort":330500}, +{"AreaID":330521, "name":"德清县", "CityID":330500, "AreaSort":330500}, +{"AreaID":330522, "name":"长兴县", "CityID":330500, "AreaSort":330500}, +{"AreaID":330502, "name":"吴兴区", "CityID":330500, "AreaSort":330500}, +{"AreaID":330503, "name":"南浔区", "CityID":330500, "AreaSort":330500}, +{"AreaID":331002, "name":"椒江区", "CityID":331000, "AreaSort":331000}, +{"AreaID":331004, "name":"路桥区", "CityID":331000, "AreaSort":331000}, +{"AreaID":331003, "name":"黄岩区", "CityID":331000, "AreaSort":331000}, +{"AreaID":331081, "name":"温岭市", "CityID":331000, "AreaSort":331000}, +{"AreaID":331021, "name":"玉环县", "CityID":331000, "AreaSort":331000}, +{"AreaID":331082, "name":"临海市", "CityID":331000, "AreaSort":331000}, +{"AreaID":331022, "name":"三门县", "CityID":331000, "AreaSort":331000}, +{"AreaID":331023, "name":"天台县", "CityID":331000, "AreaSort":331000}, +{"AreaID":331024, "name":"仙居县", "CityID":331000, "AreaSort":331000}, +{"AreaID":330382, "name":"乐清市", "CityID":330300, "AreaSort":330300}, +{"AreaID":330305, "name":"洞头区", "CityID":330300, "AreaSort":330300}, +{"AreaID":330381, "name":"瑞安市", "CityID":330300, "AreaSort":330300}, +{"AreaID":330329, "name":"泰顺县", "CityID":330300, "AreaSort":330300}, +{"AreaID":330327, "name":"苍南县", "CityID":330300, "AreaSort":330300}, +{"AreaID":330328, "name":"文成县", "CityID":330300, "AreaSort":330300}, +{"AreaID":330326, "name":"平阳县", "CityID":330300, "AreaSort":330300}, +{"AreaID":330324, "name":"永嘉县", "CityID":330300, "AreaSort":330300}, +{"AreaID":330303, "name":"龙湾区", "CityID":330300, "AreaSort":330300}, +{"AreaID":330304, "name":"瓯海区", "CityID":330300, "AreaSort":330300}, +{"AreaID":330302, "name":"鹿城区", "CityID":330300, "AreaSort":330300}, +{"AreaID":330421, "name":"嘉善县", "CityID":330400, "AreaSort":330400}, +{"AreaID":330483, "name":"桐乡市", "CityID":330400, "AreaSort":330400}, +{"AreaID":330482, "name":"平湖市", "CityID":330400, "AreaSort":330400}, +{"AreaID":330424, "name":"海盐县", "CityID":330400, "AreaSort":330400}, +{"AreaID":330411, "name":"秀洲区", "CityID":330400, "AreaSort":330400}, +{"AreaID":330481, "name":"海宁市", "CityID":330400, "AreaSort":330400}, +{"AreaID":330402, "name":"南湖区", "CityID":330400, "AreaSort":330400}, +{"AreaID":330881, "name":"江山市", "CityID":330800, "AreaSort":330800}, +{"AreaID":330824, "name":"开化县", "CityID":330800, "AreaSort":330800}, +{"AreaID":330825, "name":"龙游县", "CityID":330800, "AreaSort":330800}, +{"AreaID":330822, "name":"常山县", "CityID":330800, "AreaSort":330800}, +{"AreaID":330803, "name":"衢江区", "CityID":330800, "AreaSort":330800}, +{"AreaID":330802, "name":"柯城区", "CityID":330800, "AreaSort":330800}, +{"AreaID":331121, "name":"青田县", "CityID":331100, "AreaSort":331100}, +{"AreaID":331181, "name":"龙泉市", "CityID":331100, "AreaSort":331100}, +{"AreaID":331123, "name":"遂昌县", "CityID":331100, "AreaSort":331100}, +{"AreaID":331122, "name":"缙云县", "CityID":331100, "AreaSort":331100}, +{"AreaID":331125, "name":"云和县", "CityID":331100, "AreaSort":331100}, +{"AreaID":331124, "name":"松阳县", "CityID":331100, "AreaSort":331100}, +{"AreaID":331127, "name":"景宁畲族自治县", "CityID":331100, "AreaSort":331100}, +{"AreaID":331126, "name":"庆元县", "CityID":331100, "AreaSort":331100}, +{"AreaID":331102, "name":"莲都区", "CityID":331100, "AreaSort":331100}, +{"AreaID":330702, "name":"婺城区", "CityID":330700, "AreaSort":330700}, +{"AreaID":330727, "name":"磐安县", "CityID":330700, "AreaSort":330700}, +{"AreaID":330703, "name":"金东区", "CityID":330700, "AreaSort":330700}, +{"AreaID":330723, "name":"武义县", "CityID":330700, "AreaSort":330700}, +{"AreaID":330726, "name":"浦江县", "CityID":330700, "AreaSort":330700}, +{"AreaID":330784, "name":"永康市", "CityID":330700, "AreaSort":330700}, +{"AreaID":330783, "name":"东阳市", "CityID":330700, "AreaSort":330700}, +{"AreaID":330782, "name":"义乌市", "CityID":330700, "AreaSort":330700}, +{"AreaID":330781, "name":"兰溪市", "CityID":330700, "AreaSort":330700}, +{"AreaID":340621, "name":"濉溪县", "CityID":340600, "AreaSort":340600}, +{"AreaID":340604, "name":"烈山区", "CityID":340600, "AreaSort":340600}, +{"AreaID":340603, "name":"相山区", "CityID":340600, "AreaSort":340600}, +{"AreaID":340602, "name":"杜集区", "CityID":340600, "AreaSort":340600}, +{"AreaID":341102, "name":"琅琊区", "CityID":341100, "AreaSort":341100}, +{"AreaID":341126, "name":"凤阳县", "CityID":341100, "AreaSort":341100}, +{"AreaID":341125, "name":"定远县", "CityID":341100, "AreaSort":341100}, +{"AreaID":341124, "name":"全椒县", "CityID":341100, "AreaSort":341100}, +{"AreaID":341182, "name":"明光市", "CityID":341100, "AreaSort":341100}, +{"AreaID":341122, "name":"来安县", "CityID":341100, "AreaSort":341100}, +{"AreaID":341181, "name":"天长市", "CityID":341100, "AreaSort":341100}, +{"AreaID":341103, "name":"南谯区", "CityID":341100, "AreaSort":341100}, +{"AreaID":340711, "name":"郊区", "CityID":340700, "AreaSort":340700}, +{"AreaID":340706, "name":"义安区", "CityID":340700, "AreaSort":340700}, +{"AreaID":340705, "name":"铜官区", "CityID":340700, "AreaSort":340700}, +{"AreaID":340722, "name":"枞阳县", "CityID":340700, "AreaSort":340700}, +{"AreaID":341721, "name":"东至县", "CityID":341700, "AreaSort":341700}, +{"AreaID":341722, "name":"石台县", "CityID":341700, "AreaSort":341700}, +{"AreaID":341702, "name":"贵池区", "CityID":341700, "AreaSort":341700}, +{"AreaID":341723, "name":"青阳县", "CityID":341700, "AreaSort":341700}, +{"AreaID":340181, "name":"巢湖市", "CityID":340100, "AreaSort":340100}, +{"AreaID":340122, "name":"肥东县", "CityID":340100, "AreaSort":340100}, +{"AreaID":340104, "name":"蜀山区", "CityID":340100, "AreaSort":340100}, +{"AreaID":340123, "name":"肥西县", "CityID":340100, "AreaSort":340100}, +{"AreaID":340111, "name":"包河区", "CityID":340100, "AreaSort":340100}, +{"AreaID":340102, "name":"瑶海区", "CityID":340100, "AreaSort":340100}, +{"AreaID":340121, "name":"长丰县", "CityID":340100, "AreaSort":340100}, +{"AreaID":340103, "name":"庐阳区", "CityID":340100, "AreaSort":340100}, +{"AreaID":340124, "name":"庐江县", "CityID":340100, "AreaSort":340100}, +{"AreaID":341822, "name":"广德县", "CityID":341800, "AreaSort":341800}, +{"AreaID":341823, "name":"泾县", "CityID":341800, "AreaSort":341800}, +{"AreaID":341824, "name":"绩溪县", "CityID":341800, "AreaSort":341800}, +{"AreaID":341825, "name":"旌德县", "CityID":341800, "AreaSort":341800}, +{"AreaID":341881, "name":"宁国市", "CityID":341800, "AreaSort":341800}, +{"AreaID":341821, "name":"郎溪县", "CityID":341800, "AreaSort":341800}, +{"AreaID":341802, "name":"宣州区", "CityID":341800, "AreaSort":341800}, +{"AreaID":341504, "name":"叶集区", "CityID":341500, "AreaSort":341500}, +{"AreaID":341503, "name":"裕安区", "CityID":341500, "AreaSort":341500}, +{"AreaID":341525, "name":"霍山县", "CityID":341500, "AreaSort":341500}, +{"AreaID":341524, "name":"金寨县", "CityID":341500, "AreaSort":341500}, +{"AreaID":341523, "name":"舒城县", "CityID":341500, "AreaSort":341500}, +{"AreaID":341522, "name":"霍邱县", "CityID":341500, "AreaSort":341500}, +{"AreaID":341502, "name":"金安区", "CityID":341500, "AreaSort":341500}, +{"AreaID":341302, "name":"埇桥区", "CityID":341300, "AreaSort":341300}, +{"AreaID":341321, "name":"砀山县", "CityID":341300, "AreaSort":341300}, +{"AreaID":341322, "name":"萧县", "CityID":341300, "AreaSort":341300}, +{"AreaID":341323, "name":"灵璧县", "CityID":341300, "AreaSort":341300}, +{"AreaID":341324, "name":"泗县", "CityID":341300, "AreaSort":341300}, +{"AreaID":341202, "name":"颍州区", "CityID":341200, "AreaSort":341200}, +{"AreaID":341203, "name":"颍东区", "CityID":341200, "AreaSort":341200}, +{"AreaID":341204, "name":"颍泉区", "CityID":341200, "AreaSort":341200}, +{"AreaID":341222, "name":"太和县", "CityID":341200, "AreaSort":341200}, +{"AreaID":341221, "name":"临泉县", "CityID":341200, "AreaSort":341200}, +{"AreaID":341282, "name":"界首市", "CityID":341200, "AreaSort":341200}, +{"AreaID":341226, "name":"颍上县", "CityID":341200, "AreaSort":341200}, +{"AreaID":341225, "name":"阜南县", "CityID":341200, "AreaSort":341200}, +{"AreaID":340523, "name":"和县", "CityID":340500, "AreaSort":340500}, +{"AreaID":340522, "name":"含山县", "CityID":340500, "AreaSort":340500}, +{"AreaID":340521, "name":"当涂县", "CityID":340500, "AreaSort":340500}, +{"AreaID":340504, "name":"雨山区", "CityID":340500, "AreaSort":340500}, +{"AreaID":340503, "name":"花山区", "CityID":340500, "AreaSort":340500}, +{"AreaID":340506, "name":"博望区", "CityID":340500, "AreaSort":340500}, +{"AreaID":340202, "name":"镜湖区", "CityID":340200, "AreaSort":340200}, +{"AreaID":340203, "name":"弋江区", "CityID":340200, "AreaSort":340200}, +{"AreaID":340222, "name":"繁昌县", "CityID":340200, "AreaSort":340200}, +{"AreaID":340221, "name":"芜湖县", "CityID":340200, "AreaSort":340200}, +{"AreaID":340223, "name":"南陵县", "CityID":340200, "AreaSort":340200}, +{"AreaID":340207, "name":"鸠江区", "CityID":340200, "AreaSort":340200}, +{"AreaID":340225, "name":"无为县", "CityID":340200, "AreaSort":340200}, +{"AreaID":340208, "name":"三山区", "CityID":340200, "AreaSort":340200}, +{"AreaID":340824, "name":"潜山县", "CityID":340800, "AreaSort":340800}, +{"AreaID":340811, "name":"宜秀区", "CityID":340800, "AreaSort":340800}, +{"AreaID":340822, "name":"怀宁县", "CityID":340800, "AreaSort":340800}, +{"AreaID":340802, "name":"迎江区", "CityID":340800, "AreaSort":340800}, +{"AreaID":340881, "name":"桐城市", "CityID":340800, "AreaSort":340800}, +{"AreaID":340828, "name":"岳西县", "CityID":340800, "AreaSort":340800}, +{"AreaID":340803, "name":"大观区", "CityID":340800, "AreaSort":340800}, +{"AreaID":340827, "name":"望江县", "CityID":340800, "AreaSort":340800}, +{"AreaID":340826, "name":"宿松县", "CityID":340800, "AreaSort":340800}, +{"AreaID":340825, "name":"太湖县", "CityID":340800, "AreaSort":340800}, +{"AreaID":341623, "name":"利辛县", "CityID":341600, "AreaSort":341600}, +{"AreaID":341602, "name":"谯城区", "CityID":341600, "AreaSort":341600}, +{"AreaID":341622, "name":"蒙城县", "CityID":341600, "AreaSort":341600}, +{"AreaID":341621, "name":"涡阳县", "CityID":341600, "AreaSort":341600}, +{"AreaID":340421, "name":"凤台县", "CityID":340400, "AreaSort":340400}, +{"AreaID":340406, "name":"潘集区", "CityID":340400, "AreaSort":340400}, +{"AreaID":340422, "name":"寿县", "CityID":340400, "AreaSort":340400}, +{"AreaID":340405, "name":"八公山区", "CityID":340400, "AreaSort":340400}, +{"AreaID":340404, "name":"谢家集区", "CityID":340400, "AreaSort":340400}, +{"AreaID":340403, "name":"田家庵区", "CityID":340400, "AreaSort":340400}, +{"AreaID":340402, "name":"大通区", "CityID":340400, "AreaSort":340400}, +{"AreaID":340304, "name":"禹会区", "CityID":340300, "AreaSort":340300}, +{"AreaID":340322, "name":"五河县", "CityID":340300, "AreaSort":340300}, +{"AreaID":340323, "name":"固镇县", "CityID":340300, "AreaSort":340300}, +{"AreaID":340311, "name":"淮上区", "CityID":340300, "AreaSort":340300}, +{"AreaID":340302, "name":"龙子湖区", "CityID":340300, "AreaSort":340300}, +{"AreaID":340321, "name":"怀远县", "CityID":340300, "AreaSort":340300}, +{"AreaID":340303, "name":"蚌山区", "CityID":340300, "AreaSort":340300}, +{"AreaID":341024, "name":"祁门县", "CityID":341000, "AreaSort":341000}, +{"AreaID":341023, "name":"黟县", "CityID":341000, "AreaSort":341000}, +{"AreaID":341021, "name":"歙县", "CityID":341000, "AreaSort":341000}, +{"AreaID":341022, "name":"休宁县", "CityID":341000, "AreaSort":341000}, +{"AreaID":341004, "name":"徽州区", "CityID":341000, "AreaSort":341000}, +{"AreaID":341002, "name":"屯溪区", "CityID":341000, "AreaSort":341000}, +{"AreaID":341003, "name":"黄山区", "CityID":341000, "AreaSort":341000}, +{"AreaID":350881, "name":"漳平市", "CityID":350800, "AreaSort":350800}, +{"AreaID":350802, "name":"新罗区", "CityID":350800, "AreaSort":350800}, +{"AreaID":350803, "name":"永定区", "CityID":350800, "AreaSort":350800}, +{"AreaID":350825, "name":"连城县", "CityID":350800, "AreaSort":350800}, +{"AreaID":350824, "name":"武平县", "CityID":350800, "AreaSort":350800}, +{"AreaID":350823, "name":"上杭县", "CityID":350800, "AreaSort":350800}, +{"AreaID":350821, "name":"长汀县", "CityID":350800, "AreaSort":350800}, +{"AreaID":350425, "name":"大田县", "CityID":350400, "AreaSort":350400}, +{"AreaID":350424, "name":"宁化县", "CityID":350400, "AreaSort":350400}, +{"AreaID":350427, "name":"沙县", "CityID":350400, "AreaSort":350400}, +{"AreaID":350426, "name":"尤溪县", "CityID":350400, "AreaSort":350400}, +{"AreaID":350429, "name":"泰宁县", "CityID":350400, "AreaSort":350400}, +{"AreaID":350428, "name":"将乐县", "CityID":350400, "AreaSort":350400}, +{"AreaID":350481, "name":"永安市", "CityID":350400, "AreaSort":350400}, +{"AreaID":350430, "name":"建宁县", "CityID":350400, "AreaSort":350400}, +{"AreaID":350421, "name":"明溪县", "CityID":350400, "AreaSort":350400}, +{"AreaID":350402, "name":"梅列区", "CityID":350400, "AreaSort":350400}, +{"AreaID":350403, "name":"三元区", "CityID":350400, "AreaSort":350400}, +{"AreaID":350423, "name":"清流县", "CityID":350400, "AreaSort":350400}, +{"AreaID":350724, "name":"松溪县", "CityID":350700, "AreaSort":350700}, +{"AreaID":350723, "name":"光泽县", "CityID":350700, "AreaSort":350700}, +{"AreaID":350782, "name":"武夷山市", "CityID":350700, "AreaSort":350700}, +{"AreaID":350722, "name":"浦城县", "CityID":350700, "AreaSort":350700}, +{"AreaID":350781, "name":"邵武市", "CityID":350700, "AreaSort":350700}, +{"AreaID":350721, "name":"顺昌县", "CityID":350700, "AreaSort":350700}, +{"AreaID":350703, "name":"建阳区", "CityID":350700, "AreaSort":350700}, +{"AreaID":350702, "name":"延平区", "CityID":350700, "AreaSort":350700}, +{"AreaID":350783, "name":"建瓯市", "CityID":350700, "AreaSort":350700}, +{"AreaID":350725, "name":"政和县", "CityID":350700, "AreaSort":350700}, +{"AreaID":350322, "name":"仙游县", "CityID":350300, "AreaSort":350300}, +{"AreaID":350302, "name":"城厢区", "CityID":350300, "AreaSort":350300}, +{"AreaID":350305, "name":"秀屿区", "CityID":350300, "AreaSort":350300}, +{"AreaID":350303, "name":"涵江区", "CityID":350300, "AreaSort":350300}, +{"AreaID":350304, "name":"荔城区", "CityID":350300, "AreaSort":350300}, +{"AreaID":350206, "name":"湖里区", "CityID":350200, "AreaSort":350200}, +{"AreaID":350213, "name":"翔安区", "CityID":350200, "AreaSort":350200}, +{"AreaID":350212, "name":"同安区", "CityID":350200, "AreaSort":350200}, +{"AreaID":350211, "name":"集美区", "CityID":350200, "AreaSort":350200}, +{"AreaID":350205, "name":"海沧区", "CityID":350200, "AreaSort":350200}, +{"AreaID":350203, "name":"思明区", "CityID":350200, "AreaSort":350200}, +{"AreaID":350181, "name":"福清市", "CityID":350100, "AreaSort":350100}, +{"AreaID":350182, "name":"长乐市", "CityID":350100, "AreaSort":350100}, +{"AreaID":350105, "name":"马尾区", "CityID":350100, "AreaSort":350100}, +{"AreaID":350128, "name":"平潭县", "CityID":350100, "AreaSort":350100}, +{"AreaID":350124, "name":"闽清县", "CityID":350100, "AreaSort":350100}, +{"AreaID":350123, "name":"罗源县", "CityID":350100, "AreaSort":350100}, +{"AreaID":350125, "name":"永泰县", "CityID":350100, "AreaSort":350100}, +{"AreaID":350102, "name":"鼓楼区", "CityID":350100, "AreaSort":350100}, +{"AreaID":350111, "name":"晋安区", "CityID":350100, "AreaSort":350100}, +{"AreaID":350104, "name":"仓山区", "CityID":350100, "AreaSort":350100}, +{"AreaID":350122, "name":"连江县", "CityID":350100, "AreaSort":350100}, +{"AreaID":350103, "name":"台江区", "CityID":350100, "AreaSort":350100}, +{"AreaID":350121, "name":"闽侯县", "CityID":350100, "AreaSort":350100}, +{"AreaID":350622, "name":"云霄县", "CityID":350600, "AreaSort":350600}, +{"AreaID":350603, "name":"龙文区", "CityID":350600, "AreaSort":350600}, +{"AreaID":350623, "name":"漳浦县", "CityID":350600, "AreaSort":350600}, +{"AreaID":350602, "name":"芗城区", "CityID":350600, "AreaSort":350600}, +{"AreaID":350624, "name":"诏安县", "CityID":350600, "AreaSort":350600}, +{"AreaID":350625, "name":"长泰县", "CityID":350600, "AreaSort":350600}, +{"AreaID":350681, "name":"龙海市", "CityID":350600, "AreaSort":350600}, +{"AreaID":350626, "name":"东山县", "CityID":350600, "AreaSort":350600}, +{"AreaID":350627, "name":"南靖县", "CityID":350600, "AreaSort":350600}, +{"AreaID":350628, "name":"平和县", "CityID":350600, "AreaSort":350600}, +{"AreaID":350629, "name":"华安县", "CityID":350600, "AreaSort":350600}, +{"AreaID":350922, "name":"古田县", "CityID":350900, "AreaSort":350900}, +{"AreaID":350921, "name":"霞浦县", "CityID":350900, "AreaSort":350900}, +{"AreaID":350902, "name":"蕉城区", "CityID":350900, "AreaSort":350900}, +{"AreaID":350982, "name":"福鼎市", "CityID":350900, "AreaSort":350900}, +{"AreaID":350926, "name":"柘荣县", "CityID":350900, "AreaSort":350900}, +{"AreaID":350981, "name":"福安市", "CityID":350900, "AreaSort":350900}, +{"AreaID":350925, "name":"周宁县", "CityID":350900, "AreaSort":350900}, +{"AreaID":350924, "name":"寿宁县", "CityID":350900, "AreaSort":350900}, +{"AreaID":350923, "name":"屏南县", "CityID":350900, "AreaSort":350900}, +{"AreaID":350527, "name":"金门县", "CityID":350500, "AreaSort":350500}, +{"AreaID":350502, "name":"鲤城区", "CityID":350500, "AreaSort":350500}, +{"AreaID":350503, "name":"丰泽区", "CityID":350500, "AreaSort":350500}, +{"AreaID":350504, "name":"洛江区", "CityID":350500, "AreaSort":350500}, +{"AreaID":350505, "name":"泉港区", "CityID":350500, "AreaSort":350500}, +{"AreaID":350524, "name":"安溪县", "CityID":350500, "AreaSort":350500}, +{"AreaID":350525, "name":"永春县", "CityID":350500, "AreaSort":350500}, +{"AreaID":350526, "name":"德化县", "CityID":350500, "AreaSort":350500}, +{"AreaID":350583, "name":"南安市", "CityID":350500, "AreaSort":350500}, +{"AreaID":350581, "name":"石狮市", "CityID":350500, "AreaSort":350500}, +{"AreaID":350521, "name":"惠安县", "CityID":350500, "AreaSort":350500}, +{"AreaID":350582, "name":"晋江市", "CityID":350500, "AreaSort":350500}, +{"AreaID":360828, "name":"万安县", "CityID":360800, "AreaSort":360800}, +{"AreaID":360827, "name":"遂川县", "CityID":360800, "AreaSort":360800}, +{"AreaID":360803, "name":"青原区", "CityID":360800, "AreaSort":360800}, +{"AreaID":360802, "name":"吉州区", "CityID":360800, "AreaSort":360800}, +{"AreaID":360829, "name":"安福县", "CityID":360800, "AreaSort":360800}, +{"AreaID":360823, "name":"峡江县", "CityID":360800, "AreaSort":360800}, +{"AreaID":360824, "name":"新干县", "CityID":360800, "AreaSort":360800}, +{"AreaID":360830, "name":"永新县", "CityID":360800, "AreaSort":360800}, +{"AreaID":360825, "name":"永丰县", "CityID":360800, "AreaSort":360800}, +{"AreaID":360826, "name":"泰和县", "CityID":360800, "AreaSort":360800}, +{"AreaID":360881, "name":"井冈山市", "CityID":360800, "AreaSort":360800}, +{"AreaID":360821, "name":"吉安县", "CityID":360800, "AreaSort":360800}, +{"AreaID":360822, "name":"吉水县", "CityID":360800, "AreaSort":360800}, +{"AreaID":360321, "name":"莲花县", "CityID":360300, "AreaSort":360300}, +{"AreaID":360323, "name":"芦溪县", "CityID":360300, "AreaSort":360300}, +{"AreaID":360322, "name":"上栗县", "CityID":360300, "AreaSort":360300}, +{"AreaID":360313, "name":"湘东区", "CityID":360300, "AreaSort":360300}, +{"AreaID":360302, "name":"安源区", "CityID":360300, "AreaSort":360300}, +{"AreaID":361102, "name":"信州区", "CityID":361100, "AreaSort":361100}, +{"AreaID":361130, "name":"婺源县", "CityID":361100, "AreaSort":361100}, +{"AreaID":361121, "name":"上饶县", "CityID":361100, "AreaSort":361100}, +{"AreaID":361103, "name":"广丰区", "CityID":361100, "AreaSort":361100}, +{"AreaID":361124, "name":"铅山县", "CityID":361100, "AreaSort":361100}, +{"AreaID":361123, "name":"玉山县", "CityID":361100, "AreaSort":361100}, +{"AreaID":361126, "name":"弋阳县", "CityID":361100, "AreaSort":361100}, +{"AreaID":361181, "name":"德兴市", "CityID":361100, "AreaSort":361100}, +{"AreaID":361125, "name":"横峰县", "CityID":361100, "AreaSort":361100}, +{"AreaID":361128, "name":"鄱阳县", "CityID":361100, "AreaSort":361100}, +{"AreaID":361127, "name":"余干县", "CityID":361100, "AreaSort":361100}, +{"AreaID":361129, "name":"万年县", "CityID":361100, "AreaSort":361100}, +{"AreaID":360781, "name":"瑞金市", "CityID":360700, "AreaSort":360700}, +{"AreaID":360729, "name":"全南县", "CityID":360700, "AreaSort":360700}, +{"AreaID":360728, "name":"定南县", "CityID":360700, "AreaSort":360700}, +{"AreaID":360702, "name":"章贡区", "CityID":360700, "AreaSort":360700}, +{"AreaID":360730, "name":"宁都县", "CityID":360700, "AreaSort":360700}, +{"AreaID":360703, "name":"南康区", "CityID":360700, "AreaSort":360700}, +{"AreaID":360721, "name":"赣县", "CityID":360700, "AreaSort":360700}, +{"AreaID":360722, "name":"信丰县", "CityID":360700, "AreaSort":360700}, +{"AreaID":360723, "name":"大余县", "CityID":360700, "AreaSort":360700}, +{"AreaID":360724, "name":"上犹县", "CityID":360700, "AreaSort":360700}, +{"AreaID":360725, "name":"崇义县", "CityID":360700, "AreaSort":360700}, +{"AreaID":360726, "name":"安远县", "CityID":360700, "AreaSort":360700}, +{"AreaID":360727, "name":"龙南县", "CityID":360700, "AreaSort":360700}, +{"AreaID":360735, "name":"石城县", "CityID":360700, "AreaSort":360700}, +{"AreaID":360734, "name":"寻乌县", "CityID":360700, "AreaSort":360700}, +{"AreaID":360733, "name":"会昌县", "CityID":360700, "AreaSort":360700}, +{"AreaID":360732, "name":"兴国县", "CityID":360700, "AreaSort":360700}, +{"AreaID":360731, "name":"于都县", "CityID":360700, "AreaSort":360700}, +{"AreaID":361027, "name":"金溪县", "CityID":361000, "AreaSort":361000}, +{"AreaID":361026, "name":"宜黄县", "CityID":361000, "AreaSort":361000}, +{"AreaID":361025, "name":"乐安县", "CityID":361000, "AreaSort":361000}, +{"AreaID":361024, "name":"崇仁县", "CityID":361000, "AreaSort":361000}, +{"AreaID":361023, "name":"南丰县", "CityID":361000, "AreaSort":361000}, +{"AreaID":361022, "name":"黎川县", "CityID":361000, "AreaSort":361000}, +{"AreaID":361021, "name":"南城县", "CityID":361000, "AreaSort":361000}, +{"AreaID":361030, "name":"广昌县", "CityID":361000, "AreaSort":361000}, +{"AreaID":361029, "name":"东乡县", "CityID":361000, "AreaSort":361000}, +{"AreaID":361002, "name":"临川区", "CityID":361000, "AreaSort":361000}, +{"AreaID":361028, "name":"资溪县", "CityID":361000, "AreaSort":361000}, +{"AreaID":360428, "name":"都昌县", "CityID":360400, "AreaSort":360400}, +{"AreaID":360481, "name":"瑞昌市", "CityID":360400, "AreaSort":360400}, +{"AreaID":360482, "name":"共青城市", "CityID":360400, "AreaSort":360400}, +{"AreaID":360427, "name":"星子县", "CityID":360400, "AreaSort":360400}, +{"AreaID":360429, "name":"湖口县", "CityID":360400, "AreaSort":360400}, +{"AreaID":360403, "name":"浔阳区", "CityID":360400, "AreaSort":360400}, +{"AreaID":360424, "name":"修水县", "CityID":360400, "AreaSort":360400}, +{"AreaID":360423, "name":"武宁县", "CityID":360400, "AreaSort":360400}, +{"AreaID":360426, "name":"德安县", "CityID":360400, "AreaSort":360400}, +{"AreaID":360402, "name":"庐山区", "CityID":360400, "AreaSort":360400}, +{"AreaID":360425, "name":"永修县", "CityID":360400, "AreaSort":360400}, +{"AreaID":360421, "name":"九江县", "CityID":360400, "AreaSort":360400}, +{"AreaID":360430, "name":"彭泽县", "CityID":360400, "AreaSort":360400}, +{"AreaID":360105, "name":"湾里区", "CityID":360100, "AreaSort":360100}, +{"AreaID":360104, "name":"青云谱区", "CityID":360100, "AreaSort":360100}, +{"AreaID":360121, "name":"南昌县", "CityID":360100, "AreaSort":360100}, +{"AreaID":360103, "name":"西湖区", "CityID":360100, "AreaSort":360100}, +{"AreaID":360102, "name":"东湖区", "CityID":360100, "AreaSort":360100}, +{"AreaID":360123, "name":"安义县", "CityID":360100, "AreaSort":360100}, +{"AreaID":360112, "name":"新建区", "CityID":360100, "AreaSort":360100}, +{"AreaID":360124, "name":"进贤县", "CityID":360100, "AreaSort":360100}, +{"AreaID":360111, "name":"青山湖区", "CityID":360100, "AreaSort":360100}, +{"AreaID":360521, "name":"分宜县", "CityID":360500, "AreaSort":360500}, +{"AreaID":360502, "name":"渝水区", "CityID":360500, "AreaSort":360500}, +{"AreaID":360981, "name":"丰城市", "CityID":360900, "AreaSort":360900}, +{"AreaID":360983, "name":"高安市", "CityID":360900, "AreaSort":360900}, +{"AreaID":360926, "name":"铜鼓县", "CityID":360900, "AreaSort":360900}, +{"AreaID":360982, "name":"樟树市", "CityID":360900, "AreaSort":360900}, +{"AreaID":360921, "name":"奉新县", "CityID":360900, "AreaSort":360900}, +{"AreaID":360902, "name":"袁州区", "CityID":360900, "AreaSort":360900}, +{"AreaID":360925, "name":"靖安县", "CityID":360900, "AreaSort":360900}, +{"AreaID":360924, "name":"宜丰县", "CityID":360900, "AreaSort":360900}, +{"AreaID":360923, "name":"上高县", "CityID":360900, "AreaSort":360900}, +{"AreaID":360922, "name":"万载县", "CityID":360900, "AreaSort":360900}, +{"AreaID":360222, "name":"浮梁县", "CityID":360200, "AreaSort":360200}, +{"AreaID":360203, "name":"珠山区", "CityID":360200, "AreaSort":360200}, +{"AreaID":360281, "name":"乐平市", "CityID":360200, "AreaSort":360200}, +{"AreaID":360202, "name":"昌江区", "CityID":360200, "AreaSort":360200}, +{"AreaID":360622, "name":"余江县", "CityID":360600, "AreaSort":360600}, +{"AreaID":360681, "name":"贵溪市", "CityID":360600, "AreaSort":360600}, +{"AreaID":360602, "name":"月湖区", "CityID":360600, "AreaSort":360600}, +{"AreaID":371311, "name":"罗庄区", "CityID":371300, "AreaSort":371300}, +{"AreaID":371312, "name":"河东区", "CityID":371300, "AreaSort":371300}, +{"AreaID":371322, "name":"郯城县", "CityID":371300, "AreaSort":371300}, +{"AreaID":371323, "name":"沂水县", "CityID":371300, "AreaSort":371300}, +{"AreaID":371321, "name":"沂南县", "CityID":371300, "AreaSort":371300}, +{"AreaID":371326, "name":"平邑县", "CityID":371300, "AreaSort":371300}, +{"AreaID":371327, "name":"莒南县", "CityID":371300, "AreaSort":371300}, +{"AreaID":371324, "name":"兰陵县", "CityID":371300, "AreaSort":371300}, +{"AreaID":371325, "name":"费县", "CityID":371300, "AreaSort":371300}, +{"AreaID":371328, "name":"蒙阴县", "CityID":371300, "AreaSort":371300}, +{"AreaID":371302, "name":"兰山区", "CityID":371300, "AreaSort":371300}, +{"AreaID":371329, "name":"临沭县", "CityID":371300, "AreaSort":371300}, +{"AreaID":371724, "name":"巨野县", "CityID":371700, "AreaSort":371700}, +{"AreaID":371725, "name":"郓城县", "CityID":371700, "AreaSort":371700}, +{"AreaID":371726, "name":"鄄城县", "CityID":371700, "AreaSort":371700}, +{"AreaID":371727, "name":"定陶县", "CityID":371700, "AreaSort":371700}, +{"AreaID":371702, "name":"牡丹区", "CityID":371700, "AreaSort":371700}, +{"AreaID":371721, "name":"曹县", "CityID":371700, "AreaSort":371700}, +{"AreaID":371722, "name":"单县", "CityID":371700, "AreaSort":371700}, +{"AreaID":371723, "name":"成武县", "CityID":371700, "AreaSort":371700}, +{"AreaID":371728, "name":"东明县", "CityID":371700, "AreaSort":371700}, +{"AreaID":370502, "name":"东营区", "CityID":370500, "AreaSort":370500}, +{"AreaID":370523, "name":"广饶县", "CityID":370500, "AreaSort":370500}, +{"AreaID":370521, "name":"垦利县", "CityID":370500, "AreaSort":370500}, +{"AreaID":370503, "name":"河口区", "CityID":370500, "AreaSort":370500}, +{"AreaID":370522, "name":"利津县", "CityID":370500, "AreaSort":370500}, +{"AreaID":371002, "name":"环翠区", "CityID":371000, "AreaSort":371000}, +{"AreaID":371003, "name":"文登区", "CityID":371000, "AreaSort":371000}, +{"AreaID":371082, "name":"荣成市", "CityID":371000, "AreaSort":371000}, +{"AreaID":371083, "name":"乳山市", "CityID":371000, "AreaSort":371000}, +{"AreaID":370282, "name":"即墨市", "CityID":370200, "AreaSort":370200}, +{"AreaID":370283, "name":"平度市", "CityID":370200, "AreaSort":370200}, +{"AreaID":370285, "name":"莱西市", "CityID":370200, "AreaSort":370200}, +{"AreaID":370214, "name":"城阳区", "CityID":370200, "AreaSort":370200}, +{"AreaID":370202, "name":"市南区", "CityID":370200, "AreaSort":370200}, +{"AreaID":370213, "name":"李沧区", "CityID":370200, "AreaSort":370200}, +{"AreaID":370203, "name":"市北区", "CityID":370200, "AreaSort":370200}, +{"AreaID":370212, "name":"崂山区", "CityID":370200, "AreaSort":370200}, +{"AreaID":370211, "name":"黄岛区", "CityID":370200, "AreaSort":370200}, +{"AreaID":370281, "name":"胶州市", "CityID":370200, "AreaSort":370200}, +{"AreaID":370883, "name":"邹城市", "CityID":370800, "AreaSort":370800}, +{"AreaID":370881, "name":"曲阜市", "CityID":370800, "AreaSort":370800}, +{"AreaID":370832, "name":"梁山县", "CityID":370800, "AreaSort":370800}, +{"AreaID":370831, "name":"泗水县", "CityID":370800, "AreaSort":370800}, +{"AreaID":370830, "name":"汶上县", "CityID":370800, "AreaSort":370800}, +{"AreaID":370812, "name":"兖州区", "CityID":370800, "AreaSort":370800}, +{"AreaID":370811, "name":"任城区", "CityID":370800, "AreaSort":370800}, +{"AreaID":370826, "name":"微山县", "CityID":370800, "AreaSort":370800}, +{"AreaID":370827, "name":"鱼台县", "CityID":370800, "AreaSort":370800}, +{"AreaID":370828, "name":"金乡县", "CityID":370800, "AreaSort":370800}, +{"AreaID":370829, "name":"嘉祥县", "CityID":370800, "AreaSort":370800}, +{"AreaID":370705, "name":"奎文区", "CityID":370700, "AreaSort":370700}, +{"AreaID":370784, "name":"安丘市", "CityID":370700, "AreaSort":370700}, +{"AreaID":370783, "name":"寿光市", "CityID":370700, "AreaSort":370700}, +{"AreaID":370782, "name":"诸城市", "CityID":370700, "AreaSort":370700}, +{"AreaID":370781, "name":"青州市", "CityID":370700, "AreaSort":370700}, +{"AreaID":370724, "name":"临朐县", "CityID":370700, "AreaSort":370700}, +{"AreaID":370786, "name":"昌邑市", "CityID":370700, "AreaSort":370700}, +{"AreaID":370785, "name":"高密市", "CityID":370700, "AreaSort":370700}, +{"AreaID":370725, "name":"昌乐县", "CityID":370700, "AreaSort":370700}, +{"AreaID":370702, "name":"潍城区", "CityID":370700, "AreaSort":370700}, +{"AreaID":370704, "name":"坊子区", "CityID":370700, "AreaSort":370700}, +{"AreaID":370703, "name":"寒亭区", "CityID":370700, "AreaSort":370700}, +{"AreaID":371622, "name":"阳信县", "CityID":371600, "AreaSort":371600}, +{"AreaID":371621, "name":"惠民县", "CityID":371600, "AreaSort":371600}, +{"AreaID":371623, "name":"无棣县", "CityID":371600, "AreaSort":371600}, +{"AreaID":371626, "name":"邹平县", "CityID":371600, "AreaSort":371600}, +{"AreaID":371625, "name":"博兴县", "CityID":371600, "AreaSort":371600}, +{"AreaID":371603, "name":"沾化区", "CityID":371600, "AreaSort":371600}, +{"AreaID":371602, "name":"滨城区", "CityID":371600, "AreaSort":371600}, +{"AreaID":370102, "name":"历下区", "CityID":370100, "AreaSort":370100}, +{"AreaID":370113, "name":"长清区", "CityID":370100, "AreaSort":370100}, +{"AreaID":370112, "name":"历城区", "CityID":370100, "AreaSort":370100}, +{"AreaID":370124, "name":"平阴县", "CityID":370100, "AreaSort":370100}, +{"AreaID":370126, "name":"商河县", "CityID":370100, "AreaSort":370100}, +{"AreaID":370125, "name":"济阳县", "CityID":370100, "AreaSort":370100}, +{"AreaID":370181, "name":"章丘市", "CityID":370100, "AreaSort":370100}, +{"AreaID":370104, "name":"槐荫区", "CityID":370100, "AreaSort":370100}, +{"AreaID":370103, "name":"市中区", "CityID":370100, "AreaSort":370100}, +{"AreaID":370105, "name":"天桥区", "CityID":370100, "AreaSort":370100}, +{"AreaID":370321, "name":"桓台县", "CityID":370300, "AreaSort":370300}, +{"AreaID":370322, "name":"高青县", "CityID":370300, "AreaSort":370300}, +{"AreaID":370303, "name":"张店区", "CityID":370300, "AreaSort":370300}, +{"AreaID":370304, "name":"博山区", "CityID":370300, "AreaSort":370300}, +{"AreaID":370302, "name":"淄川区", "CityID":370300, "AreaSort":370300}, +{"AreaID":370323, "name":"沂源县", "CityID":370300, "AreaSort":370300}, +{"AreaID":370305, "name":"临淄区", "CityID":370300, "AreaSort":370300}, +{"AreaID":370306, "name":"周村区", "CityID":370300, "AreaSort":370300}, +{"AreaID":370911, "name":"岱岳区", "CityID":370900, "AreaSort":370900}, +{"AreaID":370983, "name":"肥城市", "CityID":370900, "AreaSort":370900}, +{"AreaID":370923, "name":"东平县", "CityID":370900, "AreaSort":370900}, +{"AreaID":370921, "name":"宁阳县", "CityID":370900, "AreaSort":370900}, +{"AreaID":370902, "name":"泰山区", "CityID":370900, "AreaSort":370900}, +{"AreaID":370982, "name":"新泰市", "CityID":370900, "AreaSort":370900}, +{"AreaID":370602, "name":"芝罘区", "CityID":370600, "AreaSort":370600}, +{"AreaID":370687, "name":"海阳市", "CityID":370600, "AreaSort":370600}, +{"AreaID":370686, "name":"栖霞市", "CityID":370600, "AreaSort":370600}, +{"AreaID":370685, "name":"招远市", "CityID":370600, "AreaSort":370600}, +{"AreaID":370684, "name":"蓬莱市", "CityID":370600, "AreaSort":370600}, +{"AreaID":370683, "name":"莱州市", "CityID":370600, "AreaSort":370600}, +{"AreaID":370611, "name":"福山区", "CityID":370600, "AreaSort":370600}, +{"AreaID":370682, "name":"莱阳市", "CityID":370600, "AreaSort":370600}, +{"AreaID":370612, "name":"牟平区", "CityID":370600, "AreaSort":370600}, +{"AreaID":370681, "name":"龙口市", "CityID":370600, "AreaSort":370600}, +{"AreaID":370613, "name":"莱山区", "CityID":370600, "AreaSort":370600}, +{"AreaID":370634, "name":"长岛县", "CityID":370600, "AreaSort":370600}, +{"AreaID":371203, "name":"钢城区", "CityID":371200, "AreaSort":371200}, +{"AreaID":371202, "name":"莱城区", "CityID":371200, "AreaSort":371200}, +{"AreaID":371521, "name":"阳谷县", "CityID":371500, "AreaSort":371500}, +{"AreaID":371526, "name":"高唐县", "CityID":371500, "AreaSort":371500}, +{"AreaID":371502, "name":"东昌府区", "CityID":371500, "AreaSort":371500}, +{"AreaID":371523, "name":"茌平县", "CityID":371500, "AreaSort":371500}, +{"AreaID":371522, "name":"莘县", "CityID":371500, "AreaSort":371500}, +{"AreaID":371581, "name":"临清市", "CityID":371500, "AreaSort":371500}, +{"AreaID":371525, "name":"冠县", "CityID":371500, "AreaSort":371500}, +{"AreaID":371524, "name":"东阿县", "CityID":371500, "AreaSort":371500}, +{"AreaID":371482, "name":"禹城市", "CityID":371400, "AreaSort":371400}, +{"AreaID":371427, "name":"夏津县", "CityID":371400, "AreaSort":371400}, +{"AreaID":371481, "name":"乐陵市", "CityID":371400, "AreaSort":371400}, +{"AreaID":371428, "name":"武城县", "CityID":371400, "AreaSort":371400}, +{"AreaID":371425, "name":"齐河县", "CityID":371400, "AreaSort":371400}, +{"AreaID":371402, "name":"德城区", "CityID":371400, "AreaSort":371400}, +{"AreaID":371426, "name":"平原县", "CityID":371400, "AreaSort":371400}, +{"AreaID":371423, "name":"庆云县", "CityID":371400, "AreaSort":371400}, +{"AreaID":371424, "name":"临邑县", "CityID":371400, "AreaSort":371400}, +{"AreaID":371403, "name":"陵城区", "CityID":371400, "AreaSort":371400}, +{"AreaID":371422, "name":"宁津县", "CityID":371400, "AreaSort":371400}, +{"AreaID":371122, "name":"莒县", "CityID":371100, "AreaSort":371100}, +{"AreaID":371102, "name":"东港区", "CityID":371100, "AreaSort":371100}, +{"AreaID":371121, "name":"五莲县", "CityID":371100, "AreaSort":371100}, +{"AreaID":371103, "name":"岚山区", "CityID":371100, "AreaSort":371100}, +{"AreaID":370481, "name":"滕州市", "CityID":370400, "AreaSort":370400}, +{"AreaID":370406, "name":"山亭区", "CityID":370400, "AreaSort":370400}, +{"AreaID":370405, "name":"台儿庄区", "CityID":370400, "AreaSort":370400}, +{"AreaID":370404, "name":"峄城区", "CityID":370400, "AreaSort":370400}, +{"AreaID":370403, "name":"薛城区", "CityID":370400, "AreaSort":370400}, +{"AreaID":370402, "name":"市中区", "CityID":370400, "AreaSort":370400}, +{"AreaID":410611, "name":"淇滨区", "CityID":410600, "AreaSort":410600}, +{"AreaID":410621, "name":"浚县", "CityID":410600, "AreaSort":410600}, +{"AreaID":410603, "name":"山城区", "CityID":410600, "AreaSort":410600}, +{"AreaID":410622, "name":"淇县", "CityID":410600, "AreaSort":410600}, +{"AreaID":410602, "name":"鹤山区", "CityID":410600, "AreaSort":410600}, +{"AreaID":410204, "name":"鼓楼区", "CityID":410200, "AreaSort":410200}, +{"AreaID":410212, "name":"祥符区", "CityID":410200, "AreaSort":410200}, +{"AreaID":410203, "name":"顺河回族区", "CityID":410200, "AreaSort":410200}, +{"AreaID":410202, "name":"龙亭区", "CityID":410200, "AreaSort":410200}, +{"AreaID":410225, "name":"兰考县", "CityID":410200, "AreaSort":410200}, +{"AreaID":410223, "name":"尉氏县", "CityID":410200, "AreaSort":410200}, +{"AreaID":410205, "name":"禹王台区", "CityID":410200, "AreaSort":410200}, +{"AreaID":410221, "name":"杞县", "CityID":410200, "AreaSort":410200}, +{"AreaID":410222, "name":"通许县", "CityID":410200, "AreaSort":410200}, +{"AreaID":410728, "name":"长垣县", "CityID":410700, "AreaSort":410700}, +{"AreaID":410703, "name":"卫滨区", "CityID":410700, "AreaSort":410700}, +{"AreaID":410711, "name":"牧野区", "CityID":410700, "AreaSort":410700}, +{"AreaID":410702, "name":"红旗区", "CityID":410700, "AreaSort":410700}, +{"AreaID":410726, "name":"延津县", "CityID":410700, "AreaSort":410700}, +{"AreaID":410727, "name":"封丘县", "CityID":410700, "AreaSort":410700}, +{"AreaID":410721, "name":"新乡县", "CityID":410700, "AreaSort":410700}, +{"AreaID":410782, "name":"辉县市", "CityID":410700, "AreaSort":410700}, +{"AreaID":410724, "name":"获嘉县", "CityID":410700, "AreaSort":410700}, +{"AreaID":410725, "name":"原阳县", "CityID":410700, "AreaSort":410700}, +{"AreaID":410781, "name":"卫辉市", "CityID":410700, "AreaSort":410700}, +{"AreaID":410704, "name":"凤泉区", "CityID":410700, "AreaSort":410700}, +{"AreaID":411628, "name":"鹿邑县", "CityID":411600, "AreaSort":411600}, +{"AreaID":411602, "name":"川汇区", "CityID":411600, "AreaSort":411600}, +{"AreaID":411621, "name":"扶沟县", "CityID":411600, "AreaSort":411600}, +{"AreaID":411622, "name":"西华县", "CityID":411600, "AreaSort":411600}, +{"AreaID":411623, "name":"商水县", "CityID":411600, "AreaSort":411600}, +{"AreaID":411624, "name":"沈丘县", "CityID":411600, "AreaSort":411600}, +{"AreaID":411681, "name":"项城市", "CityID":411600, "AreaSort":411600}, +{"AreaID":411625, "name":"郸城县", "CityID":411600, "AreaSort":411600}, +{"AreaID":411626, "name":"淮阳县", "CityID":411600, "AreaSort":411600}, +{"AreaID":411627, "name":"太康县", "CityID":411600, "AreaSort":411600}, +{"AreaID":411282, "name":"灵宝市", "CityID":411200, "AreaSort":411200}, +{"AreaID":411202, "name":"湖滨区", "CityID":411200, "AreaSort":411200}, +{"AreaID":411203, "name":"陕州区", "CityID":411200, "AreaSort":411200}, +{"AreaID":411224, "name":"卢氏县", "CityID":411200, "AreaSort":411200}, +{"AreaID":411221, "name":"渑池县", "CityID":411200, "AreaSort":411200}, +{"AreaID":411281, "name":"义马市", "CityID":411200, "AreaSort":411200}, +{"AreaID":410411, "name":"湛河区", "CityID":410400, "AreaSort":410400}, +{"AreaID":410402, "name":"新华区", "CityID":410400, "AreaSort":410400}, +{"AreaID":410425, "name":"郏县", "CityID":410400, "AreaSort":410400}, +{"AreaID":410423, "name":"鲁山县", "CityID":410400, "AreaSort":410400}, +{"AreaID":410481, "name":"舞钢市", "CityID":410400, "AreaSort":410400}, +{"AreaID":410421, "name":"宝丰县", "CityID":410400, "AreaSort":410400}, +{"AreaID":410403, "name":"卫东区", "CityID":410400, "AreaSort":410400}, +{"AreaID":410482, "name":"汝州市", "CityID":410400, "AreaSort":410400}, +{"AreaID":410422, "name":"叶县", "CityID":410400, "AreaSort":410400}, +{"AreaID":410404, "name":"石龙区", "CityID":410400, "AreaSort":410400}, +{"AreaID":411422, "name":"睢县", "CityID":411400, "AreaSort":411400}, +{"AreaID":411423, "name":"宁陵县", "CityID":411400, "AreaSort":411400}, +{"AreaID":411424, "name":"柘城县", "CityID":411400, "AreaSort":411400}, +{"AreaID":411425, "name":"虞城县", "CityID":411400, "AreaSort":411400}, +{"AreaID":411426, "name":"夏邑县", "CityID":411400, "AreaSort":411400}, +{"AreaID":411481, "name":"永城市", "CityID":411400, "AreaSort":411400}, +{"AreaID":411421, "name":"民权县", "CityID":411400, "AreaSort":411400}, +{"AreaID":411403, "name":"睢阳区", "CityID":411400, "AreaSort":411400}, +{"AreaID":411402, "name":"梁园区", "CityID":411400, "AreaSort":411400}, +{"AreaID":410902, "name":"华龙区", "CityID":410900, "AreaSort":410900}, +{"AreaID":410923, "name":"南乐县", "CityID":410900, "AreaSort":410900}, +{"AreaID":410922, "name":"清丰县", "CityID":410900, "AreaSort":410900}, +{"AreaID":410927, "name":"台前县", "CityID":410900, "AreaSort":410900}, +{"AreaID":410926, "name":"范县", "CityID":410900, "AreaSort":410900}, +{"AreaID":410928, "name":"濮阳县", "CityID":410900, "AreaSort":410900}, +{"AreaID":411525, "name":"固始县", "CityID":411500, "AreaSort":411500}, +{"AreaID":411526, "name":"潢川县", "CityID":411500, "AreaSort":411500}, +{"AreaID":411527, "name":"淮滨县", "CityID":411500, "AreaSort":411500}, +{"AreaID":411528, "name":"息县", "CityID":411500, "AreaSort":411500}, +{"AreaID":411502, "name":"浉河区", "CityID":411500, "AreaSort":411500}, +{"AreaID":411521, "name":"罗山县", "CityID":411500, "AreaSort":411500}, +{"AreaID":411503, "name":"平桥区", "CityID":411500, "AreaSort":411500}, +{"AreaID":411522, "name":"光山县", "CityID":411500, "AreaSort":411500}, +{"AreaID":411523, "name":"新县", "CityID":411500, "AreaSort":411500}, +{"AreaID":411524, "name":"商城县", "CityID":411500, "AreaSort":411500}, +{"AreaID":411102, "name":"源汇区", "CityID":411100, "AreaSort":411100}, +{"AreaID":411121, "name":"舞阳县", "CityID":411100, "AreaSort":411100}, +{"AreaID":411122, "name":"临颍县", "CityID":411100, "AreaSort":411100}, +{"AreaID":411104, "name":"召陵区", "CityID":411100, "AreaSort":411100}, +{"AreaID":411103, "name":"郾城区", "CityID":411100, "AreaSort":411100}, +{"AreaID":411327, "name":"社旗县", "CityID":411300, "AreaSort":411300}, +{"AreaID":411302, "name":"宛城区", "CityID":411300, "AreaSort":411300}, +{"AreaID":411328, "name":"唐河县", "CityID":411300, "AreaSort":411300}, +{"AreaID":411303, "name":"卧龙区", "CityID":411300, "AreaSort":411300}, +{"AreaID":411329, "name":"新野县", "CityID":411300, "AreaSort":411300}, +{"AreaID":411323, "name":"西峡县", "CityID":411300, "AreaSort":411300}, +{"AreaID":411381, "name":"邓州市", "CityID":411300, "AreaSort":411300}, +{"AreaID":411324, "name":"镇平县", "CityID":411300, "AreaSort":411300}, +{"AreaID":411325, "name":"内乡县", "CityID":411300, "AreaSort":411300}, +{"AreaID":411326, "name":"淅川县", "CityID":411300, "AreaSort":411300}, +{"AreaID":411322, "name":"方城县", "CityID":411300, "AreaSort":411300}, +{"AreaID":411321, "name":"南召县", "CityID":411300, "AreaSort":411300}, +{"AreaID":411330, "name":"桐柏县", "CityID":411300, "AreaSort":411300}, +{"AreaID":410306, "name":"吉利区", "CityID":410300, "AreaSort":410300}, +{"AreaID":410304, "name":"瀍河回族区", "CityID":410300, "AreaSort":410300}, +{"AreaID":410305, "name":"涧西区", "CityID":410300, "AreaSort":410300}, +{"AreaID":410311, "name":"洛龙区", "CityID":410300, "AreaSort":410300}, +{"AreaID":410302, "name":"老城区", "CityID":410300, "AreaSort":410300}, +{"AreaID":410303, "name":"西工区", "CityID":410300, "AreaSort":410300}, +{"AreaID":410381, "name":"偃师市", "CityID":410300, "AreaSort":410300}, +{"AreaID":410325, "name":"嵩县", "CityID":410300, "AreaSort":410300}, +{"AreaID":410324, "name":"栾川县", "CityID":410300, "AreaSort":410300}, +{"AreaID":410323, "name":"新安县", "CityID":410300, "AreaSort":410300}, +{"AreaID":410322, "name":"孟津县", "CityID":410300, "AreaSort":410300}, +{"AreaID":410329, "name":"伊川县", "CityID":410300, "AreaSort":410300}, +{"AreaID":410328, "name":"洛宁县", "CityID":410300, "AreaSort":410300}, +{"AreaID":410327, "name":"宜阳县", "CityID":410300, "AreaSort":410300}, +{"AreaID":410326, "name":"汝阳县", "CityID":410300, "AreaSort":410300}, +{"AreaID":410181, "name":"巩义市", "CityID":410100, "AreaSort":410100}, +{"AreaID":410122, "name":"中牟县", "CityID":410100, "AreaSort":410100}, +{"AreaID":410108, "name":"惠济区", "CityID":410100, "AreaSort":410100}, +{"AreaID":410106, "name":"上街区", "CityID":410100, "AreaSort":410100}, +{"AreaID":410184, "name":"新郑市", "CityID":410100, "AreaSort":410100}, +{"AreaID":410104, "name":"管城回族区", "CityID":410100, "AreaSort":410100}, +{"AreaID":410185, "name":"登封市", "CityID":410100, "AreaSort":410100}, +{"AreaID":410105, "name":"金水区", "CityID":410100, "AreaSort":410100}, +{"AreaID":410182, "name":"荥阳市", "CityID":410100, "AreaSort":410100}, +{"AreaID":410102, "name":"中原区", "CityID":410100, "AreaSort":410100}, +{"AreaID":410183, "name":"新密市", "CityID":410100, "AreaSort":410100}, +{"AreaID":410103, "name":"二七区", "CityID":410100, "AreaSort":410100}, +{"AreaID":411729, "name":"新蔡县", "CityID":411700, "AreaSort":411700}, +{"AreaID":411728, "name":"遂平县", "CityID":411700, "AreaSort":411700}, +{"AreaID":411727, "name":"汝南县", "CityID":411700, "AreaSort":411700}, +{"AreaID":411726, "name":"泌阳县", "CityID":411700, "AreaSort":411700}, +{"AreaID":411725, "name":"确山县", "CityID":411700, "AreaSort":411700}, +{"AreaID":411724, "name":"正阳县", "CityID":411700, "AreaSort":411700}, +{"AreaID":411723, "name":"平舆县", "CityID":411700, "AreaSort":411700}, +{"AreaID":411722, "name":"上蔡县", "CityID":411700, "AreaSort":411700}, +{"AreaID":411721, "name":"西平县", "CityID":411700, "AreaSort":411700}, +{"AreaID":411702, "name":"驿城区", "CityID":411700, "AreaSort":411700}, +{"AreaID":411023, "name":"许昌县", "CityID":411000, "AreaSort":411000}, +{"AreaID":411025, "name":"襄城县", "CityID":411000, "AreaSort":411000}, +{"AreaID":411024, "name":"鄢陵县", "CityID":411000, "AreaSort":411000}, +{"AreaID":411082, "name":"长葛市", "CityID":411000, "AreaSort":411000}, +{"AreaID":411081, "name":"禹州市", "CityID":411000, "AreaSort":411000}, +{"AreaID":411002, "name":"魏都区", "CityID":411000, "AreaSort":411000}, +{"AreaID":410804, "name":"马村区", "CityID":410800, "AreaSort":410800}, +{"AreaID":410803, "name":"中站区", "CityID":410800, "AreaSort":410800}, +{"AreaID":410825, "name":"温县", "CityID":410800, "AreaSort":410800}, +{"AreaID":410883, "name":"孟州市", "CityID":410800, "AreaSort":410800}, +{"AreaID":410823, "name":"武陟县", "CityID":410800, "AreaSort":410800}, +{"AreaID":410882, "name":"沁阳市", "CityID":410800, "AreaSort":410800}, +{"AreaID":410822, "name":"博爱县", "CityID":410800, "AreaSort":410800}, +{"AreaID":410821, "name":"修武县", "CityID":410800, "AreaSort":410800}, +{"AreaID":410811, "name":"山阳区", "CityID":410800, "AreaSort":410800}, +{"AreaID":410802, "name":"解放区", "CityID":410800, "AreaSort":410800}, +{"AreaID":410522, "name":"安阳县", "CityID":410500, "AreaSort":410500}, +{"AreaID":410523, "name":"汤阴县", "CityID":410500, "AreaSort":410500}, +{"AreaID":410581, "name":"林州市", "CityID":410500, "AreaSort":410500}, +{"AreaID":410526, "name":"滑县", "CityID":410500, "AreaSort":410500}, +{"AreaID":410527, "name":"内黄县", "CityID":410500, "AreaSort":410500}, +{"AreaID":410506, "name":"龙安区", "CityID":410500, "AreaSort":410500}, +{"AreaID":410503, "name":"北关区", "CityID":410500, "AreaSort":410500}, +{"AreaID":410502, "name":"文峰区", "CityID":410500, "AreaSort":410500}, +{"AreaID":410505, "name":"殷都区", "CityID":410500, "AreaSort":410500}, +{"AreaID":420881, "name":"钟祥市", "CityID":420800, "AreaSort":420800}, +{"AreaID":420822, "name":"沙洋县", "CityID":420800, "AreaSort":420800}, +{"AreaID":420821, "name":"京山县", "CityID":420800, "AreaSort":420800}, +{"AreaID":420804, "name":"掇刀区", "CityID":420800, "AreaSort":420800}, +{"AreaID":420802, "name":"东宝区", "CityID":420800, "AreaSort":420800}, +{"AreaID":421123, "name":"罗田县", "CityID":421100, "AreaSort":421100}, +{"AreaID":421122, "name":"红安县", "CityID":421100, "AreaSort":421100}, +{"AreaID":421181, "name":"麻城市", "CityID":421100, "AreaSort":421100}, +{"AreaID":421121, "name":"团风县", "CityID":421100, "AreaSort":421100}, +{"AreaID":421124, "name":"英山县", "CityID":421100, "AreaSort":421100}, +{"AreaID":421182, "name":"武穴市", "CityID":421100, "AreaSort":421100}, +{"AreaID":421125, "name":"浠水县", "CityID":421100, "AreaSort":421100}, +{"AreaID":421126, "name":"蕲春县", "CityID":421100, "AreaSort":421100}, +{"AreaID":421127, "name":"黄梅县", "CityID":421100, "AreaSort":421100}, +{"AreaID":421102, "name":"黄州区", "CityID":421100, "AreaSort":421100}, +{"AreaID":420981, "name":"应城市", "CityID":420900, "AreaSort":420900}, +{"AreaID":420982, "name":"安陆市", "CityID":420900, "AreaSort":420900}, +{"AreaID":420984, "name":"汉川市", "CityID":420900, "AreaSort":420900}, +{"AreaID":420923, "name":"云梦县", "CityID":420900, "AreaSort":420900}, +{"AreaID":420922, "name":"大悟县", "CityID":420900, "AreaSort":420900}, +{"AreaID":420921, "name":"孝昌县", "CityID":420900, "AreaSort":420900}, +{"AreaID":420902, "name":"孝南区", "CityID":420900, "AreaSort":420900}, +{"AreaID":421223, "name":"崇阳县", "CityID":421200, "AreaSort":421200}, +{"AreaID":421224, "name":"通山县", "CityID":421200, "AreaSort":421200}, +{"AreaID":421222, "name":"通城县", "CityID":421200, "AreaSort":421200}, +{"AreaID":421202, "name":"咸安区", "CityID":421200, "AreaSort":421200}, +{"AreaID":421221, "name":"嘉鱼县", "CityID":421200, "AreaSort":421200}, +{"AreaID":421281, "name":"赤壁市", "CityID":421200, "AreaSort":421200}, +{"AreaID":421381, "name":"广水市", "CityID":421300, "AreaSort":421300}, +{"AreaID":421303, "name":"曾都区", "CityID":421300, "AreaSort":421300}, +{"AreaID":421321, "name":"随县", "CityID":421300, "AreaSort":421300}, +{"AreaID":420325, "name":"房县", "CityID":420300, "AreaSort":420300}, +{"AreaID":420381, "name":"丹江口市", "CityID":420300, "AreaSort":420300}, +{"AreaID":420322, "name":"郧西县", "CityID":420300, "AreaSort":420300}, +{"AreaID":420323, "name":"竹山县", "CityID":420300, "AreaSort":420300}, +{"AreaID":420324, "name":"竹溪县", "CityID":420300, "AreaSort":420300}, +{"AreaID":420302, "name":"茅箭区", "CityID":420300, "AreaSort":420300}, +{"AreaID":420304, "name":"郧阳区", "CityID":420300, "AreaSort":420300}, +{"AreaID":420303, "name":"张湾区", "CityID":420300, "AreaSort":420300}, +{"AreaID":420626, "name":"保康县", "CityID":420600, "AreaSort":420600}, +{"AreaID":420607, "name":"襄州区", "CityID":420600, "AreaSort":420600}, +{"AreaID":420606, "name":"樊城区", "CityID":420600, "AreaSort":420600}, +{"AreaID":420602, "name":"襄城区", "CityID":420600, "AreaSort":420600}, +{"AreaID":420625, "name":"谷城县", "CityID":420600, "AreaSort":420600}, +{"AreaID":420684, "name":"宜城市", "CityID":420600, "AreaSort":420600}, +{"AreaID":420624, "name":"南漳县", "CityID":420600, "AreaSort":420600}, +{"AreaID":420683, "name":"枣阳市", "CityID":420600, "AreaSort":420600}, +{"AreaID":420682, "name":"老河口市", "CityID":420600, "AreaSort":420600}, +{"AreaID":420504, "name":"点军区", "CityID":420500, "AreaSort":420500}, +{"AreaID":420529, "name":"五峰土家族自治县", "CityID":420500, "AreaSort":420500}, +{"AreaID":420503, "name":"伍家岗区", "CityID":420500, "AreaSort":420500}, +{"AreaID":420502, "name":"西陵区", "CityID":420500, "AreaSort":420500}, +{"AreaID":420527, "name":"秭归县", "CityID":420500, "AreaSort":420500}, +{"AreaID":420528, "name":"长阳土家族自治县", "CityID":420500, "AreaSort":420500}, +{"AreaID":420583, "name":"枝江市", "CityID":420500, "AreaSort":420500}, +{"AreaID":420525, "name":"远安县", "CityID":420500, "AreaSort":420500}, +{"AreaID":420526, "name":"兴山县", "CityID":420500, "AreaSort":420500}, +{"AreaID":420506, "name":"夷陵区", "CityID":420500, "AreaSort":420500}, +{"AreaID":420581, "name":"宜都市", "CityID":420500, "AreaSort":420500}, +{"AreaID":420505, "name":"猇亭区", "CityID":420500, "AreaSort":420500}, +{"AreaID":420582, "name":"当阳市", "CityID":420500, "AreaSort":420500}, +{"AreaID":420114, "name":"蔡甸区", "CityID":420100, "AreaSort":420100}, +{"AreaID":420115, "name":"江夏区", "CityID":420100, "AreaSort":420100}, +{"AreaID":420102, "name":"江岸区", "CityID":420100, "AreaSort":420100}, +{"AreaID":420112, "name":"东西湖区", "CityID":420100, "AreaSort":420100}, +{"AreaID":420103, "name":"江汉区", "CityID":420100, "AreaSort":420100}, +{"AreaID":420113, "name":"汉南区", "CityID":420100, "AreaSort":420100}, +{"AreaID":420104, "name":"硚口区", "CityID":420100, "AreaSort":420100}, +{"AreaID":420105, "name":"汉阳区", "CityID":420100, "AreaSort":420100}, +{"AreaID":420106, "name":"武昌区", "CityID":420100, "AreaSort":420100}, +{"AreaID":420116, "name":"黄陂区", "CityID":420100, "AreaSort":420100}, +{"AreaID":420107, "name":"青山区", "CityID":420100, "AreaSort":420100}, +{"AreaID":420117, "name":"新洲区", "CityID":420100, "AreaSort":420100}, +{"AreaID":420111, "name":"洪山区", "CityID":420100, "AreaSort":420100}, +{"AreaID":422822, "name":"建始县", "CityID":422800, "AreaSort":422800}, +{"AreaID":422823, "name":"巴东县", "CityID":422800, "AreaSort":422800}, +{"AreaID":422825, "name":"宣恩县", "CityID":422800, "AreaSort":422800}, +{"AreaID":422826, "name":"咸丰县", "CityID":422800, "AreaSort":422800}, +{"AreaID":422801, "name":"恩施市", "CityID":422800, "AreaSort":422800}, +{"AreaID":422827, "name":"来凤县", "CityID":422800, "AreaSort":422800}, +{"AreaID":422828, "name":"鹤峰县", "CityID":422800, "AreaSort":422800}, +{"AreaID":422802, "name":"利川市", "CityID":422800, "AreaSort":422800}, +{"AreaID":420703, "name":"华容区", "CityID":420700, "AreaSort":420700}, +{"AreaID":420704, "name":"鄂城区", "CityID":420700, "AreaSort":420700}, +{"AreaID":420702, "name":"梁子湖区", "CityID":420700, "AreaSort":420700}, +{"AreaID":420222, "name":"阳新县", "CityID":420200, "AreaSort":420200}, +{"AreaID":420204, "name":"下陆区", "CityID":420200, "AreaSort":420200}, +{"AreaID":420205, "name":"铁山区", "CityID":420200, "AreaSort":420200}, +{"AreaID":420281, "name":"大冶市", "CityID":420200, "AreaSort":420200}, +{"AreaID":420202, "name":"黄石港区", "CityID":420200, "AreaSort":420200}, +{"AreaID":420203, "name":"西塞山区", "CityID":420200, "AreaSort":420200}, +{"AreaID":421003, "name":"荆州区", "CityID":421000, "AreaSort":421000}, +{"AreaID":421087, "name":"松滋市", "CityID":421000, "AreaSort":421000}, +{"AreaID":421083, "name":"洪湖市", "CityID":421000, "AreaSort":421000}, +{"AreaID":421081, "name":"石首市", "CityID":421000, "AreaSort":421000}, +{"AreaID":421002, "name":"沙市区", "CityID":421000, "AreaSort":421000}, +{"AreaID":421022, "name":"公安县", "CityID":421000, "AreaSort":421000}, +{"AreaID":421023, "name":"监利县", "CityID":421000, "AreaSort":421000}, +{"AreaID":421024, "name":"江陵县", "CityID":421000, "AreaSort":421000}, +{"AreaID":430304, "name":"岳塘区", "CityID":430300, "AreaSort":430300}, +{"AreaID":430302, "name":"雨湖区", "CityID":430300, "AreaSort":430300}, +{"AreaID":430382, "name":"韶山市", "CityID":430300, "AreaSort":430300}, +{"AreaID":430381, "name":"湘乡市", "CityID":430300, "AreaSort":430300}, +{"AreaID":430321, "name":"湘潭县", "CityID":430300, "AreaSort":430300}, +{"AreaID":433122, "name":"泸溪县", "CityID":433100, "AreaSort":433100}, +{"AreaID":433101, "name":"吉首市", "CityID":433100, "AreaSort":433100}, +{"AreaID":433123, "name":"凤凰县", "CityID":433100, "AreaSort":433100}, +{"AreaID":433124, "name":"花垣县", "CityID":433100, "AreaSort":433100}, +{"AreaID":433130, "name":"龙山县", "CityID":433100, "AreaSort":433100}, +{"AreaID":433127, "name":"永顺县", "CityID":433100, "AreaSort":433100}, +{"AreaID":433126, "name":"古丈县", "CityID":433100, "AreaSort":433100}, +{"AreaID":433125, "name":"保靖县", "CityID":433100, "AreaSort":433100}, +{"AreaID":430281, "name":"醴陵市", "CityID":430200, "AreaSort":430200}, +{"AreaID":430223, "name":"攸县", "CityID":430200, "AreaSort":430200}, +{"AreaID":430224, "name":"茶陵县", "CityID":430200, "AreaSort":430200}, +{"AreaID":430221, "name":"株洲县", "CityID":430200, "AreaSort":430200}, +{"AreaID":430203, "name":"芦淞区", "CityID":430200, "AreaSort":430200}, +{"AreaID":430204, "name":"石峰区", "CityID":430200, "AreaSort":430200}, +{"AreaID":430211, "name":"天元区", "CityID":430200, "AreaSort":430200}, +{"AreaID":430202, "name":"荷塘区", "CityID":430200, "AreaSort":430200}, +{"AreaID":430225, "name":"炎陵县", "CityID":430200, "AreaSort":430200}, +{"AreaID":431230, "name":"通道侗族自治县", "CityID":431200, "AreaSort":431200}, +{"AreaID":431221, "name":"中方县", "CityID":431200, "AreaSort":431200}, +{"AreaID":431202, "name":"鹤城区", "CityID":431200, "AreaSort":431200}, +{"AreaID":431222, "name":"沅陵县", "CityID":431200, "AreaSort":431200}, +{"AreaID":431223, "name":"辰溪县", "CityID":431200, "AreaSort":431200}, +{"AreaID":431224, "name":"溆浦县", "CityID":431200, "AreaSort":431200}, +{"AreaID":431225, "name":"会同县", "CityID":431200, "AreaSort":431200}, +{"AreaID":431226, "name":"麻阳苗族自治县", "CityID":431200, "AreaSort":431200}, +{"AreaID":431227, "name":"新晃侗族自治县", "CityID":431200, "AreaSort":431200}, +{"AreaID":431228, "name":"芷江侗族自治县", "CityID":431200, "AreaSort":431200}, +{"AreaID":431281, "name":"洪江市", "CityID":431200, "AreaSort":431200}, +{"AreaID":431229, "name":"靖州苗族侗族自治县", "CityID":431200, "AreaSort":431200}, +{"AreaID":430581, "name":"武冈市", "CityID":430500, "AreaSort":430500}, +{"AreaID":430525, "name":"洞口县", "CityID":430500, "AreaSort":430500}, +{"AreaID":430524, "name":"隆回县", "CityID":430500, "AreaSort":430500}, +{"AreaID":430523, "name":"邵阳县", "CityID":430500, "AreaSort":430500}, +{"AreaID":430522, "name":"新邵县", "CityID":430500, "AreaSort":430500}, +{"AreaID":430521, "name":"邵东县", "CityID":430500, "AreaSort":430500}, +{"AreaID":430511, "name":"北塔区", "CityID":430500, "AreaSort":430500}, +{"AreaID":430502, "name":"双清区", "CityID":430500, "AreaSort":430500}, +{"AreaID":430503, "name":"大祥区", "CityID":430500, "AreaSort":430500}, +{"AreaID":430529, "name":"城步苗族自治县", "CityID":430500, "AreaSort":430500}, +{"AreaID":430528, "name":"新宁县", "CityID":430500, "AreaSort":430500}, +{"AreaID":430527, "name":"绥宁县", "CityID":430500, "AreaSort":430500}, +{"AreaID":431127, "name":"蓝山县", "CityID":431100, "AreaSort":431100}, +{"AreaID":431128, "name":"新田县", "CityID":431100, "AreaSort":431100}, +{"AreaID":431102, "name":"零陵区", "CityID":431100, "AreaSort":431100}, +{"AreaID":431129, "name":"江华瑶族自治县", "CityID":431100, "AreaSort":431100}, +{"AreaID":431103, "name":"冷水滩区", "CityID":431100, "AreaSort":431100}, +{"AreaID":431123, "name":"双牌县", "CityID":431100, "AreaSort":431100}, +{"AreaID":431124, "name":"道县", "CityID":431100, "AreaSort":431100}, +{"AreaID":431125, "name":"江永县", "CityID":431100, "AreaSort":431100}, +{"AreaID":431126, "name":"宁远县", "CityID":431100, "AreaSort":431100}, +{"AreaID":431122, "name":"东安县", "CityID":431100, "AreaSort":431100}, +{"AreaID":431121, "name":"祁阳县", "CityID":431100, "AreaSort":431100}, +{"AreaID":430802, "name":"永定区", "CityID":430800, "AreaSort":430800}, +{"AreaID":430821, "name":"慈利县", "CityID":430800, "AreaSort":430800}, +{"AreaID":430822, "name":"桑植县", "CityID":430800, "AreaSort":430800}, +{"AreaID":430811, "name":"武陵源区", "CityID":430800, "AreaSort":430800}, +{"AreaID":431024, "name":"嘉禾县", "CityID":431000, "AreaSort":431000}, +{"AreaID":431025, "name":"临武县", "CityID":431000, "AreaSort":431000}, +{"AreaID":431026, "name":"汝城县", "CityID":431000, "AreaSort":431000}, +{"AreaID":431027, "name":"桂东县", "CityID":431000, "AreaSort":431000}, +{"AreaID":431028, "name":"安仁县", "CityID":431000, "AreaSort":431000}, +{"AreaID":431081, "name":"资兴市", "CityID":431000, "AreaSort":431000}, +{"AreaID":431023, "name":"永兴县", "CityID":431000, "AreaSort":431000}, +{"AreaID":431003, "name":"苏仙区", "CityID":431000, "AreaSort":431000}, +{"AreaID":431022, "name":"宜章县", "CityID":431000, "AreaSort":431000}, +{"AreaID":431002, "name":"北湖区", "CityID":431000, "AreaSort":431000}, +{"AreaID":431021, "name":"桂阳县", "CityID":431000, "AreaSort":431000}, +{"AreaID":430725, "name":"桃源县", "CityID":430700, "AreaSort":430700}, +{"AreaID":430724, "name":"临澧县", "CityID":430700, "AreaSort":430700}, +{"AreaID":430726, "name":"石门县", "CityID":430700, "AreaSort":430700}, +{"AreaID":430781, "name":"津市市", "CityID":430700, "AreaSort":430700}, +{"AreaID":430721, "name":"安乡县", "CityID":430700, "AreaSort":430700}, +{"AreaID":430702, "name":"武陵区", "CityID":430700, "AreaSort":430700}, +{"AreaID":430703, "name":"鼎城区", "CityID":430700, "AreaSort":430700}, +{"AreaID":430723, "name":"澧县", "CityID":430700, "AreaSort":430700}, +{"AreaID":430722, "name":"汉寿县", "CityID":430700, "AreaSort":430700}, +{"AreaID":430621, "name":"岳阳县", "CityID":430600, "AreaSort":430600}, +{"AreaID":430624, "name":"湘阴县", "CityID":430600, "AreaSort":430600}, +{"AreaID":430623, "name":"华容县", "CityID":430600, "AreaSort":430600}, +{"AreaID":430682, "name":"临湘市", "CityID":430600, "AreaSort":430600}, +{"AreaID":430611, "name":"君山区", "CityID":430600, "AreaSort":430600}, +{"AreaID":430602, "name":"岳阳楼区", "CityID":430600, "AreaSort":430600}, +{"AreaID":430681, "name":"汨罗市", "CityID":430600, "AreaSort":430600}, +{"AreaID":430603, "name":"云溪区", "CityID":430600, "AreaSort":430600}, +{"AreaID":430626, "name":"平江县", "CityID":430600, "AreaSort":430600}, +{"AreaID":430903, "name":"赫山区", "CityID":430900, "AreaSort":430900}, +{"AreaID":430902, "name":"资阳区", "CityID":430900, "AreaSort":430900}, +{"AreaID":430921, "name":"南县", "CityID":430900, "AreaSort":430900}, +{"AreaID":430922, "name":"桃江县", "CityID":430900, "AreaSort":430900}, +{"AreaID":430923, "name":"安化县", "CityID":430900, "AreaSort":430900}, +{"AreaID":430981, "name":"沅江市", "CityID":430900, "AreaSort":430900}, +{"AreaID":431381, "name":"冷水江市", "CityID":431300, "AreaSort":431300}, +{"AreaID":431382, "name":"涟源市", "CityID":431300, "AreaSort":431300}, +{"AreaID":431302, "name":"娄星区", "CityID":431300, "AreaSort":431300}, +{"AreaID":431322, "name":"新化县", "CityID":431300, "AreaSort":431300}, +{"AreaID":431321, "name":"双峰县", "CityID":431300, "AreaSort":431300}, +{"AreaID":430408, "name":"蒸湘区", "CityID":430400, "AreaSort":430400}, +{"AreaID":430407, "name":"石鼓区", "CityID":430400, "AreaSort":430400}, +{"AreaID":430406, "name":"雁峰区", "CityID":430400, "AreaSort":430400}, +{"AreaID":430405, "name":"珠晖区", "CityID":430400, "AreaSort":430400}, +{"AreaID":430422, "name":"衡南县", "CityID":430400, "AreaSort":430400}, +{"AreaID":430421, "name":"衡阳县", "CityID":430400, "AreaSort":430400}, +{"AreaID":430412, "name":"南岳区", "CityID":430400, "AreaSort":430400}, +{"AreaID":430482, "name":"常宁市", "CityID":430400, "AreaSort":430400}, +{"AreaID":430426, "name":"祁东县", "CityID":430400, "AreaSort":430400}, +{"AreaID":430481, "name":"耒阳市", "CityID":430400, "AreaSort":430400}, +{"AreaID":430424, "name":"衡东县", "CityID":430400, "AreaSort":430400}, +{"AreaID":430423, "name":"衡山县", "CityID":430400, "AreaSort":430400}, +{"AreaID":430124, "name":"宁乡县", "CityID":430100, "AreaSort":430100}, +{"AreaID":430181, "name":"浏阳市", "CityID":430100, "AreaSort":430100}, +{"AreaID":430121, "name":"长沙县", "CityID":430100, "AreaSort":430100}, +{"AreaID":430105, "name":"开福区", "CityID":430100, "AreaSort":430100}, +{"AreaID":430104, "name":"岳麓区", "CityID":430100, "AreaSort":430100}, +{"AreaID":430112, "name":"望城区", "CityID":430100, "AreaSort":430100}, +{"AreaID":430103, "name":"天心区", "CityID":430100, "AreaSort":430100}, +{"AreaID":430111, "name":"雨花区", "CityID":430100, "AreaSort":430100}, +{"AreaID":430102, "name":"芙蓉区", "CityID":430100, "AreaSort":430100}, +{"AreaID":441502, "name":"城区", "CityID":441500, "AreaSort":441500}, +{"AreaID":441521, "name":"海丰县", "CityID":441500, "AreaSort":441500}, +{"AreaID":441523, "name":"陆河县", "CityID":441500, "AreaSort":441500}, +{"AreaID":441581, "name":"陆丰市", "CityID":441500, "AreaSort":441500}, +{"AreaID":440303, "name":"罗湖区", "CityID":440300, "AreaSort":440300}, +{"AreaID":440304, "name":"福田区", "CityID":440300, "AreaSort":440300}, +{"AreaID":440307, "name":"龙岗区", "CityID":440300, "AreaSort":440300}, +{"AreaID":440308, "name":"盐田区", "CityID":440300, "AreaSort":440300}, +{"AreaID":440305, "name":"南山区", "CityID":440300, "AreaSort":440300}, +{"AreaID":440306, "name":"宝安区", "CityID":440300, "AreaSort":440300}, +{"AreaID":440606, "name":"顺德区", "CityID":440600, "AreaSort":440600}, +{"AreaID":440607, "name":"三水区", "CityID":440600, "AreaSort":440600}, +{"AreaID":440608, "name":"高明区", "CityID":440600, "AreaSort":440600}, +{"AreaID":440604, "name":"禅城区", "CityID":440600, "AreaSort":440600}, +{"AreaID":440605, "name":"南海区", "CityID":440600, "AreaSort":440600}, +{"AreaID":440902, "name":"茂南区", "CityID":440900, "AreaSort":440900}, +{"AreaID":440904, "name":"电白区", "CityID":440900, "AreaSort":440900}, +{"AreaID":440982, "name":"化州市", "CityID":440900, "AreaSort":440900}, +{"AreaID":440981, "name":"高州市", "CityID":440900, "AreaSort":440900}, +{"AreaID":440983, "name":"信宜市", "CityID":440900, "AreaSort":440900}, +{"AreaID":441625, "name":"东源县", "CityID":441600, "AreaSort":441600}, +{"AreaID":441602, "name":"源城区", "CityID":441600, "AreaSort":441600}, +{"AreaID":441621, "name":"紫金县", "CityID":441600, "AreaSort":441600}, +{"AreaID":441622, "name":"龙川县", "CityID":441600, "AreaSort":441600}, +{"AreaID":441623, "name":"连平县", "CityID":441600, "AreaSort":441600}, +{"AreaID":441624, "name":"和平县", "CityID":441600, "AreaSort":441600}, +{"AreaID":440825, "name":"徐闻县", "CityID":440800, "AreaSort":440800}, +{"AreaID":440804, "name":"坡头区", "CityID":440800, "AreaSort":440800}, +{"AreaID":440823, "name":"遂溪县", "CityID":440800, "AreaSort":440800}, +{"AreaID":440811, "name":"麻章区", "CityID":440800, "AreaSort":440800}, +{"AreaID":440802, "name":"赤坎区", "CityID":440800, "AreaSort":440800}, +{"AreaID":440803, "name":"霞山区", "CityID":440800, "AreaSort":440800}, +{"AreaID":440881, "name":"廉江市", "CityID":440800, "AreaSort":440800}, +{"AreaID":440882, "name":"雷州市", "CityID":440800, "AreaSort":440800}, +{"AreaID":440883, "name":"吴川市", "CityID":440800, "AreaSort":440800}, +{"AreaID":441324, "name":"龙门县", "CityID":441300, "AreaSort":441300}, +{"AreaID":441323, "name":"惠东县", "CityID":441300, "AreaSort":441300}, +{"AreaID":441322, "name":"博罗县", "CityID":441300, "AreaSort":441300}, +{"AreaID":441303, "name":"惠阳区", "CityID":441300, "AreaSort":441300}, +{"AreaID":441302, "name":"惠城区", "CityID":441300, "AreaSort":441300}, +{"AreaID":445203, "name":"揭东区", "CityID":445200, "AreaSort":445200}, +{"AreaID":445224, "name":"惠来县", "CityID":445200, "AreaSort":445200}, +{"AreaID":445202, "name":"榕城区", "CityID":445200, "AreaSort":445200}, +{"AreaID":445222, "name":"揭西县", "CityID":445200, "AreaSort":445200}, +{"AreaID":445281, "name":"普宁市", "CityID":445200, "AreaSort":445200}, +{"AreaID":440118, "name":"增城区", "CityID":440100, "AreaSort":440100}, +{"AreaID":440117, "name":"从化区", "CityID":440100, "AreaSort":440100}, +{"AreaID":440104, "name":"越秀区", "CityID":440100, "AreaSort":440100}, +{"AreaID":440103, "name":"荔湾区", "CityID":440100, "AreaSort":440100}, +{"AreaID":440115, "name":"南沙区", "CityID":440100, "AreaSort":440100}, +{"AreaID":440106, "name":"天河区", "CityID":440100, "AreaSort":440100}, +{"AreaID":440114, "name":"花都区", "CityID":440100, "AreaSort":440100}, +{"AreaID":440105, "name":"海珠区", "CityID":440100, "AreaSort":440100}, +{"AreaID":440113, "name":"番禺区", "CityID":440100, "AreaSort":440100}, +{"AreaID":440112, "name":"黄埔区", "CityID":440100, "AreaSort":440100}, +{"AreaID":440111, "name":"白云区", "CityID":440100, "AreaSort":440100}, +{"AreaID":441821, "name":"佛冈县", "CityID":441800, "AreaSort":441800}, +{"AreaID":441802, "name":"清城区", "CityID":441800, "AreaSort":441800}, +{"AreaID":441803, "name":"清新区", "CityID":441800, "AreaSort":441800}, +{"AreaID":441882, "name":"连州市", "CityID":441800, "AreaSort":441800}, +{"AreaID":441881, "name":"英德市", "CityID":441800, "AreaSort":441800}, +{"AreaID":441825, "name":"连山壮族瑶族自治县", "CityID":441800, "AreaSort":441800}, +{"AreaID":441826, "name":"连南瑶族自治县", "CityID":441800, "AreaSort":441800}, +{"AreaID":441823, "name":"阳山县", "CityID":441800, "AreaSort":441800}, +{"AreaID":445102, "name":"湘桥区", "CityID":445100, "AreaSort":445100}, +{"AreaID":445103, "name":"潮安区", "CityID":445100, "AreaSort":445100}, +{"AreaID":445122, "name":"饶平县", "CityID":445100, "AreaSort":445100}, +{"AreaID":440224, "name":"仁化县", "CityID":440200, "AreaSort":440200}, +{"AreaID":440282, "name":"南雄市", "CityID":440200, "AreaSort":440200}, +{"AreaID":440281, "name":"乐昌市", "CityID":440200, "AreaSort":440200}, +{"AreaID":440203, "name":"武江区", "CityID":440200, "AreaSort":440200}, +{"AreaID":440233, "name":"新丰县", "CityID":440200, "AreaSort":440200}, +{"AreaID":440232, "name":"乳源瑶族自治县", "CityID":440200, "AreaSort":440200}, +{"AreaID":440205, "name":"曲江区", "CityID":440200, "AreaSort":440200}, +{"AreaID":440222, "name":"始兴县", "CityID":440200, "AreaSort":440200}, +{"AreaID":440204, "name":"浈江区", "CityID":440200, "AreaSort":440200}, +{"AreaID":440229, "name":"翁源县", "CityID":440200, "AreaSort":440200}, +{"AreaID":440781, "name":"台山市", "CityID":440700, "AreaSort":440700}, +{"AreaID":440784, "name":"鹤山市", "CityID":440700, "AreaSort":440700}, +{"AreaID":440783, "name":"开平市", "CityID":440700, "AreaSort":440700}, +{"AreaID":440785, "name":"恩平市", "CityID":440700, "AreaSort":440700}, +{"AreaID":440704, "name":"江海区", "CityID":440700, "AreaSort":440700}, +{"AreaID":440703, "name":"蓬江区", "CityID":440700, "AreaSort":440700}, +{"AreaID":440705, "name":"新会区", "CityID":440700, "AreaSort":440700}, +{"AreaID":442000, "name":"湖滨北路", "CityID":442000, "AreaSort":442000}, +{"AreaID":445381, "name":"罗定市", "CityID":445300, "AreaSort":445300}, +{"AreaID":445321, "name":"新兴县", "CityID":445300, "AreaSort":445300}, +{"AreaID":445322, "name":"郁南县", "CityID":445300, "AreaSort":445300}, +{"AreaID":445303, "name":"云安区", "CityID":445300, "AreaSort":445300}, +{"AreaID":445302, "name":"云城区", "CityID":445300, "AreaSort":445300}, +{"AreaID":441203, "name":"鼎湖区", "CityID":441200, "AreaSort":441200}, +{"AreaID":441204, "name":"高要区", "CityID":441200, "AreaSort":441200}, +{"AreaID":441202, "name":"端州区", "CityID":441200, "AreaSort":441200}, +{"AreaID":441224, "name":"怀集县", "CityID":441200, "AreaSort":441200}, +{"AreaID":441223, "name":"广宁县", "CityID":441200, "AreaSort":441200}, +{"AreaID":441284, "name":"四会市", "CityID":441200, "AreaSort":441200}, +{"AreaID":441226, "name":"德庆县", "CityID":441200, "AreaSort":441200}, +{"AreaID":441225, "name":"封开县", "CityID":441200, "AreaSort":441200}, +{"AreaID":441781, "name":"阳春市", "CityID":441700, "AreaSort":441700}, +{"AreaID":441704, "name":"阳东区", "CityID":441700, "AreaSort":441700}, +{"AreaID":441702, "name":"江城区", "CityID":441700, "AreaSort":441700}, +{"AreaID":441721, "name":"阳西县", "CityID":441700, "AreaSort":441700}, +{"AreaID":440404, "name":"金湾区", "CityID":440400, "AreaSort":440400}, +{"AreaID":440403, "name":"斗门区", "CityID":440400, "AreaSort":440400}, +{"AreaID":440402, "name":"香洲区", "CityID":440400, "AreaSort":440400}, +{"AreaID":441422, "name":"大埔县", "CityID":441400, "AreaSort":441400}, +{"AreaID":441481, "name":"兴宁市", "CityID":441400, "AreaSort":441400}, +{"AreaID":441426, "name":"平远县", "CityID":441400, "AreaSort":441400}, +{"AreaID":441424, "name":"五华县", "CityID":441400, "AreaSort":441400}, +{"AreaID":441423, "name":"丰顺县", "CityID":441400, "AreaSort":441400}, +{"AreaID":441427, "name":"蕉岭县", "CityID":441400, "AreaSort":441400}, +{"AreaID":441402, "name":"梅江区", "CityID":441400, "AreaSort":441400}, +{"AreaID":441403, "name":"梅县区", "CityID":441400, "AreaSort":441400}, +{"AreaID":441900, "name":"三元里", "CityID":441900, "AreaSort":441900}, +{"AreaID":440514, "name":"潮南区", "CityID":440500, "AreaSort":440500}, +{"AreaID":440523, "name":"南澳县", "CityID":440500, "AreaSort":440500}, +{"AreaID":440515, "name":"澄海区", "CityID":440500, "AreaSort":440500}, +{"AreaID":440507, "name":"龙湖区", "CityID":440500, "AreaSort":440500}, +{"AreaID":440512, "name":"濠江区", "CityID":440500, "AreaSort":440500}, +{"AreaID":440513, "name":"潮阳区", "CityID":440500, "AreaSort":440500}, +{"AreaID":440511, "name":"金平区", "CityID":440500, "AreaSort":440500}, +{"AreaID":450802, "name":"港北区", "CityID":450800, "AreaSort":450800}, +{"AreaID":450804, "name":"覃塘区", "CityID":450800, "AreaSort":450800}, +{"AreaID":450821, "name":"平南县", "CityID":450800, "AreaSort":450800}, +{"AreaID":450803, "name":"港南区", "CityID":450800, "AreaSort":450800}, +{"AreaID":450881, "name":"桂平市", "CityID":450800, "AreaSort":450800}, +{"AreaID":450512, "name":"铁山港区", "CityID":450500, "AreaSort":450500}, +{"AreaID":450521, "name":"合浦县", "CityID":450500, "AreaSort":450500}, +{"AreaID":450503, "name":"银海区", "CityID":450500, "AreaSort":450500}, +{"AreaID":450502, "name":"海城区", "CityID":450500, "AreaSort":450500}, +{"AreaID":451031, "name":"隆林各族自治县", "CityID":451000, "AreaSort":451000}, +{"AreaID":451002, "name":"右江区", "CityID":451000, "AreaSort":451000}, +{"AreaID":451030, "name":"西林县", "CityID":451000, "AreaSort":451000}, +{"AreaID":451021, "name":"田阳县", "CityID":451000, "AreaSort":451000}, +{"AreaID":451024, "name":"德保县", "CityID":451000, "AreaSort":451000}, +{"AreaID":451023, "name":"平果县", "CityID":451000, "AreaSort":451000}, +{"AreaID":451022, "name":"田东县", "CityID":451000, "AreaSort":451000}, +{"AreaID":451029, "name":"田林县", "CityID":451000, "AreaSort":451000}, +{"AreaID":451028, "name":"乐业县", "CityID":451000, "AreaSort":451000}, +{"AreaID":451081, "name":"靖西市", "CityID":451000, "AreaSort":451000}, +{"AreaID":451027, "name":"凌云县", "CityID":451000, "AreaSort":451000}, +{"AreaID":451026, "name":"那坡县", "CityID":451000, "AreaSort":451000}, +{"AreaID":451221, "name":"南丹县", "CityID":451200, "AreaSort":451200}, +{"AreaID":451223, "name":"凤山县", "CityID":451200, "AreaSort":451200}, +{"AreaID":451222, "name":"天峨县", "CityID":451200, "AreaSort":451200}, +{"AreaID":451281, "name":"宜州市", "CityID":451200, "AreaSort":451200}, +{"AreaID":451225, "name":"罗城仫佬族自治县", "CityID":451200, "AreaSort":451200}, +{"AreaID":451224, "name":"东兰县", "CityID":451200, "AreaSort":451200}, +{"AreaID":451227, "name":"巴马瑶族自治县", "CityID":451200, "AreaSort":451200}, +{"AreaID":451226, "name":"环江毛南族自治县", "CityID":451200, "AreaSort":451200}, +{"AreaID":451229, "name":"大化瑶族自治县", "CityID":451200, "AreaSort":451200}, +{"AreaID":451228, "name":"都安瑶族自治县", "CityID":451200, "AreaSort":451200}, +{"AreaID":451202, "name":"金城江区", "CityID":451200, "AreaSort":451200}, +{"AreaID":450304, "name":"象山区", "CityID":450300, "AreaSort":450300}, +{"AreaID":450323, "name":"灵川县", "CityID":450300, "AreaSort":450300}, +{"AreaID":450305, "name":"七星区", "CityID":450300, "AreaSort":450300}, +{"AreaID":450325, "name":"兴安县", "CityID":450300, "AreaSort":450300}, +{"AreaID":450324, "name":"全州县", "CityID":450300, "AreaSort":450300}, +{"AreaID":450332, "name":"恭城瑶族自治县", "CityID":450300, "AreaSort":450300}, +{"AreaID":450331, "name":"荔浦县", "CityID":450300, "AreaSort":450300}, +{"AreaID":450330, "name":"平乐县", "CityID":450300, "AreaSort":450300}, +{"AreaID":450321, "name":"阳朔县", "CityID":450300, "AreaSort":450300}, +{"AreaID":450327, "name":"灌阳县", "CityID":450300, "AreaSort":450300}, +{"AreaID":450326, "name":"永福县", "CityID":450300, "AreaSort":450300}, +{"AreaID":450329, "name":"资源县", "CityID":450300, "AreaSort":450300}, +{"AreaID":450302, "name":"秀峰区", "CityID":450300, "AreaSort":450300}, +{"AreaID":450311, "name":"雁山区", "CityID":450300, "AreaSort":450300}, +{"AreaID":450328, "name":"龙胜各族自治县", "CityID":450300, "AreaSort":450300}, +{"AreaID":450303, "name":"叠彩区", "CityID":450300, "AreaSort":450300}, +{"AreaID":450312, "name":"临桂区", "CityID":450300, "AreaSort":450300}, +{"AreaID":450205, "name":"柳北区", "CityID":450200, "AreaSort":450200}, +{"AreaID":450202, "name":"城中区", "CityID":450200, "AreaSort":450200}, +{"AreaID":450222, "name":"柳城县", "CityID":450200, "AreaSort":450200}, +{"AreaID":450204, "name":"柳南区", "CityID":450200, "AreaSort":450200}, +{"AreaID":450221, "name":"柳江县", "CityID":450200, "AreaSort":450200}, +{"AreaID":450203, "name":"鱼峰区", "CityID":450200, "AreaSort":450200}, +{"AreaID":450224, "name":"融安县", "CityID":450200, "AreaSort":450200}, +{"AreaID":450223, "name":"鹿寨县", "CityID":450200, "AreaSort":450200}, +{"AreaID":450226, "name":"三江侗族自治县", "CityID":450200, "AreaSort":450200}, +{"AreaID":450225, "name":"融水苗族自治县", "CityID":450200, "AreaSort":450200}, +{"AreaID":450481, "name":"岑溪市", "CityID":450400, "AreaSort":450400}, +{"AreaID":450421, "name":"苍梧县", "CityID":450400, "AreaSort":450400}, +{"AreaID":450422, "name":"藤县", "CityID":450400, "AreaSort":450400}, +{"AreaID":450423, "name":"蒙山县", "CityID":450400, "AreaSort":450400}, +{"AreaID":450403, "name":"万秀区", "CityID":450400, "AreaSort":450400}, +{"AreaID":450405, "name":"长洲区", "CityID":450400, "AreaSort":450400}, +{"AreaID":450406, "name":"龙圩区", "CityID":450400, "AreaSort":450400}, +{"AreaID":450110, "name":"武鸣区", "CityID":450100, "AreaSort":450100}, +{"AreaID":450102, "name":"兴宁区", "CityID":450100, "AreaSort":450100}, +{"AreaID":450103, "name":"青秀区", "CityID":450100, "AreaSort":450100}, +{"AreaID":450105, "name":"江南区", "CityID":450100, "AreaSort":450100}, +{"AreaID":450123, "name":"隆安县", "CityID":450100, "AreaSort":450100}, +{"AreaID":450107, "name":"西乡塘区", "CityID":450100, "AreaSort":450100}, +{"AreaID":450108, "name":"良庆区", "CityID":450100, "AreaSort":450100}, +{"AreaID":450109, "name":"邕宁区", "CityID":450100, "AreaSort":450100}, +{"AreaID":450127, "name":"横县", "CityID":450100, "AreaSort":450100}, +{"AreaID":450126, "name":"宾阳县", "CityID":450100, "AreaSort":450100}, +{"AreaID":450125, "name":"上林县", "CityID":450100, "AreaSort":450100}, +{"AreaID":450124, "name":"马山县", "CityID":450100, "AreaSort":450100}, +{"AreaID":451321, "name":"忻城县", "CityID":451300, "AreaSort":451300}, +{"AreaID":451322, "name":"象州县", "CityID":451300, "AreaSort":451300}, +{"AreaID":451302, "name":"兴宾区", "CityID":451300, "AreaSort":451300}, +{"AreaID":451323, "name":"武宣县", "CityID":451300, "AreaSort":451300}, +{"AreaID":451324, "name":"金秀瑶族自治县", "CityID":451300, "AreaSort":451300}, +{"AreaID":451381, "name":"合山市", "CityID":451300, "AreaSort":451300}, +{"AreaID":451402, "name":"江州区", "CityID":451400, "AreaSort":451400}, +{"AreaID":451424, "name":"大新县", "CityID":451400, "AreaSort":451400}, +{"AreaID":451425, "name":"天等县", "CityID":451400, "AreaSort":451400}, +{"AreaID":451422, "name":"宁明县", "CityID":451400, "AreaSort":451400}, +{"AreaID":451481, "name":"凭祥市", "CityID":451400, "AreaSort":451400}, +{"AreaID":451423, "name":"龙州县", "CityID":451400, "AreaSort":451400}, +{"AreaID":451421, "name":"扶绥县", "CityID":451400, "AreaSort":451400}, +{"AreaID":450681, "name":"东兴市", "CityID":450600, "AreaSort":450600}, +{"AreaID":450621, "name":"上思县", "CityID":450600, "AreaSort":450600}, +{"AreaID":450602, "name":"港口区", "CityID":450600, "AreaSort":450600}, +{"AreaID":450603, "name":"防城区", "CityID":450600, "AreaSort":450600}, +{"AreaID":450921, "name":"容县", "CityID":450900, "AreaSort":450900}, +{"AreaID":450923, "name":"博白县", "CityID":450900, "AreaSort":450900}, +{"AreaID":450922, "name":"陆川县", "CityID":450900, "AreaSort":450900}, +{"AreaID":450924, "name":"兴业县", "CityID":450900, "AreaSort":450900}, +{"AreaID":450902, "name":"玉州区", "CityID":450900, "AreaSort":450900}, +{"AreaID":450981, "name":"北流市", "CityID":450900, "AreaSort":450900}, +{"AreaID":450903, "name":"福绵区", "CityID":450900, "AreaSort":450900}, +{"AreaID":451102, "name":"八步区", "CityID":451100, "AreaSort":451100}, +{"AreaID":451122, "name":"钟山县", "CityID":451100, "AreaSort":451100}, +{"AreaID":451121, "name":"昭平县", "CityID":451100, "AreaSort":451100}, +{"AreaID":451123, "name":"富川瑶族自治县", "CityID":451100, "AreaSort":451100}, +{"AreaID":450722, "name":"浦北县", "CityID":450700, "AreaSort":450700}, +{"AreaID":450703, "name":"钦北区", "CityID":450700, "AreaSort":450700}, +{"AreaID":450721, "name":"灵山县", "CityID":450700, "AreaSort":450700}, +{"AreaID":450702, "name":"钦南区", "CityID":450700, "AreaSort":450700}, +{"AreaID":460200, "name":"三亚湾", "CityID":460200, "AreaSort":460200}, +{"AreaID":460202, "name":"海棠区", "CityID":460200, "AreaSort":460200}, +{"AreaID":460203, "name":"吉阳区", "CityID":460200, "AreaSort":460200}, +{"AreaID":460204, "name":"天涯区", "CityID":460200, "AreaSort":460200}, +{"AreaID":460205, "name":"崖州区", "CityID":460200, "AreaSort":460200}, +{"AreaID":460321, "name":"西沙群岛", "CityID":460300, "AreaSort":460300}, +{"AreaID":460322, "name":"南沙群岛", "CityID":460300, "AreaSort":460300}, +{"AreaID":460323, "name":"中沙群岛的岛礁及其海域", "CityID":460300, "AreaSort":460300}, +{"AreaID":460105, "name":"秀英区", "CityID":460100, "AreaSort":460100}, +{"AreaID":460106, "name":"龙华区", "CityID":460100, "AreaSort":460100}, +{"AreaID":460107, "name":"琼山区", "CityID":460100, "AreaSort":460100}, +{"AreaID":460108, "name":"美兰区", "CityID":460100, "AreaSort":460100}, +{"AreaID":500119, "name":"南川区", "CityID":500100, "AreaSort":500000}, +{"AreaID":500103, "name":"渝中区", "CityID":500100, "AreaSort":500000}, +{"AreaID":500116, "name":"江津区", "CityID":500100, "AreaSort":500000}, +{"AreaID":500102, "name":"涪陵区", "CityID":500100, "AreaSort":500000}, +{"AreaID":500115, "name":"长寿区", "CityID":500100, "AreaSort":500000}, +{"AreaID":500101, "name":"万州区", "CityID":500100, "AreaSort":500000}, +{"AreaID":500118, "name":"永川区", "CityID":500100, "AreaSort":500000}, +{"AreaID":500117, "name":"合川区", "CityID":500100, "AreaSort":500000}, +{"AreaID":500237, "name":"巫山县", "CityID":500100, "AreaSort":500000}, +{"AreaID":500236, "name":"奉节县", "CityID":500100, "AreaSort":500000}, +{"AreaID":500238, "name":"巫溪县", "CityID":500100, "AreaSort":500000}, +{"AreaID":500243, "name":"彭水苗族土家族自治县", "CityID":500100, "AreaSort":500000}, +{"AreaID":500240, "name":"石柱土家族自治县", "CityID":500100, "AreaSort":500000}, +{"AreaID":500241, "name":"秀山土家族苗族自治县", "CityID":500100, "AreaSort":500000}, +{"AreaID":500242, "name":"酉阳土家族苗族自治县", "CityID":500100, "AreaSort":500000}, +{"AreaID":500120, "name":"璧山区", "CityID":500100, "AreaSort":500000}, +{"AreaID":500110, "name":"綦江区", "CityID":500100, "AreaSort":500000}, +{"AreaID":500112, "name":"渝北区", "CityID":500100, "AreaSort":500000}, +{"AreaID":500111, "name":"大足区", "CityID":500100, "AreaSort":500000}, +{"AreaID":500114, "name":"黔江区", "CityID":500100, "AreaSort":500000}, +{"AreaID":500113, "name":"巴南区", "CityID":500100, "AreaSort":500000}, +{"AreaID":500231, "name":"垫江县", "CityID":500100, "AreaSort":500000}, +{"AreaID":500230, "name":"丰都县", "CityID":500100, "AreaSort":500000}, +{"AreaID":500233, "name":"忠县", "CityID":500100, "AreaSort":500000}, +{"AreaID":500232, "name":"武隆县", "CityID":500100, "AreaSort":500000}, +{"AreaID":500235, "name":"云阳县", "CityID":500100, "AreaSort":500000}, +{"AreaID":500234, "name":"开县", "CityID":500100, "AreaSort":500000}, +{"AreaID":500228, "name":"梁平县", "CityID":500100, "AreaSort":500000}, +{"AreaID":500229, "name":"城口县", "CityID":500100, "AreaSort":500000}, +{"AreaID":500104, "name":"大渡口区", "CityID":500100, "AreaSort":500000}, +{"AreaID":500153, "name":"荣昌区", "CityID":500100, "AreaSort":500000}, +{"AreaID":500105, "name":"江北区", "CityID":500100, "AreaSort":500000}, +{"AreaID":500106, "name":"沙坪坝区", "CityID":500100, "AreaSort":500000}, +{"AreaID":500151, "name":"铜梁区", "CityID":500100, "AreaSort":500000}, +{"AreaID":500107, "name":"九龙坡区", "CityID":500100, "AreaSort":500000}, +{"AreaID":500152, "name":"潼南区", "CityID":500100, "AreaSort":500000}, +{"AreaID":500108, "name":"南岸区", "CityID":500100, "AreaSort":500000}, +{"AreaID":500109, "name":"北碚区", "CityID":500100, "AreaSort":500000}, +{"AreaID":512002, "name":"雁江区", "CityID":512000, "AreaSort":512000}, +{"AreaID":512022, "name":"乐至县", "CityID":512000, "AreaSort":512000}, +{"AreaID":512081, "name":"简阳市", "CityID":512000, "AreaSort":512000}, +{"AreaID":512021, "name":"安岳县", "CityID":512000, "AreaSort":512000}, +{"AreaID":511902, "name":"巴州区", "CityID":511900, "AreaSort":511900}, +{"AreaID":511903, "name":"恩阳区", "CityID":511900, "AreaSort":511900}, +{"AreaID":511921, "name":"通江县", "CityID":511900, "AreaSort":511900}, +{"AreaID":511923, "name":"平昌县", "CityID":511900, "AreaSort":511900}, +{"AreaID":511922, "name":"南江县", "CityID":511900, "AreaSort":511900}, +{"AreaID":511824, "name":"石棉县", "CityID":511800, "AreaSort":511800}, +{"AreaID":511823, "name":"汉源县", "CityID":511800, "AreaSort":511800}, +{"AreaID":511826, "name":"芦山县", "CityID":511800, "AreaSort":511800}, +{"AreaID":511825, "name":"天全县", "CityID":511800, "AreaSort":511800}, +{"AreaID":511802, "name":"雨城区", "CityID":511800, "AreaSort":511800}, +{"AreaID":511822, "name":"荥经县", "CityID":511800, "AreaSort":511800}, +{"AreaID":511803, "name":"名山区", "CityID":511800, "AreaSort":511800}, +{"AreaID":511827, "name":"宝兴县", "CityID":511800, "AreaSort":511800}, +{"AreaID":510683, "name":"绵竹市", "CityID":510600, "AreaSort":510600}, +{"AreaID":510682, "name":"什邡市", "CityID":510600, "AreaSort":510600}, +{"AreaID":510626, "name":"罗江县", "CityID":510600, "AreaSort":510600}, +{"AreaID":510603, "name":"旌阳区", "CityID":510600, "AreaSort":510600}, +{"AreaID":510681, "name":"广汉市", "CityID":510600, "AreaSort":510600}, +{"AreaID":510623, "name":"中江县", "CityID":510600, "AreaSort":510600}, +{"AreaID":513338, "name":"得荣县", "CityID":513300, "AreaSort":513300}, +{"AreaID":513329, "name":"新龙县", "CityID":513300, "AreaSort":513300}, +{"AreaID":513337, "name":"稻城县", "CityID":513300, "AreaSort":513300}, +{"AreaID":513328, "name":"甘孜县", "CityID":513300, "AreaSort":513300}, +{"AreaID":513327, "name":"炉霍县", "CityID":513300, "AreaSort":513300}, +{"AreaID":513326, "name":"道孚县", "CityID":513300, "AreaSort":513300}, +{"AreaID":513301, "name":"康定市", "CityID":513300, "AreaSort":513300}, +{"AreaID":513322, "name":"泸定县", "CityID":513300, "AreaSort":513300}, +{"AreaID":513331, "name":"白玉县", "CityID":513300, "AreaSort":513300}, +{"AreaID":513323, "name":"丹巴县", "CityID":513300, "AreaSort":513300}, +{"AreaID":513332, "name":"石渠县", "CityID":513300, "AreaSort":513300}, +{"AreaID":513324, "name":"九龙县", "CityID":513300, "AreaSort":513300}, +{"AreaID":513325, "name":"雅江县", "CityID":513300, "AreaSort":513300}, +{"AreaID":513330, "name":"德格县", "CityID":513300, "AreaSort":513300}, +{"AreaID":513335, "name":"巴塘县", "CityID":513300, "AreaSort":513300}, +{"AreaID":513336, "name":"乡城县", "CityID":513300, "AreaSort":513300}, +{"AreaID":513333, "name":"色达县", "CityID":513300, "AreaSort":513300}, +{"AreaID":513334, "name":"理塘县", "CityID":513300, "AreaSort":513300}, +{"AreaID":511381, "name":"阆中市", "CityID":511300, "AreaSort":511300}, +{"AreaID":511304, "name":"嘉陵区", "CityID":511300, "AreaSort":511300}, +{"AreaID":511302, "name":"顺庆区", "CityID":511300, "AreaSort":511300}, +{"AreaID":511303, "name":"高坪区", "CityID":511300, "AreaSort":511300}, +{"AreaID":511321, "name":"南部县", "CityID":511300, "AreaSort":511300}, +{"AreaID":511325, "name":"西充县", "CityID":511300, "AreaSort":511300}, +{"AreaID":511323, "name":"蓬安县", "CityID":511300, "AreaSort":511300}, +{"AreaID":511324, "name":"仪陇县", "CityID":511300, "AreaSort":511300}, +{"AreaID":511322, "name":"营山县", "CityID":511300, "AreaSort":511300}, +{"AreaID":510121, "name":"金堂县", "CityID":510100, "AreaSort":510100}, +{"AreaID":510124, "name":"郫县", "CityID":510100, "AreaSort":510100}, +{"AreaID":510132, "name":"新津县", "CityID":510100, "AreaSort":510100}, +{"AreaID":510131, "name":"蒲江县", "CityID":510100, "AreaSort":510100}, +{"AreaID":510112, "name":"龙泉驿区", "CityID":510100, "AreaSort":510100}, +{"AreaID":510113, "name":"青白江区", "CityID":510100, "AreaSort":510100}, +{"AreaID":510106, "name":"金牛区", "CityID":510100, "AreaSort":510100}, +{"AreaID":510105, "name":"青羊区", "CityID":510100, "AreaSort":510100}, +{"AreaID":510104, "name":"锦江区", "CityID":510100, "AreaSort":510100}, +{"AreaID":510181, "name":"都江堰市", "CityID":510100, "AreaSort":510100}, +{"AreaID":510182, "name":"彭州市", "CityID":510100, "AreaSort":510100}, +{"AreaID":510108, "name":"成华区", "CityID":510100, "AreaSort":510100}, +{"AreaID":510107, "name":"武侯区", "CityID":510100, "AreaSort":510100}, +{"AreaID":510183, "name":"邛崃市", "CityID":510100, "AreaSort":510100}, +{"AreaID":510129, "name":"大邑县", "CityID":510100, "AreaSort":510100}, +{"AreaID":510184, "name":"崇州市", "CityID":510100, "AreaSort":510100}, +{"AreaID":510114, "name":"新都区", "CityID":510100, "AreaSort":510100}, +{"AreaID":510115, "name":"温江区", "CityID":510100, "AreaSort":510100}, +{"AreaID":510116, "name":"双流区", "CityID":510100, "AreaSort":510100}, +{"AreaID":511722, "name":"宣汉县", "CityID":511700, "AreaSort":511700}, +{"AreaID":511723, "name":"开江县", "CityID":511700, "AreaSort":511700}, +{"AreaID":511724, "name":"大竹县", "CityID":511700, "AreaSort":511700}, +{"AreaID":511725, "name":"渠县", "CityID":511700, "AreaSort":511700}, +{"AreaID":511703, "name":"达川区", "CityID":511700, "AreaSort":511700}, +{"AreaID":511702, "name":"通川区", "CityID":511700, "AreaSort":511700}, +{"AreaID":511781, "name":"万源市", "CityID":511700, "AreaSort":511700}, +{"AreaID":511421, "name":"仁寿县", "CityID":511400, "AreaSort":511400}, +{"AreaID":511425, "name":"青神县", "CityID":511400, "AreaSort":511400}, +{"AreaID":511423, "name":"洪雅县", "CityID":511400, "AreaSort":511400}, +{"AreaID":511424, "name":"丹棱县", "CityID":511400, "AreaSort":511400}, +{"AreaID":511403, "name":"彭山区", "CityID":511400, "AreaSort":511400}, +{"AreaID":511402, "name":"东坡区", "CityID":511400, "AreaSort":511400}, +{"AreaID":510821, "name":"旺苍县", "CityID":510800, "AreaSort":510800}, +{"AreaID":510802, "name":"利州区", "CityID":510800, "AreaSort":510800}, +{"AreaID":510812, "name":"朝天区", "CityID":510800, "AreaSort":510800}, +{"AreaID":510824, "name":"苍溪县", "CityID":510800, "AreaSort":510800}, +{"AreaID":510811, "name":"昭化区", "CityID":510800, "AreaSort":510800}, +{"AreaID":510823, "name":"剑阁县", "CityID":510800, "AreaSort":510800}, +{"AreaID":510822, "name":"青川县", "CityID":510800, "AreaSort":510800}, +{"AreaID":511102, "name":"市中区", "CityID":511100, "AreaSort":511100}, +{"AreaID":511129, "name":"沐川县", "CityID":511100, "AreaSort":511100}, +{"AreaID":511112, "name":"五通桥区", "CityID":511100, "AreaSort":511100}, +{"AreaID":511124, "name":"井研县", "CityID":511100, "AreaSort":511100}, +{"AreaID":511111, "name":"沙湾区", "CityID":511100, "AreaSort":511100}, +{"AreaID":511123, "name":"犍为县", "CityID":511100, "AreaSort":511100}, +{"AreaID":511126, "name":"夹江县", "CityID":511100, "AreaSort":511100}, +{"AreaID":511113, "name":"金口河区", "CityID":511100, "AreaSort":511100}, +{"AreaID":511181, "name":"峨眉山市", "CityID":511100, "AreaSort":511100}, +{"AreaID":511133, "name":"马边彝族自治县", "CityID":511100, "AreaSort":511100}, +{"AreaID":511132, "name":"峨边彝族自治县", "CityID":511100, "AreaSort":511100}, +{"AreaID":510727, "name":"平武县", "CityID":510700, "AreaSort":510700}, +{"AreaID":510704, "name":"游仙区", "CityID":510700, "AreaSort":510700}, +{"AreaID":510703, "name":"涪城区", "CityID":510700, "AreaSort":510700}, +{"AreaID":510781, "name":"江油市", "CityID":510700, "AreaSort":510700}, +{"AreaID":510722, "name":"三台县", "CityID":510700, "AreaSort":510700}, +{"AreaID":510723, "name":"盐亭县", "CityID":510700, "AreaSort":510700}, +{"AreaID":510724, "name":"安县", "CityID":510700, "AreaSort":510700}, +{"AreaID":510725, "name":"梓潼县", "CityID":510700, "AreaSort":510700}, +{"AreaID":510726, "name":"北川羌族自治县", "CityID":510700, "AreaSort":510700}, +{"AreaID":511528, "name":"兴文县", "CityID":511500, "AreaSort":511500}, +{"AreaID":511529, "name":"屏山县", "CityID":511500, "AreaSort":511500}, +{"AreaID":511526, "name":"珙县", "CityID":511500, "AreaSort":511500}, +{"AreaID":511527, "name":"筠连县", "CityID":511500, "AreaSort":511500}, +{"AreaID":511524, "name":"长宁县", "CityID":511500, "AreaSort":511500}, +{"AreaID":511525, "name":"高县", "CityID":511500, "AreaSort":511500}, +{"AreaID":511503, "name":"南溪区", "CityID":511500, "AreaSort":511500}, +{"AreaID":511523, "name":"江安县", "CityID":511500, "AreaSort":511500}, +{"AreaID":511502, "name":"翠屏区", "CityID":511500, "AreaSort":511500}, +{"AreaID":511521, "name":"宜宾县", "CityID":511500, "AreaSort":511500}, +{"AreaID":513201, "name":"马尔康市", "CityID":513200, "AreaSort":513200}, +{"AreaID":513221, "name":"汶川县", "CityID":513200, "AreaSort":513200}, +{"AreaID":513222, "name":"理县", "CityID":513200, "AreaSort":513200}, +{"AreaID":513223, "name":"茂县", "CityID":513200, "AreaSort":513200}, +{"AreaID":513224, "name":"松潘县", "CityID":513200, "AreaSort":513200}, +{"AreaID":513227, "name":"小金县", "CityID":513200, "AreaSort":513200}, +{"AreaID":513225, "name":"九寨沟县", "CityID":513200, "AreaSort":513200}, +{"AreaID":513228, "name":"黑水县", "CityID":513200, "AreaSort":513200}, +{"AreaID":513226, "name":"金川县", "CityID":513200, "AreaSort":513200}, +{"AreaID":513233, "name":"红原县", "CityID":513200, "AreaSort":513200}, +{"AreaID":513232, "name":"若尔盖县", "CityID":513200, "AreaSort":513200}, +{"AreaID":513231, "name":"阿坝县", "CityID":513200, "AreaSort":513200}, +{"AreaID":513230, "name":"壤塘县", "CityID":513200, "AreaSort":513200}, +{"AreaID":510923, "name":"大英县", "CityID":510900, "AreaSort":510900}, +{"AreaID":510922, "name":"射洪县", "CityID":510900, "AreaSort":510900}, +{"AreaID":510903, "name":"船山区", "CityID":510900, "AreaSort":510900}, +{"AreaID":510921, "name":"蓬溪县", "CityID":510900, "AreaSort":510900}, +{"AreaID":510904, "name":"安居区", "CityID":510900, "AreaSort":510900}, +{"AreaID":511681, "name":"华蓥市", "CityID":511600, "AreaSort":511600}, +{"AreaID":511602, "name":"广安区", "CityID":511600, "AreaSort":511600}, +{"AreaID":511622, "name":"武胜县", "CityID":511600, "AreaSort":511600}, +{"AreaID":511621, "name":"岳池县", "CityID":511600, "AreaSort":511600}, +{"AreaID":511603, "name":"前锋区", "CityID":511600, "AreaSort":511600}, +{"AreaID":511623, "name":"邻水县", "CityID":511600, "AreaSort":511600}, +{"AreaID":510302, "name":"自流井区", "CityID":510300, "AreaSort":510300}, +{"AreaID":510303, "name":"贡井区", "CityID":510300, "AreaSort":510300}, +{"AreaID":510304, "name":"大安区", "CityID":510300, "AreaSort":510300}, +{"AreaID":510322, "name":"富顺县", "CityID":510300, "AreaSort":510300}, +{"AreaID":510311, "name":"沿滩区", "CityID":510300, "AreaSort":510300}, +{"AreaID":510321, "name":"荣县", "CityID":510300, "AreaSort":510300}, +{"AreaID":511024, "name":"威远县", "CityID":511000, "AreaSort":511000}, +{"AreaID":511025, "name":"资中县", "CityID":511000, "AreaSort":511000}, +{"AreaID":511011, "name":"东兴区", "CityID":511000, "AreaSort":511000}, +{"AreaID":511028, "name":"隆昌县", "CityID":511000, "AreaSort":511000}, +{"AreaID":511002, "name":"市中区", "CityID":511000, "AreaSort":511000}, +{"AreaID":510421, "name":"米易县", "CityID":510400, "AreaSort":510400}, +{"AreaID":510403, "name":"西区", "CityID":510400, "AreaSort":510400}, +{"AreaID":510402, "name":"东区", "CityID":510400, "AreaSort":510400}, +{"AreaID":510422, "name":"盐边县", "CityID":510400, "AreaSort":510400}, +{"AreaID":510411, "name":"仁和区", "CityID":510400, "AreaSort":510400}, +{"AreaID":513435, "name":"甘洛县", "CityID":513400, "AreaSort":513400}, +{"AreaID":513434, "name":"越西县", "CityID":513400, "AreaSort":513400}, +{"AreaID":513433, "name":"冕宁县", "CityID":513400, "AreaSort":513400}, +{"AreaID":513432, "name":"喜德县", "CityID":513400, "AreaSort":513400}, +{"AreaID":513431, "name":"昭觉县", "CityID":513400, "AreaSort":513400}, +{"AreaID":513430, "name":"金阳县", "CityID":513400, "AreaSort":513400}, +{"AreaID":513401, "name":"西昌市", "CityID":513400, "AreaSort":513400}, +{"AreaID":513429, "name":"布拖县", "CityID":513400, "AreaSort":513400}, +{"AreaID":513436, "name":"美姑县", "CityID":513400, "AreaSort":513400}, +{"AreaID":513423, "name":"盐源县", "CityID":513400, "AreaSort":513400}, +{"AreaID":513427, "name":"宁南县", "CityID":513400, "AreaSort":513400}, +{"AreaID":513437, "name":"雷波县", "CityID":513400, "AreaSort":513400}, +{"AreaID":513424, "name":"德昌县", "CityID":513400, "AreaSort":513400}, +{"AreaID":513428, "name":"普格县", "CityID":513400, "AreaSort":513400}, +{"AreaID":513425, "name":"会理县", "CityID":513400, "AreaSort":513400}, +{"AreaID":513422, "name":"木里藏族自治县", "CityID":513400, "AreaSort":513400}, +{"AreaID":513426, "name":"会东县", "CityID":513400, "AreaSort":513400}, +{"AreaID":510522, "name":"合江县", "CityID":510500, "AreaSort":510500}, +{"AreaID":510521, "name":"泸县", "CityID":510500, "AreaSort":510500}, +{"AreaID":510524, "name":"叙永县", "CityID":510500, "AreaSort":510500}, +{"AreaID":510525, "name":"古蔺县", "CityID":510500, "AreaSort":510500}, +{"AreaID":510503, "name":"纳溪区", "CityID":510500, "AreaSort":510500}, +{"AreaID":510504, "name":"龙马潭区", "CityID":510500, "AreaSort":510500}, +{"AreaID":510502, "name":"江阳区", "CityID":510500, "AreaSort":510500}, +{"AreaID":522725, "name":"瓮安县", "CityID":522700, "AreaSort":522700}, +{"AreaID":522726, "name":"独山县", "CityID":522700, "AreaSort":522700}, +{"AreaID":522727, "name":"平塘县", "CityID":522700, "AreaSort":522700}, +{"AreaID":522701, "name":"都匀市", "CityID":522700, "AreaSort":522700}, +{"AreaID":522702, "name":"福泉市", "CityID":522700, "AreaSort":522700}, +{"AreaID":522722, "name":"荔波县", "CityID":522700, "AreaSort":522700}, +{"AreaID":522723, "name":"贵定县", "CityID":522700, "AreaSort":522700}, +{"AreaID":522732, "name":"三都水族自治县", "CityID":522700, "AreaSort":522700}, +{"AreaID":522730, "name":"龙里县", "CityID":522700, "AreaSort":522700}, +{"AreaID":522731, "name":"惠水县", "CityID":522700, "AreaSort":522700}, +{"AreaID":522728, "name":"罗甸县", "CityID":522700, "AreaSort":522700}, +{"AreaID":522729, "name":"长顺县", "CityID":522700, "AreaSort":522700}, +{"AreaID":520502, "name":"七星关区", "CityID":520500, "AreaSort":520500}, +{"AreaID":520527, "name":"赫章县", "CityID":520500, "AreaSort":520500}, +{"AreaID":520526, "name":"威宁彝族回族苗族自治县", "CityID":520500, "AreaSort":520500}, +{"AreaID":520525, "name":"纳雍县", "CityID":520500, "AreaSort":520500}, +{"AreaID":520524, "name":"织金县", "CityID":520500, "AreaSort":520500}, +{"AreaID":520523, "name":"金沙县", "CityID":520500, "AreaSort":520500}, +{"AreaID":520522, "name":"黔西县", "CityID":520500, "AreaSort":520500}, +{"AreaID":520521, "name":"大方县", "CityID":520500, "AreaSort":520500}, +{"AreaID":520222, "name":"盘县", "CityID":520200, "AreaSort":520200}, +{"AreaID":520221, "name":"水城县", "CityID":520200, "AreaSort":520200}, +{"AreaID":520203, "name":"六枝特区", "CityID":520200, "AreaSort":520200}, +{"AreaID":520201, "name":"钟山区", "CityID":520200, "AreaSort":520200}, +{"AreaID":522301, "name":"兴义市", "CityID":522300, "AreaSort":522300}, +{"AreaID":522323, "name":"普安县", "CityID":522300, "AreaSort":522300}, +{"AreaID":522322, "name":"兴仁县", "CityID":522300, "AreaSort":522300}, +{"AreaID":522326, "name":"望谟县", "CityID":522300, "AreaSort":522300}, +{"AreaID":522327, "name":"册亨县", "CityID":522300, "AreaSort":522300}, +{"AreaID":522324, "name":"晴隆县", "CityID":522300, "AreaSort":522300}, +{"AreaID":522325, "name":"贞丰县", "CityID":522300, "AreaSort":522300}, +{"AreaID":522328, "name":"安龙县", "CityID":522300, "AreaSort":522300}, +{"AreaID":520424, "name":"关岭布依族苗族自治县", "CityID":520400, "AreaSort":520400}, +{"AreaID":520423, "name":"镇宁布依族苗族自治县", "CityID":520400, "AreaSort":520400}, +{"AreaID":520422, "name":"普定县", "CityID":520400, "AreaSort":520400}, +{"AreaID":520403, "name":"平坝区", "CityID":520400, "AreaSort":520400}, +{"AreaID":520402, "name":"西秀区", "CityID":520400, "AreaSort":520400}, +{"AreaID":520425, "name":"紫云苗族布依族自治县", "CityID":520400, "AreaSort":520400}, +{"AreaID":520328, "name":"湄潭县", "CityID":520300, "AreaSort":520300}, +{"AreaID":520329, "name":"余庆县", "CityID":520300, "AreaSort":520300}, +{"AreaID":520326, "name":"务川仡佬族苗族自治县", "CityID":520300, "AreaSort":520300}, +{"AreaID":520327, "name":"凤冈县", "CityID":520300, "AreaSort":520300}, +{"AreaID":520324, "name":"正安县", "CityID":520300, "AreaSort":520300}, +{"AreaID":520325, "name":"道真仡佬族苗族自治县", "CityID":520300, "AreaSort":520300}, +{"AreaID":520322, "name":"桐梓县", "CityID":520300, "AreaSort":520300}, +{"AreaID":520323, "name":"绥阳县", "CityID":520300, "AreaSort":520300}, +{"AreaID":520303, "name":"汇川区", "CityID":520300, "AreaSort":520300}, +{"AreaID":520302, "name":"红花岗区", "CityID":520300, "AreaSort":520300}, +{"AreaID":520330, "name":"习水县", "CityID":520300, "AreaSort":520300}, +{"AreaID":520321, "name":"遵义县", "CityID":520300, "AreaSort":520300}, +{"AreaID":520382, "name":"仁怀市", "CityID":520300, "AreaSort":520300}, +{"AreaID":520381, "name":"赤水市", "CityID":520300, "AreaSort":520300}, +{"AreaID":522622, "name":"黄平县", "CityID":522600, "AreaSort":522600}, +{"AreaID":522624, "name":"三穗县", "CityID":522600, "AreaSort":522600}, +{"AreaID":522636, "name":"丹寨县", "CityID":522600, "AreaSort":522600}, +{"AreaID":522623, "name":"施秉县", "CityID":522600, "AreaSort":522600}, +{"AreaID":522635, "name":"麻江县", "CityID":522600, "AreaSort":522600}, +{"AreaID":522626, "name":"岑巩县", "CityID":522600, "AreaSort":522600}, +{"AreaID":522634, "name":"雷山县", "CityID":522600, "AreaSort":522600}, +{"AreaID":522625, "name":"镇远县", "CityID":522600, "AreaSort":522600}, +{"AreaID":522633, "name":"从江县", "CityID":522600, "AreaSort":522600}, +{"AreaID":522628, "name":"锦屏县", "CityID":522600, "AreaSort":522600}, +{"AreaID":522627, "name":"天柱县", "CityID":522600, "AreaSort":522600}, +{"AreaID":522632, "name":"榕江县", "CityID":522600, "AreaSort":522600}, +{"AreaID":522629, "name":"剑河县", "CityID":522600, "AreaSort":522600}, +{"AreaID":522601, "name":"凯里市", "CityID":522600, "AreaSort":522600}, +{"AreaID":522630, "name":"台江县", "CityID":522600, "AreaSort":522600}, +{"AreaID":522631, "name":"黎平县", "CityID":522600, "AreaSort":522600}, +{"AreaID":520628, "name":"松桃苗族自治县", "CityID":520600, "AreaSort":520600}, +{"AreaID":520627, "name":"沿河土家族自治县", "CityID":520600, "AreaSort":520600}, +{"AreaID":520602, "name":"碧江区", "CityID":520600, "AreaSort":520600}, +{"AreaID":520622, "name":"玉屏侗族自治县", "CityID":520600, "AreaSort":520600}, +{"AreaID":520621, "name":"江口县", "CityID":520600, "AreaSort":520600}, +{"AreaID":520603, "name":"万山区", "CityID":520600, "AreaSort":520600}, +{"AreaID":520624, "name":"思南县", "CityID":520600, "AreaSort":520600}, +{"AreaID":520623, "name":"石阡县", "CityID":520600, "AreaSort":520600}, +{"AreaID":520626, "name":"德江县", "CityID":520600, "AreaSort":520600}, +{"AreaID":520625, "name":"印江土家族苗族自治县", "CityID":520600, "AreaSort":520600}, +{"AreaID":520115, "name":"观山湖区", "CityID":520100, "AreaSort":520100}, +{"AreaID":520103, "name":"云岩区", "CityID":520100, "AreaSort":520100}, +{"AreaID":520113, "name":"白云区", "CityID":520100, "AreaSort":520100}, +{"AreaID":520102, "name":"南明区", "CityID":520100, "AreaSort":520100}, +{"AreaID":520181, "name":"清镇市", "CityID":520100, "AreaSort":520100}, +{"AreaID":520122, "name":"息烽县", "CityID":520100, "AreaSort":520100}, +{"AreaID":520111, "name":"花溪区", "CityID":520100, "AreaSort":520100}, +{"AreaID":520123, "name":"修文县", "CityID":520100, "AreaSort":520100}, +{"AreaID":520112, "name":"乌当区", "CityID":520100, "AreaSort":520100}, +{"AreaID":520121, "name":"开阳县", "CityID":520100, "AreaSort":520100}, +{"AreaID":530821, "name":"宁洱哈尼族彝族自治县", "CityID":530800, "AreaSort":530800}, +{"AreaID":530823, "name":"景东彝族自治县", "CityID":530800, "AreaSort":530800}, +{"AreaID":530822, "name":"墨江哈尼族自治县", "CityID":530800, "AreaSort":530800}, +{"AreaID":530825, "name":"镇沅彝族哈尼族拉祜族自治县", "CityID":530800, "AreaSort":530800}, +{"AreaID":530824, "name":"景谷傣族彝族自治县", "CityID":530800, "AreaSort":530800}, +{"AreaID":530827, "name":"孟连傣族拉祜族佤族自治县", "CityID":530800, "AreaSort":530800}, +{"AreaID":530826, "name":"江城哈尼族彝族自治县", "CityID":530800, "AreaSort":530800}, +{"AreaID":530829, "name":"西盟佤族自治县", "CityID":530800, "AreaSort":530800}, +{"AreaID":530828, "name":"澜沧拉祜族自治县", "CityID":530800, "AreaSort":530800}, +{"AreaID":530802, "name":"思茅区", "CityID":530800, "AreaSort":530800}, +{"AreaID":532501, "name":"个旧市", "CityID":532500, "AreaSort":532500}, +{"AreaID":532527, "name":"泸西县", "CityID":532500, "AreaSort":532500}, +{"AreaID":532502, "name":"开远市", "CityID":532500, "AreaSort":532500}, +{"AreaID":532528, "name":"元阳县", "CityID":532500, "AreaSort":532500}, +{"AreaID":532525, "name":"石屏县", "CityID":532500, "AreaSort":532500}, +{"AreaID":532523, "name":"屏边苗族自治县", "CityID":532500, "AreaSort":532500}, +{"AreaID":532524, "name":"建水县", "CityID":532500, "AreaSort":532500}, +{"AreaID":532503, "name":"蒙自市", "CityID":532500, "AreaSort":532500}, +{"AreaID":532504, "name":"弥勒市", "CityID":532500, "AreaSort":532500}, +{"AreaID":532532, "name":"河口瑶族自治县", "CityID":532500, "AreaSort":532500}, +{"AreaID":532529, "name":"红河县", "CityID":532500, "AreaSort":532500}, +{"AreaID":532531, "name":"绿春县", "CityID":532500, "AreaSort":532500}, +{"AreaID":532530, "name":"金平苗族瑶族傣族自治县", "CityID":532500, "AreaSort":532500}, +{"AreaID":532628, "name":"富宁县", "CityID":532600, "AreaSort":532600}, +{"AreaID":532601, "name":"文山市", "CityID":532600, "AreaSort":532600}, +{"AreaID":532623, "name":"西畴县", "CityID":532600, "AreaSort":532600}, +{"AreaID":532622, "name":"砚山县", "CityID":532600, "AreaSort":532600}, +{"AreaID":532627, "name":"广南县", "CityID":532600, "AreaSort":532600}, +{"AreaID":532626, "name":"丘北县", "CityID":532600, "AreaSort":532600}, +{"AreaID":532625, "name":"马关县", "CityID":532600, "AreaSort":532600}, +{"AreaID":532624, "name":"麻栗坡县", "CityID":532600, "AreaSort":532600}, +{"AreaID":530927, "name":"沧源佤族自治县", "CityID":530900, "AreaSort":530900}, +{"AreaID":530924, "name":"镇康县", "CityID":530900, "AreaSort":530900}, +{"AreaID":530923, "name":"永德县", "CityID":530900, "AreaSort":530900}, +{"AreaID":530926, "name":"耿马傣族佤族自治县", "CityID":530900, "AreaSort":530900}, +{"AreaID":530925, "name":"双江拉祜族佤族布朗族傣族自治县", "CityID":530900, "AreaSort":530900}, +{"AreaID":530902, "name":"临翔区", "CityID":530900, "AreaSort":530900}, +{"AreaID":530922, "name":"云县", "CityID":530900, "AreaSort":530900}, +{"AreaID":530921, "name":"凤庆县", "CityID":530900, "AreaSort":530900}, +{"AreaID":532331, "name":"禄丰县", "CityID":532300, "AreaSort":532300}, +{"AreaID":532322, "name":"双柏县", "CityID":532300, "AreaSort":532300}, +{"AreaID":532329, "name":"武定县", "CityID":532300, "AreaSort":532300}, +{"AreaID":532328, "name":"元谋县", "CityID":532300, "AreaSort":532300}, +{"AreaID":532327, "name":"永仁县", "CityID":532300, "AreaSort":532300}, +{"AreaID":532301, "name":"楚雄市", "CityID":532300, "AreaSort":532300}, +{"AreaID":532326, "name":"大姚县", "CityID":532300, "AreaSort":532300}, +{"AreaID":532325, "name":"姚安县", "CityID":532300, "AreaSort":532300}, +{"AreaID":532324, "name":"南华县", "CityID":532300, "AreaSort":532300}, +{"AreaID":532323, "name":"牟定县", "CityID":532300, "AreaSort":532300}, +{"AreaID":530323, "name":"师宗县", "CityID":530300, "AreaSort":530300}, +{"AreaID":530324, "name":"罗平县", "CityID":530300, "AreaSort":530300}, +{"AreaID":530321, "name":"马龙县", "CityID":530300, "AreaSort":530300}, +{"AreaID":530322, "name":"陆良县", "CityID":530300, "AreaSort":530300}, +{"AreaID":530328, "name":"沾益县", "CityID":530300, "AreaSort":530300}, +{"AreaID":530381, "name":"宣威市", "CityID":530300, "AreaSort":530300}, +{"AreaID":530325, "name":"富源县", "CityID":530300, "AreaSort":530300}, +{"AreaID":530326, "name":"会泽县", "CityID":530300, "AreaSort":530300}, +{"AreaID":530302, "name":"麒麟区", "CityID":530300, "AreaSort":530300}, +{"AreaID":530630, "name":"水富县", "CityID":530600, "AreaSort":530600}, +{"AreaID":530629, "name":"威信县", "CityID":530600, "AreaSort":530600}, +{"AreaID":530628, "name":"彝良县", "CityID":530600, "AreaSort":530600}, +{"AreaID":530627, "name":"镇雄县", "CityID":530600, "AreaSort":530600}, +{"AreaID":530626, "name":"绥江县", "CityID":530600, "AreaSort":530600}, +{"AreaID":530625, "name":"永善县", "CityID":530600, "AreaSort":530600}, +{"AreaID":530624, "name":"大关县", "CityID":530600, "AreaSort":530600}, +{"AreaID":530623, "name":"盐津县", "CityID":530600, "AreaSort":530600}, +{"AreaID":530622, "name":"巧家县", "CityID":530600, "AreaSort":530600}, +{"AreaID":530621, "name":"鲁甸县", "CityID":530600, "AreaSort":530600}, +{"AreaID":530602, "name":"昭阳区", "CityID":530600, "AreaSort":530600}, +{"AreaID":530426, "name":"峨山彝族自治县", "CityID":530400, "AreaSort":530400}, +{"AreaID":530427, "name":"新平彝族傣族自治县", "CityID":530400, "AreaSort":530400}, +{"AreaID":530424, "name":"华宁县", "CityID":530400, "AreaSort":530400}, +{"AreaID":530425, "name":"易门县", "CityID":530400, "AreaSort":530400}, +{"AreaID":530422, "name":"澄江县", "CityID":530400, "AreaSort":530400}, +{"AreaID":530423, "name":"通海县", "CityID":530400, "AreaSort":530400}, +{"AreaID":530402, "name":"红塔区", "CityID":530400, "AreaSort":530400}, +{"AreaID":530403, "name":"江川区", "CityID":530400, "AreaSort":530400}, +{"AreaID":530428, "name":"元江哈尼族彝族傣族自治县", "CityID":530400, "AreaSort":530400}, +{"AreaID":533423, "name":"维西傈僳族自治县", "CityID":533400, "AreaSort":533400}, +{"AreaID":533422, "name":"德钦县", "CityID":533400, "AreaSort":533400}, +{"AreaID":533401, "name":"香格里拉市", "CityID":533400, "AreaSort":533400}, +{"AreaID":532922, "name":"漾濞彝族自治县", "CityID":532900, "AreaSort":532900}, +{"AreaID":532924, "name":"宾川县", "CityID":532900, "AreaSort":532900}, +{"AreaID":532923, "name":"祥云县", "CityID":532900, "AreaSort":532900}, +{"AreaID":532901, "name":"大理市", "CityID":532900, "AreaSort":532900}, +{"AreaID":532930, "name":"洱源县", "CityID":532900, "AreaSort":532900}, +{"AreaID":532931, "name":"剑川县", "CityID":532900, "AreaSort":532900}, +{"AreaID":532929, "name":"云龙县", "CityID":532900, "AreaSort":532900}, +{"AreaID":532926, "name":"南涧彝族自治县", "CityID":532900, "AreaSort":532900}, +{"AreaID":532925, "name":"弥渡县", "CityID":532900, "AreaSort":532900}, +{"AreaID":532932, "name":"鹤庆县", "CityID":532900, "AreaSort":532900}, +{"AreaID":532928, "name":"永平县", "CityID":532900, "AreaSort":532900}, +{"AreaID":532927, "name":"巍山彝族回族自治县", "CityID":532900, "AreaSort":532900}, +{"AreaID":530502, "name":"隆阳区", "CityID":530500, "AreaSort":530500}, +{"AreaID":530521, "name":"施甸县", "CityID":530500, "AreaSort":530500}, +{"AreaID":530581, "name":"腾冲市", "CityID":530500, "AreaSort":530500}, +{"AreaID":530523, "name":"龙陵县", "CityID":530500, "AreaSort":530500}, +{"AreaID":530524, "name":"昌宁县", "CityID":530500, "AreaSort":530500}, +{"AreaID":532822, "name":"勐海县", "CityID":532800, "AreaSort":532800}, +{"AreaID":532823, "name":"勐腊县", "CityID":532800, "AreaSort":532800}, +{"AreaID":532801, "name":"景洪市", "CityID":532800, "AreaSort":532800}, +{"AreaID":533124, "name":"陇川县", "CityID":533100, "AreaSort":533100}, +{"AreaID":533123, "name":"盈江县", "CityID":533100, "AreaSort":533100}, +{"AreaID":533122, "name":"梁河县", "CityID":533100, "AreaSort":533100}, +{"AreaID":533102, "name":"瑞丽市", "CityID":533100, "AreaSort":533100}, +{"AreaID":533103, "name":"芒市", "CityID":533100, "AreaSort":533100}, +{"AreaID":530181, "name":"安宁市", "CityID":530100, "AreaSort":530100}, +{"AreaID":530103, "name":"盘龙区", "CityID":530100, "AreaSort":530100}, +{"AreaID":530122, "name":"晋宁县", "CityID":530100, "AreaSort":530100}, +{"AreaID":530102, "name":"五华区", "CityID":530100, "AreaSort":530100}, +{"AreaID":530126, "name":"石林彝族自治县", "CityID":530100, "AreaSort":530100}, +{"AreaID":530113, "name":"东川区", "CityID":530100, "AreaSort":530100}, +{"AreaID":530111, "name":"官渡区", "CityID":530100, "AreaSort":530100}, +{"AreaID":530125, "name":"宜良县", "CityID":530100, "AreaSort":530100}, +{"AreaID":530112, "name":"西山区", "CityID":530100, "AreaSort":530100}, +{"AreaID":530124, "name":"富民县", "CityID":530100, "AreaSort":530100}, +{"AreaID":530114, "name":"呈贡区", "CityID":530100, "AreaSort":530100}, +{"AreaID":530129, "name":"寻甸回族彝族自治县", "CityID":530100, "AreaSort":530100}, +{"AreaID":530128, "name":"禄劝彝族苗族自治县", "CityID":530100, "AreaSort":530100}, +{"AreaID":530127, "name":"嵩明县", "CityID":530100, "AreaSort":530100}, +{"AreaID":530724, "name":"宁蒗彝族自治县", "CityID":530700, "AreaSort":530700}, +{"AreaID":530723, "name":"华坪县", "CityID":530700, "AreaSort":530700}, +{"AreaID":530722, "name":"永胜县", "CityID":530700, "AreaSort":530700}, +{"AreaID":530721, "name":"玉龙纳西族自治县", "CityID":530700, "AreaSort":530700}, +{"AreaID":530702, "name":"古城区", "CityID":530700, "AreaSort":530700}, +{"AreaID":533325, "name":"兰坪白族普米族自治县", "CityID":533300, "AreaSort":533300}, +{"AreaID":533324, "name":"贡山独龙族怒族自治县", "CityID":533300, "AreaSort":533300}, +{"AreaID":533323, "name":"福贡县", "CityID":533300, "AreaSort":533300}, +{"AreaID":533321, "name":"泸水县", "CityID":533300, "AreaSort":533300}, +{"AreaID":542430, "name":"尼玛县", "CityID":542400, "AreaSort":542400}, +{"AreaID":542431, "name":"双湖县", "CityID":542400, "AreaSort":542400}, +{"AreaID":542429, "name":"巴青县", "CityID":542400, "AreaSort":542400}, +{"AreaID":542428, "name":"班戈县", "CityID":542400, "AreaSort":542400}, +{"AreaID":542427, "name":"索县", "CityID":542400, "AreaSort":542400}, +{"AreaID":542426, "name":"申扎县", "CityID":542400, "AreaSort":542400}, +{"AreaID":542425, "name":"安多县", "CityID":542400, "AreaSort":542400}, +{"AreaID":542424, "name":"聂荣县", "CityID":542400, "AreaSort":542400}, +{"AreaID":542423, "name":"比如县", "CityID":542400, "AreaSort":542400}, +{"AreaID":542422, "name":"嘉黎县", "CityID":542400, "AreaSort":542400}, +{"AreaID":542421, "name":"那曲县", "CityID":542400, "AreaSort":542400}, +{"AreaID":540330, "name":"边坝县", "CityID":540300, "AreaSort":540300}, +{"AreaID":540328, "name":"芒康县", "CityID":540300, "AreaSort":540300}, +{"AreaID":540329, "name":"洛隆县", "CityID":540300, "AreaSort":540300}, +{"AreaID":540302, "name":"卡若区", "CityID":540300, "AreaSort":540300}, +{"AreaID":540324, "name":"丁青县", "CityID":540300, "AreaSort":540300}, +{"AreaID":540325, "name":"察雅县", "CityID":540300, "AreaSort":540300}, +{"AreaID":540326, "name":"八宿县", "CityID":540300, "AreaSort":540300}, +{"AreaID":540327, "name":"左贡县", "CityID":540300, "AreaSort":540300}, +{"AreaID":540321, "name":"江达县", "CityID":540300, "AreaSort":540300}, +{"AreaID":540322, "name":"贡觉县", "CityID":540300, "AreaSort":540300}, +{"AreaID":540323, "name":"类乌齐县", "CityID":540300, "AreaSort":540300}, +{"AreaID":542228, "name":"洛扎县", "CityID":542200, "AreaSort":542200}, +{"AreaID":542227, "name":"措美县", "CityID":542200, "AreaSort":542200}, +{"AreaID":542229, "name":"加查县", "CityID":542200, "AreaSort":542200}, +{"AreaID":542224, "name":"桑日县", "CityID":542200, "AreaSort":542200}, +{"AreaID":542223, "name":"贡嘎县", "CityID":542200, "AreaSort":542200}, +{"AreaID":542226, "name":"曲松县", "CityID":542200, "AreaSort":542200}, +{"AreaID":542225, "name":"琼结县", "CityID":542200, "AreaSort":542200}, +{"AreaID":542221, "name":"乃东县", "CityID":542200, "AreaSort":542200}, +{"AreaID":542231, "name":"隆子县", "CityID":542200, "AreaSort":542200}, +{"AreaID":542222, "name":"扎囊县", "CityID":542200, "AreaSort":542200}, +{"AreaID":542232, "name":"错那县", "CityID":542200, "AreaSort":542200}, +{"AreaID":542233, "name":"浪卡子县", "CityID":542200, "AreaSort":542200}, +{"AreaID":540221, "name":"南木林县", "CityID":540200, "AreaSort":540200}, +{"AreaID":540222, "name":"江孜县", "CityID":540200, "AreaSort":540200}, +{"AreaID":540223, "name":"定日县", "CityID":540200, "AreaSort":540200}, +{"AreaID":540224, "name":"萨迦县", "CityID":540200, "AreaSort":540200}, +{"AreaID":540225, "name":"拉孜县", "CityID":540200, "AreaSort":540200}, +{"AreaID":540226, "name":"昂仁县", "CityID":540200, "AreaSort":540200}, +{"AreaID":540227, "name":"谢通门县", "CityID":540200, "AreaSort":540200}, +{"AreaID":540202, "name":"桑珠孜区", "CityID":540200, "AreaSort":540200}, +{"AreaID":540228, "name":"白朗县", "CityID":540200, "AreaSort":540200}, +{"AreaID":540229, "name":"仁布县", "CityID":540200, "AreaSort":540200}, +{"AreaID":540237, "name":"岗巴县", "CityID":540200, "AreaSort":540200}, +{"AreaID":540236, "name":"萨嘎县", "CityID":540200, "AreaSort":540200}, +{"AreaID":540233, "name":"亚东县", "CityID":540200, "AreaSort":540200}, +{"AreaID":540232, "name":"仲巴县", "CityID":540200, "AreaSort":540200}, +{"AreaID":540235, "name":"聂拉木县", "CityID":540200, "AreaSort":540200}, +{"AreaID":540231, "name":"定结县", "CityID":540200, "AreaSort":540200}, +{"AreaID":540234, "name":"吉隆县", "CityID":540200, "AreaSort":540200}, +{"AreaID":540230, "name":"康马县", "CityID":540200, "AreaSort":540200}, +{"AreaID":540126, "name":"达孜县", "CityID":540100, "AreaSort":540100}, +{"AreaID":540127, "name":"墨竹工卡县", "CityID":540100, "AreaSort":540100}, +{"AreaID":540124, "name":"曲水县", "CityID":540100, "AreaSort":540100}, +{"AreaID":540122, "name":"当雄县", "CityID":540100, "AreaSort":540100}, +{"AreaID":540123, "name":"尼木县", "CityID":540100, "AreaSort":540100}, +{"AreaID":540121, "name":"林周县", "CityID":540100, "AreaSort":540100}, +{"AreaID":540103, "name":"堆龙德庆区", "CityID":540100, "AreaSort":540100}, +{"AreaID":540102, "name":"城关区", "CityID":540100, "AreaSort":540100}, +{"AreaID":542521, "name":"普兰县", "CityID":542500, "AreaSort":542500}, +{"AreaID":542522, "name":"札达县", "CityID":542500, "AreaSort":542500}, +{"AreaID":542523, "name":"噶尔县", "CityID":542500, "AreaSort":542500}, +{"AreaID":542524, "name":"日土县", "CityID":542500, "AreaSort":542500}, +{"AreaID":542525, "name":"革吉县", "CityID":542500, "AreaSort":542500}, +{"AreaID":542526, "name":"改则县", "CityID":542500, "AreaSort":542500}, +{"AreaID":542527, "name":"措勤县", "CityID":542500, "AreaSort":542500}, +{"AreaID":540402, "name":"巴宜区", "CityID":540400, "AreaSort":540400}, +{"AreaID":540422, "name":"米林县", "CityID":540400, "AreaSort":540400}, +{"AreaID":540421, "name":"工布江达县", "CityID":540400, "AreaSort":540400}, +{"AreaID":540424, "name":"波密县", "CityID":540400, "AreaSort":540400}, +{"AreaID":540423, "name":"墨脱县", "CityID":540400, "AreaSort":540400}, +{"AreaID":540426, "name":"朗县", "CityID":540400, "AreaSort":540400}, +{"AreaID":540425, "name":"察隅县", "CityID":540400, "AreaSort":540400}, +{"AreaID":610726, "name":"宁强县", "CityID":610700, "AreaSort":610700}, +{"AreaID":610727, "name":"略阳县", "CityID":610700, "AreaSort":610700}, +{"AreaID":610724, "name":"西乡县", "CityID":610700, "AreaSort":610700}, +{"AreaID":610725, "name":"勉县", "CityID":610700, "AreaSort":610700}, +{"AreaID":610722, "name":"城固县", "CityID":610700, "AreaSort":610700}, +{"AreaID":610723, "name":"洋县", "CityID":610700, "AreaSort":610700}, +{"AreaID":610702, "name":"汉台区", "CityID":610700, "AreaSort":610700}, +{"AreaID":610721, "name":"南郑县", "CityID":610700, "AreaSort":610700}, +{"AreaID":610730, "name":"佛坪县", "CityID":610700, "AreaSort":610700}, +{"AreaID":610728, "name":"镇巴县", "CityID":610700, "AreaSort":610700}, +{"AreaID":610729, "name":"留坝县", "CityID":610700, "AreaSort":610700}, +{"AreaID":610422, "name":"三原县", "CityID":610400, "AreaSort":610400}, +{"AreaID":610430, "name":"淳化县", "CityID":610400, "AreaSort":610400}, +{"AreaID":610431, "name":"武功县", "CityID":610400, "AreaSort":610400}, +{"AreaID":610428, "name":"长武县", "CityID":610400, "AreaSort":610400}, +{"AreaID":610427, "name":"彬县", "CityID":610400, "AreaSort":610400}, +{"AreaID":610429, "name":"旬邑县", "CityID":610400, "AreaSort":610400}, +{"AreaID":610424, "name":"乾县", "CityID":610400, "AreaSort":610400}, +{"AreaID":610481, "name":"兴平市", "CityID":610400, "AreaSort":610400}, +{"AreaID":610423, "name":"泾阳县", "CityID":610400, "AreaSort":610400}, +{"AreaID":610426, "name":"永寿县", "CityID":610400, "AreaSort":610400}, +{"AreaID":610425, "name":"礼泉县", "CityID":610400, "AreaSort":610400}, +{"AreaID":610402, "name":"秦都区", "CityID":610400, "AreaSort":610400}, +{"AreaID":610403, "name":"杨陵区", "CityID":610400, "AreaSort":610400}, +{"AreaID":610404, "name":"渭城区", "CityID":610400, "AreaSort":610400}, +{"AreaID":610829, "name":"吴堡县", "CityID":610800, "AreaSort":610800}, +{"AreaID":610803, "name":"横山区", "CityID":610800, "AreaSort":610800}, +{"AreaID":610827, "name":"米脂县", "CityID":610800, "AreaSort":610800}, +{"AreaID":610802, "name":"榆阳区", "CityID":610800, "AreaSort":610800}, +{"AreaID":610828, "name":"佳县", "CityID":610800, "AreaSort":610800}, +{"AreaID":610830, "name":"清涧县", "CityID":610800, "AreaSort":610800}, +{"AreaID":610821, "name":"神木县", "CityID":610800, "AreaSort":610800}, +{"AreaID":610831, "name":"子洲县", "CityID":610800, "AreaSort":610800}, +{"AreaID":610822, "name":"府谷县", "CityID":610800, "AreaSort":610800}, +{"AreaID":610825, "name":"定边县", "CityID":610800, "AreaSort":610800}, +{"AreaID":610826, "name":"绥德县", "CityID":610800, "AreaSort":610800}, +{"AreaID":610824, "name":"靖边县", "CityID":610800, "AreaSort":610800}, +{"AreaID":610523, "name":"大荔县", "CityID":610500, "AreaSort":610500}, +{"AreaID":610582, "name":"华阴市", "CityID":610500, "AreaSort":610500}, +{"AreaID":610522, "name":"潼关县", "CityID":610500, "AreaSort":610500}, +{"AreaID":610581, "name":"韩城市", "CityID":610500, "AreaSort":610500}, +{"AreaID":610525, "name":"澄城县", "CityID":610500, "AreaSort":610500}, +{"AreaID":610524, "name":"合阳县", "CityID":610500, "AreaSort":610500}, +{"AreaID":610527, "name":"白水县", "CityID":610500, "AreaSort":610500}, +{"AreaID":610526, "name":"蒲城县", "CityID":610500, "AreaSort":610500}, +{"AreaID":610503, "name":"华州区", "CityID":610500, "AreaSort":610500}, +{"AreaID":610528, "name":"富平县", "CityID":610500, "AreaSort":610500}, +{"AreaID":610502, "name":"临渭区", "CityID":610500, "AreaSort":610500}, +{"AreaID":610114, "name":"阎良区", "CityID":610100, "AreaSort":610100}, +{"AreaID":610113, "name":"雁塔区", "CityID":610100, "AreaSort":610100}, +{"AreaID":610122, "name":"蓝田县", "CityID":610100, "AreaSort":610100}, +{"AreaID":610125, "name":"户县", "CityID":610100, "AreaSort":610100}, +{"AreaID":610112, "name":"未央区", "CityID":610100, "AreaSort":610100}, +{"AreaID":610111, "name":"灞桥区", "CityID":610100, "AreaSort":610100}, +{"AreaID":610124, "name":"周至县", "CityID":610100, "AreaSort":610100}, +{"AreaID":610102, "name":"新城区", "CityID":610100, "AreaSort":610100}, +{"AreaID":610115, "name":"临潼区", "CityID":610100, "AreaSort":610100}, +{"AreaID":610103, "name":"碑林区", "CityID":610100, "AreaSort":610100}, +{"AreaID":610116, "name":"长安区", "CityID":610100, "AreaSort":610100}, +{"AreaID":610104, "name":"莲湖区", "CityID":610100, "AreaSort":610100}, +{"AreaID":610117, "name":"高陵区", "CityID":610100, "AreaSort":610100}, +{"AreaID":611024, "name":"山阳县", "CityID":611000, "AreaSort":611000}, +{"AreaID":611025, "name":"镇安县", "CityID":611000, "AreaSort":611000}, +{"AreaID":611026, "name":"柞水县", "CityID":611000, "AreaSort":611000}, +{"AreaID":611002, "name":"商州区", "CityID":611000, "AreaSort":611000}, +{"AreaID":611021, "name":"洛南县", "CityID":611000, "AreaSort":611000}, +{"AreaID":611022, "name":"丹凤县", "CityID":611000, "AreaSort":611000}, +{"AreaID":611023, "name":"商南县", "CityID":611000, "AreaSort":611000}, +{"AreaID":610204, "name":"耀州区", "CityID":610200, "AreaSort":610200}, +{"AreaID":610203, "name":"印台区", "CityID":610200, "AreaSort":610200}, +{"AreaID":610202, "name":"王益区", "CityID":610200, "AreaSort":610200}, +{"AreaID":610222, "name":"宜君县", "CityID":610200, "AreaSort":610200}, +{"AreaID":610322, "name":"凤翔县", "CityID":610300, "AreaSort":610300}, +{"AreaID":610323, "name":"岐山县", "CityID":610300, "AreaSort":610300}, +{"AreaID":610330, "name":"凤县", "CityID":610300, "AreaSort":610300}, +{"AreaID":610331, "name":"太白县", "CityID":610300, "AreaSort":610300}, +{"AreaID":610324, "name":"扶风县", "CityID":610300, "AreaSort":610300}, +{"AreaID":610327, "name":"陇县", "CityID":610300, "AreaSort":610300}, +{"AreaID":610326, "name":"眉县", "CityID":610300, "AreaSort":610300}, +{"AreaID":610329, "name":"麟游县", "CityID":610300, "AreaSort":610300}, +{"AreaID":610303, "name":"金台区", "CityID":610300, "AreaSort":610300}, +{"AreaID":610328, "name":"千阳县", "CityID":610300, "AreaSort":610300}, +{"AreaID":610302, "name":"渭滨区", "CityID":610300, "AreaSort":610300}, +{"AreaID":610304, "name":"陈仓区", "CityID":610300, "AreaSort":610300}, +{"AreaID":610929, "name":"白河县", "CityID":610900, "AreaSort":610900}, +{"AreaID":610928, "name":"旬阳县", "CityID":610900, "AreaSort":610900}, +{"AreaID":610927, "name":"镇坪县", "CityID":610900, "AreaSort":610900}, +{"AreaID":610926, "name":"平利县", "CityID":610900, "AreaSort":610900}, +{"AreaID":610925, "name":"岚皋县", "CityID":610900, "AreaSort":610900}, +{"AreaID":610924, "name":"紫阳县", "CityID":610900, "AreaSort":610900}, +{"AreaID":610923, "name":"宁陕县", "CityID":610900, "AreaSort":610900}, +{"AreaID":610922, "name":"石泉县", "CityID":610900, "AreaSort":610900}, +{"AreaID":610921, "name":"汉阴县", "CityID":610900, "AreaSort":610900}, +{"AreaID":610902, "name":"汉滨区", "CityID":610900, "AreaSort":610900}, +{"AreaID":610629, "name":"洛川县", "CityID":610600, "AreaSort":610600}, +{"AreaID":610626, "name":"吴起县", "CityID":610600, "AreaSort":610600}, +{"AreaID":610625, "name":"志丹县", "CityID":610600, "AreaSort":610600}, +{"AreaID":610628, "name":"富县", "CityID":610600, "AreaSort":610600}, +{"AreaID":610627, "name":"甘泉县", "CityID":610600, "AreaSort":610600}, +{"AreaID":610622, "name":"延川县", "CityID":610600, "AreaSort":610600}, +{"AreaID":610621, "name":"延长县", "CityID":610600, "AreaSort":610600}, +{"AreaID":610624, "name":"安塞县", "CityID":610600, "AreaSort":610600}, +{"AreaID":610632, "name":"黄陵县", "CityID":610600, "AreaSort":610600}, +{"AreaID":610623, "name":"子长县", "CityID":610600, "AreaSort":610600}, +{"AreaID":610630, "name":"宜川县", "CityID":610600, "AreaSort":610600}, +{"AreaID":610631, "name":"黄龙县", "CityID":610600, "AreaSort":610600}, +{"AreaID":610602, "name":"宝塔区", "CityID":610600, "AreaSort":610600}, +{"AreaID":620525, "name":"张家川回族自治县", "CityID":620500, "AreaSort":620500}, +{"AreaID":620502, "name":"秦州区", "CityID":620500, "AreaSort":620500}, +{"AreaID":620521, "name":"清水县", "CityID":620500, "AreaSort":620500}, +{"AreaID":620503, "name":"麦积区", "CityID":620500, "AreaSort":620500}, +{"AreaID":620522, "name":"秦安县", "CityID":620500, "AreaSort":620500}, +{"AreaID":620523, "name":"甘谷县", "CityID":620500, "AreaSort":620500}, +{"AreaID":620524, "name":"武山县", "CityID":620500, "AreaSort":620500}, +{"AreaID":621126, "name":"岷县", "CityID":621100, "AreaSort":621100}, +{"AreaID":621102, "name":"安定区", "CityID":621100, "AreaSort":621100}, +{"AreaID":621125, "name":"漳县", "CityID":621100, "AreaSort":621100}, +{"AreaID":621124, "name":"临洮县", "CityID":621100, "AreaSort":621100}, +{"AreaID":621123, "name":"渭源县", "CityID":621100, "AreaSort":621100}, +{"AreaID":621122, "name":"陇西县", "CityID":621100, "AreaSort":621100}, +{"AreaID":621121, "name":"通渭县", "CityID":621100, "AreaSort":621100}, +{"AreaID":620302, "name":"金川区", "CityID":620300, "AreaSort":620300}, +{"AreaID":620321, "name":"永昌县", "CityID":620300, "AreaSort":620300}, +{"AreaID":622921, "name":"临夏县", "CityID":622900, "AreaSort":622900}, +{"AreaID":622922, "name":"康乐县", "CityID":622900, "AreaSort":622900}, +{"AreaID":622925, "name":"和政县", "CityID":622900, "AreaSort":622900}, +{"AreaID":622926, "name":"东乡族自治县", "CityID":622900, "AreaSort":622900}, +{"AreaID":622923, "name":"永靖县", "CityID":622900, "AreaSort":622900}, +{"AreaID":622924, "name":"广河县", "CityID":622900, "AreaSort":622900}, +{"AreaID":622927, "name":"积石山保安族东乡族撒拉族自治县", "CityID":622900, "AreaSort":622900}, +{"AreaID":622901, "name":"临夏市", "CityID":622900, "AreaSort":622900}, +{"AreaID":620421, "name":"靖远县", "CityID":620400, "AreaSort":620400}, +{"AreaID":620423, "name":"景泰县", "CityID":620400, "AreaSort":620400}, +{"AreaID":620402, "name":"白银区", "CityID":620400, "AreaSort":620400}, +{"AreaID":620422, "name":"会宁县", "CityID":620400, "AreaSort":620400}, +{"AreaID":620403, "name":"平川区", "CityID":620400, "AreaSort":620400}, +{"AreaID":621022, "name":"环县", "CityID":621000, "AreaSort":621000}, +{"AreaID":621021, "name":"庆城县", "CityID":621000, "AreaSort":621000}, +{"AreaID":621002, "name":"西峰区", "CityID":621000, "AreaSort":621000}, +{"AreaID":621026, "name":"宁县", "CityID":621000, "AreaSort":621000}, +{"AreaID":621025, "name":"正宁县", "CityID":621000, "AreaSort":621000}, +{"AreaID":621024, "name":"合水县", "CityID":621000, "AreaSort":621000}, +{"AreaID":621023, "name":"华池县", "CityID":621000, "AreaSort":621000}, +{"AreaID":621027, "name":"镇原县", "CityID":621000, "AreaSort":621000}, +{"AreaID":620982, "name":"敦煌市", "CityID":620900, "AreaSort":620900}, +{"AreaID":620924, "name":"阿克塞哈萨克族自治县", "CityID":620900, "AreaSort":620900}, +{"AreaID":620981, "name":"玉门市", "CityID":620900, "AreaSort":620900}, +{"AreaID":620923, "name":"肃北蒙古族自治县", "CityID":620900, "AreaSort":620900}, +{"AreaID":620922, "name":"瓜州县", "CityID":620900, "AreaSort":620900}, +{"AreaID":620921, "name":"金塔县", "CityID":620900, "AreaSort":620900}, +{"AreaID":620902, "name":"肃州区", "CityID":620900, "AreaSort":620900}, +{"AreaID":620602, "name":"凉州区", "CityID":620600, "AreaSort":620600}, +{"AreaID":620621, "name":"民勤县", "CityID":620600, "AreaSort":620600}, +{"AreaID":620622, "name":"古浪县", "CityID":620600, "AreaSort":620600}, +{"AreaID":620623, "name":"天祝藏族自治县", "CityID":620600, "AreaSort":620600}, +{"AreaID":621227, "name":"徽县", "CityID":621200, "AreaSort":621200}, +{"AreaID":621228, "name":"两当县", "CityID":621200, "AreaSort":621200}, +{"AreaID":621225, "name":"西和县", "CityID":621200, "AreaSort":621200}, +{"AreaID":621226, "name":"礼县", "CityID":621200, "AreaSort":621200}, +{"AreaID":621202, "name":"武都区", "CityID":621200, "AreaSort":621200}, +{"AreaID":621222, "name":"文县", "CityID":621200, "AreaSort":621200}, +{"AreaID":621221, "name":"成县", "CityID":621200, "AreaSort":621200}, +{"AreaID":621224, "name":"康县", "CityID":621200, "AreaSort":621200}, +{"AreaID":621223, "name":"宕昌县", "CityID":621200, "AreaSort":621200}, +{"AreaID":620724, "name":"高台县", "CityID":620700, "AreaSort":620700}, +{"AreaID":620723, "name":"临泽县", "CityID":620700, "AreaSort":620700}, +{"AreaID":620725, "name":"山丹县", "CityID":620700, "AreaSort":620700}, +{"AreaID":620702, "name":"甘州区", "CityID":620700, "AreaSort":620700}, +{"AreaID":620722, "name":"民乐县", "CityID":620700, "AreaSort":620700}, +{"AreaID":620721, "name":"肃南裕固族自治县", "CityID":620700, "AreaSort":620700}, +{"AreaID":620821, "name":"泾川县", "CityID":620800, "AreaSort":620800}, +{"AreaID":620822, "name":"灵台县", "CityID":620800, "AreaSort":620800}, +{"AreaID":620823, "name":"崇信县", "CityID":620800, "AreaSort":620800}, +{"AreaID":620824, "name":"华亭县", "CityID":620800, "AreaSort":620800}, +{"AreaID":620825, "name":"庄浪县", "CityID":620800, "AreaSort":620800}, +{"AreaID":620826, "name":"静宁县", "CityID":620800, "AreaSort":620800}, +{"AreaID":620802, "name":"崆峒区", "CityID":620800, "AreaSort":620800}, +{"AreaID":620123, "name":"榆中县", "CityID":620100, "AreaSort":620100}, +{"AreaID":620111, "name":"红古区", "CityID":620100, "AreaSort":620100}, +{"AreaID":620121, "name":"永登县", "CityID":620100, "AreaSort":620100}, +{"AreaID":620122, "name":"皋兰县", "CityID":620100, "AreaSort":620100}, +{"AreaID":620104, "name":"西固区", "CityID":620100, "AreaSort":620100}, +{"AreaID":620102, "name":"城关区", "CityID":620100, "AreaSort":620100}, +{"AreaID":620103, "name":"七里河区", "CityID":620100, "AreaSort":620100}, +{"AreaID":620105, "name":"安宁区", "CityID":620100, "AreaSort":620100}, +{"AreaID":623026, "name":"碌曲县", "CityID":623000, "AreaSort":623000}, +{"AreaID":623025, "name":"玛曲县", "CityID":623000, "AreaSort":623000}, +{"AreaID":623027, "name":"夏河县", "CityID":623000, "AreaSort":623000}, +{"AreaID":623022, "name":"卓尼县", "CityID":623000, "AreaSort":623000}, +{"AreaID":623021, "name":"临潭县", "CityID":623000, "AreaSort":623000}, +{"AreaID":623024, "name":"迭部县", "CityID":623000, "AreaSort":623000}, +{"AreaID":623023, "name":"舟曲县", "CityID":623000, "AreaSort":623000}, +{"AreaID":623001, "name":"合作市", "CityID":623000, "AreaSort":623000}, +{"AreaID":632222, "name":"祁连县", "CityID":632200, "AreaSort":632200}, +{"AreaID":632221, "name":"门源回族自治县", "CityID":632200, "AreaSort":632200}, +{"AreaID":632224, "name":"刚察县", "CityID":632200, "AreaSort":632200}, +{"AreaID":632223, "name":"海晏县", "CityID":632200, "AreaSort":632200}, +{"AreaID":632522, "name":"同德县", "CityID":632500, "AreaSort":632500}, +{"AreaID":632523, "name":"贵德县", "CityID":632500, "AreaSort":632500}, +{"AreaID":632524, "name":"兴海县", "CityID":632500, "AreaSort":632500}, +{"AreaID":632525, "name":"贵南县", "CityID":632500, "AreaSort":632500}, +{"AreaID":632521, "name":"共和县", "CityID":632500, "AreaSort":632500}, +{"AreaID":630222, "name":"民和回族土族自治县", "CityID":630200, "AreaSort":630200}, +{"AreaID":630223, "name":"互助土族自治县", "CityID":630200, "AreaSort":630200}, +{"AreaID":630224, "name":"化隆回族自治县", "CityID":630200, "AreaSort":630200}, +{"AreaID":630203, "name":"平安区", "CityID":630200, "AreaSort":630200}, +{"AreaID":630225, "name":"循化撒拉族自治县", "CityID":630200, "AreaSort":630200}, +{"AreaID":630202, "name":"乐都区", "CityID":630200, "AreaSort":630200}, +{"AreaID":632822, "name":"都兰县", "CityID":632800, "AreaSort":632800}, +{"AreaID":632821, "name":"乌兰县", "CityID":632800, "AreaSort":632800}, +{"AreaID":632802, "name":"德令哈市", "CityID":632800, "AreaSort":632800}, +{"AreaID":632801, "name":"格尔木市", "CityID":632800, "AreaSort":632800}, +{"AreaID":632825, "name":"海西蒙古族藏族自治州直辖", "CityID":632800, "AreaSort":632800}, +{"AreaID":632823, "name":"天峻县", "CityID":632800, "AreaSort":632800}, +{"AreaID":632726, "name":"曲麻莱县", "CityID":632700, "AreaSort":632700}, +{"AreaID":632725, "name":"囊谦县", "CityID":632700, "AreaSort":632700}, +{"AreaID":632724, "name":"治多县", "CityID":632700, "AreaSort":632700}, +{"AreaID":632723, "name":"称多县", "CityID":632700, "AreaSort":632700}, +{"AreaID":632722, "name":"杂多县", "CityID":632700, "AreaSort":632700}, +{"AreaID":632701, "name":"玉树市", "CityID":632700, "AreaSort":632700}, +{"AreaID":632323, "name":"泽库县", "CityID":632300, "AreaSort":632300}, +{"AreaID":632324, "name":"河南蒙古族自治县", "CityID":632300, "AreaSort":632300}, +{"AreaID":632322, "name":"尖扎县", "CityID":632300, "AreaSort":632300}, +{"AreaID":632321, "name":"同仁县", "CityID":632300, "AreaSort":632300}, +{"AreaID":632624, "name":"达日县", "CityID":632600, "AreaSort":632600}, +{"AreaID":632623, "name":"甘德县", "CityID":632600, "AreaSort":632600}, +{"AreaID":632622, "name":"班玛县", "CityID":632600, "AreaSort":632600}, +{"AreaID":632621, "name":"玛沁县", "CityID":632600, "AreaSort":632600}, +{"AreaID":632626, "name":"玛多县", "CityID":632600, "AreaSort":632600}, +{"AreaID":632625, "name":"久治县", "CityID":632600, "AreaSort":632600}, +{"AreaID":630102, "name":"城东区", "CityID":630100, "AreaSort":630100}, +{"AreaID":630103, "name":"城中区", "CityID":630100, "AreaSort":630100}, +{"AreaID":630104, "name":"城西区", "CityID":630100, "AreaSort":630100}, +{"AreaID":630105, "name":"城北区", "CityID":630100, "AreaSort":630100}, +{"AreaID":630123, "name":"湟源县", "CityID":630100, "AreaSort":630100}, +{"AreaID":630122, "name":"湟中县", "CityID":630100, "AreaSort":630100}, +{"AreaID":630121, "name":"大通回族土族自治县", "CityID":630100, "AreaSort":630100}, +{"AreaID":640302, "name":"利通区", "CityID":640300, "AreaSort":640300}, +{"AreaID":640381, "name":"青铜峡市", "CityID":640300, "AreaSort":640300}, +{"AreaID":640303, "name":"红寺堡区", "CityID":640300, "AreaSort":640300}, +{"AreaID":640324, "name":"同心县", "CityID":640300, "AreaSort":640300}, +{"AreaID":640323, "name":"盐池县", "CityID":640300, "AreaSort":640300}, +{"AreaID":640402, "name":"原州区", "CityID":640400, "AreaSort":640400}, +{"AreaID":640422, "name":"西吉县", "CityID":640400, "AreaSort":640400}, +{"AreaID":640423, "name":"隆德县", "CityID":640400, "AreaSort":640400}, +{"AreaID":640424, "name":"泾源县", "CityID":640400, "AreaSort":640400}, +{"AreaID":640425, "name":"彭阳县", "CityID":640400, "AreaSort":640400}, +{"AreaID":640522, "name":"海原县", "CityID":640500, "AreaSort":640500}, +{"AreaID":640521, "name":"中宁县", "CityID":640500, "AreaSort":640500}, +{"AreaID":640502, "name":"沙坡头区", "CityID":640500, "AreaSort":640500}, +{"AreaID":640181, "name":"灵武市", "CityID":640100, "AreaSort":640100}, +{"AreaID":640122, "name":"贺兰县", "CityID":640100, "AreaSort":640100}, +{"AreaID":640121, "name":"永宁县", "CityID":640100, "AreaSort":640100}, +{"AreaID":640104, "name":"兴庆区", "CityID":640100, "AreaSort":640100}, +{"AreaID":640105, "name":"西夏区", "CityID":640100, "AreaSort":640100}, +{"AreaID":640106, "name":"金凤区", "CityID":640100, "AreaSort":640100}, +{"AreaID":640221, "name":"平罗县", "CityID":640200, "AreaSort":640200}, +{"AreaID":640205, "name":"惠农区", "CityID":640200, "AreaSort":640200}, +{"AreaID":640202, "name":"大武口区", "CityID":640200, "AreaSort":640200}, +{"AreaID":652301, "name":"昌吉市", "CityID":652300, "AreaSort":652300}, +{"AreaID":652302, "name":"阜康市", "CityID":652300, "AreaSort":652300}, +{"AreaID":652327, "name":"吉木萨尔县", "CityID":652300, "AreaSort":652300}, +{"AreaID":652328, "name":"木垒哈萨克自治县", "CityID":652300, "AreaSort":652300}, +{"AreaID":652323, "name":"呼图壁县", "CityID":652300, "AreaSort":652300}, +{"AreaID":652324, "name":"玛纳斯县", "CityID":652300, "AreaSort":652300}, +{"AreaID":652325, "name":"奇台县", "CityID":652300, "AreaSort":652300}, +{"AreaID":650402, "name":"高昌区", "CityID":650400, "AreaSort":650400}, +{"AreaID":650421, "name":"鄯善县", "CityID":650400, "AreaSort":650400}, +{"AreaID":650422, "name":"托克逊县", "CityID":650400, "AreaSort":650400}, +{"AreaID":653001, "name":"阿图什市", "CityID":653000, "AreaSort":653000}, +{"AreaID":653022, "name":"阿克陶县", "CityID":653000, "AreaSort":653000}, +{"AreaID":653023, "name":"阿合奇县", "CityID":653000, "AreaSort":653000}, +{"AreaID":653024, "name":"乌恰县", "CityID":653000, "AreaSort":653000}, +{"AreaID":652826, "name":"焉耆回族自治县", "CityID":652800, "AreaSort":652800}, +{"AreaID":652825, "name":"且末县", "CityID":652800, "AreaSort":652800}, +{"AreaID":652828, "name":"和硕县", "CityID":652800, "AreaSort":652800}, +{"AreaID":652827, "name":"和静县", "CityID":652800, "AreaSort":652800}, +{"AreaID":652829, "name":"博湖县", "CityID":652800, "AreaSort":652800}, +{"AreaID":652801, "name":"库尔勒市", "CityID":652800, "AreaSort":652800}, +{"AreaID":652822, "name":"轮台县", "CityID":652800, "AreaSort":652800}, +{"AreaID":652824, "name":"若羌县", "CityID":652800, "AreaSort":652800}, +{"AreaID":652823, "name":"尉犁县", "CityID":652800, "AreaSort":652800}, +{"AreaID":653127, "name":"麦盖提县", "CityID":653100, "AreaSort":653100}, +{"AreaID":653128, "name":"岳普湖县", "CityID":653100, "AreaSort":653100}, +{"AreaID":653125, "name":"莎车县", "CityID":653100, "AreaSort":653100}, +{"AreaID":653126, "name":"叶城县", "CityID":653100, "AreaSort":653100}, +{"AreaID":653129, "name":"伽师县", "CityID":653100, "AreaSort":653100}, +{"AreaID":653131, "name":"塔什库尔干塔吉克自治县", "CityID":653100, "AreaSort":653100}, +{"AreaID":653130, "name":"巴楚县", "CityID":653100, "AreaSort":653100}, +{"AreaID":653101, "name":"喀什市", "CityID":653100, "AreaSort":653100}, +{"AreaID":653122, "name":"疏勒县", "CityID":653100, "AreaSort":653100}, +{"AreaID":653121, "name":"疏附县", "CityID":653100, "AreaSort":653100}, +{"AreaID":653124, "name":"泽普县", "CityID":653100, "AreaSort":653100}, +{"AreaID":653123, "name":"英吉沙县", "CityID":653100, "AreaSort":653100}, +{"AreaID":654324, "name":"哈巴河县", "CityID":654300, "AreaSort":654300}, +{"AreaID":654325, "name":"青河县", "CityID":654300, "AreaSort":654300}, +{"AreaID":654326, "name":"吉木乃县", "CityID":654300, "AreaSort":654300}, +{"AreaID":654323, "name":"福海县", "CityID":654300, "AreaSort":654300}, +{"AreaID":654322, "name":"富蕴县", "CityID":654300, "AreaSort":654300}, +{"AreaID":654321, "name":"布尔津县", "CityID":654300, "AreaSort":654300}, +{"AreaID":654301, "name":"阿勒泰市", "CityID":654300, "AreaSort":654300}, +{"AreaID":654022, "name":"察布查尔锡伯自治县", "CityID":654000, "AreaSort":654000}, +{"AreaID":654004, "name":"霍尔果斯市", "CityID":654000, "AreaSort":654000}, +{"AreaID":654021, "name":"伊宁县", "CityID":654000, "AreaSort":654000}, +{"AreaID":654003, "name":"奎屯市", "CityID":654000, "AreaSort":654000}, +{"AreaID":654002, "name":"伊宁市", "CityID":654000, "AreaSort":654000}, +{"AreaID":654026, "name":"昭苏县", "CityID":654000, "AreaSort":654000}, +{"AreaID":654025, "name":"新源县", "CityID":654000, "AreaSort":654000}, +{"AreaID":654028, "name":"尼勒克县", "CityID":654000, "AreaSort":654000}, +{"AreaID":654024, "name":"巩留县", "CityID":654000, "AreaSort":654000}, +{"AreaID":654027, "name":"特克斯县", "CityID":654000, "AreaSort":654000}, +{"AreaID":654023, "name":"霍城县", "CityID":654000, "AreaSort":654000}, +{"AreaID":653225, "name":"策勒县", "CityID":653200, "AreaSort":653200}, +{"AreaID":653224, "name":"洛浦县", "CityID":653200, "AreaSort":653200}, +{"AreaID":653201, "name":"和田市", "CityID":653200, "AreaSort":653200}, +{"AreaID":653227, "name":"民丰县", "CityID":653200, "AreaSort":653200}, +{"AreaID":653226, "name":"于田县", "CityID":653200, "AreaSort":653200}, +{"AreaID":653222, "name":"墨玉县", "CityID":653200, "AreaSort":653200}, +{"AreaID":653223, "name":"皮山县", "CityID":653200, "AreaSort":653200}, +{"AreaID":653221, "name":"和田县", "CityID":653200, "AreaSort":653200}, +{"AreaID":654202, "name":"乌苏市", "CityID":654200, "AreaSort":654200}, +{"AreaID":654201, "name":"塔城市", "CityID":654200, "AreaSort":654200}, +{"AreaID":654226, "name":"和布克赛尔蒙古自治县", "CityID":654200, "AreaSort":654200}, +{"AreaID":654224, "name":"托里县", "CityID":654200, "AreaSort":654200}, +{"AreaID":654225, "name":"裕民县", "CityID":654200, "AreaSort":654200}, +{"AreaID":654223, "name":"沙湾县", "CityID":654200, "AreaSort":654200}, +{"AreaID":654221, "name":"额敏县", "CityID":654200, "AreaSort":654200}, +{"AreaID":652223, "name":"伊吾县", "CityID":652200, "AreaSort":652200}, +{"AreaID":652201, "name":"哈密市", "CityID":652200, "AreaSort":652200}, +{"AreaID":652222, "name":"巴里坤哈萨克自治县", "CityID":652200, "AreaSort":652200}, +{"AreaID":652702, "name":"阿拉山口市", "CityID":652700, "AreaSort":652700}, +{"AreaID":652701, "name":"博乐市", "CityID":652700, "AreaSort":652700}, +{"AreaID":652723, "name":"温泉县", "CityID":652700, "AreaSort":652700}, +{"AreaID":652722, "name":"精河县", "CityID":652700, "AreaSort":652700}, +{"AreaID":652923, "name":"库车县", "CityID":652900, "AreaSort":652900}, +{"AreaID":652922, "name":"温宿县", "CityID":652900, "AreaSort":652900}, +{"AreaID":652929, "name":"柯坪县", "CityID":652900, "AreaSort":652900}, +{"AreaID":652928, "name":"阿瓦提县", "CityID":652900, "AreaSort":652900}, +{"AreaID":652901, "name":"阿克苏市", "CityID":652900, "AreaSort":652900}, +{"AreaID":652925, "name":"新和县", "CityID":652900, "AreaSort":652900}, +{"AreaID":652924, "name":"沙雅县", "CityID":652900, "AreaSort":652900}, +{"AreaID":652927, "name":"乌什县", "CityID":652900, "AreaSort":652900}, +{"AreaID":652926, "name":"拜城县", "CityID":652900, "AreaSort":652900}, +{"AreaID":650109, "name":"米东区", "CityID":650100, "AreaSort":650100}, +{"AreaID":650121, "name":"乌鲁木齐县", "CityID":650100, "AreaSort":650100}, +{"AreaID":650102, "name":"天山区", "CityID":650100, "AreaSort":650100}, +{"AreaID":650103, "name":"沙依巴克区", "CityID":650100, "AreaSort":650100}, +{"AreaID":650106, "name":"头屯河区", "CityID":650100, "AreaSort":650100}, +{"AreaID":650107, "name":"达坂城区", "CityID":650100, "AreaSort":650100}, +{"AreaID":650104, "name":"新市区", "CityID":650100, "AreaSort":650100}, +{"AreaID":650105, "name":"水磨沟区", "CityID":650100, "AreaSort":650100}, +{"AreaID":650205, "name":"乌尔禾区", "CityID":650200, "AreaSort":650200}, +{"AreaID":650203, "name":"克拉玛依区", "CityID":650200, "AreaSort":650200}, +{"AreaID":650204, "name":"白碱滩区", "CityID":650200, "AreaSort":650200}, +{"AreaID":650202, "name":"独山子区", "CityID":650200, "AreaSort":650200} +] \ No newline at end of file diff --git a/JQ_ELOVE/src/main/assets/china_cities.db b/JQ_ELOVE/src/main/assets/china_cities.db new file mode 100644 index 0000000000000000000000000000000000000000..16774c705afd601ff62ec5f7abe54f81436b93b2 Binary files /dev/null and b/JQ_ELOVE/src/main/assets/china_cities.db differ diff --git a/JQ_ELOVE/src/main/assets/city.json b/JQ_ELOVE/src/main/assets/city.json new file mode 100644 index 0000000000000000000000000000000000000000..a246dc1ff2fdc3805d8404cff1ea9a71d2eaeb10 --- /dev/null +++ b/JQ_ELOVE/src/main/assets/city.json @@ -0,0 +1,369 @@ +[{"ProID":110000, "name":"北京市市辖区", "CityID":110100, "CitySort":110000}, +{"ProID":120000, "name":"天津市市辖区", "CityID":120100, "CitySort":120000}, +{"ProID":120000, "name":"天津市郊县", "CityID":120200, "CitySort":120000}, +{"ProID":130000, "name":"衡水市", "CityID":131100, "CitySort":130000}, +{"ProID":130000, "name":"唐山市", "CityID":130200, "CitySort":130000}, +{"ProID":130000, "name":"张家口市", "CityID":130700, "CitySort":130000}, +{"ProID":130000, "name":"邢台市", "CityID":130500, "CitySort":130000}, +{"ProID":130000, "name":"秦皇岛市", "CityID":130300, "CitySort":130000}, +{"ProID":130000, "name":"廊坊市", "CityID":131000, "CitySort":130000}, +{"ProID":130000, "name":"保定市", "CityID":130600, "CitySort":130000}, +{"ProID":130000, "name":"石家庄市", "CityID":130100, "CitySort":130000}, +{"ProID":130000, "name":"沧州市", "CityID":130900, "CitySort":130000}, +{"ProID":130000, "name":"承德市", "CityID":130800, "CitySort":130000}, +{"ProID":130000, "name":"邯郸市", "CityID":130400, "CitySort":130000}, +{"ProID":140000, "name":"太原市", "CityID":140100, "CitySort":140000}, +{"ProID":140000, "name":"晋城市", "CityID":140500, "CitySort":140000}, +{"ProID":140000, "name":"运城市", "CityID":140800, "CitySort":140000}, +{"ProID":140000, "name":"阳泉市", "CityID":140300, "CitySort":140000}, +{"ProID":140000, "name":"忻州市", "CityID":140900, "CitySort":140000}, +{"ProID":140000, "name":"晋中市", "CityID":140700, "CitySort":140000}, +{"ProID":140000, "name":"长治市", "CityID":140400, "CitySort":140000}, +{"ProID":140000, "name":"吕梁市", "CityID":141100, "CitySort":140000}, +{"ProID":140000, "name":"临汾市", "CityID":141000, "CitySort":140000}, +{"ProID":140000, "name":"大同市", "CityID":140200, "CitySort":140000}, +{"ProID":140000, "name":"朔州市", "CityID":140600, "CitySort":140000}, +{"ProID":150000, "name":"乌海市", "CityID":150300, "CitySort":150000}, +{"ProID":150000, "name":"赤峰市", "CityID":150400, "CitySort":150000}, +{"ProID":150000, "name":"阿拉善盟", "CityID":152900, "CitySort":150000}, +{"ProID":150000, "name":"巴彦淖尔市", "CityID":150800, "CitySort":150000}, +{"ProID":150000, "name":"通辽市", "CityID":150500, "CitySort":150000}, +{"ProID":150000, "name":"包头市", "CityID":150200, "CitySort":150000}, +{"ProID":150000, "name":"兴安盟", "CityID":152200, "CitySort":150000}, +{"ProID":150000, "name":"乌兰察布市", "CityID":150900, "CitySort":150000}, +{"ProID":150000, "name":"鄂尔多斯市", "CityID":150600, "CitySort":150000}, +{"ProID":150000, "name":"呼和浩特市", "CityID":150100, "CitySort":150000}, +{"ProID":150000, "name":"锡林郭勒盟", "CityID":152500, "CitySort":150000}, +{"ProID":150000, "name":"呼伦贝尔市", "CityID":150700, "CitySort":150000}, +{"ProID":210000, "name":"盘锦市", "CityID":211100, "CitySort":210000}, +{"ProID":210000, "name":"锦州市", "CityID":210700, "CitySort":210000}, +{"ProID":210000, "name":"朝阳市", "CityID":211300, "CitySort":210000}, +{"ProID":210000, "name":"阜新市", "CityID":210900, "CitySort":210000}, +{"ProID":210000, "name":"营口市", "CityID":210800, "CitySort":210000}, +{"ProID":210000, "name":"辽阳市", "CityID":211000, "CitySort":210000}, +{"ProID":210000, "name":"沈阳市", "CityID":210100, "CitySort":210000}, +{"ProID":210000, "name":"葫芦岛市", "CityID":211400, "CitySort":210000}, +{"ProID":210000, "name":"丹东市", "CityID":210600, "CitySort":210000}, +{"ProID":210000, "name":"抚顺市", "CityID":210400, "CitySort":210000}, +{"ProID":210000, "name":"铁岭市", "CityID":211200, "CitySort":210000}, +{"ProID":210000, "name":"鞍山市", "CityID":210300, "CitySort":210000}, +{"ProID":210000, "name":"本溪市", "CityID":210500, "CitySort":210000}, +{"ProID":210000, "name":"大连市", "CityID":210200, "CitySort":210000}, +{"ProID":220000, "name":"松原市", "CityID":220700, "CitySort":220000}, +{"ProID":220000, "name":"辽源市", "CityID":220400, "CitySort":220000}, +{"ProID":220000, "name":"吉林市", "CityID":220200, "CitySort":220000}, +{"ProID":220000, "name":"长春市", "CityID":220100, "CitySort":220000}, +{"ProID":220000, "name":"白城市", "CityID":220800, "CitySort":220000}, +{"ProID":220000, "name":"通化市", "CityID":220500, "CitySort":220000}, +{"ProID":220000, "name":"四平市", "CityID":220300, "CitySort":220000}, +{"ProID":220000, "name":"延边朝鲜族自治州", "CityID":222400, "CitySort":220000}, +{"ProID":220000, "name":"白山市", "CityID":220600, "CitySort":220000}, +{"ProID":230000, "name":"牡丹江市", "CityID":231000, "CitySort":230000}, +{"ProID":230000, "name":"鹤岗市", "CityID":230400, "CitySort":230000}, +{"ProID":230000, "name":"佳木斯市", "CityID":230800, "CitySort":230000}, +{"ProID":230000, "name":"黑河市", "CityID":231100, "CitySort":230000}, +{"ProID":230000, "name":"大兴安岭地区", "CityID":232700, "CitySort":230000}, +{"ProID":230000, "name":"鸡西市", "CityID":230300, "CitySort":230000}, +{"ProID":230000, "name":"大庆市", "CityID":230600, "CitySort":230000}, +{"ProID":230000, "name":"哈尔滨市", "CityID":230100, "CitySort":230000}, +{"ProID":230000, "name":"伊春市", "CityID":230700, "CitySort":230000}, +{"ProID":230000, "name":"绥化市", "CityID":231200, "CitySort":230000}, +{"ProID":230000, "name":"齐齐哈尔市", "CityID":230200, "CitySort":230000}, +{"ProID":230000, "name":"七台河市", "CityID":230900, "CitySort":230000}, +{"ProID":230000, "name":"双鸭山市", "CityID":230500, "CitySort":230000}, +{"ProID":310000, "name":"上海市市辖区", "CityID":310100, "CitySort":310000}, +{"ProID":310000, "name":"上海市郊县", "CityID":310200, "CitySort":310000}, +{"ProID":320000, "name":"常州市", "CityID":320400, "CitySort":320000}, +{"ProID":320000, "name":"徐州市", "CityID":320300, "CitySort":320000}, +{"ProID":320000, "name":"泰州市", "CityID":321200, "CitySort":320000}, +{"ProID":320000, "name":"苏州市", "CityID":320500, "CitySort":320000}, +{"ProID":320000, "name":"无锡市", "CityID":320200, "CitySort":320000}, +{"ProID":320000, "name":"连云港市", "CityID":320700, "CitySort":320000}, +{"ProID":320000, "name":"扬州市", "CityID":321000, "CitySort":320000}, +{"ProID":320000, "name":"镇江市", "CityID":321100, "CitySort":320000}, +{"ProID":320000, "name":"淮安市", "CityID":320800, "CitySort":320000}, +{"ProID":320000, "name":"盐城市", "CityID":320900, "CitySort":320000}, +{"ProID":320000, "name":"南京市", "CityID":320100, "CitySort":320000}, +{"ProID":320000, "name":"宿迁市", "CityID":321300, "CitySort":320000}, +{"ProID":320000, "name":"南通市", "CityID":320600, "CitySort":320000}, +{"ProID":330000, "name":"绍兴市", "CityID":330600, "CitySort":330000}, +{"ProID":330000, "name":"宁波市", "CityID":330200, "CitySort":330000}, +{"ProID":330000, "name":"杭州市", "CityID":330100, "CitySort":330000}, +{"ProID":330000, "name":"舟山市", "CityID":330900, "CitySort":330000}, +{"ProID":330000, "name":"湖州市", "CityID":330500, "CitySort":330000}, +{"ProID":330000, "name":"台州市", "CityID":331000, "CitySort":330000}, +{"ProID":330000, "name":"温州市", "CityID":330300, "CitySort":330000}, +{"ProID":330000, "name":"嘉兴市", "CityID":330400, "CitySort":330000}, +{"ProID":330000, "name":"衢州市", "CityID":330800, "CitySort":330000}, +{"ProID":330000, "name":"丽水市", "CityID":331100, "CitySort":330000}, +{"ProID":330000, "name":"金华市", "CityID":330700, "CitySort":330000}, +{"ProID":340000, "name":"淮北市", "CityID":340600, "CitySort":340000}, +{"ProID":340000, "name":"滁州市", "CityID":341100, "CitySort":340000}, +{"ProID":340000, "name":"铜陵市", "CityID":340700, "CitySort":340000}, +{"ProID":340000, "name":"池州市", "CityID":341700, "CitySort":340000}, +{"ProID":340000, "name":"合肥市", "CityID":340100, "CitySort":340000}, +{"ProID":340000, "name":"宣城市", "CityID":341800, "CitySort":340000}, +{"ProID":340000, "name":"六安市", "CityID":341500, "CitySort":340000}, +{"ProID":340000, "name":"宿州市", "CityID":341300, "CitySort":340000}, +{"ProID":340000, "name":"阜阳市", "CityID":341200, "CitySort":340000}, +{"ProID":340000, "name":"马鞍山市", "CityID":340500, "CitySort":340000}, +{"ProID":340000, "name":"芜湖市", "CityID":340200, "CitySort":340000}, +{"ProID":340000, "name":"安庆市", "CityID":340800, "CitySort":340000}, +{"ProID":340000, "name":"亳州市", "CityID":341600, "CitySort":340000}, +{"ProID":340000, "name":"淮南市", "CityID":340400, "CitySort":340000}, +{"ProID":340000, "name":"蚌埠市", "CityID":340300, "CitySort":340000}, +{"ProID":340000, "name":"黄山市", "CityID":341000, "CitySort":340000}, +{"ProID":350000, "name":"龙岩市", "CityID":350800, "CitySort":350000}, +{"ProID":350000, "name":"三明市", "CityID":350400, "CitySort":350000}, +{"ProID":350000, "name":"南平市", "CityID":350700, "CitySort":350000}, +{"ProID":350000, "name":"莆田市", "CityID":350300, "CitySort":350000}, +{"ProID":350000, "name":"厦门市", "CityID":350200, "CitySort":350000}, +{"ProID":350000, "name":"福州市", "CityID":350100, "CitySort":350000}, +{"ProID":350000, "name":"漳州市", "CityID":350600, "CitySort":350000}, +{"ProID":350000, "name":"宁德市", "CityID":350900, "CitySort":350000}, +{"ProID":350000, "name":"泉州市", "CityID":350500, "CitySort":350000}, +{"ProID":360000, "name":"吉安市", "CityID":360800, "CitySort":360000}, +{"ProID":360000, "name":"萍乡市", "CityID":360300, "CitySort":360000}, +{"ProID":360000, "name":"上饶市", "CityID":361100, "CitySort":360000}, +{"ProID":360000, "name":"赣州市", "CityID":360700, "CitySort":360000}, +{"ProID":360000, "name":"抚州市", "CityID":361000, "CitySort":360000}, +{"ProID":360000, "name":"九江市", "CityID":360400, "CitySort":360000}, +{"ProID":360000, "name":"南昌市", "CityID":360100, "CitySort":360000}, +{"ProID":360000, "name":"新余市", "CityID":360500, "CitySort":360000}, +{"ProID":360000, "name":"宜春市", "CityID":360900, "CitySort":360000}, +{"ProID":360000, "name":"景德镇市", "CityID":360200, "CitySort":360000}, +{"ProID":360000, "name":"鹰潭市", "CityID":360600, "CitySort":360000}, +{"ProID":370000, "name":"临沂市", "CityID":371300, "CitySort":370000}, +{"ProID":370000, "name":"菏泽市", "CityID":371700, "CitySort":370000}, +{"ProID":370000, "name":"东营市", "CityID":370500, "CitySort":370000}, +{"ProID":370000, "name":"威海市", "CityID":371000, "CitySort":370000}, +{"ProID":370000, "name":"青岛市", "CityID":370200, "CitySort":370000}, +{"ProID":370000, "name":"济宁市", "CityID":370800, "CitySort":370000}, +{"ProID":370000, "name":"潍坊市", "CityID":370700, "CitySort":370000}, +{"ProID":370000, "name":"滨州市", "CityID":371600, "CitySort":370000}, +{"ProID":370000, "name":"济南市", "CityID":370100, "CitySort":370000}, +{"ProID":370000, "name":"淄博市", "CityID":370300, "CitySort":370000}, +{"ProID":370000, "name":"泰安市", "CityID":370900, "CitySort":370000}, +{"ProID":370000, "name":"烟台市", "CityID":370600, "CitySort":370000}, +{"ProID":370000, "name":"莱芜市", "CityID":371200, "CitySort":370000}, +{"ProID":370000, "name":"聊城市", "CityID":371500, "CitySort":370000}, +{"ProID":370000, "name":"德州市", "CityID":371400, "CitySort":370000}, +{"ProID":370000, "name":"日照市", "CityID":371100, "CitySort":370000}, +{"ProID":370000, "name":"枣庄市", "CityID":370400, "CitySort":370000}, +{"ProID":410000, "name":"鹤壁市", "CityID":410600, "CitySort":410000}, +{"ProID":410000, "name":"开封市", "CityID":410200, "CitySort":410000}, +{"ProID":410000, "name":"新乡市", "CityID":410700, "CitySort":410000}, +{"ProID":410000, "name":"济源市", "CityID":419001, "CitySort":410000}, +{"ProID":410000, "name":"周口市", "CityID":411600, "CitySort":410000}, +{"ProID":410000, "name":"三门峡市", "CityID":411200, "CitySort":410000}, +{"ProID":410000, "name":"平顶山市", "CityID":410400, "CitySort":410000}, +{"ProID":410000, "name":"商丘市", "CityID":411400, "CitySort":410000}, +{"ProID":410000, "name":"濮阳市", "CityID":410900, "CitySort":410000}, +{"ProID":410000, "name":"信阳市", "CityID":411500, "CitySort":410000}, +{"ProID":410000, "name":"漯河市", "CityID":411100, "CitySort":410000}, +{"ProID":410000, "name":"南阳市", "CityID":411300, "CitySort":410000}, +{"ProID":410000, "name":"洛阳市", "CityID":410300, "CitySort":410000}, +{"ProID":410000, "name":"郑州市", "CityID":410100, "CitySort":410000}, +{"ProID":410000, "name":"驻马店市", "CityID":411700, "CitySort":410000}, +{"ProID":410000, "name":"许昌市", "CityID":411000, "CitySort":410000}, +{"ProID":410000, "name":"焦作市", "CityID":410800, "CitySort":410000}, +{"ProID":410000, "name":"安阳市", "CityID":410500, "CitySort":410000}, +{"ProID":420000, "name":"荆门市", "CityID":420800, "CitySort":420000}, +{"ProID":420000, "name":"黄冈市", "CityID":421100, "CitySort":420000}, +{"ProID":420000, "name":"孝感市", "CityID":420900, "CitySort":420000}, +{"ProID":420000, "name":"咸宁市", "CityID":421200, "CitySort":420000}, +{"ProID":420000, "name":"随州市", "CityID":421300, "CitySort":420000}, +{"ProID":420000, "name":"十堰市", "CityID":420300, "CitySort":420000}, +{"ProID":420000, "name":"襄阳市", "CityID":420600, "CitySort":420000}, +{"ProID":420000, "name":"神农架林区", "CityID":429021, "CitySort":420000}, +{"ProID":420000, "name":"宜昌市", "CityID":420500, "CitySort":420000}, +{"ProID":420000, "name":"武汉市", "CityID":420100, "CitySort":420000}, +{"ProID":420000, "name":"恩施土家族苗族自治州", "CityID":422800, "CitySort":420000}, +{"ProID":420000, "name":"鄂州市", "CityID":420700, "CitySort":420000}, +{"ProID":420000, "name":"天门市", "CityID":429006, "CitySort":420000}, +{"ProID":420000, "name":"黄石市", "CityID":420200, "CitySort":420000}, +{"ProID":420000, "name":"潜江市", "CityID":429005, "CitySort":420000}, +{"ProID":420000, "name":"仙桃市", "CityID":429004, "CitySort":420000}, +{"ProID":420000, "name":"荆州市", "CityID":421000, "CitySort":420000}, +{"ProID":430000, "name":"湘潭市", "CityID":430300, "CitySort":430000}, +{"ProID":430000, "name":"湘西土家族苗族自治州", "CityID":433100, "CitySort":430000}, +{"ProID":430000, "name":"株洲市", "CityID":430200, "CitySort":430000}, +{"ProID":430000, "name":"怀化市", "CityID":431200, "CitySort":430000}, +{"ProID":430000, "name":"邵阳市", "CityID":430500, "CitySort":430000}, +{"ProID":430000, "name":"永州市", "CityID":431100, "CitySort":430000}, +{"ProID":430000, "name":"张家界市", "CityID":430800, "CitySort":430000}, +{"ProID":430000, "name":"郴州市", "CityID":431000, "CitySort":430000}, +{"ProID":430000, "name":"常德市", "CityID":430700, "CitySort":430000}, +{"ProID":430000, "name":"岳阳市", "CityID":430600, "CitySort":430000}, +{"ProID":430000, "name":"益阳市", "CityID":430900, "CitySort":430000}, +{"ProID":430000, "name":"娄底市", "CityID":431300, "CitySort":430000}, +{"ProID":430000, "name":"衡阳市", "CityID":430400, "CitySort":430000}, +{"ProID":430000, "name":"长沙市", "CityID":430100, "CitySort":430000}, +{"ProID":440000, "name":"汕尾市", "CityID":441500, "CitySort":440000}, +{"ProID":440000, "name":"深圳市", "CityID":440300, "CitySort":440000}, +{"ProID":440000, "name":"佛山市", "CityID":440600, "CitySort":440000}, +{"ProID":440000, "name":"茂名市", "CityID":440900, "CitySort":440000}, +{"ProID":440000, "name":"河源市", "CityID":441600, "CitySort":440000}, +{"ProID":440000, "name":"湛江市", "CityID":440800, "CitySort":440000}, +{"ProID":440000, "name":"惠州市", "CityID":441300, "CitySort":440000}, +{"ProID":440000, "name":"揭阳市", "CityID":445200, "CitySort":440000}, +{"ProID":440000, "name":"广州市", "CityID":440100, "CitySort":440000}, +{"ProID":440000, "name":"清远市", "CityID":441800, "CitySort":440000}, +{"ProID":440000, "name":"潮州市", "CityID":445100, "CitySort":440000}, +{"ProID":440000, "name":"韶关市", "CityID":440200, "CitySort":440000}, +{"ProID":440000, "name":"江门市", "CityID":440700, "CitySort":440000}, +{"ProID":440000, "name":"中山市", "CityID":442000, "CitySort":440000}, +{"ProID":440000, "name":"云浮市", "CityID":445300, "CitySort":440000}, +{"ProID":440000, "name":"肇庆市", "CityID":441200, "CitySort":440000}, +{"ProID":440000, "name":"阳江市", "CityID":441700, "CitySort":440000}, +{"ProID":440000, "name":"珠海市", "CityID":440400, "CitySort":440000}, +{"ProID":440000, "name":"梅州市", "CityID":441400, "CitySort":440000}, +{"ProID":440000, "name":"东莞市", "CityID":441900, "CitySort":440000}, +{"ProID":440000, "name":"汕头市", "CityID":440500, "CitySort":440000}, +{"ProID":450000, "name":"贵港市", "CityID":450800, "CitySort":450000}, +{"ProID":450000, "name":"北海市", "CityID":450500, "CitySort":450000}, +{"ProID":450000, "name":"百色市", "CityID":451000, "CitySort":450000}, +{"ProID":450000, "name":"河池市", "CityID":451200, "CitySort":450000}, +{"ProID":450000, "name":"桂林市", "CityID":450300, "CitySort":450000}, +{"ProID":450000, "name":"柳州市", "CityID":450200, "CitySort":450000}, +{"ProID":450000, "name":"梧州市", "CityID":450400, "CitySort":450000}, +{"ProID":450000, "name":"南宁市", "CityID":450100, "CitySort":450000}, +{"ProID":450000, "name":"来宾市", "CityID":451300, "CitySort":450000}, +{"ProID":450000, "name":"崇左市", "CityID":451400, "CitySort":450000}, +{"ProID":450000, "name":"防城港市", "CityID":450600, "CitySort":450000}, +{"ProID":450000, "name":"玉林市", "CityID":450900, "CitySort":450000}, +{"ProID":450000, "name":"贺州市", "CityID":451100, "CitySort":450000}, +{"ProID":450000, "name":"钦州市", "CityID":450700, "CitySort":450000}, +{"ProID":460000, "name":"三亚市", "CityID":460200, "CitySort":460000}, +{"ProID":460000, "name":"万宁市", "CityID":469006, "CitySort":460000}, +{"ProID":460000, "name":"文昌市", "CityID":469005, "CitySort":460000}, +{"ProID":460000, "name":"保亭黎族苗族自治县", "CityID":469029, "CitySort":460000}, +{"ProID":460000, "name":"琼海市", "CityID":469002, "CitySort":460000}, +{"ProID":460000, "name":"五指山市", "CityID":469001, "CitySort":460000}, +{"ProID":460000, "name":"儋州市", "CityID":460400, "CitySort":460000}, +{"ProID":460000, "name":"琼中黎族苗族自治县", "CityID":469030, "CitySort":460000}, +{"ProID":460000, "name":"三沙市", "CityID":460300, "CitySort":460000}, +{"ProID":460000, "name":"定安县", "CityID":469021, "CitySort":460000}, +{"ProID":460000, "name":"屯昌县", "CityID":469022, "CitySort":460000}, +{"ProID":460000, "name":"澄迈县", "CityID":469023, "CitySort":460000}, +{"ProID":460000, "name":"临高县", "CityID":469024, "CitySort":460000}, +{"ProID":460000, "name":"海口市", "CityID":460100, "CitySort":460000}, +{"ProID":460000, "name":"白沙黎族自治县", "CityID":469025, "CitySort":460000}, +{"ProID":460000, "name":"东方市", "CityID":469007, "CitySort":460000}, +{"ProID":460000, "name":"昌江黎族自治县", "CityID":469026, "CitySort":460000}, +{"ProID":460000, "name":"乐东黎族自治县", "CityID":469027, "CitySort":460000}, +{"ProID":460000, "name":"陵水黎族自治县", "CityID":469028, "CitySort":460000}, +{"ProID":500000, "name":"重庆市市辖区", "CityID":500100, "CitySort":500000}, +{"ProID":500000, "name":"重庆市郊县", "CityID":500200, "CitySort":500000}, +{"ProID":510000, "name":"资阳市", "CityID":512000, "CitySort":510000}, +{"ProID":510000, "name":"巴中市", "CityID":511900, "CitySort":510000}, +{"ProID":510000, "name":"雅安市", "CityID":511800, "CitySort":510000}, +{"ProID":510000, "name":"德阳市", "CityID":510600, "CitySort":510000}, +{"ProID":510000, "name":"甘孜藏族自治州", "CityID":513300, "CitySort":510000}, +{"ProID":510000, "name":"南充市", "CityID":511300, "CitySort":510000}, +{"ProID":510000, "name":"成都市", "CityID":510100, "CitySort":510000}, +{"ProID":510000, "name":"达州市", "CityID":511700, "CitySort":510000}, +{"ProID":510000, "name":"眉山市", "CityID":511400, "CitySort":510000}, +{"ProID":510000, "name":"广元市", "CityID":510800, "CitySort":510000}, +{"ProID":510000, "name":"乐山市", "CityID":511100, "CitySort":510000}, +{"ProID":510000, "name":"绵阳市", "CityID":510700, "CitySort":510000}, +{"ProID":510000, "name":"宜宾市", "CityID":511500, "CitySort":510000}, +{"ProID":510000, "name":"阿坝藏族羌族自治州", "CityID":513200, "CitySort":510000}, +{"ProID":510000, "name":"遂宁市", "CityID":510900, "CitySort":510000}, +{"ProID":510000, "name":"广安市", "CityID":511600, "CitySort":510000}, +{"ProID":510000, "name":"自贡市", "CityID":510300, "CitySort":510000}, +{"ProID":510000, "name":"内江市", "CityID":511000, "CitySort":510000}, +{"ProID":510000, "name":"攀枝花市", "CityID":510400, "CitySort":510000}, +{"ProID":510000, "name":"凉山彝族自治州", "CityID":513400, "CitySort":510000}, +{"ProID":510000, "name":"泸州市", "CityID":510500, "CitySort":510000}, +{"ProID":520000, "name":"黔南布依族苗族自治州", "CityID":522700, "CitySort":520000}, +{"ProID":520000, "name":"毕节市", "CityID":520500, "CitySort":520000}, +{"ProID":520000, "name":"六盘水市", "CityID":520200, "CitySort":520000}, +{"ProID":520000, "name":"黔西南布依族苗族自治州", "CityID":522300, "CitySort":520000}, +{"ProID":520000, "name":"安顺市", "CityID":520400, "CitySort":520000}, +{"ProID":520000, "name":"遵义市", "CityID":520300, "CitySort":520000}, +{"ProID":520000, "name":"黔东南苗族侗族自治州", "CityID":522600, "CitySort":520000}, +{"ProID":520000, "name":"铜仁市", "CityID":520600, "CitySort":520000}, +{"ProID":520000, "name":"贵阳市", "CityID":520100, "CitySort":520000}, +{"ProID":530000, "name":"普洱市", "CityID":530800, "CitySort":530000}, +{"ProID":530000, "name":"红河哈尼族彝族自治州", "CityID":532500, "CitySort":530000}, +{"ProID":530000, "name":"文山壮族苗族自治州", "CityID":532600, "CitySort":530000}, +{"ProID":530000, "name":"临沧市", "CityID":530900, "CitySort":530000}, +{"ProID":530000, "name":"楚雄彝族自治州", "CityID":532300, "CitySort":530000}, +{"ProID":530000, "name":"曲靖市", "CityID":530300, "CitySort":530000}, +{"ProID":530000, "name":"昭通市", "CityID":530600, "CitySort":530000}, +{"ProID":530000, "name":"玉溪市", "CityID":530400, "CitySort":530000}, +{"ProID":530000, "name":"迪庆藏族自治州", "CityID":533400, "CitySort":530000}, +{"ProID":530000, "name":"大理白族自治州", "CityID":532900, "CitySort":530000}, +{"ProID":530000, "name":"保山市", "CityID":530500, "CitySort":530000}, +{"ProID":530000, "name":"西双版纳傣族自治州", "CityID":532800, "CitySort":530000}, +{"ProID":530000, "name":"德宏傣族景颇族自治州", "CityID":533100, "CitySort":530000}, +{"ProID":530000, "name":"昆明市", "CityID":530100, "CitySort":530000}, +{"ProID":530000, "name":"丽江市", "CityID":530700, "CitySort":530000}, +{"ProID":530000, "name":"怒江傈僳族自治州", "CityID":533300, "CitySort":530000}, +{"ProID":540000, "name":"那曲地区", "CityID":542400, "CitySort":540000}, +{"ProID":540000, "name":"昌都市", "CityID":540300, "CitySort":540000}, +{"ProID":540000, "name":"山南地区", "CityID":542200, "CitySort":540000}, +{"ProID":540000, "name":"日喀则市", "CityID":540200, "CitySort":540000}, +{"ProID":540000, "name":"拉萨市", "CityID":540100, "CitySort":540000}, +{"ProID":540000, "name":"阿里地区", "CityID":542500, "CitySort":540000}, +{"ProID":540000, "name":"林芝市", "CityID":540400, "CitySort":540000}, +{"ProID":610000, "name":"汉中市", "CityID":610700, "CitySort":610000}, +{"ProID":610000, "name":"咸阳市", "CityID":610400, "CitySort":610000}, +{"ProID":610000, "name":"榆林市", "CityID":610800, "CitySort":610000}, +{"ProID":610000, "name":"渭南市", "CityID":610500, "CitySort":610000}, +{"ProID":610000, "name":"西安市", "CityID":610100, "CitySort":610000}, +{"ProID":610000, "name":"商洛市", "CityID":611000, "CitySort":610000}, +{"ProID":610000, "name":"铜川市", "CityID":610200, "CitySort":610000}, +{"ProID":610000, "name":"宝鸡市", "CityID":610300, "CitySort":610000}, +{"ProID":610000, "name":"安康市", "CityID":610900, "CitySort":610000}, +{"ProID":610000, "name":"延安市", "CityID":610600, "CitySort":610000}, +{"ProID":620000, "name":"天水市", "CityID":620500, "CitySort":620000}, +{"ProID":620000, "name":"定西市", "CityID":621100, "CitySort":620000}, +{"ProID":620000, "name":"金昌市", "CityID":620300, "CitySort":620000}, +{"ProID":620000, "name":"临夏回族自治州", "CityID":622900, "CitySort":620000}, +{"ProID":620000, "name":"白银市", "CityID":620400, "CitySort":620000}, +{"ProID":620000, "name":"嘉峪关市", "CityID":620200, "CitySort":620000}, +{"ProID":620000, "name":"庆阳市", "CityID":621000, "CitySort":620000}, +{"ProID":620000, "name":"酒泉市", "CityID":620900, "CitySort":620000}, +{"ProID":620000, "name":"武威市", "CityID":620600, "CitySort":620000}, +{"ProID":620000, "name":"陇南市", "CityID":621200, "CitySort":620000}, +{"ProID":620000, "name":"张掖市", "CityID":620700, "CitySort":620000}, +{"ProID":620000, "name":"平凉市", "CityID":620800, "CitySort":620000}, +{"ProID":620000, "name":"兰州市", "CityID":620100, "CitySort":620000}, +{"ProID":620000, "name":"甘南藏族自治州", "CityID":623000, "CitySort":620000}, +{"ProID":630000, "name":"海北藏族自治州", "CityID":632200, "CitySort":630000}, +{"ProID":630000, "name":"海南藏族自治州", "CityID":632500, "CitySort":630000}, +{"ProID":630000, "name":"海东市", "CityID":630200, "CitySort":630000}, +{"ProID":630000, "name":"海西蒙古族藏族自治州", "CityID":632800, "CitySort":630000}, +{"ProID":630000, "name":"玉树藏族自治州", "CityID":632700, "CitySort":630000}, +{"ProID":630000, "name":"黄南藏族自治州", "CityID":632300, "CitySort":630000}, +{"ProID":630000, "name":"果洛藏族自治州", "CityID":632600, "CitySort":630000}, +{"ProID":630000, "name":"西宁市", "CityID":630100, "CitySort":630000}, +{"ProID":640000, "name":"吴忠市", "CityID":640300, "CitySort":640000}, +{"ProID":640000, "name":"固原市", "CityID":640400, "CitySort":640000}, +{"ProID":640000, "name":"中卫市", "CityID":640500, "CitySort":640000}, +{"ProID":640000, "name":"银川市", "CityID":640100, "CitySort":640000}, +{"ProID":640000, "name":"石嘴山市", "CityID":640200, "CitySort":640000}, +{"ProID":650000, "name":"石河子市", "CityID":659001, "CitySort":650000}, +{"ProID":650000, "name":"昌吉回族自治州", "CityID":652300, "CitySort":650000}, +{"ProID":650000, "name":"吐鲁番市", "CityID":650400, "CitySort":650000}, +{"ProID":650000, "name":"克孜勒苏柯尔克孜自治州", "CityID":653000, "CitySort":650000}, +{"ProID":650000, "name":"巴音郭楞蒙古自治州", "CityID":652800, "CitySort":650000}, +{"ProID":650000, "name":"喀什地区", "CityID":653100, "CitySort":650000}, +{"ProID":650000, "name":"可克达拉市", "CityID":659008, "CitySort":650000}, +{"ProID":650000, "name":"双河市", "CityID":659007, "CitySort":650000}, +{"ProID":650000, "name":"阿勒泰地区", "CityID":654300, "CitySort":650000}, +{"ProID":650000, "name":"铁门关市", "CityID":659006, "CitySort":650000}, +{"ProID":650000, "name":"北屯市", "CityID":659005, "CitySort":650000}, +{"ProID":650000, "name":"伊犁哈萨克自治州", "CityID":654000, "CitySort":650000}, +{"ProID":650000, "name":"五家渠市", "CityID":659004, "CitySort":650000}, +{"ProID":650000, "name":"图木舒克市", "CityID":659003, "CitySort":650000}, +{"ProID":650000, "name":"阿拉尔市", "CityID":659002, "CitySort":650000}, +{"ProID":650000, "name":"和田地区", "CityID":653200, "CitySort":650000}, +{"ProID":650000, "name":"塔城地区", "CityID":654200, "CitySort":650000}, +{"ProID":650000, "name":"哈密地区", "CityID":652200, "CitySort":650000}, +{"ProID":650000, "name":"博尔塔拉蒙古自治州", "CityID":652700, "CitySort":650000}, +{"ProID":650000, "name":"阿克苏地区", "CityID":652900, "CitySort":650000}, +{"ProID":650000, "name":"乌鲁木齐市", "CityID":650100, "CitySort":650000}, +{"ProID":650000, "name":"克拉玛依市", "CityID":650200, "CitySort":650000}] \ No newline at end of file diff --git a/JQ_ELOVE/src/main/assets/gift.json b/JQ_ELOVE/src/main/assets/gift.json new file mode 100644 index 0000000000000000000000000000000000000000..84b45fba3f1222d8c725a3918252fa9b2d00ca37 --- /dev/null +++ b/JQ_ELOVE/src/main/assets/gift.json @@ -0,0 +1,6 @@ +[{"name":":qiyuan01:","name_real":"臭鸡蛋","redbean":2,"pic":"R.drawable.lw_cjd"},{"name":":qiyuan02:","name_real":"飞吻","redbean":2,"pic":"R.drawable.lw_fw"},{"name":":qiyuan03:","name_real":"赞","redbean":2,"pic":"R.drawable.lw_dz"}, +{"name":":qiyuan04:","name_real":"1朵玫瑰","redbean":5,"pic":"R.drawable.lw_cjd"},{"name":":qiyuan05:","name_real":"棒棒糖","redbean":5,"pic":"R.drawable.lw_cjd"},{"name":":qiyuan06:","name_real":"啤酒","redbean":5,"pic":"R.drawable.lw_cjd"}, +{"name":":qiyuan07:","name_real":"爱神","redbean":10,"pic":"R.drawable.lw_cjd"},{"name":":qiyuan08:","name_real":"蛋糕","redbean":10,"pic":"R.drawable.lw_cjd"},{"name":":qiyuan09:","name_real":"3朵玫瑰","redbean":10,"pic":"R.drawable.lw_cjd"}, +{"name":":qiyuan10:","name_real":"巧克力","redbean":10,"pic":"R.drawable.lw_cjd"},{"name":":qiyuan11:","name_real":"单身狗","redbean":10,"pic":"R.drawable.lw_cjd"},{"name":":qiyuan12:","name_real":"口红","redbean":20,"pic":"R.drawable.lw_cjd"}, +{"name":":qiyuan13:","name_real":"99朵玫瑰","redbean":60,"pic":"R.drawable.lw_cjd"},{"name":":qiyuan14:","name_real":"戒指","redbean":60,"pic":"R.drawable.lw_cjd"},{"name":":qiyuan15:","name_real":"飞机","redbean":100,"pic":"R.drawable.lw_cjd"}, +{"name":":qiyuan16:","name_real":"游艇","redbean":100,"pic":"R.drawable.lw_cjd"}] \ No newline at end of file diff --git a/JQ_ELOVE/src/main/assets/province.json b/JQ_ELOVE/src/main/assets/province.json new file mode 100644 index 0000000000000000000000000000000000000000..d0ddbd8d7f33a03e3ee57d00efd96ecf204ce0aa --- /dev/null +++ b/JQ_ELOVE/src/main/assets/province.json @@ -0,0 +1,33 @@ +[ +{"ProID":110000, "name":"北京市"}, +{"ProID":120000, "name":"天津市"}, +{"ProID":130000, "name":"河北省"}, +{"ProID":140000, "name":"山西省"}, +{"ProID":150000, "name":"内蒙古自治区"}, +{"ProID":210000, "name":"辽宁省"}, +{"ProID":220000, "name":"吉林省"}, +{"ProID":230000, "name":"黑龙江省"}, +{"ProID":310000, "name":"上海市"}, +{"ProID":320000, "name":"江苏省"}, +{"ProID":330000, "name":"浙江省"}, +{"ProID":340000, "name":"安徽省"}, +{"ProID":350000, "name":"福建省"}, +{"ProID":360000, "name":"江西省"}, +{"ProID":370000, "name":"山东省"}, +{"ProID":410000, "name":"河南省"}, +{"ProID":420000, "name":"湖北省"}, +{"ProID":430000, "name":"湖南省"}, +{"ProID":440000, "name":"广东省"}, +{"ProID":450000, "name":"广西壮族自治区"}, +{"ProID":460000, "name":"海南省"}, +{"ProID":500000, "name":"重庆市"}, +{"ProID":510000, "name":"四川省"}, +{"ProID":520000, "name":"贵州省"}, +{"ProID":530000, "name":"云南省"}, +{"ProID":540000, "name":"西藏自治区"}, +{"ProID":610000, "name":"陕西省"}, +{"ProID":620000, "name":"甘肃省"}, +{"ProID":630000, "name":"青海省"}, +{"ProID":640000, "name":"宁夏回族自治区"}, +{"ProID":650000, "name":"新疆维吾尔自治区"} +] diff --git a/JQ_ELOVE/src/main/assets/school.json b/JQ_ELOVE/src/main/assets/school.json new file mode 100644 index 0000000000000000000000000000000000000000..b735b31c1a02a864db9487a28bb7ccb8bdb58452 --- /dev/null +++ b/JQ_ELOVE/src/main/assets/school.json @@ -0,0 +1,35 @@ +[{"id":"00","data":["合肥工业大学","中国科学技术大学","安徽大学","安徽理工大学","安徽工业大学","安徽工程大学","安徽农业大学","安徽医科大学","安徽师范大学","淮北师范大学","安徽财经大学","安徽三联学院","安徽建筑工业学院","安徽文达信息工程学院","安徽中医学院","皖南医学院","蚌埠医学院","淮南师范学院","安徽科技学院","阜阳师范学院","安庆师范学院","合肥师范学院","安徽外国语学院","滁州学院","池州学院","皖西学院","宿州学院","黄山学院","巢湖学院","蚌埠学院","铜陵学院","安徽新华学院","合肥学院","安徽医学高等专科学校","安徽中医药高等专科学校","安庆医药高等专科学校","合肥幼儿师范高等专科学校","亳州师范高等专科学校","桐城师范高等专科学校","马鞍山师范高等专科学校","安徽汽车职业技术学院","皖西卫生职业学院","安徽职业技术学院","芜湖职业技术学院","安徽水利水电职业技术学院","淮北职业技术学院","安徽警官职业学院","安徽商贸职业技术学院","淮南职业技术学院","淮南联合大学","民办万博科技职业学院","铜陵职业技术学院","安徽财贸职业学院","安徽国际商务职业学院","马鞍山职业技术学院","安徽人口职业学院","安徽新闻出版职业技术学院","安徽城市管理职业学院","安徽林业职业技术学院","徽商职业学院","滁州职业技术学院","民办安徽旅游职业学院","安徽邮电职业技术学院","安庆职业技术学院","安徽广播影视职业技术学院","安徽涉外经济职业学院","安徽公安职业学院","安徽审计职业学院","宣城职业技术学院","亳州职业技术学院","安徽中澳科技职业学院","安徽工业职业技术学院","安徽机电职业技术学院","安徽绿海商务职业学院","合肥共达职业技术学院","合肥科技职业学院","蚌埠经济技术职业学院","合肥职业技术学院","阜阳科技职业学院","池州职业技术学院","安徽矿业职业技术学院","安徽黄梅戏艺术职业学院","六安职业技术学院","民办合肥滨湖职业技术学院","合肥通用职业技术学院","安徽体育运动职业技术学院","安徽粮食工程职业学院","合肥信息技术职业学院","安徽艺术职业学院","民办合肥经济技术职业学院","安徽国防科技职业学院","安徽工商职业学院","宿州职业技术学院","安徽冶金科技职业学院","阜阳职业技术学院","安徽工业经济职业技术学院","安徽电子信息职业技术学院","安徽交通职业技术学院","安徽电气工程职业技术学院","安徽工贸职业技术学院","安徽长江职业学院","安徽扬子职业技术学院","安徽现代信息工程职业学院","民办合肥财经职业学院","芜湖信息技术职业学院","黄山职业技术学院","滁州城市职业学院"]}, + {"id":"01","data":["澳门高等校际学院","澳门理工学院","澳门科技大学","联合国大学-国际软件技术研究所","澳门大学"]}, + {"id":"02","data":["北京大学","中国人民大学","清华大学","北京交通大学","北京科技大学","中国石油大学(北京)","中国矿业大学(北京)","中国地质大学(北京)","北京邮电大学","华北电力大学(北京)","北京化工大学","中国农业大学","北京林业大学","北京中医药大学","北京师范大学","北京外国语大学","北京语言大学","对外经济贸易大学","中央财经大学","中国政法大学","中央民族大学","中国人民公安大学","北京协和医学院","北京体育大学","北京理工大学","北京航空航天大学","北京信息科技大学","北京工商大学","北京联合大学","北京工业大学","北方工业大学","首都医科大学","首都师范大学","首都经济贸易大学","中国传媒大学","国际关系学院","中央戏剧学院","中央美术学院","中央音乐学院","北京电子科技学院","外交学院","中国劳动关系学院","中国青年政治学院","中华女子学院","北京服装学院","北京建筑工程学院","北京印刷学院","首钢工学院","北京石油化工学院","北京农学院","首都体育学院","北京第二外国语学院","北京物资学院","北京警察学院","中国音乐学院","中国戏曲学院","北京电影学院","北京舞蹈学院","北京城市学院","北京青年政治学院","北京交通运输职业学院","北京信息职业技术学院","北京科技经营管理学院","北京电子科技职业学院","北京工业职业技术学院","北京科技职业学院","北京戏曲艺术职业学院","北京农业职业学院","北京汇佳职业学院","北京财贸职业学院","北京经济技术职业学院","北京北大方正软件职业技术学院","北京交通职业技术学院","北京培黎职业学院","北京吉利大学","北京经济管理职业学院","北京卫生职业学院","北京政法职业学院","北京体育职业学院","北京社会管理职业学院","北京新圆明职业学院","北京现代职业技术学院","北京京北职业技术学院","北京经贸职业学院","北京劳动保障职业学院","清华大学五道口金融学院","财政部财政科学研究所","中国科学院","中国农业科学院","中国社会科学院研究生院"]}, + {"id":"03","data":["重庆大学","西南大学","重庆交通大学","重庆邮电大学","重庆理工大学","重庆医科大学","重庆师范大学","重庆工商大学","西南政法大学","重庆科技学院","长江师范学院","重庆第二师范学院","四川外语学院","重庆警察学院","四川美术学院","重庆三峡学院","重庆文理学院","重庆电力高等专科学校","重庆三峡医药高等专科学校","重庆医药高等专科学校","重庆化工职业学院","重庆工业职业技术学院","重庆正大软件职业技术学院","重庆城市管理职业学院","重庆公共运输职业学院","重庆安全技术职业学院","重庆三峡职业学院","重庆工贸职业技术学院","重庆民生职业技术学院","重庆轻工职业学院","重庆机电职业技术学院","重庆电信职业学院","重庆电子工程职业学院","重庆城市职业学院","重庆水利电力职业技术学院","重庆商务职业学院","重庆电讯职业学院","重庆能源职业学院","重庆传媒职业学院","重庆工商职业学院","重庆经贸职业学院","重庆建筑工程职业学院","重庆青年职业技术学院","重庆财经职业学院","重庆科创职业学院","重庆房地产职业学院","重庆海联职业技术学院","重庆信息技术职业学院","重庆航天职业技术学院","重庆工程职业技术学院","重庆艺术工程职业学院","重庆旅游职业学院","重庆交通职业学院"]}, + {"id":"04","data":["厦门大学","华侨大学","福建农林大学","集美大学","福州大学","仰恩大学","福建医科大学","福建中医药大学","福建师范大学","厦门理工学院","闽南理工学院","福建工程学院","宁德师范学院","泉州师范学院","漳州师范学院","福州外语外贸学院","福建警察学院","闽江学院","三明学院","龙岩学院","莆田学院","武夷学院","福建江夏学院","厦门医学高等专科学校","泉州医学高等专科学校","福建幼儿师范高等专科学校","泉州幼儿师范高等专科学校","福建商业高等专科学校","福州英华职业学院","福建船政交通职业学院","厦门华厦职业学院","泉州纺织服装职业学院","漳州职业技术学院","黎明职业大学","福建华南女子职业学院","闽西职业技术学院","福州黎明职业技术学院","厦门东海职业技术学院","漳州卫生职业学院","福州职业技术学院","福州海峡职业技术学院","泉州理工职业学院","福建警官职业学院","闽北职业技术学院","泉州华光摄影艺术职业学院","福建林业职业技术学院","泉州经贸职业技术学院","福建卫生职业技术学院","厦门华天涉外职业技术学院","漳州理工职业学院","厦门兴才职业技术学院","泉州信息职业技术学院","湄洲湾职业技术学院","福州软件职业技术学院","福州科技职业技术学院","福建艺术职业学院","福建生物工程职业技术学院","德化陶瓷职业技术学院","福建体育职业技术学院","宁德职业技术学院","厦门软件职业技术学院","三明职业技术学院","福建对外经济贸易职业技术学院","厦门海洋职业技术学院","福建农业职业技术学院","福建信息职业技术学院","厦门演艺职业学院","武夷山职业学院","福建电力职业技术学院","漳州科技职业学院","厦门城市职业学院","厦门南洋职业学院","漳州城市职业学院","福建水利电力职业技术学院","泉州轻工职业学院","泉州泰山航海职业学院","厦门安防科技职业学院"]}, + {"id":"05","data":["兰州大学","西北民族大学","兰州理工大学","兰州交通大学","甘肃农业大学","西北师范大学","兰州工业学院","甘肃中医学院","陇东学院","甘肃民族师范学院","天水师范学院","兰州商学院","甘肃政法学院","河西学院","兰州城市学院","平凉医学高等专科学校","张掖医学高等专科学校","陇南师范高等专科学校","定西师范高等专科学校","甘肃机电职业技术学院","甘肃联合大学","兰州石化职业技术学院","兰州资源环境职业技术学院","甘肃畜牧工程职业技术学院","甘肃农业职业技术学院","甘肃警察职业学院","甘肃交通职业技术学院","武威职业学院","甘肃有色冶金职业技术学院","白银矿冶职业技术学院","甘肃钢铁职业技术学院","甘肃工业职业技术学院","兰州职业技术学院","酒泉职业技术学院","甘肃建筑职业技术学院","甘肃林业职业技术学院","兰州外语职业学院"]}, + {"id":"06","data":["中山大学","华南理工大学","暨南大学","汕头大学","深圳大学","五邑大学","广东工业大学","南方科技大学","华南农业大学","广东海洋大学","广州中医药大学","南方医科大学","华南师范大学","广东外语外贸大学","广州大学","北京师范大学-香港浸会大学联合国际学院","广东石油化工学院","肇庆学院","东莞理工学院","广东科技学院","仲恺农业工程学院","广东医学院","广州医学院","广东药学院","韶关学院","湛江师范学院","嘉应学院","韩山师范学院","惠州学院","广东第二师范学院","广东商学院","广东金融学院","广东警官学院","广州体育学院","广州美术学院","星海音乐学院","广东技术师范学院","广东培正学院","佛山科学技术学院","广东白云学院","广州航海高等专科学校","肇庆医学高等专科学校","私立华联学院","民办南华工商学院","广州民航职业技术学院","广东食品药品职业学院","广东松山职业技术学院","深圳职业技术学院","潮汕职业技术学院","顺德职业技术学院","广东新安职业技术学院","广东农工商职业技术学院","广东交通职业技术学院","广东水利电力职业技术学院","广东轻工职业技术学院","佛山职业技术学院","广州珠江职业技术学院","广州现代信息工程职业技术学院","广东亚视演艺职业学院","清远职业技术学院","汕头职业技术学院","广东邮电职业技术学院","揭阳职业技术学院","广州南洋理工职业学院","广州科技职业技术学院","广东科贸职业学院","深圳信息职业技术学院","中山职业技术学院","广东司法警官职业学院","广州松田职业学院","广东省外语艺术职业学院","广东文理职业学院","广州番禺职业技术学院","广州铁路职业技术学院","广州华南商贸职业学院","广州华立科技职业学院","广州城市职业学院","广东工程职业技术学院","广州科技贸易职业学院","肇庆工商职业技术学院","广东体育职业技术学院","广东行政职业学院","广东文艺职业学院","广州体育职业技术学院","广东科学技术职业学院","中山火炬职业技术学院","江门职业技术学院","茂名职业技术学院","广州工程技术职业学院","广州涉外经济职业技术学院","惠州经济职业技术学院","广州城建职业学院","肇庆科技职业技术学院","珠海艺术职业学院","南海东软信息技术职业学院","广州康大职业技术学院","广州工商职业技术学院","广东青年职业学院","广州东华职业学院","广东创新科技职业学院","广东工贸职业技术学院","珠海城市职业技术学院","汕尾职业技术学院","广东财经职业学院","广东职业技术学院","罗定职业技术学院","河源职业技术学院","广东岭南职业技术学院","广东女子职业技术学院","广东建设职业技术学院","广东机电职业技术学院","广东理工职业学院","惠州卫生职业技术学院","阳江职业技术学院","广东舞蹈戏剧职业学院","广东南方职业学院","广州华商职业学院","广州华夏职业学院","广东环境保护工程职业学院","广东信息工程职业学院","东莞职业技术学院"]}, + {"id":"07","data":["广西大学","桂林电子科技大学","桂林理工大学","广西医科大学","广西中医药大学","广西师范大学","广西民族大学","桂林航天工业学院","广西工学院","桂林医学院","右江民族医学院","广西师范学院","广西民族师范学院","河池学院","玉林师范学院","广西外国语学院","广西财经学院","广西艺术学院","百色学院","贺州学院","钦州学院","梧州学院","柳州医学高等专科学校","柳州师范高等专科学校","桂林师范高等专科学校","广西幼儿师范高等专科学校","桂林旅游高等专科学校","广西警官高等专科学校","广西体育高等专科学校","广西科技职业学院","广西卫生职业技术学院","广西机电职业技术学院","广西职业技术学院","柳州职业技术学院","南宁职业技术学院","广西国际商务职业技术学院","广西经贸职业技术学院","北海职业学院","北海艺术设计职业学院","广西现代职业技术学院","桂林山水职业学院","广西演艺职业学院","广西工业职业技术学院","广西电力职业技术学院","广西经济职业学院","广西生态工程职业技术学院","贵港职业学院","广西城市职业学院","广西工商职业技术学院","百色职业学院","广西农业职业技术学院","广西工程职业学院","柳州铁道职业技术学院","广西理工职业技术学院","梧州职业学院","广西英华国际职业学院","广西建设职业技术学院","广西水利电力职业技术学院","广西交通职业技术学院","柳州城市职业学院","邕江大学"]}, + {"id":"08","data":["贵州大学","贵州师范大学","贵州财经大学","贵州民族大学","贵阳医学院","遵义医学院","贵阳中医学院","毕节学院","遵义师范学院","黔南民族师范学院","六盘水师范学院","兴义民族师范学院","贵州师范学院","安顺学院","贵阳学院","凯里学院","铜仁学院","黔南民族医学高等专科学校","遵义医药高等专科学校","贵州商业高等专科学校","贵州航天职业技术学院","贵州电子信息职业技术学院","贵州交通职业技术学院","贵州警官职业学院","遵义职业技术学院","贵阳护理职业学院","贵州工业职业技术学院","贵州盛华职业学院","黔东南民族职业技术学院","安顺职业技术学院","贵州职业技术学院","毕节职业技术学院","贵州电力职业技术学院","贵州工商职业学院","黔南民族职业技术学院","铜仁职业技术学院","贵州亚泰职业学院","贵州轻工职业技术学院","贵阳职业技术学院","六盘水职业技术学院","黔西南民族职业技术学院"]}, + {"id":"09","data":["海南大学","海南师范大学","海口经济学院","海南医学院","海南热带海洋学院","三亚学院","琼台师范高等专科学校","海南职业技术学院","三亚城市职业学院","海南科技职业学院","三亚航空旅游职业学院","海南软件职业技术学院","海南经贸职业技术学院","海南工商职业学院","三亚理工职业学院","海南政法职业学院","海南外国语职业学院"]}, + {"id":"10","data":["河北大学","河北工业大学","华北电力大学(保定)","燕山大学","河北联合大学","河北科技大学","石家庄铁道大学","河北工程大学","河北农业大学","河北医科大学","河北师范大学","河北经贸大学","中国人民武装警察部队学院","中央司法警官学院","防灾科技学院","华北科技学院","北华航天工业学院","河北建筑工程学院","石家庄经济学院","河北科技学院","承德医学院","唐山师范学院","廊坊师范学院","沧州师范学院","河北民族师范学院","邢台学院","河北科技师范学院","河北外国语学院","河北金融学院","河北体育学院","河北传媒学院","河北美术学院","邯郸学院","衡水学院","石家庄学院","保定学院","唐山学院","河北北方学院","承德石油高等专科学校","河北工程技术高等专科学校","石家庄人民医学高等专科学校","邢台医学高等专科学校","石家庄医学高等专科学校","沧州医学高等专科学校","石家庄幼儿师范高等专科学校","承德护理职业学院","河北化工医药职业技术学院","邯郸职业技术学院","张家口职业技术学院","沧州职业技术学院","保定职业技术学院","石家庄铁路职业技术学院","河北能源职业技术学院","石家庄职业技术学院","邢台职业技术学院","河北工业职业技术学院","石家庄科技职业学院","河北劳动关系职业学院","唐山职业技术学院","渤海石油职业学院","石家庄科技工程职业学院","石家庄邮电职业技术学院","河北司法警官职业学院","冀中职业学院","石家庄工商职业学院","石家庄经济职业学院","石家庄城市职业学院","石家庄工程职业学院","河北省艺术职业学院","河北旅游职业学院","河北女子职业技术学院","廊坊职业技术学院","保定电力职业技术学院","河北机电职业技术学院","石家庄科技信息职业学院","河北公安警察职业学院","石家庄外国语职业学院","河北建材职业技术学院","河北政法职业学院","河北石油职业技术学院","唐山工业职业技术学院","衡水职业技术学院","秦皇岛职业技术学院","唐山科技职业技术学院","泊头职业学院","河北轨道运输职业技术学院","宣化科技职业学院","廊坊东方职业技术学院","廊坊卫生职业学院","河北软件职业技术学院","石家庄理工职业学院","石家庄信息工程职业学院","河北交通职业技术学院","石家庄财经职业学院","河北外国语职业学院","廊坊燕京职业技术学院"]}, + {"id":"11","data":["郑州大学","河南大学","河南科技大学","河南理工大学","河南工业大学","河南农业大学","河南师范大学","河南财经政法大学","郑州华信学院","郑州科技学院","华北水利水电学院","郑州轻工业学院","中原工学院","郑州航空工业管理学院","河南城建学院","安阳工学院","南阳理工学院","黄河科技学院","河南工程学院","商丘工学院","洛阳理工学院","河南中医学院","新乡医学院","信阳师范学院","周口师范学院","商丘师范学院","安阳师范学院","南阳师范学院","洛阳师范学院","郑州师范学院","郑州升达经贸管理学院","郑州成功财经学院","河南警察学院","河南科技学院","新乡学院","平顶山学院","黄淮学院","许昌学院","商丘学院","铁道警官高等专科学校","郑州电力高等专科学校","河南机电高等专科学校","郑州牧业工程高等专科学校","信阳农业高等专科学校","南阳医学高等专科学校","商丘医学高等专科学校","漯河医学高等专科学校","郑州澍青医学高等专科学校","安阳幼儿师范高等专科学校","郑州幼儿师范高等专科学校","焦作师范高等专科学校","河南财政税务高等专科学校","河南商业高等专科学校","焦作工贸职业学院","河南化工职业学院","郑州理工职业学院","郑州信息工程职业学院","河南艺术职业学院","开封文化艺术职业学院","三门峡职业技术学院","郑州铁路职业技术学院","黄河水利职业技术学院","漯河职业技术学院","开封大学","河南职业技术学院","中州大学","焦作大学","许昌职业技术学院","郑州信息科技职业学院","郑州经贸职业学院","河南工业职业技术学院","河南司法警官职业学院","周口职业技术学院","鹤壁职业技术学院","平顶山工业职业技术学院","商丘职业技术学院","濮阳职业技术学院","嵩山少林武术职业学院","许昌电气职业学院","河南护理职业学院","河南机电职业学院","郑州电力职业技术学院","安阳职业技术学院","信阳涉外职业技术学院","郑州电子信息职业技术学院","洛阳职业技术学院","郑州工业安全职业学院","永城职业学院","郑州旅游职业学院","郑州职业技术学院","信阳职业技术学院","郑州商贸旅游职业学院","新乡职业技术学院","驻马店职业技术学院","河南经贸职业学院","河南交通职业技术学院","河南农业职业学院","南阳职业学院","济源职业技术学院","周口科技职业学院","河南推拿职业学院","郑州城市职业学院","河南检察职业学院","河南工业贸易职业学院","郑州黄河护理职业学院","河南质量工程职业学院","漯河食品职业学院","郑州交通职业学院","河南建筑职业技术学院","鹤壁汽车工程职业学院","许昌陶瓷职业学院","长垣烹饪职业技术学院"]}, + {"id":"12","data":["东北林业大学","哈尔滨工业大学","哈尔滨工程大学","黑龙江大学","佳木斯大学","齐齐哈尔大学","哈尔滨理工大学","东北石油大学","东北农业大学","黑龙江八一农垦大学","哈尔滨医科大学","黑龙江中医药大学","哈尔滨师范大学","哈尔滨商业大学","哈尔滨学院","黑龙江工程学院","齐齐哈尔工程学院","黑龙江科技学院","哈尔滨远东理工学院","哈尔滨石油学院","齐齐哈尔医学院","牡丹江医学院","牡丹江师范学院","大庆师范学院","黑龙江外国语学院","哈尔滨金融学院","哈尔滨德强商务学院","哈尔滨体育学院","黑龙江东方学院","绥化学院","哈尔滨剑桥学院","哈尔滨广厦学院","黑河学院","哈尔滨华德学院","黑龙江护理高等专科学校","大庆医学高等专科学校","齐齐哈尔高等师范专科学校","黑龙江幼儿师范高等专科学校","鹤岗师范高等专科学校","鸡西大学","黑龙江司法警官职业学院","黑龙江建筑职业技术学院","牡丹江大学","伊春职业学院","黑龙江农垦职业学院","黑龙江农业职业技术学院","黑龙江林业职业技术学院","黑龙江农业工程职业学院","大庆职业学院","黑龙江农业经济职业学院","黑龙江旅游职业技术学院","大兴安岭职业学院","黑龙江职业学院","哈尔滨现代公共关系职业学院","黑龙江三江美术职业学院","黑龙江煤炭职业技术学院","黑龙江信息技术职业学院","黑龙江生态工程职业学院","七台河职业学院","黑龙江艺术职业学院","哈尔滨华夏计算机职业技术学院","黑龙江生物科技职业学院","黑龙江公安警官职业学院","黑龙江农垦科技职业学院","黑龙江商业职业学院","哈尔滨科学技术职业学院","黑龙江民族职业学院","哈尔滨铁道职业技术学院","黑龙江粮食职业学院","哈尔滨江南职业技术学院","哈尔滨应用职业技术学院","黑龙江交通职业技术学院","佳木斯职业学院","齐齐哈尔理工职业学院","哈尔滨工程技术职业学院","哈尔滨职业技术学院","哈尔滨电力职业技术学院"]}, + {"id":"13","data":["武汉大学","中南财经政法大学","华中科技大学","武汉理工大学","中国地质大学(武汉)","华中农业大学","华中师范大学","中南民族大学","湖北大学","长江大学","江汉大学","三峡大学","武汉科技大学","湖北工业大学","武汉工程大学","武汉纺织大学","湖北中医药大学","荆楚理工学院","武汉工业学院","湖北汽车工业学院","武昌工学院","武昌理工学院","湖北医药学院","湖北师范学院","黄冈师范学院","湖北工程学院","湖北第二师范学院","湖北经济学院","武汉长江工商学院","湖北警官学院","武汉体育学院","湖北美术学院","武汉音乐学院","湖北民族学院","湖北科技学院","湖北理工学院","湖北文理学院","武汉生物工程学院","汉口学院","武汉东湖学院","湖北中医药高等专科学校","郧阳师范高等专科学校","武汉工贸职业学院","鄂州职业大学","荆州理工职业学院","武汉商业服务学院","恩施职业技术学院","襄阳职业技术学院","湖北职业技术学院","十堰职业技术学院","长江职业学院","武汉职业技术学院","武汉船舶职业技术学院","黄冈职业技术学院","武汉信息传播职业技术学院","湖北财税职业学院","武汉城市职业学院","湖北国土资源职业学院","咸宁职业技术学院","鄂东职业技术学院","黄冈科技职业学院","湖北艺术职业学院","三峡旅游职业技术学院","江汉艺术职业学院","湖北生态工程职业技术学院","长江工程职业技术学院","湖北生物科技职业学院","天门职业学院","随州职业技术学院","武汉警官职业学院","湖北开放职业学院","武汉科技职业学院","武汉交通职业学院","武汉商贸职业学院","武汉外语外事职业学院","湖北水利水电职业技术学院","湖北城市建设职业技术学院","武昌职业学院","湖北三峡职业技术学院","武汉民政职业学院","湖北体育职业学院","襄阳汽车职业技术学院","武汉航海职业技术学院","三峡电力职业学院","武汉铁路职业技术学院","湖北科技职业学院","湖北青年职业学院","黄石职业技术学院","武汉工业职业技术学院","武汉电力职业技术学院","仙桃职业学院","武汉工程职业技术学院","荆州职业技术学院","武汉软件工程职业学院","湖北轻工职业技术学院","湖北交通职业技术学院"]}, + {"id":"14","data":["国防科学技术大学","中南大学","湖南大学","湘潭大学","湖南科技大学","吉首大学","长沙理工大学","南华大学","湖南工业大学","湖南农业大学","湖南中医药大学","湖南师范大学","长沙学院","湖南第一师范学院","湖南工学院","湖南理工学院","湖南城市学院","湖南工程学院","中南林业科技大学","长沙医学院","衡阳师范学院","湘南学院","湖南涉外经济学院","湖南财政经济学院","湖南商学院","湖南警察学院","湖南女子学院","湖南科技学院","湖南人文科技学院","湖南文理学院","邵阳学院","怀化学院","怀化医学高等专科学校","邵阳医学高等专科学校","益阳医学高等专科学校","湖南中医药高等专科学校","株洲师范高等专科学校","长沙师范学校","湖南税务高等专科学校","长沙航空职业技术学院","湖南冶金职业技术学院","湖南信息职业技术学院","湖南大众传媒职业技术学院","湖南工业职业技术学院","湖南环境生物职业技术学院","湖南铁道职业技术学院","长沙民政职业技术学院","永州职业技术学院","湖南外国语职业学院","湖南电子科技职业学院","湖南都市职业学院","湖南科技经贸职业学院","湖南软件职业学院","湖南信息科学职业学院","湘西民族职业技术学院","衡阳财经工业职业技术学院","益阳职业技术学院","湖南同德职业学院","湖南体育职业学院","湖南艺术职业学院","湖南司法警官职业学院","湖南工程职业技术学院","湖南工艺美术职业学院","湖南电气职业技术学院","湖南民族职业学院","湖南外贸职业学院","邵阳职业技术学院","湖南吉利汽车职业技术学院","湖南水利水电职业技术学院","长沙商贸旅游职业技术学院","湖南科技工业职业技术学院","湖南有色金属职业技术学院","湖南食品药品职业学院","长沙卫生职业学院","湖南网络工程职业学院","长沙环境保护职业技术学院","张家界航空工业职业技术学院","长沙电力职业技术学院","株洲职业技术学院","湖南石油化工职业技术学院","湖南城建职业技术学院","湖南化工职业技术学院","潇湘职业学院","长沙职业技术学院","怀化职业技术学院","岳阳职业技术学院","常德职业技术学院","湖南交通职业技术学院","娄底职业技术学院","湖南理工职业技术学院","长沙通信职业技术学院","湖南九嶷职业技术学院","湘潭职业技术学院","湖南商务职业技术学院","郴州职业技术学院","湖南生物机电职业技术学院","保险职业学院","湖南科技职业学院","湖南现代物流职业技术学院","湖南安全技术职业学院","湖南高速铁路职业技术学院","湖南机电职业技术学院","湖南铁路科技职业技术学院","湖南三一工业职业技术学院","长沙南方职业学院","湖南高尔夫旅游职业学院","湖南工商职业学院"]}, + {"id":"15","data":["吉林大学","东北师范大学","延边大学","北华大学","长春大学","长春理工大学","长春工业大学","吉林农业大学","长春中医药大学","吉林师范大学","吉林财经大学","东北电力大学","长春工程学院","吉林建筑工程学院","吉林化工学院","长春建筑学院","吉林农业科技学院","吉林医药学院","通化师范学院","白城师范学院","吉林工程技术师范学院","长春师范学院","吉林华桥外国语学院","吉林工商学院","吉林警察学院","吉林体育学院","吉林艺术学院","吉林动画学院","长春汽车工业高等专科学校","长春医学高等专科学校","白城医学高等专科学校","长春金融高等专科学校","吉林科技职业技术学院","四平职业大学","辽源职业技术学院","长春东方职业学院","吉林交通职业技术学院","吉林铁道职业技术学院","吉林司法警官职业学院","白城职业技术学院","吉林工业职业技术学院","吉林电子信息职业技术学院","长白山职业技术学院","松原职业技术学院","长春信息技术职业学院","延边职业技术学院","长春职业技术学院","吉林农业工程职业技术学院","吉林城市职业技术学院"]}, + {"id":"16","data":["南京大学","东南大学","中国矿业大学(徐州)","河海大学","江南大学","南京农业大学","中国药科大学","南京理工大学","南京航空航天大学","苏州大学","扬州大学","江苏大学","江苏科技大学","南京邮电大学","南京工业大学","常州大学","南京林业大学","南京医科大学","南京中医药大学","南京师范大学","江苏师范大学","南京财经大学","南通大学","西交利物浦大学","南京森林警察学院","南京信息工程大学","金陵科技学院","徐州工程学院","盐城工学院","淮阴工学院","常州工学院","南京工程学院","淮海工学院","徐州医学院","盐城师范学院","南京晓庄学院","苏州科技学院","江苏技术师范学院","淮阴师范学院","南京审计学院","江苏警官学院","南京体育学院","南京艺术学院","常熟理工学院","三江学院","无锡太湖学院","连云港师范高等专科学校","泰州师范高等专科学校","徐州幼儿师范高等专科学校","镇江市高等专科学校","江苏畜牧兽医职业技术学院","无锡职业技术学院","南通纺织职业技术学院","苏州工艺美术职业技术学院","南京工业职业技术学院","无锡商业职业技术学院","泰州职业技术学院","南通职业大学","连云港职业技术学院","民办明达职业技术学院","苏州职业大学","江苏城市职业学院","沙洲职业工学院","扬州市职业大学","江苏建筑职业技术学院","南通航运职业技术学院","宿迁职业技术学院","江苏信息职业技术学院","江苏农林职业技术学院","江苏食品职业技术学院","徐州工业职业技术学院","常州机电职业技术学院","常州轻工职业技术学院","南京旅游职业学院","常州工程职业技术学院","南京信息职业技术学院","苏州高博软件技术职业学院","盐城卫生职业技术学院","苏州工业职业技术学院","江阴职业技术学院","南京城市职业学院","徐州生物工程职业技术学院","苏州信息职业技术学院","南京机电职业技术学院","江苏建康职业学院","苏州卫生职业技术学院","江苏海事职业技术学院","苏州经贸职业技术学院","江苏经贸职业技术学院","南京特殊教育职业技术学院","扬州环境资源职业技术学院","金肯职业技术学院","应天职业技术学院","南京化工职业技术学院","炎黄职业技术学院","苏州农业职业技术学院","无锡工艺职业技术学院","常州纺织服装职业技术学院","紫琅职业技术学院","常州信息职业技术学院","健雄职业技术学院","江苏财经职业技术学院","盐城纺织职业技术学院","扬州工业职业技术学院","江海职业技术学院","南京铁道职业技术学院","九州职业技术学院","江苏联合职业技术学院","金山职业技术学院","无锡科技职业学院","硅湖职业技术学院","无锡城市职业技术学院","苏州托普信息职业技术学院","正德职业技术学院","江南影视艺术职业学院","南通农业职业技术学院","苏州工业园区职业技术学院","太湖创意职业技术学院","淮安信息职业技术学院","无锡南洋职业技术学院","钟山职业技术学院","南京交通职业技术学院","建东职业技术学院","南京视觉艺术职业学院","昆山登云科技职业学院","苏州港大思培科技职业学院","宿迁泽达职业技术学院","苏州工业园区服务外包职业学院"]}, + {"id":"17","data":["南昌大学","江西理工大学","华东交通大学","东华理工大学","南昌航空大学","江西农业大学","江西师范大学","江西科技师范大学","江西财经大学","井冈山大学","景德镇陶瓷学院","南昌工程学院","南昌理工学院","南昌工学院","江西中医学院","赣南医学院","上饶师范学院","赣南师范学院","江西警察学院","江西服装学院","九江学院","江西科技学院","新余学院","宜春学院","江西中医药高等专科学校","南昌师范高等专科学校","景德镇高等专科学校","萍乡高等专科学校","江西护理职业技术学院","九江职业技术学院","江西工业职业技术学院","九江职业大学","江西泰豪动漫职业学院","江西先锋软件职业技术学院","江西工业贸易职业技术学院","江西枫林涉外经贸职业学院","江西司法警官职业学院","江西城市职业学院","江西太阳能科技职业学院","江西生物科技职业学院","江西电力职业技术学院","江西外语外贸职业学院","宜春职业技术学院","江西旅游商贸职业学院","抚州职业技术学院","江西青年职业学院","江西工程职业学院","江西建设职业技术学院","江西管理职业学院","江西农业工程职业学院","江西航空职业技术学院","江西经济管理职业学院","上饶职业技术学院","江西应用工程职业学院","江西制造职业技术学院","景德镇陶瓷职业技术学院","鹰潭职业技术学院","江西应用技术职业学院","江西渝州科技职业学院","共青科技职业学院","江西冶金职业技术学院","江西机电职业技术学院","江西新闻出版职业技术学院","江西现代职业技术学院","江西艺术职业学院","赣西科技职业学院","江西科技职业学院","江西交通职业技术学院","南昌职业学院","江西工业工程职业技术学院","江西工商职业技术学院","江西信息应用职业技术学院","江西环境工程职业学院","江西陶瓷工艺美术职业技术学院","江西财经职业学院"]}, + {"id":"18","data":["大连理工大学","东北大学","大连海事大学","辽宁大学","大连大学","沈阳大学","沈阳理工大学","辽宁工程技术大学","沈阳工业大学","沈阳建筑大学","辽宁石油化工大学","大连交通大学","沈阳化工大学","辽宁科技大学","大连工业大学","辽宁工业大学","沈阳航空航天大学","沈阳农业大学","大连海洋大学","中国医科大学","大连医科大学","辽宁中医药大学","沈阳药科大学","辽宁师范大学","沈阳师范大学","渤海大学","东北财经大学","大连民族学院","中国刑事警察学院","沈阳工程学院","辽宁科技学院","大连东软信息学院","大连科技学院","辽宁医学院","沈阳医学院","辽宁何氏医学院","鞍山师范学院","大连外国语学院","辽宁财贸学院","沈阳体育学院","鲁迅美术学院","沈阳音乐学院","大连艺术学院","辽东学院","辽宁对外经贸学院","辽宁交通高等专科学校","朝阳师范高等专科学校","抚顺师范高等专科学校","铁岭师范高等专科学校","锦州师范高等专科学校","辽宁税务高等专科学校","辽宁警官高等专科学校","阜新高等专科学校","辽宁城市建设职业技术学院","辽宁冶金职业技术学院","辽宁工程职业学院","铁岭卫生职业学院","辽宁卫生职业技术学院","抚顺职业技术学院","辽阳职业技术学院","大连职业技术学院","渤海船舶职业学院","盘锦职业技术学院","大连商务职业学院","辽宁农业职业技术学院","营口职业技术学院","沈阳职业技术学院","辽宁金融职业学院","辽河石油职业技术学院","辽宁装备制造职业技术学院","辽宁现代服务职业技术学院","辽宁政法职业学院","沈阳北软信息职业技术学院","辽宁体育运动职业技术学院","辽宁职业学院","大连装备制造职业技术学院","沈阳航空职业技术学院","辽宁地质工程职业学院","辽宁铁道职业技术学院","辽宁建筑职业技术学院","大连枫叶职业技术学院","辽宁商贸职业学院","大连翻译职业学院","辽宁理工职业学院","大连软件职业学院","辽宁美术职业学院","大连航运职业技术学院","辽宁林业职业技术学院","辽宁经济职业技术学院","辽宁信息职业技术学院","辽宁广告职业学院","大连汽车职业技术学院","辽宁机电职业技术学院","辽宁石化职业技术学院"]}, + {"id":"19","data":["内蒙古大学","内蒙古科技大学","内蒙古民族大学","内蒙古工业大学","内蒙古农业大学","内蒙古医科大学","内蒙古师范大学","内蒙古财经大学","河套学院","赤峰学院","集宁师范学院","呼伦贝尔学院","呼和浩特民族学院","乌兰察布医学高等专科学校","满洲里俄语职业学院","包头职业技术学院","内蒙古建筑职业技术学院","内蒙古机电职业技术学院","乌海职业技术学院","呼和浩特职业学院","内蒙古交通职业技术学院","阿拉善职业技术学院","赤峰工业职业技术学院","内蒙古能源职业学院","乌兰察布职业学院","内蒙古电子信息职业技术学院","通辽职业学院","内蒙古化工职业学院","内蒙古商贸职业学院","包头铁道职业技术学院","包头钢铁职业技术学院","内蒙古美术职业学院","科尔沁艺术职业学院","包头轻工职业技术学院","锡林郭勒职业学院","兴安职业技术学院","内蒙古警察职业学院","内蒙古体育职业学院","内蒙古经贸外语职业学院","赤峰职业技术学院","内蒙古北方职业技术学院","鄂尔多斯职业学院","内蒙古科技职业学院","内蒙古丰州职业学院","呼伦贝尔职业技术学院","内蒙古工业职业学院"]}, + {"id":"20","data":["北方民族大学","宁夏大学","宁夏理工学院","宁夏医科大学","宁夏师范学院","银川能源学院","宁夏民族职业技术学院","宁夏司法警官职业学院","宁夏财经职业技术学院","宁夏工商职业技术学院","宁夏防沙治沙职业技术学院","宁夏职业技术学院","宁夏工业职业学院","宁夏建设职业技术学院"]}, + {"id":"21","data":["青海大学","青海师范大学","青海民族大学","青海畜牧兽医职业技术学院","青海卫生职业技术学院","青海建筑职业技术学院","青海交通职业技术学院","青海警官职业学院"]}, + {"id":"22","data":["山东大学","中国石油大学(华东)","中国海洋大学","青岛大学","山东科技大学","山东理工大学","烟台大学","聊城大学","青岛科技大学","青岛理工大学","济南大学","山东建筑大学","山东农业大学","青岛农业大学","山东中医药大学","山东师范大学","曲阜师范大学","临沂大学","山东财经大学","鲁东大学","山东万杰医学院","潍坊科技学院","山东英才学院","山东轻工业学院","潍坊学院","山东交通学院","青岛工学院","潍坊医学院","泰山医学院","滨州医学院","济宁医学院","德州学院","齐鲁师范学院","山东工商学院","山东警察学院","山东青年政治学院","山东政法学院","山东体育学院","山东艺术学院","山东工艺美术学院","泰山学院","枣庄学院","烟台南山学院","青岛滨海学院","济宁学院","菏泽学院","滨州学院","山东女子学院","山东协和学院","青岛黄海学院","山东电力高等专科学校","菏泽医学专科学校","山东医学高等专科学校","山东中医药高等专科学校","淄博师范高等专科学校","济南幼儿师范高等专科学校","山东畜牧兽医职业学院","山东商业职业技术学院","日照职业技术学院","曲阜远东职业技术学院","青岛职业技术学院","济宁职业技术学院","山东劳动职业技术学院","聊城职业技术学院","莱芜职业技术学院","威海职业学院","滨州职业学院","山东杏林科技职业学院","山东工业职业学院","山东胜利职业学院","山东华宇职业技术学院","山东商务职业学院","枣庄科技职业学院","山东水利职业学院","山东力明科技职业学院","东营职业学院","潍坊职业学院","山东职业学院","德州职业技术学院","青岛飞洋职业技术学院","青岛港湾职业技术学院","潍坊护理职业学院","潍坊工商职业学院","山东凯文科技职业学院","烟台汽车工程职业学院","山东城市建设职业学院","山东大王职业学院","烟台职业学院","山东海事职业学院","山东科技职业学院","泰山护理职业学院","山东圣翰财贸职业学院","青岛酒店管理职业技术学院","山东服装职业学院","枣庄职业学院","山东外国语职业学院","潍坊工程职业学院","济南工程职业技术学院","青岛求实职业技术学院","青岛恒星职业技术学院","山东传媒职业学院","济南职业学院","德州科技职业学院","泰山职业技术学院","济南护理职业学院","淄博职业学院","山东电子职业技术学院","山东现代职业学院","山东药品食品职业学院","菏泽家政职业学院","山东旅游职业学院","临沂职业学院","山东信息职业技术学院","山东理工职业学院","山东铝业职业学院","山东经贸职业学院","山东司法警官职业学院","烟台工程职业技术学院","山东丝绸纺织职业学院","山东外贸职业学院","山东化工职业学院","山东交通职业学院","山东外事翻译职业学院","青岛远洋船员职业学院","山东文化产业职业学院","哈尔滨工业大学(威海校区)"]}, + {"id":"23","data":["山西大学","太原理工大学","中北大学","太原科技大学","山西农业大学","山西医科大学","山西师范大学","山西大同大学","山西财经大学","太原工业学院","山西中医学院","长治医学院","吕梁学院","忻州师范学院","太原师范学院","运城学院","长治学院","晋中学院","山西工商学院","太原电力高等专科学校","运城幼儿师范高等专科学校","晋中师范高等专科学校","阳泉师范高等专科学校","山西省财政税务专科学校","山西警官高等专科学校","太原大学","山西药科职业学院","山西兴华职业学院","山西建筑职业技术学院","山西轻工职业技术学院","山西工程职业技术学院","运城职业技术学院","山西老区职业技术学院","大同煤炭职业技术学院","山西交通职业技术学院","山西艺术职业学院","长治职业技术学院","晋城职业技术学院","山西电力职业技术学院","山西体育职业学院","山西警官职业学院","山西国际商务职业学院","山西华澳商贸职业学院","山西机电职业技术学院","山西戏剧职业学院","山西财贸职业技术学院","山西林业职业技术学院","山西水利职业技术学院","阳泉职业技术学院","晋中职业技术学院","运城护理职业学院","忻州职业技术学院","山西金融职业学院","临汾职业技术学院","山西职业技术学院","太原城市职业技术学院","山西运城农业职业技术学院","山西青年职业学院","山西经贸职业学院","山西同文职业技术学院","山西信息职业技术学院","山西管理职业学院","山西旅游职业学院","潞安职业技术学院","太原旅游职业学院","朔州职业技术学院","山西煤炭职业技术学院"]}, + {"id":"24","data":["第四军医大学","西安交通大学","长安大学","西安电子科技大学","西北农林科技大学","陕西师范大学","西北工业大学","西北大学","延安大学","西安理工大学","西安建筑科技大学","西安科技大学","西安石油大学","西安工程大学","西安工业大学","西安邮电大学","西安外国语大学","西北政法大学","陕西科技大学","西安思源学院","陕西国际商贸学院","西安航空学院","陕西中医学院","西安医学院","宝鸡文理学院","渭南师范学院","榆林学院","陕西理工学院","咸阳师范学院","陕西学前师范学院","西安财经学院","西安体育学院","西安美术学院","西安音乐学院","陕西服装工程学院","西京学院","西安翻译学院","西安外事学院","西安文理学院","西安欧亚学院","西安培华学院","商洛学院","安康学院","西安电力高等专科学校","西安医学高等专科学校","陕西工业职业技术学院","杨凌职业技术学院","西安东方亚太职业技术学院","西安汽车科技职业学院","西安科技商贸职业学院","西安海棠职业学院","陕西邮电职业技术学院","陕西警官职业学院","商洛职业技术学院","陕西经济管理职业技术学院","陕西铁路工程职业技术学院","陕西电子信息职业技术学院","西安职业技术学院","陕西旅游烹饪职业学院","咸阳职业技术学院","铜川职业技术学院","安康职业技术学院","西安铁路职业技术学院","西安航空职业技术学院","陕西职业技术学院","陕西能源职业技术学院","陕西交通职业技术学院","渭南职业技术学院","陕西国防工业职业技术学院","陕西航空职业技术学院","陕西电子科技职业学院","陕西工商职业学院","陕西青年职业学院","西安高新科技职业学院","西安城市建设职业学院","延安职业技术学院","汉中职业技术学院","宝鸡职业技术学院","陕西财经职业技术学院","榆林职业技术学院"]}, + {"id":"25","data":["复旦大学","同济大学","上海交通大学","华东理工大学","东华大学","华东师范大学","上海外国语大学","上海财经大学","上海大学","上海理工大学","上海海事大学","上海工程技术大学","上海海洋大学","上海中医药大学","上海师范大学","华东政法大学","上海海关学院","上海建桥学院","上海政法学院","上海电机学院","上海第二工业大学","上海电力学院","上海应用技术学院","上海对外贸易学院","上海立信会计学院","上海金融学院","上海商学院","上海体育学院","上海音乐学院","上海戏剧学院","上海杉达学院","第二军医大学","上海出版印刷高等专科学校","上海医疗器械高等专科学校","上海医药高等专科学校","上海旅游高等专科学校","上海公安高等专科学校","上海民航职业技术学院","上海电影艺术职业学院","上海健康职业技术学院","上海东海职业技术学院","上海新侨职业技术学院","上海工会管理职业学院","上海工艺美术职业学院","上海震旦职业学院","上海立达职业技术学院","上海中华职业技术学院","上海兴韦信息技术职业学院","上海邦德职业技术学院","上海农林职业技术学院","上海思博职业技术学院","上海欧华职业技术学院","上海民远职业技术学院","上海交通职业技术学院","上海建峰职业技术学院","上海城市管理职业技术学院","上海体育职业学院","上海电子信息职业技术学院","上海行健职业学院","上海济光职业技术学院","上海工商外国语职业学院","上海海事职业技术学院","上海科学技术职业学院","上海中侨职业技术学院"]}, + {"id":"26","data":["四川大学","西南交通大学","电子科技大学","西南财经大学","西南民族大学","成都理工大学","西华大学","西南科技大学","四川农业大学","成都中医药大学","四川师范大学","西华师范大学","中国民用航空飞行学院","西南石油大学","成都工业学院","成都信息工程学院","四川理工学院","成都东软学院","泸州医学院","川北医学院","成都医学院","乐山师范学院","内江师范学院","四川文理学院","成都师范学院","四川警察学院","成都体育学院","四川音乐学院","四川民族学院","绵阳师范学院","攀枝花学院","成都学院","宜宾学院","西昌学院","成都纺织高等专科学校","四川烹饪高等专科学校","四川中医药高等专科学校","阿坝师范高等专科学校","川北幼儿师范高等专科学校","四川幼儿师范高等专科学校","民办四川天一学院","成都航空职业技术学院","四川商务职业学院","四川卫生康复职业学院","四川三河职业学院","四川电影电视职业学院","四川城市职业学院","四川汽车职业技术学院","成都农业科技职业学院","四川科技职业学院","宜宾职业技术学院","四川文化产业职业学院","四川华新现代职业学院","四川长江职业学院","四川司法警官职业学院","四川警安职业学院","四川信息职业技术学院","广安职业技术学院","四川现代职业学院","四川艺术职业学院","内江职业技术学院","成都职业技术学院","南充职业技术学院","四川水利职业技术学院","四川化工职业技术学院","四川航天职业技术学院","四川邮电职业技术学院","四川国际标榜职业学院","乐山职业技术学院","四川管理职业学院","四川财经职业学院","四川文化传媒职业学院","泸州职业技术学院","眉山职业技术学院","四川职业技术学院","四川托普信息技术职业学院","成都艺术职业学院","雅安职业技术学院","四川建筑职业技术学院","四川机电职业技术学院","四川交通职业技术学院","达州职业技术学院","四川工商职业技术学院","绵阳职业技术学院","四川电力职业技术学院","四川工程职业技术学院"]}, + {"id":"27","data":["国立台湾大学","国立清华大学","国立成功大学","国立阳明大学","台湾交通大学","台北医学大学","国立中央大学","国立台湾大学科学与技术学院(原名国立台湾科技学院)","国立中山大学","国立台湾师范大学","国立政治大学","国立中兴大学"]}, + {"id":"28","data":["南开大学","天津大学","中国民航大学","天津工业大学","天津科技大学","天津理工大学","天津医科大学","天津中医药大学","天津师范大学","天津职业技术师范大学","天津外国语大学","天津财经大学","天津商业大学","天津天狮学院","天津城市建设学院","天津农学院","天津体育学院","天津美术学院","天津音乐学院","天津医学高等专科学校","天津工程职业技术学院","天津机电职业技术学院","天津现代职业技术学院","天津公安警官职业学院","天津轻工职业技术学院","天津职业大学","天津渤海职业技术学院","天津滨海职业学院","天津电子信息职业技术学院","天津石油职业技术学院","天津交通职业学院","天津中德职业技术学院","天津城市职业学院","天津冶金职业技术学院","天津商务职业学院","天津城市建设管理职业技术学院","天津生物工程职业技术学院","天津艺术职业学院","天津国土资源和房屋职业学院","天津海运职业学院","天津青年职业学院","天津广播影视职业学院","天津铁道职业技术学院","天津开发区职业技术学院","天津工艺美术职业学院"]}, + {"id":"29","data":["西藏大学","西藏藏医学院","西藏民族学院","拉萨师范高等专科学校","西藏警官高等专科学校","西藏职业技术学院"]}, + {"id":"30","data":["香港大学","香港中文大学","香港科技大学","香港城市大学","香港理工大学","香港浸会大学","香港岭南大学","香港教育学院"]}, + {"id":"31","data":["新疆大学","石河子大学","新疆农业大学","塔里木大学","新疆医科大学","新疆师范大学","新疆财经大学","新疆工程学院","伊犁师范学院","喀什师范学院","新疆警察学院","新疆艺术学院","昌吉学院","新疆维吾尔医学专科学校","和田师范专科学校","新疆兵团警官高等专科学校","新疆农业职业技术学院","乌鲁木齐职业大学","新疆机电职业技术学院","新疆轻工职业技术学院","克拉玛依职业技术学院","新疆职业大学","伊犁职业技术学院","新疆建设职业技术学院","巴音郭楞职业技术学院","阿克苏职业技术学院","新疆天山职业技术学院","新疆现代职业技术学院","新疆交通职业技术学院","新疆石河子职业技术学院","新疆能源职业技术学院","新疆体育职业技术学院","新疆应用职业技术学院","昌吉职业技术学院","新疆师范高等专科学校"]}, + {"id":"32","data":["云南大学","昆明理工大学","云南农业大学","西南林业大学","昆明医科大学","云南师范大学","云南财经大学","云南民族大学","云南中医学院","昭通学院","曲靖师范学院","玉溪师范学院","楚雄师范学院","普洱学院","红河学院","云南工商学院","云南警官学院","云南艺术学院","大理学院","昆明学院","保山学院","文山学院","昆明冶金高等专科学校","曲靖医学高等专科学校","楚雄医药高等专科学校","保山中医药高等专科学校","丽江师范高等专科学校","德宏师范高等专科学校","临沧师范高等专科学校","云南经贸外事职业学院","云南农业职业技术学院","昆明工业职业技术学院","云南机电职业技术学院","云南热带作物职业学院","云南司法警官职业学院","云南国防工业职业技术学院","云南锡业职业技术学院","云南能源职业技术学院","云南三鑫职业技术学院","德宏职业学院","云南新兴职业学院","云南旅游职业学院","云南经济管理职业学院","云南外事外语职业学院","红河卫生职业学院","玉溪农业职业技术学院","云南文化艺术职业学院","昆明艺术职业学院","昆明扬帆职业技术学院","云南城市建设职业学院","西双版纳职业技术学院","云南林业职业技术学院","云南国土资源职业学院","昆明卫生职业学院","云南科技信息职业学院","云南体育运动职业技术学院","云南现代职业技术学院","云南交通职业技术学院","云南商务职业学院"]}, + {"id":"33","data":["浙江大学","宁波大学","浙江工业大学","杭州电子科技大学","浙江理工大学","浙江农林大学","浙江中医药大学","浙江师范大学","杭州师范大学","浙江工商大学","宁波诺丁汉大学","温州大学","公安海警学院","宁波大红鹰学院","浙江越秀外国语学院","宁波工程学院","中国计量学院","嘉兴学院","浙江科技学院","浙江海洋学院","温州医学院","绍兴文理学院","台州学院","湖州师范学院","浙江传媒学院","浙江外国语学院","浙江财经学院","浙江警察学院","中国美术学院","丽水学院","浙江树人学院","浙江万里学院","衢州学院","浙江水利水电专科学校","浙江医药高等专科学校","浙江医学高等专科学校","宁波职业技术学院","金华职业技术学院","浙江交通职业技术学院","温州职业技术学院","台州职业技术学院","浙江旅游职业学院","宁波城市职业技术学院","浙江工商职业技术学院","浙江经济职业技术学院","浙江机电职业技术学院","杭州万向职业技术学院","浙江商业职业技术学院","浙江汽车职业技术学院","浙江横店影视职业学院","浙江警官职业学院","嘉兴南洋职业技术学院","浙江工业职业技术学院","杭州科技职业技术学院","浙江建设职业技术学院","浙江经贸职业技术学院","浙江育英职业技术学院","温州科技职业学院","浙江长征职业技术学院","绍兴职业技术学院","杭州职业技术学院","浙江纺织服装职业技术学院","台州科技职业学院","浙江邮电职业技术学院","浙江同济科技职业学院","浙江广厦建设职业技术学院","浙江体育职业技术学院","宁波卫生职业技术学院","浙江工贸职业技术学院","浙江国际海运职业技术学院","嘉兴职业技术学院","湖州职业技术学院","衢州职业技术学院","丽水职业技术学院","浙江金融职业学院","义乌工商职业技术学院","浙江东方职业技术学院","浙江艺术职业学院","浙江农业商贸职业学院","浙江电力职业技术学院"]} + ] \ No newline at end of file diff --git a/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/MarkerManager.java b/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/MarkerManager.java new file mode 100644 index 0000000000000000000000000000000000000000..e558e70185b8c15df78bb2d33e7ededd4dba3b44 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/MarkerManager.java @@ -0,0 +1,150 @@ +/* + * Copyright (C) 2015 Baidu, Inc. All Rights Reserved. + */ + +package com.baidu.mapapi.clusterutil; + +import com.baidu.mapapi.map.BaiduMap; +import com.baidu.mapapi.map.Marker; +import com.baidu.mapapi.map.MarkerOptions; + +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +/** + * Keeps track of collections of markers on the map. Delegates all Marker-related events to each + * collection's individually managed listeners. + *

+ * All marker operations (adds and removes) should occur via its collection class. That is, don't + * add a marker via a collection, then remove it via Marker.remove() + */ +public class MarkerManager implements BaiduMap.OnMarkerClickListener, BaiduMap.OnMarkerDragListener { + private final BaiduMap mMap; + + private final Map mNamedCollections = new HashMap(); + private final Map mAllMarkers = new HashMap(); + + public MarkerManager(BaiduMap map) { + this.mMap = map; + } + + public Collection newCollection() { + return new Collection(); + } + + /** + * Create a new named collection, which can later be looked up by {@link #getCollection(String)} + * @param id a unique id for this collection. + */ + public Collection newCollection(String id) { + if (mNamedCollections.get(id) != null) { + throw new IllegalArgumentException("collection id is not unique: " + id); + } + Collection collection = new Collection(); + mNamedCollections.put(id, collection); + return collection; + } + + /** + * Gets a named collection that was created by {@link #newCollection(String)} + * @param id the unique id for this collection. + */ + public Collection getCollection(String id) { + return mNamedCollections.get(id); + } + + @Override + public boolean onMarkerClick(Marker marker) { + Collection collection = mAllMarkers.get(marker); + if (collection != null && collection.mMarkerClickListener != null) { + // you can set the click action + return collection.mMarkerClickListener.onMarkerClick(marker); + } else { + ; // click single maker out of cluster + } + return false; + } + + @Override + public void onMarkerDragStart(Marker marker) { + Collection collection = mAllMarkers.get(marker); + if (collection != null && collection.mMarkerDragListener != null) { + collection.mMarkerDragListener.onMarkerDragStart(marker); + } + } + + @Override + public void onMarkerDrag(Marker marker) { + Collection collection = mAllMarkers.get(marker); + if (collection != null && collection.mMarkerDragListener != null) { + collection.mMarkerDragListener.onMarkerDrag(marker); + } + } + + @Override + public void onMarkerDragEnd(Marker marker) { + Collection collection = mAllMarkers.get(marker); + if (collection != null && collection.mMarkerDragListener != null) { + collection.mMarkerDragListener.onMarkerDragEnd(marker); + } + } + + /** + * Removes a marker from its collection. + * + * @param marker the marker to remove. + * @return true if the marker was removed. + */ + public boolean remove(Marker marker) { + Collection collection = mAllMarkers.get(marker); + return collection != null && collection.remove(marker); + } + + public class Collection { + private final Set mMarkers = new HashSet(); + private BaiduMap.OnMarkerClickListener mMarkerClickListener; + private BaiduMap.OnMarkerDragListener mMarkerDragListener; + + public Collection() { + } + + public Marker addMarker(MarkerOptions opts) { + Marker marker = (Marker) mMap.addOverlay(opts); + mMarkers.add(marker); + mAllMarkers.put(marker, Collection.this); + return marker; + } + + public boolean remove(Marker marker) { + if (mMarkers.remove(marker)) { + mAllMarkers.remove(marker); + marker.remove(); + return true; + } + return false; + } + + public void clear() { + for (Marker marker : mMarkers) { + marker.remove(); + mAllMarkers.remove(marker); + } + mMarkers.clear(); + } + + public java.util.Collection getMarkers() { + return Collections.unmodifiableCollection(mMarkers); + } + + public void setOnMarkerClickListener(BaiduMap.OnMarkerClickListener markerClickListener) { + mMarkerClickListener = markerClickListener; + } + + public void setOnMarkerDragListener(BaiduMap.OnMarkerDragListener markerDragListener) { + mMarkerDragListener = markerDragListener; + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/clustering/Cluster.java b/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/clustering/Cluster.java new file mode 100644 index 0000000000000000000000000000000000000000..e4244479603936bb48786724cfba14eb0b3dcf58 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/clustering/Cluster.java @@ -0,0 +1,21 @@ +/* + * Copyright (C) 2015 Baidu, Inc. All Rights Reserved. + */ + +package com.baidu.mapapi.clusterutil.clustering; + + +import com.baidu.mapapi.model.LatLng; + +import java.util.Collection; + +/** + * A collection of ClusterItems that are nearby each other. + */ +public interface Cluster { + public LatLng getPosition(); + + Collection getItems(); + + int getSize(); +} \ No newline at end of file diff --git a/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/clustering/ClusterItem.java b/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/clustering/ClusterItem.java new file mode 100644 index 0000000000000000000000000000000000000000..e7d4c420151edfb93c453e461bf6a37f675f89a6 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/clustering/ClusterItem.java @@ -0,0 +1,22 @@ +/* + * Copyright (C) 2015 Baidu, Inc. All Rights Reserved. + */ + +package com.baidu.mapapi.clusterutil.clustering; + + +import com.baidu.mapapi.map.BitmapDescriptor; +import com.baidu.mapapi.model.LatLng; + +/** + * ClusterItem represents a marker on the map. + */ +public interface ClusterItem { + + /** + * The position of this marker. This must always return the same value. + */ + LatLng getPosition(); + + BitmapDescriptor getBitmapDescriptor(); +} \ No newline at end of file diff --git a/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/clustering/ClusterManager.java b/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/clustering/ClusterManager.java new file mode 100644 index 0000000000000000000000000000000000000000..a659f616bf5436dd6f98e5be96daef8c219ab2c4 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/clustering/ClusterManager.java @@ -0,0 +1,289 @@ +/* + * Copyright (C) 2015 Baidu, Inc. All Rights Reserved. + */ + +package com.baidu.mapapi.clusterutil.clustering; + +import android.content.Context; +import android.os.AsyncTask; +import android.os.Build; + +import com.baidu.mapapi.clusterutil.MarkerManager; +import com.baidu.mapapi.clusterutil.clustering.algo.Algorithm; +import com.baidu.mapapi.clusterutil.clustering.algo.NonHierarchicalDistanceBasedAlgorithm; +import com.baidu.mapapi.clusterutil.clustering.algo.PreCachingAlgorithmDecorator; +import com.baidu.mapapi.clusterutil.clustering.view.ClusterRenderer; +import com.baidu.mapapi.clusterutil.clustering.view.DefaultClusterRenderer; +import com.baidu.mapapi.map.BaiduMap; +import com.baidu.mapapi.map.MapStatus; +import com.baidu.mapapi.map.Marker; + +import java.util.Collection; +import java.util.Set; +import java.util.concurrent.locks.ReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock; + +/** + * Groups many items on a map based on zoom level. + *

+ * ClusterManager should be added to the map + *

  • + */ +public class ClusterManager implements + BaiduMap.OnMapStatusChangeListener, BaiduMap.OnMarkerClickListener { + protected final MarkerManager mMarkerManager; + protected final MarkerManager.Collection mMarkers; + protected final MarkerManager.Collection mClusterMarkers; + + protected Algorithm mAlgorithm; + protected final ReadWriteLock mAlgorithmLock = new ReentrantReadWriteLock(); + protected ClusterRenderer mRenderer; + + protected BaiduMap mMap; + protected MapStatus mPreviousCameraPosition; + protected ClusterTask mClusterTask; + protected final ReadWriteLock mClusterTaskLock = new ReentrantReadWriteLock(); + + protected OnClusterItemClickListener mOnClusterItemClickListener; + protected OnClusterInfoWindowClickListener mOnClusterInfoWindowClickListener; + protected OnClusterItemInfoWindowClickListener mOnClusterItemInfoWindowClickListener; + protected OnClusterClickListener mOnClusterClickListener; + + public ClusterManager(Context context, BaiduMap map) { + this(context, map, new MarkerManager(map)); + } + + public ClusterManager(Context context, BaiduMap map, MarkerManager markerManager) { + mMap = map; + mMarkerManager = markerManager; + mClusterMarkers = markerManager.newCollection(); + mMarkers = markerManager.newCollection(); + mRenderer = new DefaultClusterRenderer(context, map, this); + mAlgorithm = new PreCachingAlgorithmDecorator(new NonHierarchicalDistanceBasedAlgorithm()); + mClusterTask = new ClusterTask(); + mRenderer.onAdd(); + } + + public MarkerManager.Collection getMarkerCollection() { + return mMarkers; + } + + public MarkerManager.Collection getClusterMarkerCollection() { + return mClusterMarkers; + } + + public MarkerManager getMarkerManager() { + return mMarkerManager; + } + + public void setRenderer(ClusterRenderer view) { + mRenderer.setOnClusterClickListener(null); + mRenderer.setOnClusterItemClickListener(null); + mClusterMarkers.clear(); + mMarkers.clear(); + mRenderer.onRemove(); + mRenderer = view; + mRenderer.onAdd(); + mRenderer.setOnClusterClickListener(mOnClusterClickListener); + mRenderer.setOnClusterInfoWindowClickListener(mOnClusterInfoWindowClickListener); + mRenderer.setOnClusterItemClickListener(mOnClusterItemClickListener); + mRenderer.setOnClusterItemInfoWindowClickListener(mOnClusterItemInfoWindowClickListener); + cluster(); + } + + public void setAlgorithm(Algorithm algorithm) { + mAlgorithmLock.writeLock().lock(); + try { + if (mAlgorithm != null) { + algorithm.addItems(mAlgorithm.getItems()); + } + mAlgorithm = new PreCachingAlgorithmDecorator(algorithm); + } finally { + mAlgorithmLock.writeLock().unlock(); + } + cluster(); + } + + public void clearItems() { + mAlgorithmLock.writeLock().lock(); + try { + mAlgorithm.clearItems(); + } finally { + mAlgorithmLock.writeLock().unlock(); + } + } + + public void addItems(Collection items) { + mAlgorithmLock.writeLock().lock(); + try { + mAlgorithm.addItems(items); + } finally { + mAlgorithmLock.writeLock().unlock(); + } + + } + + public void addItem(T myItem) { + mAlgorithmLock.writeLock().lock(); + try { + mAlgorithm.addItem(myItem); + } finally { + mAlgorithmLock.writeLock().unlock(); + } + } + + public void removeItem(T item) { + mAlgorithmLock.writeLock().lock(); + try { + mAlgorithm.removeItem(item); + } finally { + mAlgorithmLock.writeLock().unlock(); + } + } + + /** + * Force a re-cluster. You may want to call this after adding new item(s). + */ + public void cluster() { + mClusterTaskLock.writeLock().lock(); + try { + // Attempt to cancel the in-flight request. + mClusterTask.cancel(true); + mClusterTask = new ClusterTask(); + + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { + mClusterTask.execute(mMap.getMapStatus().zoom); + } else { + mClusterTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, mMap.getMapStatus().zoom); + } + } finally { + mClusterTaskLock.writeLock().unlock(); + } + } + + + @Override + public void onMapStatusChangeStart(MapStatus mapStatus) { + + } + + @Override + public void onMapStatusChangeStart(MapStatus mapStatus, int reason) { + + } + +// @Override +// public void onMapStatusChangeStart(MapStatus status, int reason) { +// +// } + + @Override + public void onMapStatusChange(MapStatus mapStatus) { + if (mRenderer instanceof BaiduMap.OnMapStatusChangeListener) { + ((BaiduMap.OnMapStatusChangeListener) mRenderer).onMapStatusChange(mapStatus); + } + + // Don't re-compute clusters if the map has just been panned/tilted/rotated. + MapStatus position = mMap.getMapStatus(); + if (mPreviousCameraPosition != null && mPreviousCameraPosition.zoom == position.zoom) { + return; + } + mPreviousCameraPosition = mMap.getMapStatus(); + + cluster(); + } + + @Override + public void onMapStatusChangeFinish(MapStatus mapStatus) { + + } + + @Override + public boolean onMarkerClick(Marker marker) { + return getMarkerManager().onMarkerClick(marker); + } + + /** + * Runs the clustering algorithm in a background thread, then re-paints when results come back. + */ + private class ClusterTask extends AsyncTask>> { + @Override + protected Set> doInBackground(Float... zoom) { + mAlgorithmLock.readLock().lock(); + try { + return mAlgorithm.getClusters(zoom[0]); + } finally { + mAlgorithmLock.readLock().unlock(); + } + } + + @Override + protected void onPostExecute(Set> clusters) { + mRenderer.onClustersChanged(clusters); + } + } + + /** + * Sets a callback that's invoked when a Cluster is tapped. Note: For this listener to function, + * the ClusterManager must be added as a click listener to the map. + */ + public void setOnClusterClickListener(OnClusterClickListener listener) { + mOnClusterClickListener = listener; + mRenderer.setOnClusterClickListener(listener); + } + + /** + * Sets a callback that's invoked when a Cluster is tapped. Note: For this listener to function, + * the ClusterManager must be added as a info window click listener to the map. + */ + public void setOnClusterInfoWindowClickListener(OnClusterInfoWindowClickListener listener) { + mOnClusterInfoWindowClickListener = listener; + mRenderer.setOnClusterInfoWindowClickListener(listener); + } + + /** + * Sets a callback that's invoked when an individual ClusterItem is tapped. Note: For this + * listener to function, the ClusterManager must be added as a click listener to the map. + */ + public void setOnClusterItemClickListener(OnClusterItemClickListener listener) { + mOnClusterItemClickListener = listener; + mRenderer.setOnClusterItemClickListener(listener); + } + + /** + * Sets a callback that's invoked when an individual ClusterItem's Info Window is tapped. Note: For this + * listener to function, the ClusterManager must be added as a info window click listener to the map. + */ + public void setOnClusterItemInfoWindowClickListener(OnClusterItemInfoWindowClickListener listener) { + mOnClusterItemInfoWindowClickListener = listener; + mRenderer.setOnClusterItemInfoWindowClickListener(listener); + } + + /** + * Called when a Cluster is clicked. + */ + public interface OnClusterClickListener { + public boolean onClusterClick(Cluster cluster); + } + + /** + * Called when a Cluster's Info Window is clicked. + */ + public interface OnClusterInfoWindowClickListener { + public void onClusterInfoWindowClick(Cluster cluster); + } + + /** + * Called when an individual ClusterItem is clicked. + */ + public interface OnClusterItemClickListener { + public boolean onClusterItemClick(T item); + } + + /** + * Called when an individual ClusterItem's Info Window is clicked. + */ + public interface OnClusterItemInfoWindowClickListener { + public void onClusterItemInfoWindowClick(T item); + } +} diff --git a/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/clustering/MyClusterManager.java b/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/clustering/MyClusterManager.java new file mode 100644 index 0000000000000000000000000000000000000000..2ea2ee043ac2c4a55bd8e6653f805858413c7a27 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/clustering/MyClusterManager.java @@ -0,0 +1,25 @@ +package com.baidu.mapapi.clusterutil.clustering; + +import android.content.Context; + +import com.baidu.mapapi.clusterutil.MarkerManager; +import com.baidu.mapapi.clusterutil.clustering.view.MyClusterRenderer; +import com.baidu.mapapi.map.BaiduMap; + +/** + * Created by jq on 2017/12/7. + */ + +public class MyClusterManager extends ClusterManager{ + + public MyClusterManager(Context context, BaiduMap map) { + super(context, map); + + } + + public MyClusterManager(Context context, BaiduMap map, MarkerManager markerManager) { + super(context, map, markerManager); + mRenderer = new MyClusterRenderer(context, map, this); + mRenderer.onAdd(); + } +} diff --git a/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/clustering/algo/Algorithm.java b/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/clustering/algo/Algorithm.java new file mode 100644 index 0000000000000000000000000000000000000000..362a18d367ad2f2d11f22e20f690b0c240b1c723 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/clustering/algo/Algorithm.java @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2015 Baidu, Inc. All Rights Reserved. + */ + +package com.baidu.mapapi.clusterutil.clustering.algo; + + +import com.baidu.mapapi.clusterutil.clustering.Cluster; +import com.baidu.mapapi.clusterutil.clustering.ClusterItem; + +import java.util.Collection; +import java.util.Set; + +/** + * Logic for computing clusters + */ +public interface Algorithm { + void addItem(T item); + + void addItems(Collection items); + + void clearItems(); + + void removeItem(T item); + + Set> getClusters(double zoom); + + Collection getItems(); +} \ No newline at end of file diff --git a/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/clustering/algo/NonHierarchicalDistanceBasedAlgorithm.java b/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/clustering/algo/NonHierarchicalDistanceBasedAlgorithm.java new file mode 100644 index 0000000000000000000000000000000000000000..bcc5074f250907845c7b248bcef722fe0ab84bc5 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/clustering/algo/NonHierarchicalDistanceBasedAlgorithm.java @@ -0,0 +1,199 @@ +/* + * Copyright (C) 2015 Baidu, Inc. All Rights Reserved. + */ + +package com.baidu.mapapi.clusterutil.clustering.algo; + +import com.baidu.mapapi.clusterutil.clustering.Cluster; +import com.baidu.mapapi.clusterutil.clustering.ClusterItem; +import com.baidu.mapapi.clusterutil.projection.Bounds; +import com.baidu.mapapi.clusterutil.projection.Point; +import com.baidu.mapapi.clusterutil.projection.SphericalMercatorProjection; +import com.baidu.mapapi.clusterutil.quadtree.PointQuadTree; +import com.baidu.mapapi.model.LatLng; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * A simple clustering algorithm with O(nlog n) performance. Resulting clusters are not + * hierarchical. + *

    + * High level algorithm:
    + * 1. Iterate over items in the order they were added (candidate clusters).
    + * 2. Create a cluster with the center of the item.
    + * 3. Add all items that are within a certain distance to the cluster.
    + * 4. Move any items out of an existing cluster if they are closer to another cluster.
    + * 5. Remove those items from the list of candidate clusters. + *

    + * Clusters have the center of the first element (not the centroid of the items within it). + */ +public class NonHierarchicalDistanceBasedAlgorithm implements Algorithm { + public static final int MAX_DISTANCE_AT_ZOOM = 300; // essentially 100 dp. + + /** + * Any modifications should be synchronized on mQuadTree. + */ + private final Collection> mItems = new ArrayList>(); + + /** + * Any modifications should be synchronized on mQuadTree. + */ + private final PointQuadTree> mQuadTree = new PointQuadTree>(0, 1, 0, 1); + + private static final SphericalMercatorProjection PROJECTION = new SphericalMercatorProjection(1); + + @Override + public void addItem(T item) { + final QuadItem quadItem = new QuadItem(item); + synchronized (mQuadTree) { + mItems.add(quadItem); + mQuadTree.add(quadItem); + } + } + + @Override + public void addItems(Collection items) { + for (T item : items) { + addItem(item); + } + } + + @Override + public void clearItems() { + synchronized (mQuadTree) { + mItems.clear(); + mQuadTree.clear(); + } + } + + @Override + public void removeItem(T item) { + // TODO: delegate QuadItem#hashCode and QuadItem#equals to its item. + throw new UnsupportedOperationException("NonHierarchicalDistanceBasedAlgorithm.remove not implemented"); + } + + /** + * cluster算法核心 + * @param zoom map的级别 + * @return + */ + @Override + public Set> getClusters(double zoom) { + final int discreteZoom = (int) zoom; + + final double zoomSpecificSpan = MAX_DISTANCE_AT_ZOOM / Math.pow(2, discreteZoom) / 256; + + final Set> visitedCandidates = new HashSet>(); + final Set> results = new HashSet>(); + final Map, Double> distanceToCluster = new HashMap, Double>(); + final Map, StaticCluster> itemToCluster = + new HashMap, StaticCluster>(); + + synchronized (mQuadTree) { + for (QuadItem candidate : mItems) { + if (visitedCandidates.contains(candidate)) { + // Candidate is already part of another cluster. + continue; + } + + Bounds searchBounds = createBoundsFromSpan(candidate.getPoint(), zoomSpecificSpan); + Collection> clusterItems; + // search 某边界范围内的clusterItems + clusterItems = mQuadTree.search(searchBounds); + if (clusterItems.size() == 1) { + // Only the current marker is in range. Just add the single item to the results. + results.add(candidate); + visitedCandidates.add(candidate); + distanceToCluster.put(candidate, 0d); + continue; + } + StaticCluster cluster = + new StaticCluster(candidate.mClusterItem.getPosition()); + results.add(cluster); + + for (QuadItem clusterItem : clusterItems) { + Double existingDistance = distanceToCluster.get(clusterItem); + double distance = distanceSquared(clusterItem.getPoint(), candidate.getPoint()); + if (existingDistance != null) { + // Item already belongs to another cluster. Check if it's closer to this cluster. + if (existingDistance < distance) { + continue; + } + // Move item to the closer cluster. + itemToCluster.get(clusterItem).remove(clusterItem.mClusterItem); + } + distanceToCluster.put(clusterItem, distance); + cluster.add(clusterItem.mClusterItem); + itemToCluster.put(clusterItem, cluster); + } + visitedCandidates.addAll(clusterItems); + } + } + return results; + } + + @Override + public Collection getItems() { + final List items = new ArrayList(); + synchronized (mQuadTree) { + for (QuadItem quadItem : mItems) { + items.add(quadItem.mClusterItem); + } + } + return items; + } + + private double distanceSquared(Point a, Point b) { + return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y); + } + + private Bounds createBoundsFromSpan(Point p, double span) { + // TODO: Use a span that takes into account the visual size of the marker, not just its + // LatLng. + double halfSpan = span / 2; + return new Bounds( + p.x - halfSpan, p.x + halfSpan, + p.y - halfSpan, p.y + halfSpan); + } + + private static class QuadItem implements PointQuadTree.Item, Cluster { + private final T mClusterItem; + private final Point mPoint; + private final LatLng mPosition; + private Set singletonSet; + + private QuadItem(T item) { + mClusterItem = item; + mPosition = item.getPosition(); + mPoint = PROJECTION.toPoint(mPosition); + singletonSet = Collections.singleton(mClusterItem); + } + + @Override + public Point getPoint() { + return mPoint; + } + + @Override + public LatLng getPosition() { + return mPosition; + } + + @Override + public Set getItems() { + return singletonSet; + } + + @Override + public int getSize() { + return 1; + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/clustering/algo/PreCachingAlgorithmDecorator.java b/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/clustering/algo/PreCachingAlgorithmDecorator.java new file mode 100644 index 0000000000000000000000000000000000000000..5d4a43a44bcb15d8b1f63695e466178b70757449 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/clustering/algo/PreCachingAlgorithmDecorator.java @@ -0,0 +1,113 @@ +/* + * Copyright (C) 2015 Baidu, Inc. All Rights Reserved. + */ + +package com.baidu.mapapi.clusterutil.clustering.algo; + +import android.support.v4.util.LruCache; + +import com.baidu.mapapi.clusterutil.clustering.Cluster; +import com.baidu.mapapi.clusterutil.clustering.ClusterItem; + +import java.util.Collection; +import java.util.Set; +import java.util.concurrent.locks.ReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock; + +/** + * Optimistically fetch clusters for adjacent zoom levels, caching them as necessary. + */ +public class PreCachingAlgorithmDecorator implements Algorithm { + private final Algorithm mAlgorithm; + + // TODO: evaluate maxSize parameter for LruCache. + private final LruCache>> mCache = + new LruCache>>(5); + private final ReadWriteLock mCacheLock = new ReentrantReadWriteLock(); + + public PreCachingAlgorithmDecorator(Algorithm algorithm) { + mAlgorithm = algorithm; + } + + public void addItem(T item) { + mAlgorithm.addItem(item); + clearCache(); + } + + @Override + public void addItems(Collection items) { + mAlgorithm.addItems(items); + clearCache(); + } + + @Override + public void clearItems() { + mAlgorithm.clearItems(); + clearCache(); + } + + public void removeItem(T item) { + mAlgorithm.removeItem(item); + clearCache(); + } + + private void clearCache() { + mCache.evictAll(); + } + + @Override + public Set> getClusters(double zoom) { + int discreteZoom = (int) zoom; + Set> results = getClustersInternal(discreteZoom); + // TODO: Check if requests are already in-flight. + if (mCache.get(discreteZoom + 1) == null) { + new Thread(new PrecacheRunnable(discreteZoom + 1)).start(); + } + if (mCache.get(discreteZoom - 1) == null) { + new Thread(new PrecacheRunnable(discreteZoom - 1)).start(); + } + return results; + } + + @Override + public Collection getItems() { + return mAlgorithm.getItems(); + } + + private Set> getClustersInternal(int discreteZoom) { + Set> results; + mCacheLock.readLock().lock(); + results = mCache.get(discreteZoom); + mCacheLock.readLock().unlock(); + + if (results == null) { + mCacheLock.writeLock().lock(); + results = mCache.get(discreteZoom); + if (results == null) { + results = mAlgorithm.getClusters(discreteZoom); + mCache.put(discreteZoom, results); + } + mCacheLock.writeLock().unlock(); + } + return results; + } + + private class PrecacheRunnable implements Runnable { + private final int mZoom; + + public PrecacheRunnable(int zoom) { + mZoom = zoom; + } + + @Override + public void run() { + try { + // Wait between 500 - 1000 ms. + Thread.sleep((long) (Math.random() * 500 + 500)); + } catch (InterruptedException e) { + // ignore. keep going. + } + getClustersInternal(mZoom); + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/clustering/algo/StaticCluster.java b/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/clustering/algo/StaticCluster.java new file mode 100644 index 0000000000000000000000000000000000000000..bdd65760e34203268550ec380d8d9cde29044835 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/clustering/algo/StaticCluster.java @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2015 Baidu, Inc. All Rights Reserved. + */ + +package com.baidu.mapapi.clusterutil.clustering.algo; + +import com.baidu.mapapi.clusterutil.clustering.Cluster; +import com.baidu.mapapi.clusterutil.clustering.ClusterItem; +import com.baidu.mapapi.model.LatLng; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/** + * A cluster whose center is determined upon creation. + */ +public class StaticCluster implements Cluster { + private final LatLng mCenter; + private final List mItems = new ArrayList(); + + public StaticCluster(LatLng center) { + mCenter = center; + } + + + + public boolean add(T t) { + return mItems.add(t); + } + + @Override + public LatLng getPosition() { + return mCenter; + } + + public boolean remove(T t) { + return mItems.remove(t); + } + + @Override + public Collection getItems() { + return mItems; + } + + @Override + public int getSize() { + return mItems.size(); + } + + @Override + public String toString() { + return "StaticCluster{" + + "mCenter=" + mCenter + + ", mItems.size=" + mItems.size() + + '}'; + } +} \ No newline at end of file diff --git a/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/clustering/view/ClusterRenderer.java b/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/clustering/view/ClusterRenderer.java new file mode 100644 index 0000000000000000000000000000000000000000..bb0f5474f3bca0c2b1a53816d52fb5c32df5dde4 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/clustering/view/ClusterRenderer.java @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2015 Baidu, Inc. All Rights Reserved. + */ + +package com.baidu.mapapi.clusterutil.clustering.view; + + +import com.baidu.mapapi.clusterutil.clustering.Cluster; +import com.baidu.mapapi.clusterutil.clustering.ClusterItem; +import com.baidu.mapapi.clusterutil.clustering.ClusterManager; + +import java.util.Set; + +/** + * Renders clusters. + */ +public interface ClusterRenderer { + + /** + * Called when the view needs to be updated because new clusters need to be displayed. + * @param clusters the clusters to be displayed. + */ + void onClustersChanged(Set> clusters); + + void setOnClusterClickListener(ClusterManager.OnClusterClickListener listener); + + void setOnClusterInfoWindowClickListener(ClusterManager.OnClusterInfoWindowClickListener listener); + + void setOnClusterItemClickListener(ClusterManager.OnClusterItemClickListener listener); + + void setOnClusterItemInfoWindowClickListener(ClusterManager.OnClusterItemInfoWindowClickListener listener); + + /** + * Called when the view is added. + */ + void onAdd(); + + /** + * Called when the view is removed. + */ + void onRemove(); +} \ No newline at end of file diff --git a/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/clustering/view/DefaultClusterRenderer.java b/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/clustering/view/DefaultClusterRenderer.java new file mode 100644 index 0000000000000000000000000000000000000000..8e6b6dc282d9480729753a1536e05760c70a4409 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/clustering/view/DefaultClusterRenderer.java @@ -0,0 +1,923 @@ +/* + * Copyright (C) 2015 Baidu, Inc. All Rights Reserved. + */ + +package com.baidu.mapapi.clusterutil.clustering.view; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.TimeInterpolator; +import android.animation.ValueAnimator; +import android.annotation.SuppressLint; +import android.annotation.TargetApi; +import android.content.Context; +import android.graphics.Color; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.LayerDrawable; +import android.graphics.drawable.ShapeDrawable; +import android.graphics.drawable.shapes.OvalShape; +import android.os.Build; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import android.os.MessageQueue; +import android.util.SparseArray; +import android.view.ViewGroup; +import android.view.animation.DecelerateInterpolator; + +import com.baidu.mapapi.clusterutil.MarkerManager; +import com.baidu.mapapi.clusterutil.clustering.Cluster; +import com.baidu.mapapi.clusterutil.clustering.ClusterItem; +import com.baidu.mapapi.clusterutil.clustering.ClusterManager; +import com.baidu.mapapi.clusterutil.projection.Point; +import com.baidu.mapapi.clusterutil.projection.SphericalMercatorProjection; +import com.baidu.mapapi.clusterutil.ui.IconGenerator; +import com.baidu.mapapi.map.BaiduMap; +import com.baidu.mapapi.map.BitmapDescriptor; +import com.baidu.mapapi.map.BitmapDescriptorFactory; +import com.baidu.mapapi.map.Marker; +import com.baidu.mapapi.map.MarkerOptions; +import com.baidu.mapapi.map.Projection; +import com.baidu.mapapi.model.LatLng; +import com.baidu.mapapi.model.LatLngBounds; +import com.jiuqi.elove.R; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Queue; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +import static com.baidu.mapapi.clusterutil.clustering.algo.NonHierarchicalDistanceBasedAlgorithm.MAX_DISTANCE_AT_ZOOM; + + +/** + * The default view for a ClusterManager. Markers are animated in and out of clusters. + */ +public class DefaultClusterRenderer implements + ClusterRenderer { + private static final boolean SHOULD_ANIMATE = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB; + private final BaiduMap mMap; + private final IconGenerator mIconGenerator; + private final ClusterManager mClusterManager; + private final float mDensity; + + private static final int[] BUCKETS = {10, 20, 50, 100, 200, 500, 1000}; + private ShapeDrawable mColoredCircleBackground; + + /** + * Markers that are currently on the map. + */ + private Set mMarkers = Collections.newSetFromMap( + new ConcurrentHashMap()); + + /** + * Icons for each bucket. + */ + private SparseArray mIcons = new SparseArray(); + + /** + * Markers for single ClusterItems. + */ + private MarkerCache mMarkerCache = new MarkerCache(); + + /** + * If cluster size is less than this size, display individual markers. + */ + private static final int MIN_CLUSTER_SIZE = 1; + + /** + * The currently displayed set of clusters. + */ + private Set> mClusters; + + /** + * Lookup between markers and the associated cluster. + */ + private Map> mMarkerToCluster = new HashMap>(); + private Map, Marker> mClusterToMarker = new HashMap, Marker>(); + + /** + * The target zoom level for the current set of clusters. + */ + private float mZoom; + + private final ViewModifier mViewModifier = new ViewModifier(); + + private ClusterManager.OnClusterClickListener mClickListener; + private ClusterManager.OnClusterInfoWindowClickListener mInfoWindowClickListener; + private ClusterManager.OnClusterItemClickListener mItemClickListener; + private ClusterManager.OnClusterItemInfoWindowClickListener mItemInfoWindowClickListener; + + public DefaultClusterRenderer(Context context, BaiduMap map, ClusterManager clusterManager) { + mMap = map; + mDensity = context.getResources().getDisplayMetrics().density; + mIconGenerator = new IconGenerator(context); + //给头像设置contentview,默认设置了textview +// mIconGenerator.setContentView(makeSquareTextView(context)); +// mIconGenerator.setTextAppearance(R.style.ClusterIcon_TextAppearance); +// mIconGenerator.setBackground(makeClusterBackground()); + mClusterManager = clusterManager; + } + + @Override + public void onAdd() { + mClusterManager.getMarkerCollection().setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() { + @Override + public boolean onMarkerClick(Marker marker) { + return mItemClickListener != null && mItemClickListener.onClusterItemClick(mMarkerCache.get(marker)); + } + }); + + + mClusterManager.getClusterMarkerCollection().setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() { + @Override + public boolean onMarkerClick(Marker marker) { + return mClickListener != null && mClickListener.onClusterClick(mMarkerToCluster.get(marker)); + } + }); + + } + + @Override + public void onRemove() { + mClusterManager.getMarkerCollection().setOnMarkerClickListener(null); + mClusterManager.getClusterMarkerCollection().setOnMarkerClickListener(null); + } + + private LayerDrawable makeClusterBackground() { + mColoredCircleBackground = new ShapeDrawable(new OvalShape()); + ShapeDrawable outline = new ShapeDrawable(new OvalShape()); + outline.getPaint().setColor(0x80ffffff); // Transparent white. + LayerDrawable background = new LayerDrawable(new Drawable[]{outline, mColoredCircleBackground}); + int strokeWidth = (int) (mDensity * 3); + background.setLayerInset(1, strokeWidth, strokeWidth, strokeWidth, strokeWidth); + return background; + } + + private com.baidu.mapapi.clusterutil.ui.SquareTextView makeSquareTextView(Context context) { + com.baidu.mapapi.clusterutil.ui.SquareTextView squareTextView = + new com.baidu.mapapi.clusterutil.ui.SquareTextView(context); + ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT); + squareTextView.setLayoutParams(layoutParams); + squareTextView.setId(R.id.text); + int twelveDpi = (int) (12 * mDensity); + squareTextView.setPadding(twelveDpi, twelveDpi, twelveDpi, twelveDpi); + return squareTextView; + } + + private int getColor(int clusterSize) { + final float hueRange = 220; + final float sizeRange = 300; + final float size = Math.min(clusterSize, sizeRange); + final float hue = (sizeRange - size) * (sizeRange - size) / (sizeRange * sizeRange) * hueRange; + return Color.HSVToColor(new float[]{ + hue, 1f, .6f + }); + } + + protected String getClusterText(int bucket) { + if (bucket < BUCKETS[0]) { + return String.valueOf(bucket); + } + return String.valueOf(bucket) + "+"; + } + + /** + * Gets the "bucket" for a particular cluster. By default, uses the number of points within the + * cluster, bucketed to some set points. + */ + protected int getBucket(Cluster cluster) { + int size = cluster.getSize(); + if (size <= BUCKETS[0]) { + return size; + } + for (int i = 0; i < BUCKETS.length - 1; i++) { + if (size < BUCKETS[i + 1]) { + return BUCKETS[i]; + } + } + return BUCKETS[BUCKETS.length - 1]; + } + + /** + * ViewModifier ensures only one re-rendering of the view occurs at a time, and schedules + * re-rendering, which is performed by the RenderTask. + */ + @SuppressLint("HandlerLeak") + private class ViewModifier extends Handler { + private static final int RUN_TASK = 0; + private static final int TASK_FINISHED = 1; + private boolean mViewModificationInProgress = false; + private RenderTask mNextClusters = null; + + @Override + public void handleMessage(Message msg) { + if (msg.what == TASK_FINISHED) { + mViewModificationInProgress = false; + if (mNextClusters != null) { + // Run the task that was queued up. + sendEmptyMessage(RUN_TASK); + } + return; + } + removeMessages(RUN_TASK); + + if (mViewModificationInProgress) { + // Busy - wait for the callback. + return; + } + + if (mNextClusters == null) { + // Nothing to do. + return; + } + + RenderTask renderTask; + synchronized (this) { + renderTask = mNextClusters; + mNextClusters = null; + mViewModificationInProgress = true; + } + + renderTask.setCallback(new Runnable() { + @Override + public void run() { + sendEmptyMessage(TASK_FINISHED); + } + }); + renderTask.setProjection(mMap.getProjection()); + renderTask.setMapZoom(mMap.getMapStatus().zoom); + new Thread(renderTask).start(); + } + + public void queue(Set> clusters) { + synchronized (this) { + // Overwrite any pending cluster tasks - we don't care about intermediate states. + mNextClusters = new RenderTask(clusters); + } + sendEmptyMessage(RUN_TASK); + } + } + + /** + * Determine whether the cluster should be rendered as individual markers or a cluster. + */ + protected boolean shouldRenderAsCluster(Cluster cluster) { + return cluster.getSize() >= MIN_CLUSTER_SIZE; + } + + /** + * Transforms the current view (represented by DefaultClusterRenderer.mClusters and DefaultClusterRenderer.mZoom) to a + * new zoom level and set of clusters. + *

    + * This must be run off the UI thread. Work is coordinated in the RenderTask, then queued up to + * be executed by a MarkerModifier. + *

    + * There are three stages for the render: + *

    + * 1. Markers are added to the map + *

    + * 2. Markers are animated to their final position + *

    + * 3. Any old markers are removed from the map + *

    + * When zooming in, markers are animated out from the nearest existing cluster. When zooming + * out, existing clusters are animated to the nearest new cluster. + */ + private class RenderTask implements Runnable { + final Set> clusters; + private Runnable mCallback; + private Projection mProjection; + private SphericalMercatorProjection mSphericalMercatorProjection; + private float mMapZoom; + + private RenderTask(Set> clusters) { + this.clusters = clusters; + } + + /** + * A callback to be run when all work has been completed. + * + * @param callback + */ + public void setCallback(Runnable callback) { + mCallback = callback; + } + + public void setProjection(Projection projection) { + this.mProjection = projection; + } + + public void setMapZoom(float zoom) { + this.mMapZoom = zoom; + this.mSphericalMercatorProjection = + new SphericalMercatorProjection(256 * Math.pow(2, Math.min(zoom, mZoom))); + } + + @SuppressLint("NewApi") + public void run() { + if (clusters.equals(DefaultClusterRenderer.this.mClusters)) { + mCallback.run(); + return; + } + + final MarkerModifier markerModifier = new MarkerModifier(); + + final float zoom = mMapZoom; + final boolean zoomingIn = zoom > mZoom; + final float zoomDelta = zoom - mZoom; + + final Set markersToRemove = mMarkers; + final LatLngBounds visibleBounds = mMap.getMapStatus().bound; + // TODO: Add some padding, so that markers can animate in from off-screen. + + // Find all of the existing clusters that are on-screen. These are candidates for + // markers to animate from. + List existingClustersOnScreen = null; + if (DefaultClusterRenderer.this.mClusters != null && SHOULD_ANIMATE) { + existingClustersOnScreen = new ArrayList(); + for (Cluster c : DefaultClusterRenderer.this.mClusters) { + if (shouldRenderAsCluster(c) && visibleBounds.contains(c.getPosition())) { + Point point = mSphericalMercatorProjection.toPoint(c.getPosition()); + existingClustersOnScreen.add(point); + } + } + } + + // Create the new markers and animate them to their new positions. + final Set newMarkers = Collections.newSetFromMap( + new ConcurrentHashMap()); + for (Cluster c : clusters) { + boolean onScreen = visibleBounds.contains(c.getPosition()); + if (zoomingIn && onScreen && SHOULD_ANIMATE) { + Point point = mSphericalMercatorProjection.toPoint(c.getPosition()); + Point closest = findClosestCluster(existingClustersOnScreen, point); + if (closest != null) { + LatLng animateTo = mSphericalMercatorProjection.toLatLng(closest); + markerModifier.add(true, new CreateMarkerTask(c, newMarkers, animateTo)); + } else { + markerModifier.add(true, new CreateMarkerTask(c, newMarkers, null)); + } + } else { + markerModifier.add(onScreen, new CreateMarkerTask(c, newMarkers, null)); + } + } + + // Wait for all markers to be added. + markerModifier.waitUntilFree(); + + // Don't remove any markers that were just added. This is basically anything that had + // a hit in the MarkerCache. + markersToRemove.removeAll(newMarkers); + + // Find all of the new clusters that were added on-screen. These are candidates for + // markers to animate from. + List newClustersOnScreen = null; + if (SHOULD_ANIMATE) { + newClustersOnScreen = new ArrayList(); + for (Cluster c : clusters) { + if (shouldRenderAsCluster(c) && visibleBounds.contains(c.getPosition())) { + Point p = mSphericalMercatorProjection.toPoint(c.getPosition()); + newClustersOnScreen.add(p); + } + } + } + + // Remove the old markers, animating them into clusters if zooming out. + for (final MarkerWithPosition marker : markersToRemove) { + boolean onScreen = visibleBounds.contains(marker.position); + // Don't animate when zooming out more than 3 zoom levels. + // TODO: drop animation based on speed of device & number of markers to animate. + if (!zoomingIn && zoomDelta > -3 && onScreen && SHOULD_ANIMATE) { + final Point point = mSphericalMercatorProjection.toPoint(marker.position); + final Point closest = findClosestCluster(newClustersOnScreen, point); + if (closest != null) { + LatLng animateTo = mSphericalMercatorProjection.toLatLng(closest); + markerModifier.animateThenRemove(marker, marker.position, animateTo); + } else { + markerModifier.remove(true, marker.marker); + } + } else { + markerModifier.remove(onScreen, marker.marker); + } + } + + markerModifier.waitUntilFree(); + + mMarkers = newMarkers; + DefaultClusterRenderer.this.mClusters = clusters; + mZoom = zoom; + + mCallback.run(); + } + } + + @Override + public void onClustersChanged(Set> clusters) { + mViewModifier.queue(clusters); + } + + @Override + public void setOnClusterClickListener(ClusterManager.OnClusterClickListener listener) { + mClickListener = listener; + } + + @Override + public void setOnClusterInfoWindowClickListener(ClusterManager + .OnClusterInfoWindowClickListener listener) { + mInfoWindowClickListener = listener; + } + + @Override + public void setOnClusterItemClickListener(ClusterManager.OnClusterItemClickListener listener) { + mItemClickListener = listener; + } + + @Override + public void setOnClusterItemInfoWindowClickListener(ClusterManager + .OnClusterItemInfoWindowClickListener listener) { + mItemInfoWindowClickListener = listener; + } + + private static double distanceSquared(Point a, Point b) { + return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y); + } + + private static Point findClosestCluster(List markers, Point point) { + if (markers == null || markers.isEmpty()) { + return null; + } + + // TODO: make this configurable. + double minDistSquared = MAX_DISTANCE_AT_ZOOM * MAX_DISTANCE_AT_ZOOM; + Point closest = null; + for (Point candidate : markers) { + double dist = distanceSquared(candidate, point); + if (dist < minDistSquared) { + closest = candidate; + minDistSquared = dist; + } + } + return closest; + } + + /** + * Handles all markerWithPosition manipulations on the map. Work (such as adding, removing, or + * animating a markerWithPosition) is performed while trying not to block the rest of the app's + * UI. + */ + @SuppressLint("HandlerLeak") + private class MarkerModifier extends Handler implements MessageQueue.IdleHandler { + private static final int BLANK = 0; + + private final Lock lock = new ReentrantLock(); + private final Condition busyCondition = lock.newCondition(); + + private Queue mCreateMarkerTasks = new LinkedList(); + private Queue mOnScreenCreateMarkerTasks = new LinkedList(); + private Queue mRemoveMarkerTasks = new LinkedList(); + private Queue mOnScreenRemoveMarkerTasks = new LinkedList(); + private Queue mAnimationTasks = new LinkedList(); + + /** + * Whether the idle listener has been added to the UI thread's MessageQueue. + */ + private boolean mListenerAdded; + + private MarkerModifier() { + super(Looper.getMainLooper()); + } + + /** + * Creates markers for a cluster some time in the future. + * + * @param priority whether this operation should have priority. + */ + public void add(boolean priority, CreateMarkerTask c) { + lock.lock(); + sendEmptyMessage(BLANK); + if (priority) { + mOnScreenCreateMarkerTasks.add(c); + } else { + mCreateMarkerTasks.add(c); + } + lock.unlock(); + } + + /** + * Removes a markerWithPosition some time in the future. + * + * @param priority whether this operation should have priority. + * @param m the markerWithPosition to remove. + */ + public void remove(boolean priority, Marker m) { + lock.lock(); + sendEmptyMessage(BLANK); + if (priority) { + mOnScreenRemoveMarkerTasks.add(m); + } else { + mRemoveMarkerTasks.add(m); + } + lock.unlock(); + } + + /** + * Animates a markerWithPosition some time in the future. + * + * @param marker the markerWithPosition to animate. + * @param from the position to animate from. + * @param to the position to animate to. + */ + public void animate(MarkerWithPosition marker, LatLng from, LatLng to) { + lock.lock(); + mAnimationTasks.add(new AnimationTask(marker, from, to)); + lock.unlock(); + } + + /** + * Animates a markerWithPosition some time in the future, and removes it when the animation + * is complete. + * + * @param marker the markerWithPosition to animate. + * @param from the position to animate from. + * @param to the position to animate to. + */ + public void animateThenRemove(MarkerWithPosition marker, LatLng from, LatLng to) { + lock.lock(); + AnimationTask animationTask = new AnimationTask(marker, from, to); + animationTask.removeOnAnimationComplete(mClusterManager.getMarkerManager()); + mAnimationTasks.add(animationTask); + lock.unlock(); + } + + @Override + public void handleMessage(Message msg) { + if (!mListenerAdded) { + Looper.myQueue().addIdleHandler(this); + mListenerAdded = true; + } + removeMessages(BLANK); + + lock.lock(); + try { + + // Perform up to 10 tasks at once. + // Consider only performing 10 remove tasks, not adds and animations. + // Removes are relatively slow and are much better when batched. + for (int i = 0; i < 10; i++) { + performNextTask(); + } + + if (!isBusy()) { + mListenerAdded = false; + Looper.myQueue().removeIdleHandler(this); + // Signal any other threads that are waiting. + busyCondition.signalAll(); + } else { + // Sometimes the idle queue may not be called - schedule up some work regardless + // of whether the UI thread is busy or not. + // TODO: try to remove this. + sendEmptyMessageDelayed(BLANK, 10); + } + } finally { + lock.unlock(); + } + } + + /** + * Perform the next task. Prioritise any on-screen work. + */ + private void performNextTask() { + if (!mOnScreenRemoveMarkerTasks.isEmpty()) { + removeMarker(mOnScreenRemoveMarkerTasks.poll()); + } else if (!mAnimationTasks.isEmpty()) { + mAnimationTasks.poll().perform(); + } else if (!mOnScreenCreateMarkerTasks.isEmpty()) { + mOnScreenCreateMarkerTasks.poll().perform(this); + } else if (!mCreateMarkerTasks.isEmpty()) { + mCreateMarkerTasks.poll().perform(this); + } else if (!mRemoveMarkerTasks.isEmpty()) { + removeMarker(mRemoveMarkerTasks.poll()); + } + } + + private void removeMarker(Marker m) { + Cluster cluster = mMarkerToCluster.get(m); + mClusterToMarker.remove(cluster); + mMarkerCache.remove(m); + mMarkerToCluster.remove(m); + mClusterManager.getMarkerManager().remove(m); + } + + /** + * @return true if there is still work to be processed. + */ + public boolean isBusy() { + try { + lock.lock(); + return !(mCreateMarkerTasks.isEmpty() && mOnScreenCreateMarkerTasks.isEmpty() + && mOnScreenRemoveMarkerTasks.isEmpty() && mRemoveMarkerTasks.isEmpty() + && mAnimationTasks.isEmpty()); + } finally { + lock.unlock(); + } + } + + /** + * Blocks the calling thread until all work has been processed. + */ + public void waitUntilFree() { + while (isBusy()) { + // Sometimes the idle queue may not be called - schedule up some work regardless + // of whether the UI thread is busy or not. + // TODO: try to remove this. + sendEmptyMessage(BLANK); + lock.lock(); + try { + if (isBusy()) { + busyCondition.await(); + } + } catch (InterruptedException e) { + throw new RuntimeException(e); + } finally { + lock.unlock(); + } + } + } + + @Override + public boolean queueIdle() { + // When the UI is not busy, schedule some work. + sendEmptyMessage(BLANK); + return true; + } + } + + /** + * A cache of markers representing individual ClusterItems. + */ + private static class MarkerCache { + private Map mCache = new HashMap(); + private Map mCacheReverse = new HashMap(); + + public Marker get(T item) { + return mCache.get(item); + } + + public T get(Marker m) { + return mCacheReverse.get(m); + } + + public void put(T item, Marker m) { + mCache.put(item, m); + mCacheReverse.put(m, item); + } + + public void remove(Marker m) { + T item = mCacheReverse.get(m); + mCacheReverse.remove(m); + mCache.remove(item); + } + } + + /** + * Called before the marker for a ClusterItem is added to the map. + */ + protected void onBeforeClusterItemRendered(T item, MarkerOptions markerOptions) { + } + + /** + * Called before the marker for a Cluster is added to the map. + * The default implementation draws a circle with a rough count of the number of items. + */ + protected void onBeforeClusterRendered(Cluster cluster, MarkerOptions markerOptions) { + int bucket = getBucket(cluster); + BitmapDescriptor descriptor = mIcons.get(bucket); + if (descriptor == null) { +// mColoredCircleBackground.getPaint().setColor(getColor(bucket)); + descriptor = BitmapDescriptorFactory.fromBitmap(mIconGenerator.makeIcon(getClusterText(bucket))); + mIcons.put(bucket, descriptor); + } + // TODO: consider adding anchor(.5, .5) (Individual markers will overlap more often) + markerOptions.icon(descriptor); + } + + /** + * Called after the marker for a Cluster has been added to the map. + */ + protected void onClusterRendered(Cluster cluster, Marker marker) { + } + + /** + * Called after the marker for a ClusterItem has been added to the map. + */ + protected void onClusterItemRendered(T clusterItem, Marker marker) { + } + + /** + * Get the marker from a ClusterItem + * + * @param clusterItem ClusterItem which you will obtain its marker + * @return a marker from a ClusterItem or null if it does not exists + */ + public Marker getMarker(T clusterItem) { + return mMarkerCache.get(clusterItem); + } + + /** + * Get the marker from a Cluster + * + * @param cluster which you will obtain its marker + * @return a marker from a cluster or null if it does not exists + */ + public Marker getMarker(Cluster cluster) { + return mClusterToMarker.get(cluster); + } + + /** + * Get the ClusterItem from a marker + * + * @param marker which you will obtain its ClusterItem + * @return a ClusterItem from a marker or null if it does not exists + */ + public T getClusterItem(Marker marker) { + return mMarkerCache.get(marker); + } + + /** + * Get the Cluster from a marker + * + * @param marker which you will obtain its Cluster + * @return a Cluster from a marker or null if it does not exists + */ + public Cluster getCluster(Marker marker) { + return mMarkerToCluster.get(marker); + } + + /** + * Creates markerWithPosition(s) for a particular cluster, animating it if necessary. + */ + private class CreateMarkerTask { + private final Cluster cluster; + private final Set newMarkers; + private final LatLng animateFrom; + + /** + * @param c the cluster to render. + * @param markersAdded a collection of markers to append any created markers. + * @param animateFrom the location to animate the markerWithPosition from, or null if no + * animation is required. + */ + public CreateMarkerTask(Cluster c, Set markersAdded, LatLng animateFrom) { + this.cluster = c; + this.newMarkers = markersAdded; + this.animateFrom = animateFrom; + } + + private void perform(MarkerModifier markerModifier) { + // Don't show small clusters. Render the markers inside, instead. + if (!shouldRenderAsCluster(cluster)) { + for (T item : cluster.getItems()) { + Marker marker = mMarkerCache.get(item); + MarkerWithPosition markerWithPosition; + if (marker == null) { + MarkerOptions markerOptions = new MarkerOptions(); + if (animateFrom != null) { + markerOptions.position(animateFrom); + markerOptions.icon(item.getBitmapDescriptor()); + } else { + markerOptions.position(item.getPosition()); + markerOptions.icon(item.getBitmapDescriptor()); + } + onBeforeClusterItemRendered(item, markerOptions); + marker = mClusterManager.getMarkerCollection().addMarker(markerOptions); + markerWithPosition = new MarkerWithPosition(marker); + mMarkerCache.put(item, marker); + if (animateFrom != null) { + markerModifier.animate(markerWithPosition, animateFrom, item.getPosition()); + } + } else { + markerWithPosition = new MarkerWithPosition(marker); + } + onClusterItemRendered(item, marker); + newMarkers.add(markerWithPosition); + } + return; + } + + MarkerOptions markerOptions = new MarkerOptions() + .position(animateFrom == null ? cluster.getPosition() : animateFrom); + + onBeforeClusterRendered(cluster, markerOptions); + + Marker marker = mClusterManager.getClusterMarkerCollection().addMarker(markerOptions); + mMarkerToCluster.put(marker, cluster); + mClusterToMarker.put(cluster, marker); + MarkerWithPosition markerWithPosition = new MarkerWithPosition(marker); + if (animateFrom != null) { + markerModifier.animate(markerWithPosition, animateFrom, cluster.getPosition()); + } + onClusterRendered(cluster, marker); + newMarkers.add(markerWithPosition); + } + } + + /** + * A Marker and its position. Marker.getPosition() must be called from the UI thread, so this + * object allows lookup from other threads. + */ + private static class MarkerWithPosition { + private final Marker marker; + private LatLng position; + + private MarkerWithPosition(Marker marker) { + this.marker = marker; + position = marker.getPosition(); + } + + @Override + public boolean equals(Object other) { + if (other instanceof MarkerWithPosition) { + return marker.equals(((MarkerWithPosition) other).marker); + } + return false; + } + + @Override + public int hashCode() { + return marker.hashCode(); + } + } + + private static final TimeInterpolator ANIMATION_INTERP = new DecelerateInterpolator(); + + /** + * Animates a markerWithPosition from one position to another. TODO: improve performance for + * slow devices (e.g. Nexus S). + */ + @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR1) + private class AnimationTask extends AnimatorListenerAdapter implements ValueAnimator.AnimatorUpdateListener { + private final MarkerWithPosition markerWithPosition; + private final Marker marker; + private final LatLng from; + private final LatLng to; + private boolean mRemoveOnComplete; + private MarkerManager mMarkerManager; + + private AnimationTask(MarkerWithPosition markerWithPosition, LatLng from, LatLng to) { + this.markerWithPosition = markerWithPosition; + this.marker = markerWithPosition.marker; + this.from = from; + this.to = to; + } + + public void perform() { + ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 1); + valueAnimator.setInterpolator(ANIMATION_INTERP); + valueAnimator.addUpdateListener(this); + valueAnimator.addListener(this); + valueAnimator.start(); + } + + @Override + public void onAnimationEnd(Animator animation) { + if (mRemoveOnComplete) { + Cluster cluster = mMarkerToCluster.get(marker); + mClusterToMarker.remove(cluster); + mMarkerCache.remove(marker); + mMarkerToCluster.remove(marker); + mMarkerManager.remove(marker); + } + markerWithPosition.position = to; + } + + public void removeOnAnimationComplete(MarkerManager markerManager) { + mMarkerManager = markerManager; + mRemoveOnComplete = true; + } + + @Override + public void onAnimationUpdate(ValueAnimator valueAnimator) { + float fraction = valueAnimator.getAnimatedFraction(); + double lat = (to.latitude - from.latitude) * fraction + from.latitude; + double lngDelta = to.longitude - from.longitude; + + // Take the shortest path across the 180th meridian. + if (Math.abs(lngDelta) > 180) { + lngDelta -= Math.signum(lngDelta) * 360; + } + double lng = lngDelta * fraction + from.longitude; + LatLng position = new LatLng(lat, lng); + marker.setPosition(position); + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/clustering/view/MyClusterRenderer.java b/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/clustering/view/MyClusterRenderer.java new file mode 100644 index 0000000000000000000000000000000000000000..591b393981dd1b90cdaf6c6d46e85125315394d8 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/clustering/view/MyClusterRenderer.java @@ -0,0 +1,158 @@ +package com.baidu.mapapi.clusterutil.clustering.view; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.baidu.mapapi.clusterutil.clustering.Cluster; +import com.baidu.mapapi.clusterutil.clustering.ClusterManager; +import com.baidu.mapapi.map.BaiduMap; +import com.baidu.mapapi.map.BitmapDescriptor; +import com.baidu.mapapi.map.BitmapDescriptorFactory; +import com.baidu.mapapi.map.MarkerOptions; +import com.jiuqi.elove.R; +import com.jiuqi.elove.activity.NearbyMapActivity; +import com.jiuqi.elove.util.CommonUtil; +import com.jiuqi.elove.util.EasyGlide; +import com.jiuqi.elove.util.MyLayoutManager; +import com.jiuqi.elove.util.SupportMultiScreenUtil; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +import de.hdodenhof.circleimageview.CircleImageView; + +/** + * Created by jq on 2017/12/5. + */ + +public class MyClusterRenderer extends DefaultClusterRenderer{ + + protected Context context; + protected static List mAList = new ArrayList<>(); + + public MyClusterRenderer(Context context, BaiduMap map, ClusterManager clusterManager) { + super(context, map, clusterManager); + this.context = context; + } + + @Override + protected void onBeforeClusterRendered(Cluster cluster, MarkerOptions markerOptions) { + Collection mList = cluster.getItems(); + Iterator iterator = mList.iterator(); + int count = mList.size(); + View view = LayoutInflater.from(context).inflate(R.layout.layout_locate_avatar_group,null); + SupportMultiScreenUtil.scale(view); + CircleImageView iv_first = (CircleImageView) view.findViewById(R.id.iv_first); + CircleImageView iv_second = (CircleImageView) view.findViewById(R.id.iv_second); + CircleImageView iv_third = (CircleImageView) view.findViewById(R.id.iv_third); + CircleImageView iv_fourth = (CircleImageView) view.findViewById(R.id.iv_fourth); + TextView tv_number = (TextView) view.findViewById(R.id.tv_number); +// TextView tv_first = (TextView) view.findViewById(R.id.tv_first); +// TextView tv_second = (TextView) view.findViewById(R.id.tv_second); +// TextView tv_third = (TextView) view.findViewById(R.id.tv_third); +// TextView tv_fourth = (TextView) view.findViewById(R.id.tv_fourth); + if(count>9){ + tv_number.setText(9+"+"); + }else{ + tv_number.setText(count+""); + } + if (count == 1) { +// String avatar1 = iterator.next().getModel().getAvatar(); + Bitmap avatar1 = iterator.next().getBitmap(); +// CircleImageView circleImageView = new CircleImageView(context); +// circleImageView.setImageBitmap(avatar1); +// circleImageView.setImageAlpha(0); + iv_first.setVisibility(View.VISIBLE); + iv_second.setVisibility(View.GONE); + iv_third.setVisibility(View.GONE); + iv_fourth.setVisibility(View.GONE); + MyLayoutManager.setImageLayout(iv_first,1, CommonUtil.dip2px(context,25f),CommonUtil.dip2px(context,25f)); +// ll_first.addView(circleImageView); +// EasyGlide.getInstance().showImageCircle(avatar1, iv_first); + iv_first.setImageBitmap(avatar1); + } else if (count == 2) { +// String avatar1 = iterator.next().getModel().getAvatar(); +// String avatar2 = iterator.next().getModel().getAvatar(); + Bitmap avatar1 = iterator.next().getBitmap(); + Bitmap avatar2 = iterator.next().getBitmap(); + iv_first.setVisibility(View.VISIBLE); + iv_second.setVisibility(View.VISIBLE); + iv_third.setVisibility(View.GONE); + iv_fourth.setVisibility(View.GONE); + int wh = CommonUtil.dip2px(context,12f); + MyLayoutManager.setImageLayout(iv_first,1,wh,wh); + MyLayoutManager.setImageLayout(iv_second,1,wh,wh); + iv_first.setImageBitmap(avatar1); + iv_second.setImageBitmap(avatar2); +// EasyGlide.getInstance().showImageCircle(avatar1, iv_first); +// EasyGlide.getInstance().showImageCircle(avatar2, iv_second); + } else if (count == 3) { +// String avatar1 = iterator.next().getModel().getAvatar(); +// String avatar2 = iterator.next().getModel().getAvatar(); +// String avatar3 = iterator.next().getModel().getAvatar(); + Bitmap avatar1 = iterator.next().getBitmap(); + Bitmap avatar2 = iterator.next().getBitmap(); + Bitmap avatar3 = iterator.next().getBitmap(); + iv_first.setVisibility(View.GONE); + iv_second.setVisibility(View.VISIBLE); + iv_third.setVisibility(View.VISIBLE); + iv_fourth.setVisibility(View.VISIBLE); + int wh = CommonUtil.dip2px(context,11f); + MyLayoutManager.setImageLayout(iv_third,1,wh,wh); + MyLayoutManager.setImageLayout(iv_second,1,wh,wh); + MyLayoutManager.setImageLayout(iv_fourth,1,wh,wh); + iv_second.setImageBitmap(avatar1); + iv_third.setImageBitmap(avatar2); + iv_fourth.setImageBitmap(avatar3); +// EasyGlide.getInstance().showImageCircle(avatar1, iv_fourth); +// EasyGlide.getInstance().showImageCircle(avatar2, iv_second); +// EasyGlide.getInstance().showImageCircle(avatar3, iv_third); + } else if (count > 3) { +// String avatar1 = iterator.next().getModel().getAvatar(); +// String avatar2 = iterator.next().getModel().getAvatar(); +// String avatar3 = iterator.next().getModel().getAvatar(); +// String avatar4 = iterator.next().getModel().getAvatar(); + Bitmap avatar1 = iterator.next().getBitmap(); + Bitmap avatar2 = iterator.next().getBitmap(); + Bitmap avatar3 = iterator.next().getBitmap(); + Bitmap avatar4 = iterator.next().getBitmap(); + iv_first.setVisibility(View.VISIBLE); + iv_second.setVisibility(View.VISIBLE); + iv_third.setVisibility(View.VISIBLE); + iv_fourth.setVisibility(View.VISIBLE); + int wh = CommonUtil.dip2px(context,10f); + MyLayoutManager.setImageLayout(iv_first,1,wh,wh); + MyLayoutManager.setImageLayout(iv_second,1,wh,wh); + MyLayoutManager.setImageLayout(iv_third,1,wh,wh); + MyLayoutManager.setImageLayout(iv_fourth,1,wh,wh); +// EasyGlide.getInstance().showImageCircle(avatar1, iv_first); +// EasyGlide.getInstance().showImageCircle(avatar2, iv_second); +// EasyGlide.getInstance().showImageCircle(avatar3, iv_third); +// EasyGlide.getInstance().showImageCircle(avatar4, iv_fourth); + iv_first.setImageBitmap(avatar1); + iv_second.setImageBitmap(avatar2); + iv_third.setImageBitmap(avatar3); + iv_fourth.setImageBitmap(avatar4); + } + BitmapDescriptor descriptor = BitmapDescriptorFactory.fromView(view); + if(descriptor!=null){ + mAList.add(descriptor); + markerOptions.icon(descriptor); + } + } + + public static void clearList(){ + for(int i=0;i= minX && bounds.maxX <= maxX && bounds.minY >= minY && bounds.maxY <= maxY; + } + + public boolean intersects(double minX, double maxX, double minY, double maxY) { + return minX < this.maxX && this.minX < maxX && minY < this.maxY && this.minY < maxY; + } + + public boolean intersects(Bounds bounds) { + return intersects(bounds.minX, bounds.maxX, bounds.minY, bounds.maxY); + } + +} \ No newline at end of file diff --git a/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/projection/Point.java b/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/projection/Point.java new file mode 100644 index 0000000000000000000000000000000000000000..962b56e437cbf781215ba6b1d6eaa43aef815233 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/projection/Point.java @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2015 Baidu, Inc. All Rights Reserved. + */ + +package com.baidu.mapapi.clusterutil.projection; + +public class Point { + public final double x; + public final double y; + + public Point(double x, double y) { + this.x = x; + this.y = y; + } + + @Override + public String toString() { + return "Point{" + + "x=" + x + + ", y=" + y + + '}'; + } +} diff --git a/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/projection/SphericalMercatorProjection.java b/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/projection/SphericalMercatorProjection.java new file mode 100644 index 0000000000000000000000000000000000000000..3583a577f9967ee84cda235b2c5fd3e19dd1a4a4 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/projection/SphericalMercatorProjection.java @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2015 Baidu, Inc. All Rights Reserved. + */ +package com.baidu.mapapi.clusterutil.projection; + + +import com.baidu.mapapi.model.LatLng; + +public class SphericalMercatorProjection { + final double mWorldWidth; + + public SphericalMercatorProjection(final double worldWidth) { + mWorldWidth = worldWidth; + } + + @SuppressWarnings("deprecation") + public Point toPoint(final LatLng latLng) { + final double x = latLng.longitude / 360 + .5; + final double siny = Math.sin(Math.toRadians(latLng.latitude)); + final double y = 0.5 * Math.log((1 + siny) / (1 - siny)) / -(2 * Math.PI) + .5; + + return new Point(x * mWorldWidth, y * mWorldWidth); + } + + public LatLng toLatLng(Point point) { + final double x = point.x / mWorldWidth - 0.5; + final double lng = x * 360; + + double y = .5 - (point.y / mWorldWidth); + final double lat = 90 - Math.toDegrees(Math.atan(Math.exp(-y * 2 * Math.PI)) * 2); + + return new LatLng(lat, lng); + } +} diff --git a/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/quadtree/PointQuadTree.java b/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/quadtree/PointQuadTree.java new file mode 100644 index 0000000000000000000000000000000000000000..20ba122ca8d37921c7235377d375acf3bfc34b25 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/quadtree/PointQuadTree.java @@ -0,0 +1,214 @@ +/* + * Copyright (C) 2015 Baidu, Inc. All Rights Reserved. + */ + +package com.baidu.mapapi.clusterutil.quadtree; + + +import com.baidu.mapapi.clusterutil.projection.Bounds; +import com.baidu.mapapi.clusterutil.projection.Point; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/** + * A quad tree which tracks items with a Point geometry. + * See http://en.wikipedia.org/wiki/Quadtree for details on the data structure. + * This class is not thread safe. + */ +public class PointQuadTree { + + /** + * The bounds of this quad. + */ + private final Bounds mBounds; + + /** + * The depth of this quad in the tree. + */ + private final int mDepth; + + /** + * Maximum number of elements to store in a quad before splitting. + */ + private static final int MAX_ELEMENTS = 50; + + /** + * The elements inside this quad, if any. + */ + private List mItems; + + /** + * Maximum depth. + */ + private static final int MAX_DEPTH = 40; + + /** + * Child quads. + */ + private List> mChildren = null; + + /** + * Creates a new quad tree with specified bounds. + * + * @param minX + * @param maxX + * @param minY + * @param maxY + */ + public PointQuadTree(double minX, double maxX, double minY, double maxY) { + this(new Bounds(minX, maxX, minY, maxY)); + } + + public PointQuadTree(Bounds bounds) { + this(bounds, 0); + } + + private PointQuadTree(double minX, double maxX, double minY, double maxY, int depth) { + this(new Bounds(minX, maxX, minY, maxY), depth); + } + + private PointQuadTree(Bounds bounds, int depth) { + mBounds = bounds; + mDepth = depth; + } + + /** + * Insert an item. + */ + public void add(T item) { + Point point = item.getPoint(); + if (this.mBounds.contains(point.x, point.y)) { + insert(point.x, point.y, item); + } + } + + private void insert(double x, double y, T item) { + if (this.mChildren != null) { + // 四个区域进行控制 + if (y < mBounds.midY) { + if (x < mBounds.midX) { // top left + mChildren.get(0).insert(x, y, item); + } else { // top right + mChildren.get(1).insert(x, y, item); + } + } else { + if (x < mBounds.midX) { // bottom left + mChildren.get(2).insert(x, y, item); + } else { + mChildren.get(3).insert(x, y, item); + } + } + return; + } + if (mItems == null) { + mItems = new ArrayList(); + } + mItems.add(item); + if (mItems.size() > MAX_ELEMENTS && mDepth < MAX_DEPTH) { + split(); + } + } + + /** + * Split this quad. + */ + private void split() { + mChildren = new ArrayList>(4); + mChildren.add(new PointQuadTree(mBounds.minX, mBounds.midX, mBounds.minY, mBounds.midY, mDepth + 1)); + mChildren.add(new PointQuadTree(mBounds.midX, mBounds.maxX, mBounds.minY, mBounds.midY, mDepth + 1)); + mChildren.add(new PointQuadTree(mBounds.minX, mBounds.midX, mBounds.midY, mBounds.maxY, mDepth + 1)); + mChildren.add(new PointQuadTree(mBounds.midX, mBounds.maxX, mBounds.midY, mBounds.maxY, mDepth + 1)); + + List items = mItems; + mItems = null; + + for (T item : items) { + // re-insert items into child quads. + insert(item.getPoint().x, item.getPoint().y, item); + } + } + + /** + * Remove the given item from the set. + * + * @return whether the item was removed. + */ + public boolean remove(T item) { + Point point = item.getPoint(); + if (this.mBounds.contains(point.x, point.y)) { + return remove(point.x, point.y, item); + } else { + return false; + } + } + + private boolean remove(double x, double y, T item) { + if (this.mChildren != null) { + if (y < mBounds.midY) { + if (x < mBounds.midX) { // top left + return mChildren.get(0).remove(x, y, item); + } else { // top right + return mChildren.get(1).remove(x, y, item); + } + } else { + if (x < mBounds.midX) { // bottom left + return mChildren.get(2).remove(x, y, item); + } else { + return mChildren.get(3).remove(x, y, item); + } + } + } + else { + return mItems.remove(item); + } + } + + /** + * Removes all points from the quadTree + */ + public void clear() { + mChildren = null; + if (mItems != null) { + mItems.clear(); + } + } + + public interface Item { + + public Point getPoint(); + + } + + /** + * Search for all items within a given bounds. + */ + public Collection search(Bounds searchBounds) { + final List results = new ArrayList(); + search(searchBounds, results); + return results; + } + + private void search(Bounds searchBounds, Collection results) { + if (!mBounds.intersects(searchBounds)) { + return; + } + + if (this.mChildren != null) { + for (PointQuadTree quad : mChildren) { + quad.search(searchBounds, results); + } + } else if (mItems != null) { + if (searchBounds.contains(mBounds)) { + results.addAll(mItems); + } else { + for (T item : mItems) { + if (searchBounds.contains(item.getPoint())) { + results.add(item); + } + } + } + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/ui/IconGenerator.java b/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/ui/IconGenerator.java new file mode 100644 index 0000000000000000000000000000000000000000..806a74d59d7aa145c5fe03891985ca94e5511fa2 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/ui/IconGenerator.java @@ -0,0 +1,278 @@ +/* + * Copyright (C) 2015 Baidu, Inc. All Rights Reserved. + */ + +package com.baidu.mapapi.clusterutil.ui; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import com.jiuqi.elove.R; + +/** + * IconGenerator generates icons that contain text (or custom content) within an info + * window-like shape. + *

    + * The icon {@link Bitmap}s generated by the factory should be used in conjunction with a {@link + * com.baidu.mapapi.map.BitmapDescriptorFactory}. + *

    + * This class is not thread safe. + */ +public class IconGenerator { + private final Context mContext; + + private ViewGroup mContainer; + private RotationLayout mRotationLayout; + private TextView mTextView; +// private View mContentView; + + private int mRotation; + + private float mAnchorU = 0.5f; + private float mAnchorV = 1f; + + /** + * Creates a new IconGenerator with the default style. + */ + public IconGenerator(Context context) { + mContext = context; + mContainer = (ViewGroup) LayoutInflater.from(mContext).inflate(R.layout.text_bubble, null); + mRotationLayout = (RotationLayout) mContainer.getChildAt(0); + mTextView = (TextView) mContainer.findViewById(R.id.text);//自定义 + mTextView = (TextView) mRotationLayout.findViewById(R.id.text); + setStyle(STYLE_DEFAULT); + } + + /** + * Sets the text content, then creates an icon with the current style. + * + * @param text the text content to display inside the icon. + */ + public Bitmap makeIcon(String text) { + if (mTextView != null) { + mTextView.setText(text); + } + + return makeIcon(); + } + + /** + * Creates an icon with the current content and style. + *

    + * This method is useful if a custom view has previously been set, or if text content is not + * applicable. + */ + public Bitmap makeIcon() { + int measureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); + mContainer.measure(measureSpec, measureSpec); + + int measuredWidth = mContainer.getMeasuredWidth(); + int measuredHeight = mContainer.getMeasuredHeight(); + + mContainer.layout(0, 0, measuredWidth, measuredHeight); + + if (mRotation == 1 || mRotation == 3) { + measuredHeight = mContainer.getMeasuredWidth(); + measuredWidth = mContainer.getMeasuredHeight(); + } + + Bitmap r = Bitmap.createBitmap(measuredWidth, measuredHeight, Bitmap.Config.ARGB_8888); + r.eraseColor(Color.TRANSPARENT); + + Canvas canvas = new Canvas(r); + + if (mRotation != 0) { + // do nothing + if (mRotation == 1) { + canvas.translate(measuredWidth, 0); + canvas.rotate(90); + } else if (mRotation == 2) { + canvas.rotate(180, measuredWidth / 2, measuredHeight / 2); + } else { + canvas.translate(0, measuredHeight); + canvas.rotate(270); + } + } + mContainer.draw(canvas); + return r; + } + + /** + * Sets the child view for the icon. + *

    + * If the view contains a {@link TextView} with the id "text", operations such as {@link + * #setTextAppearance} and {@link #makeIcon(String)} will operate upon that {@link TextView}. + */ + public void setContentView(View contentView) { + mRotationLayout.removeAllViews(); + mRotationLayout.addView(contentView); +// mContentView = contentView;源代码 +// mContentView = contentView; +// final View view = mRotationLayout.findViewById(R.id.text); +// mTextView = view instanceof TextView ? (TextView) view : null; + } + + /** + * Rotates the contents of the icon. + * + * @param degrees the amount the contents should be rotated, as a multiple of 90 degrees. + */ + public void setContentRotation(int degrees) { + mRotationLayout.setViewRotation(degrees); + } + + /** + * Rotates the icon. + * + * @param degrees the amount the icon should be rotated, as a multiple of 90 degrees. + */ + public void setRotation(int degrees) { + mRotation = ((degrees + 360) % 360) / 90; + } + + + /** + * @return u coordinate of the anchor, with rotation applied. + */ + public float getAnchorU() { + return rotateAnchor(mAnchorU, mAnchorV); + } + + /** + * @return v coordinate of the anchor, with rotation applied. + */ + public float getAnchorV() { + return rotateAnchor(mAnchorV, mAnchorU); + } + + /** + * Rotates the anchor around (u, v) = (0, 0). + */ + private float rotateAnchor(float u, float v) { + switch (mRotation) { + case 0: + return u; + case 1: + return 1 - v; + case 2: + return 1 - u; + case 3: + return v; + default: + } + throw new IllegalStateException(); + } + + /** + * Sets the text color, size, style, hint color, and highlight color from the specified + * TextAppearance resource. + * + * @param resid the identifier of the resource. + */ + public void setTextAppearance(Context context, int resid) { + if (mTextView != null) { + mTextView.setTextAppearance(context, resid); + } + } + + /** + * Sets the text color, size, style, hint color, and highlight color from the specified + * TextAppearance resource. + * + * @param resid the identifier of the resource. + */ + public void setTextAppearance(int resid) { + setTextAppearance(mContext, resid); + } + + /** + * Sets the style of the icon. The style consists of a background and text appearance. + */ + public void setStyle(int style) { + setTextAppearance(mContext, getTextStyle(style)); + } + + /** + * Set the background to a given Drawable, or remove the background. + * + * @param background the Drawable to use as the background, or null to remove the background. + */ + @SuppressWarnings("deprecation") + // View#setBackgroundDrawable is compatible with pre-API level 16 (Jelly Bean). + public void setBackground(Drawable background) { + mContainer.setBackgroundDrawable(background); + + // Force setting of padding. + // setBackgroundDrawable does not call setPadding if the background has 0 padding. + if (background != null) { + Rect rect = new Rect(); + background.getPadding(rect); + mContainer.setPadding(rect.left, rect.top, rect.right, rect.bottom); + } else { + mContainer.setPadding(0, 0, 0, 0); + } + } + + /** + * Sets the padding of the content view. The default padding of the content view (i.e. text + * view) is 5dp top/bottom and 10dp left/right. + * + * @param left the left padding in pixels. + * @param top the top padding in pixels. + * @param right the right padding in pixels. + * @param bottom the bottom padding in pixels. + */ + public void setContentPadding(int left, int top, int right, int bottom) { +// mContentView.setPadding(left, top, right, bottom); + } + + public static final int STYLE_DEFAULT = 1; + public static final int STYLE_WHITE = 2; + public static final int STYLE_RED = 3; + public static final int STYLE_BLUE = 4; + public static final int STYLE_GREEN = 5; + public static final int STYLE_PURPLE = 6; + public static final int STYLE_ORANGE = 7; + + private static int getStyleColor(int style) { + switch (style) { + default: + case STYLE_DEFAULT: + case STYLE_WHITE: + return 0xffffffff; + case STYLE_RED: + return 0xffcc0000; + case STYLE_BLUE: + return 0xff0099cc; + case STYLE_GREEN: + return 0xff669900; + case STYLE_PURPLE: + return 0xff9933cc; + case STYLE_ORANGE: + return 0xffff8800; + } + } + + private static int getTextStyle(int style) { + switch (style) { + default: + case STYLE_DEFAULT: + case STYLE_WHITE: + return R.style.Bubble_TextAppearance_Dark; + case STYLE_RED: + case STYLE_BLUE: + case STYLE_GREEN: + case STYLE_PURPLE: + case STYLE_ORANGE: + return R.style.Bubble_TextAppearance_Light; + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/ui/RotationLayout.java b/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/ui/RotationLayout.java new file mode 100644 index 0000000000000000000000000000000000000000..604db330ba00953b850934eac9c95c518295f875 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/ui/RotationLayout.java @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2015 Baidu, Inc. All Rights Reserved. + */ + +package com.baidu.mapapi.clusterutil.ui; + +import android.content.Context; +import android.graphics.Canvas; +import android.util.AttributeSet; +import android.widget.FrameLayout; + +/** + * RotationLayout rotates the contents of the layout by multiples of 90 degrees. + *

    + * May not work with padding. + */ +public class RotationLayout extends FrameLayout { + private int mRotation; + + public RotationLayout(Context context) { + super(context); + } + + public RotationLayout(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public RotationLayout(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + if (mRotation == 1 || mRotation == 3) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + setMeasuredDimension(getMeasuredHeight(), getMeasuredWidth()); + } else { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + } + + /** + * @param degrees the rotation, in degrees. + */ + public void setViewRotation(int degrees) { + mRotation = ((degrees + 360) % 360) / 90; + } + + + @Override + public void dispatchDraw(Canvas canvas) { + if (mRotation == 0) { + super.dispatchDraw(canvas); + return; + } + + if (mRotation == 1) { + canvas.translate(getWidth(), 0); + canvas.rotate(90, getWidth() / 2, 0); + canvas.translate(getHeight() / 2, getWidth() / 2); + } else if (mRotation == 2) { + canvas.rotate(180, getWidth() / 2, getHeight() / 2); + } else { + canvas.translate(0, getHeight()); + canvas.rotate(270, getWidth() / 2, 0); + canvas.translate(getHeight() / 2, -getWidth() / 2); + } + + super.dispatchDraw(canvas); + } +} diff --git a/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/ui/SquareTextView.java b/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/ui/SquareTextView.java new file mode 100644 index 0000000000000000000000000000000000000000..7f6a41d5ee68f6819e9ac7879a2167a443d0208d --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/baidu/mapapi/clusterutil/ui/SquareTextView.java @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2015 Baidu, Inc. All Rights Reserved. + */ + +package com.baidu.mapapi.clusterutil.ui; + +import android.content.Context; +import android.graphics.Canvas; +import android.util.AttributeSet; +import android.widget.TextView; + +public class SquareTextView extends TextView { + private int mOffsetTop = 0; + private int mOffsetLeft = 0; + + public SquareTextView(Context context) { + super(context); + } + + public SquareTextView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public SquareTextView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + int width = getMeasuredWidth(); + int height = getMeasuredHeight(); + int dimension = Math.max(width, height); + if (width > height) { + mOffsetTop = width - height; + mOffsetLeft = 0; + } else { + mOffsetTop = 0; + mOffsetLeft = height - width; + } + setMeasuredDimension(dimension, dimension); + } + + @Override + public void draw(Canvas canvas) { + canvas.translate(mOffsetLeft / 2, mOffsetTop / 2); + super.draw(canvas); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/ABaseActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/ABaseActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..5a3e9198e64bb1b7e01530b3b2c8845e11669591 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/ABaseActivity.java @@ -0,0 +1,413 @@ +package com.jiuqi.elove.activity; + +import android.app.Activity; +import android.content.Context; +import android.content.pm.PackageManager; +import android.os.Bundle; +import android.os.IBinder; +import android.support.annotation.LayoutRes; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v4.app.ActivityCompat; +import android.support.v4.content.ContextCompat; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; +import android.text.TextUtils; +import android.view.MenuItem; +import android.view.MotionEvent; +import android.view.View; +import android.view.inputmethod.InputMethodManager; +import android.widget.EditText; +import android.widget.TextView; + +import com.gyf.barlibrary.ImmersionBar; +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.ActivityCollector; +import com.jiuqi.elove.common.PermissionListener; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.StatusBarUtil; +import com.jiuqi.elove.util.SupportMultiScreenUtil; +import com.umeng.analytics.MobclickAgent; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.ButterKnife; +import butterknife.Unbinder; + +/** + * 基类 + * Created by dl on 2017/6/15 + * ########################## + * toolbar的基础设置,点击返回 + * 多屏幕适配 + * 请求权限 + * 展示string类信息的toast + * 设置沉浸式状态栏 + * ########################## + */ +public class ABaseActivity extends AppCompatActivity implements Toolbar.OnMenuItemClickListener{ + + /** + * 数据 + */ + //是否显示返回等按钮 + public static final int MODE_BACK = 0; + public static final int MODE_DRAWER = 1; + public static final int MODE_NONE = 2; + public static final int MODE_HOME = 3; + public static final int MODE_TITLE = 4; + //是否需要添加状态栏高度且设置颜色 + public static final int HEIGHT_NONE_DARK = 1; + public static final int HEIGHT_IS_DARK = 2; + public static final int HEIGHT_NONE_LIGHT = 3; + public static final int HEIGHT_REDBG_WHITEFONT = 4; + public static final int HEIGHT_REDBG_WHITEFONT_NOINPUT = 6; + public static final int HEIGHT_VIEW_LIGHT = 5; + public static int activityCount;//用于判断当前应用程序是否在前台 + /** + * 工具 + */ + private static PermissionListener mListener; + protected Unbinder unbinder; + protected OkHttpUtil okHttpUtil = OkHttpUtil.getInstance(); + /** + * 控件 + */ + protected Toolbar toolbar; + protected TextView toolbar_title; + protected View rootView; + protected View statusView; + + /** + * 申请运行时权限 + */ + public static void requestRuntimePermission(String[] permissions,PermissionListener listener){ + Activity topActivity = ActivityCollector.getTopActivity(); + if(topActivity==null){ + return; + } + mListener = listener; + if (mListener != null) { + List permissionList = new ArrayList<>(); + for (String permission : permissions) { + if (ContextCompat.checkSelfPermission(topActivity, permission) != PackageManager.PERMISSION_GRANTED) { + permissionList.add(permission); + } + } + if (!permissionList.isEmpty()) { + ActivityCompat.requestPermissions(topActivity, permissionList.toArray(new String[permissionList.size()]), 1); +// ActivityCompat.requestPermissions(topActivity,(String[])permissionList.toArray(),1); + } else { + mListener.onGranted(); + } + } + } + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + ActivityCollector.addActivity(this); + } + + @Override + protected void onStart() { + super.onStart(); + ++activityCount; + } + + @Override + protected void onStop() { + super.onStop(); + --activityCount; + } + + @Override + public void setContentView(@LayoutRes int layoutResID) { + setContentView(layoutResID,-1,-1,MODE_BACK,HEIGHT_REDBG_WHITEFONT); + } + + public void setContentView(int layoutResID,int titleResID){ + setContentView(layoutResID, titleResID,-1,MODE_BACK,HEIGHT_REDBG_WHITEFONT); + } + + public void setContentView(int layoutResID,String title){ + setContentView(layoutResID, title,-1,MODE_BACK,HEIGHT_REDBG_WHITEFONT); + } + + public void setContentView(int layoutResID,int titleResID,int mode,int status){ + setContentView(layoutResID, titleResID,-1, mode,status); + } + + public void setContentView(int layoutResID,String title,int menuID,int mode,int status){ + super.setContentView(layoutResID); + supportMultiScreen();//多屏幕适配 + setUpToolbar(title,menuID,mode); + unbinder = ButterKnife.bind(this);//绑定 + //设置全屏并且设置状态栏颜色为黑色,之前只有特殊的页面才用全屏手动添加状态栏, + //但是由于产品主题色为白色需要设置状态栏字体为黑色,而有一些系统无法更改深色, + //在不支持更改颜色的手机上将状态栏加上透明度0.2f + if(HEIGHT_IS_DARK==status){//主题色为白色,全屏,状态栏改为黑色如果不支持加上透明状态栏保证状态栏字体可以看到,3.0.1因为变成了红色,所以不需要将状态栏改为黑色了,去掉了tatusBarDarkFont(true,0.2f) + ImmersionBar.with(this).statusBarColor(R.color.white).statusBarDarkFont(true,0.2f).fitsSystemWindows(true).init(); + }else if(HEIGHT_REDBG_WHITEFONT==status){ + ImmersionBar.with(this).statusBarColor(R.color.login_register).fitsSystemWindows(true).keyboardEnable(true).init(); + }else if(HEIGHT_REDBG_WHITEFONT_NOINPUT==status){ + ImmersionBar.with(this).statusBarColor(R.color.login_register).fitsSystemWindows(true).init(); + }else if(HEIGHT_NONE_DARK==status){ + ImmersionBar.with(this).statusBarDarkFont(true,0.2f).keyboardEnable(true).init(); + }else if(HEIGHT_NONE_LIGHT==status){ + ImmersionBar.with(this).keyboardEnable(true).init(); + }else if(HEIGHT_VIEW_LIGHT==status){ + statusView = easyFind(R.id.status_view); + StatusBarUtil.setStatusView(statusView,true); + ImmersionBar.with(this).statusBarView(statusView).init(); + } + } + + public void setContentView(int layoutResID,int titleResID,int menuID,int mode,int status){ + super.setContentView(layoutResID); + supportMultiScreen();//多屏幕适配 + setUpToolbar(titleResID,menuID,mode); + unbinder = ButterKnife.bind(this);//绑定 + //设置全屏并且设置状态栏颜色为黑色,之前只有特殊的页面才用全屏手动添加状态栏, + //但是由于产品主题色为白色需要设置状态栏字体为黑色,而有一些系统无法更改深色, + //在不支持更改颜色的手机上将状态栏加上透明度0.2f + if(HEIGHT_IS_DARK==status){ + ImmersionBar.with(this).statusBarColor(R.color.colorPrimaryDark).statusBarDarkFont(true,0.2f).fitsSystemWindows(true).init(); + }else if(HEIGHT_NONE_DARK==status){ + ImmersionBar.with(this).statusBarDarkFont(true,0.2f).keyboardEnable(true).init(); + }else if(HEIGHT_NONE_LIGHT==status){ + ImmersionBar.with(this).keyboardEnable(true).init(); + }else if(HEIGHT_REDBG_WHITEFONT==status){ + ImmersionBar.with(this).statusBarColor(R.color.login_register).fitsSystemWindows(true).keyboardEnable(true).init(); + }else if(HEIGHT_REDBG_WHITEFONT_NOINPUT==status){ + ImmersionBar.with(this).statusBarColor(R.color.login_register).fitsSystemWindows(true).keyboardEnable(true).init(); + } + } + + /** + * 多屏幕适配 + */ + private void supportMultiScreen() { + rootView = easyFind(android.R.id.content); + SupportMultiScreenUtil.scale(rootView); + } + + /** + * 设置toolbar + * @param titleResID 标题 + * @param menuID 菜单栏 + * @param mode 显示模式 + */ + protected void setUpToolbar(int titleResID, int menuID, int mode) { + if(mode!=MODE_NONE){ + toolbar = easyFind(R.id.toolbar); + toolbar_title = easyFind(R.id.toolbar_title); + if(mode!=-1){ + if(mode==MODE_BACK){ + toolbar.setNavigationIcon(R.drawable.icon_leftarrow_w); + }else{ + toolbar.setNavigationIcon(mode); + } + } + + toolbar.setNavigationOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + onNavigationClicked(); + } + }); + setUpTitle(titleResID); + setUpMenu(menuID); + } + } + + /** + * 设置toolbar + * @param titleResID 标题 + * @param menuID 菜单栏 + * @param mode 显示模式 + */ + protected void setUpToolbar(String titleResID, int menuID, int mode) { + if(mode!=MODE_NONE){ + toolbar = easyFind(R.id.toolbar); + toolbar_title = easyFind(R.id.toolbar_title); + if(mode!=-1){ + if(mode==MODE_BACK){ + toolbar.setNavigationIcon(R.drawable.icon_leftarrow_w); + }else{ + toolbar.setNavigationIcon(mode); + } + } + toolbar.setNavigationOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + onNavigationClicked(); + } + }); + setUpTitle(titleResID); + setUpMenu(menuID); + } + } + + /** + * 设置菜单栏 + * @param menuID 菜单选项 + */ + protected void setUpMenu(int menuID) { + if(toolbar!=null){ + toolbar.getMenu().clear(); + if(menuID>0){ + toolbar.inflateMenu(menuID); + toolbar.setOnMenuItemClickListener(this); + } + } + } + + /** + * 点击导航按钮 + */ + protected void onNavigationClicked() { + finish(); + } + + /** + * 设置标题 + * @param titleResID 标题资源 + */ + protected void setUpTitle(int titleResID) { + if(titleResID>0&&toolbar_title!=null){ + toolbar_title.setText(titleResID); + } + } + + /** + * 设置标题 + * @param title 标题资源 + */ + protected void setUpTitle(String title) { + if(!TextUtils.isEmpty(title)&&toolbar_title!=null){ + toolbar_title.setText(title); + } + } + + /** + * findViewById简化版 + * @param id + * @param + * @return + */ + protected T easyFind(int id){ + return (T)findViewById(id); + } + + @Override + public boolean onMenuItemClick(MenuItem item) { + return false; + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + if(grantResults.length>0){ + List deniedPermissions = new ArrayList<>(); + for(int i=0;i left && event.getX() < right && event.getY() > top && event.getY() < bottom) { + // 点击EditText的事件,忽略它。 + return false; + } else { + return true; + } + } + // 如果焦点不是EditText则忽略,这个发生在视图刚绘制完,第一个焦点不在EditView上,和用户用轨迹球选择其他的焦点 + return false; + } + + /** + * 多种隐藏软件盘方法的其中一种 + * + * @param token + */ + public void hideSoftInput(IBinder token) { + if (token != null) { + InputMethodManager im = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); + im.hideSoftInputFromWindow(token, InputMethodManager.HIDE_NOT_ALWAYS); + } + } + + @Override + protected void onResume() { + super.onResume(); + MobclickAgent.onResume(this); + } + + @Override + protected void onPause() { + super.onPause(); + MobclickAgent.onPause(this); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/ActReportActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/ActReportActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..f2751e2086c669239fb3f0040efc0215123b34c0 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/ActReportActivity.java @@ -0,0 +1,129 @@ +package com.jiuqi.elove.activity; + +import android.content.Intent; +import android.os.Bundle; +import android.text.Editable; +import android.text.TextWatcher; +import android.view.View; +import android.widget.EditText; +import android.widget.RelativeLayout; +import android.widget.TextView; +import com.alibaba.fastjson.JSONObject; +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; + +import butterknife.BindView; +import butterknife.OnClick; + +/** + * 活动举报页面 + * Created by dl on 2016/8/5. + */ +public class ActReportActivity extends ABaseActivity{ + + private static final String TAG = "ActReportActivity"; + /** + * 组件 + */ + @BindView(R.id.edt_report) + EditText edt_report; + @BindView(R.id.txt_num) + TextView txt_num;// 用来显示剩余字数 + @BindView(R.id.tv_actTitle) + TextView tv_actTitle;//显示举报活动的标题 + @BindView(R.id.tv_right) + TextView tv_right; + @BindView(R.id.rl_right_tv) + RelativeLayout rl_right_tv; + + /** + * 数据 + */ + private String actid;//活动ID + private String actTitle;// 举报活动标题 + private String reportid;// 举报人ID + private int type;//类型0:企业活动1:个人活动 + private int num = 300;//限制的最大字数 + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_report,R.string.act_report); + getDataFromActDetailAndSp(); + initView(); + initEvent(); + } + + private void getDataFromActDetailAndSp() { + Intent intent = getIntent(); + actid = intent.getStringExtra("actid"); + type = Integer.parseInt(intent.getStringExtra("actType")); + actTitle = intent.getStringExtra("actTitle"); + reportid = SpUtils.getString(Constant.USER_ID); + } + + private void initView() { + txt_num.setText(String.valueOf(num)); + tv_actTitle.setText(actTitle); + tv_right.setText(getString(R.string.actreport_commit)); + rl_right_tv.setVisibility(View.VISIBLE); + } + + private void initEvent() { + edt_report.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + int number = num - s.length(); + txt_num.setText(String.valueOf(number)); + } + }); + } + + @OnClick(R.id.rl_right_tv) + public void OnClick(View view){ + reportAct(); + } + + private void reportAct() { + String reportActUrl = Constant.COMMON_URL + Interface.ACT_REPORT; + JSONObject obj = new JSONObject(); + String reason = edt_report.getText().toString().trim(); + obj.put("actid",actid); + obj.put("reportid",reportid); + obj.put("reason",reason); + obj.put("type",type); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(ActReportActivity.this,true,reportActUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String retCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if("1".equals(retCode)){ + finish(); + } + JqStrUtil.showToast(ActReportActivity.this,explanation); + } + },null); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + okHttpUtil.cancelTag(this); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/AdvertisementActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/AdvertisementActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..2f9673f6d0fd6d846b0e738870de8716561f046e --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/AdvertisementActivity.java @@ -0,0 +1,163 @@ +package com.jiuqi.elove.activity; + +import android.content.Intent; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.os.Bundle; +import android.os.Environment; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import com.bumptech.glide.Glide; +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.SpUtils; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.util.Timer; +import java.util.TimerTask; + +import butterknife.BindView; + +/** + * 最新3.30版本舍弃 + */ +public class AdvertisementActivity extends ABaseActivity { + + /** + * 控件 + */ + @BindView(R.id.skip_ad) + TextView skip_ad; + @BindView(R.id.img_ad) + ImageView img_ad; + + /** + *数据 + */ + private int adtype; + private String adid; + private int time = 3; + private String adpic = "elove_ad.png"; + private String flag = "1"; + private String version; + + /** + * 工具 + */ + private Timer timer = new Timer(); + private TimerTask task; + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_advertisement,-1,-1,MODE_NONE,HEIGHT_NONE_DARK); + getDataFromSp(); + initEvent(); + } + + /** + * 从缓存中获取数据 + */ + private void getDataFromSp() { + adtype = SpUtils.getInt(Constant.AD_TYPE); + adid = SpUtils.getString(Constant.AD_ID); + version = SpUtils.getString(Constant.AD_VERSION); + } + + /** + * 注册事件 + */ + private void initEvent() { + File f = new File(Environment.getExternalStorageDirectory()+ Constant.ELOVE_FILE_DIR+adpic); + if(f.exists()){ + Bitmap b = getLoacalBitmap(Environment.getExternalStorageDirectory()+Constant.ELOVE_FILE_DIR+adpic); + img_ad.setImageBitmap(b); + }else{ + Glide.with(this).load(R.drawable.first).into(img_ad); + } + skip_ad.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + startNextActivity(); + finish(); + } + }); + img_ad.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Intent intent = new Intent(); + if(1==adtype){//活动 + flag = "2"; + if(JqStrUtil.isEmpty(adid)){ + return; + } + timer.cancel(); + intent.putExtra("actid",adid); + intent.setClass(AdvertisementActivity.this,EActDetailActivity2_0_3.class); + startActivity(intent); + } + + } + }); + task = new TimerTask() { + @Override + public void run() { + runOnUiThread(new Runnable() { // UI thread + @Override + public void run() { + if (time <= 0) { + task.cancel(); + startNextActivity(); + finish(); + } else {//处理动态读秒 + + } + time--; + } + }); + } + }; + timer.schedule(task, 0, 1000); + } + + @Override + protected void onResume() { + super.onResume(); + if("2".equals(flag)){ + startNextActivity(); + } + } + + /** + * 2.6版本一旦注册不在要求完善信息 + */ + private void startNextActivity(){ + Intent intent = new Intent(); + intent.setClass(AdvertisementActivity.this, MainActivity.class); + startActivity(intent); + finish(); + overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out); + + } + /** + * 加载本地图片 + * http://bbs.3gstdy.com + * @param path + * @return + */ + public static Bitmap getLoacalBitmap(String path) { + try { + FileInputStream fis = new FileInputStream(path); + return BitmapFactory.decodeStream(fis); + } catch (FileNotFoundException e) { + e.printStackTrace(); + return null; + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/BoundPhoneActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/BoundPhoneActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..3f0853de37f33fb37de76a2b253614dd36f14277 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/BoundPhoneActivity.java @@ -0,0 +1,267 @@ +package com.jiuqi.elove.activity; + +import android.content.Intent; +import android.os.Bundle; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.TextView; + +import com.alibaba.fastjson.JSONObject; +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; + +import java.util.Timer; +import java.util.TimerTask; + +import butterknife.BindView; +import butterknife.OnClick; + +/** + *绑定手机页面 + * Created by dl on 2016/9/23. + */ +public class BoundPhoneActivity extends ABaseActivity{ + + private static final String TAG = "BoundPhoneActivity"; + + /** + * 控件 + */ + @BindView(R.id.tv_tip) + TextView tv_tip; + @BindView(R.id.edt_phone) + EditText edt_phone; + @BindView(R.id.edt_code) + EditText edt_code; + @BindView(R.id.btn_getCode) + Button btn_getCode; + @BindView(R.id.btn_bound) + Button btn_bound; + /** + * 数据 + */ + //手机号 + private String mobile = ""; + private String userID;//用户ID + private String codetype;//5:三方登陆绑定手机号 7:旧手机号 9:新手机号 + private String oldPhone;//是否有手机号 + private String oldMobile; + private String title = "";//标题 + + /** + * 工具 + */ + private Timer mTimer = new Timer(); + private TimerTask mTimerTask; + private int time = 60; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getDataFromPreAndSp();//前一页或者缓存中获取 + setContentView(R.layout.activity_bound_phone,title); + initView(); + } + + /** + * 获取缓存和前一页中的数据 + */ + private void getDataFromPreAndSp() { + Intent intent = getIntent(); + userID = SpUtils.getString(Constant.USER_ID); + oldPhone = intent.getStringExtra("pastPhone"); + oldMobile = intent.getStringExtra("mobile"); + } + + /** + * 将获取到的数据初始化到ui中 + */ + private void initView() { + if(TextUtils.isEmpty(oldPhone)){ + title = getString(R.string.binding_phonenum_title); + }else{ + title = getString(R.string.verify_phone); + edt_phone.setText(oldPhone); + edt_phone.setSelection(oldPhone.length());//将光标追踪到内容的最后 + mobile = oldPhone; + btn_bound.setText(getString(R.string.verify)); + } + if(!TextUtils.isEmpty(oldMobile)){ + tv_tip.setVisibility(View.VISIBLE); + edt_phone.setText(oldMobile); + mobile = oldMobile; + } + toolbar_title.setText(title); + } + + @OnClick({R.id.btn_getCode,R.id.btn_bound}) + public void OnClick(View view){ + switch (view.getId()){ + case R.id.btn_getCode: + if(!TextUtils.isEmpty(oldPhone)){ + codetype = "6"; + }else{ + codetype = "5"; + } + reqCode(); + break; + case R.id.btn_bound: + if(!TextUtils.isEmpty(oldPhone)){ + bound(1); + }else{ + thirdLogin(); + } + break; + } + } + + /** + * 获取绑定手机验证码 + */ + private void reqCode() { + String codeUrl = Constant.COMMON_URL + Interface.GET_VERIFYCODE; + mobile = edt_phone.getText().toString().trim(); + if(TextUtils.isEmpty(mobile)){ + JqStrUtil.showToast(BoundPhoneActivity.this,getString(R.string.phonenum_input_prompt)); + }else if(!JqStrUtil.isMobileNo(mobile)) { + JqStrUtil.showToast(BoundPhoneActivity.this,getString(R.string.phonenum_legal_input_prompt)); + }else { + JSONObject obj = new JSONObject(); + obj.put("userID",userID); + obj.put("mobilephone", mobile); + obj.put("action", codetype); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(BoundPhoneActivity.this, true, codeUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + time = 60; + mTimerTask = new TimerTask() { + @Override + public void run() { + runOnUiThread(new Runnable() { // UI thread + @Override + public void run() { + if(btn_getCode==null){ + return; + } + btn_getCode.setEnabled(false); + if (time <= 0) { + btn_getCode.setEnabled(true); + btn_getCode.setText(getString(R.string.get_verifycode)); + mTimerTask.cancel(); + } else { + btn_getCode.setText("" + time + "秒后重发"); + } + time--; + } + }); + } + }; + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if ("1".equals(rsCode)) { + mTimer.schedule(mTimerTask, 0, 1000); + JqStrUtil.showToast(BoundPhoneActivity.this, getString(R.string.check_get_verifycode)); + } else { + JqStrUtil.showToast(BoundPhoneActivity.this, explanation); + } + + } + }, null); + } + } + + /** + * 第三方登录 + */ + private void thirdLogin() { + String phonecode = edt_code.getText().toString().trim(); + String tmpMobile = edt_phone.getText().toString().trim();//修正不点击获取验证码直接点找回发生的请输入手机号错误提示 + /** + * 1、if else 的方式,对于手机号来说,验证了即使是空,也会验证是否和获取验证码相同 + * 如果此时未获取验证码,则之前手机号字符串为null,程序崩溃 + * 2、校验应该根据顺序来,用户感觉上更舒适,也合理 + */ + if(TextUtils.isEmpty(tmpMobile)){ + JqStrUtil.showToast(BoundPhoneActivity.this,getString(R.string.phonenum_input_prompt)); + return; + } + if(!JqStrUtil.isMobileNo(tmpMobile)) { + JqStrUtil.showToast(BoundPhoneActivity.this,getString(R.string.phonenum_legal_input_prompt)); + return; + } + if(TextUtils.isEmpty(phonecode)){ + JqStrUtil.showToast(BoundPhoneActivity.this,getString(R.string.verifycode_input_prompt)); + return; + } + if(!mobile.equals(tmpMobile)){ + JqStrUtil.showToast(BoundPhoneActivity.this,getString(R.string.phonenum_accordant)); + return; + } + Intent intent = new Intent(); + intent.putExtra("phonecode", phonecode); + intent.putExtra("tmpMobile", tmpMobile); + setResult(0x01, intent); + finish(); + } + + /** + * 绑定 + * @param action + */ + private void bound(final int action) { + String thirdBoundUrl = Constant.COMMON_URL + Interface.THIRD_BOUND; + String phonecode = edt_code.getText().toString().trim(); + final String tmpMobile = edt_phone.getText().toString().trim();//修正不点击获取验证码直接点找回发生的请输入手机号错误提示 + JSONObject obj = new JSONObject(); + obj.put("userID",userID); + obj.put("phone",tmpMobile); + obj.put("codetype",codetype);// + obj.put("action",action);//1:验证手机 4:绑定手机 + obj.put("phonecode",phonecode);//1微信 2QQ 3微博 + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(BoundPhoneActivity.this,true,thirdBoundUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + Log.d(TAG, "onResponse: "+rsCode); + if("1".equals(rsCode)){ + if(action == 1 && "4".equals(jsonObject.getString("message"))){ + //清空页面 + edt_code.setText(""); + edt_phone.setText(""); + edt_phone.requestFocus(); + btn_getCode.setEnabled(true); + btn_getCode.setText(getString(R.string.get_verifycode)); + if(mTimerTask!=null){ + mTimerTask.cancel(); + } + codetype = "7";//验证码类型改为新手机对应类型 + toolbar_title.setText(getString(R.string.binding_phonenum_title)); + btn_bound.setText(getString(R.string.binding)); + btn_bound.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + bound(4); + } + }); + }else if(action == 4){ + SpUtils.setString("mobilephone",tmpMobile); + finish(); + } + } + JqStrUtil.showToast(BoundPhoneActivity.this, explanation); + } + },null); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/CaptureActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/CaptureActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..2cc680b3e4446392e2042dd981401782a10957f9 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/CaptureActivity.java @@ -0,0 +1,340 @@ +/* + * Copyright (C) 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.jiuqi.elove.activity; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.content.Intent; +import android.graphics.Rect; +import android.os.Bundle; +import android.os.Handler; +import android.util.Log; +import android.view.SurfaceHolder; +import android.view.SurfaceView; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.view.animation.Animation; +import android.view.animation.TranslateAnimation; +import android.widget.ImageView; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.google.zxing.Result; +import com.jiuqi.elove.R; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.widget.qrcode.camera.CameraManager; +import com.jiuqi.elove.widget.qrcode.decode.DecodeThread; +import com.jiuqi.elove.widget.qrcode.utils.BeepManager; +import com.jiuqi.elove.widget.qrcode.utils.CaptureActivityHandler; +import com.jiuqi.elove.widget.qrcode.utils.InactivityTimer; + +import java.io.IOException; +import java.lang.reflect.Field; + +/** + * This activity opens the camera and does the actual scanning on a background + * thread. It draws a viewfinder to help the user place the barcode correctly, + * shows feedback as the image processing is happening, and then overlays the + * results when a scan is successful. + * + * @author dswitkin@google.com (Daniel Switkin) + * @author Sean Owen + */ +public final class CaptureActivity extends Activity implements SurfaceHolder.Callback { + + private static final String TAG = CaptureActivity.class.getSimpleName(); + + private CameraManager cameraManager; + private CaptureActivityHandler handler; + private InactivityTimer inactivityTimer; + private BeepManager beepManager; + + private SurfaceView scanPreview = null; + private RelativeLayout scanContainer; + private RelativeLayout scanCropView; + private ImageView scanLine; + + private Rect mCropRect = null; + private boolean isHasSurface = false; + + private ImageView tvBack; + private TextView tvTitle; + + public Handler getHandler() { + return handler; + } + + public CameraManager getCameraManager() { + return cameraManager; + } + + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + + Window window = getWindow(); + window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + setContentView(R.layout.activity_capture); + + scanPreview = (SurfaceView) findViewById(R.id.capture_preview); + scanContainer = (RelativeLayout) findViewById(R.id.capture_container); + scanCropView = (RelativeLayout) findViewById(R.id.capture_crop_view); + scanLine = (ImageView) findViewById(R.id.capture_scan_line); + tvBack = (ImageView)findViewById(R.id.img_leftBtn); + tvTitle = (TextView)findViewById(R.id.tvTitle); + tvTitle.setText(R.string.scantitle); + tvBack.setVisibility(View.VISIBLE); + + inactivityTimer = new InactivityTimer(this); + beepManager = new BeepManager(this); + + TranslateAnimation animation = new TranslateAnimation(Animation.RELATIVE_TO_PARENT, 0.0f, Animation + .RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, + 0.9f); + animation.setDuration(4500); + animation.setRepeatCount(-1); + animation.setRepeatMode(Animation.RESTART); + scanLine.startAnimation(animation); + //自定义事件 + setEvents(); + } + + private void setEvents() { + tvBack.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + finish(); + } + }); + } + + @Override + protected void onResume() { + super.onResume(); + + // CameraManager must be initialized here, not in onCreate(). This is + // necessary because we don't + // want to open the camera driver and measure the screen size if we're + // going to show the help on + // first launch. That led to bugs where the scanning rectangle was the + // wrong size and partially + // off screen. + cameraManager = new CameraManager(getApplication()); + + handler = null; + + if (isHasSurface) { + // The activity was paused but not stopped, so the surface still + // exists. Therefore + // surfaceCreated() won't be called, so init the camera here. + initCamera(scanPreview.getHolder()); + } else { + // Install the callback and wait for surfaceCreated() to init the + // camera. + scanPreview.getHolder().addCallback(this); + } + + inactivityTimer.onResume(); + } + + @Override + protected void onPause() { + if (handler != null) { + handler.quitSynchronously(); + handler = null; + } + inactivityTimer.onPause(); + beepManager.close(); + cameraManager.closeDriver(); + if (!isHasSurface) { + scanPreview.getHolder().removeCallback(this); + } + super.onPause(); + } + + @Override + protected void onDestroy() { + inactivityTimer.shutdown(); + super.onDestroy(); + } + + @Override + public void surfaceCreated(SurfaceHolder holder) { + if (holder == null) { + Log.e(TAG, "*** WARNING *** surfaceCreated() gave us a null surface!"); + } + if (!isHasSurface) { + isHasSurface = true; + initCamera(holder); + } + } + + @Override + public void surfaceDestroyed(SurfaceHolder holder) { + isHasSurface = false; + } + + @Override + public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { + + } + + /** + * A valid barcode has been found, so give an indication of success and show + * the results. + * + * @param rawResult The contents of the barcode. + * @param bundle The extras + */ + public void handleDecode(Result rawResult, Bundle bundle) { + inactivityTimer.onActivity(); + beepManager.playBeepSoundAndVibrate(); + + Intent resultIntent = new Intent(); + bundle.putInt("width", mCropRect.width()); + bundle.putInt("height", mCropRect.height()); + bundle.putString("result", rawResult.getText()); + if(!JqStrUtil.isEmpty(rawResult.getText())&&rawResult.getText().startsWith("http://")||rawResult.getText().startsWith("https://")){ + String url = rawResult.getText(); + resultIntent.putExtra("url",url); + resultIntent.setClass(CaptureActivity.this,CaptureLoadWebActivity.class); + startActivity(resultIntent); + }else{ + if(!JqStrUtil.isEmpty(rawResult.getText().trim())){ + JqStrUtil.showToast(CaptureActivity.this,rawResult.getText()); + }else{ + JqStrUtil.showToast(CaptureActivity.this,"您扫描的二维码上演了空城计~二维码内无任何信息"); + } + } + +// resultIntent.putExtras(bundle);QIYUAN_GROUP/272437911377412624 + + +// this.setResult(RESULT_OK, resultIntent); + CaptureActivity.this.finish(); + } + + private void initCamera(SurfaceHolder surfaceHolder) { + if (surfaceHolder == null) { + throw new IllegalStateException("No SurfaceHolder provided"); + } + if (cameraManager.isOpen()) { + Log.w(TAG, "initCamera() while already open -- late SurfaceView callback?"); + return; + } + try { + cameraManager.openDriver(surfaceHolder); + // Creating the handler starts the preview, which can also throw a + // RuntimeException. + if (handler == null) { + handler = new CaptureActivityHandler(this, cameraManager, DecodeThread.ALL_MODE); + } + + initCrop(); + } catch (IOException ioe) { + Log.w(TAG, ioe); + displayFrameworkBugMessageAndExit(); + } catch (RuntimeException e) { + // Barcode Scanner has seen crashes in the wild of this variety: + // java.?lang.?RuntimeException: Fail to connect to camera service + Log.w(TAG, "Unexpected error initializing camera", e); + displayFrameworkBugMessageAndExit(); + } + } + + private void displayFrameworkBugMessageAndExit() { + // camera error + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle(getString(R.string.app_name)); + builder.setMessage("请允许使用相机扫描"); + builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { + + @Override + public void onClick(DialogInterface dialog, int which) { + finish(); + } + + }); + builder.setOnCancelListener(new DialogInterface.OnCancelListener() { + + @Override + public void onCancel(DialogInterface dialog) { + finish(); + } + }); + builder.show(); + } + + public void restartPreviewAfterDelay(long delayMS) { + if (handler != null) { + handler.sendEmptyMessageDelayed(R.id.restart_preview, delayMS); + } + } + + public Rect getCropRect() { + return mCropRect; + } + + /** + * 初始化截取的矩形区域 + */ + private void initCrop() { + int cameraWidth = cameraManager.getCameraResolution().y; + int cameraHeight = cameraManager.getCameraResolution().x; + + /** 获取布局中扫描框的位置信息 */ + int[] location = new int[2]; + scanCropView.getLocationInWindow(location); + + int cropLeft = location[0]; + int cropTop = location[1] - getStatusBarHeight(); + + int cropWidth = scanCropView.getWidth(); + int cropHeight = scanCropView.getHeight(); + + /** 获取布局容器的宽高 */ + int containerWidth = scanContainer.getWidth(); + int containerHeight = scanContainer.getHeight(); + + /** 计算最终截取的矩形的左上角顶点x坐标 */ + int x = cropLeft * cameraWidth / containerWidth; + /** 计算最终截取的矩形的左上角顶点y坐标 */ + int y = cropTop * cameraHeight / containerHeight; + + /** 计算最终截取的矩形的宽度 */ + int width = cropWidth * cameraWidth / containerWidth; + /** 计算最终截取的矩形的高度 */ + int height = cropHeight * cameraHeight / containerHeight; + + /** 生成最终的截取的矩形 */ + mCropRect = new Rect(x, y, width + x, height + y); + } + + private int getStatusBarHeight() { + try { + Class c = Class.forName("com.android.internal.R$dimen"); + Object obj = c.newInstance(); + Field field = c.getField("status_bar_height"); + int x = Integer.parseInt(field.get(obj).toString()); + return getResources().getDimensionPixelSize(x); + } catch (Exception e) { + e.printStackTrace(); + } + return 0; + } +} \ No newline at end of file diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/CaptureLoadWebActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/CaptureLoadWebActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..e726d80dfdc5caf7197efa49be40802336cdac84 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/CaptureLoadWebActivity.java @@ -0,0 +1,102 @@ +package com.jiuqi.elove.activity; + +import android.app.Activity; +import android.content.ComponentName; +import android.content.Intent; +import android.os.Bundle; +import android.view.View; +import android.view.Window; +import android.webkit.WebSettings; +import android.webkit.WebView; +import android.webkit.WebViewClient; +import android.widget.ImageView; +import android.widget.TextView; + +import com.jiuqi.elove.R; + +public class CaptureLoadWebActivity extends Activity implements View.OnClickListener{ + + /*顶部菜单栏按钮*/ + private TextView tvTitle; + private ImageView tvBack; + private WebView mWebView; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + requestWindowFeature(Window.FEATURE_NO_TITLE); + setContentView(R.layout.activity_capture_load_web); + initView(); + initEvents(); + } + + private void initView() { + tvBack = (ImageView)findViewById(R.id.img_leftBtn); + tvTitle = (TextView)findViewById(R.id.tvTitle); + tvTitle.setText("网页"); + tvBack.setVisibility(View.VISIBLE); + mWebView = (WebView) findViewById(R.id.wv_result); + WebSettings webSettings = mWebView.getSettings(); + //设置WebView属性,能够执行Javascript脚本 + webSettings.setJavaScriptEnabled(true); + //设置可以访问文件 + webSettings.setAllowFileAccess(true); + //设置支持缩放 + webSettings.setBuiltInZoomControls(true); + //加载需要显示的网页 + String url = getIntent().getStringExtra("url"); + if(url.startsWith("http://weixin")){ + startWX(); + }else if(url.startsWith("http://qm")){ +// startQQ();qq有问题 + } + mWebView.loadUrl(url); + //设置Web视图 + mWebView.setWebViewClient(new MyWebViewClient ()); + } + + private void initEvents(){ + tvBack.setOnClickListener(this); + } + + @Override + public void onClick(View view) { + switch (view.getId()){ + case R.id.img_leftBtn: + finish(); + break; + default: + break; + } + } + + //Web视图 + private class MyWebViewClient extends WebViewClient { + public boolean shouldOverrideUrlLoading(WebView view, String url) { + view.loadUrl(url); + return true; + } + } + + private void startWX(){ + Intent intent = new Intent(); + ComponentName cmp = new ComponentName("com.tencent.mm","com.tencent.mm.ui.LauncherUI"); + intent.setAction(Intent.ACTION_MAIN); + intent.addCategory(Intent.CATEGORY_LAUNCHER); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.setComponent(cmp); + startActivity(intent); + finish(); + } + + private void startQQ() { + Intent intent = new Intent(); + ComponentName cmp = new ComponentName("com.tencent.mobileqq","com.tencent.mobileqq.activity.HomeActivity"); + intent.setAction(Intent.ACTION_MAIN); + intent.addCategory(Intent.CATEGORY_LAUNCHER); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.setComponent(cmp); + startActivity(intent); + finish(); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/CharacterResultActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/CharacterResultActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..c86d502f26fafd4bc278ed35352ea4f13a04301c --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/CharacterResultActivity.java @@ -0,0 +1,424 @@ +package com.jiuqi.elove.activity; + +import android.content.Intent; +import android.content.SharedPreferences; +import android.graphics.BitmapFactory; +import android.graphics.Color; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.view.Window; +import android.view.animation.Animation; +import android.view.animation.ScaleAnimation; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; +import android.widget.Toast; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.github.mikephil.charting.animation.Easing; +import com.github.mikephil.charting.charts.RadarChart; +import com.github.mikephil.charting.components.Legend; +import com.github.mikephil.charting.components.XAxis; +import com.github.mikephil.charting.components.YAxis; +import com.github.mikephil.charting.data.Entry; +import com.github.mikephil.charting.data.RadarData; +import com.github.mikephil.charting.data.RadarDataSet; +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.common.JqBaseActivity; +import com.jiuqi.elove.entity.CharacterModel; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; +import com.umeng.socialize.ShareAction; +import com.umeng.socialize.UMShareAPI; +import com.umeng.socialize.UMShareListener; +import com.umeng.socialize.bean.SHARE_MEDIA; +import com.umeng.socialize.media.UMImage; +import com.umeng.socialize.shareboard.SnsPlatform; +import com.umeng.socialize.utils.ShareBoardlistener; + +import java.util.ArrayList; +import java.util.List; + +public class CharacterResultActivity extends JqBaseActivity{ + + private static final String TAG = "CharacterResultActivity"; + /** + * 控件 + */ + private TextView tvTitle; + private ImageView ivBack; + private ImageView ivMore; + private LinearLayout ll_findher; + private LinearLayout ll_result_content; + private TextView tv_prompt; + private String otherid; + /** + * 蛛网图相关 + */ + private RadarChart radarChart_mine; + public ArrayList x = new ArrayList(); + public ArrayList y = new ArrayList(); + public ArrayList ys1 = new ArrayList(); + public ArrayList ys2 = new ArrayList(); + public ArrayList ys3 = new ArrayList(); + public ArrayList ys4 = new ArrayList(); + public ArrayList radarDataSets = new ArrayList(); + public RadarData radarData = null; + private TextView tv_radarChart_mine; + public ArrayList x1 = new ArrayList(); + public ArrayList y1 = new ArrayList(); + /** + * 数据 + */ + private String userid; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_character_result); + getDataFromSpAndPrePage(); + initView(); + getCharacterResult(); + setEvents(); + } + + private void getDataFromSpAndPrePage() { + otherid = getIntent().getStringExtra("otherid"); + userid = SpUtils.getString(Constant.USER_ID); + } + + private void getCharacterResult() { + String getResultUrl = Constant.COMMON_URL + Interface.VIEW_EMOTIONRESULT; + JSONObject obj = new JSONObject(); + obj.put("userid",userid); + obj.put("otherid",otherid); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(CharacterResultActivity.this, true, getResultUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if ("1".equals(rsCode)) {//成功 + String uresultliststr = jsonObject.getString("uresultlist"); + String oresultliststr = jsonObject.getString("oresultlist"); + Log.d(TAG, "onResponse: " + uresultliststr); + if (!JqStrUtil.isEmpty(uresultliststr)&&JqStrUtil.isEmpty(oresultliststr)&&JqStrUtil.isEmpty(otherid)) { + List mList = JSON.parseArray(uresultliststr, CharacterModel.class); + if (mList != null && mList.size() > 0) { + tv_radarChart_mine.setVisibility(View.GONE); + radarChart_mine.setVisibility(View.VISIBLE); + dataIntoView(mList); + drawShape(mList,null); + } else { + tv_radarChart_mine.setVisibility(View.VISIBLE); + radarChart_mine.setVisibility(View.GONE); + tv_radarChart_mine.setText("未获取到数据"); + } + }else if(!JqStrUtil.isEmpty(oresultliststr)){ + List oList = JSON.parseArray(oresultliststr, CharacterModel.class); + if (oList != null && oList.size() > 0) { + tv_radarChart_mine.setVisibility(View.GONE); + radarChart_mine.setVisibility(View.VISIBLE); + dataIntoView(oList); + } else { + tv_radarChart_mine.setVisibility(View.VISIBLE); + radarChart_mine.setVisibility(View.GONE); + tv_radarChart_mine.setText("未获取到数据"); + } + } + if(!JqStrUtil.isEmpty(uresultliststr)&&!JqStrUtil.isEmpty(oresultliststr)){ + List mList = JSON.parseArray(uresultliststr, CharacterModel.class); + List oList = JSON.parseArray(oresultliststr, CharacterModel.class); + drawShape(mList,oList); + } + } else { + JqStrUtil.showToast(CharacterResultActivity.this, explanation); + } + } + }, new OkHttpUtil.OnUnGetJsonObject() { + @Override + public void onResponse() { + tv_radarChart_mine.setVisibility(View.VISIBLE); + radarChart_mine.setVisibility(View.GONE); + tv_radarChart_mine.setText("网络出错啦!"); + } + }); + } + + private void dataIntoView(List mList) { + LinearLayout.LayoutParams lp = initLayoutParam(); + int size = mList.size(); + for(int i=0;i mList,List oList){ + int size = mList.size(); +// radarData = getRadarData(size, mList); +// if(null!=oList){ +// radarData1 = getRadarData(size,oList); +// } + getRadarData(size,mList,oList); + showChart(radarData); +// showChart(radarData1); + } + + /** + * gv + * 初始化数据 + * count 表示坐标点个数,range表示等下y值生成的范围 + */ + public void getRadarData(int count, List mList,List oList) { +// ArrayList sets = new ArrayList(); + for(int i=0;i0){ + for (int i = 0; i < count; i++) { //X轴显示的数据 +// x.add(i + "");貌似这样做只是为了把他变成string类型的好保存 + x.add(mList.get(i).getCharacter()); + } + for (int i = 0; i < count; i++) {//y轴的数据 + y.add(new Entry(mList.get(i).getCharacterscore(), i)); + } +// RadarDataSet radarDataSet = new RadarDataSet(y, "雷达图");//y轴数据集合 + RadarDataSet radarDataSet = new RadarDataSet(y, null);//y轴数据集合 + radarDataSet.setLineWidth(0);//线宽 + radarDataSet.setColor(Color.rgb(254,78,119));//现实颜色 +// radarDataSet.setHighLightColor(Color.WHITE);//高度线的颜色 +// radarDataSet.setFillColor(R.color.colorPrimary);//设置填充颜色 + radarDataSet.setFillAlpha(255);//设置透明度 + radarDataSet.setDrawFilled(true);//设置显示填充颜色 + radarDataSet.setDrawValues(false);//不显示该条目具体数值 + radarDataSets.add(radarDataSet); +// radarData = new RadarData(x, radarDataSets); + } + if(oList!=null&&oList.size()>0){ + for (int i = 0; i < count; i++) { //X轴显示的数据 +// x.add(i + "");貌似这样做只是为了把他变成string类型的好保存 + x1.add(oList.get(i).getCharacter()); + } + for (int i = 0; i < count; i++) {//y轴的数据 + y1.add(new Entry(oList.get(i).getCharacterscore(), i)); + } +// RadarDataSet radarDataSet = new RadarDataSet(y, "雷达图");//y轴数据集合 + RadarDataSet radarDataSet1 = new RadarDataSet(y1, null);//y轴数据集合 + radarDataSet1.setLineWidth(0);//线宽 + radarDataSet1.setColor(Color.rgb(115,212,255));//现实颜色 +// radarDataSet.setHighLightColor(Color.WHITE);//高度线的颜色 +// radarDataSet1.setFillColor(Color.rgb(115,212,255));//设置填充颜色 + radarDataSet1.setFillAlpha(150);//设置透明度 + radarDataSet1.setDrawFilled(true);//设置显示填充颜色 + radarDataSet1.setDrawValues(false);//不显示该条目具体数值 + radarDataSets.add(radarDataSet1); +// radarData1 = new RadarData(x1, radarDataSets1); + } + radarData = new RadarData(x, radarDataSets); + } + + /** + * 设置样式 + */ + public void showChart(RadarData radarData) { + final ScaleAnimation animation =new ScaleAnimation(0.0f, 1.0f, 0.0f, 1.0f, + Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); + animation.setDuration(2000); + XAxis xAxis = radarChart_mine.getXAxis(); + YAxis yAxis = radarChart_mine.getYAxis(); + yAxis.setDrawLabels(false);//不显示每个图形的y轴代表的数据 + yAxis.setAxisMaxValue(15f);//设置y轴最外侧代表的数据 +// yAxis.setStartAtZero(false); +// yAxis.setYOffset(3f); +// yAxis.setDrawGridLines(true); + xAxis.setSpaceBetweenLabels(5);//设置字和图形之间的距离 + radarChart_mine.setRotationEnabled(false);//不可旋转 + radarChart_mine.setDescription("");//数据描述 + radarChart_mine.setWebColor(getResources().getColor(R.color.default_background));//角分边的颜色 + radarChart_mine.setWebColorInner(getResources().getColor(R.color.hobby7)); + radarChart_mine.setAnimation(animation); +// radarChart_mine.animateX(3000, Easing.EasingOption.EaseInElastic); // 图1划线动作不好用 +// radarChart_mine.setSkipWebLineCount(1); + radarChart_mine.setData(radarData);//设置数据 + radarChart_mine.invalidate(); + radarChart_mine.animateXY( + 2000, 2000, + Easing.EasingOption.EaseInOutQuad, + Easing.EasingOption.EaseInOutQuad); + Legend legend = radarChart_mine.getLegend();//设置比例图片标示,就是那一组Y的value + legend.setEnabled(false);//设置无数据说明,即每种颜色的线条或者图形代表的选项 +// if(null!=radarData1){ +// radarChart_mine.setData(radarData1);//设置数据 +// } + + } + + private LinearLayout.LayoutParams initLayoutParam(){ + LinearLayout ll = new LinearLayout(this); + ll.setOrientation(LinearLayout.HORIZONTAL); + ll.setPadding(0,50,0,50); + LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT); + return lp; + } + + private void initView() { + tvTitle = easyFind(R.id.tvTitle); + tv_prompt = easyFind(R.id.tv_prompt); + tvTitle.setText("性格分析"); + ivBack = easyFind(R.id.img_leftBtn); + ivMore = easyFind(R.id.img_rightBtn); + ivMore.setImageResource(R.drawable.icon_share); + ivBack.setVisibility(View.VISIBLE); + ll_findher = easyFind(R.id.ll_findher); + ll_result_content = easyFind(R.id.ll_result_content); + radarChart_mine = easyFind(R.id.radarChart_mine); + tv_radarChart_mine = easyFind(R.id.tv_radarChart_mine); + if(!JqStrUtil.isEmpty(otherid)){ + ivMore.setVisibility(View.GONE); + tv_prompt.setText("TA完成了测试,其实TA是......"); + ll_findher.setVisibility(View.GONE); + }else{ + ivMore.setVisibility(View.VISIBLE); + tv_prompt.setText("您完成了测试,其实您是......"); + ll_findher.setVisibility(View.VISIBLE); + } + radarChart_mine.setVisibility(View.INVISIBLE);//防止网络请求中出现英文字样 + radarChart_mine.setTouchEnabled(false);//防止与scrollview滑动冲突 + } + + private void setEvents() { + ivBack.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + finish(); + } + }); + ivMore.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + initUmengShare();//umeng平台分享配置初始化 + } + }); + ll_findher.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + findher(); + } + }); + } + + private void findher() { + Intent intent = new Intent(CharacterResultActivity.this,FindYoursHerActivity.class); + startActivity(intent); + } + + private void initUmengShare() { + UMImage image = new UMImage(CharacterResultActivity.this, + BitmapFactory.decodeResource(getResources(), R.mipmap.app_logo)); + ShareAction action = new ShareAction(this); + action.setDisplayList(Constant.DISPLAY_LIST); + action.withTitle("我的企缘情感测评报告,快来看看吧~"); + action.withText("来自企缘App"); + action.withTargetUrl(Constant.SHARE_QGCS+userid);//点击分享内容打开的链接 + action.withMedia(image);//附带的图片,音乐,视频等多媒体对象 + action.setShareboardclickCallback(mShareBoardlistener);//设置友盟集成的分享面板的点击监听回调 + action.open();//打开集成的分享面板 + } + + /** + * 友盟分享面板PopupWindow监听器 + */ + private ShareBoardlistener mShareBoardlistener = new ShareBoardlistener() { + + @Override + public void onclick(SnsPlatform snsPlatform, SHARE_MEDIA share_media) { + UMImage image = new UMImage(CharacterResultActivity.this, + BitmapFactory.decodeResource(getResources(), R.mipmap.app_logo)); + ShareAction shareAction = new ShareAction(CharacterResultActivity.this); + shareAction.setPlatform(share_media); + shareAction.setCallback(mUmShareListener);//设置每个平台的点击事件 + shareAction.withTitle("我的企缘情感测评报告,快来看看吧~"); + shareAction.withText("来自企缘App"); + shareAction.withTargetUrl(Constant.SHARE_QGCS+userid);//点击分享内容打开的链接 + shareAction.withMedia(image);//附带的图片,音乐,视频等多媒体对象 + shareAction.share();//发起分享,调起微信,QQ,微博客户端进行分享。 + } + }; +// title在微博中无用,text在朋友圈中无用。但是加上也不影响分享。 + + + /** + * 友盟分享后事件监听器 + */ + private UMShareListener mUmShareListener = new UMShareListener() { + + @Override + public void onResult(SHARE_MEDIA platform) { + Toast.makeText(CharacterResultActivity.this,"分享成功",Toast.LENGTH_LONG).show(); + } + + @Override + public void onError(SHARE_MEDIA platform, Throwable t) { + Toast.makeText(CharacterResultActivity.this,"分享失败",Toast.LENGTH_LONG).show(); + } + + @Override + public void onCancel(SHARE_MEDIA platform) { +// Toast.makeText(OtherPersonCenterActivity.this,"分享取消",Toast.LENGTH_LONG).show(); + } + }; + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + UMShareAPI.get(this).onActivityResult(requestCode, resultCode, data); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/CharacterTestActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/CharacterTestActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..6c508fd847120f9b4f0b43d717ff8af77712b10b --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/CharacterTestActivity.java @@ -0,0 +1,247 @@ +package com.jiuqi.elove.activity; + +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.os.Handler; +import android.support.v4.app.Fragment; +import android.util.Log; +import android.view.View; +import android.view.Window; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.jiuqi.elove.R; +import com.jiuqi.elove.adapter.CommonFragmentAdapter; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.common.JqBaseActivity; +import com.jiuqi.elove.entity.QuestionModel; +import com.jiuqi.elove.fragment.EmotionQuestionFragment; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; +import com.jiuqi.elove.widget.NoScrollViewPager; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class CharacterTestActivity extends JqBaseActivity implements View.OnClickListener,EmotionQuestionFragment.MyListener{ + + private static final String TAG = "CharacterTestActivity"; + /** + *控件 + */ + private TextView tvTitle; + private TextView tv_current_total; + private ImageView ivBack; + private ImageView iv_pre; + private ImageView iv_next; + private RelativeLayout rl_commit; + private TextView tv_commit; + private NoScrollViewPager mViewPager; + private LinearLayout ll_pre; + private LinearLayout ll_next; + /** + * 数据 + */ + private String userid; + private ArrayList fragmentlist; + private List mQuesionList; + private String flag; + private List> answerList; + private int currentPage; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_character_test); + answerList = new ArrayList<>(); + getDataFromSp(); + initView(); + getEmotionList(); + setEvents(); + } + + private void getDataFromSp() { + userid = SpUtils.getString(Constant.USER_ID); + } + + private void initView() { + tvTitle = easyFind(R.id.tvTitle); + tv_current_total = easyFind(R.id.tv_current_total); + tvTitle.setText("我的测试"); + ivBack = easyFind(R.id.img_leftBtn); + iv_pre = easyFind(R.id.iv_pre); + iv_next = easyFind(R.id.iv_next); + tv_commit = easyFind(R.id.tv_commit); + rl_commit = easyFind(R.id.rl_commit); + ivBack.setVisibility(View.VISIBLE); + mViewPager = easyFind(R.id.container); + mViewPager.setNoScroll(true); + ll_next = easyFind(R.id.ll_next); + ll_pre = easyFind(R.id.ll_pre); + } + + private void getEmotionList() { + String emotionListUrl = Constant.COMMON_URL + Interface.EMOTION_LIST; + JSONObject obj = new JSONObject(); + obj.put("userid",userid); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(CharacterTestActivity.this, true, emotionListUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + if("1".equals(rsCode)){ + String result = jsonObject.getString("emotionlist"); + mQuesionList = JSON.parseArray(result,QuestionModel.class); + createPage(); + } + } + },null); + } + + private void createPage() { + fragmentlist = new ArrayList<>(); + for(int i=0;icurrentPage){ + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + mViewPager.setCurrentItem(currentPage+1); + judgeLastAndSetPageNo(); + } + },100); + } + } + if("iv_pre".equals(flag)&¤tPage>0){ + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + mViewPager.setCurrentItem(currentPage-1); + judgeLastAndSetPageNo(); + } + },100); + } + + } + + private void judgeLastAndSetPageNo(){ + if(mViewPager.getCurrentItem()==mQuesionList.size()-1){ + rl_commit.setVisibility(View.VISIBLE); + }else{ + rl_commit.setVisibility(View.GONE); + } + setCurrentPage(); + } + + @Override + public void comfirmData(String answercode) { + HashMap map = new HashMap<>(); + int currentPage = mViewPager.getCurrentItem(); + map.put("testcode",mQuesionList.get(currentPage).getTestid()); + map.put("answercode",answercode); + if(answerList.size()-1>=currentPage||answerList.size()==mQuesionList.size()){//大于等于 + answerList.remove(currentPage); + } + answerList.add(currentPage,map); + flag = "iv_next"; + changePage(); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/ChatActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/ChatActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..7758d03a8152a784dbbc3fc916d08584b20a61bd --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/ChatActivity.java @@ -0,0 +1,51 @@ +package com.jiuqi.elove.activity; + + +import android.os.Bundle; + +import com.hyphenate.easeui.EaseConstant; +import com.jiuqi.elove.R; +import com.jiuqi.elove.fragment.MyChatFragment; + + +/** + * Created by dl on 2016/7/11. + * 继承BaseActivity,BaseActivity中继承了环信的基础activity,其中有一些操作 + * 比如将通知栏的消息条数置为0 + */ +public class ChatActivity extends ABaseActivity { + + private static final String TAG = "ChatActivity"; + + public static ChatActivity activityInstance; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_chat,"",-1,MODE_NONE,HEIGHT_REDBG_WHITEFONT); + activityInstance = this; + initView(); + } + + private void initView() { + MyChatFragment chatFragment = new MyChatFragment(); + String nikeName = getIntent().getStringExtra("nikeName");//个人昵称和群昵称(群昵称没有用其实也是id由环信方法获得)(title用) + String avatar = getIntent().getStringExtra("avatar"); + String username = getIntent().getStringExtra("userId");//个人的id和群id,对方id + int chatType = getIntent().getIntExtra("chatType",900); + //传入参数 + Bundle args = new Bundle(); + args.putInt(EaseConstant.EXTRA_CHAT_TYPE, chatType); + args.putString(EaseConstant.EXTRA_USER_ID, username); + args.putString("nikename",nikeName); + args.putString("avatar",avatar); + chatFragment.setArguments(args); + getSupportFragmentManager().beginTransaction().add(R.id.container, chatFragment).commit(); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + activityInstance = null; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/ChoicenessDetailActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/ChoicenessDetailActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..f8d437556d325406232e97a09b105c9ba411ef6a --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/ChoicenessDetailActivity.java @@ -0,0 +1,484 @@ +package com.jiuqi.elove.activity; + +import android.content.Intent; +import android.content.SharedPreferences; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.os.Bundle; +import android.view.KeyEvent; +import android.view.View; +import android.webkit.WebSettings; +import android.webkit.WebView; +import android.webkit.WebViewClient; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; +import android.widget.Toast; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.bumptech.glide.Glide; +import com.jiuqi.elove.R; +import com.jiuqi.elove.adapter.ChoicenessCommentAdapter; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.common.JqBaseActivity; +import com.jiuqi.elove.entity.ChoicenessAndDetailModel; +import com.jiuqi.elove.entity.ChoicenessCommentModel; +import com.jiuqi.elove.fragment.ChoicenessFragment; +import com.jiuqi.elove.util.BitmapUtils; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.widget.BottomScrollView; +import com.jiuqi.elove.widget.ListViewForScrollView; +import com.umeng.socialize.ShareAction; +import com.umeng.socialize.UMShareAPI; +import com.umeng.socialize.UMShareListener; +import com.umeng.socialize.bean.SHARE_MEDIA; +import com.umeng.socialize.media.UMImage; +import com.umeng.socialize.shareboard.SnsPlatform; +import com.umeng.socialize.utils.ShareBoardlistener; + +import java.util.ArrayList; +import java.util.List; + +public class ChoicenessDetailActivity extends JqBaseActivity { + + /** + * 控件 + */ + private TextView tvTitle; + private ImageView imgBack; + private ImageView imgShare; + private WebView wv_choicedetail; + private LinearLayout ll_webview; + private LinearLayout ll_comment; + private ListViewForScrollView lv_dcus; + private BottomScrollView bottom_scrollview; + private TextView tv_ismore; + private TextView tv_comment_count; + private ImageView iv_reward; + private EditText et_comment; + private TextView tv_sure; + private LinearLayout ll_reward; + /** + * 数据 + */ + private String userid; + private String creamid;//该精选的id + private String htmlStr;//html页面字符串 + private String rewards;//打赏次数 + private String reviews;//评论数 + private String otherid;//被打赏id + private String scans;//阅读次数 + private String contentstr;//标题 + private String picture;//图片,用于分享图片 + private List mlist; + private List mlistAdd; + private ChoicenessCommentAdapter adapter; + private int pageindex = 0; + private int pagesize = 10; + private StringBuilder sb; + private String title; + private ChoicenessAndDetailModel preModel; + private Bitmap pic; + /** + * 工具 + */ + private boolean isshow = false; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_choiceness_detail); + initView(); + getDataFromSpAndPrepage();//从缓存和上一个页面获取数据,用于网络请求 + initHtmlFromServer();//将html请求回来并显示到webview + adapter = new ChoicenessCommentAdapter(this); + lv_dcus.setAdapter(adapter); + mlistAdd = new ArrayList<>(); + setEvents();//设置事件监听事件 + } + + private void initView() { + tvTitle = easyFind(R.id.tvTitle); + imgBack = easyFind(R.id.img_leftBtn); + imgShare = easyFind(R.id.img_rightBtn); + wv_choicedetail = easyFind(R.id.wv_choicedetail); + ll_webview = easyFind(R.id.ll_webview); + ll_comment = easyFind(R.id.ll_comment); + lv_dcus = easyFind(R.id.lv_dcus); + tvTitle.setText("精选"); + imgShare.setImageResource(R.drawable.icon_more_white); + imgBack.setVisibility(View.VISIBLE); + imgShare.setVisibility(View.VISIBLE); + bottom_scrollview = easyFind(R.id.bottom_scrollview); + tv_ismore = easyFind(R.id.tv_ismore); + tv_sure= easyFind(R.id.tv_sure); + tv_comment_count= easyFind(R.id.tv_comment_count); + iv_reward = easyFind(R.id.iv_reward); + et_comment = easyFind(R.id.et_comment); + ll_reward = easyFind(R.id.ll_reward); + } + + private void getDataFromSpAndPrepage() { + SharedPreferences sp = getSharedPreferences("elove",MODE_PRIVATE); + userid = sp.getString("userid",""); + creamid = getIntent().getStringExtra("id"); + title = getIntent().getStringExtra("title"); + preModel = (ChoicenessAndDetailModel) getIntent().getSerializableExtra("model"); + } + + /** + * 获取h5页面字符串;获取评论数和打赏数 + */ + private void initHtmlFromServer() { + final String htmlUrl = Constant.COMMON_URL + Interface.CHOICENESS_DETAIL; + JSONObject obj = new JSONObject(); + obj.put("userid",userid); + obj.put("creamid",creamid); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, false, htmlUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if("1".equals(rsCode)){ + String result = jsonObject.getString("message"); + if(JqStrUtil.isEmpty(result)||"{}".equals(result)){ + JqStrUtil.showToast(ChoicenessDetailActivity.this,"此文章已被删除"); + } + JSONObject obj = JSON.parseObject(result); + rewards = obj.getString("rewards"); + reviews = obj.getString("reviews"); + htmlStr = obj.getString("creamhtml"); + otherid = obj.getString("userid"); + scans = obj.getString("scans"); + contentstr = obj.getString("contentstr"); + picture = obj.getString("picture"); +// title = obj.getString("title"); + tv_comment_count.setText("所有评论("+reviews+")"); + if(preModel!=null){ + preModel.setScans(scans);//更新上个页面的model来展示 + } + showActDetailWithHtml();//显示html页面的内容 + new Thread(){ + @Override + public void run() { + super.run(); + pic = BitmapUtils.getBitMapFromUrl(picture); + } + }.start(); + }else{ + JqStrUtil.showToast(ChoicenessDetailActivity.this,explanation); + } + } + },null); + } + + /***********************************************显示服务端返回的html字符串(关于活动具体介绍)********************************************/ + private void showActDetailWithHtml(){ + /**--------WebView样式设置-------------*/ + /** + * 以下两个,防止出现Activity has leaked window android.widget.ZoomButtonsController$Container崩溃 + */ + // make sure your pinch zoom is enabled + wv_choicedetail.getSettings().setBuiltInZoomControls(true); + // don't show the zoom controls + wv_choicedetail.getSettings().setDisplayZoomControls(false); + //支持javascript + wv_choicedetail.getSettings().setJavaScriptEnabled(true); + // 设置可以支持缩放 + wv_choicedetail.getSettings().setSupportZoom(true); + // 设置出现缩放工具 + wv_choicedetail.getSettings().setBuiltInZoomControls(true); + //扩大比例的缩放 + wv_choicedetail.getSettings().setUseWideViewPort(true); + //自适应屏幕 + wv_choicedetail.getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN); + wv_choicedetail.getSettings().setLoadWithOverviewMode(true); + //设置webview展示html的宽度方式 +// WebSettings webSettings =wv.getSettings(); +// webSettings.setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN); + String encoding = "UTF-8"; + String mimeType = "text/html"; + if(!JqStrUtil.isEmpty(htmlStr)){ + ll_webview.setVisibility(View.VISIBLE); + wv_choicedetail.loadDataWithBaseURL(null, htmlStr, mimeType, encoding, null); + wv_choicedetail.setWebViewClient(new MyWebViewClient()); + }else{ + ll_webview.setVisibility(View.GONE); + } + } + + private class MyWebViewClient extends WebViewClient{ + @Override + public boolean shouldOverrideUrlLoading(WebView view, String url) { + view.loadUrl(url); + return true; + } + + @Override + public void onPageFinished(WebView view, String url) { + ll_reward.setVisibility(View.GONE); + initReplyFromServer();//将评论列表请求回来并展示 + } + } + + /** + * 获取评论列表 + */ + private void initReplyFromServer() { + String replyUrl = Constant.COMMON_URL + Interface.CHOICENESS_COMMENT_LIST; + JSONObject obj = new JSONObject(); + obj.put("userid",userid); + obj.put("creamid",creamid); + obj.put("version",Constant.VERSION); + obj.put("pageindex",pageindex); + obj.put("pagesize",pagesize); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, isshow, replyUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if("1".equals(rsCode)){ + String result = jsonObject.getString("commentlist"); + mlist = JSON.parseArray(result,ChoicenessCommentModel.class); + mlistAdd.addAll(mlist); + if(mlistAdd.isEmpty()){ + lv_dcus.setVisibility(View.GONE); + ll_comment.setVisibility(View.GONE); + tv_ismore.setVisibility(View.GONE); + }else{ + ll_comment.setVisibility(View.VISIBLE); + lv_dcus.setVisibility(View.VISIBLE); + tv_ismore.setVisibility(View.VISIBLE); + adapter.updateListView(mlistAdd); + } + if(mlist.isEmpty()&&!mlistAdd.isEmpty()){ + tv_ismore.setText("暂无更多评论"); + } + }else{ + JqStrUtil.showToast(ChoicenessDetailActivity.this,explanation); + } + } + },null); + } + + + private void setEvents() { + imgBack.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if(preModel!=null){ + Intent intent = new Intent(); + intent.putExtra("newmodel",preModel); + setResult(0x11,intent); + } + finish(); + } + }); + + bottom_scrollview.setOnScrollToBottomLintener(new BottomScrollView.OnScrollToBottomListener() { + @Override + public void onScrollBottomListener(boolean isBottom) { + if(isBottom){ + ++pageindex; + isshow = false; + tv_ismore.setText("加载更多评论..."); + initReplyFromServer(); + } + } + }); + + tv_sure.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + commitComment(); + } + }); + + iv_reward.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if(!JqStrUtil.isEmpty(userid)&&userid.equals(otherid)){ + JqStrUtil.showToast(ChoicenessDetailActivity.this,"不能打赏自己"); + return; + } + Intent intent = new Intent(ChoicenessDetailActivity.this,RewardActivity.class); + intent.putExtra("otherid",otherid); + intent.putExtra("type","1");//精选文章打赏要用 + intent.putExtra("titleid",creamid); + startActivity(intent); + } + }); + + imgShare.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + shareInfo(); + } + }); + } + + private void commitComment() { + String commentUrl = Constant.COMMON_URL + Interface.CREATE_COMMENT; + String comment = et_comment.getText().toString().trim(); + if(JqStrUtil.isEmpty(comment)){ + JqStrUtil.showToast(this,"请先输入评论~"); + return; + } + JSONObject obj = new JSONObject(); + obj.put("userid",userid); + obj.put("creamid",creamid); + obj.put("version",Constant.VERSION); + obj.put("comment",comment); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(ChoicenessDetailActivity.this, true, commentUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if("1".equals(rsCode)){ + reviews = String.valueOf(Integer.parseInt(reviews)+1);//评论成功次数加一 + tv_comment_count.setText("所有评论("+reviews+")"); + if(preModel!=null){ + preModel.setReviews(String.valueOf(Integer.parseInt(preModel.getReviews())+1));//更新上个页面的model来展示 + } + et_comment.setText(""); + String result = jsonObject.getString("message"); + ChoicenessCommentModel model = JSON.parseObject(result,ChoicenessCommentModel.class); + mlistAdd.add(0,model); + if(mlistAdd.isEmpty()){ + lv_dcus.setVisibility(View.GONE); + ll_comment.setVisibility(View.GONE); + tv_ismore.setVisibility(View.GONE); + }else{ + ll_comment.setVisibility(View.VISIBLE); + lv_dcus.setVisibility(View.VISIBLE); + tv_ismore.setVisibility(View.VISIBLE); + adapter.updateListView(mlistAdd); + } + }else{ + JqStrUtil.showToast(ChoicenessDetailActivity.this,explanation); + } + } + },null); + } + + private void shareInfo() { + initUmengShare();//umeng平台分享配置初始化 + } + private void initUmengShare() { + UMImage image; + if(pic!=null){ + image= new UMImage(ChoicenessDetailActivity.this,pic); + }else{ + image = new UMImage(ChoicenessDetailActivity.this, + BitmapFactory.decodeResource(getResources(), R.mipmap.app_logo)); + } + ShareAction action = new ShareAction(this); + action.setDisplayList(Constant.DISPLAY_LIST); + action.withTitle(title); + action.withText(contentstr+"..."); + action.withTargetUrl(Constant.SHARE_CHOICENESS_URL+creamid);//点击分享内容打开的链接 + action.withMedia(image);//附带的图片,音乐,视频等多媒体对象 + action.setShareboardclickCallback(mShareBoardlistener);//设置友盟集成的分享面板的点击监听回调 + action.open();//打开集成的分享面板 + } + /** + * 友盟分享面板PopupWindow监听器 + */ + private ShareBoardlistener mShareBoardlistener = new ShareBoardlistener() { + + @Override + public void onclick(SnsPlatform snsPlatform, SHARE_MEDIA share_media) { + UMImage image; + if(pic!=null){ + image= new UMImage(ChoicenessDetailActivity.this,pic); + }else{ + image = new UMImage(ChoicenessDetailActivity.this, + BitmapFactory.decodeResource(getResources(), R.mipmap.app_logo)); + } + ShareAction shareAction = new ShareAction(ChoicenessDetailActivity.this); + shareAction.setPlatform(share_media); + shareAction.setCallback(mUmShareListener);//设置每个平台的点击事件 + shareAction.withTitle(title); + shareAction.withText(contentstr+"..."); +// sb = new StringBuilder(); +// sb.append(getString(R.string.act_share_time)); +// sb.append(startTime); +// sb.append(getString(R.string.act_share_address)); +// sb.append(addressname); +// shareAction.withText(sb.toString()); + shareAction.withTargetUrl(Constant.SHARE_CHOICENESS_URL+creamid);//点击分享内容打开的链接 + shareAction.withMedia(image);//附带的图片,音乐,视频等多媒体对象 + shareAction.share();//发起分享,调起微信,QQ,微博客户端进行分享。 + } + }; + /** + * 友盟分享后事件监听器 + */ + private UMShareListener mUmShareListener = new UMShareListener() { + @Override + public void onResult(SHARE_MEDIA platform) { + shareSuccess(); + } + @Override + public void onError(SHARE_MEDIA platform, Throwable t) { + Toast.makeText(ChoicenessDetailActivity.this,"分享失败",Toast.LENGTH_LONG).show(); + } + @Override + public void onCancel(SHARE_MEDIA platform) { +// Toast.makeText(EActDetailActivity2_0_3.this,"分享取消",Toast.LENGTH_LONG).show(); + } + }; + + /** + * 分享成功回调服务器接口,用于增加个人的红豆数 + */ + private void shareSuccess() { + String shareUrl = Constant.COMMON_URL + Interface.SHARE_PERSON_ARTICLE; + JSONObject obj = new JSONObject(); + obj.put("userid",userid); + obj.put("action",Constant.SHARE_ARTICLE); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, false, shareUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + Toast.makeText(ChoicenessDetailActivity.this,"分享成功",Toast.LENGTH_LONG).show(); + } + },null); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + UMShareAPI.get(this).onActivityResult(requestCode, resultCode, data); + } + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if(keyCode==KeyEvent.KEYCODE_BACK&&event.getRepeatCount()==0&&preModel!=null){ + Intent intent = new Intent(); + intent.putExtra("newmodel",preModel); + setResult(0x11,intent); + finish(); + return true; + } + return super.onKeyDown(keyCode, event); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + if(wv_choicedetail!=null){ + wv_choicedetail.removeAllViews(); + wv_choicedetail.destroy(); + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/ChooseLocateActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/ChooseLocateActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..ab20b0cd0c3bbc231ba66303b6c501b8dc70b021 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/ChooseLocateActivity.java @@ -0,0 +1,242 @@ +package com.jiuqi.elove.activity; + +import android.content.Intent; +import android.os.Bundle; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ImageView; +import android.widget.ListView; +import android.widget.TextView; + +import com.baidu.location.BDLocation; +import com.baidu.mapapi.model.LatLng; +import com.baidu.mapapi.search.core.PoiInfo; +import com.baidu.mapapi.search.geocode.GeoCodeResult; +import com.baidu.mapapi.search.geocode.GeoCoder; +import com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener; +import com.baidu.mapapi.search.geocode.ReverseGeoCodeOption; +import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult; +import com.jiuqi.elove.R; +import com.jiuqi.elove.adapter.PoiAdapter; +import com.jiuqi.elove.common.JqBaseActivity; +import com.jiuqi.elove.util.BdLocationHelper; + +import java.util.List; + +public class ChooseLocateActivity extends JqBaseActivity implements View.OnClickListener{ + + /** + * 控件 + */ +// private PullToRefreshLayout locateRefresh; + private ListView lv_location_nearby; + private TextView tvTitle; + private ImageView imgBack; + private TextView tv_city; + /** + * 数据 + */ + private double latitude;//纬度 + private double longitude;//经度 + private String address;//地址,用于索引附近 + private List mlist; +// private List mAddlist; + /** + * 工具 + */ + private PoiAdapter adapter; +// private PoiSearch poiSearch; +// private PoiNearbySearchOption nearbySearchOption; + private BdLocationHelper helper; +// private int pageNo = 0; + private final int ADDRESS_RESPONSE = 0X01; + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_choose_locate); + initView(); + initLocation();//定位起始位置 + setEvents(); + } + + private void setEvents() { + imgBack.setOnClickListener(this); + lv_location_nearby.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView adapterView, View view, int position, long l) { + PoiInfo info = mlist.get(position); + Intent intent = new Intent(); + intent.putExtra("address",info.name); + setResult(ADDRESS_RESPONSE,intent); + finish(); + } + }); +// locateRefresh.setOnRefreshListener(this); + } + + private void initView() { + tvTitle = easyFind(R.id.tvTitle); + imgBack = easyFind(R.id.img_leftBtn); + imgBack.setVisibility(View.VISIBLE); + tvTitle.setText("所在位置"); + lv_location_nearby = easyFind(R.id.lv_location_nearby); + tv_city = easyFind(R.id.tv_city); +// locateRefresh = easyFind(R.id.locateRefresh); + } + +// private void setAdapter(){ +// mAddlist = new ArrayList<>(); +// adapter = new PoiAdapter(this); +// lv_location_nearby.setAdapter(adapter); +// } + + @Override + public void onClick(View view) { + switch(view.getId()){ + case R.id.img_leftBtn: + finish(); + break; + default: + break; + } + } + + /** + * 初始化定位工具,并开始定位 + * 0代表定位一次即停止 + */ + private void initLocation() { + helper = new BdLocationHelper(this,0); + helper.registerLocationListener(); + helper.setListener(new BdLocationHelper.onSuccessLocate() { + @Override + public void handle(BDLocation bdLocation) { + latitude = bdLocation.getLatitude(); + longitude = bdLocation.getLongitude(); + LatLng point = new LatLng(latitude,longitude); + getAddressByReverseGeoCode(point); + } + }); + helper.startLocate(); + } + + /** + * 反地理编码,获取地址信息 + */ + private void getAddressByReverseGeoCode(LatLng latLng){ + //实例化一个地理编码查询对象 + GeoCoder geoCoder = GeoCoder.newInstance(); + //设置反地理编码位置坐标 + ReverseGeoCodeOption op = new ReverseGeoCodeOption(); + op.location(latLng); + geoCoder.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() { + + @Override + public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) { + address = result.getAddressDetail().city; + mlist = result.getPoiList(); + setData2View(); + //获取点击的坐标地址 +// address = arg0.getAddress(); +// pageNo = 0; +// initPoiSearchAndSetListener();// +// initPoiNearbySearchOption(); +// nearbySearch();//进来定位后默认提供几个位置list,参数keyword需要getAddressBy中的address + } + + @Override + public void onGetGeoCodeResult(GeoCodeResult arg0) { + } + }); + //发起反地理编码请求(经纬度->地址信息),4.5.2必须放在设置监听之后调用,否则上面监听不回调 + geoCoder.reverseGeoCode(op); + } + + private void setData2View() { + tv_city.setText(address); + adapter = new PoiAdapter(this,mlist); + lv_location_nearby.setAdapter(adapter); + } + +// /** +// * 初始化PoiNearbySearchOption,后面会单独更新pageNo +// */ +// private void initPoiNearbySearchOption(){ +// nearbySearchOption = new PoiNearbySearchOption(); +// nearbySearchOption.location(new LatLng(latitude, longitude)); +// nearbySearchOption.keyword(address.substring(0,address.length()-5)); +// nearbySearchOption.radius(3000);// 检索半径,单位是米 +// nearbySearchOption.pageNum(pageNo); +// nearbySearchOption.pageCapacity(10); +// } + +// /** +// * 初始化PoiSearch并设置结果监听 +// */ +// private void initPoiSearchAndSetListener(){ +// poiSearch = PoiSearch.newInstance(); +// poiSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener(){ +// @Override +// public void onGetPoiResult(PoiResult poiResult) { +// getPoiList(poiResult); +// } +// @Override +// public void onGetPoiDetailResult (PoiDetailResult arg0){ +// +// } +// @Override +// public void onGetPoiIndoorResult (PoiIndoorResult poiIndoorResult){ +// +// } +// }); +// } + +// /** +// * 附近检索 +// */ +// private void nearbySearch() { +// poiSearch.searchNearby(nearbySearchOption);// 发起附近检索请求 +// } + +// private void getPoiList(PoiResult poiResult) { +// if (poiResult != null&&poiResult.getAllPoi()!=null) {//无数据时会返回未发现结果,为null +// mlist = poiResult.getAllPoi(); +// if (mlist.isEmpty()&&pageNo==0){ +// locateRefresh.loadmoreFinish(PullToRefreshLayout.SUC_NODATA); +// }else{ +// if(mlist.isEmpty()){ +// locateRefresh.loadmoreFinish(PullToRefreshLayout.SUC_NODATA); +// }else{ +// mAddlist.addAll(mlist); +// adapter.updateListView(mAddlist); +// locateRefresh.refreshFinish(PullToRefreshLayout.SUCCEED); +// } +// } +// }else{ +// locateRefresh.loadmoreFinish(PullToRefreshLayout.SUC_NODATA); +// } +// } + + @Override + protected void onDestroy() { + super.onDestroy(); + if (helper != null) { + helper.stopLocate(); + helper = null; + } + } + +// @Override +// public void onRefresh(PullToRefreshLayout pullToRefreshLayout) { +// +// } +// +// @Override +// public void onLoadMore(PullToRefreshLayout pullToRefreshLayout) { +// ++pageNo; +// nearbySearchOption.pageNum(pageNo); +// nearbySearch(); +// } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/ChooseProvinceActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/ChooseProvinceActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..e3d0c3f7f7975b96010894c8778471184be47b41 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/ChooseProvinceActivity.java @@ -0,0 +1,200 @@ +package com.jiuqi.elove.activity; + +import android.content.Intent; +import android.os.Bundle; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.ListView; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonParser; +import com.google.gson.reflect.TypeToken; +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.CommonDataUtil; +import com.jiuqi.elove.entity.SchoolBean; +import com.jiuqi.elove.util.PickerViewDataUtil; +import com.jiuqi.elove.widget.cityPicker.City; +import com.jiuqi.elove.widget.cityPicker.CityListAdapter; +import com.jiuqi.elove.widget.cityPicker.ResultListAdapter; +import com.jiuqi.elove.widget.cityPicker.SideLetterBar; + +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import butterknife.OnClick; + +public class ChooseProvinceActivity extends ABaseActivity { + + @BindView(R.id.listview_all_city) + ListView mListView; + @BindView(R.id.listview_search_result) + ListView mResultListView; + @BindView(R.id.side_letter_bar) + SideLetterBar mLetterBar; + @BindView(R.id.et_search) + EditText searchBox; + @BindView(R.id.iv_search_clear) + ImageView clearBtn; + @BindView(R.id.empty_view) + ViewGroup emptyView; + @BindView(R.id.tv_letter_overlay) + TextView overlay; + @BindView(R.id.tv_right) + TextView tv_right; + @BindView(R.id.rl_right_tv) + RelativeLayout rl_right_tv; + + private CityListAdapter mCityAdapter; + private ResultListAdapter mResultAdapter; + private List mAllCities; + private List mSchoolList; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_choose_province,"选择省份",-1,MODE_BACK,HEIGHT_REDBG_WHITEFONT); + setRightClick(); + initSchoolData(); + initData(); + setUpView(); + } + + private void setRightClick() { + rl_right_tv.setVisibility(View.VISIBLE); + tv_right.setText("其他学校"); + } + + private void initSchoolData() { + mSchoolList = PickerViewDataUtil.getSchoolList(); + } + + private void setUpView() { + mLetterBar.setOverlay(overlay); + mLetterBar.setOnLetterChangedListener(new SideLetterBar.OnLetterChangedListener() { + @Override + public void onLetterChanged(String letter) { + int position = mCityAdapter.getLetterPosition(letter); + mListView.setSelection(position); + } + }); + searchBox.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) {} + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) {} + + @Override + public void afterTextChanged(Editable s) { + String keyword = s.toString(); + if (TextUtils.isEmpty(keyword)) { + clearBtn.setVisibility(View.GONE); + emptyView.setVisibility(View.GONE); + mResultListView.setVisibility(View.GONE); + } else { + clearBtn.setVisibility(View.VISIBLE); + mResultListView.setVisibility(View.VISIBLE); + List result = queryCity(keyword); + if (result == null || result.size() == 0) { + emptyView.setVisibility(View.VISIBLE); + } else { + emptyView.setVisibility(View.GONE); + mResultAdapter.changeData(result); + } + } + } + }); + mResultListView = (ListView) findViewById(R.id.listview_search_result); + mResultListView.setAdapter(mResultAdapter); + mResultListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + setResult2NextPage(mResultAdapter.getItem(position).getId()); + } + }); + } + + @OnClick({R.id.iv_search_clear, R.id.rl_right_tv}) + public void onClick(View view){ + switch (view.getId()){ + case R.id.iv_search_clear: + searchBox.setText(""); + clearBtn.setVisibility(View.GONE); + emptyView.setVisibility(View.GONE); + mResultListView.setVisibility(View.GONE); + break; + case R.id.rl_right_tv: + startInputSchool(); + break; + } + } + + private void startInputSchool() { + Intent intent = new Intent(this,InputSchoolActivity.class); + startActivity(intent); + } + + /** + * 点击进入下一页选择该省份下的学校 + * @param id 省份的id + */ + private void setResult2NextPage(String id) { + Intent intent = new Intent(this,ChooseSchoolActivity.class); + if(mSchoolList==null){ + return; + } + ArrayList mList = new ArrayList<>(); + for (SchoolBean bean : mSchoolList){ + if(bean.getId().equals(id)){ + mList.addAll(bean.getData()); + break; + } + } + intent.putExtra("title","选择学校"); + intent.putCharSequenceArrayListExtra("school",mList); + startActivity(intent); + } + + private List queryCity(String keyword) { + List mList = new ArrayList<>(); + for(City city :mAllCities){ + if(city.getName().contains(keyword)){ + mList.add(city); + } + } + return mList; + } + + private void initData() { + mAllCities = getProvinceByJson(); + mCityAdapter = new CityListAdapter(this, mAllCities); + mListView.setAdapter(mCityAdapter); + mCityAdapter.setOnCityClickListener(new CityListAdapter.OnCityClickListener() { + @Override + public void onCityClick(String id) { + setResult2NextPage(id); + } + }); + + mResultAdapter = new ResultListAdapter(this, null); + } + + private List getProvinceByJson(){ + JsonArray provinceArray = new JsonParser().parse(CommonDataUtil.schoolArea).getAsJsonArray(); + Gson gson = new Gson(); + Type type = new TypeToken>() {}.getType(); + return gson.fromJson(provinceArray,type); + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/ChooseSchoolActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/ChooseSchoolActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..cdc2b508fef6bd3b1805661fb61c33dbcc0a2f66 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/ChooseSchoolActivity.java @@ -0,0 +1,64 @@ +package com.jiuqi.elove.activity; + +import android.content.Intent; +import android.os.Bundle; +import android.support.v7.widget.DefaultItemAnimator; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.View; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.adapter.SchoolAdapter; +import com.jiuqi.elove.widget.rvhelper.adapter.MultiItemTypeAdapter; + +import java.util.List; + +import butterknife.BindView; + +public class ChooseSchoolActivity extends ABaseActivity { + + @BindView(R.id.rv_school) + RecyclerView rv_school; + + private List mSchoolList; + private String title; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getDataFromPre(); + setContentView(R.layout.activity_choose_school,title,-1,MODE_BACK,HEIGHT_REDBG_WHITEFONT); + setData2View(); + } + + private void getDataFromPre() { + Intent intent = getIntent(); + title = intent.getStringExtra("title"); + mSchoolList = intent.getStringArrayListExtra("school"); + } + + private void setData2View() { + SchoolAdapter adapter = new SchoolAdapter(this, R.layout.item_school_layout,mSchoolList); + rv_school.setLayoutManager(new LinearLayoutManager(this)); + rv_school.setItemAnimator(new DefaultItemAnimator()); + rv_school.setAdapter(adapter); + adapter.setOnItemClickListener(new MultiItemTypeAdapter.OnItemClickListener() { + @Override + public void onItemClick(View view, RecyclerView.ViewHolder holder, Object o, int position) { + startNewIntent((String)o); + } + + @Override + public boolean onItemLongClick(View view, RecyclerView.ViewHolder holder, Object o, int position) { + return false; + } + }); + } + + private void startNewIntent(String school) { + Intent intent = new Intent(this,EditMyInfoActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP); + intent.putExtra("school",school); + startActivity(intent); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/CircleCommentDetailActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/CircleCommentDetailActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..5a9004ec27cbdc7b4d95c86943d5a95e844c4719 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/CircleCommentDetailActivity.java @@ -0,0 +1,376 @@ +package com.jiuqi.elove.activity; + +import android.content.Intent; +import android.graphics.drawable.ColorDrawable; +import android.os.Bundle; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.PopupWindow; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.jiuqi.elove.R; +import com.jiuqi.elove.adapter.CommentAdapter; +import com.jiuqi.elove.adapter.SecondCommentAdapter; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.entity.CircleCommentModel; +import com.jiuqi.elove.entity.CommentModel; +import com.jiuqi.elove.util.EasyGlide; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; +import com.jiuqi.elove.widget.dialog.InputDailog; +import com.jiuqi.elove.widget.pulltorefresh.PullToRefreshLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import butterknife.OnClick; + +public class CircleCommentDetailActivity extends ABaseActivity implements PullToRefreshLayout.OnRefreshListener{ + + /** + * 数据 + */ + private String recid; + private String circleid; + private String userid; + private int page = 1; + private int pagesize = 10; + private boolean isshow = true; + private String commentCount = "0"; + private List mList; + private List mAddList; + private SecondCommentAdapter adapter; + private CircleCommentModel model; + + /** + * 组件 + */ + @BindView(R.id.iv_avatar) + ImageView iv_avatar; + @BindView(R.id.tv_nike) + TextView tv_nike; + @BindView(R.id.tv_time) + TextView tv_time; + @BindView(R.id.tv_content) + TextView tv_content; + @BindView(R.id.tv_comment_title) + TextView tv_comment_title; + @BindView(R.id.refresh_view) + PullToRefreshLayout refresh_view; + @BindView(R.id.rv) + RecyclerView rv; + @BindView(R.id.rlay_nodata) + RelativeLayout rlay_nodata; + @BindView(R.id.tv_comment_count) + TextView tv_comment_count; + @BindView(R.id.commont_layout) + RelativeLayout commont_layout; + @BindView(R.id.iv_share) + ImageView iv_share; + @BindView(R.id.iv_favor) + ImageView iv_favor; + @BindView(R.id.tv_comment) + TextView tv_comment; + private InputDailog dialog; + private PopupWindow window; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_circle_comment_detail,"评论详情",-1,MODE_BACK,HEIGHT_REDBG_WHITEFONT); + setView(); + getDataFromPre(); + initHeaderView(); + initAdapter(); + loadSecondComment(); + } + + private void setView() { + commont_layout.setVisibility(View.GONE); + iv_share.setVisibility(View.GONE); + iv_favor.setVisibility(View.GONE); + LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); + lp.setMargins(30,0,30,0); + tv_comment.setLayoutParams(lp); + } + + /** + * 获取数据 + */ + private void getDataFromPre() { + Intent intent = getIntent(); + model = (CircleCommentModel) intent.getSerializableExtra("model"); + circleid = intent.getStringExtra("circleid");//本条话题或者朋友圈id + recid = model.getRecid();//本条评论id + userid = SpUtils.getString(Constant.USER_ID); + } + + /** + * 设置本页面的主评论 + */ + private void initHeaderView() { + if(model!=null){ + tv_nike.setText(model.getUserName()); + tv_time.setText(model.getTime()); + tv_content.setText(model.getComment()); + EasyGlide.getInstance().showImage(true,model.getUserAvatar(),iv_avatar,R.drawable.img_hx_avatar); + } + + } + + /** + * 初始化adapter + */ + private void initAdapter() { + mAddList = new ArrayList<>(); + adapter = new SecondCommentAdapter(this); + rv.setLayoutManager(new LinearLayoutManager(this)); + rv.setAdapter(adapter); + refresh_view.setOnRefreshListener(this); + adapter.setCommentClickListener(new SecondCommentAdapter.OnClickComment() { + @Override + public void onReplyClick(String flag, SecondCommentAdapter.CommentViewHolder holder, CommentModel model, int position) { + + } + + @Override + public void showMore(SecondCommentAdapter.CommentViewHolder holder, final CircleCommentModel model, final int position) { + if(window!=null){ + window.dismiss(); + window = null; + } + + View view = LayoutInflater.from(CircleCommentDetailActivity.this).inflate(R.layout.popupwindow_circle,null); + TextView tv_handle = (TextView) view.findViewById(R.id.tv_handle); + //一定要销毁持有对象的view,否则改view持有的操作对象无法更新 + if(window==null){ + window = new PopupWindow(view, ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT); + window.setBackgroundDrawable(new ColorDrawable(0x00000000)); + window.setOutsideTouchable(true); + window.setFocusable(true); + window.setTouchable(true); + window.setAnimationStyle(R.style.circle_anim_style); + window.setContentView(view); + } + if(userid!=null&&userid.equals(model.getUserid())){//本人发的 + if(tv_handle!=null){ + tv_handle.setText("删除"); + tv_handle.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + window.dismiss(); + window = null; + deleteItem(model,position); + } + }); + } + }else{//非本人发的 + if(tv_handle!=null){ + tv_handle.setText("举报"); + tv_handle.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + window.dismiss(); + window = null; + report(model,position); + } + }); + } + } + if(window.isShowing()){ + window.dismiss(); + window = null; + }else{ + window.showAsDropDown(holder.iv_handle,-holder.iv_handle.getWidth()/2,0); + } + } + }); + } + + /** + * 举报评论 + * @param model + * @param position + */ + private void report(CircleCommentModel model, int position) { + Intent intent = new Intent(this, ReportUserActivity.class); + intent.putExtra("prepage","comment"); + intent.putExtra("myId",userid); + intent.putExtra("otherId",model.getRecid()); + startActivity(intent); + } + + /** + * 删除评论 + * @param model + * @param position + */ + private void deleteItem(final CircleCommentModel model, int position) { + String delCircleUrl = Constant.COMMON_URL + Interface.CIRCLE_DEL_NEW; + JSONObject obj = new JSONObject(); + obj.put("version",Constant.VERSION); + obj.put("userid",userid); + obj.put("recid",model.getRecid()); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, false, delCircleUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if("1".equals(rsCode)){ + mAddList.remove(model); + adapter.updateListView(mAddList); + }else{ + showToast(explanation); + } + } + },null); + } + + /** + * 加载评论列表 + */ + private void loadSecondComment() { + String commentUrl = Constant.COMMON_URL + Interface.CIRCLE_COMMENTS; + JSONObject obj = new JSONObject(); + obj.put("titleid", circleid); + obj.put("userid", userid); + obj.put("recid", recid); + obj.put("limit", pagesize); + obj.put("offset", page); + obj.put("version", Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, isshow, commentUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if (Constant.SUCCESS_CODE.equals(rsCode)) { + String temp = jsonObject.getString("message"); + JSONObject obj = JSON.parseObject(temp); + commentCount = obj.getString("pageCount");//以及评论总数 + tv_comment_count.setText(commentCount);//设置评论数到ui + String result = obj.getString("list"); + mList = JSONArray.parseArray(result, CircleCommentModel.class); + mAddList.addAll(mList); + updateRecylerView(); + } else { + showToast(explanation); + if(Constant.FAIL_CODE.equals(rsCode)){ + finish(); + } + } + } + }, null); + + } + + private void updateRecylerView() { + if(mAddList.isEmpty()){ + rlay_nodata.setVisibility(View.VISIBLE); + }else{ + rlay_nodata.setVisibility(View.GONE); + if(!mList.isEmpty()){ + adapter.updateListView(mAddList); + refresh_view.refreshFinish(PullToRefreshLayout.SUCCEED); + }else{ + refresh_view.loadmoreFinish(PullToRefreshLayout.SUC_NODATA); + } + } + } + + @Override + protected void onNavigationClicked() { + Intent intent = new Intent(); + intent.putExtra("size",mAddList.size()); + setResult(RESULT_OK,intent); + super.onNavigationClicked(); + } + + /** + * 点击事件 + */ + @OnClick(R.id.tv_comment) + public void OnClick(View view){ + switch (view.getId()){ + case R.id.tv_comment: + showInputDialog(); + break; + } + } + + /** + * 展示评论输入框 + */ + private void showInputDialog() { + dialog = new InputDailog("我来说两句:", new InputDailog.SendBackListener() { + public void sendBack(final String inputText) { + reply(model.getUserid(),inputText,"",model.getRecid()); + } + }); + dialog.show(getSupportFragmentManager(), "dialog"); + } + + /** + * 评论本条朋友圈 + * @param otherid 上一级评论的id 在这里为空上一级没有 + * @param content + */ + private void reply(final String otherid, final String content, final String othername,String firstId) { + String replyUrl = Constant.COMMON_URL + Interface.CIRCLE_COMMENT; + JSONObject obj = new JSONObject(); + obj.put("titleid",circleid); + obj.put("parentid",otherid); + obj.put("userid",userid); + obj.put("content",content); + obj.put("firstid",firstId);//一级评论 + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, true, replyUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if(Constant.SUCCESS_CODE.equals(rsCode)){ + String result = jsonObject.getString("message"); + CircleCommentModel cirmodel = JSON.parseObject(result,CircleCommentModel.class); + mAddList.add(0,cirmodel); + commentCount = String.valueOf(Integer.parseInt(commentCount) +1); + tv_comment_count.setText(commentCount); + rlay_nodata.setVisibility(View.GONE); + adapter.updateListView(mAddList); + dialog.dismiss(); + }else{ + showToast(explanation); + } + } + },null); + } + + @Override + public void onRefresh(PullToRefreshLayout pullToRefreshLayout) { + mAddList.clear(); + page = 1; + isshow = false; + loadSecondComment(); + } + + @Override + public void onLoadMore(PullToRefreshLayout pullToRefreshLayout) { + page = page+1; + isshow = false; + loadSecondComment(); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/CircleDetailActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/CircleDetailActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..bae7b444c482f12266b27cf1d953e760b36e5b4a --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/CircleDetailActivity.java @@ -0,0 +1,936 @@ +package com.jiuqi.elove.activity; + +import android.content.Intent; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.drawable.ColorDrawable; +import android.os.Bundle; +import android.support.v4.content.ContextCompat; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.text.TextUtils; +import android.util.DisplayMetrics; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.PopupWindow; +import android.widget.RelativeLayout; +import android.widget.TextView; +import android.widget.Toast; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.animation.GlideAnimation; +import com.bumptech.glide.request.target.BitmapImageViewTarget; +import com.bumptech.glide.request.target.SimpleTarget; +import com.jiuqi.elove.R; +import com.jiuqi.elove.adapter.FirstClassCommentAdapter; +import com.jiuqi.elove.application.EloveApplication; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.entity.CircleCommentModel; +import com.jiuqi.elove.entity.CircleNewModel; +import com.jiuqi.elove.util.EasyGlide; +import com.jiuqi.elove.util.GlideRoundTransform; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; +import com.jiuqi.elove.util.StrUtil; +import com.jiuqi.elove.util.SupportMultiScreenUtil; +import com.jiuqi.elove.widget.dialog.InputDailog; +import com.jiuqi.elove.widget.pulltorefresh.PullToRefreshLayout; +import com.umeng.socialize.ShareAction; +import com.umeng.socialize.UMShareAPI; +import com.umeng.socialize.UMShareListener; +import com.umeng.socialize.bean.SHARE_MEDIA; +import com.umeng.socialize.media.UMImage; +import com.umeng.socialize.shareboard.SnsPlatform; +import com.umeng.socialize.utils.ShareBoardlistener; + + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import butterknife.OnClick; + +public class CircleDetailActivity extends ABaseActivity implements PullToRefreshLayout.OnRefreshListener{ + + /** + * 组件 + */ + private InputDailog dialog; + @BindView(R.id.rv_comment) + RecyclerView rv_comment; + @BindView(R.id.rl_nodata) + RelativeLayout rl_nodata; + @BindView(R.id.circleRefreshView) + PullToRefreshLayout circleRefreshView; + @BindView(R.id.tv_comment_count) + TextView tv_comment_count; + @BindView(R.id.iv_favor) + ImageView iv_favor; + + private ImageView iv_avatar; + private TextView tv_nike; + private TextView tv_time; + private TextView tv_content; + private TextView tv_like_num; + private TextView tv_addr; + private LinearLayout ll_focus; + private ImageView iv_focus; + private TextView tv_focus; + private TextView tv_topic; + private LinearLayout ll_img; + private RelativeLayout rl_video; + private ImageView iv_video; + private ImageView iv_like; + private LinearLayout ll_jubao; + private Bitmap imgbitmap; + private PopupWindow window; + + /** + * 数据 + */ + private int page = 1; + private int pagesize = 10; + private boolean isshow = true; + private String userid; + private String qiyuanid; + private String nikename; + private List mList; + private List mAddList; + private FirstClassCommentAdapter adapter; + private String first_class_comment_count = "0"; + private DisplayMetrics dm; + private CircleNewModel model; + public static CircleDetailActivity instance; + private int clickPosition; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + instance = this; + setContentView(R.layout.activity_circle_detail,"缘圈详情",-1,MODE_BACK,HEIGHT_REDBG_WHITEFONT_NOINPUT); + dm = getResources().getDisplayMetrics(); + getDataFromPreAndSp(); + initAdapter(); + } + + /** + * 从缓存和上一页获取数据 + */ + private void getDataFromPreAndSp() { + userid = SpUtils.getString(Constant.USER_ID); + qiyuanid = getIntent().getStringExtra("circleid"); + nikename = SpUtils.getString(Constant.NIKE_NAME); + } + + /** + * 初始化adapter + */ + private void initAdapter() { + RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this); + rv_comment.setLayoutManager(layoutManager); + adapter = new FirstClassCommentAdapter(this); + rv_comment.setAdapter(adapter); + mAddList = new ArrayList<>(); + loadCircleDetail(); + circleRefreshView.setOnRefreshListener(this); + adapter.setOnItemClickListener(new FirstClassCommentAdapter.OnItemClickListener() { + @Override + public void toCommentDetailPage(CircleCommentModel model,int position) { + clickPosition = position; + Intent intent = new Intent(CircleDetailActivity.this,CircleCommentDetailActivity.class); + intent.putExtra("model",model); + intent.putExtra("circleid",qiyuanid); + startActivityForResult(intent,0x01); + } + + @Override + public void showMore(FirstClassCommentAdapter.CommentViewHolder holder, final CircleCommentModel model, final int position) { + if(window!=null){ + window.dismiss(); + window = null; + } + View view = LayoutInflater.from(CircleDetailActivity.this).inflate(R.layout.popupwindow_circle, null); + TextView tv_handle = (TextView) view.findViewById(R.id.tv_handle); + //一定要销毁持有对象的view,否则改view持有的操作对象无法更新 + if (window == null) { + window = new PopupWindow(view, ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT); + window.setOutsideTouchable(true); + window.setTouchable(true); + window.setFocusable(true); + window.setBackgroundDrawable(new ColorDrawable(0x00000000)); + window.setAnimationStyle(R.style.circle_anim_style); + window.setContentView(view); + } + if (userid != null && userid.equals(model.getUserid())) {//本人发的 + if (tv_handle != null) { + tv_handle.setText("删除"); + tv_handle.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + window.dismiss(); + window = null; + deleteItem(model, position); + } + }); + } + } else {//非本人发的 + if (tv_handle != null) { + tv_handle.setText("举报"); + tv_handle.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + window.dismiss(); + window = null; + report(model, position); + } + }); + } + } + if (window.isShowing()) { + window.dismiss(); + window = null; + } else { + window.showAsDropDown(holder.iv_handle, -holder.iv_handle.getWidth() / 2, 0); + } + } + }); + } + + /** + * 举报缘圈 + */ + private void reportCircle() { + Intent intent = new Intent(this, ReportUserActivity.class); + intent.putExtra("prepage","circle"); + intent.putExtra("myId",userid); + intent.putExtra("otherId",qiyuanid); + startActivity(intent); + } + + /** + * 举报评论 + * @param model + * @param position + */ + private void report(CircleCommentModel model, int position) { + Intent intent = new Intent(this, ReportUserActivity.class); + intent.putExtra("prepage","comment"); + intent.putExtra("myId",userid); + intent.putExtra("otherId",model.getRecid()); + startActivity(intent); + } + + /** + * 删除评论 + * @param cmodel + * @param position + */ + private void deleteItem(final CircleCommentModel cmodel, int position) { + String delCircleUrl = Constant.COMMON_URL + Interface.CIRCLE_DEL_NEW; + JSONObject obj = new JSONObject(); + obj.put("version",Constant.VERSION); + obj.put("userid",userid); + obj.put("recid",cmodel.getRecid()); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, false, delCircleUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if("1".equals(rsCode)){ + mAddList.remove(cmodel); + adapter.updateRecylerView(mAddList); + first_class_comment_count = String.valueOf(Integer.parseInt(first_class_comment_count)-1); + model.setCommentnum(first_class_comment_count); + tv_comment_count.setText(first_class_comment_count); + }else{ + showToast(explanation); + } + } + },null); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if(requestCode==0x01&&resultCode==RESULT_OK){ + int size = data.getIntExtra("size",0); + if(size>0){ + mAddList.get(clickPosition).setChildCount(String.valueOf(size)); + adapter.updateRecylerView(mAddList); + } + + }else{ + UMShareAPI.get(this).onActivityResult(requestCode, resultCode, data); + } + } + + /** + * 加载本条缘圈的一级评论 + */ + private void loadCircleFirstClassComment() { + String commentUrl = Constant.COMMON_URL + Interface.CIRCLE_COMMENTS; + JSONObject obj = new JSONObject(); + obj.put("titleid",qiyuanid); + obj.put("userid",userid); + obj.put("recid",""); + obj.put("limit",pagesize); + obj.put("offset",page); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, isshow, commentUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if(Constant.SUCCESS_CODE.equals(rsCode)){ + String temp = jsonObject.getString("message"); + JSONObject obj= JSON.parseObject(temp); + first_class_comment_count = obj.getString("pageCount");//以及评论总数 + tv_comment_count.setText(first_class_comment_count);//设置评论数到ui + String result = obj.getString("list"); + mList = JSONArray.parseArray(result,CircleCommentModel.class); + mAddList.addAll(mList); + if(mAddList.isEmpty()){ + rl_nodata.setVisibility(View.VISIBLE); + if(page==1){ + circleRefreshView.refreshFinish(PullToRefreshLayout.SUCCEED); + }else{ + circleRefreshView.loadmoreFinish(PullToRefreshLayout.SUC_NODATA); + } + }else{ + rl_nodata.setVisibility(View.GONE); + adapter.updateRecylerView(mAddList); + if(mList.isEmpty()){//第一页且有数据为刷新 + circleRefreshView.loadmoreFinish(PullToRefreshLayout.SUC_NODATA); + }else{//非第一页且有数据为加载,加载成功不必悬停 + circleRefreshView.refreshFinish(PullToRefreshLayout.SUCCEED); + } + } + }else{ + showToast(explanation); + } + } + },null); + } + + /** + * 加载本条朋友圈详情 + */ + private void loadCircleDetail() { + String detailUrl = Constant.COMMON_URL + Interface.CIRCLE_DETAIL_NEW; + JSONObject obj = new JSONObject(); + obj.put("yuanquanid",qiyuanid); + obj.put("userid",userid); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, false, detailUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if(Constant.SUCCESS_CODE.equals(rsCode)){ + String result = jsonObject.getString("message"); + model = JSONObject.parseObject(result,CircleNewModel.class); + setHeader(); + loadCircleFirstClassComment();//请求完头部在请求下面,要不然会有滑动 + }else{ + showToast(explanation); + if(Constant.FAIL_CODE.equals(rsCode)){ + finish(); + } + } + } + },null); + } + + public void refresh(){ + mAddList.clear(); + loadCircleDetail(); + } + + + /** + * 生成header + */ + private void setHeader() { + View view = LayoutInflater.from(this).inflate(R.layout.circle_detail_header,rv_comment,false); + SupportMultiScreenUtil.scale(view); + setData2ViewOrClick(view); + adapter.setHeaderView(view); + } + + /** + * 给header设置数据,并且设置点击事件 + * @param view + */ + private void setData2ViewOrClick(View view) { + initView(view); + EasyGlide.getInstance().showImage(true,model.getAvatar(),iv_avatar,R.drawable.img_hx_avatar); + Glide.with(this).load(model.getAvatar()).asBitmap().transform(new GlideRoundTransform(this,8)).into(new BitmapImageViewTarget(iv_avatar){ + @Override + public void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) { + imgbitmap = resource; + iv_avatar.setImageBitmap(imgbitmap); + } + }); + tv_nike.setText(model.getNickname()); + tv_time.setText(model.getTime()); + tv_like_num.setText(model.getLikenum()); + tv_addr.setText(model.getPosition()); + setIfAttention(model.getUserid());//是否关注 + setMainCircleContent(model);//关于话题、评论内容、图片或者视频 + if(Constant.CIRCLE_LIKE == model.getIslike()){ + iv_like.setImageResource(R.drawable.circle_like_on); + }else{ + iv_like.setImageResource(R.drawable.circle_like); + } + if(Constant.CIRCLE_COLLECTION_IS.equals(model.getCollection())){ + iv_favor.setImageResource(R.drawable.circle_shoucang_true); + }else{ + iv_favor.setImageResource(R.drawable.circle_shoucang_false); + } + iv_like.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + likeOrNotThisCircle(); + } + }); + ll_jubao.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + reportCircle(); + } + }); + } + + + /** + * 点赞或者取消赞 + */ + private void likeOrNotThisCircle() { + String circleLikeUrl = Constant.COMMON_URL + Interface.CIRCLE_LIKE; + JSONObject obj = new JSONObject(); + obj.put("version",Constant.VERSION); + obj.put("userid",userid); + obj.put("titleid",model.getYuanquanid()); + if(Constant.CIRCLE_NOT_LIKE==model.getIslike()){//点赞 + obj.put("action",Constant.LIKE_IS); + }else{ + obj.put("action",Constant.LIKE_CANCEL); + } + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, true, circleLikeUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if(Constant.SUCCESS_CODE.equals(rsCode)){ + if(Constant.CIRCLE_NOT_LIKE==model.getIslike()){//如果是为点赞的状态,则进行点赞 + model.setIslike(Constant.CIRCLE_LIKE); + model.setLikenum(String.valueOf(Integer.parseInt(model.getLikenum())+1)); + iv_like.setImageResource(R.drawable.circle_like_on); + }else{//取消点赞 + model.setIslike(Constant.CIRCLE_NOT_LIKE); + model.setLikenum(String.valueOf(Integer.parseInt(model.getLikenum())-1)); + iv_like.setImageResource(R.drawable.circle_like); + } + tv_like_num.setText(model.getLikenum()); + }else{ + showToast(explanation); + } + } + },null); + } + + /** + * 实例化头部ui + */ + private void initView(View view) { + iv_avatar = (ImageView) view.findViewById(R.id.iv_avatar); + tv_nike = (TextView) view.findViewById(R.id.tv_nike); + tv_time = (TextView) view.findViewById(R.id.tv_time); + tv_content = (TextView) view.findViewById(R.id.tv_content); + tv_like_num = (TextView) view.findViewById(R.id.tv_like_num); + tv_addr = (TextView) view.findViewById(R.id.tv_addr); + tv_topic = (TextView) view.findViewById(R.id.tv_topic); + ll_img = (LinearLayout) view.findViewById(R.id.ll_img); + rl_video = (RelativeLayout) view.findViewById(R.id.rl_video); + ll_focus = (LinearLayout) view.findViewById(R.id.ll_focus); + ll_jubao = (LinearLayout) view.findViewById(R.id.ll_jubao); + tv_focus = (TextView) view.findViewById(R.id.tv_focus); + iv_focus = (ImageView) view.findViewById(R.id.iv_focus); + iv_video = (ImageView) view.findViewById(R.id.iv_video); + iv_like = (ImageView) view.findViewById(R.id.iv_like); + } + + /** + * 关于话题、评论内容、图片或者视频 + * @param model + */ + private void setMainCircleContent(CircleNewModel model) { + StrUtil.setHideText(tv_content,model.getText()); + if(TextUtils.isEmpty(model.getTopic())){ + tv_topic.setVisibility(View.GONE); + }else{ + tv_topic.setText("#"+model.getTopic()+"#"); + tv_topic.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startTopicDetailPage(); + } + }); + } + if(Constant.PUT_NO_ACTION == model.getImgstype()){//无图片和视频 + ll_img.setVisibility(View.GONE); + rl_video.setVisibility(View.GONE); + }else if(Constant.PUT_PIC_ACTION == model.getImgstype()){//图片 + setImage2View(model); + }else if(Constant.PUT_VIDEO_ACTION == model.getImgstype()){//视频 + setVideo2View(model); + } + } + + /** + * 进入主题页面 + */ + private void startTopicDetailPage() { + Intent intent = new Intent(this, TopicDetailActivity.class); + intent.putExtra("topicid",model.getTopicid()); + startActivity(intent); + } + + /** + * 内容为图片时,设置图片 + * @param model + */ + private void setImage2View(CircleNewModel model) { + ll_img.setVisibility(View.VISIBLE); + rl_video.setVisibility(View.GONE); + final List mList = model.getPictures(); + for(int i=0;i() { + @Override + public void onResourceReady(Bitmap bitmap, GlideAnimation glideAnimation) { + int width = bitmap.getWidth(); + int height = bitmap.getHeight(); + iv.setLayoutParams(getMyLayout((double)width/height)); + iv.setImageBitmap(bitmap); + } + }); +// iv.setLayoutParams(getMyLayout(bean.getImgwh())); +// EasyGlide.getInstance().showImage(false,bean.getImg(),iv,-1); + ll_img.addView(iv); + iv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startPic(mList,position); + } + }); + } + } + + /** + * 进入图片预览 + */ + private void startPic(List mList,int position) { + Intent intent; + if(mList.size()==1){ + intent = new Intent(this, PreviewAvatarActivity.class); + intent.putExtra("imageUrl",mList.get(0).getImg()); + }else{ + intent = new Intent(this, PreviewImgActivity.class); + intent.putExtra("currentItem",String.valueOf(position)); + Bundle bundle = new Bundle(); + String[] imgUrls = new String[mList.size()]; + for(int i=0;i(); + page = 1; + isshow = false; + loadCircleFirstClassComment(); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/CirclePictureEditActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/CirclePictureEditActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..1d60ff784cabf70c83496cb99c44933d4368121d --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/CirclePictureEditActivity.java @@ -0,0 +1,258 @@ +package com.jiuqi.elove.activity; + +import android.content.Intent; +import android.os.Bundle; +import android.support.v4.view.PagerAdapter; +import android.support.v4.view.ViewPager; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.baoyz.actionsheet.ActionSheet; +import com.jiuqi.elove.R; +import com.jiuqi.elove.util.EasyGlide; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import butterknife.OnClick; + +public class CirclePictureEditActivity extends ABaseActivity { + + /** + * 数据 + */ + private String title; + private int titlePos;//title显示的位置 + private int curPos;//当前位置 + private int total;//总的数量 + private ArrayList imgList;//图片url的list + private List mViewList;//view集合 + private ViewPagerAdapter adapter;//适配器 + private boolean isEdit = false;//是否编辑了页面 + + /** + * 组件 + */ + @BindView(R.id.toolbar_title) + TextView toolbar_title; + @BindView(R.id.vp) + ViewPager vp; + @BindView(R.id.iv_right) + ImageView iv_right; + @BindView(R.id.rl_right) + RelativeLayout rl_right; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_circle_picture_edit,-1,-1,MODE_BACK,HEIGHT_REDBG_WHITEFONT); + getDataFromPre(); + initView(); + initDataContainer(); + setData2View(); + } + + /** + * 初始化数据 + */ + private void initDataContainer() { + mViewList = new ArrayList<>(); + adapter = new ViewPagerAdapter(); + } + + /** + * 初始化ui + */ + private void initView() { + iv_right.setImageResource(R.drawable.icon_remove); + rl_right.setVisibility(View.VISIBLE); + } + + /** + * 从上一页获取数据 + */ + private void getDataFromPre() { + Intent intent = getIntent(); + curPos = intent.getIntExtra("position",0); + imgList = intent.getStringArrayListExtra("imgList"); + titlePos = curPos + 1; + setTitle(); + } + + /** + * 更改title + */ + private void setTitle() { + if(imgList!=null) + total = imgList.size(); + else + total = 0; + title = titlePos+"/"+total; + toolbar_title.setText(title); + } + + /** + * 将数据填充到ui + */ + private void setData2View() { + mViewList.clear(); + for(String url : imgList){ + View view = LayoutInflater.from(this).inflate(R.layout.activity_avatar_preview,vp,false); + ImageView imageView = (ImageView) view.findViewById(R.id.large_image); + EasyGlide.getInstance().showImageNoCrop(false,url,imageView,R.drawable.img_hx_avatar); + mViewList.add(view);//将view装入数组 + } + adapter.upDatalist(mViewList); + vp.setAdapter(adapter); + vp.setCurrentItem(curPos);//设置当前展示 + vp.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + + } + + @Override + public void onPageSelected(int position) { + curPos = position; + titlePos = position + 1; + setTitle();//改变title + } + + @Override + public void onPageScrollStateChanged(int state) { + + } + }); + } + + @OnClick(R.id.rl_right) + public void onClick(){ + createDialog(); + } + + @Override + protected void onNavigationClicked() { + if(isEdit){ + setResultBack(); + } + super.onNavigationClicked(); + } + + /** + * 如果删除过图片,则传递最新数据给前一页 + */ + private void setResultBack() { + Intent intent = new Intent(); + intent.putStringArrayListExtra("imgList",imgList); + setResult(RESULT_OK,intent); + } + + /** + * 弹出删除选择框 + */ + private void createDialog() { + setTheme(R.style.ActionSheetStyleiOS7); + ActionSheet.createBuilder(this, getSupportFragmentManager()) + .setCancelButtonTitle(getString(R.string.cancel)) + .setOtherButtonTitles(getString(R.string.delete)) + .setCancelableOnTouchOutside(true).setListener(new ChildActionSheetListener()).show(); + } + + /** + * 点击弹窗回调监听 + */ + private class ChildActionSheetListener implements ActionSheet.ActionSheetListener{ + + @Override + public void onDismiss(ActionSheet actionSheet, boolean isCancel) { + + } + + @Override + public void onOtherButtonClick(ActionSheet actionSheet, int index) { + switch (index){ + case 0: + deleteCurrentImg(); + break; + } + } + } + + /** + * 删除本地图片 + */ + private void deleteCurrentImg() { + isEdit = true; + if(imgList.isEmpty()){//无 + curPos = -1; + titlePos=curPos+1; + showToast("当前已无图片"); + }else{ + imgList.remove(curPos);//删除这个位置的数据 + mViewList.remove(curPos); + } + vp.removeAllViews(); + adapter.notifyDataSetChanged(); + setTitle(); + } + + /** + * 适配器 + */ + private class ViewPagerAdapter extends PagerAdapter { + + private List mViewList; + + private int mChildCount = 0; + + @Override + public void notifyDataSetChanged() { + mChildCount = getCount(); + super.notifyDataSetChanged(); + } + + public ViewPagerAdapter() { + mViewList = new ArrayList<>(); + } + + public void upDatalist(List mViewList){ + this.mViewList.clear(); + this.mViewList = mViewList; + } + + @Override + public int getCount() {//必须实现 + return mViewList.size(); + } + + @Override + public boolean isViewFromObject(View view, Object object) {//必须实现 + return view == object; + } + + @Override + public Object instantiateItem(ViewGroup container, int position) {//必须实现,实例化 + container.addView(mViewList.get(position)); + return mViewList.get(position); + } + + @Override + public int getItemPosition(Object object) { +// if (mChildCount > 0) { +// mChildCount--; + return POSITION_NONE; +// } +// return super.getItemPosition(object); + } + + @Override + public void destroyItem(ViewGroup container, int position, Object object) {//必须实现,销毁 + container.removeView((View) object); + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/CollectCircleActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/CollectCircleActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..a846513a778e61a675fa795d463591e021eeb376 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/CollectCircleActivity.java @@ -0,0 +1,124 @@ +package com.jiuqi.elove.activity; + +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.support.v4.view.ViewPager; +import android.view.View; +import android.widget.ImageView; +import android.widget.RadioButton; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.adapter.CommonFragmentAdapter; +import com.jiuqi.elove.common.JqBaseActivity; +import com.jiuqi.elove.fragment.CircleCollectFragment; +import com.jiuqi.elove.fragment.CirclePublishFragment; + +import java.util.ArrayList; + +public class CollectCircleActivity extends JqBaseActivity implements View.OnClickListener{ + + /** + * 控件 + */ + private RadioButton tv_publish; + private RadioButton tv_collect; + private ImageView img_leftBtn; + private ViewPager vp; + private ArrayList fragmentlist; + private CircleCollectFragment collectFragment; + private CirclePublishFragment publishFragment; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_collect_circle); + initView(); + addFragment(); + setEvents(); + } + + private void initView() { + tv_publish = easyFind(R.id.tv_publish); + tv_collect = easyFind(R.id.tv_collect); + img_leftBtn = easyFind(R.id.img_leftBtn); + vp = easyFind(R.id.vp); + } + + private void addFragment() { + fragmentlist = new ArrayList<>(); + publishFragment = new CirclePublishFragment(); + collectFragment = new CircleCollectFragment(); + fragmentlist.add(publishFragment); + fragmentlist.add(collectFragment); + vp.setAdapter(new CommonFragmentAdapter(getSupportFragmentManager(),fragmentlist)); + receiveChecked();//默认设置收到的礼物被选中 + } + + private void setEvents() { + tv_publish.setOnClickListener(this); + tv_collect.setOnClickListener(this); + img_leftBtn.setOnClickListener(this); + vp.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int i, float v, int i1) { + + } + + @Override + public void onPageSelected(int i) { + switch (i){ + case 0: + receiveChecked(); + break; + case 1: + sendChecked(); + break; + } + } + + @Override + public void onPageScrollStateChanged(int i) { + + } + }); + } + + /** + * 设置收到礼物的title被选中 + */ + private void receiveChecked(){ + tv_publish.setTextColor(getResources().getColor(R.color.topbarBackground)); + tv_collect.setTextColor(getResources().getColor(R.color.white)); + tv_publish.setChecked(true); + tv_collect.setChecked(false); + vp.setCurrentItem(0); + } + + /** + * 设置送出的礼物title被选中 + */ + private void sendChecked(){ + tv_collect.setTextColor(getResources().getColor(R.color.topbarBackground)); + tv_publish.setTextColor(getResources().getColor(R.color.white)); + tv_collect.setChecked(true); + tv_publish.setChecked(false); + vp.setCurrentItem(1); + } + + @Override + public void onClick(View view) { + switch (view.getId()){ + case R.id.tv_publish: + receiveChecked(); + break; + case R.id.tv_collect: + sendChecked(); + break; + case R.id.img_leftBtn: + finish(); + break; + default: + break; + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/CommentReplyActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/CommentReplyActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..60f09d1ab1425e430a6817de1275aad318318755 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/CommentReplyActivity.java @@ -0,0 +1,314 @@ +package com.jiuqi.elove.activity; + +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.os.IBinder; +import android.support.v7.widget.LinearLayoutManager; +import android.view.MotionEvent; +import android.view.View; +import android.view.inputmethod.InputMethodManager; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.alibaba.fastjson.JSON; +import com.jiuqi.elove.R; +import com.jiuqi.elove.adapter.CommentAdapter; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.entity.CommentModel; +import com.jiuqi.elove.entity.CommentWrapModel; +import com.jiuqi.elove.util.EasyGlide; +import com.jiuqi.elove.util.MyLayoutManager; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; +import com.jiuqi.elove.util.SupportMultiScreenUtil; +import com.jiuqi.elove.widget.pulltorefresh.PullToRefreshLayout; +import com.jiuqi.elove.widget.pulltorefresh.PullableRecylerView; +import com.stonesun.newssdk.activity.SlideActivity; + +import java.util.ArrayList; +import java.util.List; +import java.util.Timer; +import java.util.TimerTask; + +import butterknife.BindView; +import butterknife.ButterKnife; +import butterknife.OnClick; +import butterknife.Unbinder; + +public class CommentReplyActivity extends SlideActivity implements PullToRefreshLayout.OnRefreshListener { + + protected View rootView; + @BindView(R.id.iv_avatar) + ImageView iv_avatar; + @BindView(R.id.tv_nike) + TextView tv_nike; + @BindView(R.id.tv_time) + TextView tv_time; + @BindView(R.id.tv_comment) + TextView tv_comment; + @BindView(R.id.rv) + + PullableRecylerView rv; + @BindView(R.id.refresh_view) + PullToRefreshLayout refresh_view; + @BindView(R.id.rlay_nodata) + RelativeLayout rlay_nodata; + @BindView(R.id.et_comment) + EditText et_comment; + @BindView(R.id.ll_input) + LinearLayout ll_input; + @BindView(R.id.img_nodata) + ImageView img_nodata; + @BindView(R.id.tv_content_title) + TextView tv_content_title; + private List mList; + private List mAddList; + private CommentAdapter adapter; + private CommentModel bean; + private String flag; + private String articleId; + private String limit = "10"; + private String offset = "1"; + private String userid; + private Unbinder unbinder; + private boolean isshow; + + /** + * 工具 + */ + private final OkHttpUtil okHttpUtil = OkHttpUtil.getInstance(); + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_comment_reply); + supportMultiScreen(); + unbinder = ButterKnife.bind(this); + getDataFromPre(); + initView(); + initAdapter(); + initPresenter(); + } + + /** + * 多屏幕适配 + */ + private void supportMultiScreen() { + rootView = findViewById(android.R.id.content); + SupportMultiScreenUtil.scale(rootView); + } + + private void initAdapter() { + rv.setLayoutManager(new LinearLayoutManager(this)); + adapter = new CommentAdapter(this, "reply"); + rv.setAdapter(adapter); + refresh_view.setOnRefreshListener(this); + } + + private void initView() { + tv_content_title.setText("评论详情"); + EasyGlide.getInstance().showImageCircle(bean.getUserAvatar(),iv_avatar); + MyLayoutManager.setImageLayout(this,img_nodata,0,2,1,3); + tv_nike.setText(bean.getUserName()); + tv_time.setText(bean.getTime()); + tv_comment.setText(bean.getComment()); + et_comment.setHint(new StringBuilder().append("回复").append(bean.getUserName()).append(":")); + } + + @Override + protected void onResume() { + super.onResume(); + if (CommentAdapter.TV_REPLY.equals(flag)) { + ll_input.requestFocus(); + et_comment.requestFocus(); + Timer timer = new Timer(); + timer.schedule(new TimerTask() { + public void run() { + InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS); + } + }, 500); + } + } + + private void getDataFromPre() { + userid = SpUtils.getString(Constant.USER_ID); + Intent intent = getIntent(); + bean = (CommentModel) intent.getSerializableExtra("bean"); + flag = intent.getStringExtra("flag"); + articleId = intent.getStringExtra("article"); + } + + private void initPresenter() { + mAddList = new ArrayList<>(); + isshow = true; + loadComment(); + } + + private void loadComment() { + String detailInfoUrl = Constant.COMMON_URL + Interface.ARTICLE_COMMENT_LIST; + com.alibaba.fastjson.JSONObject obj = new com.alibaba.fastjson.JSONObject(); + obj.put("articleid", articleId); + obj.put("recid", bean.getRecid()); + obj.put("offset", offset); + obj.put("limit", limit); + obj.put("version", Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, isshow, detailInfoUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(com.alibaba.fastjson.JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + if ("1".equals(rsCode)) { + String result = jsonObject.getString("data"); + CommentWrapModel data = JSON.parseObject(result, CommentWrapModel.class); + mList = data.getList(); + mAddList.addAll(mList); + updateRecylerView(); + } + } + }, null); + } + + @Override + public void finish() { + Intent intent = new Intent(); + intent.putExtra("size",mAddList.size()); + setResult(RESULT_OK,intent); + super.finish(); + overridePendingTransition(0, R.anim.activity_close); + } + + @OnClick({R.id.tv_send, R.id.ll_left}) + public void onClick(View view){ + switch (view.getId()){ + case R.id.tv_send: + addComment(articleId,userid,bean.getRecid(),et_comment.getText().toString().trim()); + break; + case R.id.ll_left: + finish(); + break; + } + } + + private void addComment(String id, String userid,String firstId, String trim) { + String addUrl = Constant.COMMON_URL + Interface.ARTICLE_ADD_COMMENT; + com.alibaba.fastjson.JSONObject obj = new com.alibaba.fastjson.JSONObject(); + obj.put("articleid", id); + obj.put("userid", userid); + obj.put("firstid", firstId); + obj.put("comment", trim); + obj.put("version", Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, true, addUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(com.alibaba.fastjson.JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + if ("1".equals(rsCode)) { + String result = jsonObject.getString("data"); + CommentModel data = JSON.parseObject(result, CommentModel.class); + mAddList.add(0, data); + adapter.updateListView(mAddList); + udpateDetailUi(); + updateRecylerView(); + } + } + }, null); + } + + /** + * 提交信息之后清空输入内容和状态 + */ + private void udpateDetailUi() { + et_comment.setText(""); + et_comment.clearFocus(); + hideSoftInput(getCurrentFocus().getWindowToken()); + } + + private void updateRecylerView() { + if(mAddList.isEmpty()){ + rlay_nodata.setVisibility(View.VISIBLE); + }else{ + rlay_nodata.setVisibility(View.GONE); + if(!mList.isEmpty()){ + adapter.updateListView(mAddList); + refresh_view.refreshFinish(PullToRefreshLayout.SUCCEED); + }else{ + refresh_view.loadmoreFinish(PullToRefreshLayout.SUC_NODATA); + } + } + } + + @Override + public void onRefresh(PullToRefreshLayout pullToRefreshLayout) { + mAddList.clear(); + offset = "1"; + isshow = false; + loadComment(); + } + + @Override + public void onLoadMore(PullToRefreshLayout pullToRefreshLayout) { + offset = String.valueOf(Integer.parseInt(offset)+1); + isshow = false; + loadComment(); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + unbinder.unbind(); + } + + @Override + public boolean dispatchTouchEvent(MotionEvent ev) { + if (ev.getAction() == MotionEvent.ACTION_DOWN) { + // 获得当前得到焦点的View,一般情况下就是EditText(特殊情况就是轨迹求或者实体案件会移动焦点) + View v = getCurrentFocus(); + if (isShouldHideInput(v, ev)) { + hideSoftInput(v.getWindowToken()); + } + } + return super.dispatchTouchEvent(ev); + } + + /** + * 根据EditText所在坐标和用户点击的坐标相对比,来判断是否隐藏键盘,因为当用户点击EditText时没必要隐藏 + * + * @param v + * @param event + * @return + */ + private boolean isShouldHideInput(View v, MotionEvent event) { + if (v != null && (v instanceof EditText)) { + int[] l = {0, 0}; + v.getLocationInWindow(l); + int left = l[0], top = l[1], bottom = top + v.getHeight(), right = left + + v.getWidth(); + if (event.getX() > left && event.getX() < right && event.getY() > top && event.getY() < bottom) { + // 点击EditText的事件,忽略它。 + return false; + } else { + return true; + } + } + // 如果焦点不是EditText则忽略,这个发生在视图刚绘制完,第一个焦点不在EditView上,和用户用轨迹球选择其他的焦点 + return false; + } + + /** + * 多种隐藏软件盘方法的其中一种 + * + * @param token + */ + public void hideSoftInput(IBinder token) { + if (token != null) { + InputMethodManager im = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); + im.hideSoftInputFromWindow(token, InputMethodManager.HIDE_NOT_ALWAYS); + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/CommonH5Activity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/CommonH5Activity.java new file mode 100644 index 0000000000000000000000000000000000000000..b6fc43d1c8a81e1212c9867ecbe0c6634d49b6cc --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/CommonH5Activity.java @@ -0,0 +1,283 @@ +package com.jiuqi.elove.activity; + +import android.content.Intent; +import android.graphics.BitmapFactory; +import android.net.Uri; +import android.os.Bundle; +import android.view.KeyEvent; +import android.view.View; +import android.webkit.WebSettings; +import android.webkit.WebView; +import android.webkit.WebViewClient; +import android.widget.ImageView; +import android.widget.RelativeLayout; +import android.widget.TextView; +import android.widget.Toast; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.updateapk.CheckApkUpdate; +import com.jiuqi.elove.util.AppPhoneUtil; +import com.jiuqi.elove.util.SpUtils; +import com.umeng.socialize.ShareAction; +import com.umeng.socialize.UMShareAPI; +import com.umeng.socialize.UMShareListener; +import com.umeng.socialize.bean.SHARE_MEDIA; +import com.umeng.socialize.media.UMImage; +import com.umeng.socialize.shareboard.SnsPlatform; +import com.umeng.socialize.utils.ShareBoardlistener; + +import butterknife.BindView; +import butterknife.OnClick; + +import static android.webkit.WebSettings.LOAD_NO_CACHE; + +public class CommonH5Activity extends ABaseActivity { + + /** + * 组件 + */ + @BindView(R.id.webView) + WebView webView; + @BindView(R.id.iv_right) + ImageView iv_right; + @BindView(R.id.rl_right) + RelativeLayout rl_right; + @BindView(R.id.tv_right) + TextView tv_right; + @BindView(R.id.rl_right_tv) + RelativeLayout rl_right_tv; + /** + * 数据 + */ + private String title; + private String userid; + private String url; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getDataFromPre(); + setContentView(R.layout.activity_common_h5,title,-1,MODE_BACK,HEIGHT_REDBG_WHITEFONT); + initView(); + loadWebView(); + } + + /** + * 根据不同的title来初始化不同的view + */ + private void initView() { + if("关于我们".equals(title)){ + tv_right.setText("检查更新"); + rl_right_tv.setVisibility(View.VISIBLE); + } + } + + @OnClick({R.id.rl_right,R.id.rl_right_tv}) + public void OnClick(View view){ + switch (view.getId()){ + case R.id.rl_right: + rightIvClick(); + break; + case R.id.rl_right_tv: + rightTvClick(); + break; + } + } + + /** + * 右侧文字点击 + */ + private void rightTvClick() { + if("关于我们".equals(title)){ + checkUpdate(); + } + } + + /** + * 右侧图标点击 + */ + private void rightIvClick() { + if("缘分测试".equals(title)){ + initUmengShare(); + } + } + + private void checkUpdate() { + String isPost = "AboutUsActivity"; + new CheckApkUpdate(this,isPost).updateApk(); + } + + /** + * 从上个页面获取数据 + */ + private void getDataFromPre() { + Intent intent = getIntent(); + title = intent.getStringExtra("title"); + userid = SpUtils.getString(Constant.USER_ID); + if("名片介绍".equals(title)){ + url = Constant.CARD_EXPLANATION; + }else if("缘分测试".equals(title)){ + url = Constant.EMOTION_TEST+userid; + }else if("广告".equals(title)){ + url = intent.getStringExtra("url"); + }else if("报名活动".equals(title)){ + url = intent.getStringExtra("url"); + }else if("通知".equals(title)){ + url = intent.getStringExtra("url"); + }else if("认证说明".equals(title)){ + url = Constant.AUTH_EXPLANATION; + }else if("关于我们".equals(title)){ + url = Constant.ABOUT_US+ AppPhoneUtil.getVersion(this); + }else if("奖励规则".equals(title)){ + url = Constant.REWARD_RULE; + }else if("启缘支付协议".equals(title)){ + url = Constant.PAY_PROTOCOL; + }else if("用户协议".equals(title)){ + url = Constant.REGISTER_PROVISIONS; + } + } + + private void loadWebView() { + WebSettings setting = webView.getSettings(); + setting.setJavaScriptEnabled(true); + setting.setUseWideViewPort(true);//将内容调整到适合webview的大小 + setting.setLoadWithOverviewMode(true);//缩放至屏幕的大小 + setting.setCacheMode(LOAD_NO_CACHE); + setting.setBuiltInZoomControls(true);//设置支持缩放 + setting.setDisplayZoomControls(false);//设置不不出现放大缩小按钮,但是不影响对是否支持缩放功能的设置 + setting.setAllowFileAccess(true);//设置可以访问文件 + webView.setHorizontalScrollBarEnabled(false); + webView.setVerticalScrollBarEnabled(false); + webView.loadUrl(url); + webView.setWebViewClient(new MyWebClient()); + } + + private class MyWebClient extends WebViewClient{ + @Override + public boolean shouldOverrideUrlLoading(WebView view, String url) { + if(url.contains("tel")){ + startCall(url); + }else if(url.contains("findLove")){ + startSysRecommendPage(); + }else if(url.contains("sign_up_success.html")){ + if(EActDetailActivity2_0_3.instance!=null){ + EActDetailActivity2_0_3.instance.refresh(); + } + finish(); + }else if(url.contains("resultpage")){ + iv_right.setImageResource(R.drawable.icon_share); + rl_right.setVisibility(View.VISIBLE); + view.loadUrl(url); + }else{ + view.loadUrl(url); + } + return true; + } + } + + private void startCall(String url) { + Uri uri = Uri.parse(url); + Intent intent = new Intent(Intent.ACTION_DIAL, uri); + startActivity(intent); + } + + private void startSysRecommendPage() { + Intent intent = new Intent(this,SysRecommendActivity.class); + intent.putExtra("title","有缘人"); + startActivity(intent); + } + + @Override + protected void onNavigationClicked() { + handleWebViewGoBack(); + } + + + public boolean onKeyDown(int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_BACK) { + handleWebViewGoBack(); + return true; + } + return super.onKeyDown(keyCode, event); + } + + private void handleWebViewGoBack() { + if (webView.canGoBack()) { + if(rl_right.getVisibility()==View.VISIBLE){ + if("缘分测试".equals(title)){ + rl_right.setVisibility(View.GONE); + if(webView.canGoBackOrForward(-2)){ + webView.goBackOrForward(-2); + }else{ + webView.goBack(); + } + } + }else{ + webView.goBack(); + } + } else { + finish(); + } + } + + private void initUmengShare() { + UMImage image = new UMImage(CommonH5Activity.this, BitmapFactory.decodeResource(getResources(), R.mipmap.app_logo)); + ShareAction action = new ShareAction(this); + action.setDisplayList(Constant.DISPLAY_LIST); + action.withTitle("我的启缘情感测评报告,快来看看吧~"); + action.withText("来自启缘App"); + action.withTargetUrl(Constant.SHARE_QGCS+userid);//点击分享内容打开的链接 + action.withMedia(image);//附带的图片,音乐,视频等多媒体对象 + action.setShareboardclickCallback(mShareBoardlistener);//设置友盟集成的分享面板的点击监听回调 + action.open();//打开集成的分享面板 + } + + /** + * 友盟分享面板PopupWindow监听器 + */ + private ShareBoardlistener mShareBoardlistener = new ShareBoardlistener() { + + @Override + public void onclick(SnsPlatform snsPlatform, SHARE_MEDIA share_media) { + UMImage image = new UMImage(CommonH5Activity.this, BitmapFactory.decodeResource(getResources(), R.mipmap.app_logo)); + ShareAction shareAction = new ShareAction(CommonH5Activity.this); + shareAction.setPlatform(share_media); + shareAction.setCallback(mUmShareListener);//设置每个平台的点击事件 + shareAction.withTitle("我的启缘情感测评报告,快来看看吧~"); + shareAction.withText("来自启缘App"); + shareAction.withTargetUrl(Constant.SHARE_QGCS+userid);//点击分享内容打开的链接 + shareAction.withMedia(image);//附带的图片,音乐,视频等多媒体对象 + shareAction.share();//发起分享,调起微信,QQ,微博客户端进行分享。 + } + }; +// title在微博中无用,text在朋友圈中无用。但是加上也不影响分享。 + + + /** + * 友盟分享后事件监听器 + */ + private UMShareListener mUmShareListener = new UMShareListener() { + + @Override + public void onResult(SHARE_MEDIA platform) { + Toast.makeText(CommonH5Activity.this,"分享成功",Toast.LENGTH_LONG).show(); + } + + @Override + public void onError(SHARE_MEDIA platform, Throwable t) { + Toast.makeText(CommonH5Activity.this,"分享失败",Toast.LENGTH_LONG).show(); + } + + @Override + public void onCancel(SHARE_MEDIA platform) { +// Toast.makeText(OtherPersonCenterActivity.this,"分享取消",Toast.LENGTH_LONG).show(); + } + }; + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + UMShareAPI.get(this).onActivityResult(requestCode, resultCode, data); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/CompanyAuthActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/CompanyAuthActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..9ab44da0e6a21436bbda273d41de9806f67868e4 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/CompanyAuthActivity.java @@ -0,0 +1,226 @@ +package com.jiuqi.elove.activity; + +import android.content.Intent; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.TextView; + +import com.alibaba.fastjson.JSONObject; +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.CommonDataUtil; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.entity.CompanyAuthModel; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; + +import butterknife.BindView; +import butterknife.OnClick; + +public class CompanyAuthActivity extends ABaseActivity { + + /** + * 组件 + */ + @BindView(R.id.tv_name) + TextView tv_name; + @BindView(R.id.tv_sex) + TextView tv_sex; + @BindView(R.id.et_mobile) + EditText et_mobile; + @BindView(R.id.tv_company) + TextView tv_company; + @BindView(R.id.tv_reason) + TextView tv_reason; + @BindView(R.id.tv_auth) + TextView tv_auth; + @BindView(R.id.iv_mobile_edit) + ImageView iv_mobile_edit; + + /** + * 数据 + */ + private String userid; + private String name; + private String sex; + private String mobile; + private String company; + private String status; + private String companyId; + private String departmentId; + private String reason; + private CompanyAuthModel model; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_company_auth,"单位认证"); + getDataFromSp(); + initData2View(); + } + + /** + * 获取数据 + */ + private void getDataFromSp() { + userid = SpUtils.getString(Constant.USER_ID); + } + + /** + * 将数据放入ui + */ + private void initData2View() { + String reqCompanyAuthUrl = Constant.COMMON_URL + Interface.COMPANY_AUTH_QUERY; + JSONObject obj = new JSONObject(); + obj.put("userid",userid); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, true, reqCompanyAuthUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String msg = jsonObject.getString("explanation"); + if(Constant.SUCCESS_CODE.equals(rsCode)){ + String result = jsonObject.getString("message"); + model = JSONObject.parseObject(result,CompanyAuthModel.class); + setData2View(); + }else{ + showToast(msg); + } + } + },null); + } + + /** + * + */ + private void setData2View() { + status = model.getStatus(); + name = model.getName(); + sex = model.getSex(); + mobile = model.getPhone(); + company = model.getDepartname(); + companyId = model.getEnterprise(); + departmentId = model.getDepartment(); + reason = model.getReason(); + if(Constant.COMPANY_PASS.equals(status)){ + et_mobile.setEnabled(false); + iv_mobile_edit.setVisibility(View.GONE); + tv_auth.setText("已通过"); + }else if(Constant.COMPANY_WAITING.equals(status)){ + et_mobile.setEnabled(false); + iv_mobile_edit.setVisibility(View.GONE); + tv_auth.setText("审核中"); + }else{ + et_mobile.setEnabled(true); + iv_mobile_edit.setVisibility(View.VISIBLE); + tv_auth.setText("提交"); + } + if(Constant.COMPANY_NOTPASS.equals(status)){ + tv_reason.setText("未通过原因:"+reason); + } + tv_name.setText(name); + if(!TextUtils.isEmpty(sex)){ + tv_sex.setText(CommonDataUtil.sexMap.get(sex)); + } + et_mobile.setText(mobile); + et_mobile.setSelection(mobile.length()); + tv_company.setText(company); + } + + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + String companyName = intent.getStringExtra("name"); + companyId = intent.getStringExtra("companyId"); + departmentId = intent.getStringExtra("departmentId"); + tv_company.setText(companyName); + } + + @OnClick({R.id.tv_auth,R.id.rl_company,R.id.iv_mobile_edit}) + public void OnClick(View view){ + switch (view.getId()){ + case R.id.tv_auth: + submit(); + break; + case R.id.rl_company: + startCompany(); + break; + case R.id.iv_mobile_edit: + enableEditMobile(); + break; + } + } + + private void enableEditMobile() { + et_mobile.setEnabled(true); + } + + /** + * 跳转企业页面 + */ + private void startCompany() { + if(Constant.COMPANY_NOPUT.equals(status)||Constant.COMPANY_NOTPASS.equals(status)){ + Intent intent = new Intent(this,SelectCompanyActivity.class); + startActivity(intent); + } + } + + /** + * 提交单位认证 + */ + private void submit() { + if(Constant.COMPANY_NOPUT.equals(status)||Constant.COMPANY_NOTPASS.equals(status)){//只有这样才可以提交,防止由于网络请求未返回 + if(TextUtils.isEmpty(name)){ + showToast("请先去进行实名认证哦~"); + return; + } + if(TextUtils.isEmpty(sex)){ + showToast("性别丢失了哦~"); + return; + } + if(TextUtils.isEmpty(mobile)){ + showToast("请输入手机号"); + return; + } + if(!JqStrUtil.isMobileNo(mobile)){ + showToast("请输入合法的手机号"); + return; + } + if(TextUtils.isEmpty(companyId)){ + showToast("请选择单位"); + return; + } + String subCompanyAuthUrl = Constant.COMMON_URL + Interface.COMPANY_AUTH_SUBMIT; + JSONObject obj = new JSONObject(); + obj.put("userid",userid); + obj.put("phone",mobile); + obj.put("enterprise",companyId); + obj.put("department",departmentId); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, true, subCompanyAuthUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String msg = jsonObject.getString("explanation"); + if(Constant.SUCCESS_CODE.equals(rsCode)){ + SpUtils.setString(Constant.E_KIND,Constant.COMPANY_WAITING); + finish(); + } + showToast(msg); + } + },null); + } + } + + @Override + protected void onDestroy() { + super.onDestroy(); + okHttpUtil.cancelTag(this); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/ContactListActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/ContactListActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..e1bba169151a49675cd6bb48ff225d3511ee6790 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/ContactListActivity.java @@ -0,0 +1,262 @@ +package com.jiuqi.elove.activity; + +import android.content.DialogInterface; +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ImageView; +import android.widget.ListView; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.hyphenate.chat.EMClient; +import com.hyphenate.easeui.EaseConstant; +import com.hyphenate.exceptions.HyphenateException; +import com.jiuqi.elove.R; +import com.jiuqi.elove.adapter.ContactAdapter; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.common.JqBaseActivity; +import com.jiuqi.elove.entity.ContactPersonModel; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; +import com.jiuqi.elove.widget.dialog.CustomDialog; +import com.jiuqi.elove.widget.pulltorefresh.PullToRefreshLayout; + +import java.util.List; + +public class ContactListActivity extends JqBaseActivity implements View.OnClickListener,PullToRefreshLayout.OnRefreshListener{ + + /** + * 组件 + */ + private TextView tvTitle; + private ImageView imgBack; + private PullToRefreshLayout contactRefreshView; + private boolean isshow = true; + private ListView lv_contact; + private RelativeLayout rlay_nodata; + + /** + * 数据 + */ + private List contactList; + private String contact_type; + private String userId; + + /** + * 联系人适配器 + */ + private ContactAdapter adapter; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_contact_list); + getDataFromPrePage();//从上一个页面获取数据 + initView();//初始化组件 + getContactList(); + setEvents();//注册事件 + } + + private void getDataFromPrePage() { + contact_type = getIntent().getStringExtra("type"); + userId = SpUtils.getString(Constant.USER_ID); + } + + private void initView() { + tvTitle = easyFind(R.id.tvTitle); + imgBack = easyFind(R.id.img_leftBtn); + imgBack.setVisibility(View.VISIBLE); + contactRefreshView = easyFind(R.id.contactRefreshView); + lv_contact = easyFind(R.id.lv_contact); + rlay_nodata = easyFind(R.id.rlay_nodata); + } + + private void getContactList() { + String contactUrl = Constant.COMMON_URL + Interface.GET_CONTACT_PERSON; + JSONObject obj = new JSONObject(); + obj.put("userID",userId); + obj.put("version",Constant.VERSION); + obj.put("type",contact_type); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this,isshow,contactUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + if("1".equals(rsCode)){ + rlay_nodata.setVisibility(View.GONE); + contactRefreshView.setVisibility(View.VISIBLE); + /** + *获取三个列表人的数据结合并转换为JSONObject格式 + */ + String contactString = jsonObject.getString("message"); + contactList = JSON.parseArray(contactString,ContactPersonModel.class); + if(contactList!=null&&!contactList.isEmpty()){ + adapter = new ContactAdapter(ContactListActivity.this,contactList); + lv_contact.setAdapter(adapter); + setTitle(true); + }else{ + rlay_nodata.setVisibility(View.VISIBLE); + contactRefreshView.setVisibility(View.GONE); + setTitle(false); + } + contactRefreshView.refreshFinish(PullToRefreshLayout.SUCCEED); + }else if("122".equals(rsCode)){ + rlay_nodata.setVisibility(View.VISIBLE); + contactRefreshView.setVisibility(View.GONE); + setTitle(false); + contactRefreshView.refreshFinish(PullToRefreshLayout.SUCCEED); + } + } + },null); + } + + + @Override + public void onClick(View view) { + switch (view.getId()){ + case R.id.img_leftBtn: + finish(); + break; + default: + break; + } + } + + /** + * 根据返回列表设置title + * @param flag + */ + private void setTitle(boolean flag){ + if(flag){ + if("1".equals(contact_type)){ + tvTitle.setText("我的好友("+contactList.size()+")"); + }else if("2".equals(contact_type)){ + tvTitle.setText("我的粉丝("+contactList.size()+")"); + } else if("3".equals(contact_type)){ + tvTitle.setText("我的关注("+contactList.size()+")"); + }else if("4".equals(contact_type)){ + tvTitle.setText("我的黑名单("+contactList.size()+")"); + } + }else{ + if("1".equals(contact_type)){ + tvTitle.setText("我的好友(0)"); + }else if("2".equals(contact_type)){ + tvTitle.setText("我的粉丝(0)"); + } else if("3".equals(contact_type)){ + tvTitle.setText("我的关注(0)"); + }else if("4".equals(contact_type)){ + tvTitle.setText("我的黑名单(0)"); + } + } + } + + private void setEvents() { + imgBack.setOnClickListener(this); + contactRefreshView.setOnRefreshListener(this); + lv_contact.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView adapterView, View view, int position, long l) { + ContactPersonModel model = contactList.get(position); + String userid = model.getUserID().toLowerCase(); + String nikeName = model.getNickname(); + String avatar = model.getAvatar(); + if("4".equals(contact_type)){ + showUnShieldingDialog(userid,model); + }else{ + Intent intent = new Intent(ContactListActivity.this, ChatActivity.class); + intent.putExtra("chatType", EaseConstant.CHATTYPE_SINGLE);//2.0.2版本加群聊之后做区分 + intent.putExtra("userId",userid); + intent.putExtra("nikeName",nikeName); + intent.putExtra("avatar",avatar); + startActivity(intent); + } + } + }); + } + + /** + * 选择是否取消屏蔽他人 + */ + private void showUnShieldingDialog(final String userid,final ContactPersonModel model) { + //对话框 + CustomDialog.Builder builder = new CustomDialog.Builder(this); + builder.setTitle("取消屏蔽用户"); + builder.setMessage("确定要取消屏蔽此用户吗?"); + builder.setPositiveButton(R.string.confirm,new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + unShieldingMethod(userid,model); + } + }); + builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }); + builder.create().show(); + } + + /** + * 取消屏蔽他人 + */ + private void unShieldingMethod(final String userid,final ContactPersonModel model) { + String focusUrl = Constant.COMMON_URL + Interface.ADD_FOCUS; + JSONObject obj = new JSONObject(); + obj.put("otherID",userid); + obj.put("userID",userId); + obj.put("action",Constant.ACTION_UNSHIELD);//4 此时操作则为取消屏蔽他人 + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + Log.d("ok", "add: param"+param); + okHttpUtil.sendJsonStrByPostAsync(this,true,focusUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if("1".equals(rsCode)) { + try { + EMClient.getInstance().contactManager().removeUserFromBlackList(userid.toLowerCase()); + contactList.remove(model); + adapter.notifyDataSetChanged(); + } catch (HyphenateException e) { + e.printStackTrace(); + } + }else{ + JqStrUtil.showToast(ContactListActivity.this, explanation); + } + } + },null); + } + + @Override + public void onRefresh(PullToRefreshLayout pullToRefreshLayout) { + // 下拉刷新操作 + isshow = false; + getContactList(); + } + + @Override + public void onLoadMore(PullToRefreshLayout pullToRefreshLayout) { + + } + + @Override + protected void onResume() { + super.onResume(); + } + + @Override + public void onDestroy() { + super.onDestroy(); + okHttpUtil.cancelTag(this); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/CouponListActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/CouponListActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..9d1b9f683987756a60703b98a0cf2b56150abecd --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/CouponListActivity.java @@ -0,0 +1,127 @@ +package com.jiuqi.elove.activity; + +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ImageView; +import android.widget.ListView; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.jiuqi.elove.R; +import com.jiuqi.elove.adapter.ExchangeCardAdapter; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.common.JqBaseActivity; +import com.jiuqi.elove.entity.ExchangeCardModel; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; + +import java.util.List; + +public class CouponListActivity extends JqBaseActivity implements View.OnClickListener{ + + /** + * 控件 + */ + private TextView tvTitle; + private ImageView imgBack; + private ListView lv_card; + private RelativeLayout rlay_nodata; + + /** + * 数据 + */ + private String actid; + private String userid; + private List mCardList; + /** + * 工具 + */ + private boolean isshow = true; + private ExchangeCardAdapter cardAdapter; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_coupon_list); + getDataFromPrePageAndSp(); + initView(); + getCouponList2View(); + setEvents(); + } + + private void getDataFromPrePageAndSp() { + actid = getIntent().getStringExtra("actid"); + userid = SpUtils.getString(Constant.USER_ID); + } + + /** + * 获取优惠券 + */ + private void getCouponList2View() { + String couponListUrl = Constant.COMMON_URL + Interface.THIS_ACTTICKET_LIST; + JSONObject obj = new JSONObject(); + obj.put("actid",actid); + obj.put("userid",userid); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, isshow, couponListUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + if("1".equals(rsCode)){ + String result = jsonObject.getString("message"); + mCardList = JSONArray.parseArray(result,ExchangeCardModel.class); + if(mCardList.isEmpty()){ + rlay_nodata.setVisibility(View.VISIBLE); + }else{ + cardAdapter = new ExchangeCardAdapter(CouponListActivity.this); + lv_card.setAdapter(cardAdapter); + cardAdapter.updateListView(mCardList); + } + } + } + },null); + } + + private void initView() { + tvTitle = easyFind(R.id.tvTitle); + tvTitle.setText("优惠券"); + imgBack = easyFind(R.id.img_leftBtn); + imgBack.setVisibility(View.VISIBLE); + lv_card = easyFind(R.id.lv_card); + rlay_nodata = easyFind(R.id.rlay_nodata); + } + + private void setEvents() { + imgBack.setOnClickListener(this); + lv_card.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView adapterView, View view, int position, long l) { + ExchangeCardModel model = mCardList.get(position); + Intent intent = new Intent(); + intent.putExtra("ticketid",model.getTicket()); + intent.putExtra("money",model.getMoney()); + intent.putExtra("action",model.getAction()); + setResult(RESULT_OK,intent); + finish(); + } + }); + } + + @Override + public void onClick(View view) { + switch (view.getId()){ + case R.id.img_leftBtn: + finish(); + break; + default: + break; + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/CutPictureAty.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/CutPictureAty.java new file mode 100644 index 0000000000000000000000000000000000000000..4bf7663ddb60ee78a90a5e28d53906c437405f66 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/CutPictureAty.java @@ -0,0 +1,378 @@ +package com.jiuqi.elove.activity; + +import android.app.Activity; +import android.content.Intent; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Matrix; +import android.graphics.PointF; +import android.media.ExifInterface; +import android.os.Bundle; +import android.os.Environment; +import android.util.DisplayMetrics; +import android.view.MotionEvent; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.View.OnTouchListener; +import android.view.ViewGroup.LayoutParams; +import android.view.ViewTreeObserver; +import android.view.ViewTreeObserver.OnGlobalLayoutListener; +import android.view.Window; +import android.widget.ImageView; +import android.widget.ImageView.ScaleType; +import android.widget.TextView; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.util.StatusBarUtil; +import com.jiuqi.elove.widget.CutView; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + +/** + * 图片裁剪 + */ +public class CutPictureAty extends ABaseActivity implements OnTouchListener, + OnClickListener { + + /** 动作标志:无 */ + private static final int NONE = 0; + /** 动作标志:拖动 */ + private static final int DRAG = 1; + /** 动作标志:缩放 */ + private static final int ZOOM = 2; + public int screenWidth = 0; + public int screenHeight = 0; + public String filename; + private ImageView img; + /** 保存按钮 */ + private TextView save; + /** 取消 */ + private TextView cancle; + private CutView clipview; + private Matrix matrix = new Matrix(); + private Matrix savedMatrix = new Matrix(); + /** 初始化动作标志 */ + private int mode = NONE; + /** 记录起始坐标 */ + private PointF start = new PointF(); + /** 记录缩放时两指中间点坐标 */ + private PointF mid = new PointF(); + private float oldDist = 1f; + private Bitmap bitmap; + private String mPath; + private Double ratio; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.cut_image, R.string.imageresizer); + getWindowWH(); + mPath = getIntent().getStringExtra("path"); + ratio = getIntent().getDoubleExtra("ratio",1);//传递剪裁比例 + bitmap = createBitmap(mPath, screenWidth, screenHeight); + + int degreee = readBitmapDegree(mPath); + if (bitmap != null) { + if (degreee == 0) { + // mClipImageLayout.setImageBitmap(bitmap); + } else { + bitmap = rotateBitmap(degreee, bitmap); + } + } else { + finish(); + } + + img = (ImageView) this.findViewById(R.id.img); + img.setOnTouchListener(this); + + ViewTreeObserver observer = img.getViewTreeObserver(); + observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { + + @SuppressWarnings("deprecation") + public void onGlobalLayout() { + img.getViewTreeObserver().removeGlobalOnLayoutListener(this); + initClipView(img.getTop(), bitmap); + } + }); + save = (TextView) findViewById(R.id.save); + cancle = (TextView) findViewById(R.id.cancle); + cancle.setOnClickListener(this); + save.setOnClickListener(this); + } + + /** + * 获取屏幕的高和宽 + */ + private void getWindowWH() { + DisplayMetrics dm = new DisplayMetrics(); + getWindowManager().getDefaultDisplay().getMetrics(dm); + screenWidth = dm.widthPixels; + screenHeight = dm.heightPixels; + } + + public Bitmap createBitmap(String path, int w, int h) { + try { + BitmapFactory.Options opts = new BitmapFactory.Options(); + opts.inJustDecodeBounds = true; + // 这里是整个方法的关键,inJustDecodeBounds设为true时将不为图片分配内存。 + BitmapFactory.decodeFile(path, opts); + int srcWidth = opts.outWidth;// 获取图片的原始宽度 + int srcHeight = opts.outHeight;// 获取图片原始高度 + int destWidth = 0; + int destHeight = 0; + // 缩放的比例 + double ratio = 0.0; + if (srcWidth < w || srcHeight < h) { + ratio = 0.0; + destWidth = srcWidth; + destHeight = srcHeight; + } else if (srcWidth > srcHeight) {// 按比例计算缩放后的图片大小,maxLength是长或宽允许的最大长度 + ratio = (double) srcWidth / w; + destWidth = w; + destHeight = (int) (srcHeight / ratio); + } else { + ratio = (double) srcHeight / h; + destHeight = h; + destWidth = (int) (srcWidth / ratio); + } + BitmapFactory.Options newOpts = new BitmapFactory.Options(); + // 缩放的比例,缩放是很难按准备的比例进行缩放的,目前我只发现只能通过inSampleSize来进行缩放,其值表明缩放的倍数,SDK中建议其值是2的指数值 + newOpts.inSampleSize = (int) ratio + 1; + // inJustDecodeBounds设为false表示把图片读进内存中 + newOpts.inJustDecodeBounds = false; + // 设置大小,这个一般是不准确的,是以inSampleSize的为准,但是如果不设置却不能缩放 + newOpts.outHeight = destHeight; + newOpts.outWidth = destWidth; + // 获取缩放后图片 + return BitmapFactory.decodeFile(path, newOpts); + } catch (Exception e) { + // TODO: handle exception + return null; + } + } + + /** + * 初始化截图区域,并将源图按裁剪框比例缩放 + * + * @param top + * @param bitmap + */ + private void initClipView(int top, final Bitmap bitmap) { + clipview = new CutView(this); + clipview.setClipRatio(ratio); +// int width = getClipWithHeight(); +// int height = getClipWithHeight(); +// clipview.setClipHeight(height); +// clipview.setClipWidth(width); + clipview.setCustomTopBarHeight(top); + clipview.addOnDrawCompleteListener(new CutView.OnDrawListenerComplete() { + + public void onDrawCompelete() { + clipview.removeOnDrawCompleteListener(); + int clipHeight = clipview.getClipHeight(); + int clipWidth = clipview.getClipWidth(); + int midX = clipview.getClipLeftMargin() + (clipWidth / 2); + int midY = clipview.getClipTopMargin() + (clipHeight / 2); + + int imageWidth = bitmap.getWidth(); + int imageHeight = bitmap.getHeight(); + + // 按裁剪框求缩放比例 + float scale = (clipWidth * 1.0f) / imageWidth; + if (imageWidth > imageHeight) { + scale = (clipHeight * 1.0f) / imageHeight; + } + // 起始中心点 + float imageMidX = imageWidth * scale / 2; + float imageMidY = clipview.getCustomTopBarHeight() + + imageHeight * scale / 2; + img.setScaleType(ScaleType.MATRIX); + + // 缩放 + matrix.postScale(scale, scale); + // 平移 + matrix.postTranslate(midX-imageMidX, midY - imageMidY); + + img.setImageMatrix(matrix); + img.setImageBitmap(bitmap); + } + }); + + this.addContentView(clipview, new LayoutParams( + LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); + } + + public boolean onTouch(View v, MotionEvent event) { + ImageView view = (ImageView) v; + switch (event.getAction() & MotionEvent.ACTION_MASK) { + case MotionEvent.ACTION_DOWN: + savedMatrix.set(matrix); + // 设置开始点位置 + start.set(event.getX(), event.getY()); + mode = DRAG; + break; + case MotionEvent.ACTION_POINTER_DOWN: + oldDist = spacing(event); + if (oldDist > 10f) { + savedMatrix.set(matrix); + midPoint(mid, event); + mode = ZOOM; + } + break; + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_POINTER_UP: + mode = NONE; + break; + case MotionEvent.ACTION_MOVE: + if (mode == DRAG) { + matrix.set(savedMatrix); + matrix.postTranslate(event.getX() - start.x, event.getY() + - start.y); + } else if (mode == ZOOM) { + float newDist = spacing(event); + if (newDist > 10f) { + matrix.set(savedMatrix); + float scale = newDist / oldDist; + matrix.postScale(scale, scale, mid.x, mid.y); + } + } + break; + } + view.setImageMatrix(matrix); + return true; + } + + /** + * 多点触控时,计算最先放下的两指距离 + * + * @param event + * @return + */ + private float spacing(MotionEvent event) { + float x = event.getX(0) - event.getX(1); + float y = event.getY(0) - event.getY(1); + return (float) Math.sqrt(x * x + y * y); + } + + /** + * 多点触控时,计算最先放下的两指中心坐标 + * + * @param point + * @param event + */ + private void midPoint(PointF point, MotionEvent event) { + float x = event.getX(0) + event.getX(1); + float y = event.getY(0) + event.getY(1); + point.set(x / 2, y / 2); + } + + public void onClick(View v) { + + switch (v.getId()) { + case R.id.save: + getBitmap(); + Intent intent = new Intent(); + intent.putExtra("path", filename); + setResult(Activity.RESULT_OK, intent); + finish(); + break; + case R.id.cancle: + finish(); + break; + } + + } + + // 旋转图片 + private Bitmap rotateBitmap(int angle, Bitmap bitmap) { + // 旋转图片 动作 + Matrix matrix = new Matrix(); + matrix.postRotate(angle); + // 创建新的图片 + Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, + bitmap.getWidth(), bitmap.getHeight(), matrix, false); + return resizedBitmap; + } + + // 读取图像的旋转度 + private int readBitmapDegree(String path) { + int degree = 0; + try { + ExifInterface exifInterface = new ExifInterface(path); + int orientation = exifInterface.getAttributeInt( + ExifInterface.TAG_ORIENTATION, + ExifInterface.ORIENTATION_NORMAL); + switch (orientation) { + case ExifInterface.ORIENTATION_ROTATE_90: + degree = 90; + break; + case ExifInterface.ORIENTATION_ROTATE_180: + degree = 180; + break; + case ExifInterface.ORIENTATION_ROTATE_270: + degree = 270; + break; + } + } catch (IOException e) { + e.printStackTrace(); + } + return degree; + } + + /** + * 获取裁剪框内截图 + * + * @return + */ + private Bitmap getBitmap() { + + // 获取截屏 + View view = this.getWindow().getDecorView(); + view.setDrawingCacheEnabled(true); + view.buildDrawingCache(); + + int contentTop = getWindow().findViewById(Window.ID_ANDROID_CONTENT) + .getTop()+ StatusBarUtil.intStatusView(); + Bitmap finalBitmap = Bitmap.createBitmap(view.getDrawingCache(), + clipview.getClipLeftMargin(), clipview.getClipTopMargin() + + contentTop, clipview.getClipWidth(), + clipview.getClipHeight()); + + savaBitmap(finalBitmap); + // 释放资源 + view.destroyDrawingCache(); + + return finalBitmap; + } + + /** + * 保存bitmap对象到本地 + * + * @param bitmap + */ + public void savaBitmap(Bitmap bitmap) { + filename = getExternalCacheDir()+"avatar.png"; + File f = new File(filename); + FileOutputStream fOut = null; + try { + f.createNewFile(); + fOut = new FileOutputStream(f); + } catch (Exception e) { + e.printStackTrace(); + } + bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fOut);// 把Bitmap对象解析成流 + try { + fOut.flush(); + fOut.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private int getClipWithHeight(){ + DisplayMetrics dm = getResources().getDisplayMetrics(); + return dm.widthPixels-2*160; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/EActDetailActivity2_0_3.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/EActDetailActivity2_0_3.java new file mode 100644 index 0000000000000000000000000000000000000000..b0dc6d9f1ae7bc81424b3676fc3c4351a3f0487c --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/EActDetailActivity2_0_3.java @@ -0,0 +1,1372 @@ +package com.jiuqi.elove.activity; + +import android.Manifest; +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.pm.PackageManager; +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.net.Uri; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.v4.app.ActivityCompat; +import android.support.v4.content.ContextCompat; +import android.support.v4.graphics.drawable.RoundedBitmapDrawable; +import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.util.DisplayMetrics; +import android.util.Log; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; +import android.webkit.WebSettings; +import android.webkit.WebView; +import android.widget.AdapterView; +import android.widget.Button; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ListView; +import android.widget.PopupWindow; +import android.widget.RelativeLayout; +import android.widget.TextView; +import android.widget.Toast; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baidu.location.BDLocation; +import com.baidu.location.BDLocationListener; +import com.baidu.location.LocationClient; +import com.baidu.location.LocationClientOption; +import com.baoyz.actionsheet.ActionSheet; +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.target.BitmapImageViewTarget; +import com.jiuqi.elove.R; +import com.jiuqi.elove.adapter.CoOrganizerAdapter; +import com.jiuqi.elove.adapter.DiscussAdapter; +import com.jiuqi.elove.adapter.PriceAdapter; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.common.JqBaseActivity; +import com.jiuqi.elove.entity.DiscussEntity; +import com.jiuqi.elove.entity.EActDetailModel2_0_3; +import com.jiuqi.elove.entity.LikeUserEntity; +import com.jiuqi.elove.entity.PriceInfoModel; +import com.jiuqi.elove.util.CommonUtil; +import com.jiuqi.elove.util.EasyGlide; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; +import com.jiuqi.elove.widget.dialog.CustomDialog; +import com.jiuqi.elove.widget.ListViewForScrollView; +import com.jiuqi.elove.widget.dialog.PopoverDialog; +import com.umeng.socialize.ShareAction; +import com.umeng.socialize.UMShareAPI; +import com.umeng.socialize.UMShareListener; +import com.umeng.socialize.bean.SHARE_MEDIA; +import com.umeng.socialize.media.UMImage; +import com.umeng.socialize.shareboard.SnsPlatform; +import com.umeng.socialize.utils.ShareBoardlistener; + +import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.List; + +/** + * + * Created by FanWenXia on 2016/7/19. + */ +public class EActDetailActivity2_0_3 extends JqBaseActivity implements View.OnClickListener, ActionSheet.ActionSheetListener { + + private static final String TAG = "EActDetailActivity2_0_3"; + /*顶部菜单栏按钮*/ + private TextView tvTitle; + private ImageView tvBack; + private ImageView tvMore; + private Bitmap imgbitmap; + private String startTime; + + private WebView wv_actdetail; + public static EActDetailActivity2_0_3 instance; + /** + * 活动内容部分 + */ + private ImageView iv_poster; + private String actTitle; + private String money; + private double longitude;//活动地点经度 + private double latitude;//活动地点纬度 + private String addressname; + private String signstatus;//用户报名状态 -1:未报名 1:正在审核 2:审核通过 3:审核未通过4:待付款 + private String enterpriseName;//企业名称 + private String holderId; + private String enterpriseDetail;//企业介绍 + private String act_details; + private Double viprate;//折扣率 + private String ticketId;//票id + private String isVipSelected = "0";//默认不勾选折扣 + + private TextView tv_title; + private TextView tv_pTimeStr; + private TextView tv_looknum; + private TextView tv_sharenum; + // private TextView txt_detail; + private TextView tv_time; + private RelativeLayout raly_adds; + private TextView tv_adds; + private TextView tv_signnum; + private TextView tv_money; + private RelativeLayout raly_holder; + private TextView tv_holder; + // private TextView txt_nameStr; +// private TextView txt_phoneStr; + private TextView tv_signNum; + private TextView tv_noSign; + private RelativeLayout rlay_signUser; + private LinearLayout ll_signBtn; + private TextView tv_signStatus; + private RelativeLayout rl_money; + private LinearLayout ll_webview;//webview显示html页面的布局 + private LinearLayout ll_signUser;//显示报名用户头像的布局 + private Button btn_next; + private ImageView iv_vip; + private ImageView iv_moneyorfree; + private StringBuilder sb; + private TextView tv_contactperson; + private TextView tv_contactphone; + private LinearLayout ll_coorganizer; + private RecyclerView lv_coorganizer; + + private List mPriceList; + private List mCoList; + private LocationClient mLocationClient; + /** + * 数据 + */ + private String actid; + private String userid; + private String ordernum; + private String actStatus; + private String linkname; + private String linkphone; + private Double lat; + private Double log; + private String url; + /** + * 评论点赞部分 + */ + private TextView txt_dcusNum; + private TextView tv_dcusBtn; + private TextView tv_noDcus; + private TextView tv_viprate;//折扣 + private TextView tv_pay_protocol; + private ListViewForScrollView lv_dcus; + private TextView tv_dcusBtnStr; + private LinearLayout ll_dcusBtn; + private RelativeLayout rl_isVip; + + + /** + *设置页码和每一页条数 + */ + private String pageNo = "1"; + private String pageSize = "60"; + private List reporterList; + private List dcusList; + private PopupWindow mPopWindow; + private LinearLayout llcancel_btn; + private LinearLayout ll_blank; + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + initBaiduMapNav(); + setContentView(R.layout.activity_eact_detail2_0_3); + Intent intent = getIntent(); + actid = intent.getStringExtra("actid"); + Log.d(TAG, "onCreate: actid" + actid); + instance = this; + initView(); + initEvent(); + getDiscussDataAndView(); + getReportListAndView(); + reqDetail(); + } + + private void initBaiduMapNav(){ + mLocationClient = new LocationClient(getApplicationContext()); + LocationClientOption option = new LocationClientOption(); + option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备 + option.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系 + option.setScanSpan(1003);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的 + option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要 + option.setOpenGps(true);//可选,默认false,设置是否使用gps + option.setLocationNotify(true);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果 + option.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近” + option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到 + option.setIgnoreKillProcess(false);//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死 + option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集 + option.setEnableSimulateGps(false);//可选,默认false,设置是否需要过滤gps仿真结果,默认需要 + mLocationClient.setLocOption(option); + mLocationClient.registerLocationListener(new BDLocationListener() { + @Override + public void onReceiveLocation(BDLocation bdLocation) { + int stateCode = bdLocation.getLocType(); + if(stateCode==161){ + lat = bdLocation.getLatitude(); + log = bdLocation.getLongitude(); + } + } + }); + List permissionList = new ArrayList<>(); + if(ContextCompat.checkSelfPermission(EActDetailActivity2_0_3.this,Manifest.permission.ACCESS_FINE_LOCATION)!=PackageManager.PERMISSION_GRANTED){ + permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION); + } + if(ContextCompat.checkSelfPermission(EActDetailActivity2_0_3.this,Manifest.permission.WRITE_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED){ + permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); + } + if(!permissionList.isEmpty()){ + String[] permissions = permissionList.toArray(new String[permissionList.size()]); + ActivityCompat.requestPermissions(EActDetailActivity2_0_3.this,permissions,1); + }else{ + requestLocation(); + } + } + + private void requestLocation() { + mLocationClient.start(); + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + switch (requestCode){ + case 1: + if(grantResults.length>0){ + for (int result : grantResults){ + if(result!=PackageManager.PERMISSION_GRANTED){ + return; + } + } + requestLocation(); + }else{ + return; + } + break; + default: + break; + } + } + + private void initView() { + tvBack = easyFind(R.id.img_leftBtn); + tvMore = easyFind(R.id.img_rightBtn); + tvTitle = easyFind(R.id.tvTitle); + tvTitle.setText("活动详情"); + tvMore.setImageResource(R.drawable.icon_more_white); + tvBack.setVisibility(View.VISIBLE); + tvMore.setVisibility(View.VISIBLE); + wv_actdetail = easyFind(R.id.wv_actdetail); + /** + * 活动内容部分 + */ + iv_poster = easyFind(R.id.iv_poster); + iv_moneyorfree = easyFind(R.id.iv_moneyorfree); + tv_title = easyFind(R.id.tv_title); + tv_pTimeStr = easyFind(R.id.tv_pTimeStr); + tv_looknum = easyFind(R.id.tv_looknum); + tv_sharenum = easyFind(R.id.tv_sharenum); +// txt_detail = (TextView) findViewById(R.id.txt_detail); + tv_time = easyFind(R.id.tv_time); + raly_adds = easyFind(R.id.raly_adds); + tv_adds = easyFind(R.id.tv_adds); + tv_signnum = easyFind(R.id.tv_signnum); + tv_money = easyFind(R.id.tv_money); + raly_holder = easyFind(R.id.raly_holder); + tv_holder = easyFind(R.id.tv_holder); +// txt_nameStr = (TextView) findViewById(R.id.txt_nameStr); +// txt_phoneStr = (TextView) findViewById(R.id.txt_phoneStr); + tv_signNum = easyFind(R.id.tv_signNum); + tv_noSign = easyFind(R.id.tv_noSign); + rlay_signUser = easyFind(R.id.rlay_signUser); + txt_dcusNum = easyFind(R.id.txt_dcusNum); +// tv_dcusBtn = (TextView) findViewById(R.id.tv_dcusBtn); + tv_noDcus = easyFind(R.id.tv_noDcus); + lv_dcus = easyFind(R.id.lv_dcus); + tv_dcusBtnStr = easyFind(R.id.tv_dcusBtnStr); + ll_dcusBtn = easyFind(R.id.ll_dcusBtn); + ll_webview = easyFind(R.id.ll_webview); + ll_signUser = easyFind(R.id.ll_signUser); + ll_signBtn = easyFind(R.id.ll_signBtn); + tv_signStatus = easyFind(R.id.tv_signStatus); + rl_money = easyFind(R.id.rl_money); + tv_contactperson = easyFind(R.id.tv_contactperson); + tv_contactphone = easyFind(R.id.tv_contactphone); + ll_coorganizer = easyFind(R.id.ll_coorganizer); + lv_coorganizer = easyFind(R.id.lv_coorganizer); + userid = SpUtils.getString(Constant.USER_ID); + lv_dcus.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + if(!JqStrUtil.isLogin()){ + startLoginPage(); + return; + } + DiscussEntity entity = dcusList.get(position); + replyDcus(entity); + } + }); + + /** + * 评论item长按事件 + */ + lv_dcus.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { + + @Override + public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { + if(!JqStrUtil.isLogin()){ + startLoginPage(); + return true; + } + PopoverDialog.Builder popbuilder = new PopoverDialog.Builder(EActDetailActivity2_0_3.this); + final DiscussEntity entity = dcusList.get(position); + if (entity.getUserid().equals(userid)) { + popbuilder.setFirstButton(getString(R.string.response), new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + replyDcus(entity); + dialog.dismiss(); + } + }); + popbuilder.setSecondButton(getString(R.string.delete), new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + deleteDcus(entity.getRecid()); + dialog.dismiss(); + } + }); + popbuilder.create().show(); + } else { + popbuilder.setFirstButton(getString(R.string.response), new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + replyDcus(entity); + dialog.dismiss(); + } + }); + popbuilder.create().show(); + } + return true; + } + }); + } + + private void reqDetail() { + String eactUrl = Constant.COMMON_URL + Interface.EACT_DETAIL2_0_3; + JSONObject obj = new JSONObject(); + obj.put("userid", userid); + obj.put("actid", actid); + obj.put("versionid", Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(EActDetailActivity2_0_3.this, true, eactUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + Log.d(TAG, "onResponse: jsonObject" + jsonObject); + if ("1".equals(rsCode)) { + EActDetailModel2_0_3 model = jsonObject.getObject("message", EActDetailModel2_0_3.class); + iv_poster.setLayoutParams(getMyLayout()); + Glide.with(getApplicationContext()).load(model.getPicture()).asBitmap().into(new BitmapImageViewTarget(iv_poster) { + @Override + protected void setResource(Bitmap resource) { + iv_poster.setImageBitmap(resource); + imgbitmap = resource; + } + }); + url = model.getSignLink(); + linkname = model.getLinkname(); + linkphone = model.getLinkphone(); + actTitle = model.getTitle(); + ordernum = model.getOrdernum(); + tv_contactperson.setText(linkname); + tv_contactphone.setText(linkphone); + tv_title.setText(actTitle); + tv_pTimeStr.setText(model.getPublish_time() + "发布"); + tv_looknum.setText(model.getScans()); + tv_sharenum.setText(model.getShares()); + signstatus = model.getSignstatus();//报名状态 + actStatus = model.getAct_status(); +// if ("0".equals(actStatus)) { +// ll_signBtn.setEnabled(true); +// ll_signBtn.setBackgroundColor(getResources().getColor(R.color.colorPrimary)); +// } else { +// ll_signBtn.setEnabled(false); +// ll_signBtn.setBackground(getResources().getDrawable(R.drawable.sign_btn_disable)); +// } + switch (signstatus) { + case Constant.ACT_SIGN_NOT://未进行报名 + case Constant.ACT_SIGN_NOTPASS://审核未通过 + tv_signStatus.setText("我要报名"); + if (Constant.ACT_SIGNING.equals(actStatus)) { + ll_signBtn.setEnabled(true); + ll_signBtn.setBackgroundColor(getResources().getColor(R.color.colorPrimary)); + } else { + tv_signStatus.setText("报名结束"); + ll_signBtn.setEnabled(false); + ll_signBtn.setBackgroundColor(getResources().getColor(R.color.gray)); + } + break; + case Constant.ACT_SIGN_CHECK: + tv_signStatus.setText("正在审核"); + ll_signBtn.setEnabled(false); + ll_signBtn.setBackgroundColor(getResources().getColor(R.color.gray)); + break; + case Constant.ACT_SIGN_PASS: + tv_signStatus.setText("审核通过"); + ll_signBtn.setEnabled(false); + ll_signBtn.setBackgroundColor(getResources().getColor(R.color.gray)); + break; + case Constant.ACT_SIGN_PAYING: + tv_signStatus.setText("待付款"); + ll_signBtn.setEnabled(true); + ll_signBtn.setBackgroundColor(getResources().getColor(R.color.colorPrimary)); + break; + default: + break; + } + longitude = model.getLongitude(); + latitude = model.getLatitude(); + addressname = model.getArea(); + startTime = model.getStart_time(); + String ft = model.getFinish_time(); + tv_time.setText(startTime + " ~ " + ft); + tv_adds.setText(addressname); + money = model.getPricerange(); + if ("免费活动".equals(money)) { + iv_moneyorfree.setVisibility(View.GONE); + } + if (!JqStrUtil.isEmpty(money)) { + tv_money.setText(money);//分别有“免费活动”和实际价格范围 + } else { + tv_money.setText("价格君开小差了--!"); + } + enterpriseName = model.getHolder();//举办方公司名称 + enterpriseDetail = model.getCompany_details();//举办方公司详细 + holderId = model.getHolderid();//用于活动的屏蔽,不看他的活动 + tv_holder.setText(enterpriseName); + String num = model.getApply_num(); + if (!"-1".equals(model.getMaxnum())) { + tv_signnum.setText("已报名" + num + "人 / 限" + model.getMaxnum() + "人"); + } else { + tv_signnum.setText("已报名" + num + "人 / 人数不限"); + } + tv_signNum.setText("已报名(" + num + ")"); + if ("0".equals(num)) { + tv_noSign.setVisibility(View.VISIBLE); + rlay_signUser.setVisibility(View.GONE); + } + act_details = model.getAct_details(); + mPriceList = model.getPricelist(); + viprate = model.getViprate(); + mCoList = model.getCo(); + if(mCoList==null||mCoList.size()<=0){ + ll_coorganizer.setVisibility(View.GONE); + }else{ + ll_coorganizer.setVisibility(View.VISIBLE); + LinearLayoutManager manager = new LinearLayoutManager(EActDetailActivity2_0_3.this); + manager.setOrientation(LinearLayoutManager.HORIZONTAL); + lv_coorganizer.setLayoutManager(manager); + CoOrganizerAdapter adapter = new CoOrganizerAdapter(EActDetailActivity2_0_3.this,mCoList); + lv_coorganizer.setAdapter(adapter); + } + showActDetailWithHtml();//显示html页面的内容 + } + } + }, null); + } + + private void initEvent() { + tvBack.setOnClickListener(this); + tvMore.setOnClickListener(this); + raly_adds.setOnClickListener(this); +// tv_dcusBtn.setOnClickListener(this); + ll_dcusBtn.setOnClickListener(this); + ll_signBtn.setOnClickListener(this); + raly_holder.setOnClickListener(this); + rl_money.setOnClickListener(this); + rlay_signUser.setOnClickListener(this); + tv_contactphone.setOnClickListener(this); + } + + @Override + public void onClick(View view) { + switch (view.getId()) { + case R.id.raly_adds://查看举办活动地址 + try { + startMapApp(); + } catch (URISyntaxException e) { + e.printStackTrace(); + } + break; + case R.id.ll_signBtn://报名活动 + if(!JqStrUtil.isLogin()){ + startLoginPage(); + return; + } + if(Constant.REALNAME_PASS.equals(SpUtils.getString(Constant.ID_CARD))){ + signUpNew(); + }else{ + JqStrUtil.showToast(this,"请先去实名认证"); + } + break; + case R.id.img_rightBtn://展示更多操作:举报、屏蔽、分享活动面板 + if(!JqStrUtil.isLogin()){ + startLoginPage(); + return; + } + showActionSheet(); + break; + case R.id.img_leftBtn://返回按钮 + finish(); + break; + case R.id.ll_dcusBtn://点击打开评论面板 + if(!JqStrUtil.isLogin()){ + startLoginPage(); + return; + } + discuss(); + break; + case R.id.raly_holder://展示公司详细信息 + getEnterpriseInfo(); + break; + case R.id.rl_money://展示付费可选列表(仅用于展示) +// if (!"免费活动".equals(money)) { +// if (mPriceList != null && mPriceList.size() > 0) { +// showAlertDialog(); +// } else { +// JqStrUtil.showToast(EActDetailActivity2_0_3.this, "价格信息获取错误,请尝试退出页面重新进入"); +// } +// } + break; + case R.id.rlay_signUser://展示报名用户列表 + if(!JqStrUtil.isLogin()){ + startLoginPage(); + return; + } + Intent reporterIntent = new Intent(EActDetailActivity2_0_3.this, LikeUsersActivity.class); + reporterIntent.putExtra("actid", actid); + reporterIntent.putExtra("flag", "SignUsers"); + startActivity(reporterIntent); + break; + case R.id.tv_contactphone: + Intent phoneIntent = new Intent(Intent.ACTION_DIAL); + phoneIntent.setData(Uri.parse("tel:" + linkphone)); + startActivity(phoneIntent); + default: + break; + } + } + + private void startLoginPage() { + Intent intent = new Intent(this,LoginActivity.class); + startActivity(intent); + } + + /** + * 报名活动 + */ + private void signUpNew() { + Intent intent = new Intent(this,CommonH5Activity.class); + intent.putExtra("title","报名活动"); + if(TextUtils.isEmpty(url)){ + url = Constant.COMMON_H5_HOST+"about/sign_up_data.html?userid="+userid+"&actid="+actid; + }else{ + url = Constant.COMMON_H5_HOST+url+"userid="+userid+"&actid="+actid; + } + intent.putExtra("url",url); + startActivity(intent); + } + + private void startMapApp() throws URISyntaxException { + if(CommonUtil.isAvilible(EActDetailActivity2_0_3.this,"com.baidu.BaiduMap")){ + Intent intent = new Intent(); + intent.setData(Uri.parse("baidumap://map/direction?origin=name:我的位置|latlng:"+lat+","+log+"&destination=name:"+addressname+"|latlng:"+latitude+","+longitude+"&mode=driving")); + startActivity(intent); //启动调用 + }else if(CommonUtil.isAvilible(EActDetailActivity2_0_3.this,"com.autonavi.minimap")){ + CommonUtil.goToNaviActivity(this,"com.jiuqi.elove",String.valueOf(lat),String.valueOf(log),String.valueOf(latitude),String.valueOf(longitude),"0","1",addressname);//1表示公交 + } else{ + openWebMap(lat,log,"当前位置",latitude,longitude,addressname,addressname); + } + } + + /** + * 打开浏览器进行百度地图导航 + */ + private void openWebMap(double slat, double slon, String sname, double dlat, double dlon, String dname, String city){ + Uri mapUri = Uri.parse(CommonUtil.getWebBaiduMapUri(String.valueOf(slat), String.valueOf(slon), sname, + String.valueOf(dlat), String.valueOf(dlon), + dname, city, Constant.APP_NAME)); + Intent loction = new Intent(Intent.ACTION_VIEW, mapUri); + startActivity(loction); + } + + + private void showAlertDialog() { + final AlertDialog dialog = new AlertDialog.Builder(EActDetailActivity2_0_3.this,R.style.PriceListDialogStyle).create(); + dialog.show(); + Window window = dialog.getWindow(); + window.setContentView(R.layout.layout_dialog_moneyview); + llcancel_btn = (LinearLayout) window.findViewById(R.id.llcancel_btn); + PriceAdapter adapter = new PriceAdapter(getApplicationContext(),mPriceList,Constant.RADIO_FLAG_INPRICELIST_NO); + ListView mlistview = (ListView) window.findViewById(R.id.list_price); + mlistview.setAdapter(adapter); + mlistview.setEnabled(false); + llcancel_btn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + dialog.dismiss(); + } + }); + } + + /** + * 获取企业详细信息 + */ + private void getEnterpriseInfo(){ +// View titleView = LayoutInflater.from(EActDetailActivity2_0_3.this).inflate(R.layout.dialog_title_eintroduce, null); + View contentView = LayoutInflater.from(EActDetailActivity2_0_3.this).inflate(R.layout.dialog_content_eintroduce, null); + TextView tv_enterprise_name = (TextView) contentView.findViewById(R.id.tv_enterprise_name); + TextView tv_enterprise_detail = (TextView) contentView.findViewById(R.id.tv_enterprise_detail); + tv_enterprise_name.setText(enterpriseName); + tv_enterprise_name.setVisibility(View.GONE);//在这里不需要,因为builder的title需要设置,所以干脆将公司名称设置到title中,将原来布局中存放title的控件隐藏 + tv_enterprise_detail.setText(enterpriseDetail); + //对话框 + CustomDialog.Builder builder = new CustomDialog.Builder(EActDetailActivity2_0_3.this); + builder.setTitle(enterpriseName); +// builder.setTitleView(titleView); + builder.setContentView(contentView); + builder.setNegativeButton("关闭", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }); + builder.create().show(); + } + /** + * 报名企业活动 + */ + public void signUp(){ + if("4".equals(signstatus)){//待支付直接进入收银台 + Intent intent = new Intent(EActDetailActivity2_0_3.this,WaitingAndSelectPayTypeActivity254.class); + intent.putExtra("ordernum",ordernum); + intent.putExtra("actid",actid); + startActivity(intent); + }else{ + showInputDialog(); +// if("免费活动".equals(money)){ +//// reqSignUp(); +// showDialog(); +// }else{ +// if(mPopWindow==null){ +// if(mPriceList!=null&&mPriceList.size()>0){ +// showPopupWindow(); +// }else{ +// JqStrUtil.showToast(EActDetailActivity2_0_3.this,"价格信息获取错误,请尝试退出页面重新进入"); +// } +// }else{ +// if(mPopWindow.isShowing()){ +// mPopWindow.dismiss(); +// }else{ +// if(mPriceList!=null&&mPriceList.size()>0){ +// showPopupWindow(); +// }else{ +// JqStrUtil.showToast(EActDetailActivity2_0_3.this,"价格信息获取错误,请尝试退出页面重新进入"); +// } +// } +// } +// } + } + } + + /** + * 输入姓名和推荐公司页面 + */ + private void showInputDialog() { + final AlertDialog dialog = new AlertDialog.Builder(this,R.style.mystyle).create(); + dialog.show(); + Window window = dialog.getWindow(); + window.clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);//解决alertdialog键盘不弹出的问题 + window.setContentView(R.layout.layout_input_name_company); + final EditText et_name = (EditText) window.findViewById(R.id.et_name); + final EditText et_company = (EditText) window.findViewById(R.id.et_company); + LinearLayout ll_cancel = (LinearLayout) window.findViewById(R.id.ll_cancel); + LinearLayout ll_sure = (LinearLayout) window.findViewById(R.id.ll_sure); + ll_cancel.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + dialog.dismiss(); + } + }); + ll_sure.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + signAct(et_name.getText().toString().trim(),et_company.getText().toString().trim());//报名活动 + dialog.dismiss(); + } + }); + } + + /** + * 报名活动 + * @param name 姓名 + * @param company 公司 + */ + private void signAct(String name, String company) { + if(JqStrUtil.isEmpty(name)){ + JqStrUtil.showToast(this,"请输入姓名"); + return; + } + if(JqStrUtil.isEmpty(company)){ + JqStrUtil.showToast(this,"请输入推荐公司"); + return; + } + String reqSignUpUrl = Constant.COMMON_URL + Interface.ACT_SIGN_NEW; + JSONObject obj = new JSONObject(); + obj.put("userid",userid); + obj.put("actid",actid); + obj.put("signtype",0);//企业活动报名跟web端报名区分 0:app端报名 1:web端报名 + obj.put("version",Constant.VERSION); + obj.put("remarknm",name); + obj.put("remarkep",company); + if(mPriceList!=null&&!mPriceList.isEmpty()){ + PriceInfoModel model = mPriceList.get(0); + ticketId = model.getTicketid(); + obj.put("ticketid",ticketId); + } + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, false, reqSignUpUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if("1".equals(rsCode)){ + String info = jsonObject.getString("information"); + JSONObject obj = JSON.parseObject(info); + String ordernum = obj.getString("ordernum"); + Intent intent = null; + if(!JqStrUtil.isEmpty(ticketId)){ + intent = new Intent(EActDetailActivity2_0_3.this,WaitingAndSelectPayTypeActivity254.class); + }else{ + intent = new Intent(EActDetailActivity2_0_3.this,OrderDetailActivity254.class); + } + intent.putExtra("actid",actid); + intent.putExtra("ordernum",ordernum); + startActivity(intent); + }else if("0".equals(rsCode)){ + JqStrUtil.showToast(EActDetailActivity2_0_3.this,explanation); + } + } + },null); + } + + private void showDialog(){ + CustomDialog.Builder builder = new CustomDialog.Builder(EActDetailActivity2_0_3.this); + builder.setTitle(""); + builder.setMessage("确定要报名此活动吗?"); + builder.setPositiveButton(R.string.confirm,new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + reqSignUp(); + dialog.dismiss(); + } + }); + builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }); + builder.create().show(); + } + + private void showPopupWindow(){ + final View contentView = LayoutInflater.from(EActDetailActivity2_0_3.this).inflate(R.layout.layout_select_price, null); + mPopWindow = new PopupWindow(contentView, ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT,true); + llcancel_btn = (LinearLayout) contentView.findViewById(R.id.llcancel_btn); + ll_blank = (LinearLayout) contentView.findViewById(R.id.ll_blank); + tv_viprate = (TextView) contentView.findViewById(R.id.tv_viprate); + rl_isVip = (RelativeLayout) contentView.findViewById(R.id.rl_isVip); + tv_pay_protocol = (TextView) contentView.findViewById(R.id.tv_pay_protocol); + btn_next = (Button) contentView.findViewById(R.id.btn_next); + iv_vip = (ImageView) contentView.findViewById(R.id.iv_vip); + iv_vip.setImageResource(R.drawable.switch_off); + if(viprate==1){ + rl_isVip.setVisibility(View.GONE); + }else{ + rl_isVip.setVisibility(View.VISIBLE); + String vipdiscount = String.valueOf(viprate*100); + String[] viparr = vipdiscount.split("\\."); + tv_viprate.setText(getResources().getString(R.string.vip_prompt)+viparr[0]+getResources().getString(R.string.vip_rate)); + } + ListView mlistview = (ListView) contentView.findViewById(R.id.list_price); + PriceAdapter adapter = new PriceAdapter(getApplicationContext(),mPriceList,Constant.RADIO_FLAG_INPRICELIST_YES); + mlistview.setAdapter(adapter); + mPopWindow.showAtLocation(contentView, Gravity.BOTTOM,0,0); + llcancel_btn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + mPopWindow.dismiss(); + } + }); + ll_blank.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + mPopWindow.dismiss(); + } + }); + tv_pay_protocol.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Intent intent = new Intent(EActDetailActivity2_0_3.this,CommonH5Activity.class); + intent.putExtra("title","启缘支付协议"); + startActivity(intent); + } + }); + mlistview.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView adapterView, View view, int i, long l) { + PriceInfoModel model = mPriceList.get(i); + ticketId = model.getTicketid(); + } + }); + btn_next.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + reqSignUp(); + } + }); + iv_vip.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if("0".equals(isVipSelected)){ + iv_vip.setImageResource(R.drawable.switch_on); + isVipSelected = "1"; + }else{ + iv_vip.setImageResource(R.drawable.switch_off); + isVipSelected = "0"; + } + } + }); + } + + /** + * 向服务器发送报名请求 + */ + private void reqSignUp(){ + if(mPriceList!=null&&mPriceList.size()>0&&JqStrUtil.isEmpty(ticketId)){ + JqStrUtil.showToast(EActDetailActivity2_0_3.this,"请选择支付金额"); + return; + } + String reqSignUpUrl = Constant.COMMON_URL + Interface.ACT_SIGN;//2.2.1版本和之前版本走的是两个不同的接口 + JSONObject obj = new JSONObject(); + obj.put("userid",userid); + obj.put("actid",actid); + obj.put("signtype",0);//企业活动报名跟web端报名区分 0:app端报名 1:web端报名 + obj.put("version",Constant.VERSION); + if(!JqStrUtil.isEmpty(ticketId)){//如果是免费活动,则tiketid不传 + obj.put("ticketid",ticketId);//2.2.1版本需要票id + } + if("1".equals(isVipSelected)){//1的情况下是会员且选择了折扣 + obj.put("viptype",isVipSelected); + } + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(EActDetailActivity2_0_3.this,true,reqSignUpUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + Log.d(TAG, "onResponse: jsonobject"+jsonObject); + if("1".equals(rsCode)){ + if("免费活动".equals(money)){ + tv_signStatus.setText("正在审核"); + ll_signBtn.setEnabled(false); + ll_signBtn.setBackgroundColor(getResources().getColor(R.color.gray)); + JqStrUtil.showToast(EActDetailActivity2_0_3.this,getResources().getString(R.string.enroll_success_waitchek)); + }else{ + if(mPopWindow.isShowing()){ + mPopWindow.dismiss(); + } + String info = jsonObject.getString("information"); + JSONObject obj = JSON.parseObject(info); + String ordernum = obj.getString("ordernum"); + Intent intent = new Intent(EActDetailActivity2_0_3.this,WaitingAndSelectPayTypeActivity254.class); + intent.putExtra("actid",actid); + intent.putExtra("ordernum",ordernum); + startActivity(intent); + } + }else{ + JqStrUtil.showToast(EActDetailActivity2_0_3.this,explanation); + } + } + },null); + } + + @Override + protected void onResume() { + super.onResume(); + //设置顶部获取焦点(随便一个顶部控件就可以,让它获取焦点),解决打开activity不在顶部的问题 + tvTitle.setFocusable(true); + tvTitle.setFocusableInTouchMode(true); + tvTitle.requestFocus(); + } + + public void refresh(){ + reqDetail(); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + if(instance!=null){ + instance = null; + } + if(mLocationClient!=null){ + mLocationClient.stop(); + mLocationClient = null; + } + } + + /***********************************************显示服务端返回的html字符串(关于活动具体介绍)********************************************/ + private void showActDetailWithHtml(){ + /**--------WebView样式设置-------------*/ + //支持javascript + wv_actdetail.getSettings().setJavaScriptEnabled(true); + // 设置可以支持缩放 + wv_actdetail.getSettings().setSupportZoom(true); + // 设置出现缩放工具 + wv_actdetail.getSettings().setBuiltInZoomControls(true); + //扩大比例的缩放 + wv_actdetail.getSettings().setUseWideViewPort(true); + //自适应屏幕 + wv_actdetail.getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN); + wv_actdetail.getSettings().setLoadWithOverviewMode(true); + //设置webview展示html的宽度方式 +// WebSettings webSettings =wv.getSettings(); +// webSettings.setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN); + String encoding = "UTF-8"; + String mimeType = "text/html"; + if(!JqStrUtil.isEmpty(act_details)){ + wv_actdetail.loadDataWithBaseURL(null, act_details, mimeType, encoding, null); + }else{ + ll_webview.setVisibility(View.GONE); + } + } + + /** + * 获取报名列表 + */ + private void getReportListAndView(){ + final String reportlistUrl = Constant.COMMON_URL + Interface.EACT_REPORTLIST; + JSONObject obj = new JSONObject(); + obj.put("actid",actid); + obj.put("limit",6); + obj.put("offset",0); + obj.put("version",Constant.VERSION); + String param = JSON.toJSONString(obj); + Log.d(TAG, "getReportList: param"+param); + okHttpUtil.sendJsonStrByPostAsync(EActDetailActivity2_0_3.this, false, reportlistUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + Log.d(TAG, "onResponse: result"+jsonObject); + String rsCode = jsonObject.getString("retcode"); + String reporterNum = jsonObject.getString("count"); + if("1".equals(rsCode)){ + if("0".equals(reporterNum)) { + rlay_signUser.setVisibility(View.GONE); + }else{ + rlay_signUser.setVisibility(View.VISIBLE); + String jsonString = jsonObject.getString("message"); + reporterList = JSON.parseArray(jsonString, LikeUserEntity.class); + Log.d(TAG, "onResponse: " + jsonString); + for (int i = 0; i < reporterList.size(); i++) { + final ImageView imageView = new ImageView(EActDetailActivity2_0_3.this); + imageView.setLayoutParams(getReportLayout()); + EasyGlide.getInstance().showImageCircle(reporterList.get(i).getAvatar(),imageView); + ll_signUser.addView(imageView); + } + + } + } + } + },null); + } + + /***************************************************************评论相关操作start************************************************************/ + + /** + * 获取评论数据 + */ + public void getDiscussDataAndView() { + String dcusUrl = Constant.COMMON_URL + Interface.EACT_DCUS; + JSONObject obj = new JSONObject(); + obj.put("actid",actid); + obj.put("offset",pageNo); + obj.put("limit",pageSize); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(EActDetailActivity2_0_3.this,false,dcusUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + if("1".equals(rsCode)){ + String dn = jsonObject.getString("number"); + txt_dcusNum.setText("评论("+dn+")"); + tv_dcusBtnStr.setText("评论("+dn+")"); + if("0".equals(dn)){ + tv_noDcus.setVisibility(View.VISIBLE); + lv_dcus.setVisibility(View.GONE); + }else{//如果是第一个人评论,则评论区不会更改,会有问题 + tv_noDcus.setVisibility(View.GONE); + lv_dcus.setVisibility(View.VISIBLE); + } + String jsonString = jsonObject.getString("message"); + dcusList = JSON.parseArray(jsonString,DiscussEntity.class); + DiscussAdapter adapter = new DiscussAdapter(EActDetailActivity2_0_3.this,dcusList,actid); + lv_dcus.setAdapter(adapter); + } + } + },null); + } + + /** + * 点击评论,打开评论dialog + */ + private void discuss(){ + View replyView = LayoutInflater.from(EActDetailActivity2_0_3.this).inflate(R.layout.push_discuss_layout,null); + LinearLayout llay_reply = (LinearLayout) replyView.findViewById(R.id.llay_reply); + llay_reply.setVisibility(View.GONE); + final EditText discuss_content = (EditText)replyView.findViewById(R.id.discuss_content); + //控制评论输入的最大行数 + discuss_content.addTextChangedListener(new TextWatcher(){ + @Override + public void beforeTextChanged (CharSequence s,int start, int count, + int after){ + } + + @Override + public void onTextChanged (CharSequence s,int start, int before, int count){ + } + + @Override + public void afterTextChanged (Editable s){ + int lines = discuss_content.getLineCount(); + // 限制最大输入行数 + if (lines > 10) { + String str = s.toString(); + int cursorStart = discuss_content.getSelectionStart(); + int cursorEnd = discuss_content.getSelectionEnd(); + if (cursorStart == cursorEnd && cursorStart < str.length() && cursorStart >= 1) { + str = str.substring(0, cursorStart - 1) + str.substring(cursorStart); + } else { + str = str.substring(0, s.length() - 1); + } + // setText会触发afterTextChanged的递归 + discuss_content.setText(str); + // setSelection用的索引不能使用str.length()否则会越界 + discuss_content.setSelection(discuss_content.getText().length()); + } + } + }); + //对话框 + CustomDialog.Builder builder = new CustomDialog.Builder(EActDetailActivity2_0_3.this); + builder.setTitle(getString(R.string.enterpriseact_comment)); + builder.setContentView(replyView); + builder.setPositiveButton(getString(R.string.enterpriseact_comment),new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + if(JqStrUtil.isEmpty(discuss_content.getText().toString())){ + JqStrUtil.showToast(EActDetailActivity2_0_3.this,getString(R.string.comment_input_prompt)); + }else{ + addDcus(discuss_content.getText().toString().trim(),"");//进行评论 + dialog.dismiss(); + } + } + }); + builder.setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }); + builder.create().show(); + } + /** + * 发布评论 + */ + private void addDcus(String words,String recid){ + String pushdisscussUrl = Constant.COMMON_URL + Interface.PUSH_DISCUSS; + JSONObject obj = new JSONObject(); + SharedPreferences sp = getSharedPreferences("elove",MODE_PRIVATE); + String userid = sp.getString("userid",""); + obj.put("actid",actid); + obj.put("userid",userid); + obj.put("words",words); + obj.put("rduserid",recid); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + Log.d(TAG, "onClick: param"+param); + okHttpUtil.sendJsonStrByPostAsync(EActDetailActivity2_0_3.this,true,pushdisscussUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + Log.d(TAG, "onResponse: rsCode"+rsCode); + if("1".equals(rsCode)){ + JqStrUtil.showToast(EActDetailActivity2_0_3.this,getResources().getString(R.string.comment_success)); + getDiscussDataAndView(); + } + } + },null); + } + + + /** + * 点回复按钮弹出评论对话框 + * @param entity + */ + private void replyDcus(final DiscussEntity entity){ + //对话框 + CustomDialog.Builder builder = new CustomDialog.Builder(EActDetailActivity2_0_3.this); + builder.setTitle(getResources().getString(R.string.enterpriseact_comment)); + View replyView = LayoutInflater.from(EActDetailActivity2_0_3.this).inflate(R.layout.push_discuss_layout,null); + TextView otherNikeName = (TextView)replyView.findViewById(R.id.otherNikeName); + otherNikeName.setText(entity.getPdnickname()); + final EditText discuss_content = (EditText)replyView.findViewById(R.id.discuss_content); + //控制评论输入的最大行数 + discuss_content.addTextChangedListener(new TextWatcher(){ + @Override + public void beforeTextChanged (CharSequence s,int start, int count, + int after){ + } + + @Override + public void onTextChanged (CharSequence s,int start, int before, int count){ + } + + @Override + public void afterTextChanged (Editable s){ + int lines = discuss_content.getLineCount(); + // 限制最大输入行数 + if (lines > 10) { + String str = s.toString(); + int cursorStart = discuss_content.getSelectionStart(); + int cursorEnd = discuss_content.getSelectionEnd(); + if (cursorStart == cursorEnd && cursorStart < str.length() && cursorStart >= 1) { + str = str.substring(0, cursorStart - 1) + str.substring(cursorStart); + } else { + str = str.substring(0, s.length() - 1); + } + // setText会触发afterTextChanged的递归 + discuss_content.setText(str); + // setSelection用的索引不能使用str.length()否则会越界 + discuss_content.setSelection(discuss_content.getText().length()); + } + } + }); + builder.setContentView(replyView); + builder.setPositiveButton(getResources().getString(R.string.enterpriseact_comment),new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + if(JqStrUtil.isEmpty(discuss_content.getText().toString())){ + JqStrUtil.showToast(EActDetailActivity2_0_3.this,getResources().getString(R.string.comment_input_prompt)); + }else{ + addDcus(discuss_content.getText().toString().trim(),entity.getUserid()); + dialog.dismiss(); + } + } + }); + builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }); + builder.create().show(); + } + + /** + * 删除评论 + */ + private void deleteDcus(String recid){ + String deldisscussUrl = Constant.COMMON_URL + Interface.DELETE_DISCUSS; + JSONObject obj = new JSONObject(); + obj.put("recid",recid); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + Log.d(TAG, "onClick: param"+param); + okHttpUtil.sendJsonStrByPostAsync(EActDetailActivity2_0_3.this,true,deldisscussUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + Log.d(TAG, "onResponse: rsCode"+rsCode); + if("1".equals(rsCode)){ + JqStrUtil.showToast(EActDetailActivity2_0_3.this,getResources().getString(R.string.delete_comment_success)); + getDiscussDataAndView(); + }else{ + JqStrUtil.showToast(EActDetailActivity2_0_3.this,explanation); + } + } + },null); + } + /**********************************************************评论相关操作end************************************************************/ + + /********************************************************展示更多操作的面板start*************************************************************/ + private void showActionSheet() { + setTheme(R.style.ActionSheetStyleiOS7); + ActionSheet.createBuilder(this, getSupportFragmentManager()) + .setCancelButtonTitle(getString(R.string.cancel)) + .setOtherButtonTitles(getString(R.string.act_report),getString(R.string.share)) + .setCancelableOnTouchOutside(true).setListener(this).show(); + } + @Override + public void onDismiss(ActionSheet actionSheet, boolean isCancel) { + //空实现 + } + @Override + public void onOtherButtonClick(ActionSheet actionSheet, int index) { + switch (index){ + case 0://举报 + Intent intent_report; + intent_report = new Intent(EActDetailActivity2_0_3.this,ActReportActivity.class); + intent_report.putExtra("actid",actid); + intent_report.putExtra("actType","0"); + intent_report.putExtra("actTitle",actTitle); + startActivity(intent_report); + break; + case 1://分享 + shareInfo(); + break; + default: + break; + } + } + private void shareInfo() { + initUmengShare();//umeng平台分享配置初始化 + } + private void initUmengShare() { + UMImage image; + if(imgbitmap==null){ + image = new UMImage(EActDetailActivity2_0_3.this, + BitmapFactory.decodeResource(getResources(), R.mipmap.app_logo)); + }else{ + image = new UMImage(EActDetailActivity2_0_3.this,imgbitmap); + } + ShareAction action = new ShareAction(this); + action.setDisplayList(Constant.DISPLAY_LIST); + action.withTitle(actTitle); + action.withText("时间:"+startTime+"地点:"+addressname); + action.withTargetUrl(Constant.SHARE_ACT_URL+actid);//点击分享内容打开的链接 + action.withMedia(image);//附带的图片,音乐,视频等多媒体对象 + action.setShareboardclickCallback(mShareBoardlistener);//设置友盟集成的分享面板的点击监听回调 + action.open();//打开集成的分享面板 + } + /** + * 友盟分享面板PopupWindow监听器 + */ + private ShareBoardlistener mShareBoardlistener = new ShareBoardlistener() { + + @Override + public void onclick(SnsPlatform snsPlatform, SHARE_MEDIA share_media) { + UMImage image; + if(imgbitmap==null){ + image = new UMImage(EActDetailActivity2_0_3.this, + BitmapFactory.decodeResource(getResources(), R.mipmap.app_logo)); + }else{ + image = new UMImage(EActDetailActivity2_0_3.this,imgbitmap); + } + ShareAction shareAction = new ShareAction(EActDetailActivity2_0_3.this); + shareAction.setPlatform(share_media); + shareAction.setCallback(mUmShareListener);//设置每个平台的点击事件 + shareAction.withTitle(actTitle); + sb = new StringBuilder(); + sb.append(getString(R.string.act_share_time)); + sb.append(startTime); + sb.append(getString(R.string.act_share_address)); + sb.append(addressname); + shareAction.withText(sb.toString()); + shareAction.withTargetUrl(Constant.SHARE_ACT_URL+actid);//点击分享内容打开的链接 + shareAction.withMedia(image);//附带的图片,音乐,视频等多媒体对象 + shareAction.share();//发起分享,调起微信,QQ,微博客户端进行分享。 + } + }; + /** + * 友盟分享后事件监听器 + */ + private UMShareListener mUmShareListener = new UMShareListener() { + + @Override + public void onResult(SHARE_MEDIA platform) {//回调来增加分享次数 + String shareSuccessUrl = Constant.COMMON_URL + Interface.SHARE_SUCCESS; + JSONObject obj = new JSONObject(); + obj.put("userid",userid); + obj.put("actid",actid); + obj.put("version",Constant.VERSION); + String param = JSON.toJSONString(obj); + Log.d(TAG, "onResult: param"+param);//platform+ + okHttpUtil.sendJsonStrByPostAsync(getApplicationContext(), false, shareSuccessUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + reqDetail(); + Toast.makeText(EActDetailActivity2_0_3.this,"分享成功",Toast.LENGTH_LONG).show(); + } + }, null); + } + + @Override + public void onError(SHARE_MEDIA platform, Throwable t) { + Toast.makeText(EActDetailActivity2_0_3.this,"分享失败",Toast.LENGTH_LONG).show(); + } + + @Override + public void onCancel(SHARE_MEDIA platform) { +// Toast.makeText(EActDetailActivity2_0_3.this,"分享取消",Toast.LENGTH_LONG).show(); + } + }; + /********************************************************展示更多操作的面板end*************************************************************/ + + private LinearLayout.LayoutParams getMyLayout(){ + Resources resources = getResources(); + DisplayMetrics dm = resources.getDisplayMetrics(); + int width = dm.widthPixels; + LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(width,width*9/16); + return layoutParams; + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + UMShareAPI.get(this).onActivityResult(requestCode, resultCode, data); + } + + @Override + protected void onStop() { + super.onStop(); + if(mLocationClient!=null){ + mLocationClient.stop(); + } + } + + private LinearLayout.LayoutParams getReportLayout(){ + Resources resources = getResources(); + DisplayMetrics dm = resources.getDisplayMetrics(); + int width = CommonUtil.dip2px(EActDetailActivity2_0_3.this,40); + int height = CommonUtil.dip2px(EActDetailActivity2_0_3.this,40); + int margin = CommonUtil.dip2px(EActDetailActivity2_0_3.this,10); + LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(width,height); + layoutParams.setMargins(0,0,margin,0); + return layoutParams; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/EditMyInfoActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/EditMyInfoActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..6a871a684dfa0ce0c6fecdbe196db4ba1823d368 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/EditMyInfoActivity.java @@ -0,0 +1,1382 @@ +package com.jiuqi.elove.activity; + +import android.content.Context; +import android.content.Intent; +import android.graphics.Color; +import android.graphics.drawable.ColorDrawable; +import android.os.Bundle; +import android.text.TextUtils; +import android.util.Log; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.WindowManager; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.PopupWindow; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.bigkoo.pickerview.OptionsPickerView; +import com.jiuqi.elove.R; +import com.jiuqi.elove.application.EloveApplication; +import com.jiuqi.elove.common.CommonDataUtil; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.common.JqBaseActivity; +import com.jiuqi.elove.entity.AuthAllModel; +import com.jiuqi.elove.entity.ConditionBean; +import com.jiuqi.elove.entity.MyInfoModel; +import com.jiuqi.elove.entity.ProvinceBean; +import com.jiuqi.elove.entity.ThridAreaBean; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.PickerUtil; +import com.jiuqi.elove.util.SpUtils; +import com.jiuqi.elove.widget.AgerqPickerLayout; +import com.jiuqi.elove.widget.CityPickerLayout; +import com.jiuqi.elove.widget.CityRequestPickerLayout; +import com.jiuqi.elove.widget.ConditionPickerLayout; +import com.jiuqi.elove.widget.OrigoPickerLayout; +import com.jiuqi.elove.widget.WheelView; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import butterknife.BindView; +import butterknife.OnClick; + +public class EditMyInfoActivity extends ABaseActivity implements View.OnClickListener{ + + private static final String TAG = "EditMyInfoActivity"; + /** + * 控件 + */ + @BindView(R.id.ll_demand) + LinearLayout ll_demand; + @BindView(R.id.ll_detail_info) + LinearLayout ll_detail_info; + @BindView(R.id.ll_job) + LinearLayout ll_job; + @BindView(R.id.ll_edu) + LinearLayout ll_edu; + @BindView(R.id.tv_right) + TextView tv_right; + @BindView(R.id.rl_right_tv) + RelativeLayout rl_right_tv; + @BindView(R.id.tv_mynikeName)//昵称 + EditText tv_mynikeName; + @BindView(R.id.tv_myNation)//民族 + TextView tv_myNation; + @BindView(R.id.tv_myHeight)//身高 + TextView tv_myHeight; + @BindView(R.id.tv_myWeight)//体重 + TextView tv_myWeight; + @BindView(R.id.tv_addressStr)//所在地view + TextView tv_addressStr; + @BindView(R.id.tv_myOrigo)//籍贯view + TextView tv_myOrigo; + @BindView(R.id.tv_myMarriage)//婚姻view + TextView tv_myMarriage; + @BindView(R.id.tv_myHouse)//房子view + TextView tv_myHouse; + @BindView(R.id.tv_myCar)//车子view + TextView tv_myCar; + @BindView(R.id.tv_mySchool)//学校 + TextView tv_mySchool; + @BindView(R.id.tv_myDegree)//学历view + TextView tv_myDegree; + + private RelativeLayout rl_liveaddress;//居住地 + private RelativeLayout rl_height;//身高 + private RelativeLayout rl_degree;//学历 + private View mview; + private WheelView comWv; + private TextView cancel_common; + private TextView confirm_common; + private LinearLayout ll_blank; + private RelativeLayout rl_profession; + private RelativeLayout rl_income; + private RelativeLayout rl_marriage; + private RelativeLayout rl_agerq; + private RelativeLayout rl_heightrq; + private RelativeLayout rl_degreerq; + private RelativeLayout rl_incomerq; + private RelativeLayout rl_origo; + private RelativeLayout rl_nation; + private RelativeLayout rl_house; + private RelativeLayout rl_car; + private RelativeLayout rl_houserq; + private RelativeLayout rl_carrq; + private RelativeLayout rl_addressrq; + private RelativeLayout rl_company; + private CityPickerLayout cityPicker; + private OrigoPickerLayout origoPicker; + private CityRequestPickerLayout requestPicker; + private ConditionPickerLayout conditionPicker; + private AgerqPickerLayout agerqPicker; + private TextView confirm_city; + private TextView cancel_city; + private LinearLayout ll_conditionblank; + private TextView confirm_condition; + private TextView cancel_condition; + private LinearLayout ll_cityblank; + private LinearLayout ll_agerqblank; + private TextView confirm_agerq; + private TextView cancel_agerq; + private TextView tv_demand_ageStr;//年龄要求view + private TextView tv_demand_heightStr;//身高要求view + private TextView tv_demand_enducationStr;//学历要求view + private TextView tv_demand_salaryStr;//年薪要求view + private TextView tv_demand_addressStr;//所在地要求view + private TextView tv_demand_isHasHouseStr;//房子要求view + private TextView tv_demand_isHasCarStr;//车子要求view + private TextView tv_sexStr;//性别view + private TextView tv_birthStr;//生日view + + private TextView tv_myProfession;//职业view + private TextView tv_myCompany;//公司view + private TextView tv_mySalary;//收入view + + private PopupWindow commonwindow; + + /** + * 数据 + */ + private String title; + private String userid; + private String comStr;//每个滚轮选择的结果值,用作中间保存变量 + private HashMap degreeMap; + private HashMap incomeMap; + private HashMap marriageMap; + private HashMap agerqMap; + private HashMap heightrqMap; + private HashMap degreerqMap; + private HashMap incomerqMap; + private HashMap nationMap; + private HashMap houseMap; + private HashMap carMap; + private HashMap houserqMap; + private HashMap carrqMap; + private HashMap sexMap; + private ArrayList heightList; + private ArrayList nationList; + private List provinceItems;//省份list + private List> cityItems;// + private List> cityItemsName;// + private List provinceRqItems;//省份list + private List> cityRqItems;// + private List> cityRqItemsName;// + private String selectTitle; + /** + * 基本信息 5 个 + */ + private String nikeName; + private String school; +// private String name;//姓名无用了,未在代码中删除 + private String sex;//0女1男 + private String birth; + private String liveaddress; + /** + * 详细信息 10 个 + */ + private String weight;//体重 + private String height; + private String degree;//学历 + private String profession;//未填的情况下,输入的数据为0 + private String company; + private String origo; + private String nation; + private String income;//年收入 + private String marriage;//婚姻状况 + private String house;//房子状况 + private String car; + private String kind; + private String audittype; + /** + * 择偶要求 7个 + */ +// private String agerq;//年龄要求 +// private String heightrq;//身高要求 + private String minheightrequest;//身高要求最小值 + private String maxheightrequest;//身高要求最大值 + private String minagerequest;// 最低年龄要求 + private String maxagerequest;// 最大年龄要求 + private String degreerq;//学位要求 + private String incomerq;//收入要求 + private String liveaddressrq; + private String houserq; + private String carrq; + + /** + * 判断页面展示方式的标志 + */ + private String pageKind; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getDataFromSpAndPrePage();//从上个页面和sp中获取数据 + setContentView(R.layout.activity_edit_my_info,title,-1,MODE_BACK,HEIGHT_REDBG_WHITEFONT); + initView();//初始化UI + setDataMap();//设置基本信息数据映射 + setEvents();//注册事件 + getMyProfile();//从服务器获取个人资料 + } + + /** + * 从上个页面和sp中获取标记位和id + */ + private void getDataFromSpAndPrePage() { + Intent intent = getIntent(); + pageKind = intent.getStringExtra("pageKind"); + userid = SpUtils.getString(Constant.USER_ID); + if("detail".equals(pageKind)){ + title = "详细资料"; + }else if("edu".equals(pageKind)){ + title = "最高教育"; + }else if("job".equals(pageKind)){ + title = "最近工作"; + }else if("demand".equals(pageKind)){ + title = "择偶要求"; + } + } + + /** + * 初始化UI + */ + private void initView() { + tv_right.setText(getString(R.string.edit_finish)); + rl_right_tv.setVisibility(View.VISIBLE); + + rl_liveaddress = easyFind(R.id.rl_liveaddress); + rl_height = easyFind(R.id.rl_height); + rl_degree = easyFind(R.id.rl_degree); + rl_profession = easyFind(R.id.rl_profession); + rl_income = easyFind(R.id.rl_income); + rl_marriage = easyFind(R.id.rl_marriage); + rl_agerq = easyFind(R.id.rl_agerq); + rl_heightrq = easyFind(R.id.rl_heightrq); + rl_degreerq = easyFind(R.id.rl_degreerq); + rl_incomerq = easyFind(R.id.rl_incomerq); + rl_origo = easyFind(R.id.rl_origo); + rl_nation = easyFind(R.id.rl_nation); + rl_house = easyFind(R.id.rl_house); + rl_car = easyFind(R.id.rl_car); + rl_houserq = easyFind(R.id.rl_houserq); + rl_carrq = easyFind(R.id.rl_carrq); + rl_addressrq = easyFind(R.id.rl_addressrq); + rl_company = easyFind(R.id.rl_company); + tv_mynikeName = easyFind(R.id.tv_mynikeName); +// tv_mynameStr = easyFind(R.id.tv_mynameStr); + tv_sexStr = easyFind(R.id.tv_sexStr); + tv_birthStr = easyFind(R.id.tv_birthStr); + tv_myHeight = easyFind(R.id.tv_myHeight); + tv_myCompany = easyFind(R.id.tv_myCompany); + tv_myNation = easyFind(R.id.tv_myNation); + tv_myHouse = easyFind(R.id.tv_myHouse); + tv_myCar = easyFind(R.id.tv_myCar); + tv_addressStr = easyFind(R.id.tv_addressStr); + tv_myOrigo = easyFind(R.id.tv_myOrigo); + tv_myDegree = easyFind(R.id.tv_myDegree); + tv_myProfession = easyFind(R.id.tv_myProfession); + tv_mySalary = easyFind(R.id.tv_mySalary); + tv_myMarriage = easyFind(R.id.tv_myMarriage); + tv_demand_ageStr = easyFind(R.id.tv_demand_ageStr); + tv_demand_heightStr = easyFind(R.id.tv_demand_heightStr); + tv_demand_enducationStr = easyFind(R.id.tv_demand_enducationStr); + tv_demand_salaryStr = easyFind(R.id.tv_demand_salaryStr); + tv_demand_addressStr = easyFind(R.id.tv_demand_addressStr); + tv_demand_isHasHouseStr = easyFind(R.id.tv_demand_isHasHouseStr); + tv_demand_isHasCarStr = easyFind(R.id.tv_demand_isHasCarStr); + if("detail".equals(pageKind)){ + ll_detail_info.setVisibility(View.VISIBLE); + ll_demand.setVisibility(View.GONE); + ll_job.setVisibility(View.GONE); + ll_edu.setVisibility(View.GONE); + }else if("edu".equals(pageKind)){ + ll_detail_info.setVisibility(View.GONE); + ll_demand.setVisibility(View.GONE); + ll_job.setVisibility(View.GONE); + ll_edu.setVisibility(View.VISIBLE); + }else if("job".equals(pageKind)){ + ll_detail_info.setVisibility(View.GONE); + ll_demand.setVisibility(View.GONE); + ll_job.setVisibility(View.VISIBLE); + ll_edu.setVisibility(View.GONE); + }else if("demand".equals(pageKind)) { + ll_detail_info.setVisibility(View.GONE); + ll_demand.setVisibility(View.VISIBLE); + ll_job.setVisibility(View.GONE); + ll_edu.setVisibility(View.GONE); + } + } + + /** + * 设置资料数据映射以及获取相应的map + */ + private void setDataMap() { + provinceRqItems = new ArrayList<>(); + cityRqItems = new ArrayList<>(); + cityRqItemsName = new ArrayList<>(); + CommonDataUtil.setHeightList(); + CommonDataUtil.setNationMap(); + CommonDataUtil.setNationList(); + CommonDataUtil.setWeightList(); + degreeMap = CommonDataUtil.degreeMap; + incomeMap = CommonDataUtil.incomeMap; + marriageMap = CommonDataUtil.marriageMap; + agerqMap = CommonDataUtil.ageMap; + heightrqMap = CommonDataUtil.heightMap; + degreerqMap = CommonDataUtil.degreeMap; + incomerqMap = CommonDataUtil.incomeMap; + sexMap = CommonDataUtil.sexMap; + nationMap = CommonDataUtil.nationMap; + heightList = CommonDataUtil.heightList; + nationList = CommonDataUtil.nationList; + houseMap = CommonDataUtil.houseMap; + carMap = CommonDataUtil.carMap; + houserqMap = CommonDataUtil.houseRequestMap; + carrqMap = CommonDataUtil.carRequestMap; + provinceItems = EloveApplication.provinceItems; + cityItems = EloveApplication.province_city_or_area; + cityItemsName = EloveApplication.province_city_or_area_name; + provinceRqItems.addAll(EloveApplication.provinceItems); + cityRqItems.addAll(EloveApplication.province_city_or_area); + cityRqItemsName.addAll(EloveApplication.province_city_or_area_name); + ProvinceBean bean = new ProvinceBean(); + bean.setName("不限"); + provinceRqItems.add(0,bean); + List mList = new ArrayList<>(); + mList.add("不限"); + List cityList = new ArrayList<>(); + ProvinceBean.CityBean cityBean = new ProvinceBean.CityBean(); + cityBean.setName("不限"); + cityList.add(cityBean); + cityRqItems.add(0,cityList); + cityRqItemsName.add(0,mList); + } + + /** + * 注册事件 + */ + private void setEvents() { + rl_liveaddress.setOnClickListener(this); + rl_height.setOnClickListener(this); + rl_degree.setOnClickListener(this); + rl_profession.setOnClickListener(this); + rl_income.setOnClickListener(this); + rl_marriage.setOnClickListener(this); + rl_agerq.setOnClickListener(this); + rl_heightrq.setOnClickListener(this); + rl_degreerq.setOnClickListener(this); + rl_incomerq.setOnClickListener(this); + rl_origo.setOnClickListener(this); + rl_nation.setOnClickListener(this); + rl_house.setOnClickListener(this); + rl_car.setOnClickListener(this); + rl_houserq.setOnClickListener(this); + rl_carrq.setOnClickListener(this); + rl_addressrq.setOnClickListener(this); + rl_company.setOnClickListener(this); + } + + /** + * 从服务器获取个人资料 + */ + private void getMyProfile() { + String myInfoUrl = Constant.COMMON_URL + Interface.MY_NEWINFO; + JSONObject jsonObject = new JSONObject(); + jsonObject.put("userid",userid); + jsonObject.put("version",Constant.VERSION); + String param = jsonObject.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(EditMyInfoActivity.this,true,myInfoUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String resCode = jsonObject.getString("retcode"); + if("1".equals(resCode)){ + String result = jsonObject.getString("information"); + HandleProfileDataAndView(result); + } + } + },null); + } + + /** + * 获取到的数据填充到UI + * @param result 获取到的资料json串 + */ + private void HandleProfileDataAndView(String result) { + MyInfoModel myModel = JSONObject.parseObject(result,MyInfoModel.class); + /** + * 基本信息 5 个 + */ + nikeName = myModel.getNickname(); +// name = myModel.getName(); + sex = myModel.getSex();//0女1男 + birth = myModel.getBirthday(); + liveaddress = myModel.getLocalplace(); + /** + * 详细信息 10 个 + */ + height = myModel.getHeight(); + degree = myModel.getDegree(); + profession = myModel.getProfession(); + company = myModel.getEnterprise(); + origo = myModel.getOrigo(); + nation = myModel.getNation(); + income = myModel.getIncome(); + marriage = myModel.getMarrige(); + house = myModel.getIfhouse(); + car = myModel.getIfcar(); + audittype = myModel.getAudittype(); + kind = myModel.getKind(); + /** + * 择偶要求 7个 + */ +// agerq = myModel.getAgerequest(); +// heightrq = myModel.getHeightrequest(); + minagerequest = myModel.getMinagerequest(); + maxagerequest = myModel.getMaxagerequest(); + minheightrequest = myModel.getMinheightrequest(); + maxheightrequest = myModel.getMaxheightrequest(); + degreerq = myModel.getDegreerequest(); + incomerq = myModel.getIncomerequest(); + liveaddressrq = myModel.getLocationrequest(); + houserq = myModel.getHouserequest(); + carrq = myModel.getCarrequest(); + tv_mynikeName.setText(nikeName); + tv_mynikeName.setSelection(nikeName.length()); +// tv_mynameStr.setText(name); + tv_sexStr.setText(CommonDataUtil.sexMap.get(sex)); + tv_birthStr.setText(birth); + tv_addressStr.setText(liveaddress); + tv_myWeight.setText(myModel.getWeight()); + tv_myHeight.setText(height); + tv_myDegree.setText(CommonDataUtil.degreeMap.get(degree)); + tv_myProfession.setText(CommonDataUtil.professionMap.get(profession)); + tv_myCompany.setText(company); + tv_myOrigo.setText(origo); + tv_myNation.setText(CommonDataUtil.nationMap.get(nation)); + tv_mySalary.setText(CommonDataUtil.incomeMap.get(income)); + tv_myMarriage.setText(CommonDataUtil.marriageMap.get(marriage)); + tv_myHouse.setText(CommonDataUtil.houseMap.get(house)); + tv_myCar.setText(CommonDataUtil.carMap.get(car)); +// tv_demand_ageStr.setText(CommonDataUtil.ageMap.get(agerq)); + setHeightrq2View(minheightrequest,maxheightrequest,tv_demand_heightStr); + setAgerq2View(minagerequest,maxagerequest,tv_demand_ageStr); +// tv_demand_heightStr.setText(CommonDataUtil.heightMap.get(heightrq)); + tv_demand_enducationStr.setText(CommonDataUtil.degreeMap.get(degreerq)); + tv_demand_salaryStr.setText(CommonDataUtil.incomeMap.get(incomerq)); + if(JqStrUtil.isEmpty(liveaddressrq)||"-1".equals(liveaddressrq)){ + tv_demand_addressStr.setText("不限"); + liveaddressrq = "不限"; + }else{ + tv_demand_addressStr.setText(liveaddressrq); + } + tv_demand_isHasHouseStr.setText(CommonDataUtil.houseRequestMap.get(houserq)); + tv_demand_isHasCarStr.setText(CommonDataUtil.carRequestMap.get(carrq)); + } + + @OnClick({R.id.rl_right_tv,R.id.rl_weight,R.id.rl_school}) + public void OnClick(View view){ + switch (view.getId()){ + case R.id.rl_right_tv://提交数据到服务器 + saveMyInfo(); + break; + case R.id.rl_weight://体重 + showPickerView("weight"); + break; + case R.id.rl_school://学校 + startChooseProvince(); + break; + } + } + + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + String school = intent.getStringExtra("school"); + tv_mySchool.setText(school); + } + + /** + * 选择学校先选择省份 + */ + private void startChooseProvince() { + Intent intent = new Intent(this,ChooseProvinceActivity.class); + startActivity(intent); + } + + @Override + public void onClick(View view) { + switch (view.getId()){ + case R.id.rl_liveaddress://所在地 + showPickerView("tv_addressStr"); + break; + case R.id.rl_height://身高 + createSingleWheel(heightList); + confirm_common.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + String mcom = comWv.getSelectedText(); + height = mcom.substring(0,3); + commonwindow.dismiss(); + tv_myHeight.setText(mcom); + commonwindow = null; + } + }); + break; + case R.id.rl_degree://学历 + ArrayList degreeList = new ArrayList<>(); + degreeList.add(degreeMap.get("1")); + degreeList.add(degreeMap.get("2")); + degreeList.add(degreeMap.get("3")); + degreeList.add(degreeMap.get("4")); + degreeList.add(degreeMap.get("5")); + createSingleWheel(degreeList); + confirm_common.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + String mcom = comWv.getSelectedText(); + Iterator iter = degreeMap.entrySet().iterator(); + while(iter.hasNext()){ + Map.Entry entry = (Map.Entry) iter.next(); + if(mcom.equals(entry.getValue())){ + degree = (String)entry.getKey(); + } + } + commonwindow.dismiss(); + tv_myDegree.setText(mcom); + } + }); + break; + case R.id.rl_profession: + Intent proIntent = new Intent(EditMyInfoActivity.this,SelectProfessionActivity.class); + proIntent.putExtra("profession",profession); + startActivityForResult(proIntent,0x01); + break; + case R.id.rl_income://年收入 + ArrayList incomeList = new ArrayList<>(); + incomeList.add(incomeMap.get("1")); + incomeList.add(incomeMap.get("2")); + incomeList.add(incomeMap.get("3")); + incomeList.add(incomeMap.get("4")); + incomeList.add(incomeMap.get("5")); + incomeList.add(incomeMap.get("6")); + incomeList.add(incomeMap.get("7")); + createSingleWheel(incomeList); + confirm_common.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + String mcom = comWv.getSelectedText(); + Iterator iter = incomeMap.entrySet().iterator(); + while(iter.hasNext()){ + Map.Entry entry = (Map.Entry) iter.next(); + if(mcom.equals(entry.getValue())){ + income = (String)entry.getKey(); + } + } + commonwindow.dismiss(); + tv_mySalary.setText(mcom); + } + }); + break; + case R.id.rl_marriage://婚姻 + ArrayList marriageList = new ArrayList<>(); + marriageList.add(marriageMap.get("1")); + marriageList.add(marriageMap.get("2")); + marriageList.add(marriageMap.get("3")); + createSingleWheel(marriageList); + confirm_common.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + String mcom = comWv.getSelectedText(); + Iterator iter = marriageMap.entrySet().iterator(); + while(iter.hasNext()){ + Map.Entry entry = (Map.Entry) iter.next(); + if(mcom.equals(entry.getValue())){ + marriage = (String)entry.getKey(); + } + } + commonwindow.dismiss(); + tv_myMarriage.setText(mcom); + } + }); + break; + case R.id.rl_agerq://年龄要求 + createAgeWheel(tv_demand_ageStr); + break; + case R.id.rl_heightrq://身高要求 + createConditionWheel(tv_demand_heightStr); + break; + case R.id.rl_degreerq://学历要求 + ArrayList degreerqList = new ArrayList<>(); + degreerqList.add(degreerqMap.get("-1")); + degreerqList.add(degreerqMap.get("1")); + degreerqList.add(degreerqMap.get("2")); + degreerqList.add(degreerqMap.get("3")); + degreerqList.add(degreerqMap.get("4")); + degreerqList.add(degreerqMap.get("5")); + createSingleWheel(degreerqList); + confirm_common.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + String mcom = comWv.getSelectedText(); + Iterator iter = degreerqMap.entrySet().iterator(); + while(iter.hasNext()){ + Map.Entry entry = (Map.Entry) iter.next(); + if(mcom.equals(entry.getValue())){ + degreerq = (String)entry.getKey(); + } + } + commonwindow.dismiss(); + tv_demand_enducationStr.setText(mcom); + } + }); + break; + case R.id.rl_incomerq://年收入要求 + ArrayList incomerqList = new ArrayList<>(); + incomerqList.add(incomerqMap.get("-1")); + incomerqList.add(incomerqMap.get("1")); + incomerqList.add(incomerqMap.get("2")); + incomerqList.add(incomerqMap.get("3")); + incomerqList.add(incomerqMap.get("4")); + incomerqList.add(incomerqMap.get("5")); + incomerqList.add(incomerqMap.get("6")); + incomerqList.add(incomerqMap.get("7")); + createSingleWheel(incomerqList); + confirm_common.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + String mcom = comWv.getSelectedText(); + Iterator iter = incomerqMap.entrySet().iterator(); + while(iter.hasNext()){ + Map.Entry entry = (Map.Entry) iter.next(); + if(mcom.equals(entry.getValue())){ + incomerq = (String)entry.getKey(); + } + } + commonwindow.dismiss(); + tv_demand_salaryStr.setText(mcom); + } + }); + break; + case R.id.rl_origo: + showPickerView("tv_myOrigo"); + break; + case R.id.rl_nation: + createSingleWheel(nationList); + confirm_common.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + String mcom = comWv.getSelectedText(); + Iterator iter = nationMap.entrySet().iterator(); + while(iter.hasNext()){ + Map.Entry entry = (Map.Entry) iter.next(); + if(mcom.equals(entry.getValue())){ + nation = (String)entry.getKey(); + } + } + commonwindow.dismiss(); + tv_myNation.setText(mcom); + } + }); + break; + case R.id.rl_house: + ArrayList houseList = new ArrayList<>(); + houseList.add(houseMap.get("-1")); + houseList.add(houseMap.get("2")); + createSingleWheel(houseList); + confirm_common.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + String mcom = comWv.getSelectedText(); + Iterator iter = houseMap.entrySet().iterator(); + while(iter.hasNext()){ + Map.Entry entry = (Map.Entry) iter.next(); + if(mcom.equals(entry.getValue())){ + house = (String)entry.getKey(); + } + } + commonwindow.dismiss(); + tv_myHouse.setText(mcom); + } + }); + break; + case R.id.rl_car: + ArrayList carList = new ArrayList<>(); + carList.add(carMap.get("-1")); + carList.add(carMap.get("2")); + createSingleWheel(carList); + confirm_common.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + String mcom = comWv.getSelectedText(); + Iterator iter = carMap.entrySet().iterator(); + while(iter.hasNext()){ + Map.Entry entry = (Map.Entry) iter.next(); + if(mcom.equals(entry.getValue())){ + car = (String)entry.getKey(); + } + } + commonwindow.dismiss(); + tv_myCar.setText(mcom); + } + }); + break; + case R.id.rl_houserq: + ArrayList houserqList = new ArrayList<>(); + houserqList.add(houserqMap.get("-1")); + houserqList.add(houserqMap.get("2")); + createSingleWheel(houserqList); + confirm_common.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + String mcom = comWv.getSelectedText(); + Iterator iter = houserqMap.entrySet().iterator(); + while(iter.hasNext()){ + Map.Entry entry = (Map.Entry) iter.next(); + if(mcom.equals(entry.getValue())){ + houserq = (String)entry.getKey(); + } + } + commonwindow.dismiss(); + tv_demand_isHasHouseStr.setText(mcom); + } + }); + break; + case R.id.rl_carrq: + ArrayList carrqList = new ArrayList<>(); + carrqList.add(carrqMap.get("-1")); + carrqList.add(carrqMap.get("2")); + createSingleWheel(carrqList); + confirm_common.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + String mcom = comWv.getSelectedText(); + Iterator iter = carrqMap.entrySet().iterator(); + while(iter.hasNext()){ + Map.Entry entry = (Map.Entry) iter.next(); + if(mcom.equals(entry.getValue())){ + carrq = (String)entry.getKey(); + } + } + commonwindow.dismiss(); + tv_demand_isHasCarStr.setText(mcom); + } + }); + break; + case R.id.rl_addressrq: + showPickerView("tv_demand_addressStr"); + break; + case R.id.rl_company: +// Intent intent = new Intent(this,RealNameAuthActivity.class); +// intent.putExtra("pre","edit"); +// intent.putExtra("flag","company"); +// startActivity(intent); + break; + default: + break; + } + } + + /** + * 展示选择框 + * @param flag + */ + private void showPickerView(final String flag) { + setSelectTitle(flag);//设置选择的title + OptionsPickerView pvOptions = new OptionsPickerView.Builder(this, new OptionsPickerView.OnOptionsSelectListener() { + @Override + public void onOptionsSelect(int options1, int options2, int options3, View v) { + //返回的分别是三个级别的选中位置 + handleSelect(options1, options2,flag); + } + }) + .setTitleText(selectTitle) + .setDividerColor(Color.BLACK) + .setTextColorCenter(Color.BLACK) //设置选中项文字颜色 + .setContentTextSize(20) + .setOutSideCancelable(true)// default is true + .setDecorView(null) + .build(); + setData2View(pvOptions,flag);//将数据设置到ui中 + pvOptions.show(); + } + + /** + * 给选择框设置数据 + * @param pvOptions + */ + private void setData2View(OptionsPickerView pvOptions,String flag) { + if("sex".equals(flag)){ + pvOptions.setPicker(CommonDataUtil.mSexList); + }else if("live".equals(flag)){ + pvOptions.setPicker(provinceItems, cityItemsName);//二级选择器 + }else if("age".equals(flag)){ + pvOptions.setPicker(CommonDataUtil.ageList); + }else if("height".equals(flag)){ + pvOptions.setPicker(CommonDataUtil.heightList); + }else if ("degree".equals(flag)){ + pvOptions.setPicker(CommonDataUtil.degreeList); + }else if("income".equals(flag)){ + pvOptions.setPicker(CommonDataUtil.incomeList); + }else if("tv_demand_addressStr".equals(flag)){ + pvOptions.setPicker(provinceRqItems,cityRqItemsName); + }else if("tv_myOrigo".equals(flag)||"tv_addressStr".equals(flag)){ + pvOptions.setPicker(provinceItems,cityItemsName); + }else if("weight".equals(flag)){ + pvOptions.setPicker(CommonDataUtil.weightList); + } + } + + /** + * 选择框选中事件 + * @param options1 + * @param options2 + * @param flag + */ + private void handleSelect(int options1, int options2, String flag) { + if("tv_demand_addressStr".equals(flag)){ + handleDemandAdr(options1,options2); + }else if("tv_myOrigo".equals(flag)){ + handleOrigo(options1,options2); + }else if("tv_addressStr".equals(flag)){ + handleAddress(options1,options2); + }else if("weight".equals(flag)){ + tv_myWeight.setText(CommonDataUtil.weightList.get(options1)); + } + } + + /** + * 处理选择框选居住地事件 + * @param options1 + * @param options2 + */ + private void handleAddress(int options1, int options2) { + String city = ""; + ProvinceBean proBean = provinceItems.get(options1); + Object obj = cityItems.get(options1).get(options2); + if(obj instanceof ProvinceBean.CityBean){ + ProvinceBean.CityBean cityBean = (ProvinceBean.CityBean) obj; + city = cityBean.getName(); + }else{ + ThridAreaBean bean = (ThridAreaBean) obj; + city = bean.getName(); + } + String province = proBean.getName(); + if(province.equals(city)){ + tv_addressStr.setText(province); + }else{ + tv_addressStr.setText(province+"-"+city); + } + } + + /** + * 处理选择框选籍贯事件 + * @param options1 + * @param options2 + */ + private void handleOrigo(int options1, int options2) { + String city = ""; + ProvinceBean proBean = provinceItems.get(options1); + Object obj = cityItems.get(options1).get(options2); + if(obj instanceof ProvinceBean.CityBean){ + ProvinceBean.CityBean cityBean = (ProvinceBean.CityBean) obj; + city = cityBean.getName(); + }else{ + ThridAreaBean bean = (ThridAreaBean) obj; + city = bean.getName(); + } + String province = proBean.getName(); + if(province.equals(city)){ + tv_myOrigo.setText(province); + }else{ + tv_myOrigo.setText(province+"-"+city); + } + } + + /** + * 选择择偶要求居住地地址 + * @param options1 + * @param options2 + */ + private void handleDemandAdr(int options1, int options2) { + String city = ""; + ProvinceBean proBean = provinceRqItems.get(options1); + Object obj = cityRqItems.get(options1).get(options2); + if(obj instanceof ProvinceBean.CityBean){ + ProvinceBean.CityBean cityBean = (ProvinceBean.CityBean) obj; + city = cityBean.getName(); + }else{ + ThridAreaBean bean = (ThridAreaBean) obj; + city = bean.getName(); + } + String province = proBean.getName(); + if(province.equals(city)){ + tv_demand_addressStr.setText(province); + }else{ + tv_demand_addressStr.setText(province+"-"+city); + } + } + + /** + * 设置选择框的title + * @param flag 标志位 + */ + private void setSelectTitle(String flag) { + if("tv_demand_addressStr".equals(flag)){ + selectTitle = "选择地区"; + }else if("live".equals(flag)){ + selectTitle = "选择居住地"; + }else if("age".equals(flag)){ + selectTitle = "选择年龄"; + }else if("height".equals(flag)){ + selectTitle = "选择身高"; + }else if ("degree".equals(flag)){ + selectTitle = "选择学历"; + }else if("income".equals(flag)){ + selectTitle = "选择收入"; + } + } + + /** + * 选择居住地 + */ + private void createDoubleWheel(final TextView addTv,final String flag) { + LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); +// if("tv_addressStr".equals(flag)){ +// mview = inflater.inflate(R.layout.popupwindow_selectcity, null); +// cityPicker = (CityPickerLayout) mview.findViewById(R.id.cityPicker); +// cityPicker.setWheelViewItemNumber(5); +// }else + if("tv_myOrigo".equals(flag)||"tv_addressStr".equals(flag)){ + mview = inflater.inflate(R.layout.layout_select_origo, null); + origoPicker = (OrigoPickerLayout) mview.findViewById(R.id.cityPicker); + origoPicker.setWheelViewItemNumber(5); + } + else if("tv_demand_addressStr".equals(flag)){ + mview = inflater.inflate(R.layout.layout_select_addressrq, null); + requestPicker = (CityRequestPickerLayout) mview.findViewById(R.id.cityPicker); + requestPicker.setWheelViewItemNumber(5); + } + final PopupWindow window = new PopupWindow(mview, + WindowManager.LayoutParams.MATCH_PARENT, + WindowManager.LayoutParams.MATCH_PARENT); + confirm_city = (TextView)mview.findViewById(R.id.confirm_city); + cancel_city = (TextView)mview.findViewById(R.id.cancel_city); + ll_cityblank = (LinearLayout) mview.findViewById(R.id.ll_cityblank); + // 设置popWindow弹出窗体可点击,这句话必须添加,并且是true + window.setFocusable(true); + // 实例化一个ColorDrawable颜色为半透明 + ColorDrawable dw = new ColorDrawable(0xb0000000); + window.setBackgroundDrawable(dw); + // 设置popWindow的显示和消失动画 + window.setAnimationStyle(R.style.mypopwindow_anim_style); + window.setClippingEnabled(false);//设置全屏 + // 在底部显示 + window.showAtLocation(mview,Gravity.BOTTOM, 0, 0); + //popWindow消失监听方法 + window.setOnDismissListener(new PopupWindow.OnDismissListener() { + @Override + public void onDismiss() { + window.dismiss(); + } + }); + confirm_city.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + String address = ""; + if("tv_addressStr".equals(flag)||"tv_myOrigo".equals(flag)){ + String province = origoPicker.getProvince(); + String city = origoPicker.getCity(); + address = province+" "+city; + } +// else if("tv_myOrigo".equals(flag)){ +// String province = origoPicker.getProvince(); +// String city = origoPicker.getCity(); +// if(province.equals(city)){ +// address = province; +// }else{ +// address = province + city; +// } +// } + else if("tv_demand_addressStr".equals(flag)){ + String province = requestPicker.getProvince(); + String city = requestPicker.getCity(); + if(getString(R.string.no_requirement).equals(province)){ + address = province; + }else{ + address = province +" "+city; + } + } + window.dismiss(); + addTv.setText(address); + } + }); + cancel_city.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + window.dismiss(); + } + }); + ll_cityblank.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + window.dismiss(); + } + }); + } + + /** + * 选择身高要求 + */ + private void createConditionWheel(final TextView heightTv) { + LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); + mview = inflater.inflate(R.layout.popupwindow_selectcondition, null); + conditionPicker = (ConditionPickerLayout) mview.findViewById(R.id.conditionPicker); + conditionPicker.setWheelViewItemNumber(5); + final PopupWindow window = new PopupWindow(mview, + WindowManager.LayoutParams.MATCH_PARENT, + WindowManager.LayoutParams.MATCH_PARENT); + confirm_condition = (TextView)mview.findViewById(R.id.confirm_condition); + cancel_condition = (TextView)mview.findViewById(R.id.cancel_condition); + ll_conditionblank = (LinearLayout) mview.findViewById(R.id.ll_conditionblank); + // 设置popWindow弹出窗体可点击,这句话必须添加,并且是true + window.setFocusable(true); + // 实例化一个ColorDrawable颜色为半透明 + ColorDrawable dw = new ColorDrawable(0xb0000000); + window.setBackgroundDrawable(dw); + // 设置popWindow的显示和消失动画 + window.setAnimationStyle(R.style.mypopwindow_anim_style); + window.setClippingEnabled(false);//设置全屏 + // 在底部显示 + window.showAtLocation(mview,Gravity.BOTTOM, 0, 0); + //popWindow消失监听方法 + window.setOnDismissListener(new PopupWindow.OnDismissListener() { + @Override + public void onDismiss() { + window.dismiss(); + } + }); + confirm_condition.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + String minheightrequesttemp = conditionPicker.getPre(); + String maxheightrequesttemp = conditionPicker.getNext(); + setHeightrq2View(minheightrequesttemp,maxheightrequesttemp,heightTv); + + window.dismiss(); + } + }); + cancel_condition.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + window.dismiss(); + } + }); + ll_conditionblank.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + window.dismiss(); + } + }); + } + + /** + * 选择年龄要求 + */ + private void createAgeWheel(final TextView agerqTv) { + LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); + mview = inflater.inflate(R.layout.popupwindow_selectagerq, null); + agerqPicker = (AgerqPickerLayout) mview.findViewById(R.id.agerqPicker); + agerqPicker.setWheelViewItemNumber(5); + final PopupWindow window = new PopupWindow(mview, + WindowManager.LayoutParams.MATCH_PARENT, + WindowManager.LayoutParams.MATCH_PARENT); + confirm_agerq = (TextView)mview.findViewById(R.id.confirm_agerq); + cancel_agerq = (TextView)mview.findViewById(R.id.cancel_agerq); + ll_agerqblank = (LinearLayout) mview.findViewById(R.id.ll_agerqblank); + // 设置popWindow弹出窗体可点击,这句话必须添加,并且是true + window.setFocusable(true); + // 实例化一个ColorDrawable颜色为半透明 + ColorDrawable dw = new ColorDrawable(0xb0000000); + window.setBackgroundDrawable(dw); + // 设置popWindow的显示和消失动画 + window.setAnimationStyle(R.style.mypopwindow_anim_style); + window.setClippingEnabled(false);//设置全屏 + // 在底部显示 + window.showAtLocation(mview,Gravity.BOTTOM, 0, 0); + //popWindow消失监听方法 + window.setOnDismissListener(new PopupWindow.OnDismissListener() { + @Override + public void onDismiss() { + window.dismiss(); + } + }); + confirm_agerq.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + String minagerequesttemp = agerqPicker.getPre(); + String maxagerequesttemp = agerqPicker.getNext(); + setAgerq2View(minagerequesttemp,maxagerequesttemp,agerqTv); + + window.dismiss(); + } + }); + cancel_agerq.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + window.dismiss(); + } + }); + ll_agerqblank.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + window.dismiss(); + } + }); + } + + /** + * 年龄要求设置 + * @param minagerequesttemp 最小年龄 + * @param maxagerequesttemp 最大年龄 + * @param agerqTv 需要写入的view + */ + private void setAgerq2View(String minagerequesttemp, String maxagerequesttemp, TextView agerqTv) { + if(TextUtils.isEmpty(minagerequesttemp)){ + agerqTv.setText("未填"); + return; + } + if("0".equals(minagerequesttemp)){ + minagerequest = "0"; + }else if("不限".equals(minagerequesttemp)||"-1".equals(minagerequesttemp)){ + minagerequest = "-1"; + }else{ + minagerequest = minagerequesttemp.substring(0,2); + } + if("0".equals(maxagerequesttemp)){ + maxagerequest = "0"; + }else if("不限".equals(maxagerequesttemp)||"-1".equals(maxagerequesttemp)){ + maxagerequest = "-1"; + }else{ + maxagerequest = maxagerequesttemp.substring(0,2); + } + if("0".equals(minagerequest)){ + }else if("-1".equals(minagerequest)&&"-1".equals(maxagerequest)){ + agerqTv.setText("不限"); + }else if("-1".equals(minagerequest)&&!"-1".equals(maxagerequest)){ + agerqTv.setText(maxagerequest+"岁以下"); + }else if(!"-1".equals(minagerequest)&&"-1".equals(maxagerequest)){ + agerqTv.setText(minagerequest+"岁以上"); + }else if(!"-1".equals(minagerequest)&&!"-1".equals(maxagerequest)&&!minagerequest.equals(maxagerequest)){ + agerqTv.setText(minagerequest+"~"+maxagerequest+"岁"); + }else if(!"0".equals(minagerequest)&&!"0".equals(maxagerequest)&&!"-1".equals(minagerequest)&&!"-1".equals(maxagerequest)&&minagerequest.equals(maxagerequest)){ + agerqTv.setText(minagerequest+"岁"); + } + } + + /** + * 身高要求设置 + * @param minheightrequesttemp 最小身高 + * @param maxheightrequesttemp 最大身高 + * @param heightTv 需要写入的view + */ + private void setHeightrq2View(String minheightrequesttemp, String maxheightrequesttemp,final TextView heightTv) { + if(TextUtils.isEmpty(minheightrequesttemp)){//如果这个是null,后面会报一系列空指针异常 + heightTv.setText("未填"); + return; + } + if("0".equals(minheightrequesttemp)){ + minheightrequest = "0"; + }else if("不限".equals(minheightrequesttemp)||"-1".equals(minheightrequesttemp)){ + minheightrequest = "-1"; + }else{ + minheightrequest = minheightrequesttemp.substring(0,3); + } + if("0".equals(maxheightrequesttemp)){ + maxheightrequest = "0"; + }else if("不限".equals(maxheightrequesttemp)||"-1".equals(maxheightrequesttemp)){ + maxheightrequest = "-1"; + }else{ + maxheightrequest = maxheightrequesttemp.substring(0,3); + } + if("0".equals(minheightrequest)){ + }else if("-1".equals(minheightrequest)&&"-1".equals(maxheightrequest)){ + heightTv.setText("不限"); + }else if("-1".equals(minheightrequest)&&!"-1".equals(maxheightrequest)){ + heightTv.setText(maxheightrequest+"cm以下"); + }else if(!"-1".equals(minheightrequest)&&"-1".equals(maxheightrequest)){ + heightTv.setText(minheightrequest+"cm以上"); + }else if(!"-1".equals(minheightrequest)&&!"-1".equals(maxheightrequest)&&!minheightrequest.equals(maxheightrequest)){ + heightTv.setText(minheightrequest+"~"+maxheightrequest+"cm"); + }else if(!"0".equals(minheightrequest)&&!"0".equals(maxheightrequest)&&!"-1".equals(minheightrequest)&&!"-1".equals(maxheightrequest)&&minheightrequest.equals(maxheightrequest)){ + heightTv.setText(minheightrequest+"cm"); + } + } + + /** + * 普通单选popwindow + * @param commonList datalist + */ + private void createSingleWheel(ArrayList commonList){ + LayoutInflater sexinflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); + mview = sexinflater.inflate(R.layout.popupwindow_commonnew, null); + if(commonwindow==null){ + commonwindow = new PopupWindow(mview, + WindowManager.LayoutParams.MATCH_PARENT, + WindowManager.LayoutParams.MATCH_PARENT); + } + comWv = (WheelView) mview.findViewById(R.id.wv_common); + cancel_common = (TextView) mview.findViewById(R.id.cancel_common); + confirm_common = (TextView) mview.findViewById(R.id.confirm_common); + ll_blank = (LinearLayout) mview.findViewById(R.id.ll_blank); + comWv.setData(commonList); + // 设置popWindow弹出窗体可点击,这句话必须添加,并且是true + commonwindow.setFocusable(true); + // 实例化一个ColorDrawable颜色为半透明 + ColorDrawable dw = new ColorDrawable(0xb0000000); + commonwindow.setBackgroundDrawable(dw); + // 设置popWindow的显示和消失动画 + commonwindow.setAnimationStyle(R.style.mypopwindow_anim_style); + commonwindow.setClippingEnabled(false);//设置全屏 + // 在底部显示 + commonwindow.showAtLocation(mview, Gravity.BOTTOM, 0, 0); + //popWindow消失监听方法 + commonwindow.setOnDismissListener(new PopupWindow.OnDismissListener() { + @Override + public void onDismiss() { + commonwindow.dismiss(); + commonwindow = null; + } + }); + cancel_common.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + commonwindow.dismiss(); + commonwindow = null; + } + }); + ll_blank.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + commonwindow.dismiss(); + commonwindow = null; + } + }); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if(requestCode==0x01&&resultCode==RESULT_OK){ + profession = data.getStringExtra("profession"); + tv_myProfession.setText(CommonDataUtil.professionMap.get(profession)); + } + } + + /** + * 提交信息进行保存(进行条件判断) + */ + private void saveMyInfo(){ + String saveInfoUrl = Constant.COMMON_URL + Interface.UPDATE_MYINFO_NEW; + school = tv_mySchool.getText().toString().trim(); + nikeName = tv_mynikeName.getText().toString().trim(); + String weightTemp = tv_myWeight.getText().toString().trim(); + if(!TextUtils.isEmpty(weightTemp)){ + weight =weightTemp.replace("kg","").trim(); + }else{ + weight = ""; + } +// name = tv_mynameStr.getText().toString().trim(); + birth = tv_birthStr.getText().toString().trim(); + liveaddress = tv_addressStr.getText().toString().trim(); + origo = tv_myOrigo.getText().toString().trim(); + liveaddressrq = tv_demand_addressStr.getText().toString().trim(); + + if("不限".equals(liveaddressrq)){ + liveaddressrq = "-1"; + } + if("baseinfo".equals(pageKind)){ + if(JqStrUtil.isEmpty(nikeName) || getString(R.string.not_input).equals(nikeName)){ + JqStrUtil.showToast(EditMyInfoActivity.this,getString(R.string.nikename_input_prompt)); + }else if(JqStrUtil.isEmpty(sexMap.get(sex)) || getString(R.string.not_input).equals(sexMap.get(sex))){ + JqStrUtil.showToast(EditMyInfoActivity.this,getString(R.string.sex_select_prompt)); + }else if(JqStrUtil.isEmpty(birth) || getString(R.string.not_input).equals(birth)){ + JqStrUtil.showToast(EditMyInfoActivity.this,getString(R.string.birthday_select_prompt)); + }else if(JqStrUtil.isEmpty(liveaddress) || getString(R.string.not_input).equals(liveaddress)){ + JqStrUtil.showToast(EditMyInfoActivity.this,getString(R.string.live_address_select_prompt)); + }if(JqStrUtil.isEmpty(nikeName)|| getString(R.string.not_input).equals(nikeName)){ + JqStrUtil.showToast(this,getString(R.string.nikename_input_prompt)); + }else if(!JqStrUtil.isNikeName(nikeName)){ + JqStrUtil.showToast(this,"昵称仅支持输入英文、汉字、数字及下划线"); + }else if(nikeName.length()>10){ + JqStrUtil.showToast(this,"昵称请输入不多于10个字符"); + }else { + requestServer(saveInfoUrl); + } + }else{ + requestServer(saveInfoUrl); + } + } + + /** + * 将数据提交到服务器 + * @param saveInfoUrl 服务器接口url + */ + private void requestServer(String saveInfoUrl) { + JSONObject paramObj = new JSONObject(); + paramObj.put("userid",userid); + paramObj.put("version",Constant.VERSION); + paramObj.put("nickname",nikeName); + paramObj.put("school",school); + paramObj.put("weight",weight); + paramObj.put("birthday",birth); + paramObj.put("sex",sex); + paramObj.put("degree",degree); + paramObj.put("origo",origo); + paramObj.put("nation",nation); + paramObj.put("income",income); + paramObj.put("height",height); + paramObj.put("marrige",marriage); + paramObj.put("localplace",liveaddress); + paramObj.put("ifhouse", house); + paramObj.put("ifcar", car); + paramObj.put("minheightrequest", minheightrequest); + paramObj.put("maxheightrequest", maxheightrequest); + paramObj.put("minagerequest", minagerequest); + paramObj.put("maxagerequest", maxagerequest); + paramObj.put("incomerequest", incomerq); + paramObj.put("degreerequest", degreerq); + paramObj.put("locationrequest", liveaddressrq); + paramObj.put("houserequest", houserq); + paramObj.put("carrequest", carrq); + paramObj.put("profession", profession); + paramObj.put("version",Constant.VERSION); + String param = JSON.toJSONString(paramObj); + Log.d(TAG, "saveMyInfo: param" + param); + okHttpUtil.sendJsonStrByPostAsync(EditMyInfoActivity.this, true, saveInfoUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if ("1".equals(rsCode)) { + if(MyInfoActivity.instance!=null){ + MyInfoActivity.instance.refresh(); + } + finish(); + }else{ + JqStrUtil.showToast(EditMyInfoActivity.this, explanation); + } + } + }, null); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/EditSingleActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/EditSingleActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..76f66b7da6730bc8b61f620417c42433c106cbb4 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/EditSingleActivity.java @@ -0,0 +1,82 @@ +package com.jiuqi.elove.activity; + +import android.content.Intent; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.widget.ClearEditText; + +import butterknife.BindView; +import butterknife.OnClick; + +public class EditSingleActivity extends ABaseActivity { + + @BindView(R.id.et) + ClearEditText et; + @BindView(R.id.tv_right) + TextView tv_right; + @BindView(R.id.rl_right_tv) + RelativeLayout rl_right_tv; + + private String title; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getDataFromPre(); + setContentView(R.layout.activity_edit_single,title); + initView(); + } + + private void initView() { + tv_right.setText("确定"); + rl_right_tv.setVisibility(View.VISIBLE); + if("编辑昵称".equals(title)){ + et.setHint("请输入昵称"); + } + } + + @OnClick(R.id.rl_right_tv) + public void onClick(View view){ + switch (view.getId()){ + case R.id.rl_right_tv: + setResult2Pre(); + break; + } + } + + private void setResult2Pre() { + String result = et.getText().toString().trim(); + if("编辑昵称".equals(title)){ + if(JqStrUtil.isEmpty(result)){ + JqStrUtil.showToast(this,getString(R.string.nikename_input_prompt)); + return; + }else if(!JqStrUtil.isNikeName(result)){ + JqStrUtil.showToast(this,"昵称仅支持输入英文、汉字、数字及下划线"); + return; + }else if(result.length()>10){ + JqStrUtil.showToast(this,"昵称请输入不多于10个字符"); + return; + } + }else if(TextUtils.isEmpty(result)){ + showToast("请输入内容再提交"); + return; + } + Intent intent = new Intent(); + intent.putExtra("result",result); + setResult(RESULT_OK,intent); + finish(); + } + + /** + * 获取数据 + */ + private void getDataFromPre() { + title = getIntent().getStringExtra("title"); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/EloveShareCommentViewActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/EloveShareCommentViewActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..0f15ecf2739be93de00d1554c7df28d8f1f32f69 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/EloveShareCommentViewActivity.java @@ -0,0 +1,148 @@ +package com.jiuqi.elove.activity; + +import android.content.Intent; +import android.os.Bundle; +import android.support.v7.widget.Toolbar; +import android.view.View; +import android.widget.ImageView; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.baoyz.actionsheet.ActionSheet; +import com.gyf.barlibrary.ImmersionBar; +import com.jiuqi.elove.R; +import com.jiuqi.elove.util.SupportMultiScreenUtil; +import com.stonesun.newssdk.NewsAgent; +import com.stonesun.newssdk.activity.ShareContentViewActivity; + +import org.json.JSONException; +import org.json.JSONObject; + +public class EloveShareCommentViewActivity extends ShareContentViewActivity implements ActionSheet.ActionSheetListener{ + + /** + * 控件 + */ + protected Toolbar toolbar; + protected TextView toolbar_title; + protected View rootView; + private ImageView iv_right; + private RelativeLayout rl_right; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_elove_share_comment_view); + supportMultiScreen();//多屏幕适配 + setUpToolbar(); + ImmersionBar.with(this).statusBarColor(R.color.login_register).fitsSystemWindows(true).keyboardEnable(true).init(); + //必须调用 + initInfos(); + } + + + /** + * 多屏幕适配 + */ + private void supportMultiScreen() { + rootView = findViewById(android.R.id.content); + SupportMultiScreenUtil.scale(rootView); + } + + /** + * 设置toolbar + */ + protected void setUpToolbar() { + toolbar = (Toolbar) findViewById(R.id.toolbar); + toolbar_title = (TextView) findViewById(R.id.toolbar_title); + iv_right = (ImageView) findViewById(R.id.iv_right); + rl_right = (RelativeLayout) findViewById(R.id.rl_right); + iv_right.setImageResource(R.drawable.icon_more_white); + toolbar.setNavigationIcon(R.drawable.icon_leftarrow_w); + toolbar.setNavigationOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + finish(); + } + }); + rl_right.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + showActionSheet(); + } + }); + } + + @Override + public void onDestroy() { + super.onDestroy(); + ImmersionBar.with(this).destroy();//不调用该方法,如果界面bar发生改变,在不关闭app的情况下,退出此界面再进入将记忆最后一次bar改变的状态 + } + + /** + * 打开更多面板 + */ + private void showActionSheet() { + setTheme(R.style.ActionSheetStyleiOS7); + ActionSheet.createBuilder(this, getSupportFragmentManager()) + .setCancelButtonTitle(getString(R.string.cancel)) + .setOtherButtonTitles("我的收藏") + .setCancelableOnTouchOutside(true).setListener(this).show(); + } + + @Override + public void onOtherButtonClick(ActionSheet actionSheet, int index) { + switch (index){ + case 0://举报 + goCollectPage(); + break; + default: + break; + } + } + + @Override + public void onDismiss(ActionSheet actionSheet, boolean isCancel) { + + } + + /** + * 进入收藏页 + */ + private void goCollectPage() { + Intent intent=new Intent(this, ZXCollectViewActivity.class); + startActivity(intent); + } + + //方法的执行在onCreate之后 + @Override + public void onLoaded(final JSONObject json) { + if(json!=null){ + // 自定义导航类 + String title =null; + String fmedia=null; + if ("NEWSSDK".equals(NewsAgent.sdk_type)){ + if (json != null) { + try { + fmedia = json.getString("fmedia"); + title = json.getString("title");//标题 + //获取评论数量 + //getCommentsNums(); + } catch (JSONException e) { + e.printStackTrace(); + }finally { + final String finalFmedia = title; + runOnUiThread(new Runnable() { + @Override + public void run() { + //标题 + toolbar_title.setText(finalFmedia); + } + }); + } + } + } + } + super.onLoaded(json); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/EmailAuthActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/EmailAuthActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..6c631a0691cca99e41a37834259f50c928e21053 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/EmailAuthActivity.java @@ -0,0 +1,167 @@ +package com.jiuqi.elove.activity; + +import android.content.SharedPreferences; +import android.os.Bundle; +import android.view.View; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.TextView; + +import com.alibaba.fastjson.JSONObject; +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.common.JqBaseActivity; +import com.jiuqi.elove.entity.AuthAllModel; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; + +public class EmailAuthActivity extends JqBaseActivity { + + /** + * 控件 + */ + private TextView tvTitle; + private ImageView ivRight; + private EditText et_name; + private EditText et_idcard; + private TextView tv_submit; + private TextView email_promt; + private TextView tv_modify; + /** + *数据 + */ + private String userId; + private AuthAllModel model; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_email_auth); + getDataFromSp(); + initView(); + initData2View(); + setEvents(); + } + + private void getDataFromSp() { + userId = SpUtils.getString(Constant.USER_ID); + model = (AuthAllModel) getIntent().getSerializableExtra("model"); + } + + + private void initView() { + tvTitle = easyFind(R.id.tvTitle); + ivRight = easyFind(R.id.img_rightBtn); + et_name = easyFind(R.id.et_name); + et_idcard = easyFind(R.id.et_idcard); + tv_submit = easyFind(R.id.tv_submit); + email_promt = easyFind(R.id.email_promt); + tv_modify = easyFind(R.id.tv_modify); + tv_modify.setVisibility(View.GONE);//默认修改按钮隐藏,暴露提交按钮 + tvTitle.setText("邮箱认证"); + ivRight.setImageResource(R.drawable.icon_delete); + ivRight.setVisibility(View.VISIBLE); + } + + private void initData2View() { + if(model!=null){ + String email = model.getEmail().trim(); + String name = model.getName().trim(); + if(Constant.EMAIL_IS.equals(model.getEmailtype())||Constant.EMAIL_ING.equals(model.getEmailtype())){ + if(!JqStrUtil.isEmpty(email)){ + et_idcard.setEnabled(false); + et_idcard.setText(email); + et_idcard.setSelection(email.length()); + tv_modify.setVisibility(View.VISIBLE); + tv_submit.setVisibility(View.GONE); + } + if(!JqStrUtil.isEmpty(name)){ + et_name.setEnabled(false); + et_name.setText(name); + et_name.setSelection(name.length()); + } + }else{ + if(!JqStrUtil.isEmpty(name)){ + et_name.setText(name); + et_name.setSelection(name.length()); + } + } + if(Constant.EMAIL_IS.equals(model.getEmailtype())){ + email_promt.setVisibility(View.GONE); + }else if(Constant.EMAIL_ING.equals(model.getEmailtype())){ + email_promt.setVisibility(View.VISIBLE); + email_promt.setText(R.string.email_auth_finish); + email_promt.setTextColor(getResources().getColor(R.color.gray)); + } + } + } + + private void setEvents() { + ivRight.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + finish(); + } + }); + tv_submit.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + submitEmail(); + } + }); + tv_modify.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + et_name.setEnabled(true); + et_idcard.setEnabled(true); + tv_modify.setVisibility(View.GONE); + tv_submit.setVisibility(View.VISIBLE); + email_promt.setText(R.string.email_auth_prompt); + email_promt.setTextColor(getResources().getColor(R.color.orange)); + } + }); + } + + /** + * 提交邮箱验证 + */ + private void submitEmail() { + String emailAuthUrl = Constant.COMMON_URL + Interface.AUTHENTICATE_EMAIL_NEW; + String name = et_name.getText().toString().trim(); + String email = et_idcard.getText().toString().trim(); + if(!JqStrUtil.isChinese(name)){ + JqStrUtil.showToast(this,"请输入中文名字"); + return; + } + if(!JqStrUtil.isEmail(email)){ + JqStrUtil.showToast(this,"请输入合法的邮箱"); + return; + } + JSONObject obj = new JSONObject(); + obj.put("name",name); + obj.put("email",email); + obj.put("userID",userId); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, true, emailAuthUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if("1".equals(rsCode)){ + email_promt.setVisibility(View.VISIBLE); + email_promt.setText(R.string.email_auth_finish); + email_promt.setTextColor(getResources().getColor(R.color.gray)); + tv_modify.setVisibility(View.VISIBLE); + tv_submit.setVisibility(View.GONE); + et_name.setEnabled(false); + et_idcard.setEnabled(false); + }else{ + JqStrUtil.showToast(EmailAuthActivity.this,explanation); + } + } + },null); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/FeedBackActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/FeedBackActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..706fca5b1886a7b1273a34b5836531c4c5355011 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/FeedBackActivity.java @@ -0,0 +1,365 @@ +package com.jiuqi.elove.activity; + +import android.Manifest; +import android.app.Activity; +import android.content.Intent; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.database.Cursor; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.os.Environment; +import android.provider.MediaStore; +import android.support.v4.content.FileProvider; +import android.text.Editable; +import android.text.TextWatcher; +import android.util.Log; +import android.view.View; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.RelativeLayout; +import android.widget.TextView; +import com.alibaba.fastjson.JSONObject; +import com.baoyz.actionsheet.ActionSheet; +import com.bumptech.glide.Glide; +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.common.PermissionListener; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; +import com.jiuqi.elove.util.UploadAliUtil; +import com.jiuqi.elove.widget.dialog.LoadingDialog; + +import java.io.File; +import java.io.IOException; +import java.util.List; + +import butterknife.BindView; +import butterknife.OnClick; +import okhttp3.MediaType; + +/** + * 意见反馈页面 + * Created by dl on 2016/7/5. + */ +public class FeedBackActivity extends ABaseActivity implements ActionSheet.ActionSheetListener{ + + private static final String TAG = "FeedBackActivity"; + public static final String PROVIDER_IMG = "com.jiuqi.elove.fileprovider"; + private static final String IMG_PATH = "/elove";//调用系统相机拍摄后图片保存路径 + private static final int PHOTO_REQUEST_GALLERY = 0x02;// 从相册中选择 + private static final int PHOTO_REQUEST_TAKEPHOTO = 0x01;// 拍照 + /** + * 控件 + */ + @BindView(R.id.iv_addImg) + ImageView iv_addImg;//意见反馈的图片 + @BindView(R.id.edt_feedback) + EditText edt_feedback;//意见反馈的内容 + @BindView(R.id.tv_right) + TextView tv_right; + @BindView(R.id.rl_right_tv) + RelativeLayout rl_right_tv; + @BindView(R.id.txt_num) + TextView txt_num;//用来显示剩余字数 + /** + * 变量 + */ + private String userId; + private int num = 200;//限制的最大字数 + private String dirPath;//图片的路径 + private Uri imgUri= null; + private String feedbackContent;//意见内容 + private String key = ""; + private boolean isAdd = true; + /** + * 工具 + */ + private UploadAliUtil uploadAliUtil; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_feedback,R.string.feedback); + getDataFromSp(); + initViewAndData(); + initEvents(); + } + + /** + * 从缓存中获取数据 + */ + private void getDataFromSp() { + userId = SpUtils.getString(Constant.USER_ID); + } + + private void initViewAndData() { + tv_right.setText(getResources().getString(R.string.feedback_commit)); + rl_right_tv.setVisibility(View.VISIBLE); + txt_num.setText(String.valueOf(num)); + //下面这句指定调用相机拍照后的照片存储的路径 + String temPhonename = System.currentTimeMillis() + ".jpg"; + dirPath = Environment.getExternalStorageDirectory() + IMG_PATH+temPhonename; + } + + private void initEvents(){ + edt_feedback.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + } + + @Override + public void afterTextChanged(Editable s) { + int number = num - s.length(); + txt_num.setText(String.valueOf(number)); + } + }); + } + + @OnClick({R.id.rl_right_tv,R.id.iv_addImg}) + public void OnClick(View view){ + switch (view.getId()){ + case R.id.rl_right_tv: + uploadPicOrFeedBack(); + break; + case R.id.iv_addImg: + selectImgAndShow(); + break; + } + } + + /** + * 选择一张图片并生成待上传的文件且直接展示给用户预览 + */ + private void selectImgAndShow() { + if (isAdd) { + checkPermissionAndShow(); + }else{ + iv_addImg.setImageResource(R.drawable.icon_add_with_border); + isAdd = true; + } + } + + /** + * 将反馈意见(文字或者文字图片的合集)交给服务器端保存 + */ + private void uploadPicOrFeedBack() { + feedbackContent = edt_feedback.getText().toString().trim(); + File f = new File(dirPath); + if((JqStrUtil.isEmpty(feedbackContent) || feedbackContent.length()<10 ) && !f.exists()){ + JqStrUtil.showToast(this,getString(R.string.feedback_morecontent)); + }else{ + if(f.exists()){//如果图片存在,则先上传图片在将所有的反馈意见上传至服务器端 + uploadPerPicMethod(); + }else {//如果不存在图片,则直接将反馈意见上传到服务器 + uploadMyServer(); + } + } + } + + /** + * 检查并且申请获取权限,以及获取权限之后的选择图片 + */ + private void checkPermissionAndShow() { + requestRuntimePermission(new String[]{Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE}, new PermissionListener() { + @Override + public void onGranted() { + showActionSheet(); + } + + @Override + public void onDenied(List deniedPermission) { + + } + }); + } + + /** + * 将反馈意见上传至服务器端 + */ + private void uploadMyServer() { + String getPwdUrl = Constant.COMMON_URL + Interface.SUBMIT_FEEDBACK; + String version = getVersion();//软件版本 + String phonetype = android.os.Build.MODEL; + String phoneversion = android.os.Build.VERSION.RELEASE; + JSONObject obj = new JSONObject(); + obj.put("userID",userId); + obj.put("phonetype",phonetype);//机型 + obj.put("phoneversion",phoneversion);//手机系统版本 + obj.put("version",version);//软件版本 + obj.put("version_up",Constant.VERSION);//软件版本 + obj.put("idea",feedbackContent); + obj.put("ideaphoto",key); + String param = obj.toJSONString(); + Log.d(TAG, "FeedBackActivity: param"+param); + okHttpUtil.sendJsonStrByPostAsync(FeedBackActivity.this,true,getPwdUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String retCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if("1".equals(retCode)){ + finish(); + } + JqStrUtil.showToast(FeedBackActivity.this,explanation); + } + },null); + } + + private String getVersion(){ + PackageManager manager = this.getPackageManager(); + PackageInfo info = null; + try { + info = manager.getPackageInfo(getPackageName(), 0); + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + } + String version = info.versionName; + return version; + } + /** + * 弹出框展现和消失 + */ + public void showActionSheet() { + setTheme(R.style.ActionSheetStyleiOS7); + ActionSheet.createBuilder(FeedBackActivity.this, getSupportFragmentManager()) + .setCancelButtonTitle("取消") + .setOtherButtonTitles("拍照", "相册") + .setCancelableOnTouchOutside(true).setListener(this).show(); + } + public void onDismiss(ActionSheet actionSheet, boolean isCancel) { + + } + + + /** + * 选择调用系统相机和相册方式来上传图片 + * @param actionSheet + * @param index + */ + @Override + public void onOtherButtonClick(ActionSheet actionSheet, int index) { + switch (index) { + case 0://调用系统相机 + File avatarFile = new File(dirPath); + try { + avatarFile.createNewFile(); + } catch (IOException e) { + e.printStackTrace(); + } + if(Build.VERSION.SDK_INT>=24){ + imgUri = FileProvider.getUriForFile(this,PROVIDER_IMG,avatarFile); + }else{ + imgUri = Uri.fromFile(avatarFile); + } + Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); + intent.putExtra(MediaStore.EXTRA_OUTPUT,imgUri); + startActivityForResult(intent, PHOTO_REQUEST_TAKEPHOTO); + break; + case 1: + Intent intentPhoto = new Intent(Intent.ACTION_PICK, null); + intentPhoto.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); + startActivityForResult(intentPhoto,PHOTO_REQUEST_GALLERY); + break; + default: + break; + } + } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if(resultCode== Activity.RESULT_OK){ + switch (requestCode){ + case PHOTO_REQUEST_TAKEPHOTO:// 当选择拍照时调用 + if(imgUri!=null){ + Glide.with(FeedBackActivity.this).load(dirPath).into(iv_addImg); + isAdd = false; + } + break; + case PHOTO_REQUEST_GALLERY:// 当选择从本地获取图片时 + if (data != null) { + Uri uri = data.getData(); + if (!JqStrUtil.isEmpty(uri.getAuthority())) { + Cursor cursor = getContentResolver().query(uri, + new String[] { MediaStore.Images.Media.DATA }, + null, null, null); + if (null == cursor) { + JqStrUtil.showToast(FeedBackActivity.this,"图片没找到"); + return; + } + cursor.moveToFirst(); + String path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA)); + cursor.close(); + dirPath = path; + Glide.with(FeedBackActivity.this).load(dirPath).into(iv_addImg); + isAdd = false; + } + } + break; + default: + break; + } + } + + } + + /** + * 上传图片的方法入口 + */ + private void uploadPerPicMethod() { + uploadAliUtil = new UploadAliUtil(this); + uploadAliUtil.setCompletePutAli(new UploadAliUtil.OnCompletePutAli() { + @Override + public void onFailure() { + + } + + @Override + public void onSuccess() { + runOnUiThread(new Runnable() { + @Override + public void run() { + uploadMyServer();//调用服务器端接口,来实现 + } + }); + } + }); + uploadAliUtil.setAliInterface(new UploadAliUtil.OnUpLoadAli() { + @Override + public void upLoadHandle(JSONObject obj, final byte[] bytes, String param) { + String rsCode = obj.getString("retcode"); + key = obj.getString("key");//调用接口时的filePath + if ("1".equals(rsCode)) { + final String putaliUrl = obj.getString("url");//put阿里云的路径 + new Runnable(){ + @Override + public void run() { + try { + uploadAliUtil.put(MediaType.parse(""), putaliUrl, bytes);//上传到阿里云地址下 + } catch (IOException e) { + e.printStackTrace(); + } + } + }.run(); + + }else if("0".equals(rsCode)){//文件已存在,无需上传到阿里云服务器 + uploadMyServer();//调用服务器端接口,来实现 + } + } + }); + uploadAliUtil.uploadFile2Ali(dirPath,Constant.PUT_PIC_ACTION); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + LoadingDialog.cancelDialog(); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/FindContactResultActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/FindContactResultActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..62cd3b7a8deaa58607cae200ef0bd1ae13324511 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/FindContactResultActivity.java @@ -0,0 +1,145 @@ +package com.jiuqi.elove.activity; + +import android.content.Intent; +import android.os.Bundle; +import android.support.v4.app.FragmentActivity; +import android.util.Log; +import android.view.View; +import android.view.Window; +import android.widget.ImageView; +import android.widget.ListView; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.jiuqi.elove.R; +import com.jiuqi.elove.adapter.FindContactAdapter; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.common.JqBaseActivity; +import com.jiuqi.elove.entity.FindContactPersonModel; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.widget.pulltorefresh.PullToRefreshLayout; + +import java.util.ArrayList; +import java.util.List; + +public class FindContactResultActivity extends JqBaseActivity implements PullToRefreshLayout.OnRefreshListener{ + + private static final String TAG = "FindResultActivity"; + + /** + * 控件 + */ + private TextView tvTitle; + private ImageView tvBack; + private ListView listview; + private RelativeLayout rlay_nodata; + private PullToRefreshLayout likeRefresh; + + /** + * 数据 + */ + private List list; + private List listAdd; + private int pageNo = 1; + private int pageSize = 10; + + + /** + * 工具 + */ + private FindContactAdapter adapter; + private Boolean isshow = true; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_find_contact_result); + getData(); + initView(); + listAdd = new ArrayList<>(); + adapter = new FindContactAdapter(this); + listview.setAdapter(adapter); + initEvents(); + } + + private void initEvents() { + tvBack.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + finish(); + } + }); + likeRefresh.setOnRefreshListener(this); + } + + private void initView() { + rlay_nodata = easyFind(R.id.rlay_nodata); + likeRefresh = easyFind(R.id.likeRefreshView); + tvTitle = easyFind(R.id.tvTitle); + tvBack = easyFind(R.id.img_leftBtn); + listview = easyFind(R.id.lv_findcontact); + tvTitle.setText(getResources().getString(R.string.searchcontact_result)); + tvBack.setVisibility(View.VISIBLE); + } + + private void getData() { + Intent intent = getIntent(); + String localplace =intent.getStringExtra("localplace"); + String qiyuanid = intent.getStringExtra("IDNum"); + String findUrl = Constant.COMMON_URL + Interface.CONTACT_FIND; + JSONObject obj = new JSONObject(); + obj.put("localplace",localplace); + obj.put("IDNum",qiyuanid); + obj.put("version",Constant.VERSION); + obj.put("page",pageNo); + obj.put("pagesize",pageSize); + String param = JSON.toJSONString(obj); + Log.d(TAG, "initParam: "+param); + okHttpUtil.sendJsonStrByPostAsync(FindContactResultActivity.this,isshow,findUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + if("1".equals(rsCode)){ + Log.d(TAG, "onResponse: "+jsonObject); + String result = jsonObject.getString("message"); + list = JSON.parseArray(result,FindContactPersonModel.class); + if(pageNo==1&&list.size()<=0){ + rlay_nodata.setVisibility(View.VISIBLE); + }else{ + rlay_nodata.setVisibility(View.GONE); + if(list.size()<=0){ + likeRefresh.loadmoreFinish(PullToRefreshLayout.SUC_NODATA); + }else{ + listAdd.addAll(list); + adapter.updateListView(listAdd); + if(1==pageNo){//第一页且有数据为刷新 + likeRefresh.refreshFinish(PullToRefreshLayout.SUCCEED); + }else{//非第一页且有数据为加载,加载成功不必悬停 + likeRefresh.refreshFinish(PullToRefreshLayout.SUCCEED); + } + } + } + } + } + },null); + } + + @Override + public void onRefresh(PullToRefreshLayout pullToRefreshLayout) { + // 下拉刷新操作 + listAdd = new ArrayList<>(); + pageNo = 1; + isshow = false; + getData(); + } + + @Override + public void onLoadMore(PullToRefreshLayout pullToRefreshLayout) { + ++pageNo; + isshow = false; + getData(); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/FindPersonConditionActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/FindPersonConditionActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..71ce4e7e49491641bc85181ad8bb45b702884ac5 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/FindPersonConditionActivity.java @@ -0,0 +1,186 @@ +package com.jiuqi.elove.activity; + +import android.content.Context; +import android.content.Intent; +import android.graphics.drawable.ColorDrawable; +import android.os.Bundle; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.WindowManager; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.PopupWindow; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.bigkoo.pickerview.OptionsPickerView; +import com.jiuqi.elove.R; +import com.jiuqi.elove.application.EloveApplication; +import com.jiuqi.elove.common.CommonDataUtil; +import com.jiuqi.elove.common.JqBaseActivity; +import com.jiuqi.elove.entity.ProvinceBean; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.PickerUtil; +import com.jiuqi.elove.widget.OrigoPickerLayout; + +import java.util.List; + +public class FindPersonConditionActivity extends JqBaseActivity implements View.OnClickListener{ + + private static final String TAG = "FindActivity"; + + /** + * 顶部菜单栏 + */ + private TextView tvTitle; + private ImageView tvBack; + private TextView tvSure; + private EditText et_qiyuanid; + private RelativeLayout rl_liveaddress; + private TextView tv_addressStr; + + /** + * 数据 + */ + private String address; + private List provinceItems;//省份list + private List> cityItems;//省份城市 + private List> cityItemsName;//省份城市 + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_find_person_condition); + initView(); + initData(); + initEvents(); + } + + private void initData() { + provinceItems = EloveApplication.provinceItems; + cityItems = EloveApplication.province_city_or_area; + cityItemsName = EloveApplication.province_city_or_area_name; + } + + private void initView() { + tvTitle = easyFind(R.id.tvTitle); + tvBack = easyFind(R.id.img_leftBtn); + tvSure = (TextView) findViewById(R.id.tvMore); + tvTitle.setText(getResources().getString(R.string.find_person)); + tvSure.setText(getResources().getString(R.string.sure)); + tvBack.setVisibility(View.VISIBLE); + tvSure.setVisibility(View.VISIBLE); + et_qiyuanid = easyFind(R.id.et_qiyuanid); + rl_liveaddress = easyFind(R.id.rl_liveaddress); + tv_addressStr = easyFind(R.id.tv_addressStr); + } + private void initEvents() { + tvBack.setOnClickListener(this); + tvSure.setOnClickListener(this); + rl_liveaddress.setOnClickListener(this); + } + + @Override + public void onClick(View view) { + switch (view.getId()){ + case R.id.img_leftBtn: + finish(); + break; + case R.id.tvMore: + findPerson(); + break; + case R.id.rl_liveaddress: + showPicker(); +// createDoubleWheel(tv_addressStr); + break; + default: + break; + } + } + + private void showPicker() { + new PickerUtil(this).setCreateOptionPicker("", new OptionsPickerView.OnOptionsSelectListener() { + @Override + public void onOptionsSelect(int options1, int options2, int options3, View v) { + ProvinceBean bean = provinceItems.get(options1); + Object obj = cityItems.get(options1).get(options2); + if(obj instanceof ProvinceBean.CityBean){ + address = ((ProvinceBean.CityBean)obj).getName(); + tv_addressStr.setText(bean.getName()+" "+address); + }else{ + address = bean.getName(); + tv_addressStr.setText(bean.getName()); + } + } + }).setSecondaryAddress(provinceItems, cityItemsName).show(); + } + + private void findPerson() { + String qiyuanid = et_qiyuanid.getText().toString().trim(); + if(JqStrUtil.isEmpty(address)&&JqStrUtil.isEmpty(qiyuanid)){ + JqStrUtil.showToast(FindPersonConditionActivity.this,getResources().getString(R.string.atleast_onecondition)); + return; + } + Intent intent = new Intent(FindPersonConditionActivity.this,FindContactResultActivity.class); + intent.putExtra("localplace",address); + intent.putExtra("IDNum",qiyuanid); + startActivity(intent); + } + + /** + * 选择居住地 + */ + private void createDoubleWheel(final TextView addTv) { + LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); + View mview = inflater.inflate(R.layout.layout_select_origo, null); + final OrigoPickerLayout origoPicker = (OrigoPickerLayout) mview.findViewById(R.id.cityPicker); + origoPicker.setWheelViewItemNumber(5); +// } + final PopupWindow window = new PopupWindow(mview, + WindowManager.LayoutParams.MATCH_PARENT, + WindowManager.LayoutParams.MATCH_PARENT); + TextView confirm_city = (TextView)mview.findViewById(R.id.confirm_city); + TextView cancel_city = (TextView)mview.findViewById(R.id.cancel_city); + LinearLayout ll_cityblank = (LinearLayout) mview.findViewById(R.id.ll_cityblank); + // 设置popWindow弹出窗体可点击,这句话必须添加,并且是true + window.setFocusable(true); + // 实例化一个ColorDrawable颜色为半透明 + ColorDrawable dw = new ColorDrawable(0xb0000000); + window.setBackgroundDrawable(dw); + // 设置popWindow的显示和消失动画 + window.setAnimationStyle(R.style.mypopwindow_anim_style); + // 在底部显示 + window.showAtLocation(mview, Gravity.BOTTOM, 0, 0); + //popWindow消失监听方法 + window.setOnDismissListener(new PopupWindow.OnDismissListener() { + @Override + public void onDismiss() { + window.dismiss(); + } + }); + confirm_city.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + String province = origoPicker.getProvince(); + String city = origoPicker.getCity(); + address = city; + window.dismiss(); + addTv.setText(province +" "+city); + } + }); + cancel_city.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + window.dismiss(); + } + }); + ll_cityblank.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + window.dismiss(); + } + }); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/FindYoursHerActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/FindYoursHerActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..b0faebad59210ecb0ec85feb2f2b272d6aa12a14 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/FindYoursHerActivity.java @@ -0,0 +1,175 @@ +package com.jiuqi.elove.activity; + +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ImageView; +import android.widget.ListView; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.jiuqi.elove.R; +import com.jiuqi.elove.adapter.RecommendAdapter; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.common.JqBaseActivity; +import com.jiuqi.elove.entity.RecommendUserInfoModel; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.widget.pulltorefresh.PullToRefreshLayout; + +import java.util.ArrayList; +import java.util.List; + +public class FindYoursHerActivity extends JqBaseActivity { + private static final String TAG = "FindYoursHerActivity"; + /** + * 控件 + */ + private TextView tvTitle; + private ImageView ivBack; + private PullToRefreshLayout recommendRefresh; + private ListView recommendList; + private RelativeLayout rlay_nodata; + + /** + * 数据 + */ + private String userid; + private int kind; + private String ifac; + private List mlist; + private List mlistAdd; + private RecommendUserInfoModel recommendUserInfoModel; + /** + * 工具 + */ + private RecommendAdapter recommendAdapter; + private int pageNo = 1; + private int pageSize = 10; + private boolean isshow = true; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_find_yours_her); + initView(); + getDataFromSp(); + recommendAdapter = new RecommendAdapter(this); + recommendList.setAdapter(recommendAdapter); + mlistAdd = new ArrayList<>(); + pageNo = 1; + getDataFromServer(); + setEvent(); + } + + private void getDataFromSp() { + SharedPreferences sp = getSharedPreferences("elove",MODE_PRIVATE); + userid = sp.getString("userid",""); + kind = sp.getInt("kind",1000); + ifac = sp.getString("ifac",""); + } + + private void getDataFromServer() { + String getMatchUrl = Constant.COMMON_URL + Interface.VIEW_EMOTIONMATCH; + JSONObject obj = new JSONObject(); + obj.put("userID",userid); + obj.put("version",Constant.VERSION); + obj.put("page",pageNo); + obj.put("pagesize",pageSize); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(FindYoursHerActivity.this, isshow, getMatchUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + if("1".equals(rsCode)){ + String jsonString = jsonObject.getString("message"); + Log.d(TAG, "onResponse: "+jsonString); + mlist = JSON.parseArray(jsonString,RecommendUserInfoModel.class); + mlistAdd.addAll(mlist); + if(mlistAdd.size()<=0){ + rlay_nodata.setVisibility(View.VISIBLE); + }else { + rlay_nodata.setVisibility(View.GONE); + recommendAdapter.updateListView(mlistAdd); + if(1==pageNo){//第一页且有数据为刷新 + recommendRefresh.refreshFinish(PullToRefreshLayout.SUCCEED); + }else{//非第一页且有数据为加载(主要是有一个加载成功并且停顿的效果,大多数软件其实没有停顿,暂时不停顿处理) +// recommendRefresh.loadmoreFinish(PullToRefreshLayout.SUCCEED); + recommendRefresh.refreshFinish(PullToRefreshLayout.SUCCEED); + } + } + } + if("114".equals(rsCode)){ + if(mlistAdd.size()<=0){ + rlay_nodata.setVisibility(View.VISIBLE); + } + recommendRefresh.loadmoreFinish(PullToRefreshLayout.SUC_NODATA); + } + } + },null); + } + + private void initView() { + tvTitle = easyFind(R.id.tvTitle); + ivBack = easyFind(R.id.img_leftBtn); + ivBack.setVisibility(View.VISIBLE); + tvTitle.setText("我的TA"); + rlay_nodata = easyFind(R.id.rlay_nodata); + recommendRefresh = easyFind(R.id.recommendRefreshView); + recommendList = easyFind(R.id.recommendListView); + } + + private void setEvent() { + ivBack.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + finish(); + } + }); + + recommendRefresh.setOnRefreshListener(new RecommendListener()); + recommendList.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + if(mlistAdd.size()<=0){ + return; + } + if(kind==0&&"1".equals(ifac)){ + JqStrUtil.showToast(FindYoursHerActivity.this,getString(R.string.view_more_information)); + return; + } + recommendUserInfoModel = mlistAdd.get(position); + Intent intent = new Intent(FindYoursHerActivity.this, OtherPersonCenterActivity.class); + intent.putExtra("otherid",recommendUserInfoModel.getOtherID()); + intent.putExtra("flag","recommend"); + startActivityForResult(intent,0x02); + } + }); + } + + class RecommendListener implements PullToRefreshLayout.OnRefreshListener + { + + @Override + public void onRefresh(PullToRefreshLayout pullToRefreshLayout) { + // 下拉刷新操作 + mlistAdd = new ArrayList<>(); + pageNo = 1; + isshow = false; + getDataFromServer(); + } + + @Override + public void onLoadMore(PullToRefreshLayout pullToRefreshLayout) { + ++pageNo; + isshow = false; + getDataFromServer(); + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/FriendCircleActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/FriendCircleActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..8f8a6995178467dfbb7cfb8303005584e46a5729 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/FriendCircleActivity.java @@ -0,0 +1,67 @@ +package com.jiuqi.elove.activity; + + +import android.content.Intent; +import android.os.Bundle; +import android.view.View; +import android.widget.ImageView; +import android.widget.RelativeLayout; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.fragment.FriendCircleFragment; +import com.jiuqi.elove.util.JqStrUtil; + +import butterknife.BindView; +import butterknife.OnClick; + +/** + * 缘圈 + * Created by dl on 2016/7/11. + */ +public class FriendCircleActivity extends ABaseActivity { + + @BindView(R.id.iv_right) + ImageView iv_right; + @BindView(R.id.rl_right) + RelativeLayout rl_right; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_circle,"缘圈"); + initView(); + } + + private void initView() { + iv_right.setImageResource(R.drawable.icon_qa_publish); + rl_right.setVisibility(View.VISIBLE); + FriendCircleFragment fragment = new FriendCircleFragment(); + Bundle args = new Bundle(); + args.putString("title","缘圈"); + fragment.setArguments(args); + getSupportFragmentManager().beginTransaction().add(R.id.container, fragment).commit(); + } + + @OnClick(R.id.rl_right) + public void OnClick(View view){ + if(!JqStrUtil.isLogin()){ + startLoginPage(); + }else{ + startPublishPage(); + } + } + + private void startLoginPage() { + Intent intent = new Intent(this,LoginActivity.class); + startActivity(intent); + } + + /** + * 发表朋友圈 + */ + private void startPublishPage() { + Intent intent = new Intent(this,PutRecentActivity.class); + startActivity(intent); + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/GetBackPwdActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/GetBackPwdActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..454efa99aae511a637d36e2f4fcd198bdc191017 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/GetBackPwdActivity.java @@ -0,0 +1,76 @@ +package com.jiuqi.elove.activity; + +import android.content.Intent; +import android.os.Bundle; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.TextView; + +import com.alibaba.fastjson.JSONObject; +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.common.JqBaseActivity; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; + +import java.util.Timer; +import java.util.TimerTask; + +import butterknife.BindView; +import butterknife.OnClick; + +/** + * 找回密码第一步页面 + * Created by FWX on 2016/7/11. + */ +public class GetBackPwdActivity extends ABaseActivity{ + + private static final String TAG = "GetBackPwd"; + + /** + * 控件 + */ + @BindView(R.id.et_pwd) + EditText et_pwd; + @BindView(R.id.et_phone) + EditText et_phone; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_getbackpwd,"忘记密码",-1,MODE_BACK,HEIGHT_REDBG_WHITEFONT); + } + + @OnClick(R.id.tv_sure) + public void onClick(){ + String mobile = et_phone.getText().toString().trim(); + String password = et_pwd.getText().toString().trim(); + if(TextUtils.isEmpty(mobile)){ + showToast("请输入手机号"); + return; + } + if(!JqStrUtil.isMobileNo(mobile)){ + showToast("请输入合法的手机号"); + return; + } + if(TextUtils.isEmpty(password)){ + showToast("请输入密码"); + return; + } + if(password.length()<6||password.length()>18){ + showToast("请输入6-18位密码"); + return; + } + Intent intent = new Intent(this,GetVerifyCodeActivity.class); + intent.putExtra("flag","reset"); + intent.putExtra("mobile",mobile); + intent.putExtra("pwd",password); + startActivity(intent); + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/GetVerifyCodeActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/GetVerifyCodeActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..4a5e3a1a3cf0dae69b326fbe39e8ec076146260a --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/GetVerifyCodeActivity.java @@ -0,0 +1,519 @@ +package com.jiuqi.elove.activity; + +import android.content.Intent; +import android.os.Bundle; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.entity.UserInfoModel; +import com.jiuqi.elove.util.EaseHxHelper; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; +import com.stonesun.newssdk.NewsAgent; +import com.stonesun.newssdk.bean.UserInfo; +import com.stonesun.newssdk.itf.AppUserItf; + +import java.util.Timer; +import java.util.TimerTask; + +import butterknife.BindView; +import butterknife.OnClick; + +public class GetVerifyCodeActivity extends ABaseActivity { + + /** + * 组件 + */ + @BindView(R.id.et_code) + EditText et_code; + @BindView(R.id.tv_getcode) + TextView tv_getcode; + @BindView(R.id.tv_sure) + TextView tv_sure; + @BindView(R.id.tv_prompt) + TextView tv_prompt; + + /** + * 数据 + */ + private String mobile; + private String flag; + private String password; + private String sex; + private String thirdID; + private String thirdType; + private String userid; + + private int time = 60; + private Timer timer = new Timer(); + private TimerTask task; + private int action;//获取验证码用以区分 + private int handleType;//处理类型,1验证手机号 4绑定手机 + + private static final int LOGIN_TYPE_LOGIN = 1; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_get_verify_code,"手机验证",-1,MODE_BACK,HEIGHT_REDBG_WHITEFONT); + getDataFromPre(); + initView(); + getMyVerifyCode(); + } + + /** + * 初始化ui + */ + private void initView() { + tv_prompt.setText("验证码已发送至"+mobile+",请注意查收"); + if("register".equals(flag)){ + toolbar_title.setText("注册"); + tv_sure.setText("注册"); + }else if("verify".equals(flag)){ + toolbar_title.setText("验证旧手机"); + tv_sure.setText("验证"); + }else if("bound".equals(flag)){ + tv_sure.setText("绑定"); + toolbar_title.setText("绑定手机"); + }else if("reset".equals(flag)){ + toolbar_title.setText("忘记密码"); + tv_sure.setText("完成"); + } + } + + /** + * 获取数据 + */ + private void getDataFromPre() { + Intent intent = getIntent(); + userid = SpUtils.getString(Constant.USER_ID); + flag = intent.getStringExtra("flag"); + mobile = intent.getStringExtra("mobile");//获取验证码,每个都得有手机号 + if("register".equals(flag)){//注册 + password = intent.getStringExtra("pwd"); + sex = intent.getStringExtra("sex"); + thirdID = intent.getStringExtra("thirdid"); + thirdType = intent.getStringExtra("thirdType"); + action = Constant.REGISTER_CODE; + }else if("verify".equals(flag)){//验证手机(重新绑定) + handleType = Constant.PHONE_VERIFY; + action = Constant.OLD_PHONE_CODE; + }else if("bound".equals(flag)){//绑定手机 + handleType = Constant.PHONE_BOUND; + action = Constant.NEW_PHONE_CODE; + }else if("reset".equals(flag)){//忘记密码 + password = intent.getStringExtra("pwd"); + action = Constant.RESET_PWD_CODE; + } + } + + @OnClick({R.id.tv_sure,R.id.tv_getcode}) + public void onClick(View view){ + switch (view.getId()){ + case R.id.tv_sure: + submit(); + break; + case R.id.tv_getcode://获取验证码 + getMyVerifyCode(); + break; + } + } + + /** + * 处理时间 + */ + private void submit() { + if("register".equals(flag)){//注册 + register(); + }else if("verify".equals(flag)||"bound".equals(flag)){//旧手机号和新手机号验证、绑定 + verifyPhoneOrBound(); + }else if("reset".equals(flag)){//忘记密码 + resetPwd(); + } + } + + /** + * 重置密码 + */ + private void resetPwd() { + String phonecode = et_code.getText().toString().trim(); + String getPwdUrl = Constant.COMMON_URL + Interface.GET_BACK_PWD; + if(TextUtils.isEmpty(mobile)){ + showToast("请输入手机号"); + return; + } + if(!JqStrUtil.isMobileNo(mobile)){ + showToast("请输入合法的手机号"); + return; + } + if(TextUtils.isEmpty(password)){ + showToast("请输入密码"); + return; + } + if(password.length()<6||password.length()>18){ + showToast("请输入6-18位密码"); + return; + } + JSONObject obj = new JSONObject(); + obj.put("action", action); + obj.put("mobilephone", mobile); + obj.put("phonecode", phonecode); + obj.put("setpassword", password); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, true, getPwdUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String retCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if ("1".equals(retCode)) { + startLoginPage(); + } + showToast(explanation); + } + }, null); + } + + /** + * 验证旧手机号 + */ + private void verifyPhoneOrBound() { + String thirdBoundUrl = Constant.COMMON_URL + Interface.THIRD_BOUND; + String phonecode = et_code.getText().toString().trim(); + JSONObject obj = new JSONObject(); + obj.put("userID", userid); + obj.put("phone", mobile); + obj.put("codetype", action);//验证码类型 + obj.put("action", handleType);//1:验证手机 4:绑定手机 + obj.put("phonecode", phonecode);//1验证码 + obj.put("version", Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, true, thirdBoundUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if (Constant.SUCCESS_CODE.equals(rsCode)) { + if(handleType==Constant.PHONE_VERIFY) {//验证旧手机成功之后跳转到新手机号输入页面 + startNewPhonePage(); + } else if (handleType == Constant.PHONE_BOUND) {//新手机号绑定成功 + clearTopSettingPage(); + } + } + showToast(explanation); + } + }, null); + + } + + /** + * 绑定成功后的处理 + */ + private void clearTopSettingPage() { + SpUtils.setString(Constant.MOBILE, mobile); + Intent intent = new Intent(this,SettingActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + startActivity(intent); + } + + /** + * 进入要绑定的目标手机号输入页面 + */ + private void startNewPhonePage() { + Intent intent = new Intent(this,NewPhoneActivity.class); + startActivity(intent); + } + + /** + * 注册 + */ + private void register() { + String regUrl = Constant.COMMON_URL + Interface.REGISTER_NEW;//2.0.6启用 + String verifyCode = et_code.getText().toString().trim(); + if(TextUtils.isEmpty(mobile)){ + showToast("请输入手机号"); + return; + } + if(!JqStrUtil.isMobileNo(mobile)) { + showToast("请输入合法的手机号"); + return; + } + if(TextUtils.isEmpty(password)){ + showToast("请输入密码"); + return; + } + if(password.length()<6||password.length()>18){ + showToast("请输入6-18位密码"); + return; + } + if(TextUtils.isEmpty(verifyCode)){ + showToast("请输入验证码"); + return; + } + if(TextUtils.isEmpty(sex)){ + showToast("请选择性别"); + return; + } + JSONObject obj = new JSONObject(); + obj.put("mobilephone", mobile); + obj.put("password", password); + obj.put("action", action); + obj.put("sex",sex); + obj.put("phonecode", verifyCode); + obj.put("version",Constant.VERSION); + obj.put("nickname", ""); + obj.put("birthday",""); + obj.put("localplace",""); + obj.put("height",""); + obj.put("degree",""); + obj.put("income",""); + obj.put("marrige",""); + obj.put("type",thirdType); + obj.put("usID",thirdID); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, true, regUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if (Constant.SUCCESS_CODE.equals(rsCode)) { + onLogin();//注册成功后自动登录 + }else if("102".equals(rsCode)){//判断验证码无效的提示不合理,自己写 + showToast("验证码无效(错误或失效)"); + }else{ + showToast(explanation); + } + } + }, null); + } + + /** + * 注册成功后进入登录页面 + */ + private void startLoginPage() { + Intent intent = new Intent(this,LoginActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + startActivity(intent); + } + + + /** + * 进入此页面就获取验证码 + */ + private void getMyVerifyCode() { + String codeUrl = Constant.COMMON_URL + Interface.GET_VERIFYCODE; + if (TextUtils.isEmpty(mobile)) { + showToast("手机号不能为空"); + return; + } + if (!JqStrUtil.isMobileNo(mobile)) { + showToast("请输入合法的手机号"); + return; + } + JSONObject obj = new JSONObject(); + obj.put("userID",userid); + obj.put("mobilephone", mobile); + obj.put("action", action); + obj.put("version", Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, true, codeUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + time = 60;//同一个页面第二次请求验证码,依然可以读秒,莫名其妙又没了,加上 + task = new TimerTask() { + @Override + public void run() { + runOnUiThread(new Runnable() { // UI thread + @Override + public void run() { + if(tv_getcode==null){ + return; + } + tv_getcode.setEnabled(false); + if (time <= 0) { + tv_getcode.setEnabled(true); + tv_getcode.setText("获取验证码"); + task.cancel(); + } else { + tv_getcode.setText("" + time + "秒后重发"); + } + time--; + } + }); + } + }; + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if (Constant.SUCCESS_CODE.equals(rsCode)) { + timer.schedule(task, 0, 1000); + showToast("请注意查收验证码"); + } else { + showToast(explanation); + if(!"验证码未过期,请勿重新获取".equals(explanation)){ + finish(); + } + } + } + }, null); + } + + + /***************************************************注册成功后的流程******************************************************/ + /** + * 注册成功后登录 + */ + private void onLogin() { + String loginUrl = Constant.COMMON_URL + Interface.USER_LOGIN; + if(TextUtils.isEmpty(mobile)&&TextUtils.isEmpty(password)){ + return; + } + if(TextUtils.isEmpty(mobile)){ + showToast(R.string.phonenum_input_prompt); + return; + } + if(TextUtils.isEmpty(password)){ + showToast(R.string.password_input_prompt); + return; + } + JSONObject obj = new JSONObject(); + obj.put("mobilephone",mobile); + obj.put("password",password); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this,false,loginUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String prompt = jsonObject.getString("explanation"); + if("104".equals(rsCode)){//账号密码错误 + showToast(prompt); + return; + } + if("103".equals(rsCode)){//账号被封禁 + showToast(prompt); + return; + } + if("1".equals(rsCode)){ + String userString = jsonObject.getString("message"); + UserInfoModel model = JSON.parseObject(userString,UserInfoModel.class); + loginSuccess(model,mobile,LOGIN_TYPE_LOGIN);//登录成功的操作 + }else{ + showToast(prompt); + } + } + },null); + } + + /** + * 成功登录,进入主页 + * @param model 将当前用户信息缓存到sp + * @param loginMobile 当前用户手机号 + * @param flag 标志位:分别代表是手机账号登录或者三方登录 + */ + private void loginSuccess(UserInfoModel model,String loginMobile,int flag){ + saveCurrentUserInfo2Sp(model,loginMobile);//缓存当前用户的数据 + EaseHxHelper.hxLogin(model.getUserid());//环信登录 + saveAddress(model.getUserid());//保存地址 + loginZhiTong();//登陸智通 + if(Constant.ACCOUNT_ACTIVATED.equals(model.getStatus())||Constant.ACCOUNT_IS_REPORTED.equals(model.getStatus())){//如果不是未激活和未封禁 + startMainClearTop(); + }else{ + JqStrUtil.showToast(this,"您已被封禁,请联系企缘客服了解问题解除封禁"); + } + } + + /** + * 主页 + */ + private void startMainClearTop() { + Intent intent = new Intent(this,MainActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + startActivity(intent); + } + + /** + * 登陸智通 + */ + private void loginZhiTong() { + NewsAgent.SetUserImpForSDK(appUserItf,LoginActivity.class); + } + + /** + * 智通需要的用户信息 + */ + AppUserItf appUserItf = new AppUserItf() { + @Override + public boolean isLogin() { + return true; + } + + @Override + public UserInfo getUserinfo() { + UserInfo userInfo = new UserInfo(); + userInfo.setUid(SpUtils.getString(Constant.USER_ID)); + userInfo.setUsericon(SpUtils.getString(Constant.AVATAR)); + userInfo.setUsername(SpUtils.getString(Constant.NIKE_NAME)); + userInfo.setToken("elove_token"); + return userInfo; + } + }; + + /** + * 登录成功,将当前用户信息缓存到sp + * @param model 当前用户类 + * @param loginMobile 当前用户手机号 + */ + private void saveCurrentUserInfo2Sp(UserInfoModel model,String loginMobile) { + SpUtils.setString(Constant.USER_ID,model.getUserid()); + SpUtils.setString(Constant.MOBILE,loginMobile); + SpUtils.setString(Constant.NIKE_NAME,model.getNickname()); + SpUtils.setString(Constant.SEX,model.getSex()); + SpUtils.setString(Constant.AVATAR,model.getAvatar()); + SpUtils.setInt(Constant.E_KIND,model.getKind()); + SpUtils.setInt(Constant.RED_BEAN,model.getBean()); + SpUtils.setInt(Constant.IF_UP,model.getIfup()); + SpUtils.setInt(Constant.AVATAR_TYPE,model.getAvatartype());//头像状态 + SpUtils.setString(Constant.IF_AC,model.getIfac()); + SpUtils.setString(Constant.USER_ROLE,model.getUserrole());//0 普通用户 1专家 2红娘 + } + + /** + * 登录成功,将当前用户登录获取到的地理位置信息提交到服务器,并缓存到sp + */ + private void saveAddress(String userId) { + String longitude = SpUtils.getString(Constant.LOCATE_LNG); + String latitude = SpUtils.getString(Constant.LOCATE_LAT); + String saveAddressUrl = Constant.COMMON_URL + Interface.SAVE_ADDURL; + JSONObject obj = new JSONObject(); + obj.put("lng",longitude); + obj.put("lat",latitude); + obj.put("userID",userId); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this,false,saveAddressUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + Log.d("saveAddress", "onResponse: "+rsCode); + if("1".equals(rsCode)){ + // TODO: 2017/12/8 + } + } + },null); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + okHttpUtil.cancelTag(this); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/GiftDetailListActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/GiftDetailListActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..c3077c4bd247bfd5d8d2af509ec0e8369117073c --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/GiftDetailListActivity.java @@ -0,0 +1,124 @@ +package com.jiuqi.elove.activity; + +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ImageView; +import android.widget.ListView; +import android.widget.TextView; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.jiuqi.elove.R; +import com.jiuqi.elove.adapter.GiftDetailAdapter; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.common.JqBaseActivity; +import com.jiuqi.elove.entity.GiftModel; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; + +import java.util.ArrayList; +import java.util.List; + +public class GiftDetailListActivity extends JqBaseActivity { + + /** + * 控件 + */ + private TextView tvTitle; + private ImageView imgBack; + private ListView lv_gift; + + /** + * 数据 + */ + private String userid; + private String name;//实际是礼物的id,跟着服务端起名 + private int action;//1是收到的 2是送出的 + private List mList; + private List mAddList; + + /** + * 工具 + */ + private GiftDetailAdapter adapter; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_gift_detail_list); + initView(); + getDataFromSpAndPrePage(); + setAdapter(); + getGiftInfoList(); + setEvents(); + } + + private void setAdapter() { + mAddList = new ArrayList<>(); + adapter = new GiftDetailAdapter(GiftDetailListActivity.this); + lv_gift.setAdapter(adapter); + lv_gift.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + startOtherPage(position); + } + }); + } + + private void startOtherPage(int position) { + Intent intent = new Intent(this,OtherPersonCenterActivity.class); + intent.putExtra("otherid",mAddList.get(position).getUserid()); + startActivity(intent); + } + + /** + * 获取缓存数据和上页传过来的礼物id + */ + private void getDataFromSpAndPrePage() { + userid = SpUtils.getString(Constant.USER_ID); + name = getIntent().getStringExtra("name"); + action = getIntent().getIntExtra("action",1);//默认是收到的 + } + + private void getGiftInfoList() { + String infoListUrl = Constant.COMMON_URL + Interface.GIFT_SEND_RECEIVE_DETAIL; + JSONObject obj = new JSONObject(); + obj.put("userid",userid); + obj.put("name",name); + obj.put("action",action); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, true, infoListUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + if("1".equals(rsCode)){ + String result = jsonObject.getString("message"); + mList = JSONArray.parseArray(result,GiftModel.class); + mAddList.addAll(mList); + adapter.updateListView(mAddList); + } + } + },null); + } + + private void initView() { + tvTitle = easyFind(R.id.tvTitle); + lv_gift = easyFind(R.id.lv_gift); + tvTitle.setText("礼物详情"); + imgBack = easyFind(R.id.img_leftBtn); + imgBack.setVisibility(View.VISIBLE); + } + + private void setEvents() { + imgBack.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + finish(); + } + }); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/InputSchoolActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/InputSchoolActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..e0bd8bf6c411962476acdf988a0306d71d70541f --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/InputSchoolActivity.java @@ -0,0 +1,50 @@ +package com.jiuqi.elove.activity; + +import android.content.Intent; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.jiuqi.elove.R; + +import butterknife.BindView; +import butterknife.OnClick; + +public class InputSchoolActivity extends ABaseActivity { + + @BindView(R.id.et_name) + EditText et_name; + @BindView(R.id.tv_right) + TextView tv_right; + @BindView(R.id.rl_right_tv) + RelativeLayout rl_right_tv; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_input_school,"输入学校"); + setRightClick(); + } + + private void setRightClick() { + rl_right_tv.setVisibility(View.VISIBLE); + tv_right.setText("确定"); + } + + @OnClick(R.id.rl_right_tv) + public void onClick(){ + String school = et_name.getText().toString().trim(); + if(TextUtils.isEmpty(school)){ + showToast("请输入学校名称"); + return; + } + Intent intent = new Intent(this,EditMyInfoActivity.class); + intent.putExtra("school",school); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP); + startActivity(intent); + } +} + diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/LikeUsersActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/LikeUsersActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..c6c6131af33ff7566c36eabb1ccf7c7924c52be4 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/LikeUsersActivity.java @@ -0,0 +1,198 @@ +package com.jiuqi.elove.activity; + +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ImageView; +import android.widget.ListView; +import android.widget.TextView; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.jiuqi.elove.R; +import com.jiuqi.elove.adapter.LikeUserAdapter; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.common.JqBaseActivity; +import com.jiuqi.elove.entity.LikeUserEntity; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; +import com.jiuqi.elove.widget.pulltorefresh.PullToRefreshLayout; + +import java.util.ArrayList; +import java.util.List; + +/** + * 点赞和报名页面 + * Created by FanWenXia on 2016/7/25. + */ +public class LikeUsersActivity extends JqBaseActivity implements View.OnClickListener,PullToRefreshLayout.OnRefreshListener{ + private static final String TAG = "LikeUsers"; + + /** + * 控件 + */ + private TextView tvTitle; + private ImageView tvBack; + private PullToRefreshLayout likeRefresh; + private ListView list_likeusers; + + /** + * 数据 + */ + private String actid; + private String userid; + private String flag;//判断是显示点赞列表还是报名列表 + private String signOrlikeUsersUrl; + private boolean isshow; + private int offset = 1; + private int limit = 10; + private List luserList; + private List luserListAdd; + + /** + * 适配器 + */ + private LikeUserAdapter likeUserAdapter; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_likeuser_list); + init(); + initView(); + initEvent(); + isshow = true; + reqUserList(); + } + + //初始化数据 + private void init(){ + Intent intent = getIntent(); + actid = intent.getStringExtra("actid"); + flag = intent.getStringExtra("flag"); + userid = SpUtils.getString(Constant.USER_ID); + } + + //初始化UI控件 + private void initView() { + tvBack = (ImageView)findViewById(R.id.img_leftBtn); + tvTitle = (TextView)findViewById(R.id.tvTitle); + if("LikeUsers".equals(flag)){ + tvTitle.setText(getResources().getString(R.string.like_users)); + }else{ + tvTitle.setText(getResources().getString(R.string.sign_users)); + } + tvBack.setVisibility(View.VISIBLE); + likeRefresh = (PullToRefreshLayout)findViewById(R.id.likeRefreshView); + list_likeusers = (ListView) findViewById(R.id.lv_likeuser); + luserListAdd = new ArrayList<>(); + likeUserAdapter = new LikeUserAdapter(this); + list_likeusers.setAdapter(likeUserAdapter); + offset = 1;//页码从零开始 + } + + + private void initEvent() { + likeRefresh.setOnRefreshListener(this); + tvBack.setOnClickListener(this); + list_likeusers.setOnItemClickListener(new cyOnItemClickListener()); + } + + @Override + public void onClick(View view) { + switch (view.getId()){ + case R.id.img_leftBtn: + finish(); + break; + default: + break; + } + } + + + private void reqUserList() { + JSONObject obj = new JSONObject(); + if("LikeUsers".equals(flag)){ + signOrlikeUsersUrl = Constant.COMMON_URL + Interface.ACT_LIKES; + obj.put("userid",userid); + }else{ + signOrlikeUsersUrl = Constant.COMMON_URL + Interface.EACT_REPORTLIST; + } + obj.put("version",Constant.VERSION); + obj.put("actid",actid); + obj.put("limit",limit); + obj.put("offset",offset); + String param = obj.toJSONString(); + Log.d(TAG, "LikeUsersActivity: "+param); + okHttpUtil.sendJsonStrByPostAsync(LikeUsersActivity.this,isshow,signOrlikeUsersUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + String jsonString = ""; + if("1".equals(rsCode)){ + if("LikeUsers".equals(flag)){ + String lnum = jsonObject.getString("number"); + tvTitle.setText("点赞用户("+lnum+")"); + jsonString = jsonObject.getString("message"); + }else{ + String count = jsonObject.getString("number"); + tvTitle.setText("报名用户("+count+")"); + jsonString = jsonObject.getString("message"); + } + luserList = JSON.parseArray(jsonString,LikeUserEntity.class); + if(offset==1&&luserList.size()<=0){ + likeRefresh.loadmoreFinish(PullToRefreshLayout.SUC_NODATA); +// JqStrUtil.showToast(getActivity(),"无更多企业活动"); + }else{ + if(luserList.size()<=0){ + likeRefresh.loadmoreFinish(PullToRefreshLayout.SUC_NODATA); + }else{ + luserListAdd.addAll(luserList); + likeUserAdapter.updateListView(luserListAdd); + if(1==offset){//第一页且有数据为刷新 + likeRefresh.refreshFinish(PullToRefreshLayout.SUCCEED); + }else{//非第一页且有数据为加载,加载成功不必悬停 +// eActRefresh.loadmoreFinish(PullToRefreshLayout.SUCCEED); + likeRefresh.refreshFinish(PullToRefreshLayout.SUCCEED); + } + } + } + }else{ + JqStrUtil.showToast(LikeUsersActivity.this,explanation); + } + } + },null); + } + + class cyOnItemClickListener implements AdapterView.OnItemClickListener { + public void onItemClick(AdapterView parent, View view, int position, long id) { + Intent intent = new Intent(LikeUsersActivity.this,OtherPersonCenterActivity.class); + intent.putExtra("otherid",luserListAdd.get(position).getUserid()); + startActivity(intent); + } + } + + + @Override + public void onRefresh(PullToRefreshLayout pullToRefreshLayout) { + // 下拉刷新操作 + luserListAdd = new ArrayList<>(); + offset = 1; + isshow = false; + reqUserList(); + } + + @Override + public void onLoadMore(PullToRefreshLayout pullToRefreshLayout) { + ++offset; + isshow = false; + Log.d(TAG,"offset: "+offset); + reqUserList(); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/LoginActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/LoginActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..0ca1d93b823947ad0e1aae1b76b9c776694dce47 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/LoginActivity.java @@ -0,0 +1,465 @@ +package com.jiuqi.elove.activity; + +import android.content.Intent; +import android.os.Bundle; +import android.support.v4.content.ContextCompat; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.util.Log; +import android.view.View; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.TextView; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baidu.location.BDLocation; +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.entity.UserInfoModel; +import com.jiuqi.elove.fragment.HomePageFragment; +import com.jiuqi.elove.util.BdLocationHelper; +import com.jiuqi.elove.util.EaseHxHelper; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.MyTextWatcher; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; +import com.stonesun.newssdk.NewsAgent; +import com.stonesun.newssdk.bean.UserInfo; +import com.stonesun.newssdk.itf.AppUserItf; +import com.umeng.analytics.MobclickAgent; +import com.umeng.socialize.UMAuthListener; +import com.umeng.socialize.UMShareAPI; +import com.umeng.socialize.bean.SHARE_MEDIA; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import butterknife.BindView; +import butterknife.OnClick; + +/** + * Created by dl on 2016/6/29. + * 登录页面 + */ +public class LoginActivity extends ABaseActivity{ + + private static final String TAG = "LoginActivity"; + + /** + * 组件 + */ + @BindView(R.id.tv_forgetPw) + TextView tvPwForget; + @BindView(R.id.tv_register) + TextView tv_register; + @BindView(R.id.et_mobile_login) + EditText etLoginMobile; + @BindView(R.id.et_pwd_login) + EditText etLoginPwd; + @BindView(R.id.iv_sina) + ImageView iv_sina; + @BindView(R.id.iv_wechat) + ImageView iv_wechat; + @BindView(R.id.iv_qq) + ImageView iv_qq; + @BindView(R.id.tv_login) + TextView tv_login; + + /** + * 数据 + */ + /** + * 关于百度地图定位,每次做登录都需要保存当前地址: + * 目前是每次登录成功都做定位,登录页面,注册页面,欢迎页面都有,繁琐 + * 可以考虑放到登录成功后都会进入的页面,比如主页面MainActivity,减少代码冗余 + */ + private BdLocationHelper helper; + private double latitude;//纬度 + private double longitude;//经度 + private String address;//城市 + private String userId; + /** + * 第三方登录 + */ + private UMShareAPI umShareAPI; + private SHARE_MEDIA platform = null; + private String userPhone = null; + private String thirdType;//1微信 2QQ 3微博 + private String usID = null;//第三方ID + private String phonecode; + private String tmpMobile; + + /** + * 工具 + */ + private final OkHttpUtil okHttpUtil = OkHttpUtil.getInstance(); + private static final int LOGIN_TYPE_LOGIN = 1; + private static final int LOGIN_TYPE_THIRD = 3; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_login,"",-1,R.drawable.icon_close,HEIGHT_IS_DARK); + umShareAPI = UMShareAPI.get(this); + getSharedPreferenceDb(); + initLocation(); + initView(); + initEvent(); + } + + private void initView() { + if(!TextUtils.isEmpty(userPhone)){ + etLoginMobile.setText(userPhone); + } + toolbar.setBackgroundColor(ContextCompat.getColor(this,R.color.white)); + } + + private void initEvent() { + /** + * 监听两个输入框内容来判断是否更改登录按钮的状态 + * 手机号&&密码 + */ + List mList = new ArrayList<>(); + mList.add(etLoginMobile); + mList.add(etLoginPwd); + TextWatcher wather = new MyTextWatcher(mList,tv_login); + etLoginMobile.addTextChangedListener(wather); + etLoginPwd.addTextChangedListener(wather); + } + + @OnClick({R.id.tv_forgetPw,R.id.tv_login,R.id.iv_sina,R.id.iv_wechat,R.id.iv_qq,R.id.tv_register}) + public void onClick(View view) { + switch (view.getId()){ + case R.id.tv_forgetPw: + MobclickAgent.onEvent(this,"Login1"); + Intent forgetIntent = new Intent(LoginActivity.this,GetBackPwdActivity.class); + startActivity(forgetIntent); + break; + case R.id.tv_login: + MobclickAgent.onEvent(this,"Login3"); + onLogin(); + break; + case R.id.iv_sina://新浪登录 + platform = SHARE_MEDIA.SINA; + thirdType = "3"; + umShareAPI.doOauthVerify(this, platform, umAuthListener); + break; + case R.id.iv_qq://QQ登录 + platform = SHARE_MEDIA.QQ; + thirdType = "2"; + umShareAPI.doOauthVerify(this, platform, umAuthListener); + break; + case R.id.iv_wechat://微信登录 + platform = SHARE_MEDIA.WEIXIN; + thirdType = "1"; + umShareAPI.doOauthVerify(this, platform, umAuthListener); + break; + case R.id.tv_register://注册 + goRegister(); + break; + default: + break; + } + } + + private void goRegister() { + Intent intent = new Intent(this,RegisterActivity.class); + startActivity(intent); + } + + + /** + * 从sp缓存中获取可能已经存在的值(登录过) + */ + private void getSharedPreferenceDb(){ + userPhone = SpUtils.getString(Constant.MOBILE); + } + + /** + * 手机账号密码登录 + */ + private void onLogin() { + String loginUrl = Constant.COMMON_URL + Interface.USER_LOGIN; + final String loginMobile = etLoginMobile.getText().toString().trim(); + final String loginPwd = etLoginPwd.getText().toString().trim(); + if(TextUtils.isEmpty(loginMobile)&&TextUtils.isEmpty(loginPwd)){ + return; + } + if(TextUtils.isEmpty(loginMobile)){ + showToast(R.string.phonenum_input_prompt); + return; + } + if(TextUtils.isEmpty(loginPwd)){ + showToast(R.string.password_input_prompt); + return; + } + JSONObject obj = new JSONObject(); + obj.put("mobilephone",loginMobile); + obj.put("password",loginPwd); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + Log.d(TAG, "onLogin: "+param); + okHttpUtil.sendJsonStrByPostAsync(LoginActivity.this,true,loginUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String prompt = jsonObject.getString("explanation"); + if("104".equals(rsCode)){//账号密码错误 + JqStrUtil.showToast(LoginActivity.this,prompt); + return; + } + if("103".equals(rsCode)){//账号被封禁 + JqStrUtil.showToast(LoginActivity.this,prompt); + return; + } + if("1".equals(rsCode)){ + String userString = jsonObject.getString("message"); + UserInfoModel model = JSON.parseObject(userString,UserInfoModel.class); + Log.d("login", "onResponse: "+model); + loginSuccess(model,loginMobile,LOGIN_TYPE_LOGIN);//登录成功的操作 + }else{ + showToast(prompt); + } + } + },null); + } + + /** + * 第三方登录 + */ + private void thirdLogin(String param) { + String thirdLoginUrl = Constant.COMMON_URL + Interface.THIRD_LOGIN_NEW; + okHttpUtil.sendJsonStrByPostAsync(LoginActivity.this,true,thirdLoginUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + Log.d(TAG, "onResponse: "+rsCode); + if("1".equals(rsCode)){//登陆成功 + String userString = jsonObject.getString("message"); + UserInfoModel model = JSON.parseObject(userString,UserInfoModel.class); + Log.d(TAG, "userString: "+userString); + loginSuccess(model,model.getPhone(),LOGIN_TYPE_THIRD);//登录成功后的操作 + }else if("900".equals(rsCode)){//该用户需绑定app//2.6注册方式更改,未绑定的第三方通过注册成功绑定为注册过的手机号 + thirdLogin2Register(); + }else if("101".equals(rsCode) || "102".equals(rsCode)){// 101:验证码错误102:验证码已失效 + thirdLogin2Register(); + }else{ + JqStrUtil.showToast(LoginActivity.this,explanation); + } + } + },null); + } + + /** + * 未进行注册则三方登录,失败,进入注册页面 + */ + private void thirdLogin2Register(){ + Intent intent = new Intent(LoginActivity.this,RegisterActivity.class); + intent.putExtra("thirdid",usID); + intent.putExtra("thirdType",thirdType); + startActivity(intent); + } + + /** + * 成功登录,进入主页 + * @param model 将当前用户信息缓存到sp + * @param loginMobile 当前用户手机号 + * @param flag 标志位:分别代表是手机账号登录或者三方登录 + */ + private void loginSuccess(UserInfoModel model,String loginMobile,int flag){ + saveCurrentUserInfo2Sp(model,loginMobile);//缓存当前用户的数据 + EaseHxHelper.hxLogin(model.getUserid());//环信登录 + saveAddress();//保存地址 + loginZhiTong();//登陸智通 + if(Constant.ACCOUNT_ACTIVATED.equals(model.getStatus())||Constant.ACCOUNT_IS_REPORTED.equals(model.getStatus())){//如果不是未激活和未封禁 + startMainActivity(flag); + }else if(Constant.ACCOUNT_UNACTIVATED.equals(model.getStatus())){//微信注册未完善信息进行完善,即未激活状态 + startRegisterInfoActivity(model); + }else{ + JqStrUtil.showToast(this,"您已被封禁,请联系企缘客服了解问题解除封禁"); + } + } + + /** + * 登陸智通 + */ + private void loginZhiTong() { + /** + * 智通需要的用户信息 + */ + AppUserItf appUserItf = new AppUserItf() { + @Override + public boolean isLogin() { + return true; + } + + @Override + public UserInfo getUserinfo() { + UserInfo userInfo = new UserInfo(); + userInfo.setUid(SpUtils.getString(Constant.USER_ID)); + userInfo.setUsericon(SpUtils.getString(Constant.AVATAR)); + userInfo.setUsername(SpUtils.getString(Constant.NIKE_NAME)); + userInfo.setFrom("QQ"); + userInfo.setToken("elove"); + return userInfo; + } + }; + NewsAgent.SetUserImpForSDK(appUserItf,LoginActivity.class); + } + + private void startRegisterInfoActivity(UserInfoModel model) { + Intent intent = new Intent(this,RegisterActivity.class); + intent.putExtra("model",model); + intent.putExtra("flag","login"); + startActivity(intent); + } + + /** + * 登录成功,将当前用户信息缓存到sp + * @param model 当前用户类 + * @param loginMobile 当前用户手机号 + */ + private void saveCurrentUserInfo2Sp(UserInfoModel model,String loginMobile) { + userId = model.getUserid(); + SpUtils.setString(Constant.USER_ID,userId); + SpUtils.setString(Constant.MOBILE,loginMobile); + SpUtils.setString(Constant.NIKE_NAME,model.getNickname()); + SpUtils.setString(Constant.SEX,model.getSex()); + SpUtils.setString(Constant.AVATAR,model.getAvatar()); + SpUtils.setInt(Constant.E_KIND,model.getKind()); + SpUtils.setInt(Constant.RED_BEAN,model.getBean()); + SpUtils.setInt(Constant.IF_UP,model.getIfup()); + SpUtils.setInt(Constant.AVATAR_TYPE,model.getAvatartype());//头像状态 + SpUtils.setString(Constant.IF_AC,model.getIfac()); + SpUtils.setString(Constant.USER_ROLE,model.getUserrole());//0 普通用户 1专家 2红娘 + } + + /** + * 登录成功,将当前用户登录获取到的地理位置信息提交到服务器,并缓存到sp + */ + private void saveAddress() { + String saveAddressUrl = Constant.COMMON_URL + Interface.SAVE_ADDURL; + JSONObject obj = new JSONObject(); + obj.put("lng",longitude); + obj.put("lat",latitude); + obj.put("userID",userId); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(LoginActivity.this,false,saveAddressUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + Log.d("saveAddress", "onResponse: "+rsCode); + if("1".equals(rsCode)){ + SpUtils.setString(Constant.LOCATE_LNG,String.valueOf(longitude)); + SpUtils.setString(Constant.LOCATE_LAT,String.valueOf(latitude)); + SpUtils.setString(Constant.ADDRESS,String.valueOf(address)); + } + } + },null); + } + + /** + * 登录成功,进入主页 + * @param flag 标志位:分别代表是手机账号登录或者三方登录 + */ + private void startMainActivity(int flag){ + if(HomePageFragment.instance!=null){//登录成功后刷新首页列表ui + HomePageFragment.instance.refresh(); + } +// finish(); + Intent intent = new Intent(this,MainActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + startActivity(intent); + } + + /** + * 初始化百度地图进行定位 + */ + private void initLocation() { + helper = new BdLocationHelper(this,1000); + helper.registerLocationListener(); + helper.setListener(new BdLocationHelper.onSuccessLocate() { + @Override + public void handle(BDLocation bdLocation) { + address = bdLocation.getCity(); + latitude = bdLocation.getLatitude(); + longitude = bdLocation.getLongitude(); + } + }); + helper.startLocate(); + } + + @Override + protected void onDestroy() { + if(helper!=null){ + helper.stopLocate(); + helper = null; + } + super.onDestroy(); + } + + @Override + protected void onStop() { + if(helper!=null){ + helper.stopLocate(); + helper = null; + } + super.onStop(); + } + + private String getThirdParam(int count){ + JSONObject obj = new JSONObject(); + obj.put("usID",usID); +// obj.put("action",count);//操作类型 1第三方登录时传入 2需绑定系统账号时传入 + obj.put("version",Constant.VERSION); + if(count == 2){ + obj.put("phone",tmpMobile); + obj.put("phonecode",phonecode); + obj.put("codetype","5"); + obj.put("type",thirdType); + } + return obj.toJSONString(); + } + + /** auth callback interface**/ + private UMAuthListener umAuthListener = new UMAuthListener() { + @Override + public void onComplete(SHARE_MEDIA platform, int action, Map data) { + if("1".equals(thirdType)){ + usID = data.get("openid"); + }else{ + usID = data.get("uid"); + } + if(!JqStrUtil.isEmpty(usID)){ + Log.d(TAG,"usID:"+usID); + thirdLogin(getThirdParam(1)); + }else{ + JqStrUtil.showToast(LoginActivity.this,"获取信息失败,请重试"); + } + Log.d(TAG,"user info:"+data.toString()); + } + + @Override + public void onError(SHARE_MEDIA platform, int action, Throwable t) { + JqStrUtil.showToast(LoginActivity.this,"授权失败..."); + } + + @Override + public void onCancel(SHARE_MEDIA platform, int action) { + JqStrUtil.showToast(LoginActivity.this,"授权取消"); + } + }; + + // 如果有使用任一平台的SSO授权, 则必须在对应的activity中实现onActivityResult方法, 并添加如下代码 + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + umShareAPI.onActivityResult(requestCode, resultCode, data); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/MainActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/MainActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..61b6298b8b1590df756a439cb5edfad73a26ab7f --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/MainActivity.java @@ -0,0 +1,923 @@ +package com.jiuqi.elove.activity; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.SharedPreferences; +import android.graphics.Rect; +import android.os.Bundle; + +import android.os.Handler; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentTransaction; +import android.support.v4.content.LocalBroadcastManager; +import android.util.Log; +import android.view.KeyEvent; +import android.view.View; +import android.view.ViewTreeObserver; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.TextView; +import android.widget.Toast; + +import com.alibaba.fastjson.JSONObject; +import com.gyf.barlibrary.ImmersionBar; +import com.hyphenate.EMMessageListener; +import com.hyphenate.chat.EMClient; +import com.hyphenate.chat.EMCmdMessageBody; +import com.hyphenate.chat.EMConversation; +import com.hyphenate.chat.EMMessage; +import com.hyphenate.easeui.controller.EaseUI; +import com.hyphenate.util.EMLog; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.common.Share; +import com.jiuqi.elove.dao.InviteMessgeDao; +import com.jiuqi.elove.dao.UserDao; +import com.jiuqi.elove.entity.NotifyModel; +import com.jiuqi.elove.fragment.ActFragment2_0_3; +import com.jiuqi.elove.fragment.FindFragment201801; +import com.jiuqi.elove.fragment.HomePageFragment; +import com.jiuqi.elove.fragment.MessageFragment2_6; +import com.jiuqi.elove.fragment.MyInfoCenterFragment; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.updateapk.CheckApkUpdate; +import com.jiuqi.elove.util.EaseHxHelper; +import com.jiuqi.elove.util.JpushUtil; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; +import com.jiuqi.elove.widget.dialog.CustomDialog; +import com.stonesun.newssdk.NewsAgent; +import com.stonesun.newssdk.fragment.NewsAFragment; +import com.umeng.analytics.MobclickAgent; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import cn.jpush.android.api.JPushInterface; +import cn.jpush.android.api.TagAliasCallback; + +/** + *关于环信的数据更新目前是在这里做的 + * 包括tab板上的数据数量更新(改为红点)、注册事件、单点登录等等 + * Created by dl on 2016/6/3. + */ +public class MainActivity extends ABaseActivity implements View.OnClickListener{ + + private static final String TAG = "MainActivity"; + /** + * 底部tab布局(用于设置点击事件) + */ + public static MainActivity instance;//主页面实例,在ondestroy中赋值为空了;主要用于退出登录时将此页面finish掉。 + private LinearLayout ll_footer; + private RelativeLayout mllfellfor;//首页 +// private RelativeLayout mllconveylove;//消息 + private LinearLayout mllact;//活动 + private LinearLayout mllsaylove; + private LinearLayout mllmore;//我的 + // textview for unread message count +// private TextView unreadLabel;//2.0.2版本消息未读提示 + //imageview for unread message prompt + private ImageView unread_msg_number;//2.0.2版本消息未读提示 + private InviteMessgeDao inviteMessgeDao; + private UserDao userDao; + private boolean isConflictDialogShow; + private android.app.AlertDialog.Builder conflictBuilder; + // user logged into another device + public boolean isConflict = false; + private BroadcastReceiver broadcastReceiver; + private LocalBroadcastManager broadcastManager; + private List recentList; + private int currentTabIndex; + private long exitTime = 0;//退出程序点击时间监听 + /** + * 底部tab中的图片(用于点击之后的更改) + */ + private ImageView iv_fellfor; +// private ImageView iv_conveylove; + private ImageView iv_act; + private ImageView iv_saylove; + private ImageView iv_more; + /** + * 底部tab中文字(用于点击之后的更改) + */ + private TextView tv_fellfor; +// private TextView tv_conveylove; + private TextView tv_act; + private TextView tv_saylove; + private TextView tv_more; + /** + * 各个tab对应的fragment + */ +// private HomePageFragment26 mHomePageFragment26; + private HomePageFragment mHomePageFragment; + private MessageFragment2_6 messageFragment2_6; + private ActFragment2_0_3 mActFragment2_0_3; +// private FindFragment findFragment; + private FindFragment201801 findFragment; +// private SayloveFragment mSayloveFragment; +// private SayloveFragment255 mSayloveFragment255; +// private FriendCircleFragment friendCircleFragment; + private MyInfoCenterFragment mMyInfoCenterFragment; + + private static final int MSG_SET_ALIAS = 1001; + private String userid; + private int ifup; + private int serviceUnreadMsgCount; + private String nikeName; + private String avatar; + private List mSysList;//企缘通知,用于在messageFragment中关闭通知栏消息 + private List mActList; + private List mArticleList; + private NotifyModel model; + + private String isPost = "MainActivity"; + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + initMsgPushList(); + instance = this; + setContentView(R.layout.activity_main,"",-1,MODE_NONE,HEIGHT_NONE_LIGHT); + initData();//初始化数据 + initView();//初始化控件 + initEvents();//注册事件 + setSelect(0);//设置默认ui显示 + hxMessage(savedInstanceState);//2.0.2版本加入环信单点登录,以及消息接收广播 + setAlias();//设置极光推送的alias + initZhiTongNews(); + new CheckApkUpdate(MainActivity.this,isPost).updateApk(); + } + + private void initZhiTongNews() { + // 初始化黑牛 + NewsAgent.init(this); + // 开启调试模式 + NewsAgent.setDebugMode(true); + NewsAgent.setPermission(this,true);//动态权限申请 + NewsAgent.SetUserImpForSDK(null,LoginActivity.class); + } + +// @Override +// public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) { +// +// } + + private void initMsgPushList() { + model = new NotifyModel(); + mSysList = new ArrayList<>(); + mActList = new ArrayList<>(); + mArticleList = new ArrayList<>(); + } + + /** + * 初始化数据 + */ + private void initData(){ + inviteMessgeDao = new InviteMessgeDao(this);//环信用 + userDao = new UserDao(this);//环信用 + ifup = SpUtils.getInt(Constant.IF_UP); + userid = SpUtils.getString(Constant.USER_ID); + nikeName = SpUtils.getString(Constant.NIKE_NAME); + avatar = SpUtils.getString(Constant.AVATAR); + } + + /** + * 环信单点登录和注册消息广播 + * @param savedInstanceState + */ + private void hxMessage(Bundle savedInstanceState){ + //make sure activity will not in background if user is logged into another device or removed + if (savedInstanceState != null && savedInstanceState.getBoolean(Constant.ACCOUNT_REMOVED, false)) { + EaseHxHelper.getInstance().logout(false,null); + finish(); + startActivity(new Intent(this, LoginActivity.class)); + return; + } else if (savedInstanceState != null && savedInstanceState.getBoolean("isConflict", false)) { + finish(); + startActivity(new Intent(this, LoginActivity.class)); + return; + } + //2.0.2版本,登录冲突 + if (getIntent().getBooleanExtra(Constant.ACCOUNT_CONFLICT, false) && !isConflictDialogShow) { + showConflictDialog(); + } + if(SpUtils.getBoolean("banned")){ + showBanned(); + } + //register broadcast receiver to receive the change of group from EaseHxHelper + registerBroadcastReceiver(); + } + + // 这是来自 JPush Example 的设置别名的 Activity 里的代码。一般 App 的设置的调用入口,在任何方便的地方调用都可以。 + private void setAlias() { + // 调用 Handler 来异步设置别名 + mHandler.sendMessage(mHandler.obtainMessage(MSG_SET_ALIAS, userid)); + } + private final TagAliasCallback mAliasCallback = new TagAliasCallback() { + @Override + public void gotResult(int code, String alias, Set tags) { + String logs ; + switch (code) { + case 0: + logs = "Set tag and alias success"; + Log.i(TAG, logs); + // 建议这里往 SharePreference 里写一个成功设置的状态。成功设置一次后,以后不必再次设置了。 + SharedPreferences sp = getSharedPreferences("elove",MODE_PRIVATE); + SharedPreferences.Editor editor = sp.edit(); + editor.putString("isSave","3");//已经将该用户的alias保存到服务器,以后可以不保存了 + editor.apply(); + break; + case 6002: + logs = "Failed to set alias and tags due to timeout. Try again after 60s."; + Log.i(TAG, logs); + // 延迟 60 秒来调用 Handler 设置别名 + mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_SET_ALIAS, alias), 1000 * 60); + break; + default: + logs = "Failed with errorCode = " + code; + Log.e(TAG, logs); + } + } + }; + + /** + * 极光推送handler + */ + private final Handler mHandler = new Handler() { + @Override + public void handleMessage(android.os.Message msg) { + super.handleMessage(msg); + switch (msg.what) { + case MSG_SET_ALIAS: + HashSet tagSet = new HashSet<>(); + tagSet.add(Constant.VERSION); + // 调用 JPush 接口来设置别名。 + JPushInterface.setAliasAndTags(getApplicationContext(), + (String) msg.obj, + tagSet, + mAliasCallback); + break; + default: + break; + } + } + }; + + /** + * 初始化控件 + */ + private void initView() { +// virtualkey_bg = (TextView) findViewById(R.id.virtualkey_bg); + mllfellfor = (RelativeLayout) findViewById(R.id.ll_fellfor); +// mllconveylove = (RelativeLayout) findViewById(R.id.ll_conveylove); + mllact = (LinearLayout) findViewById(R.id.ll_act); + mllsaylove = (LinearLayout) findViewById(R.id.ll_saylove); + mllmore = (LinearLayout) findViewById(R.id.ll_more); + ll_footer = (LinearLayout) findViewById(R.id.ll_footer); + iv_fellfor = (ImageView) findViewById(R.id.iv_tabfellfor); +// iv_conveylove = (ImageView) findViewById(R.id.iv_tabconveylove); + iv_act = (ImageView) findViewById(R.id.iv_tabact); + iv_saylove = (ImageView) findViewById(R.id.iv_tabsaylove); + iv_more = (ImageView) findViewById(R.id.iv_tabmore); + tv_fellfor = (TextView) findViewById(R.id.tv_tabfellfor); +// tv_conveylove = (TextView) findViewById(R.id.tv_tabconveylove); + tv_act = (TextView) findViewById(R.id.tv_tabact); + tv_saylove = (TextView) findViewById(R.id.tv_tabsaylove); + tv_more = (TextView) findViewById(R.id.tv_tabmore); +// unreadLabel = (TextView) findViewById(R.id.unread_msg_number);//2.0.2版本消息未读提示 + unread_msg_number = (ImageView) findViewById(R.id.unread_msg_label);//2.0.2版本消息未读提示 + final View mRoot = getWindow().getDecorView(); + mRoot.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + Rect rect = new Rect(); + mRoot.getWindowVisibleDisplayFrame(rect); + int rootInvisibleHeight = mRoot.getRootView().getHeight()-rect.bottom; + if(rootInvisibleHeight>200){ + //显示 + ll_footer.setVisibility(View.GONE); + }else{ + //隐藏 + ll_footer.setVisibility(View.VISIBLE); + } + } + }); + if (ifup==2){ + //对话框 + CustomDialog.Builder builder = new CustomDialog.Builder(MainActivity.this); + builder.setTitle("信息变更"); + builder.setMessage("系统检测到您的身份信息已经被企业认证通过,是否立即让变更生效?"); + builder.setPositiveButton("确认变更",new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + ifup = 2; + PassInfoChange(); + JqStrUtil.showToast(MainActivity.this,"确认变更"); + dialog.dismiss(); + } + }); + builder.setNeutralButton("不变更",new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + ifup = 0; + JqStrUtil.showToast(MainActivity.this,"不变更"); + PassInfoChange(); + dialog.dismiss(); + } + }); + builder.setNegativeButton("暂不处理", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }); + builder.create().show(); + } + } + + /** + * 设置事件 + */ + private void initEvents(){ + mllfellfor.setOnClickListener(this); +// mllconveylove.setOnClickListener(this); + mllact.setOnClickListener(this); + mllsaylove.setOnClickListener(this); + mllmore.setOnClickListener(this); + } + + @Override + public void onClick(View view) { + resetBottomUi(); + switch (view.getId()){ + case R.id.ll_fellfor: + MobclickAgent.onEvent(this,"homepage4"); + setSelect(0); + break; +// case R.id.ll_conveylove: +// MobclickAgent.onEvent(this,"homepage5"); +// setSelect(1); +//// initRecentPersonInfo(); +// loginEase(); +// break; + case R.id.ll_act: + MobclickAgent.onEvent(this,"homepage6"); + setSelect(2); + break; + case R.id.ll_saylove: + setSelect(3); + break; + case R.id.ll_more: + MobclickAgent.onEvent(this,"homepage7"); + setSelect(4); + break; + default: + break; + } + } + + /** + * 环信登录2rd(多次进行登录保证聊天时时登录状态) + */ +// private void loginEase() { +// String userid = sp.getString("userid",""); +// String emcUsername = userid.toLowerCase(); +// EMClient.getInstance().login(emcUsername,emcUsername,new EMCallBack() {//回调 +// @Override +// public void onSuccess() { +// EMClient.getInstance().groupManager().loadAllGroups(); +// EMClient.getInstance().chatManager().loadAllConversations(); +// Log.d("main", "登录聊天服务器成功!"); +// } +// +// @Override +// public void onProgress(int progress, String status) { +// +// } +// +// @Override +// public void onError(int code, String message) { +// Log.d("main", "登录聊天服务器失败!"); +// } +// }); +// } + + private void setSelect(int i) { + FragmentManager fm = getSupportFragmentManager(); + FragmentTransaction transaction = fm.beginTransaction(); + hideFragments(transaction); + switch (i){ + case 0: + currentTabIndex = 0;//2.0.2版本 + if(mHomePageFragment ==null){ + mHomePageFragment = new HomePageFragment(); + model.setmSysList(mSysList); + model.setmActList(mActList); + model.setmArticleList(mArticleList); + Bundle args = new Bundle(); + args.putSerializable("message",model); + mHomePageFragment.setArguments(args); + transaction.add(R.id.content, mHomePageFragment); + }else{ + transaction.show(mHomePageFragment); + } + iv_fellfor.setImageResource(R.drawable.homepage_selected); + tv_fellfor.setTextColor(getResources().getColor(R.color.bottomtabtouched)); + break; +// case 1: +// currentTabIndex = 1;//2.0.2版本 +// if(messageFragment2_6 ==null){ +// messageFragment2_6 = new MessageFragment2_6(); +// model.setmSysList(mSysList); +// model.setmActList(mActList); +// model.setmArticleList(mArticleList); +// Bundle args = new Bundle(); +// args.putSerializable("message",model); +// messageFragment2_6.setArguments(args); +// transaction.add(R.id.content, messageFragment2_6); +// }else{ +// transaction.show(messageFragment2_6); +// } +// iv_conveylove.setImageResource(R.drawable.message_selected); +// tv_conveylove.setTextColor(getResources().getColor(R.color.bottomtabtouched)); +// break; + case 2: + currentTabIndex = 2;//2.0.2版本 + if(mActFragment2_0_3==null){ + mActFragment2_0_3 = new ActFragment2_0_3(); + transaction.add(R.id.content,mActFragment2_0_3); + }else{ + transaction.show(mActFragment2_0_3); + } + iv_act.setImageResource(R.drawable.activity_selected); + tv_act.setTextColor(getResources().getColor(R.color.bottomtabtouched)); + break; + case 3: + if(findFragment==null){ + findFragment = new FindFragment201801(); + transaction.add(R.id.content,findFragment); + }else{ + transaction.show(findFragment); + } +// if(mSayloveFragment255==null){ +// mSayloveFragment255 = new SayloveFragment255(); +// transaction.add(R.id.content,mSayloveFragment255); +// }else{ +// transaction.show(mSayloveFragment255); +// } +// if(friendCircleFragment==null){ +// friendCircleFragment = new FriendCircleFragment(); +// transaction.add(R.id.content,friendCircleFragment); +// }else{ +// transaction.show(friendCircleFragment); +// } + iv_saylove.setImageResource(R.drawable.community_select); + tv_saylove.setTextColor(getResources().getColor(R.color.bottomtabtouched)); + break; + case 4: + currentTabIndex = 4;//2.0.2版本 + if(mMyInfoCenterFragment ==null){ + mMyInfoCenterFragment = new MyInfoCenterFragment(); + transaction.add(R.id.content, mMyInfoCenterFragment); + }else{ + transaction.show(mMyInfoCenterFragment); + } + iv_more.setImageResource(R.drawable.mine_select); + tv_more.setTextColor(getResources().getColor(R.color.bottomtabtouched)); + break; + default: + break; + } + transaction.commit(); + } + + private void hideFragments(FragmentTransaction transaction) { + if(mHomePageFragment !=null){ + transaction.hide(mHomePageFragment); + } +// if(mMessageFragment !=null){ +// transaction.hide(mMessageFragment); +// } + if(messageFragment2_6!=null){ + transaction.hide(messageFragment2_6); + } + if(mActFragment2_0_3!=null){ + transaction.hide(mActFragment2_0_3); + } + if(findFragment!=null){ + transaction.hide(findFragment); + } +// if(mSayloveFragment255!=null){ +// transaction.hide(mSayloveFragment255); +// } +// if(friendCircleFragment!=null){ +// transaction.hide(friendCircleFragment); +// } + if(mMyInfoCenterFragment !=null){ + transaction.hide(mMyInfoCenterFragment); + } + } + + /** + * 将bottom中ui全部置为未点击状态(灰色) + */ + private void resetBottomUi() { + iv_fellfor.setImageResource(R.drawable.homepage_unselect); +// iv_conveylove.setImageResource(R.drawable.message_unselect); + iv_act.setImageResource(R.drawable.activity_unselect); + iv_saylove.setImageResource(R.drawable.community_unselect); + iv_more.setImageResource(R.drawable.mine_unselect); + tv_fellfor.setTextColor(getResources().getColor(R.color.bottomtabUntouched)); +// tv_conveylove.setTextColor(getResources().getColor(R.color.bottomtabUntouched)); + tv_act.setTextColor(getResources().getColor(R.color.bottomtabUntouched)); + tv_saylove.setTextColor(getResources().getColor(R.color.bottomtabUntouched)); + tv_more.setTextColor(getResources().getColor(R.color.bottomtabUntouched)); + } + + /** + * 请求服务器处理信息变更 + */ + private void PassInfoChange(){ + String infoChangeUrl = Constant.COMMON_URL + Interface.INFO_CHANGE; + //屏蔽活动的请求参数 + JSONObject obj = new JSONObject(); + obj.put("userID",userid); + obj.put("ifup",ifup); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + Log.d(TAG, "MainActivity:getData "+param); + okHttpUtil.sendJsonStrByPostAsync(MainActivity.this,false,infoChangeUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if("1".equals(rsCode)){ + SharedPreferences sharedPreferences = getSharedPreferences("elove",getApplicationContext().MODE_PRIVATE); + SharedPreferences.Editor editor = sharedPreferences.edit(); + editor.putInt("ifup",0); + editor.apply(); + }else{ + JqStrUtil.showToast(MainActivity.this,explanation); + } + + } + },null); + } + + /** + * show the dialog when user logged into another device + */ + private void showConflictDialog() { + isConflictDialogShow = true; + String st = getResources().getString(R.string.Logoff_notification); + if (!MainActivity.this.isFinishing()) { + // clear up global variables + try { + if (conflictBuilder == null) { + conflictBuilder = new android.app.AlertDialog.Builder(MainActivity.this); + } + conflictBuilder.setTitle(st); + conflictBuilder.setMessage(R.string.connect_conflict); + conflictBuilder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {//退出登录 + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + isConflictDialogShow = false; + logOff();//退出登录账号信息并进行信息处理 + } + }); + conflictBuilder.setNegativeButton("重新登录", new DialogInterface.OnClickListener() {//重新登录 + @Override + public void onClick(DialogInterface dialog, int i) { + dialog.dismiss(); + isConflictDialogShow = false; + EaseHxHelper.hxLogin(SpUtils.getString("userid").toLowerCase()); + } + }); + isConflict = true; + conflictBuilder.setCancelable(false); + conflictBuilder.create().show(); + } catch (Exception e) { + EMLog.e(TAG, "---------color conflictBuilder error" + e.getMessage()); + } + } + } + + private void showBanned(){ + if (!MainActivity.this.isFinishing()) { + // clear up global variables + try { + if (conflictBuilder == null) { + conflictBuilder = new android.app.AlertDialog.Builder(MainActivity.this); + } + conflictBuilder.setTitle("封禁通知"); + conflictBuilder.setMessage(R.string.account_banned); + conflictBuilder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {//退出登录 + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + isConflictDialogShow = false; + logOff();//退出登录账号信息并进行信息处理 + } + }); + isConflict = true; + conflictBuilder.setCancelable(false); + conflictBuilder.create().show(); + } catch (Exception e) { + EMLog.e(TAG, "---------color conflictBuilder error" + e.getMessage()); + } + } + } + + /** + * 退出登录 + */ + private void logOff() { + JpushUtil.shutPush();//取消绑定极光 + EaseHxHelper.hxLogout();//环信退出 + NewsAgent.logOutComment();//智通退出 + clearSpAndRestore(); + Intent intent = new Intent(this, LoginActivity.class); + startActivity(intent); + } + /** + * 退出登录 + * 清空数据并且需要保留部分数据 + */ + private void clearSpAndRestore() { + String code = SpUtils.getString(Constant.VERSION_CODE); + SpUtils.clearSp(); + SpUtils.setString(Constant.VERSION_CODE,code); + } + +// /** +// * show the dialog when user logged into another device +// */ +// private void showConflictDialog() { +// isConflictDialogShow = true; +// EaseHxHelper.getInstance().logout(false,null); +// String st = getResources().getString(R.string.Logoff_notification); +// if (!MainActivity.this.isFinishing()) { +// // clear up global variables +// try { +// if (conflictBuilder == null) +// conflictBuilder = new android.app.AlertDialog.Builder(MainActivity.this); +// conflictBuilder.setTitle(st); +// conflictBuilder.setMessage(R.string.connect_conflict); +// conflictBuilder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { +// +// @Override +// public void onClick(DialogInterface dialog, int which) { +// dialog.dismiss(); +// conflictBuilder = null; +// /** +// * 退出清除账号信息 +// */ +// mHandler.sendMessage(mHandler.obtainMessage(MSG_SET_ALIAS, ""));//关闭极光推送 +// SharedPreferences.Editor editor = sp.edit(); +// editor.clear(); +// editor.putBoolean("isFirst",false); +// editor.apply(); +// finish(); +// Intent intent = new Intent(MainActivity.this, LoginOrRegisterActivity.class); +// intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); +// startActivity(intent); +//// shutJpush();//关闭极光推送 +// EaseHxHelper.hxLogout();//环信退出 +// } +// }); +// conflictBuilder.setCancelable(false); +// conflictBuilder.create().show(); +// isConflict = true; +// } catch (Exception e) { +// EMLog.e(TAG, "---------color conflictBuilder error" + e.getMessage()); +// } +// +// } +// +// } + +// private void shutJpush(){ +// HashSet tagSet = new HashSet<>(); +// tagSet.add(Constant.VERSION); +// // 调用 JPush 接口来设置别名。 +// JPushInterface.setAliasAndTags(getApplicationContext(), +// "", +// tagSet, +// mAliasCallback); +// } + private void registerBroadcastReceiver() { + broadcastManager = LocalBroadcastManager.getInstance(this); + IntentFilter intentFilter = new IntentFilter(); + intentFilter.addAction(Constant.ACTION_CONTACT_CHANAGED); + intentFilter.addAction(Constant.ACTION_GROUP_CHANAGED); + intentFilter.addAction(Constant.ACTION_NOTIFY_RECEIVED); + broadcastReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + updateUnreadLabel(); + String action = intent.getAction(); + if(Constant.ACTION_NOTIFY_RECEIVED.equals(action)){//推送消息 + String flag = intent.getStringExtra(Constant.NOTIFY_TYPE); + int notifyId = intent.getIntExtra(JPushInterface.EXTRA_NOTIFICATION_ID,0);//获取推送的id,用于后面从app内点击将推送栏消息关闭 + SpUtils.setBoolean(flag,true);//flag 1 2 3 + setData2PushList(flag,notifyId); + unread_msg_number.setVisibility(View.VISIBLE); + if(mHomePageFragment!=null){ + mHomePageFragment.right_unread_img.setVisibility(View.VISIBLE); + } + } + } + }; + broadcastManager.registerReceiver(broadcastReceiver, intentFilter); + } + + /** + * 将获取到的响应数据插入响应的list + */ + private void setData2PushList(String flag,int notifyId) { + if(Constant.NOTIFY_SYS.equals(flag)){ + mSysList.add(notifyId); + }else if(Constant.NOTIFY_ACT.equals(flag)){ + mActList.add(notifyId); + }else{ + mArticleList.add(notifyId); + } + } + + /** + * update unread message count + */ + public void updateUnreadLabel() {//其实用一种就可以(sp和给fragment传值) + int otherCount = getUnreadMsgCountTotal(); + boolean sys = SpUtils.getBoolean(Constant.NOTIFY_SYS); + boolean act = SpUtils.getBoolean(Constant.NOTIFY_ACT); + boolean article = SpUtils.getBoolean(Constant.NOTIFY_ARTICLE); + SpUtils.setInt(Constant.OTHER_UNREAD_MSG_COUNT,otherCount); + SpUtils.setInt(Constant.SERVICE_UNREAD_MSG_COUNT,serviceUnreadMsgCount); + if(sys||act||article||otherCount > 0||serviceUnreadMsgCount>0){ + unread_msg_number.setVisibility(View.VISIBLE); + if(mHomePageFragment!=null){ + mHomePageFragment.right_unread_img.setVisibility(View.VISIBLE); + } + }else{ + unread_msg_number.setVisibility(View.INVISIBLE); + if(mHomePageFragment!=null){ + mHomePageFragment.right_unread_img.setVisibility(View.GONE); + } + } + if(otherCount>0){ + Intent msgIntent = new Intent(Constant.ACTION_OTHER_UNREADMSG_RECEIVED); + broadcastManager.sendBroadcast(msgIntent); + } + if(serviceUnreadMsgCount>0){ + Intent msgIntent = new Intent(Constant.ACTION_SERVICE_UNREADMSG_RECEIVED); + broadcastManager.sendBroadcast(msgIntent); + } + } + + /** + * get unread message count + * + * @return + */ + public int getUnreadMsgCountTotal() { + int unreadMsgCountTotal = 0; + int chatroomUnreadMsgCount = 0; + serviceUnreadMsgCount = 0; + unreadMsgCountTotal = EMClient.getInstance().chatManager().getUnreadMsgsCount(); + for(EMConversation conversation:EMClient.getInstance().chatManager().getAllConversations().values()){ + if(conversation.getType() == EMConversation.EMConversationType.ChatRoom) + chatroomUnreadMsgCount=chatroomUnreadMsgCount+conversation.getUnreadMsgCount(); + if(Constant.SERVICE_PERSON.toLowerCase().equals(conversation.getUserName())){ + serviceUnreadMsgCount = serviceUnreadMsgCount + conversation.getUnreadMsgCount(); + } + } + return unreadMsgCountTotal-chatroomUnreadMsgCount-serviceUnreadMsgCount; + } + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + if (intent.getBooleanExtra(Constant.ACCOUNT_CONFLICT, false) && !isConflictDialogShow) { + showConflictDialog(); + } + if(SpUtils.getBoolean("banned")){ + showBanned(); + } + } + EMMessageListener messageListener = new EMMessageListener() { + @Override + public void onMessageReceived(List messages) { + // notify new message + for (EMMessage message : messages) { + EaseHxHelper.getInstance().getNotifier().onNewMsg(message); + if(Constant.SERVICE_PERSON.toLowerCase().equals(message.getUserName())){ + SpUtils.setBoolean("5",true); + }else{ + SpUtils.setBoolean("4",true); + } + } + refreshUIWithMessage(); + } + + @Override + public void onCmdMessageReceived(List messages) { + for (EMMessage message : messages) { + EMCmdMessageBody cmdMsgBody = (EMCmdMessageBody) message.getBody(); + final String action = cmdMsgBody.action();//get the action user defined in command message +// if (action.equals(RedPacketConstant.REFRESH_GROUP_RED_PACKET_ACTION) && message.getChatType() == EMMessage.ChatType.GroupChat) { +// RedPacketUtil.receiveRedPacketAckMessage(message); +// } + } + refreshUIWithMessage(); + } + @Override + public void onMessageReadAckReceived(List messages) { + } + + @Override + public void onMessageDeliveryAckReceived(List message) { + } + + @Override + public void onMessageChanged(EMMessage message, Object change) {} + }; + + private void refreshUIWithMessage() { + runOnUiThread(new Runnable() { + public void run() { + // refresh unread count + updateUnreadLabel(); + } + }); + } + + @Override + protected void onSaveInstanceState(Bundle outState) { + outState.putBoolean("isConflict", isConflict); + super.onSaveInstanceState(outState); + } + + private void unregisterBroadcastReceiver(){ + broadcastManager.unregisterReceiver(broadcastReceiver); + } + + /** + * 双击退出程序 + */ + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN){ + if((System.currentTimeMillis()-exitTime) > 2000){ + Toast.makeText(getApplicationContext(), "再按一次退出程序",Toast.LENGTH_SHORT).show(); + exitTime = System.currentTimeMillis(); + } else { + finish(); +// System.exit(0);//此处如果这样退出,则收不到推送并且在乐视手机上“再按一次退出程序”的提示不消失 + } + return true; + } + return super.onKeyDown(keyCode, event); + } + + @Override + protected void onResume() { + super.onResume(); + if (!isConflict) { + updateUnreadLabel(); + } + EaseUI.getInstance().getNotifier().reset(); + // unregister this event listener when this activity enters the + // background + EaseHxHelper sdkHelper = EaseHxHelper.getInstance(); + sdkHelper.pushActivity(this); + EMClient.getInstance().chatManager().addMessageListener(messageListener); + } + + @Override + protected void onStop() {//stop如果不取消监听,会出现推送消息数量比实际多 + EMClient.getInstance().chatManager().removeMessageListener(messageListener); + EaseHxHelper sdkHelper = EaseHxHelper.getInstance(); + sdkHelper.popActivity(this); + super.onStop(); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + instance = null; + if (conflictBuilder != null) { + conflictBuilder.create().dismiss(); + conflictBuilder = null; + } + unregisterBroadcastReceiver(); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/MinaLongConnectActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/MinaLongConnectActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..31cec573c61a2f1831eb9b26ab508f51a6a017a1 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/MinaLongConnectActivity.java @@ -0,0 +1,208 @@ +package com.jiuqi.elove.activity; + +import android.content.Context; +import android.content.SharedPreferences; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.util.Log; +import android.view.View; +import android.widget.GridView; +import android.widget.ImageView; +import android.widget.TextView; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.jiuqi.elove.R; +import com.jiuqi.elove.adapter.ActPersonAdapter; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.JqBaseActivity; +import com.jiuqi.elove.entity.ActUserModel; +import com.jiuqi.elove.util.CommonUtil; +import com.jiuqi.elove.util.JqStrUtil; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.net.SocketTimeoutException; +import java.net.URLDecoder; +import java.util.List; + +public class MinaLongConnectActivity extends JqBaseActivity implements View.OnClickListener{ + + /** + * 控件 + */ + private TextView tvTitle; + private TextView tv_net_status; + private ImageView imgBack; + private GridView gv_act; + /** + * 数据 + */ + private String userid; + private String avatar; + private String sex; + private String username; + /** + * 工具 + */ + private final String SERVER_HOST = "10.40.0.20"; + private final int PORT = 10099; + private final int TIME_OUT = 5000; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_mina_long_connect); + getDataFromSp(); + initView(); + startSocketThread(); + setEvents(); + } + + @Override + protected void onResume() { + super.onResume(); + promptNetStatus(); + } + + private void promptNetStatus() { + ConnectivityManager conMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); + // 获取管理器的活动网络信息对象 + NetworkInfo activeInfo = conMgr.getActiveNetworkInfo(); + if (activeInfo != null && activeInfo.isConnected()){ + // 查看网络连接类型 + boolean wifiConnected = activeInfo.getType() == ConnectivityManager.TYPE_WIFI; + boolean mobileConnected = activeInfo.getType() == ConnectivityManager.TYPE_MOBILE; + // wifi 连接 + if(wifiConnected){ + tv_net_status.setText("当前网络为wifi"); +// JqStrUtil.showToast(this,"当前网络为wifi"); + } else if(mobileConnected){ // 手机网络连接 +// JqStrUtil.showToast(this,"当前网络为2g/3g/4g"); + tv_net_status.setText("当前网络为2g/3g/4g"); + } +// else{ +// tv_net_status.setText("当前无网络"); +//// JqStrUtil.showToast(this,"当前无网络"); +// } + }else{ + tv_net_status.setText("当前无网络"); + } + } + + private void startSocketThread() { + new SocketThread().start(); + } + + private void getDataFromSp() { + SharedPreferences sp = getSharedPreferences("elove",MODE_PRIVATE); + userid = sp.getString(Constant.USER_ID,""); + avatar = sp.getString(Constant.AVATAR,""); + sex = sp.getString(Constant.SEX,""); + username = sp.getString(Constant.NIKE_NAME,""); + } + + private void setEvents() { + imgBack.setOnClickListener(this); + } + + private void initView() { + tvTitle = easyFind(R.id.tvTitle); + tv_net_status = easyFind(R.id.tv_net_status); + imgBack = easyFind(R.id.img_leftBtn); + gv_act = easyFind(R.id.gv_act); + tvTitle.setText("签到嘉宾"); + imgBack.setVisibility(View.VISIBLE); + } + + @Override + public void onClick(View view) { + switch (view.getId()){ + case R.id.img_leftBtn: + finish(); + break; + } + } + + + class SocketThread extends Thread{ + @Override + public void run() { + //定义消息 + Message msg = new Message(); + msg.what = 0x11; + Bundle bundle = new Bundle(); + bundle.clear(); + try { + //连接服务器,并设置连接超时为5秒 + Socket socket = new Socket(); + socket.connect(new InetSocketAddress(SERVER_HOST,PORT),TIME_OUT); + if(socket.isConnected()){ + JSONObject obj = new JSONObject(); + obj.put("userid",userid); + obj.put("username",username); + obj.put("userface",avatar); + obj.put("sex",sex); + obj.put("action","1"); + String param = obj.toJSONString(); + //获取输入输出流 +// OutputStream ou = socket.getOutputStream(); + PrintWriter pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream(),"utf-8"));//java服务器接受默认是gbk? + BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream(),"utf-8")); + //向服务器发送信息 + pw.println(param); + pw.flush(); +// ou.write(param.getBytes()); +// ou.flush(); + socket.shutdownOutput(); + //读取发来服务器信息 + String line = null; + while ((line = in.readLine()) != null) { + String result = URLDecoder.decode(line,"utf-8"); + bundle.putString("msg", result); + msg.setData(bundle); + //发送消息 修改UI线程中的组件 + if(myHandler.obtainMessage(msg.what)!=null){ + Message message = new Message(); + message.what = msg.what; + message.setData(msg.getData()); + msg = message; + } + myHandler.sendMessage(msg); + } + //关闭各种输入输出流 + in.close(); +// ou.close(); + pw.close(); + socket.close(); + } + } catch (SocketTimeoutException se) { + Log.d("mina", "run: "+"timeout"); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + public Handler myHandler = new Handler() { + @Override + public void handleMessage(Message msg) { + if (msg.what == 0x11) { + Bundle bundle = msg.getData(); + String result = bundle.getString("msg"); + List mList = JSONArray.parseArray(result,ActUserModel.class); + ActPersonAdapter adapter = new ActPersonAdapter(MinaLongConnectActivity.this,mList); + gv_act.setAdapter(adapter); + } + } + + }; +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/MsgActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/MsgActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..d9b6c7463163cb18326cce89ab9024c7ead08a59 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/MsgActivity.java @@ -0,0 +1,60 @@ +package com.jiuqi.elove.activity; + +import android.content.Intent; +import android.os.Bundle; +import android.view.View; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.entity.NotifyModel; +import com.jiuqi.elove.fragment.MessageFragment2_6; + +import butterknife.BindView; +import butterknife.OnClick; + +public class MsgActivity extends ABaseActivity { + + @BindView(R.id.tv_right) + TextView tv_right; + @BindView(R.id.rl_right_tv) + RelativeLayout rl_right_tv; + + private NotifyModel model; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_msg,"消息"); + getDataFromPre(); + initView(); + } + + private void getDataFromPre() { + model = (NotifyModel) getIntent().getSerializableExtra("model"); + } + + private void initView() { + tv_right.setText("设置"); + rl_right_tv.setVisibility(View.VISIBLE); + MessageFragment2_6 fragment = new MessageFragment2_6(); + Bundle args = new Bundle(); + args.putSerializable("message",model); + fragment.setArguments(args); + getSupportFragmentManager().beginTransaction().add(R.id.container, fragment).commit(); + } + + @OnClick(R.id.rl_right_tv) + public void onClick(View view){ + switch (view.getId()){ + case R.id.rl_right_tv: + startSetPage(); + break; + } + } + + private void startSetPage() { + Intent intent = new Intent(this,MsgSetActivity.class); + startActivity(intent); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/MsgSetActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/MsgSetActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..dc9217a31968f97276cef289ed9622e76ec31384 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/MsgSetActivity.java @@ -0,0 +1,171 @@ +package com.jiuqi.elove.activity; + +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.common.JqBaseActivity; +import com.jiuqi.elove.entity.PushModel; +import com.jiuqi.elove.util.EaseHxHelper; +import com.jiuqi.elove.util.DemoModel; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; + +/** + * 推送设置: + * 启缘推送通知是由环信拼的voice决定,环信聊天是由环信本身判断 + * created by dl + */ +public class MsgSetActivity extends JqBaseActivity implements View.OnClickListener{ + + /** + * 组件 + */ + private ImageView imgBack; + private ImageView iv_qiyuan_notify; + private ImageView iv_talk; + + /** + * 数据 + */ + private DemoModel settingsModel;//环信消息推送设置 + private String userID; + private String action = "1";//1查询 2修改,默认修改 + private String inform;//企缘推送 + private String msg;//环信推送 + + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_msg_set); + getDataFromSp(); + settingsModel = EaseHxHelper.getInstance().getModel();//环信的聊天推送 + initView();//初始化组件 + setEvents();//注册事件 + } + + private void getDataFromSp() { + userID = SpUtils.getString(Constant.USER_ID); + } + + private void initView() { + TextView tvTitle = easyFind(R.id.tvTitle); + tvTitle.setText("消息设置"); + imgBack = easyFind(R.id.img_leftBtn); + imgBack.setVisibility(View.VISIBLE); + iv_qiyuan_notify = easyFind(R.id.iv_qiyuan_notify); + iv_talk = easyFind(R.id.iv_talk); + if(settingsModel.getSettingMsgNotification()){ + iv_talk.setImageResource(R.drawable.switch_on); + }else{ + iv_talk.setImageResource(R.drawable.switch_off); + } + submitPush();//获取由企缘服务器端控制的设置,并初始化UI + } + + private void setEvents() { + imgBack.setOnClickListener(this); + iv_qiyuan_notify.setOnClickListener(this); + iv_talk.setOnClickListener(this); + } + + @Override + public void onClick(View view) { + switch (view.getId()){ + case R.id.img_leftBtn: + finish(); + break; + case R.id.iv_qiyuan_notify://企缘推送 + if("0".equals(inform)){ + iv_qiyuan_notify.setImageResource(R.drawable.switch_off); + inform = "1"; + }else{ + iv_qiyuan_notify.setImageResource(R.drawable.switch_on); + inform = "0"; + } + action = "2"; + submitPush(); + break; + case R.id.iv_talk://聊天推送,由环信控制 + setHxPush(); + submitPush(); + break; + default: + break; + } + } + + /** + * 环信推送点击事件 + */ + private void setHxPush(){ + if(settingsModel.getSettingMsgNotification()&&"0".equals(msg)){ + iv_talk.setImageResource(R.drawable.switch_off); + settingsModel.setSettingMsgNotification(false); + msg = "1"; + }else{ + iv_talk.setImageResource(R.drawable.switch_on); + settingsModel.setSettingMsgNotification(true); + msg = "0"; + } + } + + /** + * 是否推送相关查询和修改 + */ + private void submitPush() { + String pushUrl = Constant.COMMON_URL + Interface.PUSH_SET_NEW; + JSONObject obj = new JSONObject(); + obj.put("userID",userID); + obj.put("action",action);//1查询 2修改 + obj.put("version",Constant.VERSION); + if("2".equals(action)){ + obj.put("inform",inform);//企缘推送 + obj.put("msg",msg);//环信推送 + } + String param = JSON.toJSONString(obj); + Log.d("ok", "submitPush: "+param); + okHttpUtil.sendJsonStrByPostAsync(this,false,pushUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + if("1".equals(rsCode)){ + if("1".equals(action)){ + String result = jsonObject.getString("message"); + PushModel model = JSON.parseObject(result,PushModel.class); + inform = model.getInform(); + msg = model.getMsg(); + if("0".equals(inform)){ + iv_qiyuan_notify.setImageResource(R.drawable.switch_on); + }else{ + iv_qiyuan_notify.setImageResource(R.drawable.switch_off); + } + if(settingsModel.getSettingMsgNotification()&&"0".equals(msg)){ + iv_talk.setImageResource(R.drawable.switch_on); + }else{ + iv_talk.setImageResource(R.drawable.switch_off); + } + } + if("2".equals(action)){ + //成功,不需要进行任何操作 + } + } + } + },null); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + okHttpUtil.cancelTag(this); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/MyActActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/MyActActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..6d6985a90c47012f2288eea5959f2135529ba654 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/MyActActivity.java @@ -0,0 +1,158 @@ +package com.jiuqi.elove.activity; + +import android.content.Intent; +import android.os.Bundle; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.View; +import android.widget.RelativeLayout; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.jiuqi.elove.R; +import com.jiuqi.elove.adapter.MyActAdapter; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.entity.MyActModel; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; +import com.jiuqi.elove.widget.pulltorefresh.PullToRefreshLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; + +/** + * 我的活动 + */ +public class MyActActivity extends ABaseActivity implements PullToRefreshLayout.OnRefreshListener{ + + /** + * 组件 + */ + @BindView(R.id.rlay_nodata) + RelativeLayout rlay_nodata; + @BindView(R.id.refresh_view) + PullToRefreshLayout refresh_view; + @BindView(R.id.rv) + RecyclerView rv; + + /** + * 数据 + */ + private String limit = "10"; + private String offset = "1"; + private String userid; + private List mList; + private List mAddList; + + /** + * 工具 + */ + private MyActAdapter adapter; + private boolean isshow = true; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_my_act,"我的活动",-1,MODE_BACK,HEIGHT_REDBG_WHITEFONT); + getDataFromSp(); + setAdapter(); + loadData2View(); + } + + /** + * 获取数据 + */ + private void getDataFromSp() { + userid = SpUtils.getString(Constant.USER_ID); + } + + /** + * 初始化list,设置adapter + */ + private void setAdapter() { + adapter = new MyActAdapter(this,R.layout.item_my_act); + rv.setLayoutManager(new LinearLayoutManager(this)); + rv.setAdapter(adapter); + //初始化list,并且设置监听事件 + mAddList = new ArrayList<>(); + refresh_view.setOnRefreshListener(this); + adapter.setListener(new MyActAdapter.ItemClickListener() { + @Override + public void onItemClick(MyActModel model) { + startDetailPage(model); + } + }); + } + + private void startDetailPage(MyActModel model){ + Intent intent = new Intent(this,EActDetailActivity2_0_3.class); + intent.putExtra("actid",model.getRecid()); + startActivity(intent); + } + + private void loadData2View() { + String actUrl = Constant.COMMON_URL + Interface.MY_APPLY_ACT; + JSONObject obj = new JSONObject(); + obj.put("userid",userid); + obj.put("offset",offset); + obj.put("limit",limit); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, isshow, actUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String msg = jsonObject.getString("explanation"); + if(Constant.SUCCESS_CODE.equals(rsCode)){ + handleData2View(jsonObject); + }else{ + showToast(msg); + } + } + },null); + } + + /** + * 根据结果设置展示效果 + */ + private void handleData2View(JSONObject obj) { + String result = obj.getString("message"); + mList = JSONArray.parseArray(result,MyActModel.class); + mAddList.addAll(mList); + if(mAddList.isEmpty()){ + rlay_nodata.setVisibility(View.VISIBLE); + }else{ + rlay_nodata.setVisibility(View.GONE); + if (!mList.isEmpty()) { + adapter.updateListView(mAddList); + refresh_view.refreshFinish(PullToRefreshLayout.SUCCEED); + } else { + refresh_view.loadmoreFinish(PullToRefreshLayout.SUC_NODATA); + } + } + } + + @Override + public void onRefresh(PullToRefreshLayout pullToRefreshLayout) { + isshow = false; + offset = "1"; + mAddList.clear(); + loadData2View(); + } + + @Override + public void onLoadMore(PullToRefreshLayout pullToRefreshLayout) { + isshow = false; + offset = String.valueOf(Integer.parseInt(offset)+1); + loadData2View(); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + okHttpUtil.cancelTag(this); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/MyAuthListActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/MyAuthListActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..6621e700a25e22ac54d3ef0332c2e346ff174708 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/MyAuthListActivity.java @@ -0,0 +1,153 @@ +package com.jiuqi.elove.activity; + +import android.content.Intent; +import android.os.Bundle; +import android.support.v4.content.ContextCompat; +import android.view.View; +import android.widget.TextView; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.entity.ChatPersonModel; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; + +import butterknife.BindView; +import butterknife.OnClick; + + +public class MyAuthListActivity extends ABaseActivity{ + + /** + * 组件 + */ + @BindView(R.id.tv_name_auth) + TextView tv_name_auth; + @BindView(R.id.tv_e_auth) + TextView tv_e_auth; + @BindView(R.id.tv_youth) + TextView tv_youth; + /** + * 数据 + */ + private String userid; + private int kind;//0 未认证企业 1已认证企业 + private String IDCard;//0 未实名认证 1已实名认证 + private String youth;//青年之声认证 + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_my_auth_list,"我的认证"); + getDataFromSp(); + } + + @Override + protected void onResume() { + super.onResume(); + getHisInfoAndInit();//获取各个认证的状态 + } + + /** + * 环信 + */ + private void getHisInfoAndInit() { + String getChatUrl = Constant.COMMON_URL + Interface.CHAT_INFO; + JSONObject obj = new JSONObject(); + obj.put("userID",userid); + obj.put("action","1");//为了解决个人中心可以看自己的头像 + obj.put("version",Constant.VERSION); + String param = JSON.toJSONString(obj); + okHttpUtil.sendJsonStrByPostAsync(this,false,getChatUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + if ("1".equals(rsCode)){ + String result = jsonObject.getString("message"); + ChatPersonModel model = JSON.parseObject(result,ChatPersonModel.class); + setData2View(model); + } + } + },null); + + } + + + private void getDataFromSp() { + userid = SpUtils.getString(Constant.USER_ID); + } + + @OnClick({R.id.rl_name_auth,R.id.rl_e_auth}) + public void OnClick(View view){ + switch (view.getId()){ + case R.id.rl_name_auth: + startRealNamePage(); + break; + case R.id.rl_e_auth: + startCompanyAuthPage(); + break; + } + } + + /** + * 进入单位认证页面 + */ + private void startCompanyAuthPage() { + if(Constant.REALNAME_PASS.equals(IDCard)||Constant.COMPANY_PASS.equals(String.valueOf(kind))){ + Intent intent = new Intent(this,CompanyAuthActivity.class); + startActivity(intent); + }else{ + showToast("请先进行实名认证哦~"); + } + } + + /** + * 进入实名认证页面 + */ + private void startRealNamePage() { + Intent intent = new Intent(this,MyRealNameActivity.class); + startActivity(intent); + } + + /** + * 通过数据改变ui + */ + private void setData2View(ChatPersonModel model) { + kind = model.getKind(); + IDCard = model.getRealnametype(); + youth = model.getYouthLeague(); + //单位认证 + if (Constant.COMPANY_PASS.equals(String.valueOf(kind))) { + tv_e_auth.setText("已认证"); + tv_e_auth.setTextColor(ContextCompat.getColor(this,R.color.colorPrimary)); + } else if (Constant.COMPANY_WAITING.equals(String.valueOf(kind))) { + tv_e_auth.setText("审核中"); + tv_e_auth.setTextColor(ContextCompat.getColor(this,R.color.colorPrimary)); + } else { + tv_e_auth.setText("未认证"); + tv_e_auth.setTextColor(ContextCompat.getColor(this,R.color.gray)); + } + //实名认证 + if (Constant.REALNAME_PASS.equals(IDCard)) { + tv_name_auth.setText("已认证"); + tv_name_auth.setTextColor(ContextCompat.getColor(this,R.color.colorPrimary)); + } else if (Constant.NAME_ING.equals(IDCard)) { + tv_name_auth.setText("审核中"); + tv_name_auth.setTextColor(ContextCompat.getColor(this,R.color.colorPrimary)); + } else { + tv_name_auth.setText("未认证"); + tv_name_auth.setTextColor(ContextCompat.getColor(this,R.color.gray)); + } + //青年之声认证 + if (Constant.YOUTH_PASS.equals(youth)) { + tv_youth.setText("已认证"); + tv_youth.setTextColor(ContextCompat.getColor(this,R.color.colorPrimary)); + }else { + tv_youth.setText("未认证"); + tv_youth.setTextColor(ContextCompat.getColor(this,R.color.gray)); + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/MyCircleActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/MyCircleActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..6d424dd9963d6da244fa4f61cfaccf8d4ae93097 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/MyCircleActivity.java @@ -0,0 +1,25 @@ +package com.jiuqi.elove.activity; + +import android.os.Bundle; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.fragment.FriendCircleFragment; + +public class MyCircleActivity extends ABaseActivity{ + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_my_circle,"我的足迹"); + initView(); + } + + private void initView() { + FriendCircleFragment fragment = new FriendCircleFragment(); + Bundle args = new Bundle(); + args.putString("title","我的足迹"); + fragment.setArguments(args); + getSupportFragmentManager().beginTransaction().add(R.id.container, fragment).commit(); + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/MyGiftActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/MyGiftActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..d778f33d1fd706939fb88b951671b4703a7d3128 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/MyGiftActivity.java @@ -0,0 +1,124 @@ +package com.jiuqi.elove.activity; + +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.support.v4.view.ViewPager; +import android.view.View; +import android.widget.ImageView; +import android.widget.RadioButton; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.adapter.CommonFragmentAdapter; +import com.jiuqi.elove.common.JqBaseActivity; +import com.jiuqi.elove.fragment.ReceiveGiftFragment; +import com.jiuqi.elove.fragment.SendGiftFragment; + +import java.util.ArrayList; + +public class MyGiftActivity extends JqBaseActivity implements View.OnClickListener{ + + /** + * 控件 + */ + private RadioButton tv_receive; + private RadioButton tv_send; + private ImageView img_leftBtn; + private ViewPager giftVpager; + private ArrayList fragmentlist; + private SendGiftFragment sendGiftFragment; + private ReceiveGiftFragment receiveGiftFragment; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_my_gift); + initView(); + addFragment(); + setEvents(); + } + + private void initView() { + tv_receive = easyFind(R.id.tv_receive); + tv_send = easyFind(R.id.tv_send); + img_leftBtn = easyFind(R.id.img_leftBtn); + giftVpager = easyFind(R.id.giftVpager); + } + + private void addFragment() { + fragmentlist = new ArrayList<>(); + receiveGiftFragment = new ReceiveGiftFragment(); + sendGiftFragment = new SendGiftFragment(); + fragmentlist.add(receiveGiftFragment); + fragmentlist.add(sendGiftFragment); + giftVpager.setAdapter(new CommonFragmentAdapter(getSupportFragmentManager(),fragmentlist)); + receiveChecked();//默认设置收到的礼物被选中 + } + + private void setEvents() { + tv_receive.setOnClickListener(this); + tv_send.setOnClickListener(this); + img_leftBtn.setOnClickListener(this); + giftVpager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int i, float v, int i1) { + + } + + @Override + public void onPageSelected(int i) { + switch (i){ + case 0: + receiveChecked(); + break; + case 1: + sendChecked(); + break; + } + } + + @Override + public void onPageScrollStateChanged(int i) { + + } + }); + } + + /** + * 设置收到礼物的title被选中 + */ + private void receiveChecked(){ + tv_receive.setTextColor(getResources().getColor(R.color.topbarBackground)); + tv_send.setTextColor(getResources().getColor(R.color.white)); + tv_receive.setChecked(true); + tv_send.setChecked(false); + giftVpager.setCurrentItem(0); + } + + /** + * 设置送出的礼物title被选中 + */ + private void sendChecked(){ + tv_send.setTextColor(getResources().getColor(R.color.topbarBackground)); + tv_receive.setTextColor(getResources().getColor(R.color.white)); + tv_send.setChecked(true); + tv_receive.setChecked(false); + giftVpager.setCurrentItem(1); + } + + @Override + public void onClick(View view) { + switch (view.getId()){ + case R.id.tv_receive: + receiveChecked(); + break; + case R.id.tv_send: + sendChecked(); + break; + case R.id.img_leftBtn: + finish(); + break; + default: + break; + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/MyHobbyActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/MyHobbyActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..9128405378dad7067eac7104fab04b5081b045a5 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/MyHobbyActivity.java @@ -0,0 +1,230 @@ +package com.jiuqi.elove.activity; + +import android.app.Activity; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.view.Window; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.common.JqBaseActivity; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; +import com.jiuqi.elove.widget.WordWrapView; + +import java.util.List; + +/** + * + * Created by dl on 2016/7/5. + */ +public class MyHobbyActivity extends JqBaseActivity implements View.OnClickListener{ + + private static final String TAG = "MyHobbyActivity"; + //自动换行 + private WordWrapView wordWrapView; + /*顶部菜单栏按钮*/ + private TextView tvTitle; + private ImageView tvBack; + + /** + * 13个兴趣爱好按钮 + * + */ + private String[] hobbys = new String[]{"读书","音乐","影视","绘画","书法","游戏","宠物","运动","美食","旅游","摄影","厨艺","舞蹈"}; + private Button btn_hobby1; + private Button btn_hobby2; + private Button btn_hobby3; + private Button btn_hobby4; + private Button btn_hobby5; + private Button btn_hobby6; + private Button btn_hobby7; + private Button btn_hobby8; + private Button btn_hobby9; + private Button btn_hobby10; + private Button btn_hobby11; + private Button btn_hobby12; + private Button btn_hobby13; + + private String action = "1";//1查找 2 添加 3 删除 + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_myhobby); + initView(); + initEvents(); + } + + private void initView() { + tvBack = (ImageView)findViewById(R.id.img_leftBtn); + tvTitle = (TextView)findViewById(R.id.tvTitle); + tvTitle.setText(getResources().getString(R.string.interest_hobby_title)); + tvBack.setVisibility(View.VISIBLE); + + + btn_hobby1 = easyFind(R.id.btn_hobby1); + btn_hobby2 = easyFind(R.id.btn_hobby2); + btn_hobby3 = easyFind(R.id.btn_hobby3); + btn_hobby4 = easyFind(R.id.btn_hobby4); + btn_hobby5 = easyFind(R.id.btn_hobby5); + btn_hobby6 = easyFind(R.id.btn_hobby6); + btn_hobby7 = easyFind(R.id.btn_hobby7); + btn_hobby8 = easyFind(R.id.btn_hobby8); + btn_hobby9 = easyFind(R.id.btn_hobby9); + btn_hobby10 = easyFind(R.id.btn_hobby10); + btn_hobby11 = easyFind(R.id.btn_hobby11); + btn_hobby12 = easyFind(R.id.btn_hobby12); + btn_hobby13 = easyFind(R.id.btn_hobby13); + + } + + private void initEvents(){ + tvBack.setOnClickListener(this); + btn_hobby1.setOnClickListener(this); + btn_hobby2.setOnClickListener(this); + btn_hobby3.setOnClickListener(this); + btn_hobby4.setOnClickListener(this); + btn_hobby5.setOnClickListener(this); + btn_hobby6.setOnClickListener(this); + btn_hobby7.setOnClickListener(this); + btn_hobby8.setOnClickListener(this); + btn_hobby9.setOnClickListener(this); + btn_hobby10.setOnClickListener(this); + btn_hobby11.setOnClickListener(this); + btn_hobby12.setOnClickListener(this); + btn_hobby13.setOnClickListener(this); + initDataAndView(""); + } + + private void initDataAndView(String hobby) { + String labelUrl = Constant.COMMON_URL + Interface.MY_HOBBY; + String userId = SpUtils.getString(Constant.USER_ID); + JSONObject paramObj = new JSONObject(); + paramObj.put("userID",userId); + paramObj.put("action",action); + paramObj.put("version",Constant.VERSION); + if(!hobby.equals("")){ + paramObj.put("hobby",hobby); + } + final String str = hobby; + String param = paramObj.toJSONString(); + Log.d(TAG, "initDataAndView: param"+param); + okHttpUtil.sendJsonStrByPostAsync(MyHobbyActivity.this,false,labelUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if("1".equals(rsCode) && action.equals("1")){ + String message = jsonObject.getString("message"); + JSONObject obj = JSON.parseObject(message); + String hobbyStrs = obj.getString("hobbys"); + List hobbylist = JSON.parseArray(hobbyStrs,String.class); + for(int i=0;i pictureList;//相册图片List + private String pageKind; + + /** + *工具 + */ + public static MyInfoActivity instance; + private boolean isshow = true; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_my_info,"",-1,MODE_NONE,HEIGHT_NONE_LIGHT); + instance = this; + initDataMap();//初始化 民族 数据映射 + initView(); + getInfoFromSp();//从缓存中获取数据 + getMyProfile();//获取个人资料 + getMyPhoto(); + } + + /** + * 获取我的相片不是全部 + */ + private void getMyPhoto() { + String photoUrl = Constant.COMMON_URL + Interface.MY_PHOTO; + JSONObject obj = new JSONObject(); + obj.put("userID", userId); + obj.put("version",Constant.VERSION); + obj.put("action",1); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, false, photoUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + if(jsonObject==null){ + return; + } + String rsCode = jsonObject.getString("retcode"); + if ("1".equals(rsCode)) { + String result = jsonObject.getString("message"); + pictureList = JSON.parseArray(result,OtherInfoCenterModel.PicturesBean.class); + if(pictureList==null||pictureList.size()<=0){ + ll_photos.setVisibility(View.GONE); + iv_add_photo.setVisibility(View.VISIBLE); + }else{ + ll_photos.setVisibility(View.VISIBLE); + iv_add_photo.setVisibility(View.GONE); + HorizontalListViewAdapter imgAdapter = new HorizontalListViewAdapter(MyInfoActivity.this,pictureList); + hlistview.setAdapter(imgAdapter); + } + } + } + }, null); + } + + + /** + * 初始化民族map数据 + */ + private void initDataMap() { + CommonDataUtil.setNationMap(); + } + + private void initView() { + imgBack.setVisibility(View.VISIBLE); + hlistview.setLayoutParams(getMyLayout()); + rl_video.setLayoutParams(getMyRelativeLayout()); + iv_video.setLayoutParams(getMyRelativeLayout()); + iv_add_photo.setLayoutParams(getMyItemLayout()); + RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.WRAP_CONTENT); + lp.setMargins(0, StatusBarUtil.intStatusView(),0,0); + rlay_title.setLayoutParams(lp); + } + + /** + * 从缓存中获取数据 + */ + private void getInfoFromSp() { + userId = SpUtils.getString(Constant.USER_ID); + } + + /** + * 获取我的资料 + */ + private void getMyProfile() { + String myInfoUrl = Constant.COMMON_URL + Interface.MY_NEWINFO; + JSONObject jsonObject = new JSONObject(); + jsonObject.put("userid",userId); + jsonObject.put("version",Constant.VERSION); + String param = jsonObject.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this,isshow,myInfoUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String resCode = jsonObject.getString("retcode"); + if(Constant.SUCCESS_CODE.equals(resCode)){ + String result = jsonObject.getString("information"); + HandleProfileDataAndView(result); + } + } + },null); + } + + /** + * 将获取到的资料设置到UI中 + * @param result 从服务器获取的model结果字符串 + */ + private void HandleProfileDataAndView(String result) { + final MyInfoModel myModel = JSONObject.parseObject(result,MyInfoModel.class); + IDCard = myModel.getRealnametype(); + String declaration = myModel.getDeclaration(); + /** + * 基本信息 5 个 + */ + String nikeName = myModel.getNickname(); + String name = myModel.getName(); + String sex = myModel.getSex();//0女1男 + String birth = myModel.getBirthday(); + String liveaddress = myModel.getLocalplace(); + /** + * 详细信息 10 个 + */ + String height = myModel.getHeight(); + String degree = myModel.getDegree(); + String profession = myModel.getProfession(); + String company = myModel.getEnterprise(); + String origo = myModel.getOrigo(); + String nation = myModel.getNation(); + String income = myModel.getIncome(); + String marriage = myModel.getMarrige(); + String house = myModel.getIfhouse(); + String car = myModel.getIfcar(); + /** + * 择偶要求 7个 + */ + minagerequest = myModel.getMinagerequest(); + maxagerequest = myModel.getMaxagerequest(); + minheightrequest = myModel.getMinheightrequest(); + maxheightrequest = myModel.getMaxheightrequest(); + String degreerq = myModel.getDegreerequest(); + String incomerq = myModel.getIncomerequest(); + String liveaddressrq = myModel.getLocationrequest(); + String houserq = myModel.getHouserequest(); + String carrq = myModel.getCarrequest(); + /** + * 将数据存入view中显示 + */ + avatar = myModel.getAvatar(); + EasyGlide.getInstance().showImage(true,avatar,iv_avatar,iv_blur,R.drawable.img_hx_avatar); + if(JqStrUtil.isEmpty(myModel.getVideo())){ + rl_video.setVisibility(View.GONE); + iv_video.setScaleType(ImageView.ScaleType.FIT_XY); + Glide.with(getApplicationContext()).load(R.drawable.no_video_default).into(iv_video); + }else{ + //两种方式都可以让图片充满view + rl_video.setVisibility(View.VISIBLE); +// Bitmap bitmap = CommonUtil.getVideoThumbnail(myModel.getVideo(),CommonUtil.dip2px(this,110), CommonUtil.dip2px(this,70)); + Bitmap bitmap = CommonUtil.getVideoThumbnail(myModel.getVideo()); + if(bitmap!=null){ + iv_video.setScaleType(ImageView.ScaleType.FIT_XY); + iv_video.setImageBitmap(bitmap); + } + } + + if(Constant.REALNAME_PASS.equals(IDCard)){ + iv_o_authstatus.setImageResource(R.drawable.icon_idcard_on); + }else{ + iv_o_authstatus.setImageResource(R.drawable.icon_idcard_un); + } + if(Constant.YOUTH_PASS.equals(myModel.getYouthLeague())){ + iv_qiyuan_status.setImageResource(R.drawable.icon_qingnian_on); + }else{ + iv_qiyuan_status.setImageResource(R.drawable.icon_qingnian_un); + } + if(Constant.COMPANY_PASS.equals(myModel.getKind())){ + iv_company_auth.setImageResource(R.drawable.icon_company_on); + }else{ + iv_company_auth.setImageResource(R.drawable.icon_company_un); + } + if(JqStrUtil.isEmpty(declaration)){ + tv_selfintro_null.setVisibility(View.VISIBLE); + }else{ + tv_selfintro_null.setVisibility(View.GONE); + txt_introduce.setText(declaration); + } + finish_percent.setText(myModel.getCompleteness()+"%"); + tv_myID.setText(myModel.getIDNum()); + StrUtil.setContentUnInput(tv_school,myModel.getSchool()); + tv_today.setText(myModel.getVisitortodaynum()); + tv_total.setText(myModel.getVisitornum()); + tv_mynikeName.setText(nikeName); + tv_mynameStr.setText(name); + tv_sexStr.setText(CommonDataUtil.sexMap.get(sex)); + tv_addressStr.setText(liveaddress); + tv_myHeight.setText(height); + tv_myDegree.setText(CommonDataUtil.degreeMap.get(degree)); + tv_myProfession.setText(CommonDataUtil.professionMap.get(profession)); + tv_myCompany.setText(company); + tv_myOrigo.setText(origo); + tv_myNation.setText(CommonDataUtil.nationMap.get(nation)); + tv_mySalary.setText(CommonDataUtil.incomeMap.get(income)); + tv_myMarriage.setText(CommonDataUtil.marriageMap.get(marriage)); + tv_myHouse.setText(CommonDataUtil.houseMap.get(house)); + tv_myCar.setText(CommonDataUtil.carMap.get(car)); + if(TextUtils.isEmpty(myModel.getAge())){ + tv_age.setText("未填"); + }else{ + tv_age.setText(myModel.getAge()+"岁"); + } + StrUtil.setContentUnInput(tv_myWeight,myModel.getWeight()); + setHeightrq2View(minheightrequest,maxheightrequest,tv_demand_heightStr); + setAgerq2View(minagerequest,maxagerequest,tv_demand_ageStr); + tv_demand_enducationStr.setText(CommonDataUtil.degreeMap.get(degreerq)); + tv_demand_salaryStr.setText(CommonDataUtil.incomeMap.get(incomerq)); + if(JqStrUtil.isEmpty(liveaddressrq)||"-1".equals(liveaddressrq)){ + tv_demand_addressStr.setText("不限"); + }else{ + tv_demand_addressStr.setText(liveaddressrq); + } + tv_demand_isHasHouseStr.setText(CommonDataUtil.houseRequestMap.get(houserq)); + tv_demand_isHasCarStr.setText(CommonDataUtil.carRequestMap.get(carrq)); + //兴趣爱好 + if(myModel.getHobbys().size()<=0){ + flex_hobby.removeAllViews(); + }else{ + flex_hobby.removeAllViews(); + for(int i = 0; i pictureList;//相册图片List + private String pageKind; + + /** + *工具 + */ + private OkHttpUtil okHttpUtil = OkHttpUtil.getInstance(); + public static MyInfoActivity2_53 instance; + private boolean isshow = true; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_my_info_activity2_53,"",-1,MODE_NONE,HEIGHT_NONE_LIGHT); + instance = this; + initDataMap();//初始化 民族 数据映射 + initView(); + initEvents(); + getInfoFromSp();//从缓存中获取数据 + getMyProfile();//获取个人资料 + getMyPhoto(); + } + + /** + * 获取我的相片不是全部 + */ + private void getMyPhoto() { + String photoUrl = Constant.COMMON_URL + Interface.MY_PHOTO; + JSONObject obj = new JSONObject(); + obj.put("userID", userId); + obj.put("version",Constant.VERSION); + obj.put("action",1); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, false, photoUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + if(jsonObject==null){ + return; + } + String rsCode = jsonObject.getString("retcode"); + if ("1".equals(rsCode)) { + String result = jsonObject.getString("message"); + pictureList = JSON.parseArray(result,OtherInfoCenterModel.PicturesBean.class); + if(pictureList==null||pictureList.size()<=0){ + ll_photos.setVisibility(View.GONE); + iv_add_photo.setVisibility(View.VISIBLE); + }else{ + ll_photos.setVisibility(View.VISIBLE); + iv_add_photo.setVisibility(View.GONE); + HorizontalListViewAdapter imgAdapter = new HorizontalListViewAdapter(MyInfoActivity2_53.this,pictureList); + hlistview.setAdapter(imgAdapter); + } + } + } + }, null); + } + + + /** + * 初始化民族map数据 + */ + private void initDataMap() { + CommonDataUtil.setNationMap(); + } + + private void initView() { + rl_right_btn = easyFind(R.id.rl_right_btn); + imgBack = easyFind(R.id.img_leftBtn); + imgBack.setVisibility(View.VISIBLE); + iv_avatar = easyFind(R.id.iv_avatar); + tv_avatartype = easyFind(R.id.tv_avatartype); + iv_o_authstatus = easyFind(R.id.iv_o_authstatus); + iv_qiyuan_status = easyFind(R.id.iv_qiyuan_status); + txt_introduce = easyFind(R.id.txt_introduce); + tv_selfintro_null = easyFind(R.id.tv_selfintro_null); + tv_lead_editdeclare = easyFind(R.id.tv_lead_editdeclare); + tv_mynikeName = easyFind(R.id.tv_mynikeName); + tv_mynameStr = easyFind(R.id.tv_mynameStr); + tv_sexStr = easyFind(R.id.tv_sexStr); + tv_birthStr = easyFind(R.id.tv_birthStr); + tv_addressStr = easyFind(R.id.tv_addressStr); + tv_myHeight = easyFind(R.id.tv_myHeight); + tv_myDegree = easyFind(R.id.tv_myDegree); + tv_myProfession = easyFind(R.id.tv_myProfession); + tv_myCompany = easyFind(R.id.tv_myCompany); + tv_myOrigo = easyFind(R.id.tv_myOrigo); + tv_myNation = easyFind(R.id.tv_myNation); + tv_mySalary = easyFind(R.id.tv_mySalary); + tv_myMarriage = easyFind(R.id.tv_myMarriage); + tv_myHouse = easyFind(R.id.tv_myHouse); + tv_myCar = easyFind(R.id.tv_myCar); + tv_demand_ageStr = easyFind(R.id.tv_demand_ageStr); + tv_demand_heightStr = easyFind(R.id.tv_demand_heightStr); + tv_demand_enducationStr = easyFind(R.id.tv_demand_enducationStr); + tv_demand_salaryStr = easyFind(R.id.tv_demand_salaryStr); + tv_demand_addressStr = easyFind(R.id.tv_demand_addressStr); + tv_demand_isHasHouseStr = easyFind(R.id.tv_demand_isHasHouseStr); + tv_demand_isHasCarStr = easyFind(R.id.tv_demand_isHasCarStr); + tv_lead_editbaseinfo = easyFind(R.id.tv_lead_editbaseinfo); + tv_lead_editdetailinfo = easyFind(R.id.tv_lead_editdetailinfo); + tv_lead_editrequireinfo = easyFind(R.id.tv_lead_editrequireinfo); + txt_introduce = easyFind(R.id.txt_introduce); + wordwrapview_hobby = easyFind(R.id.wordwrapview_hobby); + wordwrapview_label = easyFind(R.id.wordwrapview_label); + txt_hobby_null = easyFind(R.id.txt_hobby_null); + txt_label_null = easyFind(R.id.txt_label_null); + tv_lead_editdhobby = easyFind(R.id.tv_lead_editdhobby); + tv_lead_editdlabel = easyFind(R.id.tv_lead_editdlabel); +// rl_otherBackground = easyFind(R.id.rl_otherBackground); + iv_blur = easyFind(R.id.iv_blur); + ll_today_vistor = easyFind(R.id.ll_today_vistor); + ll_total_visitor = easyFind(R.id.ll_total_visitor); + ll_person = easyFind(R.id.ll_person); + ll_other = easyFind(R.id.ll_other); + tv_person = easyFind(R.id.tv_person); + tv_other = easyFind(R.id.tv_other); + line_person = easyFind(R.id.line_person); + line_other = easyFind(R.id.line_other); + tv_today = easyFind(R.id.tv_today); + tv_total = easyFind(R.id.tv_total); + ll_person_content = easyFind(R.id.ll_person_content); + ll_other_content = easyFind(R.id.ll_other_content); + tv_myID = easyFind(R.id.tv_myID); + iv_video = easyFind(R.id.iv_video); + rl_video = easyFind(R.id.rl_video); + iv_add_photo = easyFind(R.id.iv_add_photo); + iv_company_auth = easyFind(R.id.iv_company_auth); + tv_lead_albumedit = easyFind(R.id.tv_lead_albumedit); + ll_photos = easyFind(R.id.ll_photos); + finish_percent = easyFind(R.id.finish_percent); + hlistview = easyFind(R.id.horizon_listview); + hlistview.setLayoutParams(getMyLayout()); + rl_video.setLayoutParams(getMyRelativeLayout()); + iv_video.setLayoutParams(getMyRelativeLayout()); + iv_add_photo.setLayoutParams(getMyItemLayout()); + RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); + lp.setMargins(0,StatusBarUtil.intStatusView(),0,0); + rlay_title.setLayoutParams(lp); + } + + private void initEvents() { + rl_right_btn.setOnClickListener(this);//点击进入我的名片 + imgBack.setOnClickListener(this);//返回按钮 + tv_lead_editbaseinfo.setOnClickListener(this);//基本信息 + tv_lead_editdetailinfo.setOnClickListener(this);//详细信息 + tv_lead_editrequireinfo.setOnClickListener(this);//择偶要求 + tv_lead_editdeclare.setOnClickListener(this);//交友宣言编辑 +// iv_avatar.setOnClickListener(this);//头像 + tv_lead_editdhobby.setOnClickListener(this);//兴趣爱好的编辑 + tv_lead_editdlabel.setOnClickListener(this);//标签的编辑 + ll_person.setOnClickListener(this); + ll_other.setOnClickListener(this); + ll_today_vistor.setOnClickListener(this); + ll_total_visitor.setOnClickListener(this); + tv_lead_albumedit.setOnClickListener(this); + iv_add_photo.setOnClickListener(this); + iv_video.setOnClickListener(this); + } + + /** + * 从缓存中获取数据 + */ + private void getInfoFromSp() { + userId = SpUtils.getString(Constant.USER_ID); + } + + /** + * 获取我的资料 + */ + private void getMyProfile() { + String myInfoUrl = Constant.COMMON_URL + Interface.MY_NEWINFO; + JSONObject jsonObject = new JSONObject(); + jsonObject.put("userid",userId); + jsonObject.put("version",Constant.VERSION); + String param = jsonObject.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(MyInfoActivity2_53.this,isshow,myInfoUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String resCode = jsonObject.getString("retcode"); + if("1".equals(resCode)){ + String result = jsonObject.getString("information"); + HandleProfileDataAndView(result); + } + } + },null); + } + + /** + * 将获取到的资料设置到UI中 + * @param result 从服务器获取的model结果字符串 + */ + private void HandleProfileDataAndView(String result) { + final MyInfoModel myModel = JSONObject.parseObject(result,MyInfoModel.class); + avatar = myModel.getAvatar(); + kind = myModel.getKind(); + avatartype = myModel.getAvatartype(); + IDCard = myModel.getRealnametype(); + String declaration = myModel.getDeclaration(); + /** + * 基本信息 5 个 + */ + String nikeName = myModel.getNickname(); + String name = myModel.getName(); + String sex = myModel.getSex();//0女1男 + String birth = myModel.getBirthday(); + String liveaddress = myModel.getLocalplace(); + /** + * 详细信息 10 个 + */ + String height = myModel.getHeight(); + String degree = myModel.getDegree(); + String profession = myModel.getProfession(); + String company = myModel.getEnterprise(); + String origo = myModel.getOrigo(); + String nation = myModel.getNation(); + String income = myModel.getIncome(); + String marriage = myModel.getMarrige(); + String house = myModel.getIfhouse(); + String car = myModel.getIfcar(); + /** + * 择偶要求 7个 + */ + minagerequest = myModel.getMinagerequest(); + maxagerequest = myModel.getMaxagerequest(); + minheightrequest = myModel.getMinheightrequest(); + maxheightrequest = myModel.getMaxheightrequest(); + String degreerq = myModel.getDegreerequest(); + String incomerq = myModel.getIncomerequest(); + String liveaddressrq = myModel.getLocationrequest(); + String houserq = myModel.getHouserequest(); + String carrq = myModel.getCarrequest(); + /** + * 将数据存入view中显示 + */ + Glide.with(getApplicationContext()).load(avatar).asBitmap().placeholder(R.drawable.img_yuanqueshengtouxiang).centerCrop().dontAnimate().into(new BitmapImageViewTarget(iv_avatar) { + protected void setResource(Bitmap resource) { + RoundedBitmapDrawable circularBitmapDrawable = + RoundedBitmapDrawableFactory.create(getResources(), resource); + circularBitmapDrawable.setCircular(true); + iv_avatar.setImageDrawable(circularBitmapDrawable); + iv_blur.setImageDrawable(BlurImageview.BlurImages(resource, MyInfoActivity2_53.this)); +// rl_otherBackground.setBackgroundDrawable(BlurImageview.BlurImages(resource, MyInfoActivity2_53.this)); + } + }); + if(JqStrUtil.isEmpty(myModel.getVideo())){ + rl_video.setVisibility(View.GONE); + iv_video.setScaleType(ImageView.ScaleType.FIT_XY); + Glide.with(getApplicationContext()).load(R.drawable.no_video_default).into(iv_video); + }else{ + //两种方式都可以让图片充满view + rl_video.setVisibility(View.VISIBLE); +// Bitmap bitmap = CommonUtil.getVideoThumbnail(myModel.getVideo(),CommonUtil.dip2px(this,110), CommonUtil.dip2px(this,70)); + Bitmap bitmap = CommonUtil.getVideoThumbnail(myModel.getVideo()); + if(bitmap!=null){ + iv_video.setScaleType(ImageView.ScaleType.FIT_XY); + iv_video.setImageBitmap(bitmap); + } + } + SpUtils.setString(Constant.AVATAR,avatar); + if(avatartype == 0){ + tv_avatartype.setText("上传头像"); + tv_avatartype.setVisibility(View.GONE); + }else if(avatartype == 1){ + tv_avatartype.setVisibility(View.GONE); + }else if(avatartype == 2){ + tv_avatartype.setText("头像审核中"); + tv_avatartype.setVisibility(View.GONE); + }else if(avatartype == 3){ + tv_avatartype.setText("审核未通过"); + tv_avatartype.setVisibility(View.GONE); + } + if(Constant.REALNAME_PASS.equals(IDCard)){ + iv_o_authstatus.setImageResource(R.drawable.rz_name_on); + }else{ + iv_o_authstatus.setImageResource(R.drawable.rz_name_un); + } + if(Constant.YOUTH_PASS.equals(myModel.getYouthLeague())){ + iv_qiyuan_status.setImageResource(R.drawable.rz_qiyuan_on); + }else{ + iv_qiyuan_status.setImageResource(R.drawable.rz_qiyuan_un); + } + if(Constant.COMPANY_PASS.equals(myModel.getKind())){ + iv_company_auth.setImageResource(R.drawable.icon_company_on); + }else{ + iv_company_auth.setImageResource(R.drawable.icon_company_un); + } + if(JqStrUtil.isEmpty(declaration)){ + tv_selfintro_null.setVisibility(View.VISIBLE); + }else{ + tv_selfintro_null.setVisibility(View.GONE); + txt_introduce.setText(declaration); + } + finish_percent.setText(myModel.getCompleteness()+"%"); + tv_myID.setText(myModel.getIDNum()); + tv_today.setText(myModel.getVisitortodaynum()); + tv_total.setText(myModel.getVisitornum()); + tv_mynikeName.setText(nikeName); + tv_mynameStr.setText(name); + tv_sexStr.setText(CommonDataUtil.sexMap.get(sex)); + tv_birthStr.setText(birth); + tv_addressStr.setText(liveaddress); + tv_myHeight.setText(height); + tv_myDegree.setText(CommonDataUtil.degreeMap.get(degree)); + tv_myProfession.setText(CommonDataUtil.professionMap.get(profession)); + tv_myCompany.setText(company); + tv_myOrigo.setText(origo); + tv_myNation.setText(CommonDataUtil.nationMap.get(nation)); + tv_mySalary.setText(CommonDataUtil.incomeMap.get(income)); + tv_myMarriage.setText(CommonDataUtil.marriageMap.get(marriage)); + tv_myHouse.setText(CommonDataUtil.houseMap.get(house)); + tv_myCar.setText(CommonDataUtil.carMap.get(car)); + setHeightrq2View(minheightrequest,maxheightrequest,tv_demand_heightStr); + setAgerq2View(minagerequest,maxagerequest,tv_demand_ageStr); + tv_demand_enducationStr.setText(CommonDataUtil.degreeMap.get(degreerq)); + tv_demand_salaryStr.setText(CommonDataUtil.incomeMap.get(incomerq)); + if(JqStrUtil.isEmpty(liveaddressrq)||"-1".equals(liveaddressrq)){ + tv_demand_addressStr.setText("不限"); + }else{ + tv_demand_addressStr.setText(liveaddressrq); + } + tv_demand_isHasHouseStr.setText(CommonDataUtil.houseRequestMap.get(houserq)); + tv_demand_isHasCarStr.setText(CommonDataUtil.carRequestMap.get(carrq)); + //兴趣爱好 + if(myModel.getHobbys().size()<=0){ + wordwrapview_hobby.removeAllViews(); + txt_hobby_null.setVisibility(View.VISIBLE); + }else{ + txt_hobby_null.setVisibility(View.GONE); + wordwrapview_hobby.removeAllViews(); + for(int i = 0; i btnList = new ArrayList<>(); + btnList.add(btn_label1); + btnList.add(btn_label2); + btnList.add(btn_label3); + btnList.add(btn_label4); + btnList.add(btn_label5); + btnList.add(btn_label6); + wordWrapView.addView(getAddImgView()); + if(owner.equals("isme")){//标签所属用户是当前用户 + SharedPreferences sp = getSharedPreferences("elove",MODE_PRIVATE); + sex = sp.getString("sex",""); + otherId = sp.getString("userid",""); + initDataAndView(""); + }else if(owner.equals("isother")){//标签所属用户是其他人 + sex = intent.getStringExtra("othersex"); + otherId = intent.getStringExtra("otherid"); + Bundle bundle = intent.getExtras(); + ArrayList labels = bundle.getStringArrayList("labels"); + for(int i=0;i labellist = JSON.parseArray(labelStrs,String.class); + for(int i=0;i provinceItems;//省份list +// private List> cityItems;//省份城市 +// private List> cityItemsName;//省份城市 + private List> cityItems;//省份城市 + private List> cityItemsName;//省份城市 + private String province; + private String city; + private String age; + private String degree; + private String profession; + private String salary; + private String base64file; + private String faceScore; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_my_name_card,"我的名片",-1,MODE_BACK,HEIGHT_REDBG_WHITEFONT); + getDataFromSp(); + initData(); + initView(); + loadData2View(); + } + + private void initData() { + CommonDataUtil.setHeightList();//设置身高 + CommonDataUtil.setAgeList();//设置年龄 + CommonDataUtil.setSexList();//设置性别 + CommonDataUtil.setDegreeList();//设置学历 + CommonDataUtil.setIncomeList();//设置收入 + provinceItems = EloveApplication.provinceItems; + cityItems = EloveApplication.province_city_or_area; + cityItemsName = EloveApplication.province_city_or_area_name; + } + + /** + * 从缓存获取数据 + */ + private void getDataFromSp() { + userid = SpUtils.getString(Constant.USER_ID); + realNameStatus = SpUtils.getString(Constant.ID_CARD); + } + + private void initView() { + iv_right.setImageResource(R.drawable.icon_card_explanation); + rl_right.setVisibility(View.VISIBLE); + MyLayoutManager.setImageLayout(this,iv_avatar,120,1,1,1); + if(Constant.REALNAME_PASS.equals(realNameStatus)){//如果实名认证 + iv_necessary_age.setVisibility(View.VISIBLE); + iv_age_next.setVisibility(View.GONE); + }else{ + iv_necessary_age.setVisibility(View.INVISIBLE); + iv_age_next.setVisibility(View.VISIBLE); + } + } + + /** + * 进入编辑页面 + */ + private void startEditPage() { + Intent intent = new Intent(this,EditSingleActivity.class); + intent.putExtra("title","编辑昵称"); + startActivityForResult(intent,0x110); + } + + /** + * 加载数据到ui中 + */ + private void loadData2View() { + String queryUrl = Constant.COMMON_URL + Interface.NAMECARD_QUERY; + JSONObject obj = new JSONObject(); + obj.put("userID",userid); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, true, queryUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String msg = jsonObject.getString("explanation"); + if(Constant.SUCCESS_CODE.equals(rsCode)){ + String result = jsonObject.getString("message"); + model = JSON.parseObject(result,NameCardModel.class); + handleModel2View(); + }else{ + showToast(msg); + } + } + },null); + } + + /** + * 将数据保存到ui中 + */ + private void handleModel2View() { + profession = model.getProfession(); + salary = model.getIncome(); + faceScore = model.getFacescore(); + degree = model.getDegree(); + showAvatar();//根据头像和性别展示图片 + CommonUtil.setSex(tv_sex,model.getSex()); + tv_nike.setText(model.getNickname()); + tv_sex.setText(CommonDataUtil.sexMap.get(model.getSex())); + tv_age.setText(StrUtil.returnEmptyOrUnit(model.getAge(),"岁")); + tv_height.setText(StrUtil.returnEmptyOrUnit(model.getHeight(),"cm")); + tv_degree.setText(CommonDataUtil.degreeMap.get(degree)); + tv_profession.setText(CommonDataUtil.professionMap.get(profession)); + tv_salary.setText(CommonDataUtil.incomeMap.get(salary)); + tv_live.setText(model.getLocalplace()); + tv_count.setText(model.getFacescore()+"%"); + ratingBar.setRating(Float.valueOf(faceScore)/100*5); + if(!isVerify()){//未审核或者未审核通过 + tv_sex.setEnabled(true); + }else{//审核或审核通过 + tv_sex.setEnabled(false); + } + } + + /** + * 根据头像和性别展示图片 + */ + private void showAvatar() { + if(TextUtils.isEmpty(model.getAvatar())){//如果为空 + if(Constant.GIRL.equals(model.getSex())){ + EasyGlide.getInstance().showImage(true,R.drawable.img_default_girl,iv_avatar,-1); + }else{ + EasyGlide.getInstance().showImage(true,R.drawable.img_default_boy,iv_avatar,-1); + } + }else{ + Glide.with(this).load(model.getAvatar()).asBitmap().into(new SimpleTarget() { + @Override + public void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) { + photo = resource; + base64file = CommonUtil.bitmap2StrByBase64(photo,80); + } + }); + EasyGlide.getInstance().showImage(true,model.getAvatar(),iv_avatar,-1); + } + } + + private boolean isVerify(){ + return Constant.REALNAME_PASS.equals(realNameStatus); + } + + /** + * 提交名片信息 + */ + private void updateNameCard() { + String nike = CommonUtil.getStrFromTv(tv_nike); + String age = CommonUtil.getStrFromTv(tv_age).replace("岁","").trim(); + String height = CommonUtil.getStrFromTv(tv_height).replace("cm","").trim(); + String live = CommonUtil.getStrFromTv(tv_live); + if(TextUtils.isEmpty(nike)){ + showToast("请输入昵称"); + return; + } + if(TextUtils.isEmpty(age)){ + showToast("请选择年龄"); + return; + } + if(TextUtils.isEmpty(height)){ + showToast("请选择身高"); + return; + } + if(TextUtils.isEmpty(degree)){ + showToast("请选择学历"); + return; + } + if(TextUtils.isEmpty(profession)){ + showToast("请选择职业"); + return; + } + if(TextUtils.isEmpty(salary)){ + showToast("请选择月薪"); + return; + } + if(TextUtils.isEmpty(live)){ + showToast("请选择居住地"); + return; + } + String updateUrl = Constant.COMMON_URL + Interface.NAMECARD_UPDATE; + JSONObject obj = new JSONObject(); + obj.put("userID",userid); +// obj.put("file",base64file); + obj.put("nickname",nike); + obj.put("age",age); + obj.put("height",height); + obj.put("degree",degree); + obj.put("profession",profession); + obj.put("income",salary); + obj.put("localplace",live); +// obj.put("facescore",faceScore); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, true, updateUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String msg = jsonObject.getString("explanation"); + if(Constant.SUCCESS_CODE.equals(rsCode)){ + if(MyInfoActivity.instance!=null){ + MyInfoActivity.instance.refresh(); + } + finish(); + } + showToast(msg); + } + },null); + } + + /** + * 获取权限,上传头像 + */ + private void getPermissionAndUpload() { + requestRuntimePermission(new String[]{Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE}, new PermissionListener() { + @Override + public void onGranted() { + createPopWindow(); + } + + @Override + public void onDenied(List deniedPermission) { + + } + }); + } + + /** + * 点击上传头像显示popupwindow + */ + private void createPopWindow() { + LayoutInflater layoutInflater = getLayoutInflater(); + View view = layoutInflater.inflate(R.layout.submit_popwindow_layout,null); + window = new PopupWindow(view, WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT); + TextView tv_takeavatar = (TextView) view.findViewById(R.id.tv_takeavatar); + TextView tv_selectavatar = (TextView) view.findViewById(R.id.tv_selectavatar); + TextView tv_cancel = (TextView) view.findViewById(R.id.tv_cancel); + HorizontalListView hlist_avatar = (HorizontalListView) view.findViewById(R.id.hlist_avatar); + LinearLayout ll_blank = (LinearLayout) view.findViewById(R.id.ll_blank); + hlist_avatar.setLayoutParams(getMyLayout()); + tv_takeavatar.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new Thread(){ + @Override + public void run() { + handler.sendEmptyMessageDelayed(TAKE_PHOTO,100); + } + }.start(); + } + }); + tv_selectavatar.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new Thread(){ + @Override + public void run() { + handler.sendEmptyMessageDelayed(SELECT_PHOTO,100); + } + }.start(); + } + }); + tv_cancel.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new Thread(){ + @Override + public void run() { + handler.sendEmptyMessageDelayed(CLOSE_WINDOW,100); + } + }.start(); + } + }); + ll_blank.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new Thread(){ + @Override + public void run() { + handler.sendEmptyMessageDelayed(CLOSE_WINDOW,100); + } + }.start(); + } + }); + HorizontalListViewAvatarAdapter imgAdapter = new HorizontalListViewAvatarAdapter(this,new int[]{R.drawable.icon_feiren, + R.drawable.icon_zhedang,R.drawable.icon_mohu,R.drawable.icon_baolu,R.drawable.icon_qingxie, + R.drawable.icon_feitou},new String[]{"非人物照","五官遮挡","模糊不清","衣着不当","倾斜颠倒","非头部照"}); + hlist_avatar.setAdapter(imgAdapter); + // 设置popWindow弹出窗体可点击,这句话必须添加,并且是true + window.setFocusable(true); + // 实例化一个ColorDrawable颜色为半透明 + ColorDrawable dw = new ColorDrawable(0xb0000000); + window.setBackgroundDrawable(dw); + // 设置popWindow的显示和消失动画 + window.setAnimationStyle(R.style.mypopwindow_anim_style); + // 在底部显示 + window.showAtLocation(view, Gravity.BOTTOM, 0, 0); + } + + /** + * 调用系统相机和系统相册 + */ + private void takePhoto(){ + File avatarFile = new File(getExternalCacheDir()+Constant.AVATAR_IMG_NAME); + try { + avatarFile.createNewFile(); + } catch (IOException e) { + e.printStackTrace(); + } + if(Build.VERSION.SDK_INT>=24){ + imgUri = FileProvider.getUriForFile(this,PROVIDER_IMG,avatarFile); + }else{ + imgUri = Uri.fromFile(avatarFile); + } + Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); + intent.putExtra(MediaStore.EXTRA_OUTPUT, imgUri); + startActivityForResult(intent,PHOTO_REQUEST_TAKEPHOTO); + } + + /** + * 系统相册 + */ + private void selectPhoto(){ + GalleryFinal.selectMedias(this, GalleryFinal.TYPE_IMAGE,1, new GalleryFinal.OnSelectMediaListener() { + @Override + public void onSelected(ArrayList photoArrayList) { + dirPath = photoArrayList.get(0).getPath(); + startCutImg(dirPath); + } + }); + } + + private void startCutImg(String path){ + Intent intent = new Intent(this, CutPictureAty.class); + intent.putExtra("path", path); + startActivityForResult(intent, 0x06); + } + + private Handler handler = new Handler(){ + @Override + public void handleMessage(Message msg) { + switch (msg.what){ + case TAKE_PHOTO: + takePhoto(); + if(window.isShowing()){ + window.dismiss(); + } + break; + case SELECT_PHOTO: + selectPhoto(); + if(window.isShowing()){ + window.dismiss(); + } + break; + case CLOSE_WINDOW: + if(window.isShowing()){ + window.dismiss(); + } + break; + default: + break; + } + } + }; + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + if(resultCode== Activity.RESULT_OK){ + switch (requestCode){ + case PHOTO_REQUEST_TAKEPHOTO:// 当选择拍照时调用 + startCutImg(getExternalCacheDir()+Constant.AVATAR_IMG_NAME); + break; + case 0x06: + if (data != null) { + String dirPath = data.getStringExtra("path"); + photo = BitmapFactory.decodeFile(dirPath); + uploadPerPicMethod();//裁剪成功后,重新再最后一次调用接口成功回调中调用刷新页面接口 + } + break; + case 0x110: + String nike = data.getStringExtra("result"); + tv_nike.setText(nike); + break; + case 0x111: + profession = data.getStringExtra("profession"); + tv_profession.setText(CommonDataUtil.professionMap.get(profession)); + break; + default: + break; + } + } + super.onActivityResult(requestCode, resultCode, data); + + } + + /** + * 上传图片的方法入口 + */ + private void uploadPerPicMethod() { + String urlserver = Constant.COMMON_URL + Interface.UPLOAD_AVATAR_COMMENT; + base64file = CommonUtil.bitmap2StrByBase64(photo,80); + final byte[] bytes = CommonUtil.bitmap2Byte(photo,80); + JSONObject obj = new JSONObject(); + obj.put("userid",userid); + obj.put("version",Constant.VERSION); + obj.put("file",base64file); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, true, urlserver, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String msg = jsonObject.getString("explanation"); + if(Constant.SUCCESS_CODE.equals(rsCode)){ + String message = jsonObject.getString("message"); + FaceModel model = JSON.parseObject(message,FaceModel.class); + EasyGlide.getInstance().showImage(true,bytes,iv_avatar,-1); + faceScore = model.getFacescore(); + tv_count.setText(faceScore+"%"); + ratingBar.setRating(Float.valueOf(faceScore)/100*5); + }else{ + showToast(msg); + } + } + },null); + } + + /** + * 名片说明的h5 + */ + private void startCommonH5Page() { + Intent intent = new Intent(this,CommonH5Activity.class); + intent.putExtra("title","名片介绍"); + startActivity(intent); + } + + @OnClick({R.id.rl_right,R.id.tv_submit,R.id.iv_avatar,R.id.rl_nike,R.id.rl_age,R.id.rl_height + ,R.id.rl_degree,R.id.rl_profession,R.id.rl_salary,R.id.rl_live}) + public void onClick(View view){ + switch (view.getId()){ + case R.id.rl_right: + startCommonH5Page(); + break; + case R.id.tv_submit: + updateNameCard(); + break; + case R.id.iv_avatar: + getPermissionAndUpload(); + break; + case R.id.rl_nike: + startEditPage(); + break; + case R.id.rl_age: + if(isVerify()){//审核通过 + showToast("认证中或者认证通过后年龄不可更改"); + return; + } + showPickerView("age"); + break; + case R.id.rl_height: + showPickerView("height"); + break; + case R.id.rl_degree: + showPickerView("degree"); + break; + case R.id.rl_profession: + startProfessionPage(); + break; + case R.id.rl_salary: + showPickerView("income"); + break; + case R.id.rl_live: + showPickerView("live"); + break; + } + } + + /** + * 跳转到选择职业页面 + */ + private void startProfessionPage() { + Intent intent = new Intent(this,SelectProfessionActivity.class); + intent.putExtra("profession",profession); + startActivityForResult(intent,0x111); + } + + /** + * 展示选择框 + * @param flag + */ + private void showPickerView(final String flag) { + setSelectTitle(flag);//设置选择的title + OptionsPickerView pvOptions = new OptionsPickerView.Builder(this, new OptionsPickerView.OnOptionsSelectListener() { + @Override + public void onOptionsSelect(int options1, int options2, int options3, View v) { + //返回的分别是三个级别的选中位置 + handleSelect(options1, options2,flag); + } + }) + .setTitleText(selectTitle) + .setDividerColor(Color.BLACK) + .setTextColorCenter(Color.BLACK) //设置选中项文字颜色 + .setContentTextSize(20) + .setOutSideCancelable(true)// default is true + .setDecorView(null) + .build(); + setData2View(pvOptions,flag);//将数据设置到ui中 + pvOptions.show(); + } + + /** + * + * @param pvOptions + */ + private void setData2View(OptionsPickerView pvOptions,String flag) { + if("sex".equals(flag)){ + pvOptions.setPicker(CommonDataUtil.mSexList); + }else if("live".equals(flag)){ + pvOptions.setPicker(provinceItems, cityItemsName);//二级选择器 + }else if("age".equals(flag)){ + pvOptions.setPicker(CommonDataUtil.ageList); + }else if("height".equals(flag)){ + pvOptions.setPicker(CommonDataUtil.heightList); + }else if ("degree".equals(flag)){ + pvOptions.setPicker(CommonDataUtil.degreeList); + }else if("income".equals(flag)){ + pvOptions.setPicker(CommonDataUtil.incomeList); + } + } + + /** + * 设置选择框的title + * @param flag 标志位 + */ + private void setSelectTitle(String flag) { + if("sex".equals(flag)){ + selectTitle = "选择性别"; + }else if("live".equals(flag)){ + selectTitle = "选择居住地"; + }else if("age".equals(flag)){ + selectTitle = "选择年龄"; + }else if("height".equals(flag)){ + selectTitle = "选择身高"; + }else if ("degree".equals(flag)){ + selectTitle = "选择学历"; + }else if("income".equals(flag)){ + selectTitle = "选择收入"; + } + } + + /** + * 选择家乡和户籍回调 + */ + private void handleSelect(int options1, int options2,String flag) { + if("live".equals(flag)){ + ProvinceBean proBean = provinceItems.get(options1); + Object obj = cityItems.get(options1).get(options2); + if(obj instanceof ProvinceBean.CityBean){ + ProvinceBean.CityBean cityBean = (ProvinceBean.CityBean) obj; + city = cityBean.getName(); + }else{ + ThridAreaBean bean = (ThridAreaBean) obj; + city = bean.getName(); + } + province = proBean.getName(); + tv_live.setText(province+"-"+city); + }else if("age".equals(flag)){ + age = CommonDataUtil.ageList.get(options1); + tv_age.setText(age); + }else if("height".equals(flag)){ + tv_height.setText(CommonDataUtil.heightList.get(options1)); + }else if("degree".equals(flag)){ + ConditionBean bean = CommonDataUtil.degreeList.get(options1); + tv_degree.setText(bean.getMsg()); + degree = bean.getCode(); + }else if("income".equals(flag)){ + ConditionBean bean = CommonDataUtil.incomeList.get(options1); + tv_salary.setText(bean.getMsg()); + salary = bean.getCode(); + } + } + + private LinearLayout.LayoutParams getMyLayout(){ + Resources resources = getResources(); + DisplayMetrics dm = resources.getDisplayMetrics(); + int width = dm.widthPixels; + LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(width,(width-14)/6); + layoutParams.setMargins(0,CommonUtil.dip2px(this,20),0,CommonUtil.dip2px(this,20)); + return layoutParams; + } + + @Override + protected void onDestroy() { + super.onDestroy(); + okHttpUtil.cancelTag(this); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/MyPhotoActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/MyPhotoActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..a41b721e046c84b0ce5072122c5ec3c9553f4b9b --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/MyPhotoActivity.java @@ -0,0 +1,538 @@ +package com.jiuqi.elove.activity; + +import android.Manifest; +import android.app.ProgressDialog; +import android.content.ContentResolver; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.pm.PackageManager; +import android.database.Cursor; +import android.graphics.Bitmap; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.os.Environment; +import android.os.Handler; +import android.provider.MediaStore; +import android.support.annotation.NonNull; +import android.support.v4.app.ActivityCompat; +import android.support.v4.app.FragmentActivity; +import android.support.v4.content.ContextCompat; +import android.support.v4.content.FileProvider; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.view.Window; +import android.widget.AdapterView; +import android.widget.GridView; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.sdk.android.oss.common.utils.BinaryUtil; +import com.baoyz.actionsheet.ActionSheet; +import com.jiuqi.elove.R; +import com.jiuqi.elove.adapter.MoreTypeGridAdapter; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.common.JqBaseActivity; +import com.jiuqi.elove.common.PermissionListener; +import com.jiuqi.elove.entity.MyPhotoModel; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; +import com.jiuqi.elove.util.UploadAliUtil; +import com.jiuqi.elove.widget.mediapicker.model.Photo; +import com.jiuqi.elove.widget.mediapicker.util.GalleryFinal; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import okhttp3.MediaType; + +/** + *我的资料 --->我的相册页面 + * Created by liulin on 2016/7/4. + */ +public class MyPhotoActivity extends JqBaseActivity implements View.OnClickListener,ActionSheet.ActionSheetListener { + + public static final String PROVIDER_IMG = "com.jiuqi.elove.fileprovider"; + private static final String TAG = "MyPhotoActivity"; + /** + * 工具 + */ + private static final int PHOTO_REQUEST_TAKEPHOTO = 0x01;// 拍照 + private final int TOTAL_COUNT = 9; + private final OkHttpUtil okHttpUtil = OkHttpUtil.getInstance(); + /** + * 组件 + */ + private ImageView tvBack; + private TextView tvTitle; + private TextView tvEdit; + private LinearLayout ll_edit; + private TextView del; + private TextView choseAll; + private GridView gv; + private MoreTypeGridAdapter adapter; + /** + * 数据 + */ + private String temPhonename=""; + private Uri imgUri= null; + private String dirPath;//图片的路径 + private List mList; + private List> mapList; + private List allIdList;//所有的idList,选中的idlist在adapter中定义 + private List mReadyList = new ArrayList<>();//将要上传的list + private int sendTimes; + private boolean picEditFlg = false; + private int currentCount;//当前相片数量 + private ProgressDialog mProgressDialog; + /** + * 主线程中接受数据完成通知获取,并进行处理 + */ + private Handler mHandler = new Handler() + { + public void handleMessage(android.os.Message msg) + { + + if(msg.what==0x111){ + ++sendTimes;//发送次数加一,由于判断发送了多少次,避免仅仅根据size判断上传(size相等,但是由于异步,实际未put完成) + if(mapList.size()==mReadyList.size()&&sendTimes==mReadyList.size()){ + sendTimes = 0;//上传过程将发送次数置空 + uploadMyServer();//调用服务器端接口,来实现 + mProgressDialog.dismiss(); + } + } + if(msg.what==0x112){ + sendTimes = 0;//上传过程将发送次数置空 + mProgressDialog.dismiss(); + JqStrUtil.showToast(MyPhotoActivity.this,"网络不太好哦,上传失败,请稍后重试~"); + } + } + }; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_myphoto); + initView(); + initEvents(); + detailPhoto();//第一个可以添加图片 + } + + private void initView() { + tvBack = (ImageView) findViewById(R.id.img_leftBtn); + tvTitle = (TextView) findViewById(R.id.tvTitle); + tvEdit = (TextView) findViewById(R.id.tvMore); + del = (TextView) findViewById(R.id.del); + choseAll = (TextView) findViewById(R.id.choseAll); + ll_edit = (LinearLayout) findViewById(R.id.ll_edit); + gv = (GridView) findViewById(R.id.gridview); + tvTitle.setText("我的相册"); + tvEdit.setText("编辑"); + tvBack.setVisibility(View.VISIBLE); + tvEdit.setVisibility(View.VISIBLE); + } + + private void initEvents() { + tvBack.setOnClickListener(this); + tvEdit.setOnClickListener(this); + del.setOnClickListener(this); + choseAll.setOnClickListener(this); + //创建并设置adapter + adapter = new MoreTypeGridAdapter(MyPhotoActivity.this); + gv.setAdapter(adapter); + //每次resume时保持最初状态 +// idList.clear(); + tvEdit.setText("编辑"); + ll_edit.setVisibility(View.GONE); + initDataAndView(); + + } + + /** + * 刷新图片列表 + */ + private void initDataAndView() { + String photoUrl = Constant.COMMON_URL + Interface.MY_PHOTO; + JSONObject obj = new JSONObject(); + obj.put("userID", SpUtils.getString(Constant.USER_ID)); + obj.put("version", Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(MyPhotoActivity.this, true, photoUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + if(jsonObject==null){ + return; + } + String rsCode = jsonObject.getString("retcode"); + if ("1".equals(rsCode)) { + String result = jsonObject.getString("message"); + Log.d(TAG, "onResponse: result" + jsonObject); + mList = JSON.parseArray(result,MyPhotoModel.class); + //全部的可删除图片的id + currentCount = mList.size(); + MyPhotoModel firstmodel = new MyPhotoModel(); + mList.add(0,firstmodel); + adapter.updateListView(mList,null); + }else{ + mList = new ArrayList(); + MyPhotoModel firstmodel = new MyPhotoModel(); + mList.add(0,firstmodel); + adapter.updateListView(mList,null); + } + showRefreshView();//防止选择拍照之后,此页面发生实际与显示不一致的错误 + } + }, null); + + } + + /** + * 全选图片 + */ + private void choseAllPhoto() { + allIdList = new ArrayList<>();//每次点击全选按钮都进行初始化 + for(int i=1;i=24){ + imgUri = FileProvider.getUriForFile(this,PROVIDER_IMG,file); + }else{ + imgUri = Uri.fromFile(file); + } + Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); + intent.putExtra(MediaStore.EXTRA_OUTPUT,imgUri); + startActivityForResult(intent, PHOTO_REQUEST_TAKEPHOTO); + break; + case 1: + GalleryFinal.selectMedias(this, GalleryFinal.TYPE_IMAGE,TOTAL_COUNT-currentCount, new GalleryFinal.OnSelectMediaListener() { + @Override + public void onSelected(ArrayList photoArrayList) { + mReadyList.clear();//清除上次选中的图片 + for(int i=0;i(); + mReadyList.clear(); + mReadyList.add(dirPath); + uploadImage(); + } + } + break; + default: + break; + } + } + + /** + * 上传图片 + */ + private void uploadImage() { + final UploadAliUtil uploadAliUtil = new UploadAliUtil(this);//在有文件的情况下初始化上传工具 + mapList = new ArrayList<>(); + /** + * 设置将文件上传阿里云后的接口回调 + */ + uploadAliUtil.setCompletePutAli(new UploadAliUtil.OnCompletePutAli() { + @Override + public void onFailure() { + mHandler.sendEmptyMessage(0x112); + } + + @Override + public void onSuccess() { + mHandler.sendEmptyMessage(0x111); + } + }); + /** + * 设置获取上传阿里云路径后的接口回调 + */ + uploadAliUtil.setAliInterface(new UploadAliUtil.OnUpLoadAli() { + @Override + public void upLoadHandle(JSONObject obj, final byte[] bytes, String param) { + String rsCode = obj.getString("retcode"); + if ("1".equals(rsCode)) { + final String putaliUrl = obj.getString("url");//put阿里云的路径 + String key = obj.getString("key");//调用接口时的filePath,总会返回 + Log.d(TAG, "run:阿里云不存在,给出上传路 "+putaliUrl); + new Runnable(){ + @Override + public void run() { + try { + //内有handler和handler发送的次数为依据来判断是否上传完成并且总共的照片数量是否达到 + if(!TextUtils.isEmpty(putaliUrl)){ + uploadAliUtil.put(MediaType.parse(""), putaliUrl, bytes); + }else{ + mHandler.sendEmptyMessage(0x111); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + }.run(); + setParamList(param,key); + } + } + }); + /** + * 获取上传阿里云路径的方法 + */ + for (int i=0;i updateParamMap = new HashMap<>();//用户保存每张图片的信息 + updateParamMap.put("md5",md5); + updateParamMap.put("size",String.valueOf(size)); + updateParamMap.put("path",key); + //放入put方法内部,则会引起多线程来操作list对象,所以如果没有其他方法得对对象枷锁处理,而在这里用handler和发送次数来做为判断的方式来代替上锁的方式 + mapList.add(updateParamMap); + } + + /** + * 将保存图片的阿里云地址上传至服务器 + */ + private void uploadMyServer() { + String avatarUrl = Constant.COMMON_URL + Interface.PHOTO_UPDATE; + JSONObject obj = new JSONObject(); + obj.put("userID",SpUtils.getString(Constant.USER_ID)); + Log.d(TAG, "uploadMyServer: "+mapList.get(0).get("md5")); + String picstr = JSON.toJSONString(mapList); + obj.put("pictures",picstr); + obj.put("version",Constant.VERSION); + String param = JSON.toJSONString(obj); + Log.d(TAG, "uploadMyServer: paramurl"+param); + okHttpUtil.sendJsonStrByPostAsync(MyPhotoActivity.this,false,avatarUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + if("1".equals(rsCode)){ + uploadSuccess(); + }else{ + JqStrUtil.showToast(MyPhotoActivity.this,"上传失败"); + } + } + },null); + + } + + private void uploadSuccess() { + adapter = new MoreTypeGridAdapter(MyPhotoActivity.this); + gv.setAdapter(adapter); + /** + * 每次resume时保持最初状态 + */ + if(adapter!=null&&adapter.getmSelectedId().size()>0){ + adapter.getmSelectedId().clear();//将选中的图片都清除掉 + } + initDataAndView();//调用图片接口并且刷新页面回到最初状态(隐藏全选和删除按钮,恢复编辑字样) + mapList.clear(); + } + + @Override + public void onClick(View view) { + switch (view.getId()) { + case R.id.img_leftBtn: + finish(); + break; + case R.id.tvMore: + photoEdit();//点击编辑按钮 + break; + case R.id.del: + delPhoto();//删除按钮点击事件 + break; + case R.id.choseAll://全选图片点击事件 + choseAllPhoto(); + break; + default: + break; + } + } + + /** + * 弹出框展现和消失 + */ + public void showActionSheet() { + setTheme(R.style.ActionSheetStyleiOS7); + ActionSheet.createBuilder(MyPhotoActivity.this,getSupportFragmentManager()) + .setCancelButtonTitle("取消") + .setOtherButtonTitles("拍照", "相册") + .setCancelableOnTouchOutside(true).setListener(this).show(); + } + public void onDismiss(ActionSheet actionSheet, boolean isCancel) { + + } + + /** + * 第一张添加图片按钮,在oncreate中就调用此方法 + */ + private void detailPhoto(){ + gv.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + if(position==0){ + if(currentCount>=TOTAL_COUNT){ + JqStrUtil.showToast(MyPhotoActivity.this,"相册图片达到上限"); + return; + } + uploadPic(); + } + } + }); + } + + private void uploadPic(){ + String[] permissions = {Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + JqBaseActivity.requestRuntimePermission(permissions, new PermissionListener() { + @Override + public void onGranted() { + showActionSheet(); + } + @Override + public void onDenied(List deniedPermission) { + } + }); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + if(MyInfoActivity.instance!=null){ + MyInfoActivity.instance.refresh(); + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/MyRealNameActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/MyRealNameActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..f7212e4562723aee2c17bfade30cd2d4b344b6a9 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/MyRealNameActivity.java @@ -0,0 +1,359 @@ +package com.jiuqi.elove.activity; + +import android.Manifest; +import android.content.Intent; +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.provider.MediaStore; +import android.support.v4.content.ContextCompat; +import android.support.v4.content.FileProvider; +import android.text.TextUtils; +import android.util.DisplayMetrics; +import android.view.View; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baoyz.actionsheet.ActionSheet; +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.animation.GlideAnimation; +import com.bumptech.glide.request.target.SimpleTarget; +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.common.PermissionListener; +import com.jiuqi.elove.entity.MyRealNameBean; +import com.jiuqi.elove.util.CommonUtil; +import com.jiuqi.elove.util.EasyGlide; +import com.jiuqi.elove.util.FormatUtil; +import com.jiuqi.elove.util.IdcardValidator; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; +import com.jiuqi.elove.widget.mediapicker.model.Photo; +import com.jiuqi.elove.widget.mediapicker.util.GalleryFinal; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import butterknife.OnClick; + +public class MyRealNameActivity extends ABaseActivity implements ActionSheet.ActionSheetListener{ + + public static final String PROVIDER_IMG = "com.jiuqi.elove.fileprovider"; + private static final int SELECT_ALBUM = 0X02; + private static final int TAKE_PHOTO = 0X01; + + @BindView(R.id.et_name) + EditText et_name; + @BindView(R.id.et_idcard) + EditText et_idcard; + @BindView(R.id.iv_idcard) + ImageView iv_idcard; + @BindView(R.id.tv_reason) + TextView tv_reason; + @BindView(R.id.tv_submit) + TextView tv_submit; + @BindView(R.id.rl_idcard_bg) + RelativeLayout rl_idcard_bg; + + private String dirPath; + private Uri imgUri; + private IdcardValidator validator; + private Bitmap bitCard; + private String userid; + private MyRealNameBean bean; + private String status;//审核的状态 + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getDataFromSp(); + setContentView(R.layout.activity_my_real_name,"实名认证",-1,MODE_BACK,HEIGHT_REDBG_WHITEFONT); + initView(); + loadData2View(); + } + + private void initView() { + rl_idcard_bg.setLayoutParams(getMyBgLayout()); + } + + /** + * 展示服务器返回数据 + */ + private void loadData2View() { + String dataUrl = Constant.COMMON_URL + Interface.REALNAME_RESULT; + JSONObject obj = new JSONObject(); + obj.put("userID",userid); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, true, dataUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String msg = jsonObject.getString("explanation"); + if(Constant.SUCCESS_CODE.equals(rsCode)){ + String result = jsonObject.getString("message"); + bean = JSON.parseObject(result,MyRealNameBean.class); + handleData2View(); + }else{ + showToast(msg); + } + } + },null); + } + + /** + * 将之前认证的数据填充到ui中 + */ + private void handleData2View() { + String realName = bean.getRealName(); + String idcard = bean.getCardNo(); + status = bean.getStatus(); + if(!TextUtils.isEmpty(realName)){ + et_name.setText(realName); + et_name.setSelection(realName.length()); + } + if(!TextUtils.isEmpty(idcard)){ + et_idcard.setText(idcard); + et_idcard.setSelection(idcard.length()); + } + if(!TextUtils.isEmpty(bean.getPhoto())) { + iv_idcard.setLayoutParams(getMyIdLayout()); + EasyGlide.getInstance().showImage(false, bean.getPhoto(), iv_idcard, -1); + Glide.with(this).load(bean.getPhoto()).asBitmap().into(new SimpleTarget() { + @Override + public void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) { + bitCard = resource; + } + }); + } + if(Constant.REALNAME_PASS.equals(status)){ + tv_submit.setText("已通过"); + setNoActive(); + }else if(Constant.REALNAME_WAITING.equals(status)){ + tv_submit.setText("审核中"); + setNoActive(); + }else{//未提交过或者未通过 + if(Constant.REALNAME_NOTPASS.equals(status)){ + tv_reason.setText("未通过原因:"+bean.getReason()); + } + tv_submit.setText("提交"); + } + } + + private void setNoActive(){ + tv_submit.setBackgroundColor(ContextCompat.getColor(this,R.color.login_register_un)); + et_name.setFocusable(false); + et_name.setEnabled(false); + et_idcard.setEnabled(false); + et_idcard.setFocusable(false); + } + + /** + * 从缓存中获取数据 + */ + private void getDataFromSp() { + userid = SpUtils.getString(Constant.USER_ID); + validator = new IdcardValidator(); + } + + @OnClick({R.id.tv_submit,R.id.rl_idcard_bg}) + public void onClick(View view){ + switch (view.getId()){ + case R.id.tv_submit: + if(Constant.REALNAME_PASS.equals(status)||Constant.REALNAME_WAITING.equals(status)){ + return; + } + doAuth(); + break; + case R.id.rl_idcard_bg: + if(Constant.REALNAME_PASS.equals(status)||Constant.REALNAME_WAITING.equals(status)){ + return; + } + getPermissionAndUpload(); + break; + } + } + + private void doAuth() { + if(bitCard==null||bitCard.getByteCount()<=0){ + showToast("请选取一张手持身份证照片"); + return; + } + String name = et_name.getText().toString().trim(); + String idnum = et_idcard.getText().toString().trim(); + String base64file = CommonUtil.bitmap2StrByBase64(bitCard,80); + if(TextUtils.isEmpty(name)){ + showToast("请输入姓名"); + return; + } + if(!FormatUtil.checkNameChese(name)){ + showToast("请输入不少于2位且不多于6位中文姓名"); + return; + } + if(TextUtils.isEmpty(name)||!validator.isValidatedAllIdcard(idnum)){ + showToast("请输入合法的身份证号"); + return; + } + String authUrl = Constant.COMMON_URL+ Interface.REALNAME_AUTH; + JSONObject obj = new JSONObject(); + obj.put("userID",userid); + obj.put("cardNo",idnum); + obj.put("realName",name); + obj.put("photo",base64file); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, true, authUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if(Constant.SUCCESS_CODE.equals(rsCode)){ + SpUtils.setString(Constant.ID_CARD,Constant.REALNAME_WAITING); + tv_reason.setVisibility(View.GONE);//提交完成后将原因隐藏 + finish(); + } + showToast(explanation); + } + },null); + } + + /** + * 拍照或者选择图片前获取权限 + */ + private void getPermissionAndUpload() { + String[] permissions = {Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + requestRuntimePermission(permissions, new PermissionListener() { + @Override + public void onGranted() { + showActionSheet(); + } + @Override + public void onDenied(List deniedPermission) { + } + }); + } + + /** + * 弹出框展现和消失 + */ + public void showActionSheet() { + setTheme(R.style.ActionSheetStyleiOS7); + ActionSheet.createBuilder(this,getSupportFragmentManager()) + .setCancelButtonTitle("取消") + .setOtherButtonTitles("拍照", "相册") + .setCancelableOnTouchOutside(true).setListener(this).show(); + } + + @Override + public void onDismiss(ActionSheet actionSheet, boolean isCancel) { + + } + + @Override + public void onOtherButtonClick(ActionSheet actionSheet, int index) { + switch (index){ + case 0: + startTookPicture(); + break; + case 1: + openAlbum2Cut(); + break; + } + } + + /** + * 拍照 + */ + private void startTookPicture() {//拍照 + File avatarFile = new File(getExternalCacheDir()+ Constant.TEMP_IMG); + try { + avatarFile.createNewFile(); + } catch (IOException e) { + e.printStackTrace(); + } + if(Build.VERSION.SDK_INT>=24){ + imgUri = FileProvider.getUriForFile(this,PROVIDER_IMG,avatarFile); + }else{ + imgUri = Uri.fromFile(avatarFile); + } + Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); + intent.putExtra(MediaStore.EXTRA_OUTPUT,imgUri); + startActivityForResult(intent,TAKE_PHOTO); + } + + private void openAlbum2Cut() {//打开相册 + GalleryFinal.selectMedias(this, GalleryFinal.TYPE_IMAGE,1, new GalleryFinal.OnSelectMediaListener() { + @Override + public void onSelected(ArrayList photoArrayList) { + dirPath = photoArrayList.get(0).getPath(); + startCutImg(dirPath); + } + }); + } + + + private void startCutImg(String path){ + Intent intent = new Intent(this, CutPictureAty.class); + intent.putExtra("path", path); + intent.putExtra("ratio",3.00/5.00); + startActivityForResult(intent, 0x06); + } + + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + if(resultCode == RESULT_OK){ + switch (requestCode){ + case TAKE_PHOTO: + startCutImg(getExternalCacheDir()+Constant.TEMP_IMG); + break; + case 0x06: + if (data != null) { + String dirPath = data.getStringExtra("path"); + bitCard = BitmapFactory.decodeFile(dirPath); + iv_idcard.setLayoutParams(getMyIdLayout()); + iv_idcard.setImageBitmap(bitCard); + } + break; + } + + } + } + + private LinearLayout.LayoutParams getMyBgLayout(){ + Resources resources = getResources(); + DisplayMetrics dm = resources.getDisplayMetrics(); + int width = dm.widthPixels- CommonUtil.dip2px(this,32); + int height = width * 3 / 5; + LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(width,height); + params.setMargins(CommonUtil.dip2px(this,16),CommonUtil.dip2px(this,10),CommonUtil.dip2px(this,16),CommonUtil.dip2px(this,10)); + return params; + } + + private RelativeLayout.LayoutParams getMyIdLayout(){ + Resources resources = getResources(); + DisplayMetrics dm = resources.getDisplayMetrics(); + int width = dm.widthPixels- CommonUtil.dip2px(this,38); + int height = width * 3 / 5; + RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(width,height); + params.addRule(RelativeLayout.CENTER_IN_PARENT); + return params; + } + + @Override + protected void onDestroy() { + super.onDestroy(); + okHttpUtil.cancelTag(this); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/MyRedbeanActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/MyRedbeanActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..ce7445e2591891017804498d40b88a3ac2d9fe2e --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/MyRedbeanActivity.java @@ -0,0 +1,138 @@ +package com.jiuqi.elove.activity; + +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.view.View; +import android.view.Window; +import android.widget.ImageView; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.alibaba.fastjson.JSONObject; +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.common.JqBaseActivity; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; + +public class MyRedbeanActivity extends JqBaseActivity implements View.OnClickListener{ + + /** + * 控件 + */ + private TextView tv_redbean_count; + private ImageView imgBack; + private RelativeLayout rl_pay_redbean; + private RelativeLayout rl_redbean_bill; + private RelativeLayout rl_redbean_task; + + /** + * 数据 + */ + private boolean isshow = true; + private String userid; + /** + * 工具 + */ + public static MyRedbeanActivity instance; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_my_redbean); + instance = this; + getDataFromSp(); + initView(); + setEvents(); + } + + private void getDataFromSp() { + userid = SpUtils.getString(Constant.USER_ID); + } + + private void setDataIntoView() { + String beanBalanceUrl = Constant.COMMON_URL + Interface.REDBEAN_BALANCE; + JSONObject obj = new JSONObject(); + obj.put("userid",userid); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(MyRedbeanActivity.this, isshow, beanBalanceUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + String beannum = jsonObject.getString("beannum"); + if("1".equals(rsCode)){ + if(JqStrUtil.isEmpty(beannum)){ + tv_redbean_count.setText("0个"); + }else{ + tv_redbean_count.setText(beannum+"个"); + } + }else{ + tv_redbean_count.setText(explanation); + } + } + },null); + + } + + private void setEvents() { + rl_redbean_bill.setOnClickListener(this); + rl_pay_redbean.setOnClickListener(this); + rl_redbean_task.setOnClickListener(this); + imgBack.setOnClickListener(this); + } + + private void initView() { + TextView tvTitle = (TextView) findViewById(R.id.tvTitle); + tvTitle.setText("我的钱包"); + imgBack = (ImageView) findViewById(R.id.img_leftBtn); + imgBack.setVisibility(View.VISIBLE); + tv_redbean_count = (TextView) findViewById(R.id.tv_redbean_count); + rl_pay_redbean = (RelativeLayout) findViewById(R.id.rl_pay_redbean); + rl_redbean_bill = (RelativeLayout) findViewById(R.id.rl_redbean_bill); + rl_redbean_task = (RelativeLayout) findViewById(R.id.rl_redbean_task); + } + + @Override + public void onClick(View view) { + switch (view.getId()){ + case R.id.rl_pay_redbean: + Intent payBeanIntent = new Intent(MyRedbeanActivity.this,PayForRedbeanActivity.class); + startActivity(payBeanIntent); + break; + case R.id.rl_redbean_bill: + Intent billIntent = new Intent(MyRedbeanActivity.this,RedbeanListActivity.class); + startActivity(billIntent); + break; + case R.id.rl_redbean_task: + Intent taskIntent = new Intent(MyRedbeanActivity.this,TaskRewardActivity.class); + startActivity(taskIntent); + break; + case R.id.img_leftBtn: + finish(); + break; + } + } + + @Override + protected void onResume() { + super.onResume(); + setDataIntoView();//此处调用,在充值结束后会返回该页面刷新 + } + + @Override + protected void onDestroy() { + super.onDestroy(); + if(instance!=null){ + instance = null; + } + } + + public void refresh(){ + isshow = false; + setDataIntoView(); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/MyRedbeanActivity2_6.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/MyRedbeanActivity2_6.java new file mode 100644 index 0000000000000000000000000000000000000000..a5c1727c25537fdf3e069255766679adb59c1fc7 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/MyRedbeanActivity2_6.java @@ -0,0 +1,314 @@ +package com.jiuqi.elove.activity; + +import android.content.Intent; +import android.content.SharedPreferences; +import android.graphics.Bitmap; +import android.os.Bundle; +import android.support.v4.graphics.drawable.RoundedBitmapDrawable; +import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory; +import android.view.View; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ListView; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.target.BitmapImageViewTarget; +import com.jiuqi.elove.R; +import com.jiuqi.elove.adapter.ConsumeRedbeanAdapter26; +import com.jiuqi.elove.adapter.ExchangeCardAdapter; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.common.JqBaseActivity; +import com.jiuqi.elove.entity.ConsumeRedbeanModel; +import com.jiuqi.elove.entity.ExchangeCardModel; +import com.jiuqi.elove.util.EasyGlide; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; +import com.jiuqi.elove.widget.pulltorefresh.PullToRefreshLayout; + +import java.util.ArrayList; +import java.util.List; + +public class MyRedbeanActivity2_6 extends JqBaseActivity implements View.OnClickListener,PullToRefreshLayout.OnRefreshListener{ + + /** + * 控件 + */ + private TextView tvTitle; + private ImageView imgBack; + private TextView tvRight; + private TextView tv_sure; + private EditText et_code; + private TextView tv_myNikeName; + private TextView tv_total_redbean; + private TextView tv_today; + private ImageView iv_headPhoto; + /**我的元宝**/ + private LinearLayout ll_my_redbean; + private TextView tv_my_redbean; + private View line_my_redbean; + private PullToRefreshLayout refresh_view; + private ListView lv_red_bean; + private LinearLayout ll_red_bean; + /**我的卡券**/ + private LinearLayout ll_my_card; + private LinearLayout ll_card; + private TextView tv_my_card; + private View line_my_card; + private ListView lv_card; + private RelativeLayout rlay_nodata; + /** + * 数据 + */ + private String userId; + private int page = 1; + private int pagesize = 10; + private List mList; + private List mAddList; + private String avatar;//从上个页面获取 + private String nikename;//从上个页面获取 + private List mCardList; + private List mCardAddList; + /** + * 工具 + */ + private ConsumeRedbeanAdapter26 adapter; + private ExchangeCardAdapter cardAdapter; + private boolean isshow = true; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_my_redbean_activity2_6); + getDataFromSp();//从缓存中获取userid + initView(); + initListViewNeed();//初始化listview所需的内容 + initData2View();//获取元宝消费获取列表 + initCardData2View();//获取卡券列表 + setEvents(); + } + + private void initListViewNeed() { + adapter = new ConsumeRedbeanAdapter26(this); + lv_red_bean.setAdapter(adapter); + mAddList = new ArrayList<>(); + } + + private void getDataFromSp() { + userId = SpUtils.getString(Constant.USER_ID); + avatar = SpUtils.getString(Constant.AVATAR); + nikename = SpUtils.getString(Constant.NIKE_NAME); + } + + private void setEvents() { + tvRight.setOnClickListener(this); + imgBack.setOnClickListener(this); + tv_sure.setOnClickListener(this); + ll_my_redbean.setOnClickListener(this); + ll_my_card.setOnClickListener(this); + refresh_view.setOnRefreshListener(this); + } + + private void initView() { + tvTitle = easyFind(R.id.tvTitle); + tvTitle.setText("我的钱包"); + imgBack = easyFind(R.id.img_leftBtn); + imgBack.setVisibility(View.VISIBLE); + tvRight = easyFind(R.id.tvMore); + tvRight.setText("奖励规则"); + tvRight.setVisibility(View.VISIBLE); + tv_myNikeName = easyFind(R.id.tv_myNikeName); + iv_headPhoto = easyFind(R.id.iv_headPhoto); + tv_total_redbean = easyFind(R.id.tv_total_redbean); + tv_today = easyFind(R.id.tv_today); + tv_sure = easyFind(R.id.tv_sure); + et_code = easyFind(R.id.et_code); + refresh_view = easyFind(R.id.refresh_view); + lv_red_bean = easyFind(R.id.lv_red_bean); + ll_red_bean = easyFind(R.id.ll_red_bean); + tv_my_redbean = easyFind(R.id.tv_my_redbean); + ll_my_redbean = easyFind(R.id.ll_my_redbean); + line_my_redbean = easyFind(R.id.line_my_redbean); + ll_my_card = easyFind(R.id.ll_my_card); + ll_card = easyFind(R.id.ll_card); + tv_my_card = easyFind(R.id.tv_my_card); + line_my_card = easyFind(R.id.line_my_card); + lv_card = easyFind(R.id.lv_card); + rlay_nodata = easyFind(R.id.rlay_nodata); + tv_myNikeName.setText(nikename); + EasyGlide.getInstance().showImageCircle(avatar,iv_headPhoto); + } + + private void initData2View() { + String redbeanListUrl = Constant.COMMON_URL + Interface.REDBEAN_LIST_NEW; + JSONObject obj = new JSONObject(); + obj.put("userid",userId); + obj.put("version",Constant.VERSION); + obj.put("pageindex",page); + obj.put("pagesize",pagesize); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, isshow, redbeanListUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + String details = jsonObject.getString("message"); + if ("1".equals(rsCode)) { + JSONObject rsObj = JSON.parseObject(details); + String beannum = rsObj.getString("beannum"); + String todayredbean = rsObj.getString("todayredbean"); + String redbeanlistStr = rsObj.getString("consumerlist"); + tv_total_redbean.setText(beannum+"元宝"); + tv_today.setText("今日获得"+todayredbean+"元宝"); + mList = JSONArray.parseArray(redbeanlistStr, ConsumeRedbeanModel.class); + mAddList.addAll(mList); + if (!mList.isEmpty()) { + adapter.updateListView(mAddList); + refresh_view.refreshFinish(PullToRefreshLayout.SUCCEED); + } else { + refresh_view.loadmoreFinish(PullToRefreshLayout.SUC_NODATA); + } + } else { + JqStrUtil.showToast(MyRedbeanActivity2_6.this, explanation); + } + } + }, new OkHttpUtil.OnUnGetJsonObject() { + @Override + public void onResponse() { + if(page==1){ + refresh_view.refreshFinish(PullToRefreshLayout.FAIL); + }else{ + refresh_view.loadmoreFinish(PullToRefreshLayout.FAIL); + } + } + }); + } + + private void initCardData2View() { + String cardUrl = Constant.COMMON_URL + Interface.MY_EXCHANGE_TICKET; + JSONObject obj = new JSONObject(); + obj.put("userid",userId); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, false, cardUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + if("1".equals(rsCode)){ + String result = jsonObject.getString("message"); + mCardList = JSONArray.parseArray(result,ExchangeCardModel.class); + if(mCardList.isEmpty()){ + rlay_nodata.setVisibility(View.VISIBLE); + }else{ + cardAdapter = new ExchangeCardAdapter(MyRedbeanActivity2_6.this); + lv_card.setAdapter(cardAdapter); + cardAdapter.updateListView(mCardList); + } + } + } + },null); + } + + /** + * 点击我的元宝响应 + */ + private void clickRedbean() { + tv_my_card.setTextColor(getResources().getColor(R.color.blackFont)); + line_my_card.setBackgroundColor(getResources().getColor(R.color.default_background)); + tv_my_redbean.setTextColor(getResources().getColor(R.color.colorPrimary)); + line_my_redbean.setBackgroundColor(getResources().getColor(R.color.colorPrimary)); + ll_red_bean.setVisibility(View.VISIBLE); + ll_card.setVisibility(View.GONE); + } + + /** + * 点击我的卡券响应 + */ + private void clickExchangeCard() { + tv_my_redbean.setTextColor(getResources().getColor(R.color.blackFont)); + line_my_redbean.setBackgroundColor(getResources().getColor(R.color.default_background)); + tv_my_card.setTextColor(getResources().getColor(R.color.colorPrimary)); + line_my_card.setBackgroundColor(getResources().getColor(R.color.colorPrimary)); + ll_card.setVisibility(View.VISIBLE); + ll_red_bean.setVisibility(View.GONE); + } + + @Override + public void onClick(View view) { + switch (view.getId()){ + case R.id.img_leftBtn: + finish(); + break; + case R.id.tvMore: + startRewardRuleActivity(); + break; + case R.id.tv_sure: + submitExchangeCode(); + break; + case R.id.ll_my_redbean: + clickRedbean(); + break; + case R.id.ll_my_card: + clickExchangeCard(); + break; + default: + break; + } + } + + private void submitExchangeCode() { + String submitCode = Constant.COMMON_URL + Interface.EXCHANGE_CODE; + String code = et_code.getText().toString().trim(); + if(JqStrUtil.isEmpty(code)){ + JqStrUtil.showToast(this,"请先输入兑换码"); + return; + } + if(!JqStrUtil.isNikeName(code)){ + JqStrUtil.showToast(this,"请输入合法的兑换码"); + return; + } + JSONObject obj = new JSONObject(); + obj.put("userid",userId); + obj.put("code",code); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, true, submitCode, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + if("1".equals(rsCode)){ + et_code.setText(""); + JqStrUtil.showToast(MyRedbeanActivity2_6.this,"提交成功,客服将在1个工作日内审核完成"); + } + } + },null); + } + + private void startRewardRuleActivity() { + Intent intent = new Intent(this,CommonH5Activity.class); + intent.putExtra("title","奖励规则"); + startActivity(intent); + } + + @Override + public void onRefresh(PullToRefreshLayout pullToRefreshLayout) { + // 下拉刷新操作 + mAddList = new ArrayList<>(); + isshow = false; + page = 1; + initData2View(); + } + + @Override + public void onLoadMore(PullToRefreshLayout pullToRefreshLayout) { + isshow = false; + ++page; + initData2View(); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/MyRelationPersonActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/MyRelationPersonActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..7515398441c60b286278d5aa40f51368120feff7 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/MyRelationPersonActivity.java @@ -0,0 +1,200 @@ +package com.jiuqi.elove.activity; + +import android.content.Intent; +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.support.v4.content.ContextCompat; +import android.support.v4.view.ViewPager; +import android.view.View; +import android.widget.ImageView; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.adapter.ABaseFragmentAdapter; +import com.jiuqi.elove.fragment.MyFansFragment; +import com.jiuqi.elove.fragment.MyFocusFragment; +import com.jiuqi.elove.fragment.MyFriendFragment; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import butterknife.OnClick; + +public class MyRelationPersonActivity extends ABaseActivity { + + @BindView(R.id.tv_member) + TextView tv_member; + @BindView(R.id.tv_elder) + TextView tv_elder; + @BindView(R.id.tv_hong) + TextView tv_hong; + @BindView(R.id.iv_member) + ImageView iv_member; + @BindView(R.id.iv_elder) + ImageView iv_elder; + @BindView(R.id.iv_hong) + ImageView iv_hong; + @BindView(R.id.vp_container) + ViewPager vp_container; + @BindView(R.id.rl_right) + RelativeLayout rl_right; + @BindView(R.id.iv_right) + ImageView iv_right; + private int hongRes; + private int blackRes; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_my_relation_person,"我的好友"); + initView(); + initColor(); + initViewPagerAndAddListener(); + } + + private void initView() { + iv_right.setImageResource(R.drawable.icon_search); + rl_right.setVisibility(View.VISIBLE); + } + + private void initColor() { + hongRes = ContextCompat.getColor(this,R.color.sys_red); + blackRes = ContextCompat.getColor(this,R.color.blackFont); + } + + /** + * 初始化viewpager以及切换页的监听 + */ + private void initViewPagerAndAddListener() { + List fragmentList = new ArrayList<>(); + fragmentList.add(MyFriendFragment.newInstance()); + fragmentList.add(MyFansFragment.newInstance()); + fragmentList.add(MyFocusFragment.newInstance()); + ABaseFragmentAdapter adapter = new ABaseFragmentAdapter(getSupportFragmentManager(),fragmentList); + vp_container.setAdapter(adapter); +// vp_container.setOffscreenPageLimit(2);//这个防止视图销毁,fragment嵌套的时候fragment重写不起作用啊。。 + selectMem();//默认选择会员 + addPageChangeListener(); + } + + @OnClick({R.id.tv_member,R.id.tv_elder,R.id.tv_hong,R.id.rl_right}) + public void onClick(View view){ + setAllBlack();//将所有的选项置黑 + switch (view.getId()){ + case R.id.tv_member: + selectMem(); + break; + case R.id.tv_elder: + selectElder(); + break; + case R.id.tv_hong: + selectHong(); + break; + case R.id.rl_right: + searchPerson(); + break; + } + } + + /** + * 找人 + */ + private void searchPerson() { + Intent intent = new Intent(this, FindPersonConditionActivity.class); + startActivity(intent); + } + + /** + * 添加viewpager监听 + */ + private void addPageChangeListener() { + vp_container.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + + } + + @Override + public void onPageSelected(int position) { + setAllBlack();//将所有的选项置黑 + if(position==0){ + selectMem(); + }else if(position==1){ + selectElder(); + }else{ + selectHong(); + } + } + + @Override + public void onPageScrollStateChanged(int state) { + + } + }); + } + + /** + * 选中我的关注 + */ + private void selectHong() { + setHongHong(); + vp_container.setCurrentItem(2); + } + + /** + * 选中我的粉丝 + */ + private void selectElder() { + setElderHong(); + vp_container.setCurrentItem(1); + } + + /** + * 选中我的好友 + */ + private void selectMem() { + setMemberHong(); + vp_container.setCurrentItem(0); + } + + /** + * 将所有的选项置黑 + */ + private void setAllBlack() { + setMemberBlack(); + setElderBlack(); + setHongBlack(); + } + + private void setMemberHong(){ + tv_member.setTextColor(hongRes); + iv_member.setBackgroundColor(hongRes); + } + + private void setMemberBlack(){ + tv_member.setTextColor(blackRes); + iv_member.setBackgroundColor(-1); + } + + private void setElderHong(){ + tv_elder.setTextColor(hongRes); + iv_elder.setBackgroundColor(hongRes); + } + + private void setElderBlack(){ + tv_elder.setTextColor(blackRes); + iv_elder.setBackgroundColor(-1); + } + + private void setHongHong(){ + tv_hong.setTextColor(hongRes); + iv_hong.setBackgroundColor(hongRes); + } + + private void setHongBlack(){ + tv_hong.setTextColor(blackRes); + iv_hong.setBackgroundColor(-1); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/MySocialNetWorkActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/MySocialNetWorkActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..827100d989b36e1536f61a693e51f6f3618e33de --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/MySocialNetWorkActivity.java @@ -0,0 +1,121 @@ +package com.jiuqi.elove.activity; + +import android.content.Intent; +import android.os.Bundle; +import android.view.View; +import android.widget.ImageView; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.JqBaseActivity; + +/** + * 我的人脉页面 + * Created by dl on 2017/3/1. + */ +public class MySocialNetWorkActivity extends JqBaseActivity implements View.OnClickListener{ + + private static final String TAG = "MySocialNetWorkActivity"; + /** + * 组件 + */ + private TextView tvFind; + private ImageView imgBack; + private RelativeLayout rl_visitor;//访客 + private RelativeLayout rl_friend;//好友 + private RelativeLayout rl_fan;//粉丝 + private RelativeLayout rl_focus;//关注 + private RelativeLayout rl_blacklist;//黑名单 + private RelativeLayout rl_nearby;//附近人 + + /** + * 数据 + */ + private String contact_type; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_my_social_net_work); + initView();//初始化组件 + setEvents();//注册事件 + } + + private void initView() { + //title + TextView tvTitle = easyFind(R.id.tvTitle); + tvTitle.setText("我的人脉"); + tvFind = easyFind(R.id.tvMore); + tvFind.setText("找人"); + tvFind.setVisibility(View.VISIBLE); + imgBack = easyFind(R.id.img_leftBtn); + imgBack.setVisibility(View.VISIBLE); + //content + rl_visitor = easyFind(R.id.rl_visitor); + rl_friend = easyFind(R.id.rl_friend); + rl_fan = easyFind(R.id.rl_fan); + rl_focus = easyFind(R.id.rl_focus); + rl_blacklist = easyFind(R.id.rl_blacklist); + rl_nearby = easyFind(R.id.rl_nearby); + } + + private void setEvents() { + tvFind.setOnClickListener(this); + imgBack.setOnClickListener(this); + rl_visitor.setOnClickListener(this); + rl_friend.setOnClickListener(this); + rl_fan.setOnClickListener(this); + rl_focus.setOnClickListener(this); + rl_blacklist.setOnClickListener(this); + rl_nearby.setOnClickListener(this); + } + + @Override + public void onClick(View view) { + switch (view.getId()){ + case R.id.tvMore: + Intent findIntent = new Intent(this,FindPersonConditionActivity.class); + startActivity(findIntent); + break; + case R.id.img_leftBtn: + finish(); + break; + case R.id.rl_visitor: + Intent vistorIntent = new Intent(this,ViewOrLikeMeActivity.class); + startActivity(vistorIntent); + break; + case R.id.rl_nearby: + Intent nearbyIntent = new Intent(this,NearbyResultActivity.class); + startActivity(nearbyIntent); + break; + case R.id.rl_friend: + contact_type = "1"; + startContactActivity(); + break; + case R.id.rl_fan: + contact_type = "2"; + startContactActivity(); + break; + case R.id.rl_focus: + contact_type = "3"; + startContactActivity(); + break; + case R.id.rl_blacklist: + contact_type = "4"; + startContactActivity(); + break; + default: + break; + } + } + + /** + * 点击跳转到联系人页面 + */ + private void startContactActivity(){ + Intent intent = new Intent(this,ContactListActivity.class); + intent.putExtra("type",contact_type); + startActivity(intent); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/NearByListActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/NearByListActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..3c82a43c672954eeda3eec373f3a5abca16d13af --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/NearByListActivity.java @@ -0,0 +1,206 @@ +package com.jiuqi.elove.activity; + +import android.content.DialogInterface; +import android.content.Intent; +import android.os.Bundle; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.View; +import android.widget.RelativeLayout; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.hyphenate.easeui.EaseConstant; +import com.jiuqi.elove.R; +import com.jiuqi.elove.adapter.SysRecommendAdapter; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.entity.SysRecommendModel; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; +import com.jiuqi.elove.widget.dialog.CustomDialog; +import com.jiuqi.elove.widget.pulltorefresh.PullToRefreshLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; + +public class NearByListActivity extends ABaseActivity{ + + /** + * 组件 + */ + @BindView(R.id.rlay_nodata) + RelativeLayout rlay_nodata; + @BindView(R.id.rv) + RecyclerView rv; + + /** + * 数据 + */ + private List mList; + private SysRecommendModel recommendModel; + private String title; + private String userid; + /** + * 工具 + */ + private SysRecommendAdapter adapter; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getDataFromSp(); + setContentView(R.layout.activity_nearby_list,title,-1,MODE_BACK,HEIGHT_REDBG_WHITEFONT); + setAdapter(); + handleData2View(); + } + + /** + * 获取数据 + */ + private void getDataFromSp() { + userid = SpUtils.getString(Constant.USER_ID); + mList = (List) getIntent().getSerializableExtra("list"); + title = "附近人" +"("+ mList.size()+")"; + } + + /** + * 初始化list,设置adapter + */ + private void setAdapter() { + adapter = new SysRecommendAdapter(this,R.layout.item_sys_recommend,"nearby"); + rv.setLayoutManager(new LinearLayoutManager(this)); + rv.setAdapter(adapter); + //设置监听事件 + adapter.setListener(new SysRecommendAdapter.ItemClickListener() { + @Override + public void onItemClick(SysRecommendModel model,int position) { + recommendModel = model; + startDetailPage(model); + } + + @Override + public void focus(SysRecommendModel model, SysRecommendAdapter.MyViewHolder holder) { + if(Constant.ATTENTION_NOT.equals(model.getIfattention())){ + addFocus(model,holder,Constant.ACTION_ADDFOCUS); + }else{ + showSureDialog(model,holder,Constant.ACTION_ADDFOCUS); + } + } + + @Override + public void talk(SysRecommendModel model) { + startSingleTalk(model); + } + }); + } + + /** + * 聊天 + */ + private void startSingleTalk(SysRecommendModel model) { + Intent intent = new Intent(this, ChatActivity.class); + intent.putExtra("chatType", EaseConstant.CHATTYPE_SINGLE);//2.0.2版本加群聊之后做区分 + intent.putExtra("userId",model.getUserID().toLowerCase()); + intent.putExtra("nikeName",model.getNickname()); + intent.putExtra("avatar",model.getAvatar()); + startActivity(intent); + } + + /** + * 进入他人中心 + * @param model 他人实体对象 + */ + private void startDetailPage(SysRecommendModel model){ + Intent intent = new Intent(this,OtherPersonCenterActivity.class); + intent.putExtra("otherid",model.getUserID()); + intent.putExtra("flag","fellfor"); + startActivityForResult(intent,0x03); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if(requestCode==0x03&&resultCode==0x03){//他人中心发生关注事件 + String isFocus = data.getStringExtra("isFocus"); + if(!JqStrUtil.isEmpty(isFocus)){ + recommendModel.setIfattention(isFocus); + } + adapter.updateListView(mList); + } + } + + /** + * 添加关注或者取消关注 + * @param model 附近人列表 + * @param vh 一个item的示例 + * @param action 判断是关注还是取消 + */ + private void addFocus(final SysRecommendModel model, final SysRecommendAdapter.MyViewHolder vh, final String action) { + String focusUrl = Constant.COMMON_URL + Interface.ADD_FOCUS; + String otherId = model.getUserID(); + JSONObject obj = new JSONObject(); + obj.put("otherID",otherId); + obj.put("userID",userid); + obj.put("action",action); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this,true,focusUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if("1".equals(rsCode)) { + String isLike = ""; + if ("1".equals(action)) { + isLike = "1"; + vh.img_focus.setImageResource(R.drawable.icon_focus_pink); + } else if ("2".equals(action)) { + vh.img_focus.setImageResource(R.drawable.icon_focus_gray); + isLike = "0"; + } + model.setIfattention(isLike); +// mList.remove(position); +// mList.add(position,model);//更新list中的model,否则获取数据时是已经从服务器中得到的旧list,点赞数据导致不一致 + adapter.notifyDataSetChanged();//通知更新,否则不好用 + } + showToast(explanation); + } + },null); + } + + private void showSureDialog(final SysRecommendModel model, final SysRecommendAdapter.MyViewHolder vh, final String action) { + CustomDialog.Builder builder = new CustomDialog.Builder(this); + builder.setTitle(""); + builder.setMessage("确定要取消关注吗?"); + builder.setPositiveButton(R.string.confirm,new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + addFocus(model,vh,Constant.ACTION_UNFOCUS); + dialog.dismiss(); + } + }); + builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }); + builder.create().show(); + } + + /** + * 根据结果设置展示效果 + */ + private void handleData2View() { + if(mList.isEmpty()){ + rlay_nodata.setVisibility(View.VISIBLE); + }else{ + rlay_nodata.setVisibility(View.GONE); + adapter.updateListView(mList); + } + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/NearbyMapActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/NearbyMapActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..c584447a39a1141a762c915ee8bc9e20b459403e --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/NearbyMapActivity.java @@ -0,0 +1,473 @@ +package com.jiuqi.elove.activity; + +import android.Manifest; +import android.content.Intent; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Matrix; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.text.TextUtils; +import android.view.View; +import android.widget.RelativeLayout; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baidu.location.BDLocation; +import com.baidu.mapapi.clusterutil.MarkerManager; +import com.baidu.mapapi.clusterutil.clustering.Cluster; +import com.baidu.mapapi.clusterutil.clustering.ClusterItem; +import com.baidu.mapapi.clusterutil.clustering.ClusterManager; +import com.baidu.mapapi.clusterutil.clustering.MyClusterManager; +import com.baidu.mapapi.clusterutil.clustering.view.MyClusterRenderer; +import com.baidu.mapapi.map.BaiduMap; +import com.baidu.mapapi.map.BitmapDescriptor; +import com.baidu.mapapi.map.BitmapDescriptorFactory; +import com.baidu.mapapi.map.MapStatus; +import com.baidu.mapapi.map.MapStatusUpdate; +import com.baidu.mapapi.map.MapStatusUpdateFactory; +import com.baidu.mapapi.map.MapView; +import com.baidu.mapapi.map.Marker; +import com.baidu.mapapi.map.MarkerOptions; +import com.baidu.mapapi.map.OverlayOptions; +import com.baidu.mapapi.model.LatLng; +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.bumptech.glide.request.animation.GlideAnimation; +import com.bumptech.glide.request.target.SimpleTarget; +import com.jiuqi.elove.R; +import com.jiuqi.elove.application.EloveApplication; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.common.PermissionListener; +import com.jiuqi.elove.entity.FellForUserInfoModel; +import com.jiuqi.elove.entity.SysRecommendModel; +import com.jiuqi.elove.util.BdLocationHelper; +import com.jiuqi.elove.util.BitmapUtils; +import com.jiuqi.elove.util.EasyGlide; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import butterknife.BindView; +import butterknife.OnClick; +import de.hdodenhof.circleimageview.CircleImageView; + +public class NearbyMapActivity extends ABaseActivity { + + /** + * 工具 + */ + private BaiduMap baiduMap; + private MyClusterManager manager; + private BdLocationHelper helper;//百度地图工具 + private List mList = new ArrayList<>();//bitmap的list + + /** + * 数据 + */ + private Double lat; + private Double lng; + private String userid; + private List userList; + private List items; + private LatLng latlng; + private MapStatus mMapStatus; + private float maxZoomLevel; + /** + * 组件 + */ + @BindView(R.id.map) + MapView mapView; + @BindView(R.id.rl_ding) + RelativeLayout rl_ding; + @BindView(R.id.rl_locate) + RelativeLayout rl_locate; + @BindView(R.id.rl_del) + RelativeLayout rl_del; + @BindView(R.id.rl_add) + RelativeLayout rl_add; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_nearby_map,"附近的人",-1,MODE_BACK,HEIGHT_REDBG_WHITEFONT); + getDataFromSp(); + if(!JqStrUtil.isLogin()){//未登錄 + initLocation(); + }else{//如果登陸了 + initMap(); + reqUserList(); + } + } + + private void getDataFromSp() { + String locateLng = SpUtils.getString(Constant.LOCATE_LNG); + String locatelat = SpUtils.getString(Constant.LOCATE_LAT); + userid = SpUtils.getString(Constant.USER_ID); + if(!TextUtils.isEmpty(locateLng)){ + lng = Double.valueOf(locateLng); + } + if(!TextUtils.isEmpty(locatelat)){ + lat = Double.valueOf(locatelat); + } + } + + /** + * 初始化设置地图 + */ + private void initMap() { + baiduMap = mapView.getMap(); + baiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL); + mapView.showZoomControls(false); + if(lat!=null&&lng!=null){ + latlng = new LatLng(lat,lng); + mMapStatus = new MapStatus.Builder().target(latlng).zoom(22).build(); + setMapStatus(); + } + } + + private void setMapStatus() { + //定义MapStatusUpdate对象,以便描述地图状态将要发生的变化 + MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mMapStatus); + //改变地图状态 + baiduMap.animateMapStatus(mMapStatusUpdate); + } + + @OnClick({R.id.rl_locate,R.id.rl_ding,R.id.rl_add,R.id.rl_del}) + public void OnClick(View view){ + switch (view.getId()){ + case R.id.rl_locate: + case R.id.rl_ding: + setMapStatus(); + break; + case R.id.rl_add://放大 + addMap(); + break; + case R.id.rl_del://缩小 + delMap(); + break; + } + } + + private void delMap() { + baiduMap.setMapStatus(MapStatusUpdateFactory.zoomOut());//缩小 + } + + private void addMap() { + baiduMap.setMapStatus(MapStatusUpdateFactory.zoomIn());//放大 + } + + /** + * 获取附近人数据 + */ + private void reqUserList() { + String nearbyUrl = Constant.COMMON_URL + Interface.NEARBY_NEW; + JSONObject obj = new JSONObject(); + obj.put("lng",lng); + obj.put("lat",lat); + obj.put("page",1); + obj.put("pagesize",50); + obj.put("userid",userid); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this,false,nearbyUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + if(Constant.SUCCESS_CODE.equals(rsCode)){ + String jsonString = jsonObject.getString("message"); + userList = JSON.parseArray(jsonString,SysRecommendModel.class); + setUser2Map(); + setMakerClickListener(); + } + } + },null); + } + + /** + * 百度地图初始初始化及定位 + */ + private void initLocation() { + helper = new BdLocationHelper(this,0); + helper.registerLocationListener(); + helper.setListener(new BdLocationHelper.onSuccessLocate() { + @Override + public void handle(BDLocation bdLocation) { + String address = bdLocation.getCity(); + lat = bdLocation.getLatitude(); + lng = bdLocation.getLongitude(); + SpUtils.setString(Constant.ADDRESS,address);//首页展示用 + initMap(); + reqUserList(); + } + }); + requestRuntimePermission(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, new PermissionListener() { + @Override + public void onGranted() { + helper.startLocate(); + } + + @Override + public void onDenied(List deniedPermission) { + + } + }); + } + + private Handler handler = new Handler(){ + @Override + public void handleMessage(Message msg) { + if(msg.what==0x01){ + if(items.size()==userList.size()){ + manager.addItems(items); + setMapClickListener(); + setMapStatus(); +// manager.addItems(items); +// // 设置地图监听,当地图状态发生改变时,进行点聚合运算 +// baiduMap.setOnMapStatusChangeListener(manager); + + // 设置maker点击时的响应 +// baiduMap.setOnMarkerClickListener(manager); +// manager.setOnClusterClickListener(new MyClusterManager.OnClusterClickListener() { +// @Override +// public boolean onClusterClick(Cluster cluster) { +// Collection collection = cluster.getItems(); +// List mModelList = new ArrayList<>(); +// for(MyItem item : collection){ +// mModelList.add(item.getModel()); +// } +// startNearByDetailPage(mModelList); +// return false; +// } +// }); + } + } + } + }; + + + /** + * 将数据放入到地图中显示 + */ + private void setUser2Map() { + manager = new MyClusterManager(this, baiduMap,new MarkerManager(baiduMap)); + // 向点聚合管理类中添加Marker实例 + items = new ArrayList<>(); + for(int i=0;i() { + @Override + public void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) { +// Bitmap avatar = createOptBitmap(resource,150,150); +// CircleImageView view = new CircleImageView(NearbyMapActivity.this); +// view.setImageBitmap(avatar); +// view.setImageAlpha(0); + mList.add(resource); + LatLng point = new LatLng(model.getLat(),model.getLng()); + items.add(new MyItem(point,resource,model)); + handler.sendEmptyMessage(0x01); +// BitmapDescriptor bitmap = BitmapDescriptorFactory.fromView(view); +// OverlayOptions option = new MarkerOptions().position(point).icon(bitmap); +// Marker marker = (Marker) baiduMap.addOverlay(option); +// //这种方法在marker中保存对象信息,不用集合的方式去展示了 +// Bundle bundle = new Bundle(); +// bundle.putSerializable("model", model); +// marker.setExtraInfo(bundle);//marker点击事件监听时,可以获取到此时设置的数据 + } + }); + }else{ + Bitmap temp = BitmapUtils.compressBySize(getResources(),R.drawable.img_yuanqueshengtouxiang,50,50); +// Bitmap avatar = createOptBitmap(temp,150,150); +// CircleImageView view = new CircleImageView(NearbyMapActivity.this); +// view.setImageBitmap(avatar); +// view.setImageAlpha(0); + mList.add(temp); + LatLng point = new LatLng(model.getLat(),model.getLng()); + items.add(new MyItem(point,temp,model)); + handler.sendEmptyMessage(0x01); + } + } +// manager.addItems(items); +// // 设置地图监听,当地图状态发生改变时,进行点聚合运算 +// baiduMap.setOnMapStatusChangeListener(manager); +// setMapStatus(); +// setMapClickListener(); + + } + + /** + * 设置map的点击事件 + */ + private void setMapClickListener() { + // 设置地图监听,当地图状态发生改变时,进行点聚合运算 + baiduMap.setOnMapStatusChangeListener(manager); + // 设置maker点击时的响应 + baiduMap.setOnMarkerClickListener(manager); + manager.setOnClusterClickListener(new MyClusterManager.OnClusterClickListener() { + @Override + public boolean onClusterClick(Cluster cluster) { + if(!JqStrUtil.isLogin()){ + startLoginPage(); + return false; + } + Collection collection = cluster.getItems(); + if(collection.size()==1){ + startOtherMainPage(collection.iterator().next().getModel().getUserID()); + }else{ + List mModelList = new ArrayList<>(); + for(MyItem item : collection){ + mModelList.add(item.getModel()); + } + startNearByDetailPage(mModelList); + } + return false; + } + }); + } + + private void startLoginPage() { + Intent intent = new Intent(this,LoginActivity.class); + startActivity(intent); + } + + private void startNearByDetailPage(List mList) { + Intent intent = new Intent(this,NearByListActivity.class); + intent.putExtra("title","附近人"); + intent.putExtra("list",(Serializable)mList); + startActivity(intent); + } + + /** + * 重新生成尺寸不同的bitmap + * @param resource 原bitmap + * @return + */ + private Bitmap createOptBitmap(Bitmap resource,int w,int h) { + int width = resource.getWidth(); + int height = resource.getHeight(); + float scaleWidth = ((float) w) / width; + float scaleHeight = ((float) h) / height; + Matrix matrix = new Matrix(); + matrix.postScale(scaleWidth, scaleHeight); + return Bitmap.createBitmap(resource, 0, 0, width, height, matrix, true); + } + + /** + * 点击事件 + */ + private void setMakerClickListener() { +// baiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() { +// @Override +// public boolean onMarkerClick(Marker marker) { +// startOtherMainPage(marker); +// return false; +// } +// }); + } + + /** + * 点击marker进入目标主页 + * @param id 点击目标id + */ + private void startOtherMainPage(String id) { + Intent intent = new Intent(NearbyMapActivity.this,OtherPersonCenterActivity.class); + intent.putExtra("otherid",id); + startActivity(intent); + } + +// public static class MyItem implements ClusterItem { +// +// private final LatLng mPosition; +// private View avatar; +// private SysRecommendModel model; +// +// public MyItem(LatLng latLng,View view,SysRecommendModel model) { +// mPosition = latLng; +// avatar = view; +// this.model = model; +// } +// +// public SysRecommendModel getModel(){ +// return model; +// } +// +// @Override +// public LatLng getPosition() { +// return mPosition; +// } +// +// @Override +// public BitmapDescriptor getBitmapDescriptor() { +// return BitmapDescriptorFactory.fromView(avatar); +// } +// } + + public static class MyItem implements ClusterItem { + + private final LatLng mPosition; + private SysRecommendModel model; + private Bitmap bitmap; + + public MyItem(LatLng latLng,Bitmap view,SysRecommendModel model) { + mPosition = latLng; + this.model = model; + bitmap = view; + } + + public SysRecommendModel getModel(){ + return model; + } + + public Bitmap getBitmap(){ + return bitmap; + } + + @Override + public LatLng getPosition() { + return mPosition; + } + + @Override + public BitmapDescriptor getBitmapDescriptor() { + return BitmapDescriptorFactory.fromResource(R.drawable.img_yuanqueshengtouxiang); + } + } + + @Override + protected void onDestroy() { + super.onDestroy(); + // 退出时销毁定位 + if (helper != null) { + helper.stopLocate(); + helper = null; + } + clearCache();//释放内存,防止多次发生崩溃 + okHttpUtil.cancelTag(this); + } + + @Override + protected void onPause() { + super.onPause(); + } + + /** + * 消除内存消耗 + */ + private void clearCache(){ + for(int i=0;i userList; + private List userlistAdd; + /** + * 适配器 + */ + private FellForAdapter fellForAdapter; + private PullToRefreshLayout ptrl; + private boolean isshow = true; + + private OkHttpUtil okHttpUtil = OkHttpUtil.getInstance(); + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_nearby_result); + getDataFromSp(); + initView(); + fellForAdapter = new FellForAdapter(NearbyResultActivity.this); + nearbyList.setAdapter(fellForAdapter); +// nearbyList.setAdapter(nearbyAdapter); + userlistAdd = new ArrayList<>(); + pageNo = 1; + reqUserList(); + initEvent(); + } + + private void getDataFromSp() { + String locatelng = SpUtils.getString(Constant.LOCATE_LNG); + String locatelat = SpUtils.getString(Constant.LOCATE_LAT); + if(!JqStrUtil.isEmpty(locatelng)){ + lng = Double.valueOf(locatelng); + } + if(!JqStrUtil.isEmpty(locatelat)){ + lat = Double.valueOf(locatelat); + } + userid = SpUtils.getString(Constant.USER_ID); + } + + private void initView() { + ptrl = ((PullToRefreshLayout) findViewById(R.id.refresh_view)); + rlay_nodata = (RelativeLayout) findViewById(R.id.rlay_nodata); + tvBack = (ImageView)findViewById(R.id.img_leftBtn); + tvTitle = (TextView)findViewById(R.id.tvTitle); + tvSave = (TextView)findViewById(R.id.tvMore); + tvTitle.setText(R.string.nearbyresultperson); + tvSave.setText(R.string.nearbyresultfilter); +// tvSave.setVisibility(View.VISIBLE); + tvSave.setVisibility(View.GONE); + tvBack.setVisibility(View.VISIBLE); + nearbyList = (ListView)findViewById(R.id.nearbylistview); + } + + private void initEvent() { + ptrl.setOnRefreshListener(this); + tvBack.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + finish(); + } + }); + tvSave.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Intent intent = new Intent(NearbyResultActivity.this,NearbySearchActivity.class); + startActivityForResult(intent,0x01); + } + }); + nearbyList.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView adapterView, View view, int position, long l) { + if(userlistAdd.size()<=0){ + return; + } + fellForUserInfoModel = userlistAdd.get(position); + modifyposition = position; + Intent intent = new Intent(NearbyResultActivity.this, OtherPersonCenterActivity.class); + intent.putExtra("otherid",fellForUserInfoModel.getUserID()); + intent.putExtra("flag","fellfor"); + startActivityForResult(intent,0x03); + } + }); + } + + /** + * 获取附近人数据 + */ + private void reqUserList() { +// String nearbyUrl = Constant.COMMON_URL + Interface.GET_NEARBY; + String nearbyUrl = Constant.COMMON_URL + Interface.NEARBY_NEW; + JSONObject obj = new JSONObject(); + obj.put("lng",lng); + obj.put("lat",lat); +// obj.put("raidus",raidus); +// obj.put("sex",sex); +// obj.put("age",age); + obj.put("page",pageNo); + obj.put("pagesize",pageSize); +// obj.put("userID",userid); + obj.put("userid",userid); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + Log.d("ok", "NearbyResultActivity: "+param); + okHttpUtil.sendJsonStrByPostAsync(NearbyResultActivity.this,isshow,nearbyUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + isshow = false; + String rsCode = jsonObject.getString("retcode"); + if("1".equals(rsCode)){ + String jsonString = jsonObject.getString("message"); + Log.d(TAG, "onResponse: "+jsonString); + userList = JSON.parseArray(jsonString,FellForUserInfoModel.class); + Log.d(TAG, "onResponse+nearby: "+userList); + if(1==pageNo && userList.size()<=0){ + rlay_nodata.setVisibility(View.VISIBLE); + }else{ + rlay_nodata.setVisibility(View.GONE); + if(userList.size()<=0){ + ptrl.loadmoreFinish(PullToRefreshLayout.SUC_NODATA); + }else { + userlistAdd.addAll(userList); +// nearbyAdapter.updateListView(userlistAdd); + fellForAdapter.updateListView(userlistAdd); +// ptrl.refreshFinish(PullToRefreshLayout.SUCCEED); + if(1==pageNo){//第一页且有数据为刷新 + ptrl.refreshFinish(PullToRefreshLayout.SUCCEED); + }else{//非第一页且有数据为加载 + ptrl.loadmoreFinish(PullToRefreshLayout.SUCCEED); + } + } + } + } + } + },null); + } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if(requestCode==0x03&&resultCode==0x03){//他人中心发生关注事件 + String isFocus = data.getStringExtra("isFocus"); + if(!JqStrUtil.isEmpty(isFocus)){ + fellForUserInfoModel.setIfattention(isFocus); + } + userlistAdd.remove(modifyposition); + userlistAdd.add(modifyposition,fellForUserInfoModel); + fellForAdapter.updateListView(userlistAdd); + } + } + + @Override + public void onRefresh(PullToRefreshLayout pullToRefreshLayout) { + // 下拉刷新操作 + userlistAdd = new ArrayList<>(); + pageNo = 1; + reqUserList(); + } + + @Override + public void onLoadMore(PullToRefreshLayout pullToRefreshLayout) { + ++pageNo; + reqUserList(); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/NearbySearchActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/NearbySearchActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..3f9e118e96b0c72d0b2b66ce5f1abb3fc01e1b60 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/NearbySearchActivity.java @@ -0,0 +1,269 @@ +package com.jiuqi.elove.activity; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.graphics.drawable.ColorDrawable; +import android.os.Bundle; +import android.support.v4.app.FragmentActivity; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.widget.Button; +import android.widget.ImageButton; +import android.widget.ImageView; +import android.widget.PopupWindow; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.widget.WheelView; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +/** + * + * Created by FanWenXia on 2016/7/7. + */ +public class NearbySearchActivity extends Activity implements View.OnClickListener { + + /*顶部菜单栏三按钮*/ + private ImageView tvBack; + private TextView tvTitle; + private TextView tvSave; + + private RelativeLayout rlay_sex; + private RelativeLayout rlay_distance; + private RelativeLayout rlay_age; + private TextView txt_sex; + private TextView txt_distance; + private TextView txt_age; + private View myview; + + private WheelView comWv;//单滚轮 + private TextView cancel_common; + private TextView confirm_common; + + //构造选择列表数据 + private Map ageMap; + private Map sexMap; + private Map distanceMap; + + //存储请求参数变量 + private String sex = ""; + private String distance = ""; + private String age = ""; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + requestWindowFeature(Window.FEATURE_NO_TITLE); + setContentView(R.layout.activity_nearby_search); + setDataMapper(); + initView(); + initEvent(); + } + //设置数据对应 + private void setDataMapper() { + sexMap = new HashMap<>();//性别 + sexMap.put("-1","不限"); + sexMap.put("0","女"); + sexMap.put("1","男"); + distanceMap = new HashMap<>(); + distanceMap.put("5","5km"); + distanceMap.put("10","10km"); + distanceMap.put("15","15km"); + distanceMap.put("20","20km"); + distanceMap.put("50","50km"); + ageMap = new HashMap<>();//年龄 + ageMap.put("1","18-25"); + ageMap.put("2","26-35"); + ageMap.put("3","36-45"); + ageMap.put("4","46-55"); + } + private void initView() { + tvBack = (ImageView)findViewById(R.id.img_leftBtn); + tvTitle = (TextView)findViewById(R.id.tvTitle); + tvSave = (TextView)findViewById(R.id.tvMore); + tvTitle.setText("筛选"); + tvSave.setText("确认"); + tvSave.setVisibility(View.VISIBLE); + tvBack.setVisibility(View.VISIBLE); + + rlay_sex = (RelativeLayout) findViewById(R.id.rlay_sex); + rlay_distance = (RelativeLayout)findViewById(R.id.rlay_distance); + rlay_age = (RelativeLayout)findViewById(R.id.rlay_age); + txt_sex = (TextView) findViewById(R.id.txt_sex); + txt_age = (TextView) findViewById(R.id.txt_age); + txt_distance = (TextView) findViewById(R.id.txt_distance); + } + + private void initEvent() { + rlay_sex.setOnClickListener(this); + rlay_distance.setOnClickListener(this); + rlay_age.setOnClickListener(this); + tvBack.setOnClickListener(this); + tvSave.setOnClickListener(this); + } + @Override + public void onClick(View view) { + switch (view.getId()){ + case R.id.rlay_sex: + LayoutInflater sexinflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); + myview = sexinflater.inflate(R.layout.popupwindow_common, null); + final PopupWindow sexwindow = new PopupWindow(myview, + WindowManager.LayoutParams.MATCH_PARENT, + WindowManager.LayoutParams.WRAP_CONTENT); + comWv = (WheelView) myview.findViewById(R.id.wv_common); + cancel_common = (TextView) myview.findViewById(R.id.cancel_common); + confirm_common = (TextView) myview.findViewById(R.id.confirm_common); + ArrayList sexList = new ArrayList<>(); +// sexList.add(sexMap.get("-1"));//1 + sexList.add(sexMap.get("1"));//2 + sexList.add(sexMap.get("0"));//3 + comWv.setData(sexList); + initWinCommon(sexwindow); + confirm_common.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + String msex = comWv.getSelectedText(); + Iterator iter = sexMap.entrySet().iterator(); + while(iter.hasNext()){ + Map.Entry entry = (Map.Entry) iter.next(); + if(msex.equals(entry.getValue())){ + sex = (String)entry.getKey(); + } + } + sexwindow.dismiss(); + txt_sex.setText(msex); + } + }); + cancel_common.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + sexwindow.dismiss(); + } + }); + break; + case R.id.rlay_distance: + LayoutInflater distanceinflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); + myview = distanceinflater.inflate(R.layout.popupwindow_common, null); + final PopupWindow distancewindow = new PopupWindow(myview, + WindowManager.LayoutParams.MATCH_PARENT, + WindowManager.LayoutParams.WRAP_CONTENT); + comWv = (WheelView) myview.findViewById(R.id.wv_common); + cancel_common = (TextView) myview.findViewById(R.id.cancel_common); + confirm_common = (TextView) myview.findViewById(R.id.confirm_common); + ArrayList distanceList = new ArrayList<>(); + distanceList.add(distanceMap.get("5"));//1 + distanceList.add(distanceMap.get("10"));//2 + distanceList.add(distanceMap.get("15"));//3 + distanceList.add(distanceMap.get("20"));//4 + distanceList.add(distanceMap.get("50"));//5 + comWv.setData(distanceList); + initWinCommon(distancewindow); + confirm_common.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + String mdistance = comWv.getSelectedText(); + Iterator iter = distanceMap.entrySet().iterator(); + while(iter.hasNext()){ + Map.Entry entry = (Map.Entry) iter.next(); + if(mdistance.equals(entry.getValue())){ + distance = (String) entry.getKey(); + } + } + distancewindow.dismiss(); + txt_distance.setText(mdistance); + } + }); + cancel_common.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + distancewindow.dismiss(); + } + }); + break; + case R.id.rlay_age: + LayoutInflater ageinflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); + myview = ageinflater.inflate(R.layout.popupwindow_common, null); + final PopupWindow agewindow = new PopupWindow(myview, + WindowManager.LayoutParams.MATCH_PARENT, + WindowManager.LayoutParams.WRAP_CONTENT); + comWv = (WheelView) myview.findViewById(R.id.wv_common); + cancel_common = (TextView) myview.findViewById(R.id.cancel_common); + confirm_common = (TextView) myview.findViewById(R.id.confirm_common); + ArrayList ageList = new ArrayList<>(); + ageList.add(ageMap.get("1"));//2 + ageList.add(ageMap.get("2"));//3 + ageList.add(ageMap.get("3"));//4 + ageList.add(ageMap.get("4"));//5 + comWv.setData(ageList); + initWinCommon(agewindow); + confirm_common.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + String mage = comWv.getSelectedText(); + Iterator iter = ageMap.entrySet().iterator(); + while(iter.hasNext()){ + Map.Entry entry = (Map.Entry) iter.next(); + if(mage.equals(entry.getValue())){ + age = (String) entry.getKey(); + } + } + agewindow.dismiss(); + txt_age.setText(mage); + } + }); + cancel_common.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + agewindow.dismiss(); + } + }); + break; + case R.id.img_leftBtn: + finish(); + break; + case R.id.tvMore: + finishWithResult(); + break; + default: + break; + } + } + + private void finishWithResult() { + Intent intent = new Intent(); + intent.putExtra("age",age); + intent.putExtra("distance",distance); + intent.putExtra("sex",sex); + setResult(0x01,intent); + finish(); + } + + private void initWinCommon(final PopupWindow window) { + // 设置popWindow弹出窗体可点击,这句话必须添加,并且是true + window.setFocusable(true); + // 实例化一个ColorDrawable颜色为半透明 + ColorDrawable dw = new ColorDrawable(0xb0000000); + window.setBackgroundDrawable(dw); + // 设置popWindow的显示和消失动画 + window.setAnimationStyle(R.style.mypopwindow_anim_style); + // 在底部显示 + window.showAtLocation(NearbySearchActivity.this.findViewById(R.id.rlay_popwindow), + Gravity.BOTTOM, 0, 0); + //popWindow消失监听方法 + window.setOnDismissListener(new PopupWindow.OnDismissListener() { + @Override + public void onDismiss() { + window.dismiss(); + } + }); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/NewPhoneActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/NewPhoneActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..567ac982ef91aa0f4927e294144ac1cd346f5830 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/NewPhoneActivity.java @@ -0,0 +1,45 @@ +package com.jiuqi.elove.activity; + +import android.content.Intent; +import android.os.Bundle; +import android.text.TextUtils; +import android.widget.TextView; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.util.JqStrUtil; + +import butterknife.BindView; +import butterknife.OnClick; + +public class NewPhoneActivity extends ABaseActivity { + + @BindView(R.id.et_phone) + TextView et_phone; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_new_phone,"绑定手机",-1,MODE_BACK,HEIGHT_REDBG_WHITEFONT); + } + + @OnClick(R.id.tv_sure) + public void onClick(){ + startGetCodePage(); + } + + private void startGetCodePage() { + String mobile = et_phone.getText().toString().trim(); + if(TextUtils.isEmpty(mobile)){ + showToast("请输入手机号"); + return; + } + if(!JqStrUtil.isMobileNo(mobile)){ + showToast("请输入合法的手机号"); + return; + } + Intent intent = new Intent(this,GetVerifyCodeActivity.class); + intent.putExtra("mobile",mobile); + intent.putExtra("flag","bound"); + startActivity(intent); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/NewsActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/NewsActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..fa30743f60cf082b840e3094a67559ddac7b85d1 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/NewsActivity.java @@ -0,0 +1,36 @@ +package com.jiuqi.elove.activity; + + +import android.os.Bundle; +import android.support.v4.app.Fragment; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.Share; +import com.stonesun.newssdk.NewsAgent; + +/** + * 智通情感 + * Created by dl on 2016/7/11. + */ +public class NewsActivity extends ABaseActivity { + + private Fragment mEmotionFragment; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_news,"资讯"); + initView(); + } + + private void initView() { + if(mEmotionFragment ==null) { +// NewsAgent.createShareCommentViewActivity("重写的详情页"); + NewsAgent.setContentViewActivity(new EloveShareCommentViewActivity(), "重写的详情页"); + NewsAgent.setShowShare(new Share(),"重写的详情页");//分享需要 + NewsAgent.createDefaultRecomFragment("自定义推荐", "SPOTS-82647", "重写的详情页"); + mEmotionFragment = NewsAgent.getDefaultRecomFragment("自定义推荐"); + } + getSupportFragmentManager().beginTransaction().add(R.id.container, mEmotionFragment).commit(); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/NewsDetailActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/NewsDetailActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..791714eb87b0d9eb6e1277d30ffc9812b27307a7 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/NewsDetailActivity.java @@ -0,0 +1,394 @@ +package com.jiuqi.elove.activity; + +import android.content.Context; +import android.content.Intent; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.os.IBinder; +import android.os.Message; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.MotionEvent; +import android.view.View; +import android.view.inputmethod.InputMethodManager; +import android.webkit.WebSettings; +import android.webkit.WebView; +import android.webkit.WebViewClient; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.alibaba.fastjson.JSON; +import com.jiuqi.elove.R; +import com.jiuqi.elove.adapter.CommentAdapter; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.entity.CommentModel; +import com.jiuqi.elove.entity.CommentWrapModel; +import com.jiuqi.elove.util.MyLayoutManager; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; +import com.jiuqi.elove.util.SupportMultiScreenUtil; +import com.jiuqi.elove.widget.ScanScrollView; +import com.stonesun.newssdk.activity.ContentViewActivity; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.List; + +/** + * 根据在主配置清单文件中的键盘设置,打开界面键盘首先是隐藏的 + */ +public class NewsDetailActivity extends ContentViewActivity{ + + protected View rootView; + private TextView tv_content_title; + private Context ctx; + private LinearLayout ll_left; + private RecyclerView rv_comment; + private ScanScrollView scroll_view; + private TextView tv_bottom; + private TextView tv_send; + private EditText et_comment; + private LinearLayout ll_comment; + private ImageView iv_no_comment; + private ImageView iv_comment_prompt; + private WebView webview; + + private List mList; + private List mAddList; + private CommentAdapter adapter; + private String id; + private String limit = "10"; + private String offset = "1"; + private String userid; + private String identity; + private String fatherid; + private String firstId; + private String fmedia; + private String url; + private boolean isshow; + + private int clickPosition; + + /** + * 工具 + */ + private final OkHttpUtil okHttpUtil = OkHttpUtil.getInstance(); + + private Boolean isCreate;//是否是第一次,因为onLoad会调用两次 + private Handler mHanlder = new Handler(){ + @Override + public void handleMessage(Message msg) { + if(msg.what==0x01){ + mHanlder.postDelayed(new Runnable() { + @Override + public void run() { + tv_bottom.setVisibility(View.GONE); + } + },1000); + } + } + }; + + public NewsDetailActivity(){} + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + isCreate = true;//因为sdk提供的方法onLoaded会调用两次,所以需要再加一个标志位,否则会将数据加载两次 + setContentView(R.layout.activity_news_detail); + initView();//初始化ui + super.showView(); + supportMultiScreen(); + getDataFromSp();//获取用户必要的缓存信息 + initRv();//初始化recyclerview + setOnClick();//设置点击点击事件 + } + + /** + * 多屏幕适配 + */ + private void supportMultiScreen() { + rootView = findViewById(android.R.id.content); + SupportMultiScreenUtil.scale(rootView); + } + + private void loadComment() { + runOnUiThread(new Runnable() { + @Override + public void run() { + ll_comment.setVisibility(View.VISIBLE);//首先ll_comment在布局中是隐藏的,希望加载好webview之后再加载其后面的布局 + iv_comment_prompt.setVisibility(View.VISIBLE); + tv_content_title.setText(fmedia); + } + }); + String detailInfoUrl = Constant.COMMON_URL + Interface.ARTICLE_COMMENT_LIST; + com.alibaba.fastjson.JSONObject obj = new com.alibaba.fastjson.JSONObject(); + obj.put("articleid", id); + obj.put("recid", ""); + obj.put("offset", offset); + obj.put("limit", limit); + obj.put("version", Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, isshow, detailInfoUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(com.alibaba.fastjson.JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + if ("1".equals(rsCode)) { + String result = jsonObject.getString("data"); + CommentWrapModel data = JSON.parseObject(result, CommentWrapModel.class); + mList = data.getList(); + if (isCreate) { + mAddList.clear(); + } + mAddList.addAll(mList); + runOnUiThread(new Runnable() { + @Override + public void run() { + if (mAddList.isEmpty()) { + tv_bottom.setVisibility(View.GONE); + iv_no_comment.setVisibility(View.VISIBLE); + } else { + iv_no_comment.setVisibility(View.GONE); + if (mList.isEmpty()) { + tv_bottom.setText("暂无更多评论..."); + mHanlder.sendEmptyMessage(0x01); + } else { + adapter.updateListView(mAddList); + tv_bottom.setText("加载成功"); + mHanlder.sendEmptyMessage(0x01); + } + } + } + }); + + } + } + }, null); + } + + + private void getDataFromSp() { + userid = SpUtils.getString(Constant.USER_ID); +// identity = SpUtils.getString(Constant.IDENTITY); + fatherid = ""; + firstId = ""; + } + + private void setOnClick() { + ll_left.setOnClickListener(new View.OnClickListener() {//左侧返回事件 + @Override + public void onClick(View v) { + finish(); + } + }); + tv_send.setOnClickListener(new View.OnClickListener() {//发送评论事件 + @Override + public void onClick(View v) { + addComment(id,userid,firstId,et_comment.getText().toString().trim()); + } + }); + } + + private void addComment(String id, String userid,String firstId, String trim) { + String addUrl = Constant.COMMON_URL + Interface.ARTICLE_ADD_COMMENT; + com.alibaba.fastjson.JSONObject obj = new com.alibaba.fastjson.JSONObject(); + obj.put("articleid", id); + obj.put("userid", userid); + obj.put("firstid", firstId); + obj.put("comment", trim); + obj.put("version", Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, true, addUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(com.alibaba.fastjson.JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + if ("1".equals(rsCode)) { + String result = jsonObject.getString("data"); + CommentModel data = JSON.parseObject(result, CommentModel.class); + if (mAddList.isEmpty()) { + iv_no_comment.setVisibility(View.GONE); + } + mAddList.add(0, data); + adapter.updateListView(mAddList); + udpateDetailUi(); + } + } + }, null); + } + + private void initRv() { + mAddList = new ArrayList<>(); + rv_comment.setLayoutManager(new LinearLayoutManager(this)); + adapter = new CommentAdapter(this,"comment"); + rv_comment.setAdapter(adapter); + rv_comment.setNestedScrollingEnabled(false);//禁止recyclerview本身的滑动 + adapter.setCommentClickListener(new CommentAdapter.OnClickComment() { + @Override + public void onReplyClick(String flag, CommentAdapter.CommentViewHolder holder, CommentModel model, int position) { + startCommentReply(flag,holder,model,position); + } + }); + } + + private void startCommentReply(String flag, CommentAdapter.CommentViewHolder holder, CommentModel model, int position) { + clickPosition = position; + Intent intent = new Intent(this,CommentReplyActivity.class); + intent.putExtra("flag",flag); + intent.putExtra("bean",model); + intent.putExtra("article",id); + startActivityForResult(intent,0x001); + overridePendingTransition(R.anim.activity_open, R.anim.activity_fade_out); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if(requestCode==0x001&&resultCode==RESULT_OK){ + int size = data.getIntExtra("size",0); + if(size>0){ + mAddList.get(clickPosition).setChildCount(size); + adapter.notifyDataSetChanged(); + } + + } + } + + private void initView() { + tv_content_title = (TextView) findViewById(R.id.tv_content_title); + ll_left = (LinearLayout) findViewById(R.id.ll_left); + ll_comment = (LinearLayout) findViewById(R.id.ll_comment); + rv_comment = (RecyclerView) findViewById(R.id.rv_comment); + tv_bottom = (TextView) findViewById(R.id.tv_bottom); + tv_send = (TextView) findViewById(R.id.tv_send); + et_comment = (EditText) findViewById(R.id.et_comment); + scroll_view = (ScanScrollView) findViewById(R.id.scroll_view); + iv_no_comment = (ImageView) findViewById(R.id.iv_no_comment); + iv_comment_prompt = (ImageView) findViewById(R.id.iv_comment_prompt); + webview = (WebView) findViewById(R.id.content_web); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + //两者都可以 + webview.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); + } + MyLayoutManager.setImageLayout(this,iv_comment_prompt,0,1,1,6); + MyLayoutManager.setImageLayout(this,iv_no_comment,0,1,1,3); + scroll_view.setScanScrollChangedListener(new ScanScrollView.ISmartScrollChangedListener() { + @Override + public void onScrolledToBottom() { + if(!mAddList.isEmpty()){ + setLoadingVisible(); + isCreate = false; + offset = String.valueOf(Integer.parseInt(offset)+1); + isshow = false; + loadComment(); + } + } + + @Override + public void onScrolledToTop() { + + } + }); + } + + private void setLoadingVisible(){ + tv_bottom.setText("正在加载..."); + tv_bottom.setVisibility(View.VISIBLE); + } + + @Override + public void onLoaded(JSONObject jsonObject) { + if(jsonObject !=null){ + try { + offset = "1"; + fmedia = jsonObject.getString("fmedia"); + id = jsonObject.getString("item_id"); + String url = jsonObject.getString("url"); + reloadWebView(url); + isshow = true; + loadComment();//加载数据 + } catch (JSONException e) { + e.printStackTrace(); + } + } + } + + private void reloadWebView(final String url) { + runOnUiThread(new Runnable() { + @Override + public void run() { + webview.setWebViewClient(new WebViewClient(){ + @Override + public void onPageFinished(WebView view, String url) { + super.onPageFinished(view, url); + //这个是一定要加上那个的,配合scrollView和WebView的height=wrap_content属性使用 + int w = View.MeasureSpec.makeMeasureSpec(0, + View.MeasureSpec.UNSPECIFIED); + int h = View.MeasureSpec.makeMeasureSpec(0, + View.MeasureSpec.UNSPECIFIED); + //重新测量 + webview.measure(w, h); + } + }); + } + }); + } + + /** + * 提交信息之后清空输入内容和状态 + */ + private void udpateDetailUi() { + et_comment.setText(""); + et_comment.clearFocus(); + hideSoftInput(getCurrentFocus().getWindowToken()); + } + + private void hideSoftInput(IBinder token) { + if (token != null) { + InputMethodManager im = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); + im.hideSoftInputFromWindow(token, InputMethodManager.HIDE_NOT_ALWAYS); + } + } + + @Override + public boolean dispatchTouchEvent(MotionEvent ev) { + if (ev.getAction() == MotionEvent.ACTION_DOWN) { + // 获得当前得到焦点的View,一般情况下就是EditText(特殊情况就是轨迹求或者实体案件会移动焦点) + View v = getCurrentFocus(); + if (isShouldHideInput(v, ev)) { + hideSoftInput(v.getWindowToken()); + } + } + return super.dispatchTouchEvent(ev); + } + + /** + * 根据EditText所在坐标和用户点击的坐标相对比,来判断是否隐藏键盘,因为当用户点击EditText时没必要隐藏 + * + * @param v + * @param event + * @return + */ + private boolean isShouldHideInput(View v, MotionEvent event) { + if (v != null && (v instanceof EditText)) { + int[] l = {0, 0}; + v.getLocationInWindow(l); + int left = l[0], top = l[1], bottom = top + v.getHeight(), right = left + + v.getWidth(); + if (event.getX() > left && event.getX() < right && event.getY() > top && event.getY() < bottom) { + // 点击EditText的事件,忽略它。 + return false; + } else { + return true; + } + } + // 如果焦点不是EditText则忽略,这个发生在视图刚绘制完,第一个焦点不在EditView上,和用户用轨迹球选择其他的焦点 + return false; + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/NotifyRecentMessageActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/NotifyRecentMessageActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..09235d11e5deb252ed346da979161267c7b26d24 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/NotifyRecentMessageActivity.java @@ -0,0 +1,49 @@ +package com.jiuqi.elove.activity; + +import android.content.Intent; +import android.os.Bundle; +import android.view.View; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.fragment.RecentMessageFragment; + +import butterknife.BindView; +import butterknife.OnClick; + +public class NotifyRecentMessageActivity extends ABaseActivity { + + @BindView(R.id.tv_right) + TextView tv_right; + @BindView(R.id.rl_right_tv) + RelativeLayout rl_right_tv; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_notify_recent_message,"消息"); + initView(); + } + + private void initView() { + tv_right.setText("设置"); + rl_right_tv.setVisibility(View.VISIBLE); + RecentMessageFragment fragment = new RecentMessageFragment(); + getSupportFragmentManager().beginTransaction().add(R.id.container, fragment).commit(); + } + + @OnClick(R.id.rl_right_tv) + public void onClick(View view){ + switch (view.getId()){ + case R.id.rl_right_tv: + startSetPage(); + break; + } + } + + private void startSetPage() { + Intent intent = new Intent(this,MsgSetActivity.class); + startActivity(intent); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/OrderDetailActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/OrderDetailActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..9e1552fdc89ff943009562f67c75efb48f48737c --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/OrderDetailActivity.java @@ -0,0 +1,358 @@ +package com.jiuqi.elove.activity; + +import android.app.Activity; +import android.content.DialogInterface; +import android.content.Intent; +import android.os.Bundle; +import android.util.Log; +import android.util.TypedValue; +import android.view.View; +import android.view.Window; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.alibaba.fastjson.JSONObject; +import com.bumptech.glide.Glide; +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.entity.OrderModel; +import com.jiuqi.elove.util.AbDateUtil; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.widget.dialog.CustomDialog; + +import java.util.Map; +import java.util.Timer; +import java.util.TimerTask; + +public class OrderDetailActivity extends Activity implements View.OnClickListener{ + + private static final String TAG = "OrderDetailActivity"; + /*顶部菜单栏按钮*/ + private TextView tvTitle; + private ImageView tvBack; + + private TextView txt_money; + private TextView txt_title; + private TextView txt_stime; + private TextView txt_adds; + private TextView end_state;//订单取消提示或者订单超时提示 + private TextView order_num; + private TextView minContainer; + private TextView seContainer; + private TextView state_prompt; + private TextView tv_shouldpay_total; + private TextView tv_redbean_mounts; + private TextView tv_pay_redbean; + private TextView tv_needpay; + private ImageView img_poster; + private ImageView pay_leaderimg; + private Button btn_order; + private LinearLayout ll_timer; + private LinearLayout ll_order_info; + private RelativeLayout rl_order_state; + /** + * 数据 + */ + private String orderNum; + private String orderstate;//订单状态 + private String actState;//活动状态 + private String refundstate;//退款状态 + private int time; + /** + * 工具 + */ + private final OkHttpUtil okHttpUtil = OkHttpUtil.getInstance(); + private Timer timer = new Timer(); + private TimerTask task; + public static OrderDetailActivity instance; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + requestWindowFeature(Window.FEATURE_NO_TITLE); + setContentView(R.layout.activity_order_detail); + instance = this; + initView();//初始化控件 + getDataFromPre();//从上个页面后去值 + initEvent();//注册事件 + } + + private void getDataFromPre() { + Intent intent = getIntent(); + orderNum = intent.getStringExtra("orderNum"); +// orderstate = intent.getStringExtra("orderstate"); +// actState = intent.getStringExtra("actState"); + } + + private void initEvent() { + tvBack.setOnClickListener(this); + } + + private void initData2View() { + String detailInfoUrl = Constant.COMMON_URL + Interface.GET_ORDERINFO; + JSONObject obj = new JSONObject(); + obj.put("ordernum",orderNum); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, true, detailInfoUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + if("1".equals(rsCode)){ + String result = jsonObject.getString("message"); + Log.d(TAG, "onResponse: "+result); + OrderModel model = JSONObject.parseObject(result,OrderModel.class); + orderstate = model.getOrder_state(); + actState = model.getAct_state(); + refundstate = model.getRefund_state(); + txt_money.setText(getString(R.string.yuan)+model.getFee()+getString(R.string.pay_unit)); + txt_title.setText(model.getTitle()); + txt_stime.setText(model.getActstart()); + txt_adds.setText(model.getAddress()); + order_num.setText(orderNum); + tv_shouldpay_total.setText(getString(R.string.yuan)+model.getFee()); + tv_pay_redbean.setText("-"+model.getPayredbean()+"个"); + tv_needpay.setText(getString(R.string.yuan)+model.getRealfee()); + rl_order_state.setVisibility(View.VISIBLE); + ll_order_info.setVisibility(View.VISIBLE); + if(!JqStrUtil.isEmpty(model.getPost())){ + Glide.with(OrderDetailActivity.this).load(model.getPost()).placeholder(R.drawable.order_default).into(img_poster); + }else{ + Glide.with(OrderDetailActivity.this).load(R.drawable.order_default).into(img_poster); + } + if("1".equals(orderstate)&&(int)model.getEx_time()!=0){//待支付 + setTimer(model); + pay_leaderimg.setImageResource(R.drawable.pay_first); + state_prompt.setText(getString(R.string.pay_first_prompt)); + btn_order.setText(R.string.pay); + btn_order.setOnClickListener(new View.OnClickListener() {//点击跳转支付页面 + @Override + public void onClick(View view) { + Intent intent = new Intent(OrderDetailActivity.this,WaitingAndSelectPayTypeActivity.class); + intent.putExtra("ordernum",orderNum); + startActivity(intent); + } + }); + }else if("2".equals(orderstate)){//支付成功 + if("1".equals(actState)){//支付成功,等待确认过程隐藏按钮 + pay_leaderimg.setImageResource(R.drawable.pay_second); + ll_timer.setVisibility(View.GONE); + state_prompt.setText(R.string.pay_success_waitcheck); + btn_order.setVisibility(View.GONE); + }else if("2".equals(actState)){//支付成功,参加活动成功可以进行删除 + pay_leaderimg.setImageResource(R.drawable.pay_third); + ll_timer.setVisibility(View.GONE); + state_prompt.setText(R.string.pay_success_attend); + btn_order.setText(R.string.del_order); + btn_order.setBackgroundColor(getResources().getColor(R.color.gray)); + btn_order.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + createdelOrderDialog(); + } + }); + } + if("1".equals(refundstate)){//付款成功,申请被拒绝,等待退款,隐藏按钮 +// pay_leaderimg.setImageResource(R.drawable.pay_second); + pay_leaderimg.setVisibility(View.GONE); + ll_timer.setVisibility(View.GONE); + state_prompt.setVisibility(View.GONE); + end_state.setVisibility(View.VISIBLE); + end_state.setText(R.string.pay_success_failconfirm); + end_state.setTextSize(TypedValue.COMPLEX_UNIT_SP,18); + btn_order.setVisibility(View.GONE); + }else if("2".equals(refundstate)){//付款成功,申请被拒绝,退款成功,可以删除 +// pay_leaderimg.setImageResource(R.drawable.pay_third); + pay_leaderimg.setVisibility(View.GONE); + ll_timer.setVisibility(View.GONE); + state_prompt.setVisibility(View.GONE); + end_state.setVisibility(View.VISIBLE); + end_state.setTextSize(TypedValue.COMPLEX_UNIT_SP,18); + if(!JqStrUtil.isEmpty(model.getRefund_fee())){//退款金额不为空 + end_state.setText(getString(R.string.pay_success_payback)+getString(R.string.yuan)+model.getRefund_fee()+getString(R.string.pay_unit)); + }else{ + end_state.setText(getString(R.string.pay_success_payback)+"成功"); + } + btn_order.setBackgroundColor(getResources().getColor(R.color.gray)); + btn_order.setText(R.string.del_order); + btn_order.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + createdelOrderDialog(); + } + }); + } + } else{//订单取消和订单超时两种情况 + state_prompt.setVisibility(View.GONE); + ll_timer.setVisibility(View.GONE); + pay_leaderimg.setVisibility(View.GONE); + end_state.setVisibility(View.VISIBLE); + btn_order.setText(R.string.del_order); +// btn_order.setBackgroundColor(getResources().getColor(R.color.gray)); + btn_order.setBackground(getResources().getDrawable(R.drawable.solid_gray_radius5)); + btn_order.setOnClickListener(new View.OnClickListener() {//点击删除 + @Override + public void onClick(View view) { + createdelOrderDialog(); + } + }); + if("4".equals(orderstate)){//订单超时(提示取消吧先) + end_state.setText(R.string.order_already_timeout); + }else if("3".equals(orderstate)){//订单取消 + end_state.setText(R.string.order_already_cancel); + } + } + } + } + },null); + } + + /** + * 删除订单 + */ + private void createdelOrderDialog() { + //对话框 + CustomDialog.Builder builder = new CustomDialog.Builder(this); + builder.setTitle(getString(R.string.order_manage)); + builder.setMessage(getString(R.string.makesure_delorder)); + builder.setPositiveButton(R.string.confirm,new DialogInterface.OnClickListener() { + public void onClick(final DialogInterface dialog, int which) { + String delUrl = Constant.COMMON_URL + Interface.DEL_ORDER; + JSONObject obj = new JSONObject(); + obj.put("orderNum",orderNum); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(OrderDetailActivity.this, false, delUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + if("1".equals(rsCode)){ + if(OrderManagementActivity.instance!=null){ + OrderManagementActivity.instance.refresh(); + } + dialog.dismiss(); + finish(); + } + } + },null); + } + }); + builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }); + builder.create().show(); + } + /** + * 设置计时器 + */ + private void setTimer(OrderModel model) { + Log.d(TAG, "setTimer: model.getTime"+model.getEx_time()); + time = (int)model.getEx_time(); + if(task==null){ + task = new TimerTask() { + @Override + public void run() { + runOnUiThread(new Runnable() { // UI thread + @Override + public void run() { + Map timeMap = AbDateUtil.secToTimeMap(time); + if (time <= 0) { + minContainer.setText(timeMap.get("min")); + seContainer.setText(timeMap.get("sec")); + task.cancel(); + state_prompt.setVisibility(View.GONE); + ll_timer.setVisibility(View.GONE); + pay_leaderimg.setVisibility(View.GONE); + end_state.setVisibility(View.VISIBLE); + btn_order.setText(R.string.del_order); + btn_order.setBackground(getResources().getDrawable(R.drawable.solid_gray_radius5)); + btn_order.setOnClickListener(new View.OnClickListener() {//点击删除 + @Override + public void onClick(View view) { + createdelOrderDialog(); + } + }); + end_state.setText(R.string.order_already_timeout); +// if(OrderManagementActivity.instance!=null){ +// OrderManagementActivity.instance.refresh(); +// } + } else {//处理动态读秒 + minContainer.setText(timeMap.get("min")); + seContainer.setText(timeMap.get("sec")); + } + time--; + } + }); + } + }; + timer.schedule(task, 0, 1000); + } + } + + private void initView() { + tvBack = (ImageView)findViewById(R.id.img_leftBtn); + img_poster = (ImageView)findViewById(R.id.img_poster); + pay_leaderimg = (ImageView)findViewById(R.id.pay_leaderimg); + tvTitle = (TextView)findViewById(R.id.tvTitle); + tvTitle.setText(getString(R.string.order_info)); + tvBack.setVisibility(View.VISIBLE); + txt_money = (TextView) findViewById(R.id.txt_money); + txt_title = (TextView) findViewById(R.id.txt_title); + txt_stime = (TextView) findViewById(R.id.txt_stime); + txt_adds = (TextView) findViewById(R.id.txt_adds); + order_num = (TextView) findViewById(R.id.order_num); + minContainer = (TextView) findViewById(R.id.minContainer); + seContainer = (TextView) findViewById(R.id.seContainer); + state_prompt = (TextView) findViewById(R.id.state_prompt); + tv_shouldpay_total = (TextView) findViewById(R.id.tv_shouldpay_total); + tv_redbean_mounts = (TextView) findViewById(R.id.tv_redbean_mounts); + tv_pay_redbean = (TextView) findViewById(R.id.tv_pay_redbean); + tv_needpay = (TextView) findViewById(R.id.tv_needpay); + end_state = (TextView) findViewById(R.id.end_state); + ll_timer = (LinearLayout) findViewById(R.id.ll_timer); + ll_order_info = (LinearLayout) findViewById(R.id.ll_order_info); + rl_order_state = (RelativeLayout) findViewById(R.id.rl_order_state); + btn_order = (Button) findViewById(R.id.btn_order); + rl_order_state.setVisibility(View.GONE);//先隐藏,防止因为状态的不同改变已经显示的东西,造成页面闪动 + ll_order_info.setVisibility(View.GONE);//先隐藏,防止因为状态的不同改变已经显示的东西,造成页面闪动 + } + + @Override + public void onClick(View view) { + switch (view.getId()){ + case R.id.img_leftBtn: + if(OrderManagementActivity.instance!=null){ + OrderManagementActivity.instance.refresh(); + } + finish(); + break; + default: + break; + } + } + + @Override + protected void onResume() { + super.onResume(); + initData2View();//获取数据并填入ui + } + + @Override + protected void onDestroy() { + super.onDestroy(); + if(instance!=null){ + instance = null; + } + } + + public void refresh(){ + initData2View(); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/OrderDetailActivity254.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/OrderDetailActivity254.java new file mode 100644 index 0000000000000000000000000000000000000000..c0d2669a288bb79c8c1d8998aa7340d426b45691 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/OrderDetailActivity254.java @@ -0,0 +1,322 @@ +package com.jiuqi.elove.activity; + +import android.app.Activity; +import android.content.DialogInterface; +import android.content.Intent; +import android.os.Bundle; +import android.util.Log; +import android.util.TypedValue; +import android.view.View; +import android.view.Window; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.alibaba.fastjson.JSONObject; +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.entity.EActDetailModel2_0_3; +import com.jiuqi.elove.entity.OrderModel; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.widget.dialog.CustomDialog; + +import java.util.Timer; +import java.util.TimerTask; + +/** + * 订单详情(只显示取消的和已经支付的状态) + * Created by dl on 2017/4/10. + */ +public class OrderDetailActivity254 extends Activity implements View.OnClickListener{ + private static final String TAG = "OrderDetailActivity254"; + /*顶部菜单栏按钮*/ + private TextView tvTitle; + private ImageView tvBack; + + private TextView txt_money; + private TextView txt_title; + private TextView txt_stime; + private TextView txt_adds; + private TextView end_state;//订单取消提示或者订单超时提示 + private TextView order_num; + private TextView minContainer; + private TextView seContainer; + private TextView state_prompt; + private TextView tv_shouldpay_total; + private TextView tv_redbean_mounts; + private TextView tv_pay_redbean; + private TextView tv_needpay; + private ImageView pay_leaderimg; + private Button btn_order; + private LinearLayout ll_timer; + private LinearLayout ll_order_info; + private RelativeLayout rl_order_state; + private TextView tv_coupon;//优惠券 + private TextView tv_name; + private TextView tv_company; + /** + * 数据 + */ + private String orderNum; + private String orderstate;//订单状态 + private String actState;//活动状态 + private String refundstate;//退款状态 + private int time; + /** + * 工具 + */ + private final OkHttpUtil okHttpUtil = OkHttpUtil.getInstance(); + private Timer timer = new Timer(); + private TimerTask task; + public static OrderDetailActivity254 instance; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + requestWindowFeature(Window.FEATURE_NO_TITLE); + setContentView(R.layout.activity_order_detail254); + instance = this; + initView();//初始化控件 + getDataFromPre();//从上个页面后去值 + initEvent();//注册事件 + } + + private void getDataFromPre() { + Intent intent = getIntent(); + orderNum = intent.getStringExtra("ordernum"); + } + + private void initEvent() { + tvBack.setOnClickListener(this); + } + + private void initData2View() { + String detailInfoUrl = Constant.COMMON_URL + Interface.GET_ORDERINFO; + JSONObject obj = new JSONObject(); + obj.put("ordernum",orderNum); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, true, detailInfoUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + if("1".equals(rsCode)){ + String result = jsonObject.getString("message"); + Log.d(TAG, "onResponse: "+result); + OrderModel model = JSONObject.parseObject(result,OrderModel.class); + orderstate = model.getOrder_state(); + actState = model.getAct_state(); + refundstate = model.getRefund_state(); + txt_money.setText(getString(R.string.yuan)+model.getFee()+getString(R.string.pay_unit)); + txt_title.setText(model.getTitle()); + txt_stime.setText(model.getActstart()); + txt_adds.setText(model.getAddress()); + order_num.setText(orderNum); + tv_shouldpay_total.setText(getString(R.string.yuan)+model.getFee()); + tv_pay_redbean.setText("-"+model.getPayredbean()+"个"); + tv_needpay.setText(getString(R.string.yuan)+model.getRealfee()); + rl_order_state.setVisibility(View.VISIBLE); + ll_order_info.setVisibility(View.VISIBLE); + if(JqStrUtil.isEmpty(model.getRemarknm())){ + tv_name.setText("未填"); + }else{ + tv_name.setText(model.getRemarknm()); + } + if(JqStrUtil.isEmpty(model.getRemarkep())){ + tv_company.setText("未填"); + }else{ + tv_company.setText(model.getRemarkep()); + } + if(JqStrUtil.isEmpty(model.getTicketid())){ + tv_coupon.setText("无"); + }else{ + if(Constant.CARD_FULL.equals(model.getTickettype())){ + tv_coupon.setText("全票"); + }else{ + tv_coupon.setText("¥"+model.getTicketmoney()); + } + } + //1为待支付状态,但是待支付状态不再进入此页面 + if("2".equals(orderstate)){//支付成功 + if("1".equals(actState)){//支付成功,等待确认过程隐藏按钮 + pay_leaderimg.setImageResource(R.drawable.pay_second); + ll_timer.setVisibility(View.GONE); + state_prompt.setText(R.string.pay_success_waitcheck); + btn_order.setVisibility(View.GONE); + }else if("2".equals(actState)){//支付成功,参加活动成功可以进行删除 + pay_leaderimg.setImageResource(R.drawable.pay_third); + ll_timer.setVisibility(View.GONE); + state_prompt.setText(R.string.pay_success_attend); + btn_order.setText(R.string.del_order); + btn_order.setBackgroundColor(getResources().getColor(R.color.gray)); + btn_order.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + createdelOrderDialog(); + } + }); + } + if("1".equals(refundstate)){//付款成功,申请被拒绝,等待退款,隐藏按钮 +// pay_leaderimg.setImageResource(R.drawable.pay_second); + pay_leaderimg.setVisibility(View.GONE); + ll_timer.setVisibility(View.GONE); + state_prompt.setVisibility(View.GONE); + end_state.setVisibility(View.VISIBLE); + end_state.setText(R.string.pay_success_failconfirm); + end_state.setTextSize(TypedValue.COMPLEX_UNIT_SP,18); + btn_order.setVisibility(View.GONE); + }else if("2".equals(refundstate)){//付款成功,申请被拒绝,退款成功,可以删除 +// pay_leaderimg.setImageResource(R.drawable.pay_third); + pay_leaderimg.setVisibility(View.GONE); + ll_timer.setVisibility(View.GONE); + state_prompt.setVisibility(View.GONE); + end_state.setVisibility(View.VISIBLE); + end_state.setTextSize(TypedValue.COMPLEX_UNIT_SP,18); + if(!JqStrUtil.isEmpty(model.getRefund_fee())){//退款金额不为空 + end_state.setText(getString(R.string.pay_success_payback)+getString(R.string.yuan)+model.getRefund_fee()+getString(R.string.pay_unit)); + }else{ + end_state.setText(getString(R.string.pay_success_payback)+"成功"); + } + btn_order.setBackgroundColor(getResources().getColor(R.color.gray)); + btn_order.setText(R.string.del_order); + btn_order.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + createdelOrderDialog(); + } + }); + } + } else{//订单取消和订单超时两种情况 + state_prompt.setVisibility(View.GONE); + ll_timer.setVisibility(View.GONE); + pay_leaderimg.setVisibility(View.GONE); + end_state.setVisibility(View.VISIBLE); + btn_order.setText(R.string.del_order); +// btn_order.setBackgroundColor(getResources().getColor(R.color.gray)); + btn_order.setBackground(getResources().getDrawable(R.drawable.solid_gray_radius5)); + btn_order.setOnClickListener(new View.OnClickListener() {//点击删除 + @Override + public void onClick(View view) { + createdelOrderDialog(); + } + }); + if("4".equals(orderstate)){//订单超时(提示取消吧先) + end_state.setText(R.string.order_already_timeout); + }else if("3".equals(orderstate)){//订单取消 + end_state.setText(R.string.order_already_cancel); + }else{//画蛇添足,怕除了其他状态,将其他状态默认为超时 + end_state.setText(R.string.order_already_timeout); + } + } + } + } + },null); + } + + /** + * 删除订单 + */ + private void createdelOrderDialog() { + //对话框 + CustomDialog.Builder builder = new CustomDialog.Builder(this); + builder.setTitle(getString(R.string.order_manage)); + builder.setMessage(getString(R.string.makesure_delorder)); + builder.setPositiveButton(R.string.confirm,new DialogInterface.OnClickListener() { + public void onClick(final DialogInterface dialog, int which) { + String delUrl = Constant.COMMON_URL + Interface.DEL_ORDER; + JSONObject obj = new JSONObject(); + obj.put("orderNum",orderNum); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(OrderDetailActivity254.this, false, delUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + if("1".equals(rsCode)){ + if(OrderManagementActivity.instance!=null){ + OrderManagementActivity.instance.refresh(); + } + dialog.dismiss(); + finish(); + } + } + },null); + } + }); + builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }); + builder.create().show(); + } + + private void initView() { + tvBack = (ImageView)findViewById(R.id.img_leftBtn); + pay_leaderimg = (ImageView)findViewById(R.id.pay_leaderimg); + tvTitle = (TextView)findViewById(R.id.tvTitle); + tvTitle.setText(getString(R.string.order_info)); + tvBack.setVisibility(View.VISIBLE); + txt_money = (TextView) findViewById(R.id.txt_money); + txt_title = (TextView) findViewById(R.id.txt_title); + txt_stime = (TextView) findViewById(R.id.txt_stime); + txt_adds = (TextView) findViewById(R.id.txt_adds); + order_num = (TextView) findViewById(R.id.order_num); + minContainer = (TextView) findViewById(R.id.minContainer); + seContainer = (TextView) findViewById(R.id.seContainer); + state_prompt = (TextView) findViewById(R.id.state_prompt); + tv_shouldpay_total = (TextView) findViewById(R.id.tv_shouldpay_total); + tv_redbean_mounts = (TextView) findViewById(R.id.tv_redbean_mounts); + tv_pay_redbean = (TextView) findViewById(R.id.tv_pay_redbean); + tv_needpay = (TextView) findViewById(R.id.tv_needpay); + end_state = (TextView) findViewById(R.id.end_state); + ll_timer = (LinearLayout) findViewById(R.id.ll_timer); + ll_order_info = (LinearLayout) findViewById(R.id.ll_order_info); + rl_order_state = (RelativeLayout) findViewById(R.id.rl_order_state); + btn_order = (Button) findViewById(R.id.btn_order); + tv_coupon = (TextView) findViewById(R.id.tv_coupon); + tv_name = (TextView) findViewById(R.id.tv_name); + tv_company = (TextView) findViewById(R.id.tv_company); + rl_order_state.setVisibility(View.GONE);//先隐藏,防止因为状态的不同改变已经显示的东西,造成页面闪动 + ll_order_info.setVisibility(View.GONE);//先隐藏,防止因为状态的不同改变已经显示的东西,造成页面闪动 + } + + @Override + public void onClick(View view) { + switch (view.getId()){ + case R.id.img_leftBtn: + if(OrderManagementActivity.instance!=null){ + OrderManagementActivity.instance.refresh(); + } + finish(); + break; + default: + break; + } + } + + @Override + protected void onResume() { + super.onResume(); + initData2View();//获取数据并填入ui + if(EActDetailActivity2_0_3.instance!=null){ + EActDetailActivity2_0_3.instance.refresh(); + } + } + + @Override + protected void onDestroy() { + super.onDestroy(); + if(instance!=null){ + instance = null; + } + } + + public void refresh(){ + initData2View(); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/OrderManagementActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/OrderManagementActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..aa39d97bc7378005b79441bae50e5512a1b15405 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/OrderManagementActivity.java @@ -0,0 +1,164 @@ +package com.jiuqi.elove.activity; + +import android.app.Activity; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; +import android.widget.ListView; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.jiuqi.elove.R; +import com.jiuqi.elove.adapter.OrderManageAdapter; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.common.JqBaseActivity; +import com.jiuqi.elove.entity.OrderManageModel; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; +import com.jiuqi.elove.widget.pulltorefresh.PullToRefreshLayout; + +import java.util.ArrayList; +import java.util.List; + +public class OrderManagementActivity extends JqBaseActivity implements View.OnClickListener,PullToRefreshLayout.OnRefreshListener{ + + private static final String TAG = "OrderManagementActivity"; + /** + * 控件 + */ + private TextView tvTitle; + private ImageView tvBack; + private PullToRefreshLayout orderRefresh; + private ListView lv_order; + private RelativeLayout rlay_nodata; + + /** + * 数据 + */ + private String userId; + private List myorderList; + private List myorderAddList; + + /** + * 工具 + */ + private OrderManageAdapter adapter; + public static OrderManagementActivity instance; + private boolean isshow = true; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_order_management); + instance = this; + getInfoFromSp();//获取当前用户id + initView();//组件初始化 + initListView(); + setEvents();//事件监听设定 + } + + private void getInfoFromSp() { + userId = SpUtils.getString(Constant.USER_ID); + } + + private void initView() { + tvBack = (ImageView)findViewById(R.id.img_leftBtn); + tvTitle = (TextView)findViewById(R.id.tvTitle); + tvTitle.setText(getResources().getString(R.string.order_management)); + tvBack.setVisibility(View.VISIBLE); + orderRefresh = (PullToRefreshLayout) findViewById(R.id.order_refresh_view); + lv_order = (ListView) findViewById(R.id.lv_order); + rlay_nodata = (RelativeLayout) findViewById(R.id.rlay_nodata); + } + + /** + * ListView初始化方法 + */ + private void initListView() + { + adapter = new OrderManageAdapter(OrderManagementActivity.this); + lv_order.setAdapter(adapter); + myorderAddList = new ArrayList<>(); + getData2View();//获取列表,将数据填充入ui + } + + + private void getData2View() { + String orderListUrl = Constant.COMMON_URL + Interface.GET_ORDERLIST; + JSONObject obj = new JSONObject(); + obj.put("userID",userId); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, isshow, orderListUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + Log.d(TAG, "onResponse: "+rsCode); + if("1".equals(rsCode)){ + String result = jsonObject.getString("message"); + Log.d(TAG, "onResponse: "+result); + myorderList = JSON.parseArray(result,OrderManageModel.class); + if(myorderList!=null&&myorderList.size()>0){ + rlay_nodata.setVisibility(View.GONE); +// adapter.addOrderManageAdapter(myorderList); + myorderAddList.addAll(myorderList); + adapter.updateListView(myorderAddList); + orderRefresh.refreshFinish(PullToRefreshLayout.SUCCEED); + }else{ + rlay_nodata.setVisibility(View.VISIBLE); + } + } + } + },null); + } + + private void setEvents() { + orderRefresh.setOnRefreshListener(this); + tvBack.setOnClickListener(this); + } + + @Override + public void onClick(View view) { + switch (view.getId()){ + case R.id.img_leftBtn: + finish(); + break; + default: + break; + } + } + + public void refresh(){ + isshow = false; + if(!myorderAddList.isEmpty()){ + myorderAddList.clear(); + } + getData2View();//获取列表,将数据填充入ui + } + + @Override + protected void onDestroy() { + super.onDestroy(); + if(instance!=null){ + instance = null; + } + } + + @Override + public void onRefresh(PullToRefreshLayout pullToRefreshLayout) { + // 下拉刷新操作 + myorderAddList = new ArrayList<>(); + isshow = false; + getData2View(); + } + + @Override + public void onLoadMore(PullToRefreshLayout pullToRefreshLayout) { + + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/OtherPersonCenterActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/OtherPersonCenterActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..723b4cc76f9e9d969168bbf394a6d83b28d3f3ee --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/OtherPersonCenterActivity.java @@ -0,0 +1,1430 @@ +package com.jiuqi.elove.activity; + +import android.app.Dialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.drawable.ColorDrawable; +import android.os.Bundle; +import android.support.v4.graphics.drawable.RoundedBitmapDrawable; +import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.StaggeredGridLayoutManager; +import android.text.TextUtils; +import android.util.DisplayMetrics; +import android.util.Log; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.widget.AdapterView; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.PopupWindow; +import android.widget.RelativeLayout; +import android.widget.ScrollView; +import android.widget.TextView; +import android.widget.Toast; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baoyz.actionsheet.ActionSheet; +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.target.BitmapImageViewTarget; +import com.google.android.flexbox.FlexboxLayout; +import com.hyphenate.chat.EMClient; +import com.hyphenate.easeui.EaseConstant; +import com.hyphenate.exceptions.HyphenateException; +import com.jiuqi.elove.R; +import com.jiuqi.elove.adapter.CoOrganizerAdapter; +import com.jiuqi.elove.adapter.GiftAdapter; +import com.jiuqi.elove.adapter.HorizontalGiftAdapter; +import com.jiuqi.elove.adapter.HorizontalListViewAdapter; +import com.jiuqi.elove.common.CommonDataUtil; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.common.JqBaseActivity; +import com.jiuqi.elove.entity.GiftModel; +import com.jiuqi.elove.entity.OtherInfoCenterModel; +import com.jiuqi.elove.fragment.ContactPersonFragment; +import com.jiuqi.elove.util.BlurImageview; +import com.jiuqi.elove.util.CommonUtil; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; +import com.jiuqi.elove.util.StatusBarUtil; +import com.jiuqi.elove.widget.dialog.CustomDialog; +import com.jiuqi.elove.widget.HorizontalListView; +import com.jiuqi.elove.widget.WordWrapView; +import com.umeng.analytics.MobclickAgent; +import com.umeng.socialize.ShareAction; +import com.umeng.socialize.UMShareAPI; +import com.umeng.socialize.UMShareListener; +import com.umeng.socialize.bean.SHARE_MEDIA; +import com.umeng.socialize.media.UMImage; +import com.umeng.socialize.shareboard.SnsPlatform; +import com.umeng.socialize.utils.ShareBoardlistener; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import butterknife.BindView; +import butterknife.OnClick; + +public class OtherPersonCenterActivity extends ABaseActivity implements View.OnClickListener,ActionSheet.ActionSheetListener{ + + private static final String TAG = "OtherActivity"; + + /*顶部菜单栏按钮*/ + private RelativeLayout tvBack; + private RelativeLayout ivShare; + private String otherId; + //他人中心控件 + private ImageView iv_other_headPhoto; +// private TextView tv_other_age; +// private TextView tv_other_height; +// private TextView tv_other_address; + private TextView txt_introduce; + //认证部分的 + private ImageView iv_auth_e; + private TextView tv_other_idStr; + private TextView tv_other_nameStr; + private TextView tv_other_ageStr; + private TextView tv_other_heightStr; + private TextView tv_other_enducationStr; + private TextView tv_other_salaryStr; + private TextView tv_other_addressStr; + private TextView tv_other_marryStr; + private TextView tv_other_hasHouseStr; + private TextView tv_other_hasCarStr; + private TextView tv_demand_ageStr; + private TextView tv_demand_heightStr; + private TextView tv_demand_enducationStr; + private TextView tv_demand_salaryStr; + private TextView tv_demand_addressStr; + private TextView tv_demand_marryStr; + private TextView tv_demand_isHasHouseStr; + private TextView tv_demand_isHasCarStr; + private TextView tv_other_sexStr_below;//性别 + private TextView tv_other_professionStr;//职业 + private TextView tv_other_origoStr;//籍贯 + private TextView tv_other_nationStr;//民族 +// private WordWrapView wordwrapview_hobby;//兴趣爱好自动换行容器 +// private WordWrapView wordwrapview_label;//标签自动换行容器 +// private TextView tv_addLabelBtn; +// private TextView txt_hobby_null; + private TextView tv_selfintro_null; +// private TextView txt_label_null; + private RelativeLayout rlay_dcus;//关注 + private ImageView imgducs; + private RelativeLayout rlay_talk;//打招呼 + private TextView txt_dnum; + private HorizontalListView hlistview; + private HorizontalListViewAdapter imgAdapter; + private ScrollView scrollview_other; +// private ImageView iv_isVideo; +// private ImageView iv_isLike; + private ImageView iv_auth_name; + private ImageView iv_auth_email; + private ImageView iv_auth_qiyuan; + private TextView tv_nikeName; +// private TextView tv_match_percent; +// private LinearLayout lv_match_percent; + private RelativeLayout rl_send_gift; + private TextView tv_nogift_null; + private LinearLayout ll_gift; + private RecyclerView gift_listview; + private TextView tv_redbean; + private ImageView iv_company_name; + @BindView(R.id.rlay_title)//顶部左右按钮布局 + RelativeLayout rlay_title; + @BindView(R.id.iv_blur)//底部背景 + ImageView iv_blur; + @BindView(R.id.flex_hobby)//兴趣爱好流布局 + FlexboxLayout flex_hobby; + @BindView(R.id.flex_mark)//标签流布局 + FlexboxLayout flex_mark; + @BindView(R.id.ll_nike)//昵称 + LinearLayout ll_nike; + @BindView(R.id.ll_sex)//性别 + LinearLayout ll_sex; + @BindView(R.id.ll_age)//年龄 + LinearLayout ll_age; + @BindView(R.id.ll_nation)//民族 + LinearLayout ll_nation; + @BindView(R.id.ll_live_now)//现居地 + LinearLayout ll_live_now; + @BindView(R.id.ll_hometown)//故乡 + LinearLayout ll_hometown; + @BindView(R.id.ll_height)//身高 + LinearLayout ll_height; + @BindView(R.id.ll_weight)//体重 + LinearLayout ll_weight; + @BindView(R.id.ll_car)//购车 + LinearLayout ll_car; + @BindView(R.id.ll_house)//购房 + LinearLayout ll_house; + @BindView(R.id.ll_school)//毕业院校 + LinearLayout ll_school; + @BindView(R.id.ll_degree)//学历 + LinearLayout ll_degree; + @BindView(R.id.ll_salary)//年薪 + LinearLayout ll_salary; + @BindView(R.id.ll_profession)//职业 + LinearLayout ll_profession; + @BindView(R.id.ll_company)//单位 + LinearLayout ll_company; + @BindView(R.id.ll_marry)//婚姻 + LinearLayout ll_marry; + @BindView(R.id.ll_demand_age)//年龄要求 + LinearLayout ll_demand_age; + @BindView(R.id.ll_age_demand)//身高要求 + LinearLayout ll_age_demand; + @BindView(R.id.ll_degree_demand)//学历要求 + LinearLayout ll_degree_demand; + @BindView(R.id.ll_salary_demand)//年薪要求 + LinearLayout ll_salary_demand; + @BindView(R.id.ll_house_demand)//房子要求 + LinearLayout ll_house_demand; + @BindView(R.id.ll_car_demand)//购车要求 + LinearLayout ll_car_demand; + @BindView(R.id.ll_live_demand)//现居地要求 + LinearLayout ll_live_demand; + @BindView(R.id.tv_other_weightStr)//体重 + TextView tv_other_weightStr; + @BindView(R.id.tv_other_school)//毕业院校 + TextView tv_other_school; + @BindView(R.id.tv_other_companyStr)//单位 + TextView tv_other_companyStr; + @BindView(R.id.rl_video)//视频 + RelativeLayout rl_video; + @BindView(R.id.iv_video) + ImageView iv_video; + @BindView(R.id.tv_invite)//无视频时显示邀请视频字样 + TextView tv_invite; + @BindView(R.id.tv_gift_title)//礼物头 + TextView tv_gift_title; + + /** + * 数据 + */ + private List labels;//个人标签list,打开添加标签页面时需要传过去 + private String othersex;//TA的标签页面根据传过去的该值展示与男女性别相对应的固定标签 + private List pictureList;//相册图片List + private String avatar;//头像链接 + private String isLike;//是否点赞 + private String sexBeauty;//分享用 性别 + private Bitmap imgbitmap;//分享用 头像 + private String nikeName; + private String myId; + private OtherInfoCenterModel model; + private String minheightrequest;//身高要求最小值 + private String maxheightrequest;//身高要求最大值 + private String minagerequest;// 最低年龄要求 + private String maxagerequest;// 最大年龄要求 + private Map sexMap; + private Map degreeMap;//学历和学历要求 + private Map incomeMap;//年薪和年薪要求 + private Map marriageMap;//婚姻和婚姻状况要求 + private Map ageMap;//年龄要求 + private Map heightMap;//身高要求 + private Map carMap; + private Map houseMap; + private Map carRequestMap; + private Map houseRequestMap; + private Map professionMap; + private Map nationMap; + private List giftList; + private List giftReceiveList; + private int redbean; + + /** + * 工具 + */ + private String flag;//判断上个页面来自哪里,用于保证从推荐和倾心页面过来点赞之后返回数据更新 + private boolean isModify = false;//判断是否被修改过,暂时只有添加标签那里需要用到 + private static final int CANCEL_FOCUS = 2; + private static final int CANCEL_LIKE = 1; + private HorizontalGiftAdapter giftAdapter; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_other_person_center24,"",-1,MODE_NONE,HEIGHT_NONE_DARK); + setDataMapper();//获取资料对应map数据 + getDataFromPrePageAndSp();//从上一个页面获取必要的数据 + initView();//初始化UI + initEvents();//注册事件 + getOtherPhoto();//单独获取相册图片 + getOtherGift();//获取获得的礼物 + initDataAndView();//从服务器获取数据并填充到UI + } + + /** + * 从上个页面和sp中获取必要的数据 + */ + private void getDataFromPrePageAndSp() { + Intent intent = getIntent(); + otherId = intent.getStringExtra("otherid"); + flag = intent.getStringExtra("flag"); + myId = SpUtils.getString(Constant.USER_ID); + redbean = SpUtils.getInt(Constant.RED_BEAN); + } + + /** + * 设置他人资料数据映射以及相应的资料数据map获取 + */ + private void setDataMapper() { + initData(); + CommonDataUtil.setNationMap(); + professionMap = CommonDataUtil.professionMap; + nationMap = CommonDataUtil.nationMap; + sexMap = CommonDataUtil.sexMap; + degreeMap = CommonDataUtil.degreeMap; + incomeMap = CommonDataUtil.incomeMap; + marriageMap = CommonDataUtil.marriageMap; + ageMap = CommonDataUtil.ageMap; + heightMap = CommonDataUtil.heightMap; + carMap = CommonDataUtil.carMap; + houseMap = CommonDataUtil.houseMap; + carRequestMap = CommonDataUtil.carRequestMap; + houseRequestMap = CommonDataUtil.houseRequestMap; + } + + /** + * 初始化UI + */ + private void initView() { + tvBack = easyFind(R.id.img_leftBtn); + ivShare = easyFind(R.id.img_rightBtn); + iv_other_headPhoto = easyFind(R.id.iv_other_headPhoto); + tv_selfintro_null = easyFind(R.id.tv_selfintro_null); + txt_introduce = easyFind(R.id.txt_introduce); + tv_other_nameStr = easyFind(R.id.tv_other_nameStr); + tv_other_ageStr = easyFind(R.id.tv_other_ageStr); + tv_other_heightStr = easyFind(R.id.tv_other_heightStr); + tv_other_enducationStr = easyFind(R.id.tv_other_enducationStr); + tv_other_salaryStr = easyFind(R.id.tv_other_salaryStr); + tv_other_addressStr = easyFind(R.id.tv_other_addressStr); + tv_other_marryStr = easyFind(R.id.tv_other_marryStr); + tv_other_hasHouseStr = easyFind(R.id.tv_other_hasHouseStr); + tv_other_hasCarStr = easyFind(R.id.tv_other_hasCarStr); + tv_demand_ageStr = easyFind(R.id.tv_demand_ageStr); + tv_demand_heightStr = easyFind(R.id.tv_demand_heightStr); + tv_demand_enducationStr = easyFind(R.id.tv_demand_enducationStr); + tv_demand_salaryStr = easyFind(R.id.tv_demand_salaryStr); + tv_demand_addressStr = easyFind(R.id.tv_demand_addressStr); + txt_dnum = easyFind(R.id.txt_dnum); + tv_demand_isHasHouseStr = easyFind(R.id.tv_demand_isHasHouseStr); + tv_demand_isHasCarStr = easyFind(R.id.tv_demand_isHasCarStr); + tv_other_sexStr_below = easyFind(R.id.tv_other_sexStr_below); + tv_other_professionStr = easyFind(R.id.tv_other_professionStr); + tv_other_companyStr = easyFind(R.id.tv_other_companyStr); + tv_other_origoStr = easyFind(R.id.tv_other_origoStr); + tv_other_nationStr = easyFind(R.id.tv_other_nationStr); + rlay_dcus = easyFind(R.id.rlay_dcus); + rlay_talk = easyFind(R.id.rlay_talk); + imgducs = easyFind(R.id.img_dcus); + hlistview = easyFind(R.id.horizon_listview); + hlistview.setLayoutParams(getMyLayout()); + scrollview_other = easyFind(R.id.scrollview_other); +// iv_isVideo = easyFind(R.id.iv_isVideo); +// iv_isLike = easyFind(R.id.iv_isLike); + tv_nikeName = easyFind(R.id.tv_nikeName); +// tv_match_percent = easyFind(R.id.tv_match_percent); + iv_auth_name = easyFind(R.id.iv_auth_name); + iv_auth_qiyuan = easyFind(R.id.iv_auth_qiyuan); + tv_other_idStr = easyFind(R.id.tv_other_idStr); +// lv_match_percent = easyFind(R.id.lv_match_percent); + rl_send_gift = easyFind(R.id.rl_send_gift); + tv_nogift_null = easyFind(R.id.tv_nogift_null); + ll_gift = easyFind(R.id.ll_gift); + gift_listview = easyFind(R.id.gift_listview); + iv_company_name = easyFind(R.id.iv_company_name); + if(myId.equals(otherId)){ + ivShare.setVisibility(View.GONE); + } + RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); + lp.setMargins(0, StatusBarUtil.intStatusView(),0,0); + rlay_title.setLayoutParams(lp); + } + + /** + * 获取礼物 + * 其中获取页面中礼物的名字是由服务器返回的数据和json中包含的id数据比对得来(服务器没有保存实际的名字) + */ + private void getOtherGift(){ + String receivegiftUrl = Constant.COMMON_URL + Interface.MY_GIFT; + JSONObject obj = new JSONObject(); + obj.put("userid",otherId); + obj.put("version",Constant.VERSION); + obj.put("action",Constant.RECEIVE_ACTION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, false, receivegiftUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + if(Constant.SUCCESS_CODE.equals(rsCode)){ + String result = jsonObject.getString("message"); + giftReceiveList = JSONArray.parseArray(result,GiftModel.class); + if(giftReceiveList!=null&&!giftReceiveList.isEmpty()){ + ll_gift.setVisibility(View.VISIBLE); + tv_nogift_null.setVisibility(View.GONE); +// giftAdapter = new HorizontalGiftAdapter(OtherPersonCenterActivity.this,giftReceiveList); +// gift_listview.setAdapter(giftAdapter); + LinearLayoutManager manager = new LinearLayoutManager(OtherPersonCenterActivity.this); + manager.setOrientation(LinearLayoutManager.HORIZONTAL); + gift_listview.setLayoutManager(manager); + giftAdapter = new HorizontalGiftAdapter(OtherPersonCenterActivity.this,giftReceiveList,giftList); + gift_listview.setAdapter(giftAdapter); + setGiftTitle(); + }else{ + ll_gift.setVisibility(View.GONE); + tv_nogift_null.setVisibility(View.VISIBLE); + } + } + } + },null); + } + + /** + * gift数量设置 + */ + private void setGiftTitle() { + int num = 0; + for(GiftModel model:giftReceiveList){ + num = num + model.getNum(); + } + tv_gift_title.setText("礼物"+"(已收到"+num+"个礼物)"); + } + + /** + * 获取我的相片不是全部 + */ + private void getOtherPhoto() { + String photoUrl = Constant.COMMON_URL + Interface.MY_PHOTO; + JSONObject obj = new JSONObject(); + obj.put("userID", otherId); + obj.put("version",Constant.VERSION); + obj.put("action","");//不传则读取全部相片 + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, false, photoUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + if(jsonObject==null){ + return; + } + String rsCode = jsonObject.getString("retcode"); + if ("1".equals(rsCode)) { + String result = jsonObject.getString("message"); + pictureList = JSON.parseArray(result,OtherInfoCenterModel.PicturesBean.class); + if(pictureList==null||pictureList.isEmpty()){ + hlistview.setVisibility(View.GONE); + }else{ + hlistview.setVisibility(View.VISIBLE); + imgAdapter = new HorizontalListViewAdapter(getApplicationContext(),pictureList); + hlistview.setAdapter(imgAdapter); + } + } + } + }, null); + } + + /** + * 从服务器获取数据并填充到UI + */ + private void initDataAndView() { + String otherMainpageUrl = Constant.COMMON_URL + Interface.OTHER_MAINPAGE; + JSONObject obj = new JSONObject(); + obj.put("userID",otherId); + obj.put("MyID",myId); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + Log.d(TAG, "initDataAndView: "+param); + okHttpUtil.sendJsonStrByPostAsync(OtherPersonCenterActivity.this,true,otherMainpageUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + if("1".equals(rsCode)){ + Log.d(TAG, "onResponse: result"+jsonObject); + String result = jsonObject.getString("message"); + model = JSON.parseObject(result,OtherInfoCenterModel.class); + labels = model.getLabels(); + avatar = model.getAvatar(); + othersex = model.getSex(); + if("1".equals(model.getBereave())){ + JqStrUtil.showToast(getApplicationContext(),"该用户被封禁"); + finish(); + return; + } + initViewAndEvents(model); + } + } + },null); + } + + /** + * 将获取到的数据填充到UI并且设置一定的点击事件 + * @param model 他人资料的实体对象 + */ + private void initViewAndEvents(final OtherInfoCenterModel model) { + Glide.with(getApplicationContext()).load(model.getAvatar()).asBitmap().placeholder(R.drawable.img_yuanqueshengtouxiang).centerCrop().into(new BitmapImageViewTarget(iv_other_headPhoto) { + @Override + protected void setResource(Bitmap resource) { + RoundedBitmapDrawable circularBitmapDrawable = + RoundedBitmapDrawableFactory.create(getResources(), resource); + circularBitmapDrawable.setCircular(true); + iv_other_headPhoto.setImageDrawable(circularBitmapDrawable); + imgbitmap = resource; + iv_blur.setImageDrawable(BlurImageview.BlurImages(resource, OtherPersonCenterActivity.this)); +// rl_otherBackground.setBackgroundDrawable(BlurImageview.BlurImages(resource, OtherPersonCenterActivity.this)); + } + }); + if(!JqStrUtil.isEmpty(model.getIDNum())){ + tv_other_idStr.setText(model.getIDNum()); + } + if(!JqStrUtil.isEmpty(model.getLovedeclaration())){ + txt_introduce.setText(model.getLovedeclaration()); + }else{ + tv_selfintro_null.setVisibility(View.VISIBLE); + } +// if("0".equals(model.getMatch())){ +// tv_match_percent.setText("匹配度不详"); +// lv_match_percent.setVisibility(View.VISIBLE); +// }else{ +// StringBuilder sb = new StringBuilder(); +// sb.append("匹配度"); +// sb.append(model.getMatch()); +// sb.append("%"); +// tv_match_percent.setText(sb); +// lv_match_percent.setVisibility(View.VISIBLE); +// } + if("1".equals(model.getSex())){ + sexBeauty = getResources().getString(R.string.hotman); + }else{ + sexBeauty = getResources().getString(R.string.beauty); + } + // if(JqStrUtil.isEmpty(model.getVideo())) { +// if ("1".equals(model.getIfvideo())) {//0:没有已通过认证的视频 1:有已通过认证的视频 +// iv_isVideo.setImageResource(R.drawable.other_center_video); +// } else { +// iv_isVideo.setImageResource(R.drawable.other_center_unvideo); +// } +// } +// iv_isVideo.setOnClickListener(new View.OnClickListener() { +// @Override +// public void onClick(View view) { +// if("1".equals(model.getIfvideo())){ +// Intent intent = new Intent(OtherPersonCenterActivity.this,OtherPreVideoActivity.class); +// intent.putExtra("otherId",otherId); +// startActivity(intent); +// }else{ +// inviteAuthenticate("1"); +// } +// } +// }); + if(JqStrUtil.isEmpty(model.getVideo())){ + rl_video.setVisibility(View.GONE); + iv_video.setVisibility(View.GONE); + tv_invite.setVisibility(View.VISIBLE); + }else{ + //两种方式都可以让图片充满view + rl_video.setVisibility(View.VISIBLE); + tv_invite.setVisibility(View.GONE); +// Bitmap bitmap = CommonUtil.getVideoThumbnail(myModel.getVideo(),CommonUtil.dip2px(this,110), CommonUtil.dip2px(this,70)); + Bitmap bitmap = CommonUtil.getVideoThumbnail(model.getVideo()); + if(bitmap!=null){ + iv_video.setScaleType(ImageView.ScaleType.FIT_XY); + iv_video.setImageBitmap(bitmap); + } + } + nikeName = model.getNickname(); + tv_nikeName.setText(nikeName); + //认证资料 + setAuthData2View(model); + //详细资料 + setDetailData2View(model); + //要求资料 + setDemandData2View(model); + //兴趣和标签 + setHobbyAndMark2View(model); + //点赞 + isLike = model.getIflike(); + //关注 好友关系.0是我的关注。1是我的好友。2是我的粉丝。3没有好友关系。 + if("0".equals(model.getFirendship())){ + imgducs.setImageResource(R.drawable.other_center_focus_un); + }else{ + imgducs.setImageResource(R.drawable.other_center_focus_on); + txt_dnum.setText("取消关注"); + } + rlay_dcus.setOnClickListener(new View.OnClickListener() {//关注 + @Override + public void onClick(View view) { + if(myId.equals(otherId)){ + JqStrUtil.showToast(OtherPersonCenterActivity.this,getResources().getString(R.string.focus_others_only)); + return; + } + if("0".equals(model.getFirendship())){ + addFocus(model,Constant.ACTION_ADDFOCUS); + }else{ + showSureDialog(CANCEL_FOCUS); + } + } + }); + rlay_talk.setOnClickListener(new View.OnClickListener() {//打招呼 + @Override + public void onClick(View view) { + startSingleTalk(); + } + }); + rl_send_gift.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if(myId.equals(otherId)){ + JqStrUtil.showToast(OtherPersonCenterActivity.this,"仅可以给他人送礼物哦~"); + return; + } + showGiftPopupWindow(); + } + }); + } + + /** + * 聊天 + */ + private void startSingleTalk() { + if(myId.equals(otherId)){ + JqStrUtil.showToast(this,getResources().getString(R.string.talk_others_only)); + return; + } + //打招呼结束之后也需要resume中调用接口, + // 因为用户很可能打招呼的过程中点击对方头像进入他人中心做了点赞或者关注操作,只是很可能 + // 但是无法确定所以干脆每次回来都刷新以保证用户不会再次做操作而出错 + isModify = true; + Intent intent = new Intent(OtherPersonCenterActivity.this, ChatActivity.class); + intent.putExtra("chatType", EaseConstant.CHATTYPE_SINGLE);//2.0.2版本加群聊之后做区分 + intent.putExtra("userId",otherId.toLowerCase()); + intent.putExtra("nikeName",model.getNickname()); + intent.putExtra("avatar",model.getAvatar()); + startActivity(intent); + } + + /** + * 认证信息 + * @param model + */ + private void setAuthData2View(OtherInfoCenterModel model) { + if(Constant.REALNAME_PASS.equals(model.getRealnametype())){ + iv_auth_name.setImageResource(R.drawable.icon_idcard_on); + }else{ + iv_auth_name.setImageResource(R.drawable.icon_idcard_un); + } + if(Constant.YOUTH_PASS.equals(model.getYouthLeague())){ + iv_auth_qiyuan.setImageResource(R.drawable.icon_qingnian_on); + }else{ + iv_auth_qiyuan.setImageResource(R.drawable.icon_qingnian_un); + } + if(Constant.COMPANY_PASS.equals(model.getKind())){ + iv_company_name.setImageResource(R.drawable.icon_company_on); + }else{ + iv_company_name.setImageResource(R.drawable.icon_company_un); + } + } + + /** + * 他人的兴趣和标签 + * @param model + */ + private void setHobbyAndMark2View(OtherInfoCenterModel model) { + //兴趣爱好 + if(model.getHobbys().size()<=0){ + flex_hobby.removeAllViews(); + }else{ + flex_hobby.removeAllViews(); + for(int i = 0; i=model.getRedbean()){ + createSendGiftDialog(OtherPersonCenterActivity.this,model); + window.dismiss(); + }else{ + JqStrUtil.showToast(OtherPersonCenterActivity.this,"元宝数量不足,快去做任务获取元宝吧~"); + } + } + }); + } + + /** + * 赠送之前的展示界面 + */ + public void createSendGiftDialog(Context context, final GiftModel model) { + // 首先得到整个View + View view = LayoutInflater.from(context).inflate( + R.layout.dialog_gift_send, null); + // 获取整个布局 + LinearLayout layout = (LinearLayout) view + .findViewById(R.id.dialog_view); + layout.setLayoutParams(getSendGiftLayout()); + // 礼物图片 + ImageView iv_gift = (ImageView) view.findViewById(R.id.iv_gift); + //赠送按钮 + TextView tv_send = (TextView) view.findViewById(R.id.tv_send); + // 礼物名称 + TextView tv_gift_name = (TextView) view.findViewById(R.id.tv_gift_name); + //礼物价格 + TextView tv_price = (TextView) view.findViewById(R.id.tv_price); + CommonUtil.setGiftDrawable(context,model.getName(),iv_gift); + // 显示名称 + tv_gift_name.setText("["+model.getName_real()+"]"); + //价格 + tv_price.setText(model.getRedbean()+"元宝"); + // 创建自定义样式的Dialog + final Dialog loadingDialog = new Dialog(context, R.style.loading_gift); + // 设置返回键返回 + loadingDialog.setCancelable(true); + //点击空白取消 + loadingDialog.setCanceledOnTouchOutside(true); + loadingDialog.setContentView(layout, getSendGiftLayout()); + tv_send.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + sendGift(model,loadingDialog); + } + }); + loadingDialog.show(); + } + + /** + * 送礼物 + */ + private void sendGift(final GiftModel model, final Dialog loadingDialog) { + String sendGiftUrl = Constant.COMMON_URL + Interface.SEND_GIFT; + JSONObject obj = new JSONObject(); + obj.put("userid",myId); + obj.put("otherid",otherId); + obj.put("name",model.getName()); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, true, sendGiftUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if("1".equals(rsCode)){ + loadingDialog.dismiss(); + if(tv_redbean!=null){ + redbean = redbean - model.getRedbean(); + SpUtils.setInt(Constant.RED_BEAN,redbean); + tv_redbean.setText(String.valueOf(redbean-model.getRedbean())); + } + getOtherGift(); + JqStrUtil.showToast(OtherPersonCenterActivity.this,explanation); + } + } + },null); + } + + /** + * 初始化礼物数据 + */ + private void initData() { + String giftJson = CommonUtil.readAssets(this,"gift.json"); + giftList = JSONArray.parseArray(giftJson,GiftModel.class); + } + + private void showSureDialog(final int flag) { + CustomDialog.Builder builder = new CustomDialog.Builder(this); + builder.setTitle(""); + if(CANCEL_LIKE==flag){ + builder.setMessage("确定要取消赞吗?"); + }else{ + builder.setMessage("确定要取消关注吗?"); + } + builder.setPositiveButton(R.string.confirm,new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + if(CANCEL_LIKE==flag){ +// like(model,"2"); + }else{ + addFocus(model,Constant.ACTION_UNFOCUS); + } + dialog.dismiss(); + } + }); + builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }); + builder.create().show(); + } + + /** + * 设置年龄要求 + * @param minagerequesttemp 最小年龄要求 + * @param maxagerequesttemp 最大年龄要求 + * @param agerqTv 需要填充的view + */ + private void setAgerq2View(String minagerequesttemp, String maxagerequesttemp, TextView agerqTv) { + if(TextUtils.isEmpty(minagerequesttemp)){ + agerqTv.setText("不限"); + return; + } + if("不限".equals(minagerequesttemp)||"-1".equals(minagerequesttemp)){ + minagerequest = "-1"; + }else if("0".equals(minagerequesttemp)){ + minagerequest = "0"; + }else{ + minagerequest = minagerequesttemp.substring(0,2); + } + if("不限".equals(maxagerequesttemp)||"-1".equals(maxagerequesttemp)){ + maxagerequest = "-1"; + }else if("0".equals(maxagerequesttemp)){ + maxagerequest = "0"; + }else{ + maxagerequest = maxagerequesttemp.substring(0,2); + } + if("0".equals(minagerequest)){ + agerqTv.setText("不限"); + }else if("-1".equals(minagerequest)&&"-1".equals(maxagerequest)){ + agerqTv.setText("不限"); + }else if("-1".equals(minagerequest)&&!"-1".equals(maxagerequest)){ + agerqTv.setText(maxagerequest+"岁以下"); + }else if(!"-1".equals(minagerequest)&&"-1".equals(maxagerequest)){ + agerqTv.setText(minagerequest+"岁以上"); + }else if(!"-1".equals(minagerequest)&&!"-1".equals(maxagerequest)&&!minagerequest.equals(maxagerequest)){ + agerqTv.setText(minagerequest+"~"+maxagerequest+"岁"); + }else if(!"0".equals(minagerequest)&&!"0".equals(maxagerequest)&&!"-1".equals(minagerequest)&&!"-1".equals(maxagerequest)&&minagerequest.equals(maxagerequest)){ + agerqTv.setText(minagerequest+"岁"); + } + } + + /** + * 设置身高要求 + * @param minheightrequesttemp 最小身高要求 + * @param maxheightrequesttemp 最大身高要求 + * @param heightTv 需要填充的UI + */ + private void setHeightrq2View(String minheightrequesttemp, String maxheightrequesttemp,final TextView heightTv) { + if(TextUtils.isEmpty(minheightrequesttemp)){//如果这个是null,后面会报一系列空指针异常 + heightTv.setText("不限"); + return; + } + if("0".equals(minheightrequesttemp)){ + minheightrequest = "0"; + }else if("不限".equals(minheightrequesttemp)||"-1".equals(minheightrequesttemp)){ + minheightrequest = "-1"; + }else{ + minheightrequest = minheightrequesttemp.substring(0,3); + } + if("0".equals(maxheightrequesttemp)){ + maxheightrequest = "0"; + } else if("不限".equals(maxheightrequesttemp)||"-1".equals(maxheightrequesttemp)){ + maxheightrequest = "-1"; + }else{ + maxheightrequest = maxheightrequesttemp.substring(0,3); + } + if("0".equals(minheightrequest)){ + heightTv.setText("不限"); + }else if("-1".equals(minheightrequest)&&"-1".equals(maxheightrequest)){ + heightTv.setText("不限"); + }else if("-1".equals(minheightrequest)&&!"-1".equals(maxheightrequest)){ + heightTv.setText(maxheightrequest+"cm以下"); + }else if(!"-1".equals(minheightrequest)&&"-1".equals(maxheightrequest)){ + heightTv.setText(minheightrequest+"cm以上"); + }else if(!"-1".equals(minheightrequest)&&!"-1".equals(maxheightrequest)&&!minheightrequest.equals(maxheightrequest)){ + heightTv.setText(minheightrequest+"~"+maxheightrequest+"cm"); + }else if(!"-1".equals(minheightrequest)&&!"-1".equals(maxheightrequest)&&!"0".equals(minheightrequest)&&!"0".equals(maxheightrequest)&&minheightrequest.equals(maxheightrequest)){ + heightTv.setText(minheightrequest+"cm"); + } + } + + private void initEvents() { + hlistview.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + if(pictureList.size() == 1){ + Intent intent = new Intent(OtherPersonCenterActivity.this, PreviewAvatarActivity.class); + intent.putExtra("imageUrl",pictureList.get(0).getPicUrl()); + startActivity(intent); + }else{ + Intent intent = new Intent(OtherPersonCenterActivity.this, PreviewImgActivity.class); + intent.putExtra("currentItem",String.valueOf(position)); + String str[] = new String[pictureList.size()]; + for(int i=0; i suserList; + + /** + * 适配器 + */ + + private LikeUserAdapter signUserAdapter; + private OkHttpUtil okHttpUtil = OkHttpUtil.getInstance(); + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_likeuser_list); + list_signusers = (ListView) findViewById(R.id.lv_likeuser); + init(); + initView(); + initEvent(); + reqUserList(); + } + + //初始化数据 + private void init(){ + Intent intent = getIntent(); + actid = intent.getStringExtra("actid"); + } + + //初始化UI控件 + private void initView() { + tvBack = (ImageView)findViewById(R.id.img_leftBtn); + tvTitle = (TextView)findViewById(R.id.tvTitle); + tvTitle.setText("报名用户"); + tvBack.setVisibility(View.VISIBLE); + + signUserAdapter = new LikeUserAdapter(this); + list_signusers.setAdapter(signUserAdapter); + } + + + private void initEvent() { + tvBack.setOnClickListener(this); + list_signusers.setOnItemClickListener(new cyOnItemClickListener()); + } + + @Override + public void onClick(View view) { + switch (view.getId()){ + case R.id.img_leftBtn: + finish(); + break; + default: + break; + } + } + + + private void reqUserList() { + String signUsersUrl = Constant.COMMON_URL + Interface.PACT_USERLIST; + JSONObject obj = new JSONObject(); + obj.put("actid",actid); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + Log.d(TAG, "getData: "+param); + okHttpUtil.sendJsonStrByPostAsync(PactSignUsersActivity.this,true,signUsersUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if("1".equals(rsCode)){ + String jsonString = jsonObject.getString("users"); + suserList = JSON.parseArray(jsonString,LikeUserEntity.class); + tvTitle.setText("报名用户("+suserList.size()+")"); + Log.d(TAG, "onResponse: "+suserList); + runOnUiThread(new Runnable() { + @Override + public void run() { + signUserAdapter.updateListView(suserList); + } + }); + }else{ + JqStrUtil.showToast(PactSignUsersActivity.this,explanation); + } + + } + },null); + } + + + class cyOnItemClickListener implements AdapterView.OnItemClickListener { + public void onItemClick(AdapterView parent, View view, int position, long id) { + Intent intent = new Intent(PactSignUsersActivity.this,OtherPersonCenterActivity.class); + intent.putExtra("otherid",suserList.get(position).getUserid()); + startActivity(intent); + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/PayForRedbeanActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/PayForRedbeanActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..71ea0c938c174b417c8ee7e7b404877b0baf8ce1 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/PayForRedbeanActivity.java @@ -0,0 +1,418 @@ +package com.jiuqi.elove.activity; + +import android.app.Activity; +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.support.v7.widget.GridLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.text.TextUtils; +import android.view.View; +import android.view.Window; +import android.widget.ImageView; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.alipay.sdk.app.PayTask; +import com.jiuqi.elove.R; +import com.jiuqi.elove.adapter.RechargeAdapter; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.entity.RechargeModel; +import com.jiuqi.elove.entity.WeChatPaySignModel; +import com.jiuqi.elove.util.AliPayResult; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; +import com.jiuqi.elove.widget.GridSpacingItemDecoration; +import com.tencent.mm.sdk.modelpay.PayReq; +import com.tencent.mm.sdk.openapi.IWXAPI; +import com.tencent.mm.sdk.openapi.WXAPIFactory; + +import java.util.List; +import java.util.Map; + +public class PayForRedbeanActivity extends Activity implements View.OnClickListener{ + + private static final String TAG = "PayForRedbeanActivity"; + /** + * 控件 + */ + private TextView tvTitle; + private ImageView imgLeft; + private ImageView iv_radio_ali; + private ImageView iv_radio_wechat; + private TextView tv_exchange; + private TextView tv_pay; + private TextView tv_remainder; + private RelativeLayout rl_pay_redbean; + private RelativeLayout rl_wechatpay; + private RecyclerView rv_recharge_view; + private RecyclerView.LayoutManager mgr; + public static PayForRedbeanActivity instance; + /** + * 数据保存变量 + */ + private final String ALI_PAY = "alipay"; + private final String WECHAT_PAY = "wechatpay"; + private String payType = ALI_PAY;//默认支付宝支付 + private String userid; + private int money;//提交金额 + private String walletnum;//订单号 + private List rechargelist;//充值可选项 + private RechargeAdapter adapter; + private String wealtype; + /*支付宝支付结果码*/ + private static final String PAY_OK = "9000";// 支付成功 + private static final String PAY_WAIT_CONFIRM = "8000";// 交易待确认 + private static final String PAY_NET_ERR = "6002";// 网络出错 + private static final String PAY_CANCLE = "6001";// 交易取消 + private static final String PAY_FAILED = "4000";// 交易失败 + + private static final int SDK_PAY_FLAG = 1; + + /** + * 工具 + */ + private final OkHttpUtil okHttpUtil = OkHttpUtil.getInstance(); + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + requestWindowFeature(Window.FEATURE_NO_TITLE); + setContentView(R.layout.activity_pay_for_redbean); + instance = this; + initView(); + getDataFromSp(); + setDataIntoView(); + setEvents(); + } + + private void getDataFromSp() { + userid = SpUtils.getString(Constant.USER_ID); + } + + private void setEvents() { + imgLeft.setOnClickListener(this); + tv_pay.setOnClickListener(this); +// pay_protocol.setOnClickListener(this); + /** + * 选择微信支付 + */ + rl_wechatpay.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if(WECHAT_PAY.equals(payType)){ + + }else{ + iv_radio_ali.setImageResource(R.drawable.img_radio_unchecked); + iv_radio_wechat.setImageResource(R.drawable.img_radio_checked); + payType = WECHAT_PAY; + } + } + }); + /** + * 选择支付宝支付 + */ + rl_pay_redbean.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if(ALI_PAY.equals(payType)){ + + }else{ + iv_radio_ali.setImageResource(R.drawable.img_radio_checked); + iv_radio_wechat.setImageResource(R.drawable.img_radio_unchecked); + payType = ALI_PAY; + } + } + }); + } + + private void initView() { + tvTitle = (TextView) findViewById(R.id.tvTitle); + tvTitle.setText("选择充值金额"); + imgLeft = (ImageView) findViewById(R.id.img_leftBtn); + iv_radio_ali = (ImageView) findViewById(R.id.iv_radio_ali); + iv_radio_wechat = (ImageView) findViewById(R.id.iv_radio_wechat); + imgLeft.setVisibility(View.VISIBLE); + tv_exchange = (TextView) findViewById(R.id.tv_exchange); + tv_pay = (TextView) findViewById(R.id.tv_pay); + tv_remainder = (TextView) findViewById(R.id.tv_remainder); + rl_pay_redbean = (RelativeLayout) findViewById(R.id.rl_pay_redbean); + rl_wechatpay = (RelativeLayout) findViewById(R.id.rl_wechatpay); + rv_recharge_view = (RecyclerView) findViewById(R.id.rv_recharge_view); + } + + private void setDataIntoView() { + final String rechargelistUrl = Constant.COMMON_URL + Interface.RECHARGE_LIST; + JSONObject obj = new JSONObject(); + obj.put("userid",userid); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(PayForRedbeanActivity.this, true, rechargelistUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { +// Log.d(TAG, "onResponse: "+jsonObject); + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + String amountlistStr = jsonObject.getString("amountlist"); + String remainder = jsonObject.getString("remainder"); + tv_remainder.setText(remainder==null?"元宝余额:0":"元宝余额:"+remainder); + if("1".equals(rsCode)){ + rechargelist = JSON.parseArray(amountlistStr,RechargeModel.class); + if(rechargelist!=null&&rechargelist.size()>0){ + setFirstCheckInList(); + mgr=new GridLayoutManager(PayForRedbeanActivity.this,3); + mgr.setAutoMeasureEnabled(true); + rv_recharge_view.setLayoutManager(mgr); + rv_recharge_view.addItemDecoration(new GridSpacingItemDecoration(3, 18, false)); + adapter = new RechargeAdapter(PayForRedbeanActivity.this,rechargelist); + rv_recharge_view.setAdapter(adapter); +// tv_exchange.setText(rechargelist.get(0).getName()); +// money = rechargelist.get(0).getMoney(); + setAdapterClick(); + }else{ + JqStrUtil.showToast(PayForRedbeanActivity.this,"未获取到数据"); + } + }else{ + JqStrUtil.showToast(PayForRedbeanActivity.this,explanation); + } + } + },null); + } + + private void setFirstCheckInList(){ + RechargeModel model = rechargelist.get(0); + money = model.getMoney(); + tv_exchange.setText(model.getName()); + model.setIscheck(true); + rechargelist.remove(0); + rechargelist.add(0,model); + } + + private void setAdapterClick() { + adapter.setOnItemClickListener(new RechargeAdapter.OnRecyclerViewItemClickListener() { + @Override + public void onItemClick(View view, int position) { + RechargeModel model = rechargelist.get(position); + money = model.getMoney(); + wealtype = model.getWealtype(); + tv_exchange.setText(model.getName().trim()); + view.setBackground(getResources().getDrawable(R.drawable.item_recharge_bg_select)); + model.setIscheck(true); + for(int i=0;i result = payTask.payV2(signAlipay, true); + Message message = mHandler.obtainMessage(); + message.what = SDK_PAY_FLAG; + message.obj = result; + mHandler.sendMessage(message); + } + }.start(); + }else{ + JqStrUtil.showToast(PayForRedbeanActivity.this,explanation); + } + } + },null); + } + + /** + * app客户端获取支付状态码,app内做处理(在此只是简单得进行了提示,成功格外结束了此页面) + */ + private Handler mHandler = new Handler() { + public void handleMessage(Message msg) { + switch (msg.what) { + case SDK_PAY_FLAG: { + AliPayResult payResult = new AliPayResult((Map) msg.obj); + /** + 对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。 + */ + String resultInfo = payResult.getResult();// 同步返回需要验证的信息 + String resultStatus = payResult.getResultStatus(); + // 判断resultStatus 为9000则代表支付成功 + if (TextUtils.equals(resultStatus, PAY_OK)) { + // 该笔订单是否真实支付成功,需要依赖服务端的异步通知。 + JqStrUtil.showToast(PayForRedbeanActivity.this,getResources().getString(R.string.pay_success)); + if(RedbeanListActivity.instance!=null){ + RedbeanListActivity.instance.refresh(); + }else{ + Intent intent = new Intent(PayForRedbeanActivity.this,RedbeanListActivity.class); + startActivity(intent); + } + if(MyRedbeanActivity.instance!=null){ + MyRedbeanActivity.instance.refresh(); + } + finish();//成功则结束该页面 + } else if (TextUtils.equals(resultStatus, PAY_CANCLE)) { + // 该笔订单是否真实支付成功,需要依赖服务端的异步通知。 + JqStrUtil.showToast(PayForRedbeanActivity.this,getResources().getString(R.string.pay_cancel)); + } else if (TextUtils.equals(resultStatus, PAY_FAILED)) { + // 该笔订单是否真实支付成功,需要依赖服务端的异步通知。 + JqStrUtil.showToast(PayForRedbeanActivity.this,getResources().getString(R.string.pay_fail)); + } else if(TextUtils.equals(resultStatus, PAY_NET_ERR)){ + // 该笔订单真实的支付结果,需要依赖服务端的异步通知。 + JqStrUtil.showToast(PayForRedbeanActivity.this,getResources().getString(R.string.pay_neterror)); + }else if(TextUtils.equals(resultStatus, PAY_WAIT_CONFIRM)){ + JqStrUtil.showToast(PayForRedbeanActivity.this,getResources().getString(R.string.pay_wait_confirm)); + } + break; + } + default: + break; + } + } + }; + + @Override + protected void onDestroy() { + super.onDestroy(); + if(instance!=null){ + instance = null; + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/PlayCircleVideoActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/PlayCircleVideoActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..3cc024199eb289cee061f13c442dd83f871e8012 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/PlayCircleVideoActivity.java @@ -0,0 +1,123 @@ +package com.jiuqi.elove.activity; + +import android.app.Activity; +import android.os.Bundle; +import android.util.DisplayMetrics; +import android.view.KeyEvent; +import android.widget.ImageView; +import android.widget.RelativeLayout; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.JqBaseActivity; +import com.jiuqi.elove.widget.videoplay.SurfaceVideoViewCreator; + +public class PlayCircleVideoActivity extends JqBaseActivity { + + /** + * 数据 + */ + private String videoPath; + private String picPath; + private int width; + private int height; + /** + * 播放控件 + */ + private SurfaceVideoViewCreator surfaceVideoViewCreator; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_play_circle_video); + getDataFromPre(); + getMyLayout(); + initAndPlayVideo(); + } + + /** + * 获取视频网络地址 + */ + private void getDataFromPre() { + videoPath = getIntent().getStringExtra("path"); + picPath = getIntent().getStringExtra("img"); + } + + /** + * 获取视频的宽高 + */ + private void getMyLayout() { + DisplayMetrics dm = getResources().getDisplayMetrics(); + width = dm.widthPixels; + height = dm.widthPixels; + } + + private void initAndPlayVideo() { + surfaceVideoViewCreator = new SurfaceVideoViewCreator(this, (RelativeLayout) findViewById(R.id.rl_play_video)) { + @Override + protected Activity getActivity() { + return PlayCircleVideoActivity.this; + } + + @Override + protected boolean setAutoPlay() { + return true; + } + + @Override + protected int getSurfaceWidth() { + return width; + } + + @Override + protected int geturfaceHeight() { + return height; + } + + @Override + protected void setThumbImage(ImageView thumbImageView) { + Glide.with(PlayCircleVideoActivity.this) + .load(picPath) + .centerCrop() + .diskCacheStrategy(DiskCacheStrategy.ALL) + .placeholder(R.drawable.all_darkbackground) + .dontAnimate() + .into(thumbImageView); + } + + @Override + protected String getSecondVideoCachePath() { + return null; + } + + @Override + protected String getVideoPath() { + return videoPath; + } + }; + } + + @Override + protected void onResume() { + surfaceVideoViewCreator.onResume(); + super.onResume(); + } + + @Override + protected void onPause() { + surfaceVideoViewCreator.onPause(); + super.onPause(); + } + + @Override + protected void onDestroy() { + surfaceVideoViewCreator.onDestroy(); + super.onDestroy(); + } + + @Override + public boolean dispatchKeyEvent(KeyEvent event) { + surfaceVideoViewCreator.onKeyEvent(event); + return super.dispatchKeyEvent(event); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/PlayVideoActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/PlayVideoActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..2b46a66f5139fb5fcaa606867bdec24c68c1c98e --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/PlayVideoActivity.java @@ -0,0 +1,122 @@ +package com.jiuqi.elove.activity; + +import android.annotation.TargetApi; +import android.app.Activity; +import android.media.AudioManager; +import android.media.MediaPlayer; +import android.os.Build; +import android.os.Bundle; +import android.util.Log; +import android.view.SurfaceHolder; +import android.view.SurfaceView; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.widget.MetaballView; + +import java.io.IOException; + + +/** + * Created by FanWenXia on 2016/9/18. + */ +@TargetApi(Build.VERSION_CODES.HONEYCOMB) +public class PlayVideoActivity extends Activity implements SurfaceHolder.Callback{ + + /** Called when the activity is first created. */ + MediaPlayer player; + SurfaceView surface; + SurfaceHolder surfaceHolder; + private String videoPath; + private MetaballView metaballView; + private int sv_width; + private int sv_height; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + requestWindowFeature(Window.FEATURE_NO_TITLE); + setContentView(R.layout.activity_play_video); + videoPath = getIntent().getStringExtra("path"); + Log.d("PlayVideoActivity :","videoPath "+videoPath); + surface=(SurfaceView)findViewById(R.id.surface); + metaballView = (MetaballView) this.findViewById(R.id.metaball); + metaballView.setPaintMode(1); + WindowManager wm = this.getWindowManager(); + sv_width = wm.getDefaultDisplay().getWidth(); + sv_height = wm.getDefaultDisplay().getWidth(); + ViewGroup.LayoutParams lp = surface.getLayoutParams(); + lp.height = sv_height; + lp.width = sv_width; + surface.setLayoutParams(lp); + surfaceHolder=surface.getHolder(); //SurfaceHolder是SurfaceView的控制接口 + surfaceHolder.addCallback(this); //因为这个类实现了SurfaceHolder.Callback接口,所以回调参数直接this + surfaceHolder.setFixedSize(sv_height,sv_width);//显示的分辨率,不设置为视频默认 + surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);//Surface类型 + surface.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + + } + @Override + public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { + } + + @Override + public void surfaceCreated(SurfaceHolder arg0) { + //必须在surface创建后才能初始化MediaPlayer,否则不会显示图像 + player=new MediaPlayer(); + player.setAudioStreamType(AudioManager.STREAM_MUSIC); + player.setDisplay(surfaceHolder); + //设置显示视频显示在SurfaceView上 + try { + player.setDataSource(videoPath); + player.prepare(); + player.start(); + } catch (IOException e) { + e.printStackTrace(); + } + player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { + + @Override + + public void onCompletion(MediaPlayer mp) { + mp.start(); + } + }); + player.setOnPreparedListener(new MediaPlayer.OnPreparedListener(){ + @Override + public void onPrepared(MediaPlayer mp) { + metaballView.setVisibility(View.GONE); + } + + }); + } + + @Override + public void surfaceDestroyed(SurfaceHolder arg0) { + // TODO Auto-generated method stub + + } + + + @Override + protected void onDestroy() { + // TODO Auto-generated method stub + super.onDestroy(); + if(player.isPlaying()){ + player.stop(); + } + player.release(); + //Activity销毁时停止播放,释放资源。不做这个操作,即使退出还是能听到视频播放的声音 + } +} + + + diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/PreviewAvatarActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/PreviewAvatarActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..d1b732cc59832fdc569048049afbd6c65e345d06 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/PreviewAvatarActivity.java @@ -0,0 +1,48 @@ +package com.jiuqi.elove.activity; + +import android.app.Activity; +import android.content.Intent; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.view.Window; +import android.widget.ImageView; +import android.widget.LinearLayout; + +import com.bumptech.glide.Glide; +import com.jiuqi.elove.R; + +/** + * Created by dl on 2016/8/22 + */ +public class PreviewAvatarActivity extends Activity { + + private LinearLayout vPager; + private ImageView imageView; + private String avatar; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + requestWindowFeature(Window.FEATURE_NO_TITLE); + setContentView(R.layout.activity_avatar_preview); + imageView = (ImageView) findViewById(R.id.large_image); + vPager = (LinearLayout) findViewById(R.id.vPager); + vPager.setOnClickListener(new View.OnClickListener() { + + @Override + public void onClick(View v) { + finish(); + } + }); + Intent intent = getIntent(); + avatar = intent.getStringExtra("imageUrl"); + Log.d("avatar: ",avatar); +// if(!JqStrUtil.isEmpty(avatar)){ + Glide.with(PreviewAvatarActivity.this)//比imgloader不知道要好多少倍,内存管理上很好,不会oom,并且流畅了好多 + .load(avatar).placeholder(R.drawable.img_other_default).dontAnimate().into(imageView); +// }else{ +// Glide.with(PreviewAvatarActivity.this).load(R.drawable.queshengdatu).into(imageView); +// } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/PreviewImgActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/PreviewImgActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..ea9b76c4555ec1ac3959268e9c315128fdb8c50a --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/PreviewImgActivity.java @@ -0,0 +1,162 @@ +package com.jiuqi.elove.activity; + +import android.app.Activity; +import android.content.Intent; +import android.os.Bundle; +import android.support.v4.view.PagerAdapter; +import android.support.v4.view.ViewPager; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.widget.ImageView; + +import com.bumptech.glide.Glide; +import com.jiuqi.elove.R; + +import android.view.ViewGroup.LayoutParams; +import android.support.v4.view.ViewPager.OnPageChangeListener; +import android.widget.LinearLayout; + +import java.util.ArrayList; + +/** + * Created by FanWenXia on 2016/8/19 + */ +public class PreviewImgActivity extends Activity { + + private int currentItem; + private ViewPager viewPager; + private ArrayList pageview; + private LinearLayout vPager; + + /** + * 图片资源URL + */ + private String[] imgUrlArray; + + private ImageView imageView; + private ImageView[] imageViews; + //包裹点点的LinearLayout + private ViewGroup group; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + //设置无标题栏 + requestWindowFeature(Window.FEATURE_NO_TITLE); + + setContentView(R.layout.activity_img_preview); + + viewPager = (ViewPager) findViewById(R.id.viewPager); + Intent intent =getIntent(); + currentItem = Integer.valueOf(intent.getStringExtra("currentItem")); + Bundle bundle = intent.getExtras(); + imgUrlArray = bundle.getStringArray("imgUrls"); + + pageview =new ArrayList(); + for (int i = 0; i < imgUrlArray.length; i++) { + //查找布局文件用LayoutInflater.inflate + View view = LayoutInflater.from(PreviewImgActivity.this).inflate(R.layout.activity_avatar_preview, null); + vPager = (LinearLayout) view.findViewById(R.id.vPager); + vPager.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + ImageView imageView = (ImageView) view.findViewById(R.id.large_image); + Glide.with(PreviewImgActivity.this)//比imgloader不知道要好多少倍,内存管理上很好,不会oom,并且流畅了好多 + .load(imgUrlArray[i]).placeholder(R.drawable.img_hx_avatar).dontAnimate().into(imageView); + //将view装入数组 + pageview.add(view); + } + + group = (ViewGroup)findViewById(R.id.viewGroup); + + //有多少张图就有多少个点点 + imageViews = new ImageView[pageview.size()]; + for(int i =0;i permissionList = new ArrayList<>(); + if(ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)!= PackageManager.PERMISSION_GRANTED){ + permissionList.add(Manifest.permission.CAMERA); + } + if(ContextCompat.checkSelfPermission(this,Manifest.permission.READ_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED){ + permissionList.add(Manifest.permission.READ_EXTERNAL_STORAGE); + } + if(ContextCompat.checkSelfPermission(this,Manifest.permission.READ_PHONE_STATE)!=PackageManager.PERMISSION_GRANTED){ + permissionList.add(Manifest.permission.READ_PHONE_STATE); + } + if(!permissionList.isEmpty()){ + String[] permissions = permissionList.toArray(new String[permissionList.size()]); + ActivityCompat.requestPermissions(this,permissions,1); + }else{ + startVideo(); + } + break; + case R.id.iv_preview: + // 显示播放页面 + Log.d(TAG, "onClickPlayVideo: path "+currentPath); + if (!JqStrUtil.isEmpty(currentPath)) { + Intent playIntent = new Intent(PreviewVideoActivity.this, PlayVideoActivity.class); + playIntent.putExtra("path", currentPath); + startActivity(playIntent); + } + break; + default: + break; + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + switch (requestCode){ + case 1: + if(grantResults.length>0){ + for (int result : grantResults){ + if(result!= PackageManager.PERMISSION_GRANTED){ + return; + }else{ + startVideo(); + } + } + }else{ + return; + } + break; + default: + break; + } + } + + private void startVideo() { + QupaiService qupaiService = QupaiManager + .getQupaiService(this); + //引导,只显示一次,这里用SharedPreferences记录 + final AppGlobalSetting sp = new AppGlobalSetting(getApplicationContext()); + Boolean isGuideShow = sp.getBooleanGlobalItem( + Constant.PREF_VIDEO_EXIST_USER, true); + + qupaiService.showRecordPage(PreviewVideoActivity.this, Constant.RECORDE_SHOW, isGuideShow); + + sp.saveGlobalConfigItem( + Constant.PREF_VIDEO_EXIST_USER, false); + } + + String [] thum; + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + switch (requestCode) { + case 200: + if(resultCode == RESULT_OK) { +// // 成功 +// tv_tips.setText(getString(R.string.tips_video_new)); +// currentPath = data.getStringExtra("path"); +// Log.d(TAG, "onActivityResult: path"+currentPath); +// editor.putString("videoPath",currentPath); +// editor.commit(); +// JqStrUtil.showToast(PreviewVideoActivity.this,"存储路径为:"+currentPath); +// getPreVideoView(currentPath); + // 成功 + tv_tips.setText(getString(R.string.tips_video_new)); + VideoRecordResult result =new VideoRecordResult(data); + //得到视频地址,和缩略图地址的数组,返回十张缩略图 + currentPath = result.getPath(); + thum = result.getThumbnail(); + result.getDuration(); + Log.d(TAG,"视频路径:" + currentPath + "图片路径:" + thum[0]); + getPreVideoView(currentPath,true); + isNewVideo = true; + } else { + // 失败 + JqStrUtil.showToast(PreviewVideoActivity.this,"已放弃拍摄"); + } + break; + } + } + private void showActionSheet() { + setTheme(R.style.ActionSheetStyleiOS7); + ActionSheet.createBuilder(this, getSupportFragmentManager()) + .setCancelButtonTitle("取消") + .setOtherButtonTitles("重拍", "上传") + .setCancelableOnTouchOutside(true).setListener(this).show(); + } + @Override + public void onDismiss(ActionSheet actionSheet, boolean isCancel) { + //空实现 + } + @Override + public void onOtherButtonClick(ActionSheet actionSheet, int index) { + switch (index){ + case 0://重拍 + startVideo(); + break; + case 1://上传 + if(isNewVideo) { + //对话框 + CustomDialog.Builder builder = new CustomDialog.Builder(PreviewVideoActivity.this); + builder.setTitle(R.string.video_dialog_title); + builder.setMessage(R.string.video_dialog_message); + builder.setPositiveButton(R.string.confirm, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + uploadPerPicMethod(); + dialog.dismiss(); + } + }); + builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }); + builder.create().show(); + }else{ + JqStrUtil.showToast(PreviewVideoActivity.this,"拍个新视频再来上传吧!"); + } + break; + default: + break; + } + } + + /** + * 上传视频的方法入口 + */ + private void uploadPerPicMethod() { + File file = new File(currentPath); + JSONObject obj = new JSONObject(); + try { + bytes = inputStreamToBytes(file); + } catch (IOException e) { + e.printStackTrace(); + } + try { + md5 = BinaryUtil.calculateBase64Md5(currentPath); + } catch (IOException e) { + e.printStackTrace(); + } + obj.put("md5",md5); + obj.put("size",size); + obj.put("action",Constant.PUT_VIDEO_ACTION); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(PreviewVideoActivity.this,false,aliUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + key = jsonObject.getString("key");//调用接口时的filePath + if ("1".equals(rsCode)) { + final String putaliUrl = jsonObject.getString("url");//put阿里云的路径 + new Runnable(){ + @Override + public void run() { + try { + put(MediaType.parse(""), putaliUrl, bytes);//上传到阿里云地址下 + } catch (IOException e) { + e.printStackTrace(); + } + } + }.run(); + + }else if("0".equals(rsCode)){//文件已存在,无需上传到阿里云服务器 + uploadMyServer();//调用服务器端接口,来实现 + } + } + },null); + } + public byte[] inputStreamToBytes(File file) throws IOException { + FileInputStream fileInputStream = new FileInputStream(file); + size = fileInputStream.available(); + byte[] temp = new byte[2048]; + ByteArrayOutputStream swapStream = new ByteArrayOutputStream(); + int rc = 0; + while((rc = fileInputStream.read(temp,0,2048))>0){ + swapStream.write(temp,0,rc); + } + fileInputStream.close(); + + return swapStream.toByteArray(); + } + + /** + * 将保存视频的阿里云地址上传至服务器 + */ + private void uploadMyServer() { + String videoUrl = Constant.COMMON_URL + Interface.AUTHENTICATE_VIDEO; + JSONObject obj = new JSONObject(); + obj.put("userID",userId); + obj.put("filePath",key); + obj.put("version",Constant.VERSION); + String param = JSON.toJSONString(obj); + okHttpUtil.sendJsonStrByPostAsync(PreviewVideoActivity.this,false,videoUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + if("1".equals(rsCode)){ + isNewVideo = false;//防止同一个视频上传两次,而出现无视频情况 + tv_tips.setText(getString(R.string.tips_video_ing)); + JqStrUtil.showToast(PreviewVideoActivity.this,"上传成功,请耐心等待审核结果"); + }else{ + JqStrUtil.showToast(PreviewVideoActivity.this,"上传失败"); + } + } + },null); + + } + private Dialog dialog; + /** + * put请求上传视频到阿里云相应地址下 + */ + public void put(MediaType mediaType, String uploadUrl, byte[] bytes) throws IOException { + if (dialog == null) { + dialog = LoadingDialog.createLoadingDialog(PreviewVideoActivity.this, "正在上传..."); + dialog.show(); + } + OkHttpClient client = new OkHttpClient.Builder().retryOnConnectionFailure(true).build(); + RequestBody body = RequestBody.create(mediaType, bytes); + Request request = new Request.Builder().url(uploadUrl).put(body).build(); + client.newCall(request).enqueue(new Callback() { + @Override + public void onFailure(Call call, IOException e) { + if (dialog != null) { + dialog.dismiss(); + dialog = null; + } + JqStrUtil.showToast(PreviewVideoActivity.this,"访问服务器失败,请检查您的网络"); + } + @Override + public void onResponse(Call call, Response response) throws IOException { + runOnUiThread(new Runnable() { + @Override + public void run() { + if (dialog != null) { + dialog.dismiss(); + dialog = null; + } + uploadMyServer();//调用服务器端接口,来实现 + } + }); + } + }); + } + + private void downloadVideo(final String url, final String savePAth) { + + new Thread() { + public void run() { + try { + down_file(url, savePAth); + } catch (ClientProtocolException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + }.start(); + } + + public void down_file(String url, String path) throws IOException { + + URL myURL = new URL(url); + URLConnection conn = myURL.openConnection(); + conn.connect(); + InputStream is = conn.getInputStream(); + fileSize = conn.getContentLength(); + if (fileSize <= 0) + throw new RuntimeException("can not know the file`s size"); + if (is == null) + throw new RuntimeException("stream is null"); + FileOutputStream fos = new FileOutputStream(path); + byte buf[] = new byte[1024]; + downLoadFileSize = 0; + handler.sendEmptyMessage(0); + do { + // 循环读取 + int numread = is.read(buf); + if (numread == -1) { + break; + } + fos.write(buf, 0, numread); + downLoadFileSize += numread; + handler.sendEmptyMessage(1); + } while (true); + handler.sendEmptyMessage(2); + currentPath = path; + try { + is.close(); + } catch (Exception ex) { + Log.e(TAG, "error:" + ex.getMessage(), ex); + } + } + + private Handler handler = new Handler() { + @Override + public void handleMessage(Message msg) { + if (!Thread.currentThread().isInterrupted()) { + switch (msg.what) { + case 0: + pb_progress.setMax(fileSize); + tv_progress.setText("0%"); + break; + case 1: + java.text.DecimalFormat df =new java.text.DecimalFormat("#.00"); + double cachepercent = downLoadFileSize * 100.00 / fileSize * 1.0; + pb_progress.setProgress(downLoadFileSize); + tv_progress.setText(df.format(cachepercent)+"%"); + break; + case 2: + getPreVideoView(currentPath,true); + break; + case -1: + String error = msg.getData().getString("error"); + JqStrUtil.showToast(PreviewVideoActivity.this,error); + break; + } + } + super.handleMessage(msg); + } + }; +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/PutAvatarActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/PutAvatarActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..9b60b4fadf4b2472e6f7914432a6d4593a09c8db --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/PutAvatarActivity.java @@ -0,0 +1,304 @@ +package com.jiuqi.elove.activity; + +import android.Manifest; +import android.app.Activity; +import android.content.ContentResolver; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.pm.PackageManager; +import android.database.Cursor; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.net.Uri; +import android.os.Bundle; +import android.os.Environment; +import android.provider.MediaStore; +import android.support.annotation.NonNull; +import android.support.v4.app.ActivityCompat; +import android.support.v4.content.ContextCompat; +import android.support.v4.graphics.drawable.RoundedBitmapDrawable; +import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory; +import android.view.View; +import android.view.Window; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.TextView; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.target.BitmapImageViewTarget; +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.util.CommonUtil; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +public class PutAvatarActivity extends Activity implements View.OnClickListener{ + + /** + * 控件 + */ + private Button btn_take_photo; + private Button btn_album; + private ImageView iv_avatar; + private TextView tv_close; + /** + * 数据 + */ + private String temPhonename; + private Bitmap photo; + private String userId; + + /** + * 常量 + */ + private static final int ALBUM = 1; + private static final int TAKE_PHOTO = 2; + private static final String PHOTO_PATH = "/elove/";//调用系统相机拍照后照片保存路径 + private static final int PHOTO_REQUEST_TAKEPHOTO = 0x01;// 拍照 + private static final int PHOTO_REQUEST_GALLERY = 0x02;// 从相册中选择 + /** + * 工具 + */ + private int flag; + private OkHttpUtil okHttpUtil = OkHttpUtil.getInstance(); + private SharedPreferences.Editor editor; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + requestWindowFeature(Window.FEATURE_NO_TITLE); + setContentView(R.layout.activity_put_avatar); + getDataFromSp(); + initView(); + setEvents(); + } + + private void getDataFromSp() { + SharedPreferences sp = getSharedPreferences("elove",MODE_PRIVATE); + userId = sp.getString("userid",""); + editor = sp.edit(); + editor.apply(); + } + + private void setEvents() { + btn_take_photo.setOnClickListener(this); + btn_album.setOnClickListener(this); + tv_close.setOnClickListener(this); + } + + private void initView() { + btn_take_photo = (Button) findViewById(R.id.btn_take_photo); + btn_album = (Button) findViewById(R.id.btn_album); + iv_avatar = (ImageView) findViewById(R.id.iv_avatar); + tv_close = (TextView) findViewById(R.id.tv_close); + Glide.with(getApplicationContext()).load(R.mipmap.app_logo).asBitmap().centerCrop().into(new BitmapImageViewTarget(iv_avatar) { + @Override + protected void setResource(Bitmap resource) { + RoundedBitmapDrawable circularBitmapDrawable = + RoundedBitmapDrawableFactory.create(getResources(), resource); + circularBitmapDrawable.setCircular(true); + iv_avatar.setImageDrawable(circularBitmapDrawable); + } + }); + } + + @Override + public void onClick(View view) { + switch (view.getId()){ + case R.id.btn_take_photo: + flag = TAKE_PHOTO; + checkPermission(); + break; + case R.id.btn_album: + flag = ALBUM; + checkPermission(); + break; + case R.id.tv_close: + finish(); + break; + default: + break; + } + } + + private void checkPermission(){ + List permissionList = new ArrayList<>(); + if(ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)!= PackageManager.PERMISSION_GRANTED){ + permissionList.add(Manifest.permission.CAMERA); + } + if(ContextCompat.checkSelfPermission(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED){ + permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); + } + if(!permissionList.isEmpty()){ + String[] permissions = permissionList.toArray(new String[permissionList.size()]); + ActivityCompat.requestPermissions(this,permissions,1); + }else{ + if(ALBUM==flag){ + selectPhoto(); + }else{ + takePhoto(); + } + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + switch (requestCode){ + case 1: + if(grantResults.length>0){ + for (int result : grantResults){ + if(result!= PackageManager.PERMISSION_GRANTED){ + return; + }else{ + if(ALBUM==flag){ + selectPhoto(); + }else{ + takePhoto(); + } + } + } + }else{ + return; + } + break; + default: + break; + } + } + + private void takePhoto(){ + Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); +// 下面这句指定调用相机拍照后的照片存储的名称 + temPhonename = System.currentTimeMillis()+".jpg"; +// imgUri = Uri.fromFile(file);//图片保存输出路径uri + intent.putExtra(MediaStore.EXTRA_OUTPUT, + Uri.fromFile(new File(Environment.getExternalStorageDirectory()+PHOTO_PATH,temPhonename))); + startActivityForResult(intent,PHOTO_REQUEST_TAKEPHOTO); + } + + private void selectPhoto(){ + Intent intentPhoto = new Intent(Intent.ACTION_PICK, null); + intentPhoto.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); + startActivityForResult(intentPhoto,PHOTO_REQUEST_GALLERY); + } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (resultCode == Activity.RESULT_OK) { + switch (requestCode) { + case PHOTO_REQUEST_TAKEPHOTO:// 当选择拍照时调用 + Intent intent = new Intent(this, CutPictureAty.class); + intent.putExtra("path", Environment.getExternalStorageDirectory() + PHOTO_PATH + "/" + temPhonename); + startActivityForResult(intent, 0x07); + break; + case PHOTO_REQUEST_GALLERY:// 当选择从本地获取图片时 + if (data != null) { + Uri uri = getPictureUri(data); // 方法调用 + if (!JqStrUtil.isEmpty(uri.getAuthority())) { + Cursor cursor = getContentResolver().query(uri, + new String[]{MediaStore.Images.Media.DATA}, + null, null, null); + if (null == cursor) { + JqStrUtil.showToast(PutAvatarActivity.this, "图片没找到"); + return; + } + cursor.moveToFirst(); + String path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA)); + cursor.close(); + Intent albumIntent = new Intent(PutAvatarActivity.this, CutPictureAty.class); + albumIntent.putExtra("path", path); + startActivityForResult(albumIntent, 0x06); + } + } + break; + case 0x06: + case 0x07: + if (data != null) { + String dirPath = data.getStringExtra("path"); + photo = BitmapFactory.decodeFile(dirPath); + uploadPerPicMethod();//裁剪成功后,重新再最后一次调用接口成功回调中调用刷新页面接口 + } + break; + default: + break; + } + } + } + + /** 解决小米手机上获取图片路径为null的情况 + * @param intent + * @return + */ + public Uri getPictureUri(android.content.Intent intent) { + Uri uri = intent.getData(); + String type = intent.getType(); + if (uri.getScheme().equals("file") && (type.contains("image/"))) { + String path = uri.getEncodedPath(); + if (path != null) { + path = Uri.decode(path); + ContentResolver cr = getContentResolver(); + StringBuffer buff = new StringBuffer(); + buff.append("(").append(MediaStore.Images.ImageColumns.DATA).append("=") + .append("'" + path + "'").append(")"); + Cursor cur = cr.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, + new String[] { MediaStore.Images.ImageColumns._ID }, + buff.toString(), null, null); + int index = 0; + for (cur.moveToFirst(); !cur.isAfterLast(); cur.moveToNext()) { + index = cur.getColumnIndex(MediaStore.Images.ImageColumns._ID); + // set _id value + index = cur.getInt(index); + } + if (index == 0) { + // do nothing + } else { + Uri uri_temp = Uri + .parse("content://media/external/images/media/" + + index); + if (uri_temp != null) { + uri = uri_temp; + } + } + } + } + return uri; + } + + /** + * 上传图片的方法入口 + */ + private void uploadPerPicMethod() { + String urlserver = Constant.COMMON_URL + Interface.UPLOAD_PIC; + String base64file = CommonUtil.bitmap2StrByBase64(photo,80); + JSONObject obj = new JSONObject(); + obj.put("userid",userId); + obj.put("version",Constant.VERSION); + obj.put("file",base64file); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(PutAvatarActivity.this, true, urlserver, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + String message = jsonObject.getString("message"); + JSONObject obj = JSON.parseObject(message); +// String avatar = obj.getString("faceimage"); + if("1".equals(rsCode)){ + editor.putInt(Constant.AVATAR_TYPE,Constant.AVATAR_PASS); + editor.apply(); + finish(); + }else{ + JqStrUtil.showToast(PutAvatarActivity.this,explanation); + } + } + },null); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/PutQuestionActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/PutQuestionActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..fd256d9655f1725f4be8da92fc0e2c1b2d0b9bd2 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/PutQuestionActivity.java @@ -0,0 +1,572 @@ +package com.jiuqi.elove.activity; + +import android.Manifest; +import android.app.Activity; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.pm.PackageManager; +import android.database.Cursor; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.net.Uri; +import android.os.Environment; +import android.provider.MediaStore; +import android.support.annotation.NonNull; +import android.support.v4.app.ActivityCompat; +import android.support.v4.content.ContextCompat; +import android.os.Bundle; +import android.text.Editable; +import android.text.TextWatcher; +import android.util.Log; +import android.view.KeyEvent; +import android.view.View; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.TextView; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.sdk.android.oss.common.utils.BinaryUtil; +import com.baoyz.actionsheet.ActionSheet; +import com.bumptech.glide.Glide; +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.common.JqBaseActivity; +import com.jiuqi.elove.fragment.QaFragment; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.widget.dialog.CustomDialog; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.MediaType; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; + +public class PutQuestionActivity extends JqBaseActivity implements View.OnClickListener,ActionSheet.ActionSheetListener{ + + /*顶部菜单栏按钮*/ + private TextView tvTitle; + private ImageView tvBack; + private EditText et_title; + private EditText et_content; + private TextView btn_commit; + private TextView current_mounts; + private ImageView iv_nameless;//是否选择匿名 + private ImageView iv_addImg; + private ImageView iv_del; + /** + * 数据 + */ + private String problemtitle; + private String problemdetail; + private String userid; + private String publish;//1是发布 0是草稿 + private int num = 2000; + private String titleid = "";//默认为空,如果有则是上次草稿的 + private String problemtitleserver = ""; + private String problemdetailserver = ""; + private String isnameless = "0";//是否匿名 0 匿名 1 不匿名 + private String resolveImg = "";//提问时传的图片,允许为空 + private String resolveImgserver = ""; + private String resolveImgserverOrClear = ""; + + private String dirPath="";//图片的路径 + private Uri imgUri= null; + private static final int PHOTO_REQUEST_GALLERY = 0x02;// 从相册中选择 + private static final int PHOTO_REQUEST_TAKEPHOTO = 0x01;// 拍照 + private SharedPreferences.Editor editor; + + private ByteArrayOutputStream bos; + private String md5 = ""; + private int size = 0 ; + private static final String IMG_PATH = "/elove";//调用系统相机拍摄后图片保存路径 +// private String key = ""; + private boolean isAdd = true; + private Bitmap photo; + + private String aliUrl = Constant.COMMON_URL + Interface.GET_ALIYUN; + /** + * 工具 + */ + private final OkHttpUtil okHttpUtil = OkHttpUtil.getInstance(); + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_put_question); + getDataFromSp(); + initView(); + initPreContent(); + setEvents(); + } + + /** + * 如果有草稿直接填写 + */ + private void initPreContent() { + String draftUrl = Constant.COMMON_URL + Interface.QUESTION_DRAFT; + JSONObject obj = new JSONObject(); + obj.put("userid",userid); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, true, draftUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if("1".equals(rsCode)){ + String result = jsonObject.getString("message"); + JSONObject obj = JSON.parseObject(result); + if(obj.size()==0){ + current_mounts.setText("0/"+num); + }else{ + problemtitleserver = obj.getString("title"); + problemdetailserver = obj.getString("content"); + et_title.setText(obj.getString("title")); + et_content.setText(obj.getString("content")); + titleid = obj.getString("titleid"); + resolveImgserver = obj.getString("resolveImg"); + resolveImgserverOrClear = obj.getString("resolveImg"); + if(!JqStrUtil.isEmpty(resolveImgserver)){ + isAdd = false; + resolveImg = resolveImgserver.substring(resolveImgserver.indexOf("/newDir")); + Glide.with(getApplicationContext()).load(resolveImgserver).dontAnimate().into(iv_addImg); + iv_del.setVisibility(View.VISIBLE); + } + current_mounts.setText(obj.getString("content").trim().length()+"/"+(num-obj.getString("content").trim().length())); + } + + }else{ + JqStrUtil.showToast(PutQuestionActivity.this,explanation); + } + } + },null); + } + + private void getDataFromSp() { + SharedPreferences sp = getSharedPreferences("elove",MODE_PRIVATE); + userid = sp.getString("userid",""); + editor = sp.edit(); + md5 = sp.getString("md5",""); + size = ("").equals(sp.getString("size",""))?0:Integer.valueOf(sp.getString("size","")); + } + + private void initView() { + tvTitle = (TextView) findViewById(R.id.tvTitle); + tvBack = (ImageView) findViewById(R.id.img_leftBtn); + tvTitle.setText("发布问题"); + tvBack.setVisibility(View.VISIBLE); + et_title = (EditText) findViewById(R.id.et_title); + et_content = (EditText) findViewById(R.id.et_content); + btn_commit = (TextView) findViewById(R.id.tvMore); + current_mounts = (TextView) findViewById(R.id.current_mounts); + iv_nameless = (ImageView) findViewById(R.id.iv_nameless); + iv_addImg = (ImageView) findViewById(R.id.iv_addImg); + iv_del = (ImageView) findViewById(R.id.iv_del); + iv_del.setVisibility(View.GONE); + btn_commit.setText("发表"); + btn_commit.setVisibility(View.VISIBLE); + current_mounts.setText("0/"+num); + } + + private void setEvents() { + tvBack.setOnClickListener(this); + btn_commit.setOnClickListener(this); + iv_nameless.setOnClickListener(this); + iv_addImg.setOnClickListener(this); + iv_del.setOnClickListener(this); + et_content.addTextChangedListener(new TextWatcher() { + private CharSequence temp; + private int selectionStart; + private int selectionEnd; + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + temp = charSequence; + } + + @Override + public void afterTextChanged(Editable s) { + int number = num - s.length(); + current_mounts.setText(s.length()+"/" + number); + selectionStart = et_content.getSelectionStart(); + selectionEnd = et_content.getSelectionEnd(); + if (temp.length() > num) { + s.delete(selectionStart - 1, selectionEnd); + int tempSelection = selectionEnd; + et_content.setText(s); + et_content.setSelection(tempSelection);//设置光标在最后 + } + } + }); + } + + @Override + public void onClick(View view) { + switch (view.getId()){ + case R.id.img_leftBtn: + delBackEvent(); + break; + case R.id.tvMore: + problemtitle = et_title.getText().toString().trim(); + problemdetail = et_content.getText().toString().trim(); + if(problemtitle.length()<7){ + JqStrUtil.showToast(this,"请输入不少于7个字的标题"); + }else if(problemdetail.length()<15){ + JqStrUtil.showToast(this,"请输入不少于15字内容"); + }else{ + publish = "1";//1发布 + File f = new File(dirPath); + if(f.exists()){//如果dirpath不为空,则f存在,此次进入有照片,否则看加图片的按钮会将dirpath置空,则dirpath肯定为空 + uploadPerPicMethod();//先将图片上传至阿里云服务器,在成功的回调中去执行发表提问 + }else { + /** + * 如果dirpath为空,并不能说明不存在图片, + * (1)可能是上次上传的图片只是没有改变,这样发表没有问题(因为进入的时候resoveImg已经赋值); + * (2)上次也没有,这样也没有问题,resoveImg也是为空; + * (3)上次有,而这次删除了,在删除的方法中将resoveImg置空了,也没有问题 + */ + commitQuestion(); + } + } + break; + case R.id.iv_nameless: + if("0".equals(isnameless)){//匿名状态下点击按钮 + isnameless = "1";//转变为不匿名 + iv_nameless.setImageResource(R.drawable.switch_off); + }else{//不匿名状态下点击按钮 + isnameless = "0";//转变为匿名 + iv_nameless.setImageResource(R.drawable.switch_on); + } + break; + case R.id.iv_addImg: +// if (isAdd) { + checkPermissionAndShow(); +// }else{ +// iv_addImg.setImageResource(R.drawable.img_plus); +// dirPath = ""; +// resolveImg = ""; +// resolveImgserverOrClear = ""; +// isAdd = true; +// } + break; + case R.id.iv_del: + iv_addImg.setImageResource(R.drawable.icon_add_with_border); + dirPath = ""; + resolveImg = ""; + md5 = ""; + size = 0; + resolveImgserverOrClear = ""; + isAdd = true; + iv_del.setVisibility(View.GONE); + break; + default: + break; + } + } + + /** + * 处理返回键和title上的后退按钮事件 + * 是否保存草稿或者直接返回到上一级 + */ + private void delBackEvent() { + problemtitle = et_title.getText().toString().trim(); + problemdetail = et_content.getText().toString().trim(); + if(JqStrUtil.isEmpty(problemtitle)&&JqStrUtil.isEmpty(problemdetail)&&JqStrUtil.isEmpty(titleid)&&JqStrUtil.isEmpty(dirPath)){ + finish(); + }else if(problemtitleserver.equals(problemtitle)&&problemdetailserver.equals(problemdetail)&&resolveImgserver.equals(resolveImgserverOrClear)&&JqStrUtil.isEmpty(dirPath)){ + finish(); + }else{ + saveDraft();//打开选择是否保存对话框 + } + } + + private void saveDraft() { + CustomDialog.Builder builder = new CustomDialog.Builder(PutQuestionActivity.this); + builder.setTitle("保存草稿"); + builder.setMessage("是否保存草稿?"); + builder.setPositiveButton(R.string.confirm,new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + publish = "0";//0草稿 + File f = new File(dirPath); + if(f.exists()){ + uploadPerPicMethod(); + }else { + commitQuestion(); + } + } + }); + builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + finish(); + } + }); + builder.create().show(); + } + + private void commitQuestion() { + String putUrl = Constant.COMMON_URL + Interface.PUT_QUESTION; + JSONObject obj = new JSONObject(); + obj.put("problemtitle",problemtitle); + obj.put("problemdetail",problemdetail); + obj.put("version", Constant.VERSION); + obj.put("userid",userid); + obj.put("publish",publish);//1是发布 0是草稿 + obj.put("titleid",titleid);//用于覆盖或者删除上次草稿 + obj.put("resolveImg",resolveImg); + obj.put("md5",md5); + obj.put("size",size); + if("1".equals(publish)){//发布提问时选择匿名,草稿不保存是否匿名 + obj.put("ifanonymity",isnameless); + } + Log.d("lll", "commitQuestion: "+problemdetail); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, true, putUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if("1".equals(rsCode)){ + if("0".equals(publish)){ + editor.putString("md5",md5); + editor.putString("size",String.valueOf(size)); + editor.apply(); + }else{ + editor.putString("md5",""); + editor.putString("size",""); + editor.apply(); + } + if(QaFragment.instance!=null){ + QaFragment.instance.refresh(); + } + finish(); + } + if("1".equals(publish)){//发布的时候才给提示,其他时候不给提示 + JqStrUtil.showToast(PutQuestionActivity.this,explanation); + } + } + },null); + } + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if(keyCode==KeyEvent.KEYCODE_BACK&&event.getRepeatCount()==0){ + delBackEvent(); + return true; + } + return super.onKeyDown(keyCode, event); + } + + private void checkPermissionAndShow() { + List permissionList = new ArrayList<>(); + if (ContextCompat.checkSelfPermission(PutQuestionActivity.this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { + permissionList.add(Manifest.permission.CAMERA); + } + if (ContextCompat.checkSelfPermission(PutQuestionActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { + permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); + } + if (!permissionList.isEmpty()) { + String[] permissions = permissionList.toArray(new String[permissionList.size()]); + ActivityCompat.requestPermissions(PutQuestionActivity.this, permissions, 1); + } else { + showActionSheet(); + } + + } + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + switch (requestCode){ + case 1: + if(grantResults.length>0){ + for (int result : grantResults){ + if(result!=PackageManager.PERMISSION_GRANTED){ + return; + }else{ + showActionSheet(); + } + } + }else{ + return; + } + break; + default: + break; + } + } + + /** + * 弹出框展现和消失 + */ + public void showActionSheet() { + setTheme(R.style.ActionSheetStyleiOS7); + ActionSheet.createBuilder(PutQuestionActivity.this, getSupportFragmentManager()) + .setCancelButtonTitle("取消") + .setOtherButtonTitles("拍照", "相册") + .setCancelableOnTouchOutside(true).setListener(this).show(); + } + public void onDismiss(ActionSheet actionSheet, boolean isCancel) { + + } + + + /** + * 选择调用系统相机和相册方式来上传图片 + * @param actionSheet + * @param index + */ + @Override + public void onOtherButtonClick(ActionSheet actionSheet, int index) { + switch (index) { + case 0://调用系统相机 + //下面这句指定调用相机拍照后的照片存储的路径 + String temPhonename = System.currentTimeMillis() + ".jpg"; + dirPath = Environment.getExternalStorageDirectory() + IMG_PATH+temPhonename; + imgUri = Uri.fromFile(new File(dirPath)); + Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); + intent.putExtra(MediaStore.EXTRA_OUTPUT,imgUri); + startActivityForResult(intent, PHOTO_REQUEST_TAKEPHOTO); + break; + case 1: + Intent intentPhoto = new Intent(Intent.ACTION_PICK, null); + intentPhoto.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); + startActivityForResult(intentPhoto,PHOTO_REQUEST_GALLERY); + break; + default: + break; + } + } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if(resultCode== Activity.RESULT_OK){ + switch (requestCode){ + case PHOTO_REQUEST_TAKEPHOTO:// 当选择拍照时调用 + if(resultCode==RESULT_OK){ + if(imgUri!=null){ + Glide.with(PutQuestionActivity.this).load(dirPath).into(iv_addImg); + isAdd = false; + iv_del.setVisibility(View.VISIBLE); + } + } + break; + case PHOTO_REQUEST_GALLERY:// 当选择从本地获取图片时 + if (data != null) { + Uri uri = data.getData(); + if (!JqStrUtil.isEmpty(uri.getAuthority())) { + Cursor cursor = getContentResolver().query(uri, + new String[] { MediaStore.Images.Media.DATA }, + null, null, null); + if (null == cursor) { + JqStrUtil.showToast(PutQuestionActivity.this,"图片没找到"); + return; + } + cursor.moveToFirst(); + String path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA)); + cursor.close(); + dirPath = path; + Glide.with(PutQuestionActivity.this).load(dirPath).into(iv_addImg); + isAdd = false; + iv_del.setVisibility(View.VISIBLE); + } + } + break; + default: + break; + } + }else{ + dirPath = ""; + } + + } + + /** + * 上传图片的方法入口 + */ + private void uploadPerPicMethod() { +// final String dirPath = getRealFilePath(getActivity(),imgUri); + photo = BitmapFactory.decodeFile(dirPath); + JSONObject obj = new JSONObject(); + bos = new ByteArrayOutputStream(); + photo.compress(Bitmap.CompressFormat.JPEG, 80, bos); + size = bos.size(); + try { + md5 = BinaryUtil.calculateBase64Md5(dirPath); + bos.flush(); + bos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + final byte[] bytes = bos.toByteArray(); + obj.put("md5",md5); + obj.put("size",size); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(PutQuestionActivity.this,true,aliUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + if ("1".equals(rsCode)) { + final String putaliUrl = jsonObject.getString("url");//put阿里云的路径 + resolveImg = jsonObject.getString("key");//调用接口时的filePath + new Runnable(){ + @Override + public void run() { + try { + put(MediaType.parse(""), putaliUrl, bytes);//上传到阿里云地址下 + } catch (IOException e) { + e.printStackTrace(); + } + } + }.run(); + + }else if("0".equals(rsCode)){//文件已存在,无需上传到阿里云服务器 + resolveImg = jsonObject.getString("key");//调用接口时的filePath + commitQuestion(); + } + } + },null); + } + + /** + * put请求上传图片到阿里云相应地址下 + */ + public void put(MediaType mediaType, String uploadUrl, byte[] bytes) throws IOException { + OkHttpClient client = new OkHttpClient(); + RequestBody body = RequestBody.create(mediaType, bytes); + Request request = new Request.Builder().url(uploadUrl).put(body).build(); + client.newCall(request).enqueue(new Callback() { + @Override + public void onFailure(Call call, IOException e) { + + } + @Override + public void onResponse(Call call, Response response) throws IOException { + runOnUiThread(new Runnable() { + @Override + public void run() { + commitQuestion(); + } + }); + } + }); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/PutRecentActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/PutRecentActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..3f38a56b6915328341fd59a4cbf2e9df780534bb --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/PutRecentActivity.java @@ -0,0 +1,726 @@ +package com.jiuqi.elove.activity; + +import android.Manifest; +import android.app.AlertDialog; +import android.app.Dialog; +import android.app.ProgressDialog; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.pm.PackageManager; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.media.MediaPlayer; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.os.Environment; +import android.os.Handler; +import android.provider.MediaStore; +import android.support.v4.content.ContextCompat; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.bumptech.glide.Glide; +import com.duanqu.qupai.sdk.android.QupaiManager; +import com.duanqu.qupai.sdk.android.QupaiService; +import com.duanqu.qupai.utils.AppGlobalSetting; + +import android.support.v4.content.FileProvider; +import android.text.TextUtils; +import android.util.DisplayMetrics; +import android.util.Log; +import android.view.KeyEvent; +import android.view.MotionEvent; +import android.view.View; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.TextView; +import android.widget.VideoView; + +import com.baoyz.actionsheet.ActionSheet; +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.common.JqBaseActivity; +import com.jiuqi.elove.common.PermissionListener; +import com.jiuqi.elove.entity.CircleTopicModel; +import com.jiuqi.elove.entity.VideoRecordResult; +import com.jiuqi.elove.fragment.FindFragment; +import com.jiuqi.elove.fragment.FindFragment201801; +import com.jiuqi.elove.fragment.FriendCircleFragment; +import com.jiuqi.elove.fragment.HotTopicFragment; +import com.jiuqi.elove.fragment.NewTopicFragment; +import com.jiuqi.elove.fragment.SayloveFragment255; +import com.jiuqi.elove.util.CommonUtil; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; +import com.jiuqi.elove.util.UploadAliUtil; +import com.jiuqi.elove.widget.dialog.LoadingDialog; +import com.jiuqi.elove.widget.mediapicker.model.Photo; +import com.jiuqi.elove.widget.mediapicker.util.GalleryFinal; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import okhttp3.MediaType; + +public class PutRecentActivity extends JqBaseActivity implements View.OnClickListener,ActionSheet.ActionSheetListener{ + + private static final int TOTAL_COUNT = 4; + public static final String PROVIDER_IMG = "com.jiuqi.elove.fileprovider"; + /** + * 控件 + */ + private TextView tvTitle; + private TextView tvMore; + private TextView tv_locate; + private ImageView imgBack; + private LinearLayout ll_locate; + private EditText et_content; + private ImageView iv_addImg; + private LinearLayout ll_add;//添加图片按钮所在布局 + private LinearLayout ll_iv;//添加的图片所在的布局 + private VideoView video; + private Dialog dialog; + private RelativeLayout rl_topic; + private TextView tv_topic; + /** + * 数据 + */ + private String address; + private String temPhonename; + private static final String PHOTO_PATH = "/elove/";//调用系统相机拍照后照片保存路径 + private String currentPath;//拍照得到的图片路径或者视频路径 + private ArrayList mList; + private ArrayList mAddList; +// private ArrayList upList;//上传要用的阿里云地址路径 + private List> mapList;//上传要用的阿里云地址路径 + private boolean isVideo = false; + private boolean isPic = false; + private int sendTimes = 0; + private String userid; + private String videoimg; + private Uri imgUri; + private CircleTopicModel topicModel; + private String topicid; + private String topicTitle; + private boolean isTopicFrom = false; + /** + * 工具 + */ + private static final int ADDRESS_REQUEST = 0X01;//地址请求码 + private static final int ADDRESS_RESPONSE = 0X01;//响应码 + private static final int EDIT_PIC = 0X05;//查看大图 + private static final int VIDEO_PRE = 0X06;//查看视频 + private int currentCount = 0; + private static final int PICTURE_REQUEST = 0X02;//相册请求码 + private static final int PICTURE_RESPONSE = 0X13;//响应吗 + private static final int TAKEPHOTO_REQUEST = 0x03;//拍照 + private static final int TAKE_VIDEO_REQUEST = 200;//视频 + private LinearLayout.LayoutParams lp; + private UploadAliUtil uploadAliUtil; + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_put_recent); + getDataFromSp(); + initListAndParam(); + initView(); + setEvents(); + } + + private void getDataFromSp() { + Intent intent = getIntent(); + userid = SpUtils.getString(Constant.USER_ID); + topicid = intent.getStringExtra("topicid"); + topicTitle = intent.getStringExtra("title"); + } + + private void initListAndParam() { + mAddList = new ArrayList<>(); +// upList = new ArrayList<>();//上传的时候总要上传这个list,不管是否是空 + lp = getMyLayoutParam(); + } + + private void setEvents() { + tvMore.setOnClickListener(this); + imgBack.setOnClickListener(this); + ll_locate.setOnClickListener(this); + iv_addImg.setOnClickListener(this); + rl_topic.setOnClickListener(this); + } + + private void initView() { + tvTitle = easyFind(R.id.tvTitle); + tvMore = easyFind(R.id.tvMore); + tv_locate = easyFind(R.id.tv_locate); + imgBack = easyFind(R.id.img_leftBtn); + ll_locate = easyFind(R.id.ll_locate); + et_content = easyFind(R.id.et_content); + iv_addImg = easyFind(R.id.iv_addImg); + ll_add = easyFind(R.id.ll_add); + ll_iv = easyFind(R.id.ll_iv); + rl_topic = easyFind(R.id.rl_topic); + tv_topic = easyFind(R.id.tv_topic); + tvTitle.setText("说点啥"); + tvMore.setText("发送"); + tvMore.setVisibility(View.VISIBLE); + imgBack.setVisibility(View.VISIBLE); + iv_addImg.setLayoutParams(lp); + if(!TextUtils.isEmpty(topicTitle)){ + tv_topic.setText("#"+topicTitle+"#"); + tv_topic.setTextColor(ContextCompat.getColor(this,R.color.circle_topic_blue)); + isTopicFrom = true; + } + } + + @Override + public void onClick(View view) { + switch (view.getId()){ + case R.id.tvMore: + publish(); + break; + case R.id.img_leftBtn: + sureExit(); + break; + case R.id.ll_locate: + requestRuntimePermission(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, new PermissionListener() { + @Override + public void onGranted() { + startChooseLocateActivity(); + } + @Override + public void onDenied(List deniedPermission) { + + } + }); + break; + case R.id.iv_addImg: + requestRuntimePermission(new String[]{Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_PHONE_STATE}, new PermissionListener() { + @Override + public void onGranted() { + showActionSheet(); + } + @Override + public void onDenied(List deniedPermission) { + + } + }); + break; + case R.id.rl_topic: + startActivityForBackResult(); + break; + default: + break; + } + } + + private void startActivityForBackResult() { + Intent intent = new Intent(this,TopicListActivity.class); + startActivityForResult(intent,0x0111); + } + + /** + * 进行选择图片或者拍视频或者拍照片 + */ + /********************************************************展示更多操作的面板start*************************************************************/ + private void showActionSheet() { + setTheme(R.style.ActionSheetStyleiOS7); + ActionSheet.createBuilder(this, getSupportFragmentManager()) + .setCancelButtonTitle(getString(R.string.cancel)) + .setOtherButtonTitles("相册","拍照","录制视频") + .setCancelableOnTouchOutside(true).setListener(this).show(); + } + @Override + public void onDismiss(ActionSheet actionSheet, boolean isCancel) { + //空实现 + } + @Override + public void onOtherButtonClick(ActionSheet actionSheet, int index) { + switch (index){ + case 0://相册 + if(!isVideo){ + startPictureActivity(); + } + break; + case 1://拍照 + if(!isVideo){ + takePhoto(); + } + break; + case 2://录制视频 + if(mAddList.isEmpty()){//如果已经有图片了,则视频不能在录制;因为录制视频之后按钮消失,则一般不用对拍照和相册作限制,但是为了严谨,做判断 + startVideo(); + }else{ + JqStrUtil.showToast(this,"图片和视频不能同时发布哦"); + } + break; + default: + break; + } + } + + /** + * 打开相册 + */ + private void startPictureActivity() { + GalleryFinal.selectMedias(this, GalleryFinal.TYPE_IMAGE,TOTAL_COUNT-currentCount, new GalleryFinal.OnSelectMediaListener() { + @Override + public void onSelected(ArrayList photoArrayList) { + isPic = true; + for(int i=0;i=24){ + imgUri = FileProvider.getUriForFile(this,PROVIDER_IMG,avatarFile); + }else{ + imgUri = Uri.fromFile(avatarFile); + } + intent.putExtra(MediaStore.EXTRA_OUTPUT,imgUri); + startActivityForResult(intent,TAKEPHOTO_REQUEST); + } + + private void startVideo() { + QupaiService qupaiService = QupaiManager + .getQupaiService(this); + //引导,只显示一次,这里用SharedPreferences记录 + final AppGlobalSetting sp = new AppGlobalSetting(getApplicationContext()); + Boolean isGuideShow = sp.getBooleanGlobalItem( + Constant.PREF_VIDEO_EXIST_USER, true); + + qupaiService.showRecordPage(this, Constant.RECORDE_SHOW, isGuideShow); + + sp.saveGlobalConfigItem( + Constant.PREF_VIDEO_EXIST_USER, false); + } + + /** + * 进入选择位置页面 + */ + private void startChooseLocateActivity() { + Intent intent = new Intent(this,ChooseLocateActivity.class); + startActivityForResult(intent,ADDRESS_REQUEST); + } + + /** + * 如果有输入内容,则是否退出 + */ + private void sureExit() { + if(isContent()){ + showPrompt(); + }else{ + finish(); + } + } + + /** + * 展示是否确定退出 + */ + private void showPrompt() { + new AlertDialog.Builder(this) + .setCancelable(true) + .setMessage("退出此次编辑?") + .setNegativeButton("取消", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int i) { + dialog.dismiss(); + } + }) + .setPositiveButton("退出", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int i) { + dialog.dismiss(); + finish(); + } + }) + .show(); + } + + /** + * 是否有输入内容 + * @return + */ + private boolean isContent() {//不包含地址校验 + if(!JqStrUtil.isEmpty(et_content.getText().toString().trim())){ + return true; + }else if(!mAddList.isEmpty()){ + return true; + } + return false; + } + + /** + * 发表动态 + */ + private void publish() { + if(isContent()){ + if(!mAddList.isEmpty()){ + mapList = new ArrayList<>(); + createDialogShow(); + uploadAliUtil = new UploadAliUtil(this);//在有文件的情况下初始化上传工具 + publishContainPicOrVideo();//发表图片或者视频 + }else{ + publishNoFile(true);//发表内容不包含文件 + } + }else{ + JqStrUtil.showToast(this,"请输入内容在进行发表哦"); + } + } + + private void createDialogShow(){ + if (dialog == null) { + dialog = LoadingDialog.createLoadingDialog(this, "努力发表中..."); + } + dialog.show(); + } + + /** + * 发表内容包含图片 + */ + private void publishContainPicOrVideo() { + /** + * 设置将文件上传阿里云后的接口回调 + */ + uploadAliUtil.setCompletePutAli(new UploadAliUtil.OnCompletePutAli() { + @Override + public void onFailure() { + mHandler.sendEmptyMessage(0x112); + } + + @Override + public void onSuccess() { + mHandler.sendEmptyMessage(0x111); + } + }); + /** + * 设置获取上传阿里云路径后的接口回调 + */ + uploadAliUtil.setAliInterface(new UploadAliUtil.OnUpLoadAli() { + @Override + public void upLoadHandle(JSONObject obj,final byte[] bytes,String param) { + String rsCode = obj.getString("retcode"); + String key = obj.getString("key"); + if("1".equals(rsCode)){//阿里云该文件不存在 + final String putAliUrl = obj.getString("url"); + new Runnable(){ + @Override + public void run() { + try { + uploadAliUtil.put(MediaType.parse(""),putAliUrl,bytes); + } catch (IOException e) { + e.printStackTrace(); + } + } + }.run(); +// upList.add(key); + }else if("0".equals(rsCode)){//阿里云该文件存在 +// upList.add(key); + mHandler.sendEmptyMessage(0x111); + } + setParamList(param,key); + } + }); + /** + * 获取上传阿里云路径的方法 + */ + if(isVideo){//判断是否为视频,如果放在for循环内部,则如果是多张图片的情况,每次都要进行判断 + for(String dirPath : mAddList){ + uploadAliUtil.uploadFile2Ali(dirPath,Constant.PUT_VIDEO_ACTION); + } + }else{ + for(String dirPath : mAddList){ + uploadAliUtil.uploadFile2Ali(dirPath,Constant.PUT_PIC_ACTION); + } + } + } + + private void setParamList(String param,String key){ + JSONObject object = (JSONObject) JSONObject.parse(param); + final String md5 = object.getString("md5"); + final String size = object.getString("size"); + HashMap updateParamMap = new HashMap<>();//用户保存每张图片的信息 + updateParamMap.put("md5",md5); + updateParamMap.put("size",String.valueOf(size)); + updateParamMap.put("path",key); + //放入put方法内部,则会引起多线程来操作list对象,所以如果没有其他方法得对对象枷锁处理,而在这里用handler和发送次数来做为判断的方式来代替上锁的方式 + mapList.add(updateParamMap); + } + + /** + * 主线程中接受数据完成通知获取,并进行处理 + */ + private Handler mHandler = new Handler() + { + public void handleMessage(android.os.Message msg) + { + if(msg.what==0x111){ + ++sendTimes;//发送次数加一,由于判断发送了多少次,避免仅仅根据size判断上传(size相等,但是由于异步,实际未put完成) + if(mapList.size()==mAddList.size()&&sendTimes==mAddList.size()){ + sendTimes = 0;//上传过程将发送次数置空 + publishNoFile(false);//调用服务器端接口,来实现 + if(dialog!=null){ + dialog.dismiss(); + } + } + } + if(msg.what==0x112){ + sendTimes = 0;//上传过程将发送次数置空 + if(dialog!=null){ + dialog.dismiss(); + } + tvMore.setClickable(true);//提交失败,允许再次提交 + JqStrUtil.showToast(PutRecentActivity.this,"网络不太好哦,上传失败,请稍后重试~"); + } + } + }; + + /** + * 发表内容不涉及图片和文字 + */ + private void publishNoFile(boolean flag) { + String putRecentUrl = Constant.COMMON_URL + Interface.CIRCLE_PUBLISH; + String content = et_content.getText().toString().trim(); + String tempAdd = tv_locate.getText().toString().trim(); + String address = "所在位置".equals(tempAdd)?"":tempAdd; + JSONObject obj = new JSONObject(); + obj.put("userid",userid); + obj.put("version",Constant.VERSION); + obj.put("content",content); + obj.put("address",address); + obj.put("imgs", JSON.toJSONString(mapList)); + obj.put("topicid",topicid); + if(isVideo){ + obj.put("action",Constant.PUT_VIDEO_ACTION); + obj.put("videoimg",videoimg); + }else if(isPic){ + obj.put("action",Constant.PUT_PIC_ACTION); + }else{ + obj.put("action",Constant.PUT_NO_ACTION); + } + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, flag, putRecentUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if("1".equals(rsCode)){ + if(FindFragment201801.instance!=null){ + FindFragment201801.instance.refresh(); + } + if(isTopicFrom){ + if(HotTopicFragment.instance!=null){ + HotTopicFragment.instance.refresh(); + } + if(NewTopicFragment.instance!=null){ + NewTopicFragment.instance.refresh(); + } + } + finish(); + }else { + JqStrUtil.showToast(PutRecentActivity.this,explanation); + } + } + },null); + } + + /** + * 手机硬件返回按键 + */ + public boolean onKeyDown(int keyCode, KeyEvent event) { + + if (keyCode == KeyEvent.KEYCODE_BACK + && event.getRepeatCount() == 0) { + if(isContent()){ + showPrompt(); + }else{ + finish(); + } + return true; + } + return super.onKeyDown(keyCode, event); + } + + /** + * 从之前结束的页面返回的数据 + * 1、地址 + * 2、相册选择照片 + * 3、拍照 + * 4、录制视频 + */ + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if(requestCode==ADDRESS_REQUEST&&resultCode==ADDRESS_RESPONSE){ + address = data.getStringExtra("address"); + tv_locate.setText(address); + tv_locate.setTextColor(getResources().getColor(R.color.colorPrimary)); + }else if(requestCode==0x0111&&resultCode==RESULT_OK){ + topicModel = (CircleTopicModel) data.getSerializableExtra("model"); + topicid = topicModel.getRecid(); + tv_topic.setText("#"+topicModel.getTitle()+"#"); + tv_topic.setTextColor(ContextCompat.getColor(this,R.color.circle_topic_blue)); + }else{ + if(requestCode==EDIT_PIC&&resultCode==RESULT_OK){ + if(data!=null){ + mAddList.clear(); + mAddList = data.getStringArrayListExtra("imgList"); + if(mAddList.isEmpty()){ + isPic = true; + } + } + } + if(requestCode==VIDEO_PRE&&resultCode==RESULT_OK){ + if(data!=null){ + isVideo = false; + mAddList.clear(); + } + } + if(requestCode==TAKEPHOTO_REQUEST&&resultCode==RESULT_OK){ + isPic = true; + currentPath = Environment.getExternalStorageDirectory()+PHOTO_PATH+"/"+temPhonename; + mAddList.add(currentPath); + } + if(requestCode==TAKE_VIDEO_REQUEST&&resultCode==RESULT_OK){ + isVideo = true; + VideoRecordResult result =new VideoRecordResult(data); + //得到视频地址 + currentPath = result.getPath(); + String [] videoImgs = result.getThumbnail(); + if(videoImgs!=null&&videoImgs.length>0){ + Bitmap videoBitmap = BitmapFactory.decodeFile(videoImgs[0]); + videoimg = CommonUtil.bitmap2StrByBase64(videoBitmap,30); + } + Log.d("mina", "onActivityResult: "+videoImgs[0]); + if(!mAddList.isEmpty()){//如果不为空,则需要清空 + mAddList.clear(); + } + mAddList.add(currentPath); + } + setData2ImageView(); + } + } + + /** + * 将选择的图片或者录制的视频放入view + */ + private void setData2ImageView() { + currentCount = mAddList.size(); + ll_iv.removeAllViews(); + if(mAddList.size()>=4||(mAddList.size()==1&&isVideo)){ + ll_add.setVisibility(View.GONE); + }else{ + ll_add.setVisibility(View.VISIBLE); + } + for(int i=0;i mList; + private List mAddList; + private QaAnswersAdapter adapter; + private String userid; + private String resolvid; + private int pageindex = 0; + private int pagesize = 10; + private ChoicenessAndDetailModel preChoiceModel; + private QaAndDetailModel preQaModel; + private String preflag; + private int modifyposition;//更改的位置 + private String userrole; + private String key; + private String md5 = ""; + private int size; + private String aliUrl = Constant.COMMON_URL + Interface.UP_AUDIO_ALIYUN; + private byte[] bytes = null; + private int voicetime; + //mTime 必须是float型,不能是int型 + private float mTime;//用于监听声音的变化 + private boolean isRecord;//是否正在录音 + private QaAnswersAdapter.ViewHolder viewholder; + /** + * 工具 + */ + private final OkHttpUtil okHttpUtil = OkHttpUtil.getInstance(); + private boolean isshow = true; + public static QaDetailActivity instance; + private ExecutorService mExecutorService; + private MediaRecorder mMediaRecorder; + private MediaPlayer mMediaPlayer; + private File mAudioFile; + private long mStartRecordTime,mStopRecordTime; + private Handler mMainThredHander; + private Handler handler = new Handler(); + //主线程和后台播放线程数据同步 + private volatile boolean mIsPlaying; + private boolean isItemPlay; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + instance = this; + setContentView(R.layout.activity_qa_detail); + //录音JNI函数不具备线程安全性,所以用单线程 + mExecutorService = Executors.newSingleThreadExecutor(); + mMainThredHander = new Handler(Looper.getMainLooper()); + getDataFromSpAndPrepage();//从缓存和上一个页面获取数据,用于网络请求 + initView(); + initQuestionDetail(); + mAddList = new ArrayList<>(); + adapter = new QaAnswersAdapter(this); + lv_answer.setAdapter(adapter); + initAnswerList(); + setEvents(); + } + + private void getDataFromSpAndPrepage() { + SharedPreferences sp = getSharedPreferences("elove",MODE_PRIVATE); + userid = sp.getString("userid",""); + userrole = sp.getString("userrole",""); + resolvid = getIntent().getStringExtra("id"); + preflag = getIntent().getStringExtra("preflag"); + if("qafragment".equals(preflag)){ + preQaModel = (QaAndDetailModel) getIntent().getSerializableExtra("model"); + }else if("choicefragment".equals(preflag)){ + preChoiceModel = (ChoicenessAndDetailModel) getIntent().getSerializableExtra("model"); + } + } + + private void initView() { + imgBack = (ImageView) findViewById(R.id.img_leftBtn); + imgBack.setVisibility(View.VISIBLE); + iv_avatar = (ImageView) findViewById(R.id.iv_avatar); + iv_qaimg = (ImageView) findViewById(R.id.iv_qaimg); + iv_record = (ImageView) findViewById(R.id.iv_record); + tv_nikename = (TextView) findViewById(R.id.tv_nikename); + tv_questiontime = (TextView) findViewById(R.id.tv_questiontime); + tv_title = (TextView) findViewById(R.id.tv_title); + tvTitle = (TextView) findViewById(R.id.tvTitle); + tvTitle.setText("问答详情"); + tv_content = (TextView) findViewById(R.id.tv_content); + tv_answer = (TextView) findViewById(R.id.tv_answer); + tv_answercount = (TextView) findViewById(R.id.tv_answercount); + tv_scancount = (TextView) findViewById(R.id.tv_scancount); + lv_answer = (ListViewForScrollView) findViewById(R.id.lv_answer); + scroll_qadetail = (BottomScrollView) findViewById(R.id.scroll_qadetail); + tv_ismore = (TextView) findViewById(R.id.tv_ismore); + tv_istop = (TextView) findViewById(R.id.tv_istop); + tv_listen_try = (TextView) findViewById(R.id.tv_listen_try); + tv_submit = (TextView) findViewById(R.id.tv_submit); + ll_answer_amount = (LinearLayout) findViewById(R.id.ll_answer_amount); + ll_bottom_tv = (LinearLayout) findViewById(R.id.ll_bottom_tv); + ll_bottom_audio = (LinearLayout) findViewById(R.id.ll_bottom_audio); + view_line = findViewById(R.id.view_line); +// ll_bottom_audio.setVisibility(View.GONE); +// ll_bottom_tv.setVisibility(View.VISIBLE); + if(Constant.SPEC_USER.equals(userrole)){//专家 +// //录音JNI函数不具备线程安全性,所以用单线程 +// mExecutorService = Executors.newSingleThreadExecutor(); +// mMainThredHander = new Handler(Looper.getMainLooper()); + ll_bottom_audio.setVisibility(View.VISIBLE); + ll_bottom_tv.setVisibility(View.GONE); + }else{ + ll_bottom_audio.setVisibility(View.GONE); + ll_bottom_tv.setVisibility(View.VISIBLE); + } + mAudioDialogManager = new AudioDialogManager(this); + } + + private void initQuestionDetail() { + String questionUrl = Constant.COMMON_URL + Interface.Q_DETAIL; + JSONObject obj = new JSONObject(); + obj.put("userid",userid); + obj.put("resolvid",resolvid); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, false, questionUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if("1".equals(rsCode)){ + String result = jsonObject.getString("message"); + if(JqStrUtil.isEmpty(result)||"{}".equals(result)){ + JqStrUtil.showToast(QaDetailActivity.this,"此提问已被删除"); + } + QaAndDetailModel model= JSON.parseObject(result,QaAndDetailModel.class); + setQuestion2View(model); + }else{ + JqStrUtil.showToast(QaDetailActivity.this,explanation); + } + } + },null); + } + + private void initAnswerList() { + String qaDetailReplyListUrl = Constant.COMMON_URL + Interface.QA_DETAIL_LIST; + JSONObject obj = new JSONObject(); + obj.put("userid",userid); + obj.put("pageindex",pageindex); + obj.put("pagesize",pagesize); + obj.put("resolvid",resolvid); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(QaDetailActivity.this, isshow, qaDetailReplyListUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + String totalnum = jsonObject.getString("totalnum"); + if("1".equals(rsCode)){ + String result = jsonObject.getString("resolvelist"); + tv_answercount.setText(totalnum); + if("qafragment".equals(preflag)){//上一页为问答fragment + if(preQaModel!=null){ + preQaModel.setReplys(totalnum); + } + }else if("choicefragment".equals(preflag)){//上一页为精选fragment + if(preChoiceModel!=null){ + preChoiceModel.setReviews(totalnum); + } + } + mList = JSON.parseArray(result,QaDetailAnswerModel.class); + mAddList.addAll(mList); + if(mAddList.isEmpty()){ + ll_answer_amount.setVisibility(View.GONE); + view_line.setVisibility(View.GONE); + lv_answer.setVisibility(View.GONE); + tv_ismore.setVisibility(View.GONE); + }else if(!mAddList.isEmpty()&&!mList.isEmpty()){ + ll_answer_amount.setVisibility(View.VISIBLE); + view_line.setVisibility(View.VISIBLE); + lv_answer.setVisibility(View.VISIBLE); + tv_ismore.setVisibility(View.VISIBLE); + adapter.updateListView(mAddList); + checkAndDownload(mList); + }else if(mList.isEmpty()&&!mAddList.isEmpty()){ + tv_ismore.setText("暂无更多评论"); + } + }else{ + JqStrUtil.showToast(QaDetailActivity.this,explanation); + } + } + },null); + } + + /** + * 如果有专家回复了,下载下来 + */ + private void checkAndDownload(List list) { + for(QaDetailAnswerModel model : list){ + if("1".equals(model.getCommenttype())){ + download(model.getComment()); + } + } + } + + /** + * 下载文件 + */ + private void download(final String url) { + new Thread() { + public void run() { + try { + down_file(url); + } catch (IOException e) { + e.printStackTrace(); + } + } + }.start(); + } + + public void down_file(String url) throws IOException { + String name = url.substring(url.lastIndexOf("/")+1); + File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/elove/temps/"+name); + if(file.exists()){ + return; + } + file.getParentFile().mkdirs(); + file.createNewFile(); + URL myURL = new URL(url); + URLConnection conn = myURL.openConnection(); + conn.connect(); + InputStream is = conn.getInputStream(); + int fileSize = conn.getContentLength(); + if (fileSize <= 0) + throw new RuntimeException("can not know the file`s size"); + if (is == null) + throw new RuntimeException("stream is null"); + FileOutputStream fos = new FileOutputStream(file); + byte buf[] = new byte[1024]; + do { + // 循环读取 + int numread = is.read(buf); + if (numread == -1) { + break; + } + fos.write(buf, 0, numread); + } while (true); + try { + is.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + private void setQuestion2View(QaAndDetailModel model) { + if("1".equals(model.getIstop())){ + tv_istop.setVisibility(View.VISIBLE); + tv_title.setText("\t\t\t\t\t\t\t "+model.getTitle()); + }else{ + tv_istop.setVisibility(View.GONE); + tv_title.setText(model.getTitle()); + } + iv_qaimg.setLayoutParams(getMyLayout()); + if(JqStrUtil.isEmpty(model.getResolveImg())){ + iv_qaimg.setVisibility(View.GONE); + }else{ + iv_qaimg.setVisibility(View.VISIBLE); + Glide.with(getApplicationContext()).load(model.getResolveImg()).placeholder(R.drawable.img_hx_avatar).dontAnimate().centerCrop().into(iv_qaimg); + } + EasyGlide.getInstance().showImageCircle(model.getAvatar(),iv_avatar); + tv_nikename.setText(model.getUsername()); + tv_questiontime.setText(AbDateUtil.formatDateStr2Desc(model.getStarttime(),"yyyy-MM-dd HH:mm","MM-dd HH:mm")); + tv_content.setText(model.getTheme()); + tv_scancount.setText(model.getScans()); + if("qafragment".equals(preflag)){//上一页为问答fragment + if(preQaModel!=null){ + preQaModel.setScans(String.valueOf(Integer.parseInt(preQaModel.getScans())+1));//更新上个页面的model来展示 + } + }else if("choicefragment".equals(preflag)){//上一页为精选fragment + if(preChoiceModel!=null){ + preChoiceModel.setScans(String.valueOf(Integer.parseInt(preChoiceModel.getScans())+1));//更新上个页面的model来展示 + } + } + } + + private void setEvents() { + imgBack.setOnClickListener(this); + tv_answer.setOnClickListener(this); + tv_submit.setOnClickListener(this); + tv_listen_try.setOnClickListener(this); + scroll_qadetail.setOnScrollToBottomLintener(new BottomScrollView.OnScrollToBottomListener() { + @Override + public void onScrollBottomListener(boolean isBottom) { + if(isBottom){ + ++pageindex; + isshow = false; + tv_ismore.setText("加载更多评论..."); + initAnswerList(); + } + } + }); + lv_answer.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView adapterView, View view, int position, long l) { + if(mAddList.size()<=0){ + return; + } + modifyposition = position; + QaDetailAnswerModel model = mAddList.get(position); + if("1".equals(model.getCommenttype())){ + return; + } + Intent intent = new Intent(QaDetailActivity.this, QuestionReplyActivity.class); + intent.putExtra("id",model.getCommentid()); + intent.putExtra("model",model); + startActivityForResult(intent,0x03); + } + }); + + setAdapterClick(); + //长摁录音键录音 + iv_record.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View view, MotionEvent motionEvent) { + switch (motionEvent.getAction()){ + case MotionEvent.ACTION_DOWN: + Log.d("lll", "onTouch: downdown"); + List permissionList = new ArrayList<>(); + if(ContextCompat.checkSelfPermission(QaDetailActivity.this,Manifest.permission.WRITE_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED){ + permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); + } + if(ContextCompat.checkSelfPermission(QaDetailActivity.this,Manifest.permission.RECORD_AUDIO)!=PackageManager.PERMISSION_GRANTED){ + permissionList.add(Manifest.permission.RECORD_AUDIO); + } + if(!permissionList.isEmpty()){ + String[] permissions = permissionList.toArray(new String[permissionList.size()]); + ActivityCompat.requestPermissions(QaDetailActivity.this,permissions,1); + }else{ + startRecord(); + } + break; + case MotionEvent.ACTION_UP: + Log.d("lll", "onTouch: upupup"); + stopRecord(); + break; + default: + break; + } + //处理了 + return true; + } + }); + } + + private void setAdapterClick(){ + adapter.setOnUpdateRewardListener(new QaAnswersAdapter.OnUpdateRewardListener() { + @Override + public void updateReward(int position,QaDetailAnswerModel model) { + if(mAddList.size()<=0){ + return; + } + if(!JqStrUtil.isEmpty(userid)&&userid.equals(model.getUserid())){ + JqStrUtil.showToast(QaDetailActivity.this,"不能打赏自己"); + return; + } + if("1".equals(model.getCommenttype())){ + return; + } + modifyposition = position; + Intent intent = new Intent(QaDetailActivity.this, RewardActivity.class); + intent.putExtra("otherid",model.getUserid()); + intent.putExtra("type","2");//问答 + intent.putExtra("titleid",model.getCommentid()); + intent.putExtra("model",model); + startActivityForResult(intent,0x03); + } + + @Override + public void playVoice(int position, final QaDetailAnswerModel model,final QaAnswersAdapter.ViewHolder vh) { + if(mAddList.size()<=0){ + return; + } + if("0".equals(model.getCommenttype())){ + return; + } + viewholder = vh;//为了使点击试听时控制item的改变,我这也是醉了这么做- - +// setReadState(vh);//设置读取的语音条的背景 + //检查当前状态,防止重复播放 + if(!mIsPlaying&&!isItemPlay){ +// //设置当前播放状态 +// mIsPlaying = true; + setReadState(); + //提交后台任务,开始播放 + mExecutorService.submit(new Runnable() { + @Override + public void run() { + String name = model.getComment().substring(model.getComment().lastIndexOf("/")+1); + File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+Constant.ELOVE_LISTENED_AUDIO+name); + if(file.exists()){ + doPlay(Environment.getExternalStorageDirectory().getAbsolutePath()+Constant.ELOVE_LISTENED_AUDIO+name); + }else{ + JqStrUtil.showToast(QaDetailActivity.this,"音频获取失败"); + } + } + }); + }else{ + stopPlay(); + } + } + }); + } + + private void setReadState(){ + if(viewholder!=null){ + if(!isItemPlay){ + viewholder.animeView.setBackgroundResource(R.drawable.voice_animation); + AnimationDrawable ad = (AnimationDrawable) viewholder.animeView.getBackground(); + ad.start(); + }else{ + viewholder.animeView.setBackgroundResource(R.drawable.v_anim3); + } + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + switch (requestCode){ + case 1: + if(grantResults.length>0){ + for (int result : grantResults){ + if(result!= PackageManager.PERMISSION_GRANTED){ + return; + }else{ + startRecord(); + } + } + }else{ + return; + } + break; + default: + break; + } + } + + + /** + * 开始录音 + */ + private void startRecord() { + //提交后台任务,执行录音逻辑 + mAudioDialogManager.showDialog(); + mAudioDialogManager.showRecording(); + mExecutorService.submit(new Runnable() { + @Override + public void run() { + //释放之前录音的recorder + releaseRecorder(); + //执行录音逻辑,如果失败提醒用户 + if(!doStart()){ + recordFail(); + } + } + }); + } + + + /** + * 结束录音 + */ + private void stopRecord() { + //提交后台任务,执行停止录音逻辑 + mExecutorService.submit(new Runnable() { + @Override + public void run() { + //执行停止录音逻辑,如果失败提醒用户 + if(!doStop()){ + recordFail(); + } + //释放Recorder + releaseRecorder(); + } + }); + } + + + /** + * 启动录音逻辑 + */ + private boolean doStart() { + try { + //创建MediaRecorder + mMediaRecorder = new MediaRecorder(); + //创建录音文件 + mAudioFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+Constant.ELOVE_FILE_DIR+"spec.mp3"); + mAudioFile.getParentFile().mkdirs(); + mAudioFile.createNewFile(); + //配置MediaRecorder + mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);//从麦克风采集 + mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); +// mMediaRecorder.setAudioSamplingRate(44100);//所有安卓系统都支持的采样频率 + mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);//通用的AAC编码格式 +// mMediaRecorder.setAudioEncodingBitRate(96000);//音质比较好的频率 + mMediaRecorder.setOutputFile(mAudioFile.getAbsolutePath());//设置录音文件位置 + //录音开始 + mMediaRecorder.prepare(); + mMediaRecorder.start(); + isRecord = true; + //记录开始录音的时间,用于统计时长 + mStartRecordTime = System.currentTimeMillis(); + handler.post(timeRunnable); + } catch (IOException |RuntimeException e) { + e.printStackTrace(); + //捕获异常,避免闪退,返回false提醒用户失败 + return false; + } + return true; + } + + private Runnable timeRunnable = new Runnable() { + @Override + public void run() { + if(isRecord){ + mTime += 0.1; + mHandler.sendEmptyMessage(AUDIO_VOICE_CHANGE); + handler.postDelayed(timeRunnable,100); + if(mTime>=60){ + stopRecord(); + } + } + } + }; + + public void reset(){ + isRecord = false; + mTime = 0; + } + /** + * 释放MediaRecorder + */ + private void releaseRecorder() { + //检查MediaRecorder不为空 + if(mMediaRecorder!=null){ + mMediaRecorder.release(); + mMediaRecorder = null; + } + } + + /** + * 处理record失败的情况 + */ + private void recordFail() { + mAudioFile = null; + //给用户提示失败,要切换到主线程中 + mMainThredHander.post(new Runnable() { + @Override + public void run() { + JqStrUtil.showToast(QaDetailActivity.this,"录音失败"); + } + }); + } + + /** + * 停止录音逻辑 + */ + private boolean doStop() { + try{ + Log.d("lll", "doStop: stopfirst"); + //停止录音 + if(mMediaPlayer!=null){ + mMediaRecorder.stop(); + } + //记录停止时间,统计时长 + mStopRecordTime = System.currentTimeMillis(); + //只接受超过1s的录音,在UI上显示出来 + voicetime = (int) ((mStopRecordTime - mStartRecordTime) / 1000); + Log.d("lll", "doStop: stopleme"); + if(voicetime>=1&&isRecord){ + voicetime = (int)mTime;//如果录制成功,则voiceTime此次赋值则覆盖了第一次的赋值 + reset();//将时间置0并将录制状态改为false + Log.d("lll", "run: normal111"); + //在主线程更改ui,显示出来 + mMainThredHander.post(new Runnable() { + @Override + public void run() { + mAudioDialogManager.dismissDialog(); + JqStrUtil.showToast(QaDetailActivity.this,"录制成功"); + tv_listen_try.setVisibility(View.VISIBLE); + tv_submit.setVisibility(View.VISIBLE); + } + }); + }else if(isRecord){ + Log.d("lll", "run: too short111"); + reset();//将时间置0 + mMainThredHander.post(new Runnable() { + @Override + public void run() { + Log.d("lll", "run: too short222"); + mAudioDialogManager.tooShort(); + //延时让tooShort的图标显示出来 + mHandler.sendEmptyMessageDelayed(AUDIO_CANCEL,1300); + } + }); + cancelAudio(); + } + }catch(RuntimeException e){ + e.printStackTrace(); + Log.e("lll", "doStop: "+e.toString()); + return true; + } + //停止成功 + return true; + } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if(0x03==requestCode&&0x12==resultCode){ + QaDetailAnswerModel model = (QaDetailAnswerModel) data.getSerializableExtra("newmodel"); + if(model!=null){ + mAddList.remove(modifyposition); + mAddList.add(modifyposition,model); + adapter.updateListView(mAddList); + } + } + } + + @Override + public void onClick(View view) { + switch (view.getId()){ + case R.id.img_leftBtn: + Intent backIntent = new Intent(); + if("qafragment".equals(preflag)){ + if(preQaModel!=null){ + backIntent.putExtra("newmodel",preQaModel); + } + }else if("choicefragment".equals(preflag)){ + if(preChoiceModel!=null){ + backIntent.putExtra("newmodel",preChoiceModel); + } + } + setResult(0x11,backIntent); + finish(); + break; + case R.id.tv_answer: + Intent intent = new Intent(QaDetailActivity.this,QuestionCommentActivity.class); + intent.putExtra("id",resolvid); + startActivity(intent); + break; + case R.id.tv_submit: + stopPlay();//如果提交时,录音再被读取,则先关闭再上传,否则上传完毕如果录音没有读取完毕,读取状态未更改,则item中的不能被读取 + if(mAudioFile!=null){ + uploadPerPicMethod(); + } + break; + case R.id.tv_listen_try: + startPlay(); + break; + default: + break; + } + } + + /** + * 播放音频,试听 + */ + private void startPlay() { + //检查当前状态,防止重复播放 + if(mAudioFile!=null&&!mIsPlaying&&!isItemPlay){ + //设置当前播放状态 + mIsPlaying = true; + //提交后台任务,开始播放 + mExecutorService.submit(new Runnable() { + @Override + public void run() { + doPlay(mAudioFile.getAbsolutePath()); + } + }); + }else if(mIsPlaying||isItemPlay){ + stopPlay(); + } + } + + /** + * 播放逻辑 + */ + private void doPlay(String pathUrl) { + isItemPlay = true; + //配置播放器MediaPlayer + if(mMediaPlayer==null){ + mMediaPlayer = new MediaPlayer(); + }else{ + mMediaPlayer.reset(); + } + try{ + //设置声音文件 + mMediaPlayer.setDataSource(pathUrl); + //设置监听回调 + mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { + @Override + public void onCompletion(MediaPlayer mediaPlayer) { + //播放结束,释放播放器 + stopPlay(); + } + }); + mMediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() { + @Override + public boolean onError(MediaPlayer mediaPlayer, int i, int i1) { + //提示用户 + playFail(); + //释放播放器 + stopPlay(); + //错误已经处理,返回true + return true; + } + }); + //配置音量,是否循环 + mMediaPlayer.setVolume(1,1); + mMediaPlayer.setLooping(false); + //准备,开始 + mMediaPlayer.prepare(); + mMediaPlayer.start(); + }catch (RuntimeException | IOException e){ + e.printStackTrace(); + //提醒用户 + playFail(); + //释放播放器 + stopPlay(); + } + } + + /** + * 停止播放逻辑 + */ + private void stopPlay() { + if(viewholder!=null){ + setReadState(); + viewholder = null; + } + //重置播放状态 + mIsPlaying = false; + isItemPlay = false;//设置主动播放是否停止 + //释放播放器 + if(mMediaPlayer!=null){ + //重置监听器,防止内存泄漏 + mMediaPlayer.setOnCompletionListener(null); + mMediaPlayer.setOnErrorListener(null); + mMediaPlayer.stop(); + mMediaPlayer.reset(); + mMediaPlayer.release(); + mMediaPlayer = null; + } + } + + /** + * 播放失败逻辑 + */ + private void playFail() { + JqStrUtil.showToast(QaDetailActivity.this,"读取失败"); + } + + public void refresh(){ + tv_submit.setVisibility(View.GONE); + tv_listen_try.setVisibility(View.GONE); + isshow = false; + pageindex = 0; + mAddList = new ArrayList<>(); + adapter = new QaAnswersAdapter(this); + lv_answer.setAdapter(adapter); + initAnswerList(); + setAdapterClick();//否则刷新之后,音频点击不行了 + } + + @Override + protected void onDestroy() { + super.onDestroy(); + if(instance!=null){ + instance = null; + } + //activity销毁时,停止后台任务,防止内存泄漏 + if(mExecutorService!=null){ + mExecutorService.shutdownNow(); + } + releaseRecorder(); + stopPlay(); + } + + private RelativeLayout.LayoutParams getMyLayout(){ + Resources resources = getResources(); + DisplayMetrics dm = resources.getDisplayMetrics(); + int width = dm.widthPixels- CommonUtil.dip2px(getApplicationContext(),30); + RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(width,width); + return layoutParams; + } + + /** + * 上传视频的方法入口 + */ + private void uploadPerPicMethod() { + JSONObject obj = new JSONObject(); + try { + bytes = inputStreamToBytes(mAudioFile); + } catch (IOException e) { + e.printStackTrace(); + } + try { + md5 = BinaryUtil.calculateBase64Md5(mAudioFile.getAbsolutePath()); + } catch (IOException e) { + e.printStackTrace(); + } + obj.put("md5",md5); + obj.put("size",size); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(QaDetailActivity.this,false,aliUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + key = jsonObject.getString("key");//调用接口时的filePath + if ("1".equals(rsCode)) { + final String putaliUrl = jsonObject.getString("url");//put阿里云的路径 + new Runnable(){ + @Override + public void run() { + try { + put(MediaType.parse(""), putaliUrl, bytes);//上传到阿里云地址下 + } catch (IOException e) { + e.printStackTrace(); + } + } + }.run(); + + }else if("0".equals(rsCode)){//文件已存在,无需上传到阿里云服务器 + commitComment();//调用服务器端接口,来实现 + } + } + },null); + } + public byte[] inputStreamToBytes(File file) throws IOException { + FileInputStream fileInputStream = new FileInputStream(file); + size = fileInputStream.available(); + byte[] temp = new byte[2048]; + ByteArrayOutputStream swapStream = new ByteArrayOutputStream(); + int rc = 0; + while((rc = fileInputStream.read(temp,0,2048))>0){ + swapStream.write(temp,0,rc); + } + fileInputStream.close(); + + return swapStream.toByteArray(); + } + + private void commitComment() { + String commentUrl = Constant.COMMON_URL + Interface.CREATE_COMMENT; + String comment = key; + if(JqStrUtil.isEmpty(comment)){ + JqStrUtil.showToast(this,"请输入解答内容"); + return; + } + JSONObject obj = new JSONObject(); + obj.put("userid",userid); + obj.put("creamid",resolvid); + obj.put("version",Constant.VERSION); + obj.put("comment",comment); + if(voicetime>60){ + obj.put("voicetime",60); + }else{ + obj.put("voicetime",voicetime); + } + obj.put("commenttype","1");//commenttype //0文字1语音 + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(QaDetailActivity.this, isshow, commentUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if("1".equals(rsCode)){ + refresh(); +// mAudioFile = null;//上传成功后销毁 + } + JqStrUtil.showToast(QaDetailActivity.this,explanation); + } + },null); + } + + private Dialog dialog; + /** + * put请求上传视频到阿里云相应地址下 + */ + public void put(MediaType mediaType, String uploadUrl, byte[] bytes) throws IOException { + if (dialog == null) { + dialog = LoadingDialog.createLoadingDialog(QaDetailActivity.this, "正在上传..."); + dialog.show(); + } + OkHttpClient client = new OkHttpClient.Builder().retryOnConnectionFailure(true).build(); + RequestBody body = RequestBody.create(mediaType, bytes); + Request request = new Request.Builder().url(uploadUrl).put(body).build(); + client.newCall(request).enqueue(new Callback() { + @Override + public void onFailure(Call call, IOException e) { + if (dialog != null) { + dialog.dismiss(); + dialog = null; + } + JqStrUtil.showToast(QaDetailActivity.this,"访问服务器失败,请检查您的网络"); + } + @Override + public void onResponse(Call call, Response response) throws IOException { + runOnUiThread(new Runnable() { + @Override + public void run() { + if (dialog != null) { + dialog.dismiss(); + dialog = null; + } + commitComment();//调用服务器端接口,来实现 + } + }); + } + }); + } + + private Handler mHandler = new Handler(){ + @Override + public void handleMessage(Message msg) { + switch (msg.what){ + case AUDIO_PREPARED: + //在准备好audio recorder之后 +// isRecording = true; + mAudioDialogManager.showDialog(); +// handler.post(timeRunnable); + break; + case AUDIO_CANCEL: + mAudioDialogManager.dismissDialog(); + //不要忘了在主线程中更新ui + tv_submit.setVisibility(View.GONE); + tv_listen_try.setVisibility(View.GONE); + break; + case AUDIO_VOICE_CHANGE: + mAudioDialogManager.setVoiceLevel(getVoiceLevel(7)); + break; + } + } + }; + + public int getVoiceLevel(int maxLevel){ + try{//返回值在1-7之间 + int value = maxLevel * mMediaRecorder.getMaxAmplitude() / 12368 + 1; + if(value>7){ + return 7; + }else{ + return value; + } +// return maxLevel * mMediaRecorder.getMaxAmplitude() / 12368 + 1; + }catch (Exception e){ + e.printStackTrace(); + } + return 1; + } + +// public void releaseAudio(){ +// if (mMediaRecorder!= null){ +// try{ +// mMediaRecorder.stop(); +// mMediaRecorder.release(); +// mMediaRecorder = null; +// }catch (Exception e){ +// e.printStackTrace(); +// } +// } +// } + + public void cancelAudio(){ +// releaseAudio(); + if (mAudioFile != null){ + mAudioFile.delete(); + mAudioFile = null; + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/QiYuanAuthActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/QiYuanAuthActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..034524a5c197970a65bcd841e14eb0e0bd915dec --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/QiYuanAuthActivity.java @@ -0,0 +1,110 @@ +package com.jiuqi.elove.activity; + +import android.app.Dialog; +import android.content.Intent; +import android.content.SharedPreferences; +import android.graphics.Bitmap; +import android.net.Uri; +import android.os.Bundle; +import android.view.View; +import android.webkit.WebSettings; +import android.webkit.WebView; +import android.webkit.WebViewClient; +import android.widget.ImageView; +import android.widget.TextView; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.JqBaseActivity; +import com.jiuqi.elove.widget.dialog.LoadingDialog; + +public class QiYuanAuthActivity extends JqBaseActivity { + + private Dialog loadingDialog; + private ImageView imgBack; + + private String userid; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_qi_yuan_auth); + getDataFromSp(); + initView(); + setEvents(); + } + + private void getDataFromSp() { + SharedPreferences sp = getSharedPreferences("elove", MODE_PRIVATE); + userid = sp.getString("userid", ""); + } + + private void setEvents() { + imgBack.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + finish(); + } + }); + } + + private void initView() { + loadingDialog = LoadingDialog.createLoadingDialog(this, "请稍候"); + TextView tvTitle = easyFind(R.id.tvTitle); + tvTitle.setText("企缘认证"); + imgBack = easyFind(R.id.img_leftBtn); + imgBack.setVisibility(View.VISIBLE); + WebView mWebView = (WebView) findViewById(R.id.wv_mymember); + if (loadingDialog != null && !loadingDialog.isShowing()) { + loadingDialog.show(); + } + if (mWebView != null) { + WebSettings webSettings = mWebView.getSettings(); + //设置WebView属性,能够执行Javascript脚本 + webSettings.setJavaScriptEnabled(true); + //设置可以访问文件 + webSettings.setAllowFileAccess(true); + //设置支持缩放 + webSettings.setBuiltInZoomControls(true); + //加载需要显示的网页 + mWebView.loadUrl(Constant.MY_MEMBER + userid); + //设置Web视图 + mWebView.setWebViewClient(new MyWebViewClient()); + } + } + + + //Web视图 + private class MyWebViewClient extends WebViewClient { + public boolean shouldOverrideUrlLoading(WebView view, String url) { + String tag = "tel"; + if (url.contains(tag)) { + startCall(url); + return true;//这个超连接,java已经处理了,webview不要处理了 + }else{ + view.loadUrl(url); + return true; + } + } + + @Override + public void onPageStarted(WebView view, String url, Bitmap favicon) { + super.onPageStarted(view, url, favicon); + } + + @Override + public void onPageFinished(WebView view, String url) { + super.onPageFinished(view, url); + if (loadingDialog != null && loadingDialog.isShowing()) { + loadingDialog.dismiss(); + } + } + } + + + private void startCall(String url) { + Uri uri = Uri.parse(url); + Intent intent = new Intent(Intent.ACTION_DIAL, uri); + startActivity(intent); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/QuestionCommentActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/QuestionCommentActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..26adb4811c3878459601add2512b7e2841d3d5b1 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/QuestionCommentActivity.java @@ -0,0 +1,140 @@ +package com.jiuqi.elove.activity; + +import android.content.SharedPreferences; +import android.graphics.Rect; +import android.os.Bundle; +import android.view.View; +import android.view.Window; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.TextView; + +import com.alibaba.fastjson.JSONObject; +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.common.JqBaseActivity; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; + +public class QuestionCommentActivity extends JqBaseActivity { + + /** + * 控件 + */ + private TextView tvTitle; + private ImageView imgBack; + private TextView tvMore; + private EditText et_comment; + /** + * 数据 + */ + private String userid; + private String resolvid; + /** + * 工具 + */ + private final OkHttpUtil okHttpUtil = OkHttpUtil.getInstance(); + private boolean isshow = true; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_choiceness_and_question_comment); + getDataFromSpAndPrepage(); + initView(); + setEvents(); + } + + private void getDataFromSpAndPrepage() { + SharedPreferences sp = getSharedPreferences("elove",MODE_PRIVATE); + userid = sp.getString("userid",""); + resolvid = getIntent().getStringExtra("id"); + } + + private void setEvents() { + imgBack.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + finish(); + } + }); + + tvMore.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + commitComment(); + } + }); + } + + private void commitComment() { + String commentUrl = Constant.COMMON_URL + Interface.CREATE_COMMENT; + String comment = et_comment.getText().toString().trim(); + if(JqStrUtil.isEmpty(comment)){ + JqStrUtil.showToast(this,"请输入解答内容"); + return; + } + JSONObject obj = new JSONObject(); + obj.put("userid",userid); + obj.put("creamid",resolvid); + obj.put("version",Constant.VERSION); + obj.put("comment",comment); + obj.put("commenttype","0");//commenttype //0文字1语音 + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(QuestionCommentActivity.this, isshow, commentUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if("1".equals(rsCode)){ + if(QaDetailActivity.instance!=null){ + QaDetailActivity.instance.refresh(); + } + finish(); + } + JqStrUtil.showToast(QuestionCommentActivity.this,explanation); + } + },null); + } + + + private void initView() { + tvTitle = (TextView) findViewById(R.id.tvTitle); + tvTitle.setText("匿名解答"); + imgBack = (ImageView) findViewById(R.id.img_leftBtn); + imgBack.setVisibility(View.VISIBLE); + tvMore = (TextView) findViewById(R.id.tvMore); + tvMore.setText("发表"); + tvMore.setVisibility(View.VISIBLE); + et_comment = (EditText) findViewById(R.id.et_comment); +// setEditHeight(); + } + + private void setEditHeight(){ +// DisplayMetrics dm = new DisplayMetrics(); +// //获取屏幕信息 +// getWindowManager().getDefaultDisplay().getMetrics(dm); +// int screenHeigh = dm.heightPixels; +// et_comment.setHeight(screenHeigh/2-40); + Rect outRect = new Rect(); +// getWindow().getDecorView().getWindowVisibleDisplayFrame(outRect);//应用区域 + getWindow().findViewById(Window.ID_ANDROID_CONTENT).getDrawingRect(outRect);//绘制区域 + et_comment.setHeight((outRect.height()-100)/2-40); + } + + @Override + public void onWindowFocusChanged(boolean hasFocus) { + super.onWindowFocusChanged(hasFocus); + if(hasFocus){ + Rect outRect = new Rect(); + getWindow().findViewById(Window.ID_ANDROID_CONTENT).getDrawingRect(outRect);//绘制区域 + if(et_comment!=null){ + et_comment.setHeight((outRect.height()-50)/2-40); + }else{ + et_comment = (EditText) findViewById(R.id.et_comment); + et_comment.setHeight((outRect.height()-50)/2-40); + } + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/QuestionReplyActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/QuestionReplyActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..3f88d8d01429ab6fac399401d6433494ac3213cd --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/QuestionReplyActivity.java @@ -0,0 +1,381 @@ +package com.jiuqi.elove.activity; + +import android.content.Intent; +import android.content.SharedPreferences; +import android.graphics.Bitmap; +import android.support.v4.graphics.drawable.RoundedBitmapDrawable; +import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory; +import android.os.Bundle; +import android.view.KeyEvent; +import android.view.View; +import android.view.inputmethod.InputMethodManager; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ScrollView; +import android.widget.TextView; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.target.BitmapImageViewTarget; +import com.jiuqi.elove.R; +import com.jiuqi.elove.adapter.AnswerReplyAdapter; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.common.JqBaseActivity; +import com.jiuqi.elove.entity.QaAndDetailModel; +import com.jiuqi.elove.entity.QaDetailAnswerModel; +import com.jiuqi.elove.entity.QaReplyEachotherModel; +import com.jiuqi.elove.util.EasyGlide; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.widget.BottomScrollView; +import com.jiuqi.elove.widget.ListViewForScrollView; + +import java.util.ArrayList; +import java.util.List; + +public class QuestionReplyActivity extends JqBaseActivity implements View.OnLayoutChangeListener { + + /** + * 控件 + */ + private TextView tvTitle; + private ImageView ivBack; + private BottomScrollView scroll_reply; + private ImageView iv_avatar; + private TextView tv_nikename; + private TextView tv_questiontime; + private TextView tv_title; + private TextView tv_content; + private TextView tv_ismore; + private ImageView iv_reward; + private ListViewForScrollView lv_reply; + private TextView tv_reply_amount; + private LinearLayout ll_amounts; + private LinearLayout ll_root; + private View view_line; + private EditText et_comment; + private TextView tv_sure; + private ScrollView scroll_et;//只是为了通过他的变化配合来说明otherid是否为空 + //屏幕高度 + private int screenHeight = 0; + //软件盘弹起后所占高度阀值 + private int keyHeight = 0; + /** + * 数据 + */ + private String commentid; + private String userid; + private String replys;//回复数 + private List mList; + private List mAddList; + private int pageindex = 0; + private int pagesize = 10; + private String otherid = ""; + private String rewardPersonId = ""; + private QaDetailAnswerModel preQaModel; + /** + * 工具 + */ + private final OkHttpUtil okHttpUtil = OkHttpUtil.getInstance(); + private boolean isshow = true; + private AnswerReplyAdapter adapter; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_question_reply); + //获取屏幕高度 + screenHeight = getWindowManager().getDefaultDisplay().getHeight(); + //阀值设置为屏幕高度的1/3 + keyHeight = screenHeight/3; + getDataFromSpAndPrePage(); + initView(); + initAnswerDetail(); + mAddList = new ArrayList<>(); + adapter = new AnswerReplyAdapter(this); + lv_reply.setAdapter(adapter); + initAnswerReplyList(); + setEvents(); +// int height = scroll_et.getHeight(); + } + + private void initView() { + tvTitle = (TextView) findViewById(R.id.tvTitle); + ivBack = (ImageView) findViewById(R.id.img_leftBtn); + tvTitle.setText("回答详情"); + ivBack.setVisibility(View.VISIBLE); + scroll_reply = (BottomScrollView) findViewById(R.id.scroll_reply); + iv_avatar = (ImageView) findViewById(R.id.iv_avatar); + tv_nikename = (TextView) findViewById(R.id.tv_nikename); + tv_questiontime = (TextView) findViewById(R.id.tv_questiontime); + tv_title = (TextView) findViewById(R.id.tv_title); + tv_content = (TextView) findViewById(R.id.tv_content); + tv_ismore = (TextView) findViewById(R.id.tv_ismore); + tv_reply_amount = (TextView) findViewById(R.id.tv_reply_amount); + tv_sure = (TextView) findViewById(R.id.tv_sure); + et_comment = (EditText) findViewById(R.id.et_comment); + iv_reward = (ImageView) findViewById(R.id.iv_reward); + lv_reply = (ListViewForScrollView) findViewById(R.id.lv_reply); + ll_amounts = (LinearLayout) findViewById(R.id.ll_amounts); + ll_root = (LinearLayout) findViewById(R.id.ll_root); + view_line = findViewById(R.id.view_line); + scroll_et = (ScrollView) findViewById(R.id.scroll_et); + } + + private void getDataFromSpAndPrePage() { + SharedPreferences sp = getSharedPreferences("elove",MODE_PRIVATE); + userid = sp.getString("userid",""); + commentid = getIntent().getStringExtra("id"); + preQaModel = (QaDetailAnswerModel) getIntent().getSerializableExtra("model"); + } + + private void setEvents() { + ivBack.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if(preQaModel!=null){ + Intent backIntent = new Intent(); + backIntent.putExtra("newmodel",preQaModel); + setResult(0x12,backIntent); + } + finish(); + } + }); + scroll_reply.setOnScrollToBottomLintener(new BottomScrollView.OnScrollToBottomListener() { + @Override + public void onScrollBottomListener(boolean isBottom) { + if(isBottom){ + ++pageindex; + isshow = false; + tv_ismore.setText("加载更多评论..."); + initAnswerReplyList(); + } + } + }); + iv_reward.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + rewardThisAnswer();//打赏 + } + }); + tv_sure.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + replyAnswerOrReply(); + } + }); + + adapter.setOnAnswerListener(new AnswerReplyAdapter.AnswerListener() { + @Override + public void onAnswerClick(View view, int position) { + et_comment.setFocusable(true); + InputMethodManager imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE); + imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS); + QaReplyEachotherModel model = mAddList.get(position); + otherid = model.getReplyid(); + } + }); + ll_root.addOnLayoutChangeListener(this); + } + + /** + * 回复当前评论 + * 或者 + * 回复其他人的回复(在这里通过adapter中监听回复他人的回复) + */ + private void replyAnswerOrReply() { + String commentUrl = Constant.COMMON_URL + Interface.REPLY_ANSWER_REPLY; + String comment = et_comment.getText().toString().trim(); + if(JqStrUtil.isEmpty(comment)){ + JqStrUtil.showToast(this,"请先输入评论~"); + return; + } + JSONObject obj = new JSONObject(); + obj.put("userid",userid); + obj.put("commentid",commentid); + obj.put("otherid",otherid); + obj.put("version",Constant.VERSION); + obj.put("comment",comment); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, true, commentUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if("1".equals(rsCode)){ + otherid = "";//每次评论结束都要将otherid重新赋值为空,防止下次评论出错(因为都是要在同一个输入框中回复评论或者其他人的回复) + et_comment.setText(""); + replys = String.valueOf(Integer.parseInt(replys)+1);//评论成功加一 + tv_reply_amount.setText(replys); + if(preQaModel!=null){ + preQaModel.setReplynum(replys); + } + String result = jsonObject.getString("message"); + QaReplyEachotherModel model = JSON.parseObject(result,QaReplyEachotherModel.class); + mAddList.add(0,model); + if(mAddList.isEmpty()){ + ll_amounts.setVisibility(View.GONE); + view_line.setVisibility(View.GONE); + lv_reply.setVisibility(View.GONE); + tv_ismore.setVisibility(View.GONE); + }else{ + ll_amounts.setVisibility(View.VISIBLE); + view_line.setVisibility(View.VISIBLE); + lv_reply.setVisibility(View.VISIBLE); + tv_ismore.setVisibility(View.VISIBLE); + adapter.updateListView(mAddList); + } + }else{ + JqStrUtil.showToast(QuestionReplyActivity.this,explanation); + } + } + },null); + } + + /** + * 打赏 + */ + private void rewardThisAnswer() { + if(!JqStrUtil.isEmpty(userid)&&userid.equals(rewardPersonId)){ + JqStrUtil.showToast(this,"不能打赏自己"); + return; + } + Intent intent = new Intent(this,RewardActivity.class); + intent.putExtra("otherid",rewardPersonId); + intent.putExtra("type","2");//问答 + intent.putExtra("titleid",commentid); + if(preQaModel!=null){ + intent.putExtra("model",preQaModel); + } + startActivityForResult(intent,0x04); + } + + /** + * 回答的相关内容 + */ + private void initAnswerDetail() { + String answerDetailUrl = Constant.COMMON_URL + Interface.QA_REPLY_DETAIL; + JSONObject obj = new JSONObject(); + obj.put("userid",userid); + obj.put("commentid",commentid); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, false, answerDetailUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if("1".equals(rsCode)){ + String result = jsonObject.getString("message"); + if(JqStrUtil.isEmpty(result)||"{}".equals(result)){ + JqStrUtil.showToast(QuestionReplyActivity.this,"此解答已被删除"); + } + QaDetailAnswerModel model = JSON.parseObject(result,QaDetailAnswerModel.class); + rewardPersonId = model.getUserid(); + setAnswerData2View(model); + }else{ + JqStrUtil.showToast(QuestionReplyActivity.this,explanation); + } + } + },null); + } + + private void setAnswerData2View(QaDetailAnswerModel model) { + EasyGlide.getInstance().showImageCircle(model.getAvatar(),iv_avatar); + tv_nikename.setText(model.getUsername()); + tv_questiontime.setText(model.getCommenttime()); + tv_title.setText(model.getTitle()); + tv_content.setText(model.getComment()); + } + + /** + * 回答的回复列表 + */ + private void initAnswerReplyList() { + String answerReplyUrl = Constant.COMMON_URL + Interface.QA_REPLY_LIST; + JSONObject obj = new JSONObject(); + obj.put("userid",userid); + obj.put("commentid",commentid); + obj.put("pageindex",pageindex); + obj.put("pagesize",pagesize); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, isshow, answerReplyUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + replys = jsonObject.getString("totalnum"); + tv_reply_amount.setText(replys); + if("1".equals(rsCode)){ + String result = jsonObject.getString("replylist"); + mList = JSON.parseArray(result,QaReplyEachotherModel.class); + mAddList.addAll(mList); + if(mAddList.isEmpty()){ + ll_amounts.setVisibility(View.GONE); + view_line.setVisibility(View.GONE); + lv_reply.setVisibility(View.GONE); + tv_ismore.setVisibility(View.GONE); + }else{ + ll_amounts.setVisibility(View.VISIBLE); + view_line.setVisibility(View.VISIBLE); + lv_reply.setVisibility(View.VISIBLE); + tv_ismore.setVisibility(View.VISIBLE); + adapter.updateListView(mAddList); + } + if(mList.isEmpty()&&!mAddList.isEmpty()){ + tv_ismore.setText("暂无更多评论"); + } + }else{ + JqStrUtil.showToast(QuestionReplyActivity.this,explanation); + } + } + },null); + } + + @Override + public void onLayoutChange(View view, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { + //old是改变前的左上右下坐标点值,没有old的是改变后的左上右下坐标点值 + //现在认为只要控件将Activity向上推的高度超过了1/3屏幕高,就认为软键盘弹起 + if(oldBottom != 0 && bottom != 0 &&(oldBottom - bottom > keyHeight)){ +// JqStrUtil.showToast(this, "监听到软键盘弹起..."); + }else if(oldBottom != 0 && bottom != 0 &&(bottom - oldBottom > keyHeight)){ +// JqStrUtil.showToast(this, "监听到软件盘关闭..."); + otherid = ""; + } + } + + /** + * 点击返回键||点击返回上一页按钮 + * 将本页得到的更新数据(或者评论或者打赏传递给上一页) + */ + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if(keyCode==KeyEvent.KEYCODE_BACK&&event.getRepeatCount()==0&&preQaModel!=null){ + Intent backIntent = new Intent(); + backIntent.putExtra("newmodel",preQaModel); + setResult(0x12,backIntent); + finish(); + return true; + } + return super.onKeyDown(keyCode, event); + } + + /** + * 本页面是最后一层 + * 接受打赏结束后更新的model,用于传递给上一层的页面中,用于更新回复列表中打赏的次数 + */ + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if(requestCode==0x04&&resultCode==0x12){ + QaDetailAnswerModel model = (QaDetailAnswerModel) data.getSerializableExtra("newmodel"); + if(model!=null){ + preQaModel.setRewards(model.getRewards()); + } + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/RealNameAuthActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/RealNameAuthActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..8cef46e3629884d0f1429fea6437c50221e7d6c6 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/RealNameAuthActivity.java @@ -0,0 +1,591 @@ +package com.jiuqi.elove.activity; + +import android.Manifest; +import android.app.Activity; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.pm.PackageManager; +import android.content.res.Resources; +import android.database.Cursor; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.net.Uri; +import android.os.Bundle; +import android.provider.MediaStore; +import android.support.annotation.NonNull; +import android.support.v4.app.ActivityCompat; +import android.support.v4.content.ContextCompat; +import android.util.DisplayMetrics; +import android.view.View; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.alibaba.fastjson.JSONObject; +import com.alibaba.sdk.android.oss.common.utils.BinaryUtil; +import com.baoyz.actionsheet.ActionSheet; +import com.bumptech.glide.Glide; +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.common.JqBaseActivity; +import com.jiuqi.elove.common.PermissionListener; +import com.jiuqi.elove.entity.AuthAllModel; +import com.jiuqi.elove.util.CommonUtil; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.MediaType; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; + +public class RealNameAuthActivity extends JqBaseActivity implements View.OnClickListener,ActionSheet.ActionSheetListener{ + + /** + * 控件 + */ + private RelativeLayout rl_idcard_bg; + private TextView tvDemo; + private ImageView ivClose; + private TextView tvTitle; + private EditText et_name; + private EditText et_idcard; + private TextView tv_submit; + private TextView tv_modify; + private RelativeLayout rl_demo; + private ImageView iv_demo; + private ImageView iv_idcard; + private TextView tv_prompt; + /** + * 数据 + */ + private static final int PHOTO_REQUEST_GALLERY = 0x02;// 从相册中选择 + private String dirPath = ""; + private String md5 = ""; + private String idImg = "";//待上传的证件照路径 + private String userId; + private String flag;//用于判断上个页面是点击的实名认证还是企业认证 + private int size; + private AuthAllModel model; + private boolean ismodify = false; + private String pre; + + /** + * 工具 + */ + private SharedPreferences.Editor editor; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_real_name_auth); + getDataFromSpAndPrePage(); + initView(); + initData2View(); + setEvents(); + } + + private void getDataFromSpAndPrePage() { + SharedPreferences sp = getSharedPreferences("elove",MODE_PRIVATE); + editor = sp.edit(); + editor.apply(); + userId = sp.getString("userid",""); + flag = getIntent().getStringExtra("flag"); + model = (AuthAllModel) getIntent().getSerializableExtra("model"); + pre = getIntent().getStringExtra("pre"); + } + + private void initView() { + tvDemo = easyFind(R.id.tvback); + tvDemo.setText("示例"); + tvDemo.setVisibility(View.VISIBLE); + ivClose = easyFind(R.id.img_rightBtn); + ivClose.setImageResource(R.drawable.icon_delete); + ivClose.setVisibility(View.VISIBLE); + tvTitle = easyFind(R.id.tvTitle); + rl_idcard_bg = easyFind(R.id.rl_idcard_bg); + rl_idcard_bg.setLayoutParams(getMyBgLayout()); + et_name = easyFind(R.id.et_name); + et_idcard = easyFind(R.id.et_idcard); + tv_submit = easyFind(R.id.tv_submit); + tv_modify = easyFind(R.id.tv_modify); + rl_demo = easyFind(R.id.rl_demo); + iv_idcard = easyFind(R.id.iv_idcard); + iv_demo = easyFind(R.id.iv_demo); + tv_prompt = easyFind(R.id.tv_prompt); + iv_demo.setLayoutParams(getMyDemoLayout()); + iv_demo.setScaleType(ImageView.ScaleType.FIT_XY); + if("name".equals(flag)){ + iv_demo.setImageResource(R.drawable.icon_idcard); + tvTitle.setText("实名认证"); + et_idcard.setHint("请输入身份证号码"); + tv_modify.setVisibility(View.GONE); + }else{ + iv_demo.setImageResource(R.drawable.work_card_rz); + tvTitle.setText("企业认证"); + et_idcard.setHint("请输入企业(公司)全称"); + tv_modify.setVisibility(View.GONE); + } + } + + /** + * 如果有正在审核的或者审核通过的数据给其显示 + */ + private void initData2View() { + if(model!=null){ + if("name".equals(flag)){//实名认证入口 + nameModel2View(); + }else{//企业认证入口 + enter2View(); + } + }else{//如果model是null,则为编辑信息第一次编辑 + if("edit".equals(pre)){ + getKind(); + } + } + } + + /** + * 编辑个人信息时每次都是网络获取,个人信息页面并未返回企业信息 + */ + private void getKind() { + String authlistUrl = Constant.COMMON_URL + Interface.AUTH_STATUS_LIST; + JSONObject obj = new JSONObject(); + obj.put("userid",userId); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, true, authlistUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + if(jsonObject!=null){ + String rsCode = jsonObject.getString("retcode"); + if("1".equals(rsCode)){ + String result = jsonObject.getString("message"); + model = JSONObject.parseObject(result,AuthAllModel.class); + enter2View();//根据网络获取到的信息改变UI + } + } + } + },null); + } + + private void setEvents() { + tvDemo.setOnClickListener(this); + ivClose.setOnClickListener(this); + tv_submit.setOnClickListener(this); + rl_demo.setOnClickListener(this); + rl_idcard_bg.setOnClickListener(this); + tv_modify.setOnClickListener(this); + } + + /** + * 企业认证通过后重新修改的方法 + */ + private void setEnableSubmit(){ + et_name.setEnabled(true); + et_idcard.setEnabled(true); + rl_idcard_bg.setEnabled(true); + tv_modify.setVisibility(View.GONE); + tv_submit.setVisibility(View.VISIBLE); + ismodify = true;//将重新修改标志位置为true + } + + /** + * 实名认证 + * model---view + */ + private void nameModel2View(){ + String name = model.getName().trim(); + if(Constant.NAME_IS.equals(model.getIdcardtype())||Constant.NAME_ING.equals(model.getIdcardtype())){//认证通过或者认证中 + String idcard = model.getIdcard().trim(); + if(!JqStrUtil.isEmpty(model.getIdcardphoto())){ + iv_idcard.setLayoutParams(getMyIdLayout()); + iv_idcard.setScaleType(ImageView.ScaleType.FIT_XY); + Glide.with(this).load(model.getIdcardphoto()).into(iv_idcard); + rl_idcard_bg.setEnabled(false); + } + if(!JqStrUtil.isEmpty(name)){ + et_name.setText(name); + et_name.setSelection(name.length()); + et_name.setEnabled(false); + } + if(!JqStrUtil.isEmpty(idcard)){ + et_idcard.setText(idcard); + et_idcard.setSelection(idcard.length()); + et_idcard.setEnabled(false); + } + if(Constant.NAME_IS.equals(model.getIdcardtype())){ + tv_prompt.setVisibility(View.GONE); + }else{ + tv_prompt.setVisibility(View.VISIBLE); + } + tv_submit.setVisibility(View.GONE); + }else{//未进行认证或者认证失败,但是名字可能通过其他认证方式已经存在了 + if(!JqStrUtil.isEmpty(name)){ + et_name.setText(name); + et_name.setSelection(name.length()); + } + } + } + + /** + * 企业认证 + * company---view + */ + private void enter2View(){ + String name = model.getName().trim(); + if(Constant.E_KIND_IS.equals(model.getKind())||Constant.E_KIND_ING.equals(model.getKind())){//企业认证通过或者认证中 + String company = model.getEnterprise().trim(); + if(!JqStrUtil.isEmpty(model.getCardphoto())){ + iv_idcard.setLayoutParams(getMyIdLayout()); + iv_idcard.setScaleType(ImageView.ScaleType.FIT_XY); + Glide.with(this).load(model.getCardphoto()).into(iv_idcard); + rl_idcard_bg.setEnabled(false); + } + if(!JqStrUtil.isEmpty(name)){ + et_name.setText(name); + et_name.setSelection(name.length()); + et_name.setEnabled(false); + } + if(!JqStrUtil.isEmpty(company)){ + et_idcard.setText(company); + et_idcard.setSelection(company.length()); + et_idcard.setEnabled(false); + } + tv_submit.setVisibility(View.GONE); + if(Constant.E_KIND_IS.equals(model.getKind())){//企业认证通过的特殊处理 + tv_prompt.setVisibility(View.GONE); + tv_modify.setVisibility(View.VISIBLE); + }else{//企业认证审核中的特殊处理 + tv_prompt.setVisibility(View.VISIBLE); + tv_modify.setVisibility(View.GONE); + } + }else{//未进行企业认证或者通过其他认证方式已经存在姓名 + if(!JqStrUtil.isEmpty(name)){ + et_name.setText(name); + et_name.setSelection(name.length()); + } + } + } + + /** + * 提交企业审核后执行 + */ + private void hideEnableSubmit(){ + rl_idcard_bg.setEnabled(false); + et_name.setEnabled(false); + et_idcard.setEnabled(false); + tv_submit.setVisibility(View.GONE); + tv_prompt.setVisibility(View.VISIBLE); + } + + @Override + public void onClick(View view) { + switch (view.getId()){ + case R.id.img_rightBtn: + finish(); + break; + case R.id.tv_submit: + if(!JqStrUtil.isEmpty(dirPath)){ + uploadPerPicMethod(); + }else{ + if(ismodify){//是否为企业认证通过后再次修改提交 + JqStrUtil.showToast(this,"请重新上传证件照"); + }else{ + JqStrUtil.showToast(this,"请上传证件照"); + } + } + break; + case R.id.tv_modify: + setEnableSubmit(); + break; + case R.id.rl_demo: + hideDemo(); + break; + case R.id.tvback: + showDemo(); + break; + case R.id.rl_idcard_bg: + if("name".equals(flag)){ + if(!Constant.NAME_IS.equals(model.getIdcardtype())&&!Constant.NAME_ING.equals(model.getIdcardtype())){ + checkPermissionAndShow(); + } + }else{ + if(!Constant.E_KIND_ING.equals(model.getKind())) {//审核通过企业审核是可以重新提交审核的,但是如果审核通过不点击修改,则不应该能够重新上传证件照 + checkPermissionAndShow(); + }else if(JqStrUtil.isEmpty(model.getCardphoto())){ + checkPermissionAndShow(); + } + } + break; + default: + break; + } + } + + /** + * 显示demo + */ + private void showDemo() { + rl_demo.setVisibility(View.VISIBLE); + } + + /** + * 隐藏示例 + */ + private void hideDemo() { + rl_demo.setVisibility(View.GONE); + } + + /** + * 提交实名认证信息 + */ + private void submitIdCardAuth() { + String nameAuthUrl = Constant.COMMON_URL + Interface.AUTHENTICATE_PHOTO; + String name = et_name.getText().toString().trim(); + String idcard = et_idcard.getText().toString().trim(); + if(!JqStrUtil.isChinese(name)){ + JqStrUtil.showToast(this,"请输入不多于4位的中文名字"); + return; + } + JSONObject obj = new JSONObject(); + if("name".equals(flag)){ + if(!JqStrUtil.is18Idcard(idcard)){ + JqStrUtil.showToast(this,"请输入合法的身份证号"); + return; + } + obj.put("action",6); + obj.put("idcard",idcard); + }else{ + if(JqStrUtil.isEmpty(idcard)){ + JqStrUtil.showToast(this,"请输入公司名称"); + return; + } + obj.put("md5", md5); + obj.put("size", size); + obj.put("action", 1);//1、工作照2、名片照 + obj.put("e_name",idcard); + } + obj.put("name",name); + obj.put("path",idImg); + obj.put("userID",userId); + obj.put("version",Constant.VERSION); + String params = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, true, nameAuthUrl, params, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if("1".equals(rsCode)){ + hideEnableSubmit(); + }else{ + JqStrUtil.showToast(RealNameAuthActivity.this,explanation); + } + } + },null); + } + + private void checkPermissionAndShow() { + List permissionList = new ArrayList<>(); + if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { + permissionList.add(Manifest.permission.CAMERA); + } + if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { + permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); + } + if (!permissionList.isEmpty()) { + requestRuntimePermission(permissionList.toArray(new String[permissionList.size()]), new PermissionListener() { + @Override + public void onGranted() { + showActionSheet(); + } + + @Override + public void onDenied(List deniedPermission) { + + } + }); + } else { + showActionSheet(); + } + + } + + /** + * 弹出框展现和消失 + */ + public void showActionSheet() { + setTheme(R.style.ActionSheetStyleiOS7); + ActionSheet.createBuilder(this, getSupportFragmentManager()) + .setCancelButtonTitle("取消") + .setOtherButtonTitles("相册") + .setCancelableOnTouchOutside(true).setListener(this).show(); + } + public void onDismiss(ActionSheet actionSheet, boolean isCancel) { + + } + + + /** + * 选择调用系统相机和相册方式来上传图片 + * @param actionSheet + * @param index + */ + @Override + public void onOtherButtonClick(ActionSheet actionSheet, int index) { + switch (index) { + case 0: + Intent intentPhoto = new Intent(Intent.ACTION_PICK, null); + intentPhoto.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); + startActivityForResult(intentPhoto,PHOTO_REQUEST_GALLERY); + break; + default: + break; + } + } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if(resultCode== Activity.RESULT_OK){ + switch (requestCode){ + case PHOTO_REQUEST_GALLERY:// 当选择从本地获取图片时 + if (data != null) { + Uri uri = data.getData(); + if (!JqStrUtil.isEmpty(uri.getAuthority())) { + Cursor cursor = getContentResolver().query(uri, + new String[] { MediaStore.Images.Media.DATA }, + null, null, null); + if (null == cursor) { + JqStrUtil.showToast(this,"图片没找到"); + return; + } + cursor.moveToFirst(); + dirPath = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA)); + cursor.close(); + iv_idcard.setLayoutParams(getMyIdLayout()); + iv_idcard.setScaleType(ImageView.ScaleType.FIT_XY); + Glide.with(this).load(dirPath).into(iv_idcard); + } + } + break; + default: + break; + } + } + } + + /** + * 上传图片的方法入口 + */ + private void uploadPerPicMethod() { + String aliUrl = Constant.COMMON_URL + Interface.GET_ALIYUN; + Bitmap photo = BitmapFactory.decodeFile(dirPath); + JSONObject obj = new JSONObject(); + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + photo.compress(Bitmap.CompressFormat.JPEG, 80, bos); + size = bos.size(); + try { + md5 = BinaryUtil.calculateBase64Md5(dirPath); + bos.flush(); + bos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + final byte[] bytes = bos.toByteArray(); + obj.put("md5",md5); + obj.put("size",size); + obj.put("version", Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this,true,aliUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + if ("1".equals(rsCode)) { + final String putaliUrl = jsonObject.getString("url");//put阿里云的路径 + idImg = jsonObject.getString("key");//调用接口时的filePath + new Runnable(){ + @Override + public void run() { + try { + put(MediaType.parse(""), putaliUrl, bytes);//上传到阿里云地址下 + } catch (IOException e) { + e.printStackTrace(); + } + } + }.run(); + + }else if("0".equals(rsCode)){//文件已存在,无需上传到阿里云服务器 + idImg = jsonObject.getString("key");//调用接口时的filePath + submitIdCardAuth(); + } + } + },null); + } + + /** + * put请求上传图片到阿里云相应地址下 + */ + public void put(MediaType mediaType, String uploadUrl, byte[] bytes) throws IOException { + OkHttpClient client = new OkHttpClient(); + RequestBody body = RequestBody.create(mediaType, bytes); + Request request = new Request.Builder().url(uploadUrl).put(body).build(); + client.newCall(request).enqueue(new Callback() { + @Override + public void onFailure(Call call, IOException e) { + + } + @Override + public void onResponse(Call call, Response response) throws IOException { + runOnUiThread(new Runnable() { + @Override + public void run() { + submitIdCardAuth(); + } + }); + } + }); + } + + private RelativeLayout.LayoutParams getMyBgLayout(){ + Resources resources = getResources(); + DisplayMetrics dm = resources.getDisplayMetrics(); + int width = dm.widthPixels- CommonUtil.dip2px(this,32); + int height = width * 3 / 5; + RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(width,height); + params.setMargins(CommonUtil.dip2px(this,16),CommonUtil.dip2px(this,10),CommonUtil.dip2px(this,16),CommonUtil.dip2px(this,10)); + params.addRule(RelativeLayout.BELOW,R.id.title_bar); + return params; + } + + private RelativeLayout.LayoutParams getMyIdLayout(){ + Resources resources = getResources(); + DisplayMetrics dm = resources.getDisplayMetrics(); + int width = dm.widthPixels- CommonUtil.dip2px(this,38); + int height = width * 3 / 5; + RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(width,height); + params.addRule(RelativeLayout.CENTER_IN_PARENT); +// params.setMargins(CommonUtil.dip2px(this,16),CommonUtil.dip2px(this,10),CommonUtil.dip2px(this,16),CommonUtil.dip2px(this,10)); + return params; + } + + private RelativeLayout.LayoutParams getMyDemoLayout(){ + Resources resources = getResources(); + DisplayMetrics dm = resources.getDisplayMetrics(); + int width = dm.widthPixels- CommonUtil.dip2px(this,34); + int height = width * 3 / 5; + RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(width,height); + params.setMargins(CommonUtil.dip2px(this,16),CommonUtil.dip2px(this,80),CommonUtil.dip2px(this,16),CommonUtil.dip2px(this,10)); + return params; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/RecentMsgActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/RecentMsgActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..9f205ca6fb55166d13c3ba82942b23d8dfda0ca2 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/RecentMsgActivity.java @@ -0,0 +1,36 @@ +package com.jiuqi.elove.activity; + +import android.os.Bundle; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.JqBaseActivity; +import com.jiuqi.elove.fragment.RecentMessageFragment; + +public class RecentMsgActivity extends JqBaseActivity { + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_recent_msg); + initView(); + } + + private void initView() { + TextView tvTitle = easyFind(R.id.tvTitle); + tvTitle.setText("聊天"); + ImageView imgBack = easyFind(R.id.img_leftBtn); + imgBack.setVisibility(View.VISIBLE); + imgBack.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + finish(); + } + }); + RecentMessageFragment recentMessageFragment = new RecentMessageFragment(); + getSupportFragmentManager().beginTransaction().add(R.id.container, recentMessageFragment).commit(); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/RedbeanListActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/RedbeanListActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..78198fe317fddc976c093d385970b78625f169f0 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/RedbeanListActivity.java @@ -0,0 +1,147 @@ +package com.jiuqi.elove.activity; + +import android.app.Activity; +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.View; +import android.view.Window; +import android.widget.ImageView; +import android.widget.TextView; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.jiuqi.elove.R; +import com.jiuqi.elove.adapter.RedBeanConsumAdapter; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.entity.ConsumeRedbeanModel; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; + +import java.util.List; + +public class RedbeanListActivity extends Activity { + + /** + * 控件 + */ + private TextView tvTitle; + private ImageView imgLeft; + private TextView tv_recharge; + private TextView tv_redbean_count; + private RecyclerView recyclerView;//红豆消费记录 + /** + * 数据 + */ + private String userid; + private List mList; + private RedBeanConsumAdapter adapter; + /** + * 工具类 + */ + private final OkHttpUtil okHttpUtil = OkHttpUtil.getInstance(); + public static RedbeanListActivity instance; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + requestWindowFeature(Window.FEATURE_NO_TITLE); + setContentView(R.layout.activity_redbean_list); + instance = this; + getDataFromSp();//从缓存中获取userid + initView(); + setEvents(); + } + + private void getDataFromSp() { + userid = SpUtils.getString(Constant.USER_ID); + } + + private void initView() { + tvTitle = (TextView) findViewById(R.id.tvTitle); + imgLeft = (ImageView) findViewById(R.id.img_leftBtn); + tv_recharge = (TextView) findViewById(R.id.tv_recharge); + tv_redbean_count = (TextView) findViewById(R.id.tv_redbean_count); + tvTitle.setText("元宝清单"); + imgLeft.setVisibility(View.VISIBLE); + recyclerView = (RecyclerView) findViewById(R.id.rv_redbean_view); + } + + private void setEvents() { + imgLeft.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + finish(); + } + }); + tv_recharge.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Intent intent = new Intent(RedbeanListActivity.this,PayForRedbeanActivity.class); + startActivity(intent); + } + }); + } + + private void initData2View() { + String redbeanListUrl = Constant.COMMON_URL + Interface.REDBEAN_LIST; + JSONObject obj = new JSONObject(); + obj.put("userid",userid); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(RedbeanListActivity.this, true, redbeanListUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + String details = jsonObject.getString("details"); + if("1".equals(rsCode)){ + JSONObject rsObj = JSON.parseObject(details); + String beannum = rsObj.getString("beannum"); + String redbeanlistStr = rsObj.getString("consumerlist"); + mList = JSONArray.parseArray(redbeanlistStr,ConsumeRedbeanModel.class); + setData2View(beannum,mList); + }else{ + JqStrUtil.showToast(RedbeanListActivity.this,explanation); + } + } + },null); + } + + private void setData2View(String beannum, List mList) { + if(JqStrUtil.isEmpty(beannum)){ + tv_redbean_count.setText("0个"); + }else{ + tv_redbean_count.setText(beannum+"个"); + } + if(mList!=null&&mList.size()>0){ + RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(RedbeanListActivity.this); + recyclerView.setLayoutManager(layoutManager); + adapter = new RedBeanConsumAdapter(mList,RedbeanListActivity.this); +// adapter.setOnRecyclerViewListener(this); + recyclerView.setAdapter(adapter); + } + } + + @Override + protected void onResume() { + super.onResume(); + initData2View(); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + if(instance!=null){ + instance = null; + } + } + + public void refresh(){ + initData2View(); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/RegisterActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/RegisterActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..217b8d116b087823aa84b2633805da5352618be1 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/RegisterActivity.java @@ -0,0 +1,197 @@ +package com.jiuqi.elove.activity; + +import android.content.Intent; +import android.os.Bundle; +import android.support.v4.content.ContextCompat; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.bigkoo.pickerview.OptionsPickerView; +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.CommonDataUtil; +import com.jiuqi.elove.entity.ConditionBean; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.PickerUtil; + +import butterknife.BindView; +import butterknife.OnClick; + +/** + * + * Created by dl on 2016/6/28. + */ +public class RegisterActivity extends ABaseActivity{ + + @BindView(R.id.tv_provisions) + TextView tv_provisions; + @BindView(R.id.tv_sex) + TextView tv_sex; + @BindView(R.id.et_mobile_login) + EditText etmobile; + @BindView(R.id.et_pwd_login) + EditText etpassword; + @BindView(R.id.tv_register) + TextView tv_register; + @BindView(R.id.tv_login) + TextView tv_login; + + private String mobile; + private String password; + private String sex; + + + private String thirdID = "";//通过第三方注册时会有此id从上个页面传来,否则为空 + private String thirdType = "";//1微信 2qq 3微博 + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_register,"",-1,R.drawable.icon_close,HEIGHT_IS_DARK); + initView(); + initData(); + getSharedPreferenceDb(); + initEvents(); + } + + private void initData() { + CommonDataUtil.setSexList();//设置性别 + } + + private void initEvents() { + TextWatcher wather = new MyTextWatcher(); + etmobile.addTextChangedListener(wather); + etpassword.addTextChangedListener(wather); + tv_sex.addTextChangedListener(wather); + } + + /** + * 改变ui + */ + private void initView() { + toolbar.setBackgroundColor(ContextCompat.getColor(this,R.color.white)); + } + + private void getSharedPreferenceDb(){ + Intent intent = getIntent(); + thirdID = intent.getStringExtra("thirdid"); + thirdType = intent.getStringExtra("thirdType"); + } + + + @OnClick({R.id.tv_register,R.id.tv_provisions,R.id.tv_login,R.id.tv_sex}) + public void onClick(View view) { + switch (view.getId()){ + case R.id.tv_register://注册跳转验证码 + startVerifyCode(); + break; + case R.id.tv_provisions://注册条款 + startProvision(); + break; + case R.id.tv_login://进入登录页面 + startLoginPage(); + break; + case R.id.tv_sex://选择性别 + showSelectSex(); + break; + default: + break; + } + } + + /** + * 选择性别 + */ + private void showSelectSex() { + new PickerUtil(this).setCreateOptionPicker("选择性别", new OptionsPickerView.OnOptionsSelectListener() { + @Override + public void onOptionsSelect(int options1, int options2, int options3, View v) { + ConditionBean bean = CommonDataUtil.mSexList.get(options1); + sex = bean.getCode(); + String msg = bean.getMsg(); + tv_sex.setText(msg); + } + }).setData(CommonDataUtil.mSexList).show(); + } + + + private class MyTextWatcher implements TextWatcher { + + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + if(!TextUtils.isEmpty(etmobile.getText().toString().trim())&&!TextUtils.isEmpty(etpassword.getText().toString().trim())&&!TextUtils.isEmpty(tv_sex.getText().toString().trim())){ + tv_register.setBackground(ContextCompat.getDrawable(RegisterActivity.this,R.drawable.text_login_register_bg)); + }else{ + tv_register.setBackground(ContextCompat.getDrawable(RegisterActivity.this,R.drawable.text_login_register_un_bg)); + } + } + } + + /** + * 进入获取验证码的页面 + */ + private void startVerifyCode() { + mobile = etmobile.getText().toString().trim(); + password = etpassword.getText().toString().trim(); + if(TextUtils.isEmpty(mobile)){ + showToast("请输入手机号"); + return; + } + if(!JqStrUtil.isMobileNo(mobile)){ + showToast("请输入合法的手机号"); + return; + } + if(TextUtils.isEmpty(password)){ + showToast("请输入密码"); + return; + } + if(password.length()<6||password.length()>18){ + showToast("请输入6-18位密码"); + return; + } + if(TextUtils.isEmpty(sex)){ + showToast("请选择性别"); + return; + } + Intent intent = new Intent(this,GetVerifyCodeActivity.class); + intent.putExtra("mobile",mobile); + intent.putExtra("pwd",password); + intent.putExtra("sex",sex); + intent.putExtra("flag","register"); + intent.putExtra("thirdid",thirdID); + intent.putExtra("thirdType",thirdType); + startActivity(intent); + } + + /** + * 重新进入登录页面 + */ + private void startLoginPage() { + Intent intent = new Intent(this,LoginActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + startActivity(intent); + } + + /** + * 进入注册条款 + */ + private void startProvision() { + Intent intent = new Intent(RegisterActivity.this,CommonH5Activity.class); + intent.putExtra("title","用户协议"); + startActivity(intent); + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/RegisterInfoActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/RegisterInfoActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..5627757071ed12eabb67fdd9b02c4cde63f587d5 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/RegisterInfoActivity.java @@ -0,0 +1,617 @@ +package com.jiuqi.elove.activity; + +import android.content.Context; +import android.content.Intent; +import android.graphics.drawable.ColorDrawable; +import android.os.Bundle; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.view.WindowManager; +import android.view.inputmethod.InputMethodManager; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.PopupWindow; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.alibaba.fastjson.JSONObject; +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.CommonDataUtil; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.common.JqBaseActivity; +import com.jiuqi.elove.entity.UserInfoModel; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.widget.OrigoPickerLayout; +import com.jiuqi.elove.widget.WheelView; +import com.jiuqi.elove.widget.timepicker.TimePickerView; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +public class RegisterInfoActivity extends JqBaseActivity implements View.OnClickListener{ + + /** + * 控件 + */ + private TextView tvTitle; + private ImageView imgBack; + private TextView tvNext; + private RelativeLayout rl_birth; + private RelativeLayout rl_sex; + private RelativeLayout rl_liveaddress;//居住地 + private RelativeLayout rl_height;//身高 + private RelativeLayout rl_degree;//学历 + private RelativeLayout rl_income; + private RelativeLayout rl_marriage; + private TextView tv_mynikeName;//昵称view + private TextView tv_sexStr;//性别view + private TextView tv_birthStr;//生日view + private TextView tv_addressStr;//所在地view + private TextView tv_myHeight;//身高view + private TextView tv_myDegree;//学历view + private TextView tv_mySalary;//收入view + private TextView tv_myMarriage;//婚姻view + private InputMethodManager manager; + + private View mview; + private OrigoPickerLayout origoPicker; + private TextView confirm_city; + private TextView cancel_city; + private LinearLayout ll_cityblank; + + private PopupWindow commonwindow; + private WheelView comWv; + private TextView cancel_common; + private TextView confirm_common; + private LinearLayout ll_blank; + + //时间选择滚轮 + private TimePickerView pvTime; + private long jugeTime; + /** + * 数据 + */ + private HashMap sexMap; + private ArrayList heightList; + private HashMap degreeMap; + private HashMap incomeMap; + private HashMap marriageMap; + private String nikeName; + private String sex;//0女1男 + private String birth; + private String liveaddress; + private String height; + private String degree; + private String income;//年收入 + private String marriage;//婚姻状况 + private String thirdID = "";//通过第三方注册时会有此id从上个页面传来,否则为空 + private String thirdType = "";//第三方type + private String prepage; + private UserInfoModel model; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_register_info); + getDataFromPrePage(); + initView(); + setData(); + setEvents(); + } + + /** + * 因为登录用户可能为微信端注册的用户 + * 需要其完善信息 + */ + private void getDataFromPrePage() { + Intent intent = getIntent(); + prepage = intent.getStringExtra("flag"); + model = (UserInfoModel) intent.getSerializableExtra("model"); + } + + private void initView() { + tvTitle = (TextView) findViewById(R.id.tvTitle); + tvNext = (TextView) findViewById(R.id.tv_next); + if("login".equals(prepage)){ + tvTitle.setText("完善信息"); + tvNext.setText("完成"); + }else{ + tvTitle.setText("注册"); + tvNext.setText("下一步"); + } + imgBack = (ImageView) findViewById(R.id.img_leftBtn); + imgBack.setVisibility(View.VISIBLE); + rl_liveaddress = (RelativeLayout) findViewById(R.id.rl_liveaddress); + rl_height = (RelativeLayout) findViewById(R.id.rl_height); + rl_degree = (RelativeLayout) findViewById(R.id.rl_degree); + rl_birth = (RelativeLayout) findViewById(R.id.rl_birth); + rl_income = (RelativeLayout) findViewById(R.id.rl_income); + rl_marriage = (RelativeLayout) findViewById(R.id.rl_marriage); + rl_sex = (RelativeLayout) findViewById(R.id.rl_sex); + + tv_mynikeName = (TextView) findViewById(R.id.tv_mynikeName); + tv_sexStr = (TextView) findViewById(R.id.tv_sexStr); + tv_birthStr = (TextView) findViewById(R.id.tv_birthStr); + tv_myHeight = (TextView) findViewById(R.id.tv_myHeight); + tv_addressStr = (TextView) findViewById(R.id.tv_addressStr); + tv_myDegree = (TextView) findViewById(R.id.tv_myDegree); + tv_mySalary = (TextView) findViewById(R.id.tv_mySalary); + tv_myMarriage = (TextView) findViewById(R.id.tv_myMarriage); + manager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); + if(model!=null){ + if(JqStrUtil.isEmpty(model.getNickname())){ + tv_mynikeName.setText(model.getNickname()); + } + if(JqStrUtil.isEmpty(model.getSex())){ + tv_sexStr.setText(CommonDataUtil.sexMap.get(model.getSex())); + } + } + } + + @Override + public boolean dispatchTouchEvent(MotionEvent ev) { + if (ev.getAction() == MotionEvent.ACTION_DOWN) { + View v = getCurrentFocus(); + if (isShouldHideInput(v, ev)) { + + InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); + if (imm != null) { + imm.hideSoftInputFromWindow(v.getWindowToken(), 0); + } + } + return super.dispatchTouchEvent(ev); + } + // 必不可少,否则所有的组件都不会有TouchEvent了 + if (getWindow().superDispatchTouchEvent(ev)) { + return true; + } + return onTouchEvent(ev); + } + + public boolean isShouldHideInput(View v, MotionEvent event) { + if (v != null && (v instanceof EditText)) { + int[] leftTop = { 0, 0 }; + //获取输入框当前的location位置 + v.getLocationInWindow(leftTop); + int left = leftTop[0]; + int top = leftTop[1]; + int bottom = top + v.getHeight(); + int right = left + v.getWidth(); + if (event.getX() > left && event.getX() < right + && event.getY() > top && event.getY() < bottom) { + // 点击的是输入框区域,保留点击EditText的事件 + return false; + } else { + return true; + } + } + return false; + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + // TODO Auto-generated method stub + if(event.getAction() == MotionEvent.ACTION_DOWN){ + if(getCurrentFocus()!=null && getCurrentFocus().getWindowToken()!=null){ + manager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); + } + } + return super.onTouchEvent(event); + } + + /** + * 设置所需要的信息数据 + */ + private void setData() { + CommonDataUtil.setHeightList(); + heightList = CommonDataUtil.heightList; + degreeMap = CommonDataUtil.degreeMap; + incomeMap = CommonDataUtil.incomeMap; + marriageMap = CommonDataUtil.marriageMap; + sexMap = CommonDataUtil.sexMap; + thirdID = getIntent().getStringExtra("thirdid"); + thirdType = getIntent().getStringExtra("thirdType"); + } + + private void setEvents() { + rl_liveaddress.setOnClickListener(this); + rl_height.setOnClickListener(this); + rl_degree.setOnClickListener(this); + rl_birth.setOnClickListener(this); + rl_income.setOnClickListener(this); + rl_marriage.setOnClickListener(this); + rl_sex.setOnClickListener(this); + imgBack.setOnClickListener(this); + tvNext.setOnClickListener(this); + } + + @Override + public void onClick(View view) { + switch (view.getId()){ + case R.id.rl_birth: + LayoutInflater birthinflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); + mview = birthinflater.inflate(R.layout.popupwindow_timeselect, null); + createTimePickWheel(tv_birthStr); + pvTime.show(); + break; + case R.id.rl_sex: + ArrayList sexList = new ArrayList<>(); + sexList.add(sexMap.get("0")); + sexList.add(sexMap.get("1")); + createSingleWheel(sexList); + confirm_common.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + String mcom = comWv.getSelectedText(); + Iterator iter = sexMap.entrySet().iterator(); + while(iter.hasNext()){ + Map.Entry entry = (Map.Entry) iter.next(); + if(mcom.equals(entry.getValue())){ + sex = (String)entry.getKey(); + } + } + commonwindow.dismiss(); + tv_sexStr.setText(mcom); + } + }); + break; + case R.id.rl_liveaddress://所在地 + createDoubleWheel(tv_addressStr); + break; + case R.id.rl_height://身高 + createSingleWheel(heightList); + confirm_common.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + String mcom = comWv.getSelectedText(); + height = mcom.substring(0,3); + commonwindow.dismiss(); + tv_myHeight.setText(mcom); + commonwindow = null; + } + }); + break; + case R.id.rl_degree://学历 + ArrayList degreeList = new ArrayList<>(); + degreeList.add(degreeMap.get("1")); + degreeList.add(degreeMap.get("2")); + degreeList.add(degreeMap.get("3")); + degreeList.add(degreeMap.get("4")); + degreeList.add(degreeMap.get("5")); + createSingleWheel(degreeList); + confirm_common.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + String mcom = comWv.getSelectedText(); + Iterator iter = degreeMap.entrySet().iterator(); + while(iter.hasNext()){ + Map.Entry entry = (Map.Entry) iter.next(); + if(mcom.equals(entry.getValue())){ + degree = (String)entry.getKey(); + } + } + commonwindow.dismiss(); + tv_myDegree.setText(mcom); + } + }); + break; + case R.id.rl_income://年收入 + ArrayList incomeList = new ArrayList<>(); + incomeList.add(incomeMap.get("1")); + incomeList.add(incomeMap.get("2")); + incomeList.add(incomeMap.get("3")); + incomeList.add(incomeMap.get("4")); + incomeList.add(incomeMap.get("5")); + incomeList.add(incomeMap.get("6")); + incomeList.add(incomeMap.get("7")); + createSingleWheel(incomeList); + confirm_common.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + String mcom = comWv.getSelectedText(); + Iterator iter = incomeMap.entrySet().iterator(); + while(iter.hasNext()){ + Map.Entry entry = (Map.Entry) iter.next(); + if(mcom.equals(entry.getValue())){ + income = (String)entry.getKey(); + } + } + commonwindow.dismiss(); + tv_mySalary.setText(mcom); + } + }); + break; + case R.id.rl_marriage://婚姻 + ArrayList marriageList = new ArrayList<>(); + marriageList.add(marriageMap.get("1")); + marriageList.add(marriageMap.get("2")); + marriageList.add(marriageMap.get("3")); + createSingleWheel(marriageList); + confirm_common.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + String mcom = comWv.getSelectedText(); + Iterator iter = marriageMap.entrySet().iterator(); + while(iter.hasNext()){ + Map.Entry entry = (Map.Entry) iter.next(); + if(mcom.equals(entry.getValue())){ + marriage = (String)entry.getKey(); + } + } + commonwindow.dismiss(); + tv_myMarriage.setText(mcom); + } + }); + break; + case R.id.img_leftBtn: + finish(); + break; + case R.id.tv_next: + startNextStep(); + default: + break; + } + } + + /** + * 点击下一步按钮事件 + */ + private void startNextStep() { + nikeName = tv_mynikeName.getText().toString().trim(); + birth = tv_birthStr.getText().toString().trim(); + liveaddress = tv_addressStr.getText().toString().trim(); + if(JqStrUtil.isEmpty(nikeName)){ + JqStrUtil.showToast(RegisterInfoActivity.this,getString(R.string.nikename_input_prompt)); + }else if(!JqStrUtil.isNikeName(nikeName)){ + JqStrUtil.showToast(RegisterInfoActivity.this,"昵称仅支持输入英文、汉字、数字及下划线"); + }else if(nikeName.length()>10){ + JqStrUtil.showToast(RegisterInfoActivity.this,"昵称请输入不多于10个字符"); + }else if(JqStrUtil.isEmpty(birth)){//生日 + JqStrUtil.showToast(RegisterInfoActivity.this,getString(R.string.birthday_select_prompt)); + }else if(!isMore18(jugeTime)){ + JqStrUtil.showToast(RegisterInfoActivity.this,getString(R.string.birthday_select_more_prompt)); + }else if(JqStrUtil.isEmpty(sexMap.get(sex))){//性别 + JqStrUtil.showToast(RegisterInfoActivity.this,getString(R.string.sex_select_prompt)); + }else if(JqStrUtil.isEmpty(liveaddress)){//工作地 + JqStrUtil.showToast(RegisterInfoActivity.this,getString(R.string.live_address_select_prompt)); + }else if(JqStrUtil.isEmpty(height)){//身高 + JqStrUtil.showToast(RegisterInfoActivity.this,getString(R.string.body_height_select_prompt)); + }else if(JqStrUtil.isEmpty(degree)){//学历 + JqStrUtil.showToast(RegisterInfoActivity.this,getString(R.string.education_select_prompt)); + }else if(JqStrUtil.isEmpty(income)){//年收入 + JqStrUtil.showToast(RegisterInfoActivity.this,getString(R.string.salary_select_prompt)); + }else if(JqStrUtil.isEmpty(marriage)){//婚姻状况 + JqStrUtil.showToast(RegisterInfoActivity.this,getString(R.string.marital_status_select_prompt)); + }else{ + if(!"login".equals(prepage)){ + startSecondActivity(); + }else{ + if(model!=null){ + saveInfoAnd2App(); + } + } + + } + } + + /** + * 将信息传给注册第二级页面 + */ + private void startSecondActivity() { + Intent intent = new Intent(this,RegisterActivity.class); + intent.putExtra("nikeName",nikeName); + intent.putExtra("birth",birth); + intent.putExtra("sex",sex); + intent.putExtra("liveaddress",liveaddress); + intent.putExtra("height",height); + intent.putExtra("degree",degree); + intent.putExtra("income",income); + intent.putExtra("marriage",marriage); + intent.putExtra("thirdID",thirdID); + intent.putExtra("thirdType",thirdType); + startActivity(intent); + } + + /** + * 微信注册用户,保存输入的信息 + */ + private void saveInfoAnd2App() { + String updateWebInfoUrl = Constant.COMMON_URL + Interface.WEIXIN_UPDATE_INFO; + JSONObject obj = new JSONObject(); + obj.put("userid",model.getUserid()); + obj.put("nickname",nikeName); + obj.put("sex",sex); + obj.put("birthday",birth); + obj.put("localplace",liveaddress); + obj.put("height",height); + obj.put("degree",degree); + obj.put("income",income); + obj.put("marrige",marriage); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, true, updateWebInfoUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + if("1".equals(rsCode)){ + Intent intent = new Intent(RegisterInfoActivity.this,MainActivity.class); + startActivity(intent); + finish(); + } + } + },null); + } + + /** + * 选择居住地 + */ + private void createDoubleWheel(final TextView addTv) { + LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); +// if("tv_addressStr".equals(flag)){ +// mview = inflater.inflate(R.layout.popupwindow_selectcity, null); +// cityPicker = (CityPickerLayout) mview.findViewById(R.id.cityPicker); +// cityPicker.setWheelViewItemNumber(5); +// }else if("tv_myOrigo".equals(flag)){ + mview = inflater.inflate(R.layout.layout_select_origo, null); + origoPicker = (OrigoPickerLayout) mview.findViewById(R.id.cityPicker); + origoPicker.setWheelViewItemNumber(5); +// } + final PopupWindow window = new PopupWindow(mview, + WindowManager.LayoutParams.MATCH_PARENT, + WindowManager.LayoutParams.MATCH_PARENT); + confirm_city = (TextView)mview.findViewById(R.id.confirm_city); + cancel_city = (TextView)mview.findViewById(R.id.cancel_city); + ll_cityblank = (LinearLayout) mview.findViewById(R.id.ll_cityblank); + // 设置popWindow弹出窗体可点击,这句话必须添加,并且是true + window.setFocusable(true); + // 实例化一个ColorDrawable颜色为半透明 + ColorDrawable dw = new ColorDrawable(0xb0000000); + window.setBackgroundDrawable(dw); + // 设置popWindow的显示和消失动画 + window.setAnimationStyle(R.style.mypopwindow_anim_style); + window.setClippingEnabled(false); + // 在底部显示 + window.showAtLocation(mview, Gravity.BOTTOM, 0, 0); + //popWindow消失监听方法 + window.setOnDismissListener(new PopupWindow.OnDismissListener() { + @Override + public void onDismiss() { + window.dismiss(); + } + }); + confirm_city.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + String address = ""; +// if("tv_addressStr".equals(flag)){ +// String province = cityPicker.getProvince(); +// String city = cityPicker.getCity(); +// address = province+city; +// }else if("tv_myOrigo".equals(flag)){ + String province = origoPicker.getProvince(); + String city = origoPicker.getCity(); +// if(province.equals(city)){ +// address = province; +// }else{ + address = province +" "+city; +// } + window.dismiss(); + addTv.setText(address); + } + }); + cancel_city.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + window.dismiss(); + } + }); + ll_cityblank.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + window.dismiss(); + } + }); + } + + private void createSingleWheel(ArrayList commonList){ + LayoutInflater sexinflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); + mview = sexinflater.inflate(R.layout.popupwindow_commonnew, null); + if(commonwindow==null){ + commonwindow = new PopupWindow(mview, + WindowManager.LayoutParams.MATCH_PARENT, + WindowManager.LayoutParams.MATCH_PARENT); + } + comWv = (WheelView) mview.findViewById(R.id.wv_common); + cancel_common = (TextView) mview.findViewById(R.id.cancel_common); + confirm_common = (TextView) mview.findViewById(R.id.confirm_common); + ll_blank = (LinearLayout) mview.findViewById(R.id.ll_blank); + comWv.setData(commonList); + // 设置popWindow弹出窗体可点击,这句话必须添加,并且是true + commonwindow.setFocusable(true); + // 实例化一个ColorDrawable颜色为半透明 + ColorDrawable dw = new ColorDrawable(0xb0000000); + commonwindow.setBackgroundDrawable(dw); + commonwindow.setClippingEnabled(false);//设置全屏显示 + // 设置popWindow的显示和消失动画 + commonwindow.setAnimationStyle(R.style.mypopwindow_anim_style); + // 在底部显示 + commonwindow.showAtLocation(mview, Gravity.BOTTOM, 0, 0); + //popWindow消失监听方法 + commonwindow.setOnDismissListener(new PopupWindow.OnDismissListener() { + @Override + public void onDismiss() { + commonwindow.dismiss(); + commonwindow = null; + } + }); + cancel_common.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + commonwindow.dismiss(); + commonwindow = null; + } + }); + ll_blank.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + commonwindow.dismiss(); + commonwindow = null; + } + }); + } + + /** + * 创建时间滚轮 + * @param tv + */ + private void createTimePickWheel(final TextView tv){ + //时间选择器 + pvTime = new TimePickerView(this, TimePickerView.Type.YEAR_MONTH_DAY); + //控制时间范围 + Calendar calendar = Calendar.getInstance(); + pvTime.setRange(calendar.get(Calendar.YEAR)-60, calendar.get(Calendar.YEAR));//要在setTime 之前才有效果哦 + pvTime.setTime(new Date()); + pvTime.setCyclic(false); + pvTime.setCancelable(true); + //时间选择后回调 + pvTime.setOnTimeSelectListener(new TimePickerView.OnTimeSelectListener() { + + @Override + public void onTimeSelect(Date date) { + tv.setText(getTime(date)); + jugeTime = date.getTime(); +// birth = getTime(date); + } + }); + } + + /** + * 时间转时间字符串 + * @param date + * @return + */ + private String getTime(Date date) { + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + return format.format(date); + } + + private boolean isMore18(long inputTime){ + long nowtime = new Date().getTime(); + long oneYear = 31536000000L; + int userAge = (int)((nowtime - inputTime)/oneYear); + if(userAge>=18){ + return true; + } + return false; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/ReportUserActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/ReportUserActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..85a49cd38dfb8e2e9bf9807c092405cf73dfdcd4 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/ReportUserActivity.java @@ -0,0 +1,146 @@ +package com.jiuqi.elove.activity; + +import android.os.Bundle; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.view.View; +import android.widget.EditText; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; + +import butterknife.BindView; +import butterknife.OnClick; + +/** + * 举报用户、朋友圈、群 + */ +public class ReportUserActivity extends ABaseActivity{ + + private static final String TAG = "ReportUserActivity"; + /** + * 组件 + */ + @BindView(R.id.edt_introduce) + EditText edt_introduce;//自我介绍的内容 + @BindView(R.id.txt_num) + TextView txt_num;// 用来显示剩余字数 + @BindView(R.id.tv_right) + TextView tv_right; + @BindView(R.id.rl_right_tv) + RelativeLayout rl_right_tv; + /** + * 变量 + */ + private int num = 200;//限制的最大字数 + private String userjubaoUrl; + private String myId;//举报人的id + private String otherId;//被举报对象的id + private String prepage;//从哪个页面过来的,来判断具体的举报对象的类型 + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_reportuser,"举报理由"); + getDataFromPre(); + initView(); + initEvents(); + } + + private void getDataFromPre() { + myId = getIntent().getStringExtra("myId"); + otherId = getIntent().getStringExtra("otherId"); + prepage = getIntent().getStringExtra("prepage"); + } + + private void initView() { + edt_introduce = (EditText) findViewById(R.id.edt_introduce); + txt_num = (TextView) findViewById(R.id.txt_num); + txt_num.setText(String.valueOf(num)); + tv_right.setText("保存"); + rl_right_tv.setVisibility(View.VISIBLE); + } + + private void initEvents() { + edt_introduce.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + } + + @Override + public void afterTextChanged(Editable s) { + int number = num - s.length(); + txt_num.setText(String.valueOf(number)); + } + }); + } + + @OnClick(R.id.rl_right_tv) + public void OnClick(View view){ + putReport(); + } + + private void putReport() { + String cause = edt_introduce.getText().toString().trim(); + if(TextUtils.isEmpty(cause)){ + JqStrUtil.showToast(ReportUserActivity.this,"请输入举报理由"); + return; + } + if(TextUtils.isEmpty(myId)){ + JqStrUtil.showToast(ReportUserActivity.this,"当前用户未获取"); + return; + } + if(TextUtils.isEmpty(otherId)){ + JqStrUtil.showToast(ReportUserActivity.this,"被举报对象未获取"); + return; + } + JSONObject obj = new JSONObject(); + if("Group".equals(prepage)){ + userjubaoUrl = Constant.COMMON_URL + Interface.GROUP_JUBAO; + obj.put("userID",myId); + obj.put("groupID",otherId); + }else if("circle".equals(prepage)){ + userjubaoUrl = Constant.COMMON_URL + Interface.CIRCLE_REPORT; + obj.put("userid",myId); + obj.put("titleid",otherId); + }else if("comment".equals(prepage)){ + userjubaoUrl = Constant.COMMON_URL + Interface.CIRCLE_REPORT_NEW; + obj.put("userid",myId); + obj.put("recid",otherId); + }else{ + userjubaoUrl = Constant.COMMON_URL + Interface.USER_JUBAO; + obj.put("userID",myId); + obj.put("reportID",otherId); + } + obj.put("version",Constant.VERSION); + obj.put("reason",cause); + String param = JSON.toJSONString(obj); + okHttpUtil.sendJsonStrByPostAsync(ReportUserActivity.this, false, userjubaoUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if("1".equals(rsCode)){//群组和个人都可以 + JqStrUtil.showToast(ReportUserActivity.this,explanation); + finish(); + }else if("128".equals(rsCode)){//个人的 + JqStrUtil.showToast(ReportUserActivity.this,explanation); + }else if("900".equals(rsCode)){//群组时候加的 + JqStrUtil.showToast(ReportUserActivity.this,explanation); + } + } + },null); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/RewardActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/RewardActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..120c7ae9ec45aae8440f0b31426991f70809585d --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/RewardActivity.java @@ -0,0 +1,231 @@ +package com.jiuqi.elove.activity; + +import android.content.Intent; +import android.content.SharedPreferences; +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.support.v7.widget.GridLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.Gravity; +import android.view.MotionEvent; +import android.view.View; +import android.view.inputmethod.InputMethodManager; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; + +import com.alibaba.fastjson.JSONObject; +import com.jiuqi.elove.R; +import com.jiuqi.elove.adapter.RewardAdapter; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.common.JqBaseActivity; +import com.jiuqi.elove.entity.QaDetailAnswerModel; +import com.jiuqi.elove.entity.RechargeModel; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; +import com.jiuqi.elove.widget.GridSpacingItemDecoration; + +import java.util.ArrayList; +import java.util.List; + +public class RewardActivity extends JqBaseActivity implements View.OnClickListener{ + + /** + * 控件 + */ + private TextView tvTitle; + private ImageView imgBack; + private TextView tv_reward_now; + private EditText et_define; + private RecyclerView rv_recharge_view; + private RecyclerView.LayoutManager mgr; + /** + * 数据 + */ + private String rewardMounts; + private String otherid; + private String userid; + private List mlist; + private String type; + private String titleid; + private QaDetailAnswerModel preQaModel; + /** + * 工具 + */ + private final OkHttpUtil okHttpUtil = OkHttpUtil.getInstance(); + private RewardAdapter adapter; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_reward); + getDataFromSpAndPrepage(); + initView(); + setEvents(); + } + + private void getDataFromSpAndPrepage() { + userid = SpUtils.getString(Constant.USER_ID); + Intent intent = getIntent(); + otherid = intent.getStringExtra("otherid"); + type = intent.getStringExtra("type"); + titleid = intent.getStringExtra("titleid"); + preQaModel = (QaDetailAnswerModel) getIntent().getSerializableExtra("model"); + } + + private void setEvents() { + imgBack.setOnClickListener(this); + tv_reward_now.setOnClickListener(this); + et_define.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View view, MotionEvent motionEvent) { + for(int i=0;i(); + RechargeModel model0 = new RechargeModel(); + model0.setMoney(100); + model0.setIscheck(true); + mlist.add(model0); + RechargeModel model1 = new RechargeModel(); + model1.setMoney(200); + model1.setIscheck(false); + mlist.add(model1); + RechargeModel model2 = new RechargeModel(); + model2.setMoney(500); + model2.setIscheck(false); + mlist.add(model2); + RechargeModel model3 = new RechargeModel(); + model3.setMoney(1000); + model3.setIscheck(false); + mlist.add(model3); + rewardMounts = "100";//默认为100 + et_define.setText("100"); + } + + @Override + public void onClick(View view) { + switch (view.getId()){ + case R.id.img_leftBtn: + finish(); + break; + case R.id.tv_reward_now: + reward(); + break; + default: + break; + } + } + + private void setAdapterClick() { + adapter.setOnItemClickListener(new RewardAdapter.OnRecyclerViewItemClickListener() { + @Override + public void onItemClick(View view, int position) { + RechargeModel model = mlist.get(position); + String tempMounts = String.valueOf(model.getMoney()); +// rewardMounts = tempMounts.substring(0,tempMounts.lastIndexOf(".")); + rewardMounts = tempMounts; + model.setIscheck(true); + for(int i=0;i mList; + private List mAddList; + private SelectCompanyAdapter adapter; + private String children; + private boolean isshow = true; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_select_company,"选择单位"); + setAdapter(); + getDataFromServer(); + } + + /** + * 设置适配器 + */ + private void setAdapter() { + mAddList = new ArrayList<>(); + adapter = new SelectCompanyAdapter(this,R.layout.item_company_layout); + rv.setLayoutManager(new LinearLayoutManager(this)); + rv.setAdapter(adapter); + adapter.setListener(new SelectCompanyAdapter.ItemClickListener() { + @Override + public void onItemClick(SelectCompanyAdapter.CompanyHolder holder, CompanyModel model) { + startSecondPage(model); + } + }); + refresh_view.setOnRefreshListener(this); + } + + private void startSecondPage(CompanyModel model) { + String children = model.getChildren(); + String companyId = model.getEnterpriseID(); + if("1".equals(children)){//有下级部门 + Intent intent = new Intent(this,SelectSecondDepartActivity.class); + intent.putExtra("name",model.getEnterpriseName()); + intent.putExtra("id",companyId); + startActivity(intent); + }else{//直接返回结果 + startCompanyAuthPage(model); + } + } + + /** + * 直接返回结果 + */ + private void startCompanyAuthPage(CompanyModel model) { + Intent intent = new Intent(this,CompanyAuthActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + intent.putExtra("companyId",model.getEnterpriseID()); + intent.putExtra("name",model.getEnterpriseName()); + startActivity(intent); + } + + private void getDataFromServer() { + String companyListUrl = Constant.COMMON_URL + Interface.COMPANY_LIST; + JSONObject obj = new JSONObject(); + obj.put("limit",limit); + obj.put("offset",offset); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, isshow, companyListUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String msg = jsonObject.getString("explanation"); + if(Constant.SUCCESS_CODE.equals(rsCode)){ + String result = jsonObject.getString("message"); + handleResult(result); + }else{ + showToast(msg); + } + } + },null); + } + + private void handleResult(String result) { + mList = JSONArray.parseArray(result,CompanyModel.class); + mAddList.addAll(mList); + if(mAddList.isEmpty()){ + rlay_nodata.setVisibility(View.VISIBLE); + }else{ + rlay_nodata.setVisibility(View.GONE); + if(!mList.isEmpty()){ + adapter.updateList(mAddList); + refresh_view.refreshFinish(PullToRefreshLayout.SUCCEED); + }else{ + refresh_view.loadmoreFinish(PullToRefreshLayout.SUC_NODATA); + } + } + } + + + @Override + public void onRefresh(PullToRefreshLayout pullToRefreshLayout) { + isshow = false; + offset = "1"; + mAddList.clear(); + getDataFromServer(); + } + + @Override + public void onLoadMore(PullToRefreshLayout pullToRefreshLayout) { + isshow = false; + offset = String.valueOf(Integer.parseInt(offset)+1); + getDataFromServer(); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/SelectPhotoActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/SelectPhotoActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..edf2f18490794e3020671df66db9ed19fbb24d0e --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/SelectPhotoActivity.java @@ -0,0 +1,517 @@ +package com.jiuqi.elove.activity; + +import android.app.ProgressDialog; +import android.content.ContentResolver; +import android.content.Intent; +import android.content.SharedPreferences; +import android.database.Cursor; +import android.net.Uri; +import android.os.Bundle; +import android.os.Environment; +import android.os.Handler; +import android.provider.MediaStore; +import android.util.DisplayMetrics; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; +import android.widget.GridView; +import android.widget.ImageView; +import android.widget.PopupWindow; +import android.widget.RelativeLayout; +import android.widget.TextView; +import android.widget.Toast; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.jiuqi.elove.R; +import com.jiuqi.elove.adapter.CommonPhotoAdapter; +import com.jiuqi.elove.adapter.PhotoAdapter; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.common.JqBaseActivity; +import com.jiuqi.elove.entity.ImageFloderModel; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.UploadAliUtil; +import com.jiuqi.elove.widget.ListImageDirPopupWindow; + +import java.io.File; +import java.io.FilenameFilter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; + +import okhttp3.MediaType; +/** + * + * Created by dl on 2016/7/21. + */ +public class SelectPhotoActivity extends JqBaseActivity implements ListImageDirPopupWindow.OnImageDirSelected { + /*顶部菜单栏按钮*/ + private TextView tvTitle; + private ImageView tvBack;//退出 + private TextView tvMore;//确实按钮 + private String userId;//当前用户id + private List> mapList;//用户保存图片的list + private ArrayList mList;//选中的图片路径集合 + + private ProgressDialog mProgressDialog; + + private static final String TAG = "SelectPhotoActivity"; + + /** + * 存储文件夹中的图片数量 + */ + private int mPicsSize; + /** + * 图片数量最多的文件夹 + */ + private File mImgDir; + /** + * 所有的图片 + */ + private List mImgs; + + private GridView mGirdView; + private PhotoAdapter mAdapter; + /** + * 临时的辅助类,用于防止同一个文件夹的多次扫描 + */ + private HashSet mDirPaths = new HashSet(); + + /** + * 扫描拿到所有的图片文件夹 + */ + private List mImageFloderModels = new ArrayList(); + + private RelativeLayout mBottomLy; + + private TextView mChooseDir; + private TextView mImageCount; + int totalCount = 0; + private int currentCount;//app中当前相册的相片数量,从上个页面网络请求结果中传过来,用于控制最多张数的条件 + private int conditionTotal;//从上个页面传过来,用于控制最多张数的条件 + private int sendTimes = 0; + + private int mScreenHeight; + + private ListImageDirPopupWindow mListImageDirPopupWindow; + private String flag; + private UploadAliUtil uploadAliUtil; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_photoselect); + DisplayMetrics outMetrics = new DisplayMetrics(); + getWindowManager().getDefaultDisplay().getMetrics(outMetrics); + mScreenHeight = outMetrics.heightPixels; + currentCount = getIntent().getIntExtra("currentCount",0);//获取app当前相片数量 + conditionTotal = getIntent().getIntExtra("conditiontotalCount",0); + flag = getIntent().getStringExtra("pre"); + initView(); + getImages(); + initEvents(); + } + + private void initEvents() { + /** + * 为底部的布局设置点击事件,弹出popupWindow + */ + mBottomLy.setOnClickListener(new View.OnClickListener() + { + @Override + public void onClick(View v) + { + mListImageDirPopupWindow + .setAnimationStyle(R.style.anim_popup_dir); + mListImageDirPopupWindow.showAsDropDown(mBottomLy, 0, 0); + } + }); + + /** + * 结束该activity + */ + tvBack.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + finish(); + } + }); + + /** + * 自定义图片上传按钮点击事件~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * 确定按钮点击,网络请求传输图片,图片上传成功后关闭此页面 + */ + tvMore.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + mList = mAdapter.getmSelectedImage(); + if(mList.isEmpty()){ + tvMore.setClickable(true);//如果没有选择图片就提交了,需要置为true + mProgressDialog.dismiss(); + JqStrUtil.showToast(SelectPhotoActivity.this,"请选择图片"); + return; + } + if("myphoto".equals(flag)){ + mProgressDialog = ProgressDialog.show(SelectPhotoActivity.this, null, "请稍候..."); + tvMore.setClickable(false);//防止多次提交 + uploadImage();//上传图片 + Intent intent = new Intent(); + setResult(0x12, intent); + }else{ + Intent intent = new Intent(); + intent.putStringArrayListExtra("mList",mList); + setResult(0x13,intent); + finish(); + } + } + }); + } + + /** + * 初始化ui方法 + */ + private void initView() { + tvBack = (ImageView)findViewById(R.id.img_leftBtn); + tvTitle = (TextView)findViewById(R.id.tvTitle); + tvMore = (TextView) findViewById(R.id.tvMore); + tvTitle.setText("相册"); + tvMore.setText("确定"); + tvBack.setVisibility(View.VISIBLE); + tvMore.setVisibility(View.VISIBLE); + mGirdView = (GridView) findViewById(R.id.id_gridView); + mChooseDir = (TextView) findViewById(R.id.id_choose_dir); + mImageCount = (TextView) findViewById(R.id.id_total_count); + mBottomLy = (RelativeLayout) findViewById(R.id.id_bottom_ly); + SharedPreferences sp = getSharedPreferences("elove",MODE_PRIVATE); + userId = sp.getString("userid",""); + } + + /** + * 主线程中接受数据完成通知获取,并进行处理 + */ + private Handler mHandler = new Handler() + { + public void handleMessage(android.os.Message msg) + { + + if(msg.what==0x110){ + mProgressDialog.dismiss(); + // 为View绑定数据 + data2View(); + // 初始化展示文件夹的popupWindw + initListDirPopupWindw(); + } + if(msg.what==0x111){ + ++sendTimes;//发送次数加一,由于判断发送了多少次,避免仅仅根据size判断上传(size相等,但是由于异步,实际未put完成) + if(mapList.size()==mList.size()&&sendTimes==mList.size()){ + sendTimes = 0;//上传过程将发送次数置空 + uploadMyServer();//调用服务器端接口,来实现 + mProgressDialog.dismiss(); + } + } + if(msg.what==0x112){ + sendTimes = 0;//上传过程将发送次数置空 + mProgressDialog.dismiss(); + tvMore.setClickable(true);//提交失败,允许再次提交 + JqStrUtil.showToast(SelectPhotoActivity.this,"网络不太好哦,上传失败,请稍后重试~"); + } + } + }; + + /** + * 为View绑定数据 + */ + private void data2View() + { + if (mImgDir == null) + { + Toast.makeText(getApplicationContext(), "未找到图片", + Toast.LENGTH_SHORT).show(); + return; + } + + mImgs = Arrays.asList(mImgDir.list()); + /** + * 可以看到文件夹的路径和图片的路径分开保存,极大的减少了内存的消耗; + */ + mAdapter = new PhotoAdapter(getApplicationContext(), mImgs, + R.layout.grid_item, mImgDir.getAbsolutePath(),currentCount,conditionTotal); + mGirdView.setAdapter(mAdapter); + mImageCount.setText(totalCount + "张"); + }; + + /** + * 初始化展示文件夹的popupWindw + */ + private void initListDirPopupWindw() + { + mListImageDirPopupWindow = new ListImageDirPopupWindow( + ViewGroup.LayoutParams.MATCH_PARENT, (int) (mScreenHeight * 0.6), + mImageFloderModels, LayoutInflater.from(SelectPhotoActivity.this) + .inflate(R.layout.list_dir, null)); + + mListImageDirPopupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() + { + + @Override + public void onDismiss() + { + // 设置背景颜色变暗 + WindowManager.LayoutParams lp = getWindow().getAttributes(); + lp.alpha = 1.0f; + getWindow().setAttributes(lp); + } + }); + // 设置选择文件夹的回调 + mListImageDirPopupWindow.setOnImageDirSelected(this); + } + + /** + * 利用ContentProvider扫描手机中的图片,此方法在运行在子线程中 完成图片的扫描,最终获得jpg最多的那个文件夹 + */ + private void getImages() + { + if (!Environment.getExternalStorageState().equals( + Environment.MEDIA_MOUNTED)) + { + Toast.makeText(this, "暂无外部存储", Toast.LENGTH_SHORT).show(); + return; + } + // 显示进度条 + mProgressDialog = ProgressDialog.show(this, null, "正在加载..."); + + new Thread(new Runnable() + { + @Override + public void run() + { + + String firstImage = null; + + Uri mImageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; + ContentResolver mContentResolver = SelectPhotoActivity.this + .getContentResolver(); + + // 只查询jpeg和png的图片 + Cursor mCursor = mContentResolver.query(mImageUri, null, + MediaStore.Images.Media.MIME_TYPE + "=? or " + + MediaStore.Images.Media.MIME_TYPE + "=?", + new String[] { "image/jpeg", "image/png" }, + MediaStore.Images.Media.DATE_MODIFIED+" desc"); + + Log.e("TAG", mCursor.getCount() + ""); + while (mCursor.moveToNext()) + { + // 获取图片的路径 + String path = mCursor.getString(mCursor + .getColumnIndex(MediaStore.Images.Media.DATA)); + + Log.e("TAG", path); + // 拿到第一张图片的路径 + if (firstImage == null) + firstImage = path; + // 获取该图片的父路径名 + File parentFile = new File(path).getParentFile(); + if (parentFile == null) + continue; + String dirPath = parentFile.getAbsolutePath(); + ImageFloderModel imageFloderModel = null; + // 利用一个HashSet防止多次扫描同一个文件夹(不加这个判断,图片多起来还是相当恐怖的~~) + if (mDirPaths.contains(dirPath)) + { + continue; + } else + { + mDirPaths.add(dirPath); + // 初始化imageFloder + imageFloderModel = new ImageFloderModel(); + imageFloderModel.setDir(dirPath); + imageFloderModel.setFirstImagePath(path); + } + int picSize = 0; + if((parentFile.list(new FilenameFilter() + { + @Override + public boolean accept(File dir, String filename) + { + if (filename.endsWith(".jpg") + || filename.endsWith(".png") + || filename.endsWith(".jpeg")) + return true; + return false; + } + }))!=null){ + picSize = (parentFile.list(new FilenameFilter() + { + @Override + public boolean accept(File dir, String filename) + { + if (filename.endsWith(".jpg") + || filename.endsWith(".png") + || filename.endsWith(".jpeg")) + return true; + return false; + } + })).length; + } + + totalCount += picSize; + + imageFloderModel.setCount(picSize); + mImageFloderModels.add(imageFloderModel); + + if (picSize > mPicsSize) + { + mPicsSize = picSize; + mImgDir = parentFile; + } + } + mCursor.close(); + + // 扫描完成,辅助的HashSet也就可以释放内存了 + mDirPaths = null; + + // 通知Handler扫描图片完成 + mHandler.sendEmptyMessage(0x110); + + } + }).start(); + + } + + @Override + public void selected(ImageFloderModel floder) + { + + mImgDir = new File(floder.getDir()); + mImgs = Arrays.asList(mImgDir.list(new FilenameFilter() + { + @Override + public boolean accept(File dir, String filename) + { + if (filename.endsWith(".jpg") || filename.endsWith(".png") + || filename.endsWith(".jpeg")) + return true; + return false; + } + })); + /** + * 可以看到文件夹的路径和图片的路径分开保存,极大的减少了内存的消耗; + */ + mAdapter = new PhotoAdapter(getApplicationContext(), mImgs, + R.layout.grid_item, mImgDir.getAbsolutePath(),currentCount,conditionTotal); + mGirdView.setAdapter(mAdapter); + // mAdapter.notifyDataSetChanged(); + mImageCount.setText(floder.getCount() + "张"); + mChooseDir.setText(floder.getName()); + mListImageDirPopupWindow.dismiss(); + + } + /** + * 上传图片 + */ + private void uploadImage() { + uploadAliUtil = new UploadAliUtil(this);//在有文件的情况下初始化上传工具 + mapList = new ArrayList<>(); + /** + * 设置将文件上传阿里云后的接口回调 + */ + uploadAliUtil.setCompletePutAli(new UploadAliUtil.OnCompletePutAli() { + @Override + public void onFailure() { + mHandler.sendEmptyMessage(0x112); + } + + @Override + public void onSuccess() { + mHandler.sendEmptyMessage(0x111); + } + }); + /** + * 设置获取上传阿里云路径后的接口回调 + */ + uploadAliUtil.setAliInterface(new UploadAliUtil.OnUpLoadAli() { + @Override + public void upLoadHandle(JSONObject obj, final byte[] bytes,String param) { + String rsCode = obj.getString("retcode"); + String key = obj.getString("key");//调用接口时的filePath,总会返回 + if ("1".equals(rsCode)) { + final String putaliUrl = obj.getString("url");//put阿里云的路径 + Log.d(TAG, "run:阿里云不存在,给出上传路 "+putaliUrl); + new Runnable(){ + @Override + public void run() { + try { + //内有handler和handler发送的次数为依据来判断是否上传完成并且总共的照片数量是否达到 + uploadAliUtil.put(MediaType.parse(""), putaliUrl, bytes); + } catch (IOException e) { + e.printStackTrace(); + } + } + }.run(); + setParamList(param,key); + }else if("0".equals(rsCode)){//文件已存在,无需上传到阿里云服务器 + setParamList(param,key); + //handler和handler发送的次数为依据来判断是否上传完成并且总共的照片数量是否达到 + mHandler.sendEmptyMessage(0x111); + } + } + }); + /** + * 获取上传阿里云路径的方法 + */ + for (int i=0;i updateParamMap = new HashMap<>();//用户保存每张图片的信息 + updateParamMap.put("md5",md5); + updateParamMap.put("size",String.valueOf(size)); + updateParamMap.put("path",key); + //放入put方法内部,则会引起多线程来操作list对象,所以如果没有其他方法得对对象枷锁处理,而在这里用handler和发送次数来做为判断的方式来代替上锁的方式 + mapList.add(updateParamMap); + } + + /** + * 将保存图片的阿里云地址上传至服务器 + */ + private void uploadMyServer() { + String avatarUrl = Constant.COMMON_URL + Interface.PHOTO_UPDATE; + JSONObject obj = new JSONObject(); + obj.put("userID",userId); + String picstr = JSON.toJSONString(mapList); + JSONArray pictures = JSONArray.parseArray(picstr); + obj.put("pictures",pictures); + obj.put("version",Constant.VERSION); + String param = JSON.toJSONString(obj); + Log.d(TAG, "uploadMyServer: paramurl"+param); + okHttpUtil.sendJsonStrByPostAsync(SelectPhotoActivity.this,false,avatarUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + if("1".equals(rsCode)){ + mapList.clear(); + finish(); + }else{ + JqStrUtil.showToast(SelectPhotoActivity.this,"上传失败"); + } + } + },null); + + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/SelectProfessionActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/SelectProfessionActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..2aa1f83405940487113b6d70bbfd2994cba4b738 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/SelectProfessionActivity.java @@ -0,0 +1,81 @@ +package com.jiuqi.elove.activity; + +import android.app.Activity; +import android.content.Intent; +import android.os.Bundle; +import android.view.View; +import android.view.Window; +import android.widget.AdapterView; +import android.widget.ImageView; +import android.widget.ListView; +import android.widget.TextView; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.adapter.ProfessionAdapter; +import com.jiuqi.elove.util.JqStrUtil; + +public class SelectProfessionActivity extends Activity { + + //顶部菜单栏 + private TextView tvTitle; + private ImageView tvBack; + + private ListView lv_profession; + + //数据 + private String[] professionTitleList = {"IT","制造","医疗","金融","商业","文化","艺术","法律","教育","行政","模特","空姐",""}; + private String[] professionList = {"计算机/互联网/通信","生产/工艺/制造","医疗/护理/制药","金融/银行/投资/保险","商业/服务业/个体经营", + "文化/广告/传媒","娱乐/艺术/表演","律师/法务","教育/培训","公务员/行政/事业单位","模特","空姐","其他职业" + }; + private String profession; + private ProfessionAdapter adapter; + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + requestWindowFeature(Window.FEATURE_NO_TITLE); + setContentView(R.layout.activity_select_profession); + initView();//初始化ui + initData();//适配器数据 + setEvents();//注册事件 + } + + private void initData() { + int position = 100;//随便一个不可能的数字 + String proStr = getIntent().getStringExtra("profession"); + if(!JqStrUtil.isEmpty(proStr)&&!"0".equals(proStr)){ + position = Integer.parseInt(proStr)-1; + } + adapter = new ProfessionAdapter(getApplicationContext(),professionTitleList,professionList,position); + lv_profession.setAdapter(adapter); + } + + private void setEvents() { + tvBack.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + finish(); + } + }); + lv_profession.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView adapterView, View view, int i, long l) { + profession = String.valueOf(i+1); + Intent intent = new Intent(); + intent.putExtra("profession",profession); + view.findViewById(R.id.iv_selected).setVisibility(View.VISIBLE); + setResult(RESULT_OK,intent); + finish(); + } + }); + } + + private void initView() { + tvTitle = (TextView) findViewById(R.id.tvTitle); + tvBack = (ImageView) findViewById(R.id.img_leftBtn); + tvTitle.setText("职业"); + tvBack.setVisibility(View.VISIBLE); + lv_profession = (ListView) findViewById(R.id.lv_profession); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/SelectSecondDepartActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/SelectSecondDepartActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..7244696383c5d92c6cc0da049f3d7d1884b6d718 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/SelectSecondDepartActivity.java @@ -0,0 +1,101 @@ +package com.jiuqi.elove.activity; + +import android.content.Intent; +import android.os.Bundle; +import android.support.v7.widget.DefaultItemAnimator; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.widget.RelativeLayout; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.jiuqi.elove.R; +import com.jiuqi.elove.adapter.DepartmentGroupAdapter; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.entity.DepartmentModel; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.widget.grouplist.adpater.TreeRecyclerAdapter; +import com.jiuqi.elove.widget.grouplist.adpater.TreeRecyclerType; +import com.jiuqi.elove.widget.grouplist.factory.ItemHelperFactory; +import com.jiuqi.elove.widget.grouplist.item.TreeItem; +import com.jiuqi.elove.widget.pulltorefresh.PullToRefreshLayout; +import com.jiuqi.elove.widget.pulltorefresh.PullableRecylerView; + +import java.util.List; + +import butterknife.BindView; + +public class SelectSecondDepartActivity extends ABaseActivity { + + /** + * 组件 + */ + @BindView(R.id.rv) + RecyclerView rv; + + /** + * 数据 + */ + private String companyId; + private String companyName; + private List mDepartmentList;//用于分组展示 + private TreeRecyclerAdapter treeRecyclerAdapter; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_select_second_depart,"选择部门"); + getDataFromPre(); + getDataFromServer(); + } + + private void getDataFromPre() { + Intent intent =getIntent(); + companyId = intent.getStringExtra("id"); + companyName =intent.getStringExtra("name"); + } + + /** + * 从服务器获取数据 + */ + private void getDataFromServer() { + String companyListUrl = Constant.COMMON_URL + Interface.DEPARTMENT_LIST; + JSONObject obj = new JSONObject(); + obj.put("enterpriseid",companyId); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, true, companyListUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String msg = jsonObject.getString("explanation"); + if(Constant.SUCCESS_CODE.equals(rsCode)){ + String result = jsonObject.getString("message"); + handleResult(result); + }else{ + showToast(msg); + } + } + },null); + } + + private void handleResult(String result) { + mDepartmentList = JSONArray.parseArray(result,DepartmentModel.class); + convertDepartMentContainCompanyInfo(); + final List treeItemList = ItemHelperFactory.createTreeItemList(mDepartmentList, DepartmentGroupAdapter.class, null); + treeRecyclerAdapter = new TreeRecyclerAdapter(); + treeRecyclerAdapter.setType(TreeRecyclerType.SHOW_EXPAND); + treeRecyclerAdapter.setDatas(treeItemList); + rv.setLayoutManager(new LinearLayoutManager(this)); + rv.setItemAnimator(new DefaultItemAnimator()); + rv.setAdapter(treeRecyclerAdapter); + } + + private void convertDepartMentContainCompanyInfo() { + for(int i = 0; i map; + private Map cardmap; + + private OkHttpUtil okHttpUtil = OkHttpUtil.getInstance(); + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + requestWindowFeature(Window.FEATURE_NO_TITLE); + setContentView(R.layout.activity_set_authority); + setAuthData(); + initView(); + initEvents(); + } + + private void setAuthData(){ + map = new HashMap<>(); + map.put("1","仅自己可见"); + map.put("2","仅好友可见"); + map.put("4","企业用户可见"); + map.put("3","所有人可见"); + cardmap = new HashMap<>(); + cardmap.put("0","允许"); + cardmap.put("1","不允许"); + } + private void initView() { + tvBack = (ImageView)findViewById(R.id.img_leftBtn); + tvSave = (TextView)findViewById(R.id.tvMore); + tvTitle = (TextView)findViewById(R.id.tvTitle); + tvTitle.setText("权限设置"); + tvSave.setText("保存"); + tvBack.setVisibility(View.VISIBLE); + tvSave.setVisibility(View.VISIBLE); + + rlay_name = (RelativeLayout)findViewById(R.id.rlay_name); + rlay_salary = (RelativeLayout) findViewById(R.id.rlay_salary); + rlay_house = (RelativeLayout)findViewById(R.id.rlay_house); + rlay_car = (RelativeLayout)findViewById(R.id.rlay_car); + rlay_share = (RelativeLayout)findViewById(R.id.rlay_share); + txt_name = (TextView) findViewById(R.id.txt_name); + txt_salary = (TextView) findViewById(R.id.txt_salary); + txt_house = (TextView) findViewById(R.id.txt_house); + txt_car = (TextView) findViewById(R.id.txt_car); + txt_share = (TextView) findViewById(R.id.txt_share); + + } + + private void initEvents(){ + tvBack.setOnClickListener(this); + tvSave.setOnClickListener(this); + + rlay_name.setOnClickListener(this); + rlay_salary.setOnClickListener(this); + rlay_house.setOnClickListener(this); + rlay_car.setOnClickListener(this); + rlay_share.setOnClickListener(this); + userID = SpUtils.getString(Constant.USER_ID); + submitAuth();//初始化权限数据 + } + + @Override + public void onClick(View view) { + switch (view.getId()){ + case R.id.img_leftBtn: + this.finish(); + break; + case R.id.tvMore: + action = "2"; + submitAuth(); + if("1".equals(rsCode)&&"1".equals(rtCode)){ + Toast.makeText(SetAuthorityActivity.this,"更新成功",Toast.LENGTH_SHORT).show(); + } + finish(); + break; + case R.id.rlay_name: + itemContent = 1; + largeContent = 0; + showActionSheet(); + break; + case R.id.rlay_salary: + itemContent = 2; + largeContent = 0; + showActionSheet(); + break; + case R.id.rlay_house: + itemContent = 3; + largeContent = 0; + showActionSheet(); + break; + case R.id.rlay_car: + itemContent = 4; + largeContent = 0; + showActionSheet(); + break; + case R.id.rlay_share: + itemContent = 5; + largeContent = 1; + showActionSheet(); + break; + default: + break; + } + } + +// private void showActionSheetShare() { +// setTheme(R.style.ActionSheetStyleiOS7); +// ActionSheet.createBuilder(this, getSupportFragmentManager()) +// .setCancelButtonTitle("取消")//1,2 +// .setOtherButtonTitles("允许", "不允许") +// .setCancelableOnTouchOutside(true).setListener(this).show(); +// } + + private void showActionSheet() { + setTheme(R.style.ActionSheetStyleiOS7); + if(largeContent==0){ + ActionSheet.createBuilder(this, getSupportFragmentManager()) + .setCancelButtonTitle("取消")//1,2,4,3 + .setOtherButtonTitles("仅自己可见", "仅好友可见", "企业用户可见", "所有人可见") + .setCancelableOnTouchOutside(true).setListener(this).show(); + }else{ + ActionSheet.createBuilder(this, getSupportFragmentManager()) + .setCancelButtonTitle("取消")//1,2 + .setOtherButtonTitles("允许", "不允许") + .setCancelableOnTouchOutside(true).setListener(this).show(); + } + + } + + /** + * 信息查看权限查询和修改 + */ + private void submitAuth() { + String getPwdUrl = Constant.COMMON_URL + Interface.UPDATE_AUTHORITY; + JSONObject obj = new JSONObject(); + obj.put("userID",userID);//用户ID + obj.put("action",action);//1查询 2修改 + obj.put("version",Constant.VERSION); + if("2".equals(action)){ + obj.put("name",authname); + obj.put("income",authincome); + obj.put("ifhouse",authhouse); + obj.put("ifcar",authcar); + obj.put("share",authcard); + } + String param = obj.toJSONString(); + Log.d(TAG, "MyAuthorityActivity: "+param); + okHttpUtil.sendJsonStrByPostAsync(SetAuthorityActivity.this,false,getPwdUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + rtCode = jsonObject.getString("retcode"); + Log.d(TAG, "onResponse: "+rtCode); + if("1".equals(rtCode)){ + Log.d(TAG, "onResponse: result"+jsonObject); + if("1".equals(action)){ + String result = jsonObject.getString("message"); + AuthModel model = JSON.parseObject(result,AuthModel.class); + if(model!=null){ + authname = model.getName(); + authincome = model.getIncome(); + authhouse = model.getIfhouse(); + authcar = model.getIfcar(); + authcard = model.getShare(); + txt_name.setText(map.get(authname)); + txt_house.setText(map.get(authhouse)); + txt_salary.setText(map.get(authincome)); + txt_car.setText(map.get(authcar)); + txt_share.setText(cardmap.get(authcard)); + } + } + if("2".equals(action)){ + //成功不在此做操作 + } + } + } + },null); + } + + @Override + public void onDismiss(ActionSheet actionSheet, boolean isCancel) { + //空实现 + } + + @Override + public void onOtherButtonClick(ActionSheet actionSheet, int index) { + if(largeContent==0){ + if(itemContent==1){//姓名 + switch (index){ + case 0: + txt_name.setText("仅自己可见"); + authname = "1"; + break; + case 1: + txt_name.setText("仅好友可见"); + authname = "2"; + break; + case 2: + txt_name.setText("企业用户可见"); + authname = "4"; + break; + case 3: + txt_name.setText("所有人可见"); + authname = "3"; + break; + default: + break; + } + } + if(itemContent==2){//收入 + switch (index){ + case 0: + txt_salary.setText("仅自己可见"); + authincome = "1"; + break; + case 1: + txt_salary.setText("仅好友可见"); + authincome = "2"; + break; + case 2: + txt_salary.setText("企业用户可见"); + authincome = "4"; + break; + case 3: + txt_salary.setText("所有人可见"); + authincome = "3"; + break; + default: + break; + } + } + if(itemContent==3){//房子 + switch (index){ + case 0: + txt_house.setText("仅自己可见"); + authhouse = "1"; + break; + case 1: + txt_house.setText("仅好友可见"); + authhouse = "2"; + break; + case 2: + txt_house.setText("企业用户可见"); + authhouse = "4"; + break; + case 3: + txt_house.setText("所有人可见"); + authhouse = "3"; + break; + default: + break; + } + } + if(itemContent==4){//车子 + switch (index){ + case 0: + txt_car.setText("仅自己可见"); + authcar = "1"; + break; + case 1: + txt_car.setText("仅好友可见"); + authcar = "2"; + break; + case 2: + txt_car.setText("企业用户可见"); + authcar = "4"; + break; + case 3: + txt_car.setText("所有人可见"); + authcar = "3"; + break; + default: + break; + } + } + }else{ + if(itemContent==5){//名片 + switch (index){ + case 0: + txt_share.setText("允许"); + authcard = "0"; + break; + case 1: + txt_share.setText("不允许"); + authcard = "1"; + break; + default: + break; + } + } + } + + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/SetPushActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/SetPushActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..cd398c3e2cf03c9274bc32694c0fc17cc012f6f4 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/SetPushActivity.java @@ -0,0 +1,239 @@ +package com.jiuqi.elove.activity; + +import android.content.SharedPreferences; +import android.os.Bundle; +import android.support.v4.app.FragmentActivity; +import android.util.Log; +import android.view.View; +import android.view.Window; +import android.widget.ImageView; +import android.widget.TextView; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.entity.PushModel; +import com.jiuqi.elove.util.EaseHxHelper; +import com.jiuqi.elove.util.DemoModel; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; + +import java.util.Map; + +/** + *设置权限页面 + * Created by liulin on 2016/7/5. + */ +public class SetPushActivity extends FragmentActivity implements View.OnClickListener{ + + private static final String TAG = "SetPushActivity"; + + /*顶部菜单栏按钮*/ + private TextView tvTitle; + private ImageView tvBack; + private TextView tvSave; + + + private ImageView iv_msg; + private ImageView iv_act; + private ImageView iv_foucus; + private ImageView iv_like; + private ImageView iv_recommend; + + private String userID; + private String action = "1";//读取 + private int itemContent;//判定点击的具体是工资还是什么 + + //保存的推送权限,默认打开 + private String msg="0"; + private String act="0"; + private String focus="0"; + private String like="0"; + private String recommend="0"; + + private String rsCode; + + private DemoModel settingsModel;//环信消息推送设置 + + //保存对应数据 + private Map map; + + private OkHttpUtil okHttpUtil = OkHttpUtil.getInstance(); + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + requestWindowFeature(Window.FEATURE_NO_TITLE); + setContentView(R.layout.activity_set_push); + settingsModel = EaseHxHelper.getInstance().getModel(); + initView(); + initEvents(); + } + private void initView() { + tvBack = (ImageView)findViewById(R.id.img_leftBtn); + tvSave = (TextView)findViewById(R.id.tvMore); + tvTitle = (TextView)findViewById(R.id.tvTitle); + tvTitle.setText("推送提醒"); + tvSave.setText("保存"); + tvBack.setVisibility(View.VISIBLE); + tvSave.setVisibility(View.VISIBLE); + + iv_msg = (ImageView) findViewById(R.id.iv_msg); + iv_act = (ImageView) findViewById(R.id.iv_act); + iv_foucus = (ImageView) findViewById(R.id.iv_foucus); + iv_like = (ImageView) findViewById(R.id.iv_like); + iv_recommend = (ImageView) findViewById(R.id.iv_recommend); + } + + private void initEvents(){ + tvBack.setOnClickListener(this); + tvSave.setOnClickListener(this); + + iv_like.setOnClickListener(this); + iv_foucus.setOnClickListener(this); + iv_msg.setOnClickListener(this); + iv_act.setOnClickListener(this); + iv_recommend.setOnClickListener(this); + userID = SpUtils.getString(Constant.USER_ID); + if(settingsModel.getSettingMsgNotification()){ + iv_msg.setImageResource(R.drawable.switch_on); + }else{ + iv_msg.setImageResource(R.drawable.switch_off); + } + submitPush(); + } + + /** + * 是否推送相关查询和修改 + */ + private void submitPush() { + String pushUrl = Constant.COMMON_URL + Interface.PUSH_SET; + JSONObject obj = new JSONObject(); + obj.put("userID",userID); + obj.put("action",action);//1查询 2修改 + obj.put("version",Constant.VERSION); + if("2".equals(action)){ + obj.put("atten",focus); + obj.put("like",like); + obj.put("act",act); + obj.put("msg",msg); + obj.put("recommend",recommend); + } + String param = JSON.toJSONString(obj); + Log.d("ok", "submitPush: "+param); + okHttpUtil.sendJsonStrByPostAsync(SetPushActivity.this,true,pushUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + rsCode = jsonObject.getString("retcode"); + if("1".equals(rsCode)){ + Log.d(TAG, "onResponse: result"+jsonObject); + if("1".equals(action)){ + String result = jsonObject.getString("message"); + PushModel model = JSON.parseObject(result,PushModel.class); + msg = model.getMsg(); + act = model.getAct(); + focus = model.getAtten(); + like = model.getLike(); + recommend = model.getRecommend(); + if("0".equals(msg)&&settingsModel.getSettingMsgNotification()){ + iv_msg.setImageResource(R.drawable.switch_on); + settingsModel.setSettingMsgNotification(true); + }else{ + iv_msg.setImageResource(R.drawable.switch_off); + settingsModel.setSettingMsgNotification(false); + } + if("0".equals(act)){ + iv_act.setImageResource(R.drawable.switch_on); + }else{ + iv_act.setImageResource(R.drawable.switch_off); + } + if("0".equals(focus)){ + iv_foucus.setImageResource(R.drawable.switch_on); + }else{ + iv_foucus.setImageResource(R.drawable.switch_off); + } + if("0".equals(like)){ + iv_like.setImageResource(R.drawable.switch_on); + }else{ + iv_like.setImageResource(R.drawable.switch_off); + } + if("0".equals(recommend)){ + iv_recommend.setImageResource(R.drawable.switch_on); + }else{ + iv_recommend.setImageResource(R.drawable.switch_off); + } + } + if("2".equals(action)){ + //成功,不需要进行任何操作 + finish(); + } + } + } + },null); + } + + @Override + public void onClick(View view) { + switch (view.getId()){ + case R.id.img_leftBtn: + this.finish(); + break; + case R.id.tvMore: + action = "2"; + submitPush(); + break; + case R.id.iv_act: + if("0".equals(act)){ + iv_act.setImageResource(R.drawable.switch_off); + act = "1"; + }else{ + iv_act.setImageResource(R.drawable.switch_on); + act = "0"; + } + break; + case R.id.iv_msg: + if("0".equals(msg)&&settingsModel.getSettingMsgNotification()){ + iv_msg.setImageResource(R.drawable.switch_off); + settingsModel.setSettingMsgNotification(false); + msg = "1"; + }else{ + iv_msg.setImageResource(R.drawable.switch_on); + settingsModel.setSettingMsgNotification(true); + msg = "0"; + } + break; + case R.id.iv_foucus: + if("0".equals(focus)){ + iv_foucus.setImageResource(R.drawable.switch_off); + focus = "1"; + }else{ + iv_foucus.setImageResource(R.drawable.switch_on); + focus = "0"; + } + break; + case R.id.iv_like: + if("0".equals(like)){ + iv_like.setImageResource(R.drawable.switch_off); + like = "1"; + }else{ + iv_like.setImageResource(R.drawable.switch_on); + like = "0"; + } + break; + case R.id.iv_recommend: + if("0".equals(recommend)){ + iv_recommend.setImageResource(R.drawable.switch_off); + recommend = "1"; + }else{ + iv_recommend.setImageResource(R.drawable.switch_on); + recommend = "0"; + } + break; + default: + break; + } + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/SettingActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/SettingActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..c105c8efc3a7be1cb24e393613d77171a35d3bd9 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/SettingActivity.java @@ -0,0 +1,625 @@ +package com.jiuqi.elove.activity; + +import android.Manifest; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.pm.PackageManager; +import android.os.Bundle; +import android.os.Environment; +import android.os.Handler; +import android.os.Message; +import android.support.annotation.NonNull; +import android.support.v4.app.ActivityCompat; +import android.support.v4.content.ContextCompat; +import android.util.Log; +import android.view.View; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.common.JqBaseActivity; +import com.jiuqi.elove.db.DemoDBManager; +import com.jiuqi.elove.fragment.HomePageFragment; +import com.jiuqi.elove.util.CommonUtil; +import com.jiuqi.elove.util.EaseHxHelper; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; +import com.jiuqi.elove.widget.dialog.CustomDialog; +import com.stonesun.newssdk.NewsAgent; +import com.umeng.analytics.MobclickAgent; +import com.umeng.socialize.UMAuthListener; +import com.umeng.socialize.UMShareAPI; +import com.umeng.socialize.bean.SHARE_MEDIA; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import cn.jpush.android.api.JPushInterface; +import cn.jpush.android.api.TagAliasCallback; + +/** + * 设置页面 + * Created by FanWenXia on 2016/9/14. + */ +public class SettingActivity extends JqBaseActivity implements View.OnClickListener { + + private static final String TAG = "SettingActivity"; + /** + * 控件 + */ + private TextView tvTitle; + private ImageView tvBack; + private RelativeLayout rlay_phone; + private TextView txt_phonenum; + private TextView txt_weixin; + private TextView txt_qq; + private TextView txt_weibo; + private RelativeLayout rlay_updatePwd; + private RelativeLayout rlay_authority; + private RelativeLayout rlay_push; + private RelativeLayout rlay_feedback; + private RelativeLayout rlay_aboutus; + private RelativeLayout rlay_protocol; + private Button btn_exit; + private TextView tv_cache; + private RelativeLayout rl_clean; + /** + * 数据 + */ + private String wechat = ""; + private String qq = ""; + private String weibo = ""; + private int thirdType;//1微信 2QQ 3微博 + private String usID = null;//第三方ID + private String userID;//用户ID + private String mobile;//用户手机号 + /** + * 工具 + */ + private UMShareAPI umShareAPI; + private SHARE_MEDIA platform = null; + private static final int CLEAR_SUCCESS = 0X01; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_setting); + umShareAPI = UMShareAPI.get(this); + initView(); + initEvents(); + reqThirdBound(); + + + } + + private void initView() { + tvBack = easyFind(R.id.img_leftBtn); + tvTitle = easyFind(R.id.tvTitle); + tvTitle.setText("设置"); + tvBack.setVisibility(View.VISIBLE); + + rlay_phone = easyFind(R.id.rlay_phone); + txt_phonenum = easyFind(R.id.txt_phonenum); + txt_weixin = easyFind(R.id.txt_weixin); + txt_qq = easyFind(R.id.txt_qq); + txt_weibo = easyFind(R.id.txt_weibo); + rlay_updatePwd = easyFind(R.id.rlay_updatePwd); + rlay_authority = easyFind(R.id.rlay_authority); + rlay_push = easyFind(R.id.rlay_push); + rlay_feedback = easyFind(R.id.rlay_feedback); + rlay_aboutus = easyFind(R.id.rlay_aboutus); + rlay_protocol = easyFind(R.id.rlay_protocol); + btn_exit = easyFind(R.id.btn_exit); + tv_cache = easyFind(R.id.tv_cache); + rl_clean = easyFind(R.id.rl_clean); + setCache();//设置缓存 + } + + /** + * 设置缓存 + */ + private void setCache() { + long size = getCacheFileSize(); + String sizeWithUnit = CommonUtil.FormetFileSize(size); + if(JqStrUtil.isEmpty(sizeWithUnit)|| ".00B".equals(sizeWithUnit)){ + tv_cache.setText("0kb"); + }else{ + tv_cache.setText(sizeWithUnit); + } + } + + private void initEvents() { + tvBack.setOnClickListener(this); + btn_exit.setOnClickListener(this); + rlay_phone.setOnClickListener(this); + + txt_weixin.setOnClickListener(this); + txt_qq.setOnClickListener(this); + txt_weibo.setOnClickListener(this); + //密码修改 + rlay_updatePwd.setOnClickListener(this); + //权限设置 + rlay_authority.setOnClickListener(this); + //推送设置 + rlay_push.setOnClickListener(this); + //意见反馈 + rlay_feedback.setOnClickListener(this); + //关于我们 + rlay_aboutus.setOnClickListener(this); + //用户协议 + rlay_protocol.setOnClickListener(this); + //清楚缓存 + rl_clean.setOnClickListener(this); + + userID = SpUtils.getString(Constant.USER_ID); + mobile = SpUtils.getString(Constant.MOBILE); + txt_phonenum.setText(JqStrUtil.returnStarPhone(mobile)); + } + + private void reqThirdBound(){ + String thirdBoundUrl = Constant.COMMON_URL + Interface.BOUND_STATUS; + JSONObject obj = new JSONObject(); + obj.put("userID", userID); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(SettingActivity.this, true, thirdBoundUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if ("1".equals(rsCode)) { + String message = jsonObject.getString("message"); + JSONObject obj = JSON.parseObject(message); + wechat = obj.getString("wechat"); + qq = obj.getString("qq"); + weibo = obj.getString("weibo"); + Log.d(TAG, "wechat: " + wechat); + Log.d(TAG, "qq: " + qq); + Log.d(TAG, "weibo: " + weibo); + if ("1".equals(wechat)) { + txt_weixin.setText("已绑定"); + txt_weixin.setTextColor(getResources().getColor(R.color.gray_normal)); + } else { + txt_weixin.setText("未绑定"); + txt_weixin.setTextColor(getResources().getColor(R.color.adds_blue)); + } + if ("1".equals(qq)) { + txt_qq.setText("已绑定"); + txt_qq.setTextColor(getResources().getColor(R.color.gray_normal)); + } else { + txt_qq.setText("未绑定"); + txt_qq.setTextColor(getResources().getColor(R.color.adds_blue)); + } + if ("1".equals(weibo)) { + txt_weibo.setText("已绑定"); + txt_weibo.setTextColor(getResources().getColor(R.color.gray_normal)); + } else { + txt_weibo.setText("未绑定"); + txt_weibo.setTextColor(getResources().getColor(R.color.adds_blue)); + } + }else { + JqStrUtil.showToast(SettingActivity.this, explanation); + } + } + }, null); + } + + + private void bound(final int action) { + String thirdBoundUrl = Constant.COMMON_URL + Interface.THIRD_BOUND; + JSONObject obj = new JSONObject(); + obj.put("userID", userID); + obj.put("action", action); + obj.put("usID", usID); + obj.put("type", thirdType);//1微信 2QQ 3微博 + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(SettingActivity.this, true, thirdBoundUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + Log.d(TAG, "onResponse: " + rsCode); + if ("1".equals(rsCode)) { + if (action == 2) { + switch (thirdType) { + case 1: + txt_weixin.setText("已绑定"); + txt_weixin.setTextColor(getResources().getColor(R.color.gray_normal)); + wechat = "1"; + break; + case 2: + txt_qq.setText("已绑定"); + txt_qq.setTextColor(getResources().getColor(R.color.gray_normal)); + qq = "1"; + break; + case 3: + txt_weibo.setText("已绑定"); + txt_weibo.setTextColor(getResources().getColor(R.color.gray_normal)); + weibo = "1"; + break; + default: + break; + } + } else if (action == 3) { + switch (thirdType) { + case 1: + txt_weixin.setText("未绑定"); + txt_weixin.setTextColor(getResources().getColor(R.color.adds_blue)); + wechat = "0"; + break; + case 2: + txt_qq.setText("未绑定"); + txt_qq.setTextColor(getResources().getColor(R.color.adds_blue)); + qq = "0"; + break; + case 3: + txt_weibo.setText("未绑定"); + txt_weibo.setTextColor(getResources().getColor(R.color.adds_blue)); + weibo = "0"; + break; + default: + break; + } + } + } + JqStrUtil.showToast(SettingActivity.this, explanation); + } + }, null); + } + + @Override + public void onClick(View view) { + switch (view.getId()) { + case R.id.img_leftBtn: + this.finish(); + break; + case R.id.rlay_phone: + Intent intent = new Intent(SettingActivity.this, GetVerifyCodeActivity.class); + intent.putExtra("mobile", mobile); + intent.putExtra("flag","verify"); + startActivity(intent); + break; + case R.id.txt_weixin: + thirdType = 1; + if ("1".equals(wechat)) {//解绑 + //对话框 + CustomDialog.Builder builder = new CustomDialog.Builder(SettingActivity.this); + builder.setTitle("解除绑定"); + builder.setMessage("确定要解除微信绑定吗?"); + builder.setPositiveButton(R.string.confirm,new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + bound(3); + dialog.dismiss(); + } + }); + builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }); + builder.create().show(); + } else { + platform = SHARE_MEDIA.WEIXIN; + umShareAPI.doOauthVerify(SettingActivity.this, platform, umAuthListener); + } + break; + case R.id.txt_qq: + thirdType = 2; + if ("1".equals(qq)) {//解绑 + //对话框 + CustomDialog.Builder builder = new CustomDialog.Builder(SettingActivity.this); + builder.setTitle("解除绑定"); + builder.setMessage("确定要解除QQ绑定吗?"); + builder.setPositiveButton(R.string.confirm,new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + bound(3); + dialog.dismiss(); + } + }); + builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }); + builder.create().show(); + } else { + platform = SHARE_MEDIA.QQ; + umShareAPI.doOauthVerify(SettingActivity.this, platform, umAuthListener); + } + break; + case R.id.txt_weibo: + thirdType = 3; + if ("1".equals(weibo)) {//解绑 + //对话框 + CustomDialog.Builder builder = new CustomDialog.Builder(SettingActivity.this); + builder.setTitle("解除绑定"); + builder.setMessage("确定要解除微博绑定吗?"); + builder.setPositiveButton(R.string.confirm,new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + bound(3); + dialog.dismiss(); + } + }); + builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }); + builder.create().show(); + } else { + platform = SHARE_MEDIA.SINA; + umShareAPI.doOauthVerify(SettingActivity.this, platform, umAuthListener); + } + break; + case R.id.rlay_updatePwd: + MobclickAgent.onEvent(SettingActivity.this, "mycore8"); + Intent passwordIntent = new Intent(SettingActivity.this, UpdatePwdActivity.class); + startActivity(passwordIntent); + break; + case R.id.rlay_authority: + Intent authorityIntent = new Intent(SettingActivity.this, SetAuthorityActivity.class); + startActivity(authorityIntent); + break; + case R.id.rlay_push: + Intent pushIntent = new Intent(SettingActivity.this, SetPushActivity.class); + startActivity(pushIntent); + break; + case R.id.btn_exit: + unlogin(); + break; + case R.id.rlay_feedback: + Intent feedbackIntent = new Intent(this, FeedBackActivity.class); + startActivity(feedbackIntent); + break; + case R.id.rlay_aboutus: + Intent aboutusIntent = new Intent(this, CommonH5Activity.class); + aboutusIntent.putExtra("title","关于我们"); +// Intent aboutusIntent = new Intent(this, MinaLongConnectActivity.class); + startActivity(aboutusIntent); + break; + case R.id.rlay_protocol: + Intent protocolIntent = new Intent(this,CommonH5Activity.class); + startActivity(protocolIntent); + break; + case R.id.rl_clean: + requestClearPermission(); + break; + default: + break; + } + } + + /** + * 请求清除缓存时可能需要的读写内存卡的权限 + */ + private void requestClearPermission() { + List permissionList = new ArrayList<>(); + if(ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){ + permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); + } + if(!permissionList.isEmpty()){ + String[] permissions = permissionList.toArray(new String[permissionList.size()]); + ActivityCompat.requestPermissions(this,permissions,0x01); + }else{ + clearCache(); + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + switch (requestCode){ + case 0x01: + if(grantResults.length>0){ + for (int result : grantResults){ + if(result!=PackageManager.PERMISSION_GRANTED){ + return; + }else{ + clearCache(); + } + } + }else{ + return; + } + break; + default: + break; + } + } + + /** + * 清除缓存 + */ + private void clearCache() { + File path = Environment.getExternalStorageDirectory(); + long size = getCacheFileSize(); + String sizeWithUnit = CommonUtil.FormetFileSize(size); + if (!JqStrUtil.isEmpty(sizeWithUnit) + && !".00B".equals(sizeWithUnit)) { + tv_cache.setText("正在清理缓存..."); + if (CommonUtil.removeFileCache(new File(path.getAbsolutePath() + Constant.ELOVE_FILE_DIR))&&CommonUtil.removeFileCache(new File(Constant.GLIDE_CACHE))) { + handler.sendEmptyMessageDelayed(CLEAR_SUCCESS,1000); + } else { + JqStrUtil.showToast(this, "请稍后再试!"); + } + } else { + JqStrUtil.showToast(this, "暂无缓存!"); + } + + } + + /** + * handler来执行ui状态展示 + */ + private Handler handler = new Handler(){ + @Override + public void handleMessage(Message msg) { + switch (msg.what){ + case CLEAR_SUCCESS: + JqStrUtil.showToast(SettingActivity.this, "清除缓存成功!"); + tv_cache.setText("0kb"); + break; + } + } + }; + + /** + * 注销登录 + */ + private void unlogin() { + //对话框 + CustomDialog.Builder builder = new CustomDialog.Builder(SettingActivity.this); + builder.setTitle("注销"); + builder.setMessage("确定要退出登录吗?"); + builder.setPositiveButton(R.string.confirm,new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + exitHandleSp();//处理缓存 + DemoDBManager.getInstance().deleteMessage(); + dialog.dismiss(); + shutJpush();//关闭极光推送 + EaseHxHelper.hxLogout();//环信退出 + NewsAgent.logOutComment();//智通退出 + finish(); + if(HomePageFragment.instance!=null){ + HomePageFragment.instance.refresh(); + } + } + }); + builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }); + builder.create().show(); + } + + private void exitHandleSp() { + int adtype = SpUtils.getInt(Constant.AD_TYPE); + String adid = SpUtils.getString(Constant.AD_ID); + String versonCode = SpUtils.getString(Constant.VERSION_CODE); + String isGetAuth = SpUtils.getString(Constant.AUTH_IS); + SpUtils.clearSp(); + SpUtils.setBoolean(Constant.FIRST_IS,false); + SpUtils.setString(Constant.VERSION_CODE,versonCode); + SpUtils.setString(Constant.AD_ID,adid); + SpUtils.setInt(Constant.AD_TYPE,adtype); + SpUtils.setString(Constant.AUTH_IS,isGetAuth); + } + + private void shutJpush(){ + HashSet tagSet = new HashSet<>(); + tagSet.add(Constant.VERSION); + // 调用 JPush 接口来设置别名。 + JPushInterface.setAliasAndTags(getApplicationContext(), + "", + tagSet, + mAliasCallback); + } + + private final TagAliasCallback mAliasCallback = new TagAliasCallback() { + @Override + public void gotResult(int code, String alias, Set tags) { + String logs ; + switch (code) { + case 0: + logs = "Set tag and alias success"; + Log.i(TAG, logs); + // 建议这里往 SharePreference 里写一个成功设置的状态。成功设置一次后,以后不必再次设置了。 + SharedPreferences sp = getSharedPreferences("elove",MODE_PRIVATE); + SharedPreferences.Editor editor = sp.edit(); + editor.putString("isSave","3");//已经将该用户的alias保存到服务器,以后可以不保存了 + editor.apply(); + break; + case 6002: + logs = "Failed to set alias and tags due to timeout. Try again after 60s."; + Log.i(TAG, logs); + // 延迟 60 秒来调用 Handler 设置别名 +// mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_SET_ALIAS, alias), 1000 * 60); + break; + default: + logs = "Failed with errorCode = " + code; + Log.e(TAG, logs); + } + } + }; + + /** + * auth callback interface + **/ + private UMAuthListener umAuthListener = new UMAuthListener() { + + @Override + public void onComplete(SHARE_MEDIA platform, int action, Map data) { + if(thirdType == 1){ + usID = data.get("openid"); + }else{ + usID = data.get("uid"); + } + if(!JqStrUtil.isEmpty(usID)){ + Log.d(TAG,"usID:"+usID); + bound(2); + }else{ + JqStrUtil.showToast(SettingActivity.this,"获取信息失败,请重试"); + } + Log.d(TAG,"user info:"+data.toString()); + } + + public void onError(SHARE_MEDIA platform, int action, Throwable t) { + JqStrUtil.showToast(SettingActivity.this, "授权失败..."); + } + + @Override + public void onCancel(SHARE_MEDIA platform, int action) { + } + }; + + // 如果有使用任一平台的SSO授权, 则必须在对应的activity中实现onActivityResult方法, 并添加如下代码 + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + umShareAPI.onActivityResult(requestCode, resultCode, data); + } + + @Override + protected void onResume() { + super.onResume(); + mobile = SpUtils.getString(Constant.MOBILE); + txt_phonenum.setText(JqStrUtil.returnStarPhone(mobile)); + } + + /** + * 获取缓存文件大小(long) + */ + private Long getCacheFileSize() { + long glideSize = 0; + long otherSize = 0; + long totalSize; + try { + otherSize = CommonUtil.getFileSize(new File(Environment.getExternalStorageDirectory().getAbsolutePath()+Constant.ELOVE_FILE_DIR)); + glideSize = CommonUtil.getFileSize(new File(Constant.GLIDE_CACHE)); + } catch (Exception e) { + e.printStackTrace(); + } + totalSize = glideSize + otherSize; + return totalSize; + + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/SlidingPageActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/SlidingPageActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..7b42af78c6a8634d7ab212b770aa08fa2eec96b8 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/SlidingPageActivity.java @@ -0,0 +1,99 @@ +package com.jiuqi.elove.activity; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; +import com.jiuqi.elove.R; +import com.jiuqi.elove.util.StatusBarUtils; +import com.zhouwei.mzbanner.MZBannerView; +import com.zhouwei.mzbanner.holder.MZHolderCreator; +import com.zhouwei.mzbanner.holder.MZViewHolder; + +import java.util.Arrays; +import java.util.List; + +/** + * 描述: 引导页 + * @author liulin + * + */ +public class SlidingPageActivity extends Activity { + + public static final Integer[] RES = {R.drawable.first,R.drawable.second,R.drawable.third,R.drawable.fourth}; + private MZBannerView bannerView; + private List datas; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_slidingpage); + StatusBarUtils.setFullScreen(this); + initData(); + initView(); + } + + private void initData() { + datas = Arrays.asList(RES); + } + + private void initView() { + bannerView = (MZBannerView) findViewById(R.id.slide_view); + bannerView.setPages(datas, new MZHolderCreator() { + @Override + public MZViewHolder createViewHolder() { + return new ViewPagerHolder(); + } + }); + } + + public final class ViewPagerHolder implements MZViewHolder { + private ImageView mImageView; + private TextView tvLogin; + + @Override + public View createView(Context context) { + View view = LayoutInflater.from(context).inflate(R.layout.sliding_play_view_item,null); + mImageView = (ImageView) view.findViewById(R.id.viewPager_item_image); + tvLogin = (TextView) view.findViewById(R.id.goto_login); + return view; + } + + @Override + public void onBind(Context context, int position, Integer data) { + mImageView.setImageResource(data); + if(datas.size()-1==position){ + tvLogin.setVisibility(View.VISIBLE); + tvLogin.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Intent intent; +// if(JqStrUtil.isEmpty(getUserIdFromSp())){ +// intent = new Intent(SlidingPageActivity.this,LoginOrRegisterActivity.class); +// }else{ + intent = new Intent(SlidingPageActivity.this,MainActivity.class); +// } + startActivity(intent); + // 本页面结束 + finish(); + } + }); + }else{ + tvLogin.setVisibility(View.GONE); + } + } + } + + /** + * 获取userid + */ + private String getUserIdFromSp(){ + SharedPreferences sp = getSharedPreferences("elove",MODE_PRIVATE); + return sp.getString("userid",""); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/SysRecommendActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/SysRecommendActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..7c9f724f1cf3a8772690b7f6a473ba974fdddc29 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/SysRecommendActivity.java @@ -0,0 +1,263 @@ +package com.jiuqi.elove.activity; + +import android.content.DialogInterface; +import android.content.Intent; +import android.os.Bundle; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.View; +import android.widget.RelativeLayout; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.hyphenate.easeui.EaseConstant; +import com.jiuqi.elove.R; +import com.jiuqi.elove.adapter.SysRecommendAdapter; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.entity.SysRecommendModel; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; +import com.jiuqi.elove.widget.dialog.CustomDialog; +import com.jiuqi.elove.widget.pulltorefresh.PullToRefreshLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; + +public class SysRecommendActivity extends ABaseActivity implements PullToRefreshLayout.OnRefreshListener{ + + /** + * 组件 + */ + @BindView(R.id.rlay_nodata) + RelativeLayout rlay_nodata; + @BindView(R.id.refresh_view) + PullToRefreshLayout refresh_view; + @BindView(R.id.rv) + RecyclerView rv; + + /** + * 数据 + */ + private String limit = "10"; + private String offset = "1"; + private String userid; + private List mList; + private List mAddList; + private SysRecommendModel recommendModel; + private String title; + /** + * 工具 + */ + private SysRecommendAdapter adapter; + private boolean isshow = true; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getDataFromSp(); + setContentView(R.layout.activity_sys_recommend,title,-1,MODE_BACK,HEIGHT_REDBG_WHITEFONT); + setAdapter(); + loadData2View(); + } + + /** + * 获取数据 + */ + private void getDataFromSp() { + userid = SpUtils.getString(Constant.USER_ID); + title = getIntent().getStringExtra("title"); + } + + /** + * 初始化list,设置adapter + */ + private void setAdapter() { + adapter = new SysRecommendAdapter(this,R.layout.item_sys_recommend,"recommend"); + rv.setLayoutManager(new LinearLayoutManager(this)); + rv.setAdapter(adapter); + //初始化list,并且设置监听事件 + mAddList = new ArrayList<>(); + refresh_view.setOnRefreshListener(this); + adapter.setListener(new SysRecommendAdapter.ItemClickListener() { + @Override + public void onItemClick(SysRecommendModel model,int position) { + recommendModel = model; + startDetailPage(model); + } + + @Override + public void focus(SysRecommendModel model, SysRecommendAdapter.MyViewHolder holder) { + if(Constant.ATTENTION_NOT.equals(model.getIfattention())){ + addFocus(model,holder,Constant.ACTION_ADDFOCUS); + }else{ + showSureDialog(model,holder,Constant.ACTION_ADDFOCUS); + } + } + + @Override + public void talk(SysRecommendModel model) { + startSingleTalk(model); + } + }); + } + + /** + * 聊天 + */ + private void startSingleTalk(SysRecommendModel model) { + Intent intent = new Intent(this, ChatActivity.class); + intent.putExtra("chatType", EaseConstant.CHATTYPE_SINGLE);//2.0.2版本加群聊之后做区分 + intent.putExtra("userId",model.getUserID().toLowerCase()); + intent.putExtra("nikeName",model.getNickname()); + intent.putExtra("avatar",model.getAvatar()); + startActivity(intent); + } + + /** + * 进入他人中心 + * @param model 他人实体对象 + */ + private void startDetailPage(SysRecommendModel model){ + Intent intent = new Intent(this,OtherPersonCenterActivity.class); + intent.putExtra("otherid",model.getUserID()); + intent.putExtra("flag","fellfor"); + startActivityForResult(intent,0x03); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if(requestCode==0x03&&resultCode==0x03){//他人中心发生关注事件 + String isFocus = data.getStringExtra("isFocus"); + if(!JqStrUtil.isEmpty(isFocus)){ + recommendModel.setIfattention(isFocus); + } + adapter.updateListView(mAddList); + } + } + + /** + * 添加关注或者取消关注 + * @param model 附近人列表 + * @param vh 一个item的示例 + * @param action 判断是关注还是取消 + */ + private void addFocus(final SysRecommendModel model, final SysRecommendAdapter.MyViewHolder vh, final String action) { + String focusUrl = Constant.COMMON_URL + Interface.ADD_FOCUS; + String otherId = model.getUserID(); + JSONObject obj = new JSONObject(); + obj.put("otherID",otherId); + obj.put("userID",userid); + obj.put("action",action); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this,true,focusUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if("1".equals(rsCode)) { + String isLike = ""; + if ("1".equals(action)) { + isLike = "1"; + vh.img_focus.setImageResource(R.drawable.icon_focus_pink); + } else if ("2".equals(action)) { + vh.img_focus.setImageResource(R.drawable.icon_focus_gray); + isLike = "0"; + } + model.setIfattention(isLike); +// mList.remove(position); +// mList.add(position,model);//更新list中的model,否则获取数据时是已经从服务器中得到的旧list,点赞数据导致不一致 + adapter.notifyDataSetChanged();//通知更新,否则不好用 + } + showToast(explanation); + } + },null); + } + + private void showSureDialog(final SysRecommendModel model, final SysRecommendAdapter.MyViewHolder vh, final String action) { + CustomDialog.Builder builder = new CustomDialog.Builder(this); + builder.setTitle(""); + builder.setMessage("确定要取消关注吗?"); + builder.setPositiveButton(R.string.confirm,new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + addFocus(model,vh,Constant.ACTION_UNFOCUS); + dialog.dismiss(); + } + }); + builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }); + builder.create().show(); + } + + private void loadData2View() { + String actUrl = Constant.COMMON_URL + Interface.SYS_RECOMMEND; + JSONObject obj = new JSONObject(); + obj.put("userID",userid); + obj.put("offset",offset); + obj.put("limit",limit); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, isshow, actUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String msg = jsonObject.getString("explanation"); + if(Constant.SUCCESS_CODE.equals(rsCode)){ + handleData2View(jsonObject); + }else{ + showToast(msg); + } + } + },null); + } + + /** + * 根据结果设置展示效果 + */ + private void handleData2View(JSONObject obj) { + String result = obj.getString("message"); + mList = JSONArray.parseArray(result,SysRecommendModel.class); + mAddList.addAll(mList); + if(mAddList.isEmpty()){ + rlay_nodata.setVisibility(View.VISIBLE); + }else{ + rlay_nodata.setVisibility(View.GONE); + if (!mList.isEmpty()) { + adapter.updateListView(mAddList); + refresh_view.refreshFinish(PullToRefreshLayout.SUCCEED); + } else { + refresh_view.loadmoreFinish(PullToRefreshLayout.SUC_NODATA); + } + } + } + + @Override + public void onRefresh(PullToRefreshLayout pullToRefreshLayout) { + isshow = false; + offset = "1"; + mAddList.clear(); + loadData2View(); + } + + @Override + public void onLoadMore(PullToRefreshLayout pullToRefreshLayout) { + isshow = false; + offset = String.valueOf(Integer.parseInt(offset)+1); + loadData2View(); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + okHttpUtil.cancelTag(this); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/SystemMsgActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/SystemMsgActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..a42fdcc389262710656525f06ae9f1d55a5d6b8a --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/SystemMsgActivity.java @@ -0,0 +1,216 @@ +package com.jiuqi.elove.activity; + +import android.content.DialogInterface; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; +import android.widget.ListView; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.hyphenate.chat.EMClient; +import com.hyphenate.chat.EMConversation; +import com.hyphenate.easeui.EaseConstant; +import com.hyphenate.easeui.controller.EaseUI; +import com.hyphenate.easeui.utils.EaseCommonUtils; +import com.jiuqi.elove.R; +import com.jiuqi.elove.adapter.SystemMsgAdapter; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.common.JqBaseActivity; +import com.jiuqi.elove.entity.SysMsgModel; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; +import com.jiuqi.elove.widget.dialog.CustomDialog; +import com.jiuqi.elove.widget.pulltorefresh.PullToRefreshLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import butterknife.OnClick; + +/** + * + * Created by dl on 2016/8/3. + */ +public class SystemMsgActivity extends ABaseActivity implements PullToRefreshLayout.OnRefreshListener{ + + private static final String TAG = "SystemMsgActivity"; + + /** + * 组件 + */ + @BindView(R.id.lv_sysmsg) + ListView lv_sysmsg; + @BindView(R.id.iv_right) + ImageView iv_right; + @BindView(R.id.rl_right) + RelativeLayout rl_right; + @BindView(R.id.rlay_nodata) + RelativeLayout rlay_nodata; + @BindView(R.id.refresh_view) + PullToRefreshLayout ptrl; + + /** + * 数据 + */ + private int page = 1; + private String pagesize = "10"; + private String userId; + private EMConversation conversation; + private String conversationId; + private List msglist; + private List msgaddlist; + /** + * 工具 + */ + private boolean isshow = true; + private SystemMsgAdapter msgAdapter; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_systemmsg_layout,"消息中心"); + getDataFromPrePageAndSp();//获取上个页面的标志数据 + initView();//初始化组件 + initListView();//获取数据 + setListener();//注册事件 + } + + private void getDataFromPrePageAndSp() { + userId = SpUtils.getString(Constant.USER_ID); + conversationId = getIntent().getStringExtra("conversation"); + } + + /** + * ListView初始化方法 + */ + private void initListView() + { + msgAdapter = new SystemMsgAdapter(SystemMsgActivity.this); + lv_sysmsg.setAdapter(msgAdapter); + msgaddlist = new ArrayList<>(); + page = 1; + getSysMsg(); + } + + private void setListener() { + ptrl.setOnRefreshListener(this); + rl_right.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + showSelectEmpty(); + } + }); + } + + private void showSelectEmpty() { + //对话框 + CustomDialog.Builder builder = new CustomDialog.Builder(SystemMsgActivity.this); + builder.setTitle("清空信息"); + builder.setMessage("确定要清空推送信息么?"); + builder.setPositiveButton(R.string.confirm,new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + deleteSysMsg(); + dialog.dismiss(); + } + }); + builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }); + builder.create().show(); + } + + private void deleteSysMsg() { + String deleMsgUrl = Constant.COMMON_URL + Interface.DELETE_INFOCENTER; + JSONObject obj = new JSONObject(); + obj.put("userID",userId); + obj.put("version",Constant.VERSION); + String param = JSON.toJSONString(obj); + okHttpUtil.sendJsonStrByPostAsync(SystemMsgActivity.this,true,deleMsgUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + Log.d("ok", "onResponse: "+rsCode); + if("1".equals(rsCode)){ + msgaddlist = new ArrayList<>(); + page = 1; + getSysMsg(); + } + } + },null); + } + private void getSysMsg() { + String msgcenterUrl = Constant.COMMON_URL + Interface.INFO_CENTER; + JSONObject obj = new JSONObject(); + obj.put("pageindex",page); + obj.put("pagesize",pagesize); + obj.put("userID",userId); + obj.put("version",Constant.VERSION); + String param = JSON.toJSONString(obj); + okHttpUtil.sendJsonStrByPostAsync(SystemMsgActivity.this,isshow,msgcenterUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + isshow = false; + String rsCode = jsonObject.getString("retcode"); + if("1".equals(rsCode)){ + String result = jsonObject.getString("message"); + Log.d(TAG,result); + msglist = JSON.parseArray(result,SysMsgModel.class); + msgaddlist.addAll(msglist); + if(msgaddlist.isEmpty()){ + rlay_nodata.setVisibility(View.VISIBLE); + }else{ + if(!msglist.isEmpty()){ + rlay_nodata.setVisibility(View.GONE); + msgAdapter.updateListView(msgaddlist); + ptrl.refreshFinish(PullToRefreshLayout.SUCCEED); + }else{ + ptrl.loadmoreFinish(PullToRefreshLayout.SUC_NODATA); + } + } + } + if("114".equals(rsCode)){ + ptrl.loadmoreFinish(PullToRefreshLayout.SUC_NODATA); + } + } + },null); + } + + @Override + public void onRefresh(PullToRefreshLayout pullToRefreshLayout) { + // 下拉刷新操作 + msgaddlist = new ArrayList<>(); + page = 1; + getSysMsg(); + } + + @Override + public void onLoadMore(PullToRefreshLayout pullToRefreshLayout) { + ++page; + getSysMsg(); + } + + private void initView() { + iv_right.setImageResource(R.drawable.icon_cancle); + iv_right.setVisibility(View.VISIBLE); + } + + @Override + protected void onResume() { + super.onResume(); + conversation = EMClient.getInstance().chatManager().getConversation(conversationId, EaseCommonUtils.getConversationType(EaseConstant.CHATTYPE_SINGLE), true); + conversation.markAllMessagesAsRead(); + // cancel the notification + EaseUI.getInstance().getNotifier().reset(); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/TaskRewardActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/TaskRewardActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..0833349ffdf28eb27adb8f2b9126de650167ff83 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/TaskRewardActivity.java @@ -0,0 +1,204 @@ +package com.jiuqi.elove.activity; + +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.common.JqBaseActivity; +import com.jiuqi.elove.entity.TaskRewardModel; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; + +import java.util.List; + +/** + * Created by FanWenXia on 2017/1/19. + */ +public class TaskRewardActivity extends JqBaseActivity implements View.OnClickListener{ + + private static final String TAG = "TaskRewardActivity"; + + /*顶部菜单栏按钮*/ + private TextView tvTitle; + private ImageView tvBack; + + private LinearLayout ll_task_list; + + private List taskList; + + private String userID;//用户ID + private OkHttpUtil okHttpUtil = OkHttpUtil.getInstance(); + public static TaskRewardActivity instance; + + private boolean isshow = true; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_task_reward); + instance = this; + initView(); + initEvents(); + reqTaskReward(); + + + } + + private void initView() { + tvBack = (ImageView) findViewById(R.id.img_leftBtn); + tvTitle = (TextView) findViewById(R.id.tvTitle); + tvTitle.setText("完成任务获得奖励"); + tvBack.setVisibility(View.VISIBLE); + + ll_task_list = (LinearLayout) findViewById(R.id.ll_task_list); + } + + private void initEvents() { + tvBack.setOnClickListener(this); + + userID = SpUtils.getString(Constant.USER_ID); + } + + + + private void reqTaskReward(){ + String thirdBoundUrl = Constant.COMMON_URL + Interface.TASK_REWARD; + JSONObject obj = new JSONObject(); + obj.put("userid", userID); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(TaskRewardActivity.this, isshow, thirdBoundUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if ("1".equals(rsCode)) { + String list = jsonObject.getString("list"); + Log.d(TAG, "message: " + list); + taskList = JSON.parseArray(list, TaskRewardModel.class); + TaskRewardActivity.this.runOnUiThread(new Runnable() { + @Override + public void run() { + ll_task_list.removeAllViews(); + for (int i = 0; i < taskList.size(); i++) { + View view = LayoutInflater.from(TaskRewardActivity.this).inflate(R.layout.item_task, null); + RelativeLayout rlay_container = (RelativeLayout) view.findViewById(R.id.rlay_container);; + TextView tv_task = (TextView) view.findViewById(R.id.tv_task); + TextView tv_task_status = (TextView) view.findViewById(R.id.tv_task_status); + tv_task.setText(taskList.get(i).getName()); + if (taskList.get(i).getIffinish().equals("0")){ + tv_task.setTextColor(getResources().getColor(R.color.pink_font)); + tv_task_status.setText("+"+taskList.get(i).getRedbean()+"元宝"); + tv_task_status.setTextColor(getResources().getColor(R.color.pink_font)); + switch (taskList.get(i).getName()){ + case "交友宣言": + rlay_container.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent introduceIntent = new Intent(TaskRewardActivity.this, MyIntroduceActivity.class); + startActivity(introduceIntent); + } + }); + break; + case "兴趣爱好": + rlay_container.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent hobbyIntent = new Intent(TaskRewardActivity.this,MyHobbyActivity.class); + startActivity(hobbyIntent); + } + }); + break; + case "标签": + rlay_container.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent markIntent = new Intent(TaskRewardActivity.this,MyMarkActivity.class); + markIntent.putExtra("owner","isme"); + startActivity(markIntent); + } + }); + break; + case "相册(3张以上)": + rlay_container.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent photoIntent = new Intent(TaskRewardActivity.this,MyPhotoActivity.class); + startActivity(photoIntent); + } + }); + break; + case "详细资料": + rlay_container.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent detailIntent = new Intent(TaskRewardActivity.this,EditMyInfoActivity.class); + detailIntent.putExtra("pageKind","singleDetail"); + startActivity(detailIntent); + } + }); + break; + case "择偶要求": + rlay_container.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent demandIntent = new Intent(TaskRewardActivity.this,EditMyInfoActivity.class); + demandIntent.putExtra("pageKind","singleDemand"); + startActivity(demandIntent); + } + }); + break; + default: + break; + } + }else{ + tv_task_status.setText("完成"); + } + ll_task_list.addView(view); + } + } + }); + }else { + JqStrUtil.showToast(TaskRewardActivity.this, explanation); + } + } + }, null); + } + + @Override + public void onClick(View view) { + switch (view.getId()) { + case R.id.img_leftBtn: + this.finish(); + break; + default: + break; + } + } + + @Override + protected void onDestroy() { + super.onDestroy(); + if(instance!=null){ + instance = null; + } + } + public void refresh(){ + isshow = false; + reqTaskReward(); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/TimedPushActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/TimedPushActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..4bc03cc46b9c052b79d8fc3dd29c7299dd73379b --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/TimedPushActivity.java @@ -0,0 +1,236 @@ +package com.jiuqi.elove.activity; + +import android.app.Activity; +import android.app.NotificationManager; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.graphics.Bitmap; +import android.os.Bundle; +import android.support.v4.graphics.drawable.RoundedBitmapDrawable; +import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory; +import android.util.Log; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.target.BitmapImageViewTarget; +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; + +/** + * Created by jq on 2016/10/14. + */ +public class TimedPushActivity extends Activity implements View.OnClickListener{ + + private static final String TAG = "TimedPushActivity"; + private ImageView iv_avatar; + private TextView tv_icon; + private TextView tv_line_one; + private TextView tv_line_two; + private RelativeLayout rlay_cancel_btn; + private RelativeLayout rlay_like_btn; + private LinearLayout ll_all; + + /** + * 用户信息数据 + */ + private String avatar; + private String name; + private String sex; + private String age; + private String kind; + private String enterprise; + private String userId; + private String otherId; + private String type;//0代表不喜欢 1代表喜欢 + private String ifac; + + private final OkHttpUtil okHttpUtil = OkHttpUtil.getInstance(); + + + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getWindow().requestFeature(Window.FEATURE_NO_TITLE); + setContentView(R.layout.dialog_timed_push); + SharedPreferences sp = getSharedPreferences("elove",MODE_PRIVATE); + userId = sp.getString("userid",""); + ifac = sp.getString("ifac",""); + Intent it = getIntent(); + int notifyId = it.getIntExtra("cancelId",1024); + //此部分其实没有用了,没有上一级了 + avatar = it.getStringExtra("avatar"); + Log.d(TAG, " :avatar "+ avatar); + name= it.getStringExtra("name"); + sex= it.getStringExtra("sex"); + age= it.getStringExtra("age"); + kind= it.getStringExtra("kind"); + enterprise= it.getStringExtra("enterprise"); + otherId= it.getStringExtra("otherId"); + NotificationManager notificationManager + = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); + notificationManager.cancel(notifyId); + if(JqStrUtil.isEmpty(avatar)){ + requestRecommendedUser(); + }else { +// addViewData(); + } + } + + private void initView() { + iv_avatar = (ImageView) findViewById(R.id.iv_avatar); + tv_icon = (TextView)findViewById(R.id.tv_icon); + tv_line_one = (TextView) findViewById(R.id.tv_line_one); + tv_line_two = (TextView) findViewById(R.id.tv_line_two); + rlay_cancel_btn = (RelativeLayout) findViewById(R.id.rlay_cancel_btn); + rlay_like_btn = (RelativeLayout) findViewById(R.id.rlay_like_btn); + ll_all = (LinearLayout) findViewById(R.id.ll_all); + } + private void initEvent() { + iv_avatar.setOnClickListener(this); + rlay_cancel_btn.setOnClickListener(this); + rlay_like_btn.setOnClickListener(this); + } + + /** + * 请求整点推荐的用户信息 + */ + private void requestRecommendedUser(){ + String requestUrl = Constant.COMMON_URL + Interface.RECOMMENDED_USER; + //屏蔽活动的请求参数 + JSONObject obj = new JSONObject(); + obj.put("userID",userId); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + Log.d(TAG, " :getData "+param); + okHttpUtil.sendJsonStrByPostAsync(TimedPushActivity.this,false,requestUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + Log.d(TAG, "onResponse: "+jsonObject); + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + String message = jsonObject.getString("message"); + Log.d(TAG, " :message "+message); + JSONObject obj = JSON.parseObject(message); + if("1".equals(rsCode)){ + initView(); + initEvent(); + avatar = obj.getString("avatar"); + name = obj.getString("name"); + sex = obj.getString("sex");//1男 2 女 + age = obj.getString("age"); + kind = obj.getString("kind");//1 企业用户 0 普通用户 + enterprise = obj.getString("enterprise"); + otherId = obj.getString("userID"); + addViewData(); + }else{ + JqStrUtil.showToast(getApplicationContext(),"每晚八点钟准时推荐你的缘分,当天有效,请不要再错过了哦~"); + finish(); + } + } + },null); + } + + private void addViewData(){ + ll_all.setVisibility(View.VISIBLE); + if(!JqStrUtil.isEmpty(avatar)){ + Log.d(TAG, "avatar not empty "+avatar); + Glide.with(TimedPushActivity.this).load(avatar).into(iv_avatar); + }else{ + Log.d(TAG, "avatar is empty "+avatar); + Glide.with(TimedPushActivity.this).load(R.drawable.img_yuanqueshengtouxiang).into(iv_avatar); + } + if("1".equals(kind)){ + tv_icon.setText("已认证"); + if("1".equals(sex)) { + tv_line_one.setText(name+" 男 "+age+"岁"); + }else{ + tv_line_one.setText(name+" 女 "+age+"岁"); + } + tv_line_two.setText(enterprise); + }else{ + tv_icon.setText("未认证"); + tv_line_one.setText(name); + if("1".equals(sex)) { + tv_line_two.setText("男 "+age+"岁"); + }else{ + tv_line_two.setText("女 "+age+"岁"); + } + } + } + + @Override + public void onClick(View v) { + + switch (v.getId()) { + case R.id.iv_avatar: + if("0".equals(kind)&&"1".equals(ifac)){ + return; + } + Intent i = new Intent(TimedPushActivity.this,OtherPersonCenterActivity.class); + i.putExtra("otherid",otherId); + startActivity(i); + break; + case R.id.rlay_cancel_btn: + type = "0"; + handledRecommend(); + break; + case R.id.rlay_like_btn: + type = "1"; + addFocus(); + break; + default: + break; + } + } + + private void addFocus() { + String focusUrl = Constant.COMMON_URL + Interface.ADD_FOCUS; + JSONObject obj = new JSONObject(); + obj.put("otherID",otherId); + obj.put("userID",userId); + obj.put("version",Constant.VERSION); + obj.put("action",1);//1:添加关注 2:取消关注或者删除好友 + String param = obj.toJSONString(); + Log.d("ok", "add: param"+param); + okHttpUtil.sendJsonStrByPostAsync(TimedPushActivity.this,true,focusUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if("1".equals(rsCode)) { + handledRecommend(); + } + JqStrUtil.showToast(TimedPushActivity.this, explanation); + } + },null); + } + + private void handledRecommend() { + String handledRecommendUrl = Constant.COMMON_URL + Interface.HANDLED_RECOMMEND; + JSONObject obj = new JSONObject(); + obj.put("userID",userId); + obj.put("otherID",otherId); + obj.put("type",type); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(getApplicationContext(), false, handledRecommendUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + finish(); + } + }, null); + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/TopicDetailActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/TopicDetailActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..6e341d3b8b585d6930b65c399c1bc9c9cd7a5206 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/TopicDetailActivity.java @@ -0,0 +1,283 @@ +package com.jiuqi.elove.activity; + +import android.content.Intent; +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.support.v4.content.ContextCompat; +import android.support.v4.view.ViewPager; +import android.text.TextUtils; +import android.view.View; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.jiuqi.elove.R; +import com.jiuqi.elove.adapter.ABaseFragmentAdapter; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.entity.CircleCommentModel; +import com.jiuqi.elove.entity.TopicModel; +import com.jiuqi.elove.fragment.HotTopicFragment; +import com.jiuqi.elove.fragment.MyFansFragment; +import com.jiuqi.elove.fragment.MyFocusFragment; +import com.jiuqi.elove.fragment.MyFriendFragment; +import com.jiuqi.elove.fragment.NewTopicFragment; +import com.jiuqi.elove.util.EasyGlide; +import com.jiuqi.elove.util.MyLayoutManager; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.widget.ExpandableTextView; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import butterknife.OnClick; + +public class TopicDetailActivity extends ABaseActivity { + + /** + * 组件 + */ + @BindView(R.id.iv_poster) + ImageView iv_poster; + @BindView(R.id.tv_topic_title) + TextView tv_topic_title; + @BindView(R.id.tv_number) + TextView tv_number; + @BindView(R.id.tv_content) + TextView tv_content; + @BindView(R.id.vp_container) + ViewPager vp_container; + @BindView(R.id.tv_new) + TextView tv_new; + @BindView(R.id.tv_hot) + TextView tv_hot; + @BindView(R.id.iv_new) + ImageView iv_new; + @BindView(R.id.iv_hot) + ImageView iv_hot; + @BindView(R.id.ll_collapse) + LinearLayout ll_collapse; + @BindView(R.id.tv_collapse) + TextView tv_collapse; + @BindView(R.id.iv_collapse) + ImageView iv_collapse; + + /** + * 数据 + */ + public static String topicid; + private TopicModel topicModel; + private int hongRes; + private int blackRes; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_topic_detail,"话题",-1,MODE_BACK,HEIGHT_REDBG_WHITEFONT); + getDataFromPrePage(); + loadTopic(); + initColorAndView(); + initViewPagerAndAddListener(); + } + + /** + * 从缓存或者之前页面获取数据 + */ + private void getDataFromPrePage() { + topicid = getIntent().getStringExtra("topicid"); + } + + /** + * 加载 + */ + private void loadTopic() { + String topicUrl = Constant.COMMON_URL + Interface.CIRCLE_TOPIC_DETAIL; + JSONObject obj = new JSONObject(); + obj.put("topicid", topicid); + obj.put("version", Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, true, topicUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if (Constant.SUCCESS_CODE.equals(rsCode)) { + String temp = jsonObject.getString("message"); + topicModel = JSON.parseObject(temp,TopicModel.class); + setTopic2View(); + } else { + showToast(explanation); + } + } + }, null); + } + + /** + * 获取topic数据填充入view + */ + private void setTopic2View() { + tv_topic_title.setText("#"+topicModel.getTitle()+"#"); + tv_number.setText(topicModel.getHot()); + if(TextUtils.isEmpty(topicModel.getPoster())){ + iv_poster.setVisibility(View.GONE); + }else{ + MyLayoutManager.setImageLayout(this,iv_poster,60,1,1,16,9); + EasyGlide.getInstance().showImage(false, topicModel.getPoster(),iv_poster,-1); + } + if(TextUtils.isEmpty(topicModel.getDetail())){//动态内容 + ll_collapse.setVisibility(View.GONE); + tv_content.setVisibility(View.GONE); + }else{ + tv_content.setVisibility(View.VISIBLE); + tv_content.setText(topicModel.getDetail()); + if(tv_content.getLineCount()>Constant.MAX_LINES){ + tv_content.setMaxLines(Constant.MAX_LINES); + ll_collapse.setVisibility(View.VISIBLE); + ll_collapse.setVisibility(View.VISIBLE); + }else{ + ll_collapse.setVisibility(View.GONE); + } + showAll(); + } + } + + /** + * 是否展示全部 + */ + private void showAll() { + ll_collapse.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if("展开".equals(tv_collapse.getText())){ + tv_content.setEllipsize(null); + tv_content.setSingleLine(false); + tv_collapse.setText("收起"); + iv_collapse.setImageResource(R.drawable.icon_extend); + }else{ + tv_content.setMaxLines(Constant.MAX_LINES); + tv_collapse.setText("展开"); + iv_collapse.setImageResource(R.drawable.icon_retract); + } + } + }); + + } + + private void initColorAndView() { + hongRes = ContextCompat.getColor(this,R.color.colorPrimary); + blackRes = ContextCompat.getColor(this,R.color.blackFont); + } + + /** + * 初始化viewpager以及切换页的监听 + */ + private void initViewPagerAndAddListener() { + List fragmentList = new ArrayList<>(); + fragmentList.add(NewTopicFragment.newInstance()); + fragmentList.add(HotTopicFragment.newInstance()); + ABaseFragmentAdapter adapter = new ABaseFragmentAdapter(getSupportFragmentManager(),fragmentList); + vp_container.setAdapter(adapter); + selectNew();//默认选择会员 + addPageChangeListener(); + } + + @OnClick({R.id.tv_new,R.id.tv_hot}) + public void onClick(View view){ + setAllBlack();//将所有的选项置黑 + switch (view.getId()){ + case R.id.tv_new: + selectNew(); + break; + case R.id.tv_hot: + selectHot(); + break; + } + } + + /** + * 添加viewpager监听 + */ + private void addPageChangeListener() { + vp_container.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + + } + + @Override + public void onPageSelected(int position) { + setAllBlack();//将所有的选项置黑 + if(position==0){ + selectNew(); + }else{ + selectHot(); + } + } + + @Override + public void onPageScrollStateChanged(int state) { + + } + }); + } + + /** + * 选中热门 + */ + private void selectHot() { + setHotHong(); + vp_container.setCurrentItem(1); + } + + /** + * 选中我的好友 + */ + private void selectNew() { + setNewHong(); + vp_container.setCurrentItem(0); + } + + /** + * 将所有的选项置黑 + */ + private void setAllBlack() { + setNewBlack(); + setHotBlack(); + } + + private void setNewHong(){ + tv_new.setTextColor(hongRes); + iv_new.setBackgroundColor(hongRes); + } + + private void setHotHong(){ + tv_hot.setTextColor(hongRes); + iv_hot.setBackgroundColor(hongRes); + } + + private void setNewBlack(){ + tv_new.setTextColor(blackRes); + iv_new.setBackgroundColor(-1); + } + + private void setHotBlack(){ + tv_hot.setTextColor(blackRes); + iv_hot.setBackgroundColor(-1); + } + + @OnClick(R.id.iv_put_topic) + public void OnClick(View view){ + startPutRecentPage(); + } + + private void startPutRecentPage() { + Intent intent = new Intent(this,PutRecentActivity.class); + intent.putExtra("topicid", topicModel.getRecid()); + intent.putExtra("title",topicModel.getTitle()); + startActivity(intent); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/TopicListActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/TopicListActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..611ee852ca1a7bc8fe23e5f2a6f6dcc52c72f7fd --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/TopicListActivity.java @@ -0,0 +1,138 @@ +package com.jiuqi.elove.activity; + +import android.content.Intent; +import android.os.Bundle; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.View; +import android.widget.RelativeLayout; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.jiuqi.elove.R; +import com.jiuqi.elove.adapter.CircleTopicAdapter; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.entity.CircleTopicModel; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.widget.pulltorefresh.PullToRefreshLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; + +public class TopicListActivity extends ABaseActivity implements PullToRefreshLayout.OnRefreshListener{ + + @BindView(R.id.rv_topic) + RecyclerView rv_topic; + @BindView(R.id.rl_nodata) + RelativeLayout rl_nodata; + @BindView(R.id.circleRefreshView) + PullToRefreshLayout circleRefreshView; + + /** + * 数据 + */ + private int page = 1; + private int pagesize = 10; + private boolean isshow = true; + private List mList; + private List mAddList; + private CircleTopicAdapter adapter; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_topic_list,"话题",-1,MODE_BACK,HEIGHT_REDBG_WHITEFONT); + initAdapter(); + loadTopic(); + } + + /** + * 初始化适配器以及数据容器 + */ + private void initAdapter() { + RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this); + rv_topic.setLayoutManager(layoutManager); + adapter = new CircleTopicAdapter(this); + rv_topic.setAdapter(adapter); + mAddList = new ArrayList<>(); + circleRefreshView.setOnRefreshListener(this); + adapter.setOnItemClickListener(new CircleTopicAdapter.OnRecyclerViewItemClickListener() { + @Override + public void onItemClick(CircleTopicModel model, int position) { + backPrePageWithResult(model,position); + } + }); + } + + private void backPrePageWithResult(CircleTopicModel model, int position) { + Intent intent = new Intent(this,TopicListActivity.class); + intent.putExtra("model",model); + setResult(RESULT_OK,intent); + finish(); + } + + private void loadTopic() { + String topicUrl = Constant.COMMON_URL + Interface.CIRCLE_TOPIC_LIST; + JSONObject obj = new JSONObject(); + obj.put("limit",pagesize); + obj.put("offset",page); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, isshow, topicUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if(Constant.SUCCESS_CODE.equals(rsCode)){ + String result = jsonObject.getString("list"); + mList = JSON.parseArray(result,CircleTopicModel.class); + mAddList.addAll(mList); + if(mAddList.isEmpty()){ + rl_nodata.setVisibility(View.VISIBLE); + }else{ + rl_nodata.setVisibility(View.GONE); + adapter.updateRecylerView(mAddList); + if(mList.isEmpty()){//第一页且有数据为刷新 + circleRefreshView.loadmoreFinish(PullToRefreshLayout.SUC_NODATA); + }else{//非第一页且有数据为加载,加载成功不必悬停 + circleRefreshView.refreshFinish(PullToRefreshLayout.SUCCEED); + } + } + }else{ + showToast(explanation); + } + } + },null); + } + + /** + * 下拉刷新 + */ + @Override + public void onRefresh(PullToRefreshLayout pullToRefreshLayout) { + loadFirstPageData(); + } + + /** + * 上拉加载 + */ + @Override + public void onLoadMore(PullToRefreshLayout pullToRefreshLayout) { + ++page; + isshow = false; + loadTopic(); + } + + /** + * 清楚数组,加载第一页数据显示 + */ + private void loadFirstPageData(){ + mAddList = new ArrayList<>(); + page = 1; + isshow = false; + loadTopic(); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/UpdatePwdActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/UpdatePwdActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..b3c350d428e756609bf32346b8eeb7ea69520943 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/UpdatePwdActivity.java @@ -0,0 +1,132 @@ +package com.jiuqi.elove.activity; + +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.support.v4.app.FragmentActivity; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.view.Window; +import android.widget.Button; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; + +import com.alibaba.fastjson.JSONObject; +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.ActivityCollector; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.db.DemoDBManager; +import com.jiuqi.elove.util.EaseHxHelper; +import com.jiuqi.elove.util.JpushUtil; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; +import com.stonesun.newssdk.NewsAgent; + +import java.util.HashSet; +import java.util.Set; + +import butterknife.BindView; +import butterknife.OnClick; +import cn.jpush.android.api.JPushInterface; +import cn.jpush.android.api.TagAliasCallback; + +public class UpdatePwdActivity extends ABaseActivity implements View.OnClickListener { + + private static final String TAG = "UpdatePwdActivity"; + + + @BindView(R.id.edt_pastpwd) + EditText edt_pastpwd; + @BindView(R.id.edt_newpwd) + EditText edt_newpwd; + @BindView(R.id.edt_renewpwd) + EditText edt_renewpwd; + @BindView(R.id.btn_submit) + Button btn_submit; + + private String mobilephone; + private String oldpassword; + private String newpassword; + private String confirmpassword; + + private OkHttpUtil okHttpUtil = OkHttpUtil.getInstance(); + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_updatepwd,"修改密码"); + } + + @OnClick({R.id.btn_submit}) + public void onClick(View view){ + submit(); + } + + + private void submit() { + String getPwdUrl = Constant.COMMON_URL + Interface.UPDATE_PWD; + mobilephone = SpUtils.getString(Constant.MOBILE); + newpassword = edt_newpwd.getText().toString().trim(); + confirmpassword = edt_renewpwd.getText().toString().trim(); + oldpassword = edt_pastpwd.getText().toString().trim(); + if (TextUtils.isEmpty(oldpassword)) { + showToast("请输入当前密码"); + return; + } + if (TextUtils.isEmpty(newpassword)) { + showToast("请输入新密码"); + return; + } + if (newpassword.length()<6||newpassword.length()>18) { + showToast("请输入6-18位新密码"); + return; + } + if(!newpassword.equals(confirmpassword)){ + showToast("密码不一致"); + return; + } + JSONObject obj = new JSONObject(); + obj.put("password",oldpassword); + obj.put("newpassword",newpassword); + obj.put("mobilephone",mobilephone); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(UpdatePwdActivity.this,true,getPwdUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String retCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if("1".equals(retCode)){ + unlogin(); + } + JqStrUtil.showToast(getApplicationContext(), explanation); + } + },null); + } + + /** + * 注销登录 + */ + private void unlogin() { + String versonCode = SpUtils.getString(Constant.VERSION_CODE); + SpUtils.clearSp(); + SpUtils.setString(Constant.VERSION_CODE,versonCode); + DemoDBManager.getInstance().deleteMessage(); + JpushUtil.shutPush();//关闭极光推送 + EaseHxHelper.hxLogout();//环信退出 + NewsAgent.logOutComment();//智通退出 + ActivityCollector.finish(2); + startLoginPage(); + } + + private void startLoginPage() { + Intent intent = new Intent(this,LoginActivity.class); + startActivity(intent); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/VideoPreEditActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/VideoPreEditActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..6a5b2d61325bb2682f7a363fcaf1a3aa990eaf9b --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/VideoPreEditActivity.java @@ -0,0 +1,158 @@ +package com.jiuqi.elove.activity; + +import android.content.Intent; +import android.media.MediaPlayer; +import android.os.Bundle; +import android.view.Gravity; +import android.view.View; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.VideoView; + +import com.baoyz.actionsheet.ActionSheet; +import com.jiuqi.elove.R; +import com.jiuqi.elove.util.MyLayoutManager; + +import java.util.ArrayList; + +import butterknife.BindView; +import butterknife.OnClick; + +public class VideoPreEditActivity extends ABaseActivity { + + @BindView(R.id.video_view) + VideoView videoView; + @BindView(R.id.iv_right) + ImageView iv_right; + @BindView(R.id.rl_right) + RelativeLayout rl_right; + + private ArrayList mAddList; + private String dirpath; + private boolean isEdit = false;//是否编辑了页面 + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_video_pre_edit,"视频预览",-1,MODE_BACK,HEIGHT_REDBG_WHITEFONT); + getDataFromPre(); + initView(); + initVideo(); + } + + /** + * 从前页获取数据 + */ + private void getDataFromPre() { + mAddList = getIntent().getStringArrayListExtra("video"); + dirpath = mAddList.get(0); + } + + private void initView() { + iv_right.setImageResource(R.drawable.icon_remove); + rl_right.setVisibility(View.VISIBLE); + int width = MyLayoutManager.returnDisplayWidth(this); + LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(width,width); + lp.gravity = Gravity.CENTER; + videoView.setLayoutParams(lp); + } + + private void initVideo() { + videoView.setVideoPath(dirpath); + if(!videoView.isPlaying()){ + videoView.start(); + videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { + @Override + public void onPrepared(MediaPlayer mediaPlayer) { +// mediaPlayer.setVolume(0f,0f); + mediaPlayer.start(); + mediaPlayer.setLooping(true); + } + }); + } + } + + @OnClick(R.id.rl_right) + public void OnClick(View view){ + switch (view.getId()){ + case R.id.rl_right: + createDialog(); + break; + } + } + +// @Override +// protected void onNavigationClicked() { +// if(isEdit) +// setResultBack(); +// super.onNavigationClicked(); +// } + + /** + * 如果删除,则传递最新数据给前一页 + */ + private void setResultBack() { + Intent intent = new Intent(); + intent.putStringArrayListExtra("video",mAddList); + setResult(RESULT_OK,intent); + finish(); + } + + /** + * 弹出删除选择框 + */ + private void createDialog() { + setTheme(R.style.ActionSheetStyleiOS7); + ActionSheet.createBuilder(this, getSupportFragmentManager()) + .setCancelButtonTitle(getString(R.string.cancel)) + .setOtherButtonTitles(getString(R.string.delete)) + .setCancelableOnTouchOutside(true).setListener(new ChildActionSheetListener()).show(); + } + + /** + * 点击弹窗回调监听 + */ + private class ChildActionSheetListener implements ActionSheet.ActionSheetListener{ + + @Override + public void onDismiss(ActionSheet actionSheet, boolean isCancel) { + + } + + @Override + public void onOtherButtonClick(ActionSheet actionSheet, int index) { + switch (index){ + case 0: + deleteVideo(); + break; + } + } + } + + private void deleteVideo() { + isEdit = true; + if(videoView!=null){ + if(videoView.isPlaying()) + videoView.pause(); + videoView.suspend(); + setResultBack();//直接返回 + } + } + + @Override + protected void onDestroy() { + super.onDestroy(); + if(videoView!=null){ + videoView.suspend(); + } + } + + @Override + protected void onStop() { + super.onStop(); + if(videoView!=null&&videoView.isPlaying()){ + videoView.pause(); + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/ViewOrLikeMeActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/ViewOrLikeMeActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..0347d98ca3340b576e7b25f53de5fda625d294e3 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/ViewOrLikeMeActivity.java @@ -0,0 +1,197 @@ +package com.jiuqi.elove.activity; + +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ImageView; +import android.widget.ListView; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.jiuqi.elove.R; +import com.jiuqi.elove.adapter.LikeUserAdapter; +import com.jiuqi.elove.adapter.ViewOrLikeAdapter; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.common.JqBaseActivity; +import com.jiuqi.elove.entity.LikeUserEntity; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; +import com.jiuqi.elove.widget.pulltorefresh.PullToRefreshLayout; + +import java.util.ArrayList; +import java.util.List; + +public class ViewOrLikeMeActivity extends JqBaseActivity implements View.OnClickListener,PullToRefreshLayout.OnRefreshListener{ + + + /*顶部菜单栏按钮*/ + private TextView tvTitle; + private ImageView tvBack; + + + /** + * 上拉加载下拉刷新 + */ + private PullToRefreshLayout likeRefresh; + private ListView list_likeusers; + private RelativeLayout rlay_nodata; + /** + *设置页码和每一页条数 + */ + private int offset = 1; + private int limit = 10; + + /** + * 数据 + */ + private String userid; +// private String type;//判断是显示点赞列表还是报名列表 + private String signOrlikeUsersUrl; + private boolean isshow; + + private List luserList; + private List luserListAdd; + + + /** + * 适配器 + */ + + private ViewOrLikeAdapter likeUserAdapter; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_view_or_like_me); + init(); + initView(); + initEvent(); + isshow = true; + reqUserList(); + } + + //初始化数据 + private void init(){ + userid = SpUtils.getString(Constant.USER_ID); + } + + //初始化UI控件 + private void initView() { + tvBack = (ImageView)findViewById(R.id.img_leftBtn); + tvTitle = (TextView)findViewById(R.id.tvTitle); + rlay_nodata = (RelativeLayout) findViewById(R.id.rlay_nodata); +// if("1".equals(type)){ +// tvTitle.setText("我的访客"); +// }else{ +// tvTitle.setText("谁赞过我"); +// } + tvBack.setVisibility(View.VISIBLE); + likeRefresh = (PullToRefreshLayout)findViewById(R.id.likeRefreshView); + list_likeusers = (ListView) findViewById(R.id.lv_likeuser); + luserListAdd = new ArrayList<>(); + likeUserAdapter = new ViewOrLikeAdapter(this,"1"); + list_likeusers.setAdapter(likeUserAdapter); + offset = 1;//页码从零开始 + } + + + private void initEvent() { + likeRefresh.setOnRefreshListener(this); + tvBack.setOnClickListener(this); + list_likeusers.setOnItemClickListener(new cyOnItemClickListener()); + } + + @Override + public void onClick(View view) { + switch (view.getId()){ + case R.id.img_leftBtn: + finish(); + break; + default: + break; + } + } + + + private void reqUserList() { + JSONObject obj = new JSONObject(); + String viewOrLikeUrl = Constant.COMMON_URL + Interface.WHO_VIEW_LIKE; + obj.put("userid",userid); +// obj.put("type",type);//1查看过2点赞过 + obj.put("version",Constant.VERSION); + obj.put("pagesize",limit); + obj.put("pageindex",offset); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(ViewOrLikeMeActivity.this,isshow,viewOrLikeUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); +// String jsonString = ""; + if("1".equals(rsCode)){ + String jsonString = jsonObject.getString("message"); + String totalnum = jsonObject.getString("number"); + tvTitle.setText("我的访客("+totalnum+")"); +// if("1".equals(type)){ +// tvTitle.setText("谁看过我("+totalnum+")"); +// }else{ +// tvTitle.setText("谁赞过我("+totalnum+")"); +// } + luserList = JSON.parseArray(jsonString,LikeUserEntity.class); + if(offset==1&&luserList.size()<=0){ +// likeRefresh.loadmoreFinish(PullToRefreshLayout.SUC_NODATA); +// JqStrUtil.showToast(getActivity(),"无更多企业活动"); + rlay_nodata.setVisibility(View.VISIBLE); + }else{ + rlay_nodata.setVisibility(View.GONE); + if(luserList.size()<=0){ + likeRefresh.loadmoreFinish(PullToRefreshLayout.SUC_NODATA); + }else{ + luserListAdd.addAll(luserList); + likeUserAdapter.updateListView(luserListAdd); + if(1==offset){//第一页且有数据为刷新 + likeRefresh.refreshFinish(PullToRefreshLayout.SUCCEED); + }else{//非第一页且有数据为加载,加载成功不必悬停 +// eActRefresh.loadmoreFinish(PullToRefreshLayout.SUCCEED); + likeRefresh.refreshFinish(PullToRefreshLayout.SUCCEED); + } + } + } + }else{ + JqStrUtil.showToast(ViewOrLikeMeActivity.this,explanation); + } + } + },null); + } + + class cyOnItemClickListener implements AdapterView.OnItemClickListener { + public void onItemClick(AdapterView parent, View view, int position, long id) { + Intent intent = new Intent(ViewOrLikeMeActivity.this,OtherPersonCenterActivity.class); + intent.putExtra("otherid",luserListAdd.get(position).getUserid()); + startActivity(intent); + } + } + + + @Override + public void onRefresh(PullToRefreshLayout pullToRefreshLayout) { + // 下拉刷新操作 + luserListAdd = new ArrayList<>(); + offset = 1; + isshow = false; + reqUserList(); + } + + @Override + public void onLoadMore(PullToRefreshLayout pullToRefreshLayout) { + ++offset; + isshow = false; + reqUserList(); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/WaitingAndSelectPayTypeActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/WaitingAndSelectPayTypeActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..34e82b6a97e94de7a7065d2652ff0ba97682f515 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/WaitingAndSelectPayTypeActivity.java @@ -0,0 +1,477 @@ +package com.jiuqi.elove.activity; + +import android.app.Activity; +import android.content.Intent; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.view.Window; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.alipay.sdk.app.PayTask; +import com.bumptech.glide.Glide; +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.entity.OrderManageModel; +import com.jiuqi.elove.entity.OrderModel; +import com.jiuqi.elove.entity.WeChatPaySignModel; +import com.jiuqi.elove.util.AbDateUtil; +import com.jiuqi.elove.util.AliPayResult; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.tencent.mm.sdk.modelpay.PayReq; +import com.tencent.mm.sdk.openapi.IWXAPI; +import com.tencent.mm.sdk.openapi.WXAPIFactory; + +import java.util.Map; +import java.util.Timer; +import java.util.TimerTask; + + +/** + * 等待并且选择支付方式页面 + * 收银台 + */ +public class WaitingAndSelectPayTypeActivity extends Activity { + + private static final String TAG = "WaitingAndSelectPayType"; + + /*支付宝支付结果码*/ + private static final String PAY_OK = "9000";// 支付成功 + private static final String PAY_WAIT_CONFIRM = "8000";// 交易待确认 + private static final String PAY_NET_ERR = "6002";// 网络出错 + private static final String PAY_CANCLE = "6001";// 交易取消 + private static final String PAY_FAILED = "4000";// 交易失败 + + private static final int SDK_PAY_FLAG = 1; + + public static WaitingAndSelectPayTypeActivity instance; + /** + * 控件声明 + */ + private ImageView back; + private TextView tvTitle; + private RelativeLayout rl_wechatpay; + private RelativeLayout rl_alipay; + private ImageView img_poster; + private TextView txt_title; + private TextView txt_money; + private TextView txt_stime; + private TextView txt_adds; + private Button btn_pay; + private ImageView iv_radio_ali; + private ImageView iv_radio_wechat; + private TextView minContainer; + private TextView seContainer; + private TextView tv_redbean_mounts;//剩余红豆数量 + private TextView tv_shouldpay_total;//应该支付总额 + private TextView tv_needpay;//仍需支付 + private TextView tv_pay_redbean;//抵扣红豆 + private LinearLayout ll_paytype;//支付方式布局,用于选择是否隐藏 + /** + * 数据保存变量 + */ + private final String ALI_PAY = "alipay"; + private final String WECHAT_PAY = "wechatpay"; + private final String REDBEAN_PAY = "redbeanpay"; + private String payType; + public String ordernum; + private int time; + + /** + *工具 + */ + private final OkHttpUtil okHttpUtil = OkHttpUtil.getInstance(); + private Timer timer = new Timer(); + private TimerTask task; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + requestWindowFeature(Window.FEATURE_NO_TITLE); + setContentView(R.layout.activity_waiting_and_select_pay_type); + instance = this; + initView(); + initData(); + initEvents(); + } + /** + * 页面中所有组件的获取和设置 + */ + private void initView() { + back = (ImageView) findViewById(R.id.img_leftBtn); + tvTitle = (TextView) findViewById(R.id.tvTitle); + back.setVisibility(View.VISIBLE); + tvTitle.setText(R.string.orderpay); + rl_wechatpay = (RelativeLayout) findViewById(R.id.rl_wechatpay); + rl_alipay = (RelativeLayout) findViewById(R.id.rl_alipay); + img_poster = (ImageView) findViewById(R.id.img_poster); + txt_money = (TextView) findViewById(R.id.txt_money); + txt_title = (TextView) findViewById(R.id.txt_title); + txt_stime = (TextView) findViewById(R.id.txt_stime); + txt_adds = (TextView) findViewById(R.id.txt_adds); + iv_radio_ali = (ImageView) findViewById(R.id.iv_radio_ali); + iv_radio_wechat = (ImageView) findViewById(R.id.iv_radio_wechat); + btn_pay = (Button) findViewById(R.id.btn_pay); + minContainer = (TextView) findViewById(R.id.minContainer); + seContainer = (TextView) findViewById(R.id.seContainer); + tv_redbean_mounts = (TextView) findViewById(R.id.tv_redbean_mounts); + tv_shouldpay_total = (TextView) findViewById(R.id.tv_shouldpay_total); + tv_needpay = (TextView) findViewById(R.id.tv_needpay); + tv_pay_redbean = (TextView) findViewById(R.id.tv_pay_redbean); + ll_paytype = (LinearLayout) findViewById(R.id.ll_paytype); + } + /** + * 获取一些数据(包括上个页面传过来的值) + */ + private void initData() { + payType = ALI_PAY;//默认为支付宝支付 + ordernum = getIntent().getStringExtra("ordernum"); + if(!JqStrUtil.isEmpty(ordernum)){ + getOrderInfoAndInitView(ordernum); + } + } + + /** + * 根据订单号获取订单的信息 + */ + private void getOrderInfoAndInitView(String ordernum) { + String orderInfoUrl = Constant.COMMON_URL + Interface.GET_ORDERINFO; + JSONObject obj = new JSONObject(); + obj.put("ordernum",ordernum); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(WaitingAndSelectPayTypeActivity.this, true, orderInfoUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if("1".equals(rsCode)){ + String result = jsonObject.getString("message"); + Log.d(TAG, "onResponse:result "+result); + OrderModel model = JSON.parseObject(result,OrderModel.class); + setData2View(model);//将数据填充入UI + setTimer(model);//设置计时器 + }else{ + JqStrUtil.showToast(WaitingAndSelectPayTypeActivity.this,explanation); + } + } + },null); + } + + /** + * 将获取的数据填充进UI中 + */ + private void setData2View(OrderModel model) { + txt_money.setText(getResources().getString(R.string.money_symbol)+model.getFee()+getResources().getString(R.string.pay_unit)); + txt_title.setText(model.getTitle()); + txt_stime.setText(model.getActstart()); + txt_adds.setText(model.getAddress()); +// btn_pay.setText(getResources().getString(R.string.pay_promt)+model.getFee()+getResources().getString(R.string.pay_unit)); + String imgUrl = model.getPost(); +// if(!JqStrUtil.isEmpty(imgUrl)){ + Glide.with(WaitingAndSelectPayTypeActivity.this).load(imgUrl).placeholder(R.drawable.img_other_default).into(img_poster); +// }else{ +// Glide.with(WaitingAndSelectPayTypeActivity.this).load(R.drawable.queshengdatu).into(img_poster); +// } + tv_shouldpay_total.setText(getResources().getString(R.string.money_symbol)+model.getFee()); + tv_redbean_mounts.setText(model.getUserredbean()); + tv_pay_redbean.setText("-"+model.getPayredbean()+"个"); + if(model.getNeedpay()<=0){ + tv_needpay.setText(getResources().getString(R.string.money_symbol)+"0"); + ll_paytype.setVisibility(View.GONE); + payType = REDBEAN_PAY;//红豆支付 + }else{ + tv_needpay.setText(getResources().getString(R.string.money_symbol)+model.getNeedpay()); + ll_paytype.setVisibility(View.VISIBLE); + payType = ALI_PAY;//默认为支付宝支付 + } + } + + /** + * 设置计时器 + */ + private void setTimer(OrderModel model) { + Log.d(TAG, "setTimer: model.getTime"+model.getEx_time()); + time = (int)model.getEx_time(); + task = new TimerTask() { + @Override + public void run() { + runOnUiThread(new Runnable() { // UI thread + @Override + public void run() { + Map timeMap = AbDateUtil.secToTimeMap(time); + if (time <= 0) { + minContainer.setText(timeMap.get("min")); + seContainer.setText(timeMap.get("sec")); + task.cancel(); + if(OrderManagementActivity.instance!=null){ + OrderManagementActivity.instance.refresh(); + } + finish(); + } else {//处理动态读秒 + minContainer.setText(timeMap.get("min")); + seContainer.setText(timeMap.get("sec")); + } + time--; + } + }); + } + }; + timer.schedule(task, 0, 1000); + } + + /** + * 页面中所有点击事件 + */ + private void initEvents() { + /** + * 返回按钮点击结束此activity + */ + back.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if(EActDetailActivity2_0_3.instance!=null){ + EActDetailActivity2_0_3.instance.refresh(); + } + finish(); + } + }); + /** + * 选择微信支付 + */ + rl_wechatpay.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if(WECHAT_PAY.equals(payType)){ + + }else{ + iv_radio_ali.setImageResource(R.drawable.img_radio_unchecked); + iv_radio_wechat.setImageResource(R.drawable.img_radio_checked); + payType = WECHAT_PAY; + } + } + }); + /** + * 选择支付宝支付 + */ + rl_alipay.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if(ALI_PAY.equals(payType)){ + + }else{ + iv_radio_ali.setImageResource(R.drawable.img_radio_checked); + iv_radio_wechat.setImageResource(R.drawable.img_radio_unchecked); + payType = ALI_PAY; + } + } + }); + /** + * 最终支付按钮 + */ + btn_pay.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if(ALI_PAY.equals(payType)){//支付宝支付 + aliPay(); + }else if(WECHAT_PAY.equals(payType)){//微信支付 + wechatPay(); + }else if(REDBEAN_PAY.equals(payType)){//单独红豆支付 + redbeanpay(); + }else{ + JqStrUtil.showToast(WaitingAndSelectPayTypeActivity.this,getResources().getString(R.string.pay_error)); + } + } + }); + } + + /** + * 单独红豆支付 + */ + private void redbeanpay() { + String redbeanpayUrl = Constant.COMMON_URL + Interface.REDBEAN_PAY_ATTENDACT; + JSONObject obj = new JSONObject(); + obj.put("ordernum",ordernum); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(WaitingAndSelectPayTypeActivity.this, true, redbeanpayUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if("1".equals(rsCode)){ + JqStrUtil.showToast(WaitingAndSelectPayTypeActivity.this,explanation); + if(OrderDetailActivity.instance!=null){ + OrderDetailActivity.instance.refresh(); + }else{ + Intent intent = new Intent(WaitingAndSelectPayTypeActivity.this,OrderDetailActivity.class); + intent.putExtra("orderNum",ordernum); + startActivity(intent); + } + if(EActDetailActivity2_0_3.instance!=null){ + EActDetailActivity2_0_3.instance.refresh(); + } + finish(); + }else{ + JqStrUtil.showToast(WaitingAndSelectPayTypeActivity.this,explanation); + } + } + },null); + } + + /** + * 微信支付(获取签名以及必须的参数,微信返回的参数在服务端没有做拼接,提供了客户端拼接的方法) + */ + private void wechatPay() { + String getWechatUrl = Constant.COMMON_URL + Interface.GET_WECHAT_SIGN; + JSONObject obj = new JSONObject(); + obj.put("ordernum",ordernum); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(WaitingAndSelectPayTypeActivity.this, true, getWechatUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if("1".equals(rsCode)){ + String result = jsonObject.getString("message"); + WeChatPaySignModel model = JSON.parseObject(result,WeChatPaySignModel.class); + onPayWithWeChat(model);//进行正式的支付请求 + }else{ + JqStrUtil.showToast(WaitingAndSelectPayTypeActivity.this,explanation); + } + } + },null); + } + + /** + * 将服务器端返回的参数在此进行整合,进行正式的支付请求 + * @param model + */ + private void onPayWithWeChat(WeChatPaySignModel model) { + IWXAPI mWxApi = WXAPIFactory.createWXAPI(WaitingAndSelectPayTypeActivity.this, Constant.WX_APPID, true); + mWxApi.registerApp(Constant.WX_APPID); + PayReq req = new PayReq(); + if (mWxApi != null) { + req.appId = Constant.WX_APPID;// 微信开放平台审核通过的应用APPID + req.partnerId = model.getPartnerId();// 微信支付分配的商户号 + req.prepayId = model.getPrepayid();// 预支付订单号,app服务器调用“统一下单”接口获取 + req.nonceStr = model.getNoncestr();// 随机字符串,不长于32位,服务器小哥会给咱生成 + req.timeStamp = model.getTimestamp();// 时间戳,app服务器小哥给出 + req.packageValue = model.getWechat_package();// 固定值Sign=WXPay,可以直接写死,服务器返回的也是这个固定值 +// req.packageValue = "Sign=WXPay";// 固定值Sign=WXPay,可以直接写死,服务器返回的也是这个固定值 + req.sign = model.getSign();// 签名,服务器小哥给出, + } + mWxApi.sendReq(req);//向微信发起支付请求 + } + + /** + * 支付宝支付(获取签名以及需要的信息,签名中的内容如下--支付宝是将所有的参数拼在一起作为一个字段返回,并在成功的回调函数中进行支付) + * "signAlipay":"_input_charset=\"utf-8\"&body=\"参加活动\"666666\"支付报名费用1.0元\"&it_b_pay=\"60m\" + * ¬ify_url=\"http://15527z711x.51mypc.cn:50686/mobile/alipay_notify_url\"&out_trade_no=\"20160927151851404061261306727213\"&partner=\"2088421457677306\"&payment_type=\"1\"&seller_id=\"yunfu@jiuqi.com.cn\"&service=\"mobile.securitypay.pay\" + * &subject=\"活动报名\"&total_fee=\"1.0\" + * &sign=\"kkUvy4lzNb2Vu0pG27OkmcNpVwMg%2FypFslFRX2pHl7FLM86w%2BfEbn3PlBu3ITFbSgFU57ZbEvZ%2Fp0hVixKqkpBU9WQeM2wQMcsnJ5cxWU%2B0SKcvgA3lUZ0Ff0a9RDOM77s4JL9xM69z3pp2dX1vkgZI18CMvpqcxqyzTOmNMIkA%3D\"&sign_type=\"RSA\"" + */ + private void aliPay() { + String getAliSignUrl = Constant.COMMON_URL + Interface.GET_ALIPAY_SIGN; + JSONObject obj = new JSONObject(); + obj.put("ordernum",ordernum); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(WaitingAndSelectPayTypeActivity.this, true, getAliSignUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + Log.d(TAG, "onResponse: jsonObject"+jsonObject); + if("1".equals(rsCode)){ + final String signAlipay = jsonObject.getString("signAlipay");//获取支付宝签名 + new Thread() { + @Override + public void run() { + super.run(); + PayTask payTask = new PayTask(WaitingAndSelectPayTypeActivity.this); + Map result = payTask.payV2(signAlipay, true); + Message message = mHandler.obtainMessage(); + message.what = SDK_PAY_FLAG; + message.obj = result; + mHandler.sendMessage(message); + } + }.start(); + }else{ + JqStrUtil.showToast(WaitingAndSelectPayTypeActivity.this,explanation); + } + } + },null); + } + + /** + * app客户端获取支付状态码,app内做处理(在此只是简单得进行了提示,成功格外结束了此页面) + */ + private Handler mHandler = new Handler() { + public void handleMessage(Message msg) { + switch (msg.what) { + case SDK_PAY_FLAG: { + AliPayResult payResult = new AliPayResult((Map) msg.obj); + /** + 对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。 + */ + String resultInfo = payResult.getResult();// 同步返回需要验证的信息 + String resultStatus = payResult.getResultStatus(); + // 判断resultStatus 为9000则代表支付成功 + if (TextUtils.equals(resultStatus, PAY_OK)) { + // 该笔订单是否真实支付成功,需要依赖服务端的异步通知。 + JqStrUtil.showToast(WaitingAndSelectPayTypeActivity.this,getResources().getString(R.string.pay_success)); + if(OrderDetailActivity.instance!=null){ + OrderDetailActivity.instance.refresh(); + }else{ + Intent intent = new Intent(WaitingAndSelectPayTypeActivity.this,OrderDetailActivity.class); + intent.putExtra("orderNum",ordernum); + startActivity(intent); + } + if(OrderManagementActivity.instance!=null){ + OrderManagementActivity.instance.refresh(); + } + if(EActDetailActivity2_0_3.instance!=null){ + EActDetailActivity2_0_3.instance.refresh(); + } + finish();//成功则结束该页面 + } else if (TextUtils.equals(resultStatus, PAY_CANCLE)) { + // 该笔订单是否真实支付成功,需要依赖服务端的异步通知。 + JqStrUtil.showToast(WaitingAndSelectPayTypeActivity.this,getResources().getString(R.string.pay_cancel)); + } else if (TextUtils.equals(resultStatus, PAY_FAILED)) { + // 该笔订单是否真实支付成功,需要依赖服务端的异步通知。 + JqStrUtil.showToast(WaitingAndSelectPayTypeActivity.this,getResources().getString(R.string.pay_fail)); + } else if(TextUtils.equals(resultStatus, PAY_NET_ERR)){ + // 该笔订单真实的支付结果,需要依赖服务端的异步通知。 + JqStrUtil.showToast(WaitingAndSelectPayTypeActivity.this,getResources().getString(R.string.pay_neterror)); + }else if(TextUtils.equals(resultStatus, PAY_WAIT_CONFIRM)){ + JqStrUtil.showToast(WaitingAndSelectPayTypeActivity.this,getResources().getString(R.string.pay_wait_confirm)); + } + break; + } + default: + break; + } + } + }; + + @Override + protected void onDestroy() { + super.onDestroy(); + if(instance!=null){ + instance = null; + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/WaitingAndSelectPayTypeActivity254.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/WaitingAndSelectPayTypeActivity254.java new file mode 100644 index 0000000000000000000000000000000000000000..3c0f30ae0104f3b476637321fe31b10d96b024b1 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/WaitingAndSelectPayTypeActivity254.java @@ -0,0 +1,607 @@ +package com.jiuqi.elove.activity; + +import android.content.Intent; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.alipay.sdk.app.PayTask; +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.common.JqBaseActivity; +import com.jiuqi.elove.entity.EActDetailModel2_0_3; +import com.jiuqi.elove.entity.OrderModel; +import com.jiuqi.elove.entity.WeChatPaySignModel; +import com.jiuqi.elove.util.AbDateUtil; +import com.jiuqi.elove.util.AliPayResult; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.tencent.mm.sdk.modelpay.PayReq; +import com.tencent.mm.sdk.openapi.IWXAPI; +import com.tencent.mm.sdk.openapi.WXAPIFactory; + +import java.util.Map; +import java.util.Timer; +import java.util.TimerTask; + +public class WaitingAndSelectPayTypeActivity254 extends JqBaseActivity { + + + private static final String TAG = "WaitingAndSelectPayTypeActivity254"; + + /*支付宝支付结果码*/ + private static final String PAY_OK = "9000";// 支付成功 + private static final String PAY_WAIT_CONFIRM = "8000";// 交易待确认 + private static final String PAY_NET_ERR = "6002";// 网络出错 + private static final String PAY_CANCLE = "6001";// 交易取消 + private static final String PAY_FAILED = "4000";// 交易失败 + + private static final int SDK_PAY_FLAG = 1; + + public static WaitingAndSelectPayTypeActivity254 instance; + /** + * 控件声明 + */ + private ImageView back; + private TextView tvTitle; + private RelativeLayout rl_wechatpay; + private RelativeLayout rl_alipay; + private RelativeLayout rl_coupon; + private TextView txt_title; + private TextView txt_money; + private TextView txt_stime; + private TextView txt_adds; + private TextView btn_pay; + private ImageView iv_radio_ali; + private ImageView iv_radio_wechat; + private TextView minContainer; + private TextView seContainer; + private TextView tv_redbean_mounts;//剩余红豆数量 + private TextView tv_shouldpay_total;//应该支付总额 + private TextView tv_needpay;//仍需支付 + private TextView tv_pay_redbean;//抵扣红豆 + private LinearLayout ll_paytype;//支付方式布局,用于选择是否隐藏 + private TextView tv_coupon; + private EditText et_name;//姓名 + private EditText et_company;//推荐公司 + /** + * 数据保存变量 + */ + private final int ALI_PAY = 1; + private final int WECHAT_PAY = 2; + private final int REDBEAN_PAY = 3; + private final int CARD_FULL_PAY = 4; + private int payType; + public String ordernum; + private int time; + private String actid; + private String action; + private String ticket_money; + private String ticketid; + private String realName; + private String company; + private int ticketNum;//优惠券数量 + /** + *工具 + */ + private Timer timer = new Timer(); + private TimerTask task; + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_waiting_and_select_pay_type254); + instance = this; + initView(); + initData(); + initEvents(); + } + /** + * 页面中所有组件的获取和设置 + */ + private void initView() { + back = easyFind(R.id.img_leftBtn); + tvTitle = easyFind(R.id.tvTitle); + back.setVisibility(View.VISIBLE); + tvTitle.setText(R.string.orderpay); + rl_wechatpay = easyFind(R.id.rl_wechatpay); + rl_alipay = easyFind(R.id.rl_alipay); + rl_coupon = easyFind(R.id.rl_coupon); + txt_money = easyFind(R.id.txt_money); + txt_title = easyFind(R.id.txt_title); + txt_stime = easyFind(R.id.txt_stime); + txt_adds = easyFind(R.id.txt_adds); + iv_radio_ali = easyFind(R.id.iv_radio_ali); + iv_radio_wechat = easyFind(R.id.iv_radio_wechat); + btn_pay = easyFind(R.id.btn_pay); + minContainer = easyFind(R.id.minContainer); + seContainer = easyFind(R.id.seContainer); + tv_redbean_mounts = easyFind(R.id.tv_redbean_mounts); + tv_shouldpay_total = easyFind(R.id.tv_shouldpay_total); + tv_needpay = easyFind(R.id.tv_needpay); + tv_pay_redbean = easyFind(R.id.tv_pay_redbean); + ll_paytype = easyFind(R.id.ll_paytype); + tv_coupon = easyFind(R.id.tv_coupon); + et_name = easyFind(R.id.et_name); + et_company = easyFind(R.id.et_company); + } + /** + * 获取一些数据(包括上个页面传过来的值) + */ + private void initData() { + payType = ALI_PAY;//默认为支付宝支付 + ordernum = getIntent().getStringExtra("ordernum"); + actid = getIntent().getStringExtra("actid"); + if(!JqStrUtil.isEmpty(ordernum)){ + getOrderInfoAndInitView(ordernum); + } + } + + /** + * 根据订单号获取订单的信息 + */ + private void getOrderInfoAndInitView(String ordernum) { + String orderInfoUrl = Constant.COMMON_URL + Interface.GET_ORDERINFO; + JSONObject obj = new JSONObject(); + obj.put("ordernum",ordernum); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, true, orderInfoUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if("1".equals(rsCode)){ + String result = jsonObject.getString("message"); + OrderModel model = JSON.parseObject(result,OrderModel.class); + setData2View(model);//将数据填充入UI + setTimer(model);//设置计时器 + }else{ + JqStrUtil.showToast(WaitingAndSelectPayTypeActivity254.this,explanation); + } + } + },null); + } + + /** + * 将获取的数据填充进UI中 + */ + private void setData2View(OrderModel model) { + et_name.setText(model.getRemarknm()); + et_company.setText(model.getRemarkep()); + ticketNum = model.getMyticketnum(); + if(ticketNum<=0){ + tv_coupon.setText("无可用优惠券"); + tv_coupon.setTextColor(getResources().getColor(R.color.gray_font)); + } + if(model.getNeedpay()!=null){ + txt_money.setText(getResources().getString(R.string.money_symbol)+model.getFee()+getResources().getString(R.string.pay_unit)); + txt_title.setText(model.getTitle()); + txt_stime.setText(model.getActstart()); + txt_adds.setText(model.getAddress()); + tv_shouldpay_total.setText(getResources().getString(R.string.money_symbol)+model.getFee()); + tv_redbean_mounts.setText(model.getUserredbean()); + tv_pay_redbean.setText("-"+model.getPayredbean()+"个"); + if(model.getNeedpay()<=0){ + if(Constant.CARD_FULL.equals(action)){ + tv_needpay.setText(getResources().getString(R.string.money_symbol)+"0"); + ll_paytype.setVisibility(View.GONE); + payType = CARD_FULL_PAY;//代金券 + }else{ + tv_needpay.setText(getResources().getString(R.string.money_symbol)+"0"); + ll_paytype.setVisibility(View.GONE); + payType = REDBEAN_PAY;//红豆支付 + } + }else{ + tv_needpay.setText(getResources().getString(R.string.money_symbol)+model.getNeedpay()); + ll_paytype.setVisibility(View.VISIBLE); + payType = ALI_PAY;//默认为支付宝支付 + } + }else{ + if(EActDetailActivity2_0_3.instance!=null){ + EActDetailActivity2_0_3.instance.refresh(); + } + finish(); + } + } + + /** + * 设置计时器 + */ + private void setTimer(OrderModel model) { + time = (int)model.getEx_time(); + if(task==null){ + task = new TimerTask() { + @Override + public void run() { + runOnUiThread(new Runnable() { // UI thread + @Override + public void run() { + Map timeMap = AbDateUtil.secToTimeMap(time); + if (time <= 0) { + minContainer.setText(timeMap.get("min")); + seContainer.setText(timeMap.get("sec")); + task.cancel(); + if(OrderManagementActivity.instance!=null){ + OrderManagementActivity.instance.refresh(); + } + if(EActDetailActivity2_0_3.instance!=null){ + EActDetailActivity2_0_3.instance.refresh(); + } + finish(); + } else {//处理动态读秒 + minContainer.setText(timeMap.get("min")); + seContainer.setText(timeMap.get("sec")); + } + time--; + } + }); + } + }; + timer.schedule(task, 0, 1000); + } + } + + /** + * 页面中所有点击事件 + */ + private void initEvents() { + /** + * 返回按钮点击结束此activity + */ + back.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if(EActDetailActivity2_0_3.instance!=null){ + EActDetailActivity2_0_3.instance.refresh(); + } + finish(); + } + }); + /** + * 选择微信支付 + */ + rl_wechatpay.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if(WECHAT_PAY==payType){ + + }else{ + iv_radio_ali.setImageResource(R.drawable.img_radio_unchecked); + iv_radio_wechat.setImageResource(R.drawable.img_radio_checked); + payType = WECHAT_PAY; + } + } + }); + /** + * 选择支付宝支付 + */ + rl_alipay.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if(ALI_PAY==payType){ + + }else{ + iv_radio_ali.setImageResource(R.drawable.img_radio_checked); + iv_radio_wechat.setImageResource(R.drawable.img_radio_unchecked); + payType = ALI_PAY; + } + } + }); + /** + * 最终支付按钮 + */ + btn_pay.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + realName = et_name.getText().toString().trim(); + company = et_company.getText().toString().trim(); + if(TextUtils.isEmpty(realName)){ + JqStrUtil.showToast(WaitingAndSelectPayTypeActivity254.this,"请输入参加活动人的姓名"); + return; + } + if(TextUtils.isEmpty(company)){ + JqStrUtil.showToast(WaitingAndSelectPayTypeActivity254.this,"请输入推荐公司"); + return; + } + if(ALI_PAY==payType){//支付宝支付 + aliPay(); + }else if(WECHAT_PAY==payType){//微信支付 + wechatPay(); + }else if(REDBEAN_PAY==payType){//单独红豆支付 + redbeanpay(); + }else if(CARD_FULL_PAY ==payType){ + fullcardPay(); + }else{ + JqStrUtil.showToast(WaitingAndSelectPayTypeActivity254.this,getResources().getString(R.string.pay_error)); + } + } + }); + /** + * 进入代金券 + */ + rl_coupon.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if(ticketNum<=0){ + return; + } + Intent intent = new Intent(WaitingAndSelectPayTypeActivity254.this,CouponListActivity.class); + intent.putExtra("actid",actid); + startActivityForResult(intent,0x11); + } + }); + } + + /** + * 选择代金券之后,更新收银台数据 + * @param requestCode 请求码 + * @param resultCode 结果码 + * @param data 返回数据 + */ + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + if(resultCode==RESULT_OK){ + ticketid = data.getStringExtra("ticketid"); + action = data.getStringExtra("action"); + ticket_money = data.getStringExtra("money"); + if(Constant.CARD_FULL.equals(action)){ + tv_coupon.setText("全票"); + }else{ + tv_coupon.setText("¥"+ticket_money); + } + String cardInfo = Constant.COMMON_URL + Interface.GET_ORDERINFO_CARD; + JSONObject obj = new JSONObject(); + obj.put("ticketid",ticketid); + obj.put("actid",actid); + obj.put("ordernum",ordernum); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, true, cardInfo, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + if("1".equals(rsCode)){ + String result = jsonObject.getString("message"); + OrderModel model = JSON.parseObject(result,OrderModel.class); + setData2View(model);//将数据填充入UI + } + } + },null); + } + } + + /** + * 全票参加活动 + */ + private void fullcardPay() { + String fullcardPayUrl = Constant.COMMON_URL + Interface.FULL_CARD_PAY; + JSONObject obj = new JSONObject(); + obj.put("remarkep",company); + obj.put("remarknm",realName); + obj.put("ticketid",ticketid); + obj.put("ordernum",ordernum); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(this, true, fullcardPayUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explaction"); + if("1".equals(rsCode)){ + JqStrUtil.showToast(WaitingAndSelectPayTypeActivity254.this,explanation); + if(OrderDetailActivity254.instance!=null){ + OrderDetailActivity254.instance.refresh(); + }else{ + Intent intent = new Intent(WaitingAndSelectPayTypeActivity254.this,OrderDetailActivity254.class); + intent.putExtra("ordernum",ordernum); + startActivity(intent); + } + if(EActDetailActivity2_0_3.instance!=null){ + EActDetailActivity2_0_3.instance.refresh(); + } + finish(); + }else{ + JqStrUtil.showToast(WaitingAndSelectPayTypeActivity254.this,explanation); + } + } + },null); + } + + + /** + * 单独红豆支付 + */ + private void redbeanpay() { + String redbeanpayUrl = Constant.COMMON_URL + Interface.REDBEAN_PAY_ATTENDACT; + JSONObject obj = new JSONObject(); + obj.put("remarkep",company); + obj.put("remarknm",realName); + obj.put("ordernum",ordernum); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(WaitingAndSelectPayTypeActivity254.this, true, redbeanpayUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if("1".equals(rsCode)){ + JqStrUtil.showToast(WaitingAndSelectPayTypeActivity254.this,explanation); + if(OrderDetailActivity254.instance!=null){ + OrderDetailActivity254.instance.refresh(); + }else{ + Intent intent = new Intent(WaitingAndSelectPayTypeActivity254.this,OrderDetailActivity254.class); + intent.putExtra("ordernum",ordernum); + startActivity(intent); + } + if(EActDetailActivity2_0_3.instance!=null){ + EActDetailActivity2_0_3.instance.refresh(); + } + finish(); + }else{ + JqStrUtil.showToast(WaitingAndSelectPayTypeActivity254.this,explanation); + } + } + },null); + } + + /** + * 微信支付(获取签名以及必须的参数,微信返回的参数在服务端没有做拼接,提供了客户端拼接的方法) + */ + private void wechatPay() { + String getWechatUrl = Constant.COMMON_URL + Interface.GET_WECHAT_SIGN; + JSONObject obj = new JSONObject(); + obj.put("remarkep",company); + obj.put("remarknm",realName); + obj.put("ordernum",ordernum); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(WaitingAndSelectPayTypeActivity254.this, true, getWechatUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if("1".equals(rsCode)){ + String result = jsonObject.getString("message"); + WeChatPaySignModel model = JSON.parseObject(result,WeChatPaySignModel.class); + onPayWithWeChat(model);//进行正式的支付请求 + }else{ + JqStrUtil.showToast(WaitingAndSelectPayTypeActivity254.this,explanation); + } + } + },null); + } + + /** + * 将服务器端返回的参数在此进行整合,进行正式的支付请求 + * @param model + */ + private void onPayWithWeChat(WeChatPaySignModel model) { + IWXAPI mWxApi = WXAPIFactory.createWXAPI(WaitingAndSelectPayTypeActivity254.this, Constant.WX_APPID, true); + mWxApi.registerApp(Constant.WX_APPID); + PayReq req = new PayReq(); + if (mWxApi != null) { + req.appId = Constant.WX_APPID;// 微信开放平台审核通过的应用APPID + req.partnerId = model.getPartnerId();// 微信支付分配的商户号 + req.prepayId = model.getPrepayid();// 预支付订单号,app服务器调用“统一下单”接口获取 + req.nonceStr = model.getNoncestr();// 随机字符串,不长于32位,服务器小哥会给咱生成 + req.timeStamp = model.getTimestamp();// 时间戳,app服务器小哥给出 + req.packageValue = model.getWechat_package();// 固定值Sign=WXPay,可以直接写死,服务器返回的也是这个固定值 +// req.packageValue = "Sign=WXPay";// 固定值Sign=WXPay,可以直接写死,服务器返回的也是这个固定值 + req.sign = model.getSign();// 签名,服务器小哥给出, + } + mWxApi.sendReq(req);//向微信发起支付请求 + } + + /** + * 支付宝支付(获取签名以及需要的信息,签名中的内容如下--支付宝是将所有的参数拼在一起作为一个字段返回,并在成功的回调函数中进行支付) + * "signAlipay":"_input_charset=\"utf-8\"&body=\"参加活动\"666666\"支付报名费用1.0元\"&it_b_pay=\"60m\" + * ¬ify_url=\"http://15527z711x.51mypc.cn:50686/mobile/alipay_notify_url\"&out_trade_no=\"20160927151851404061261306727213\"&partner=\"2088421457677306\"&payment_type=\"1\"&seller_id=\"yunfu@jiuqi.com.cn\"&service=\"mobile.securitypay.pay\" + * &subject=\"活动报名\"&total_fee=\"1.0\" + * &sign=\"kkUvy4lzNb2Vu0pG27OkmcNpVwMg%2FypFslFRX2pHl7FLM86w%2BfEbn3PlBu3ITFbSgFU57ZbEvZ%2Fp0hVixKqkpBU9WQeM2wQMcsnJ5cxWU%2B0SKcvgA3lUZ0Ff0a9RDOM77s4JL9xM69z3pp2dX1vkgZI18CMvpqcxqyzTOmNMIkA%3D\"&sign_type=\"RSA\"" + */ + private void aliPay() { + String getAliSignUrl = Constant.COMMON_URL + Interface.GET_ALIPAY_SIGN; + JSONObject obj = new JSONObject(); + obj.put("remarkep",company); + obj.put("remarknm",realName); + obj.put("ordernum",ordernum); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(WaitingAndSelectPayTypeActivity254.this, true, getAliSignUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if("1".equals(rsCode)){ + final String signAlipay = jsonObject.getString("signAlipay");//获取支付宝签名 + new Thread() { + @Override + public void run() { + super.run(); + PayTask payTask = new PayTask(WaitingAndSelectPayTypeActivity254.this); + Map result = payTask.payV2(signAlipay, true); + Message message = mHandler.obtainMessage(); + message.what = SDK_PAY_FLAG; + message.obj = result; + mHandler.sendMessage(message); + } + }.start(); + }else{ + JqStrUtil.showToast(WaitingAndSelectPayTypeActivity254.this,explanation); + } + } + },null); + } + + /** + * app客户端获取支付状态码,app内做处理(在此只是简单得进行了提示,成功格外结束了此页面) + */ + private Handler mHandler = new Handler() { + public void handleMessage(Message msg) { + switch (msg.what) { + case SDK_PAY_FLAG: { + AliPayResult payResult = new AliPayResult((Map) msg.obj); + /** + 对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。 + */ + String resultInfo = payResult.getResult();// 同步返回需要验证的信息 + String resultStatus = payResult.getResultStatus(); + // 判断resultStatus 为9000则代表支付成功 + if (TextUtils.equals(resultStatus, PAY_OK)) { + // 该笔订单是否真实支付成功,需要依赖服务端的异步通知。 + JqStrUtil.showToast(WaitingAndSelectPayTypeActivity254.this,getResources().getString(R.string.pay_success)); + if(OrderDetailActivity254.instance!=null){ + OrderDetailActivity254.instance.refresh(); + }else{ + Intent intent = new Intent(WaitingAndSelectPayTypeActivity254.this,OrderDetailActivity254.class); + intent.putExtra("ordernum",ordernum); + startActivity(intent); + } + if(OrderManagementActivity.instance!=null){ + OrderManagementActivity.instance.refresh(); + } + if(EActDetailActivity2_0_3.instance!=null){ + EActDetailActivity2_0_3.instance.refresh(); + } + finish();//成功则结束该页面 + } else if (TextUtils.equals(resultStatus, PAY_CANCLE)) { + // 该笔订单是否真实支付成功,需要依赖服务端的异步通知。 + JqStrUtil.showToast(WaitingAndSelectPayTypeActivity254.this,getResources().getString(R.string.pay_cancel)); + } else if (TextUtils.equals(resultStatus, PAY_FAILED)) { + // 该笔订单是否真实支付成功,需要依赖服务端的异步通知。 + JqStrUtil.showToast(WaitingAndSelectPayTypeActivity254.this,getResources().getString(R.string.pay_fail)); + } else if(TextUtils.equals(resultStatus, PAY_NET_ERR)){ + // 该笔订单真实的支付结果,需要依赖服务端的异步通知。 + JqStrUtil.showToast(WaitingAndSelectPayTypeActivity254.this,getResources().getString(R.string.pay_neterror)); + }else if(TextUtils.equals(resultStatus, PAY_WAIT_CONFIRM)){ + JqStrUtil.showToast(WaitingAndSelectPayTypeActivity254.this,getResources().getString(R.string.pay_wait_confirm)); + } + break; + } + default: + break; + } + } + }; + + @Override + protected void onDestroy() { + super.onDestroy(); + if(instance!=null){ + instance = null; + } + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/WelcomeActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/WelcomeActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..4d6a7804f5c632b79be4a531389132eef1725e6c --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/WelcomeActivity.java @@ -0,0 +1,340 @@ +package com.jiuqi.elove.activity; + +import android.Manifest; +import android.app.Activity; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.graphics.Bitmap; +import android.os.Build; +import android.os.Bundle; +import android.os.Environment; +import android.os.Handler; +import android.support.annotation.NonNull; +import android.support.v4.app.ActivityCompat; +import android.support.v4.content.ContextCompat; +import android.text.TextUtils; +import android.util.Log; +import android.view.Window; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baidu.location.BDLocation; +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.animation.GlideAnimation; +import com.bumptech.glide.request.target.SimpleTarget; +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.common.PermissionListener; +import com.jiuqi.elove.entity.AdvertisementModel; +import com.jiuqi.elove.entity.ChatPersonModel; +import com.jiuqi.elove.util.AppPhoneUtil; +import com.jiuqi.elove.util.BdLocationHelper; +import com.jiuqi.elove.util.EaseHxHelper; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; +import com.stonesun.newssdk.NewsAgent; +import com.stonesun.newssdk.bean.UserInfo; +import com.stonesun.newssdk.itf.AppUserItf; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +/** + * 欢迎页面 + * Created by dl on 2016/6/29. + */ +public class WelcomeActivity extends ABaseActivity { + + private static final String TAG = "WelcomeActivity"; + private static final String PHOTO_PATH = "/elove/"; + private static String adpic = "elove_ad.png"; + /** + * 数据 + */ + private String userId;//用户id + private double latitude;//纬度 + private double longitude;//经度 + private String address;//城市 + private String versonCode; + + /** + * 工具 + */ + private BdLocationHelper helper;//百度地图工具 + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_welcome,-1,-1,MODE_NONE,HEIGHT_NONE_DARK); + getSharedPreferenceDb();//从缓存中获取数据 + initLocation();//初始化百度地图定位工具并且申请权限,待用户点击之后进行下一步 + } + + private void getSharedPreferenceDb(){ + userId = SpUtils.getString(Constant.USER_ID); + } + + private void init() { + versonCode = SpUtils.getString(Constant.VERSION_CODE); + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + //isFirst改为version来判断,isFirst没有任何实质性的作用了 + String nowVersion = AppPhoneUtil.getVersionCode(); + if (!versonCode.equals(nowVersion)) {//第一次跳转到引导页画面 +// getAd(); + Intent intent = new Intent(WelcomeActivity.this, SlidingPageActivity.class); + startActivity(intent); + SpUtils.setString(Constant.VERSION_CODE,nowVersion);//将判断是否更新了程序 + finish(); + } else {//非第一次直接进入登录页 + tryLogin(); + } + } + },1000); + } + + /** + * 设置自动登录 + */ + private void tryLogin() { + //userId为空,则当前已经为退出状态 + if(!TextUtils.isEmpty(userId)){ + loginZhiTong();//智通用户信息 + } + Intent intent = new Intent(WelcomeActivity.this, MainActivity.class); + startActivity(intent); + finish(); + if(!TextUtils.isEmpty(userId)){ + updateUserInfoWhileEnter();//登录时调用小接口获取用户最新信息 + } + } + + /** + * 登陸智通 + */ + private void loginZhiTong() { + /** + * 智通需要的用户信息 + */ + AppUserItf appUserItf = new AppUserItf() { + @Override + public boolean isLogin() { + return true; + } + + @Override + public UserInfo getUserinfo() { + UserInfo userInfo = new UserInfo(); + userInfo.setUid(SpUtils.getString(Constant.USER_ID)); + userInfo.setUsericon(SpUtils.getString(Constant.AVATAR)); + userInfo.setUsername(SpUtils.getString(Constant.NIKE_NAME)); + userInfo.setFrom("QQ"); + userInfo.setToken("elove"); + return userInfo; + } + }; + NewsAgent.SetUserImpForSDK(appUserItf,LoginActivity.class); + } + + /** + * 更新用户信息 + */ + private void updateUserInfoWhileEnter() { + String getChatUrl = Constant.COMMON_URL + Interface.CHAT_INFO; + JSONObject obj = new JSONObject(); + obj.put("userID", userId); + obj.put("version",Constant.VERSION); + String param = JSON.toJSONString(obj); + okHttpUtil.sendJsonStrByPostAsync(getApplicationContext(), false, getChatUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + if(null==jsonObject){ + return; + } + String rsCode = jsonObject.getString("retcode"); + if ("1".equals(rsCode)) { + EaseHxHelper.hxLogin(userId);//环信登录 + saveAddress();//保存地址信息到服务器,用于附近人查询 +// getAd(); + String result = jsonObject.getString("message"); + ChatPersonModel model = JSON.parseObject(result, ChatPersonModel.class); + saveCurrentUserInfo2Sp(model); + Intent intent = new Intent(); +// File f = new File(Environment.getExternalStorageDirectory()+PHOTO_PATH+"/"+adpic); +// if(f.exists()){//&&sp.getInt("adtype",0)!=0不一定是要活动 +// intent.setClass(WelcomeActivity.this,AdvertisementActivity.class); +// }else{ + intent.setClass(WelcomeActivity.this, MainActivity.class); + +// } + startActivity(intent); + }else{//代码为104,无此用户,3.3.0版本同样不登录也进入主页面 + Intent intent = new Intent(WelcomeActivity.this,MainActivity.class); + startActivity(intent); + } + finish(); + } + + }, new OkHttpUtil.OnUnGetJsonObject() {//网络连接出错 + @Override + public void onResponse() { + finish(); + } + }); + } + + /** + * 登录成功,将当前用户信息缓存到sp + * @param model 当前用户类 + * + */ + private void saveCurrentUserInfo2Sp(ChatPersonModel model) { + SpUtils.setString(Constant.USER_ID,model.getUserID()); + SpUtils.setString(Constant.NIKE_NAME,model.getNickname()); + SpUtils.setString(Constant.SEX,model.getSex()); + SpUtils.setString(Constant.AVATAR,model.getAvatar()); + SpUtils.setInt(Constant.IF_UP,model.getIfup()); + SpUtils.setInt(Constant.E_KIND,model.getKind()); + SpUtils.setString(Constant.IF_AC,model.getIfac()); + SpUtils.setInt(Constant.RED_BEAN,model.getBean()); + SpUtils.setInt(Constant.AVATAR_TYPE,model.getAvatartype());//头像状态 + } + + /** + * 获取广告页内容缓存 + */ + private void getAd() { + String getAdUrl = Constant.COMMON_URL + Interface.WELCOME_AD_PHOTO; + JSONObject obj = new JSONObject(); + obj.put("lng",longitude);//广告位根据地区来投放 + obj.put("lat",latitude);//广告位根据地区来投放 + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(getApplicationContext(), false, getAdUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + Log.d(TAG, "onResponse: jsonObj"+jsonObject); + if("1".equals(rsCode)){ + String result = jsonObject.getString("message"); + AdvertisementModel model = JSON.parseObject(result,AdvertisementModel.class); + if(!JqStrUtil.isEmpty(model.getSkipID())){ + SpUtils.setString(Constant.AD_ID,model.getSkipID()); + } + if(!JqStrUtil.isEmpty(model.getVersion())){ + SpUtils.setString(Constant.AD_VERSION,model.getVersion()); + } + SpUtils.setInt(Constant.AD_TYPE,model.getType()); + if(JqStrUtil.isEmpty(model.getPhoto())){ + File f = new File(Environment.getExternalStorageDirectory()+PHOTO_PATH+"/"+adpic); + if (f.exists()) { + f.delete(); + } + } + Glide.with(getApplicationContext()).load(model.getPhoto()).asBitmap().into(new SimpleTarget() { + @Override + public void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) { + saveBitmap(resource); + } + }); + } + } + },null); + } + /** 保存方法 */ + public void saveBitmap(Bitmap bm) { + File f = new File(Environment.getExternalStorageDirectory()+PHOTO_PATH+"/"+adpic); + if (f.exists()) { + f.delete(); + } + try { + FileOutputStream out = new FileOutputStream(f); + bm.compress(Bitmap.CompressFormat.PNG, 100, out); + out.flush(); + out.close(); + Log.i(TAG, "已经保存"); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + + } + /** + * 保存地址 + */ + private void saveAddress() { + String saveAddressUrl = Constant.COMMON_URL + Interface.SAVE_ADDURL; + JSONObject obj = new JSONObject(); + obj.put("lng",longitude); + obj.put("lat",latitude); + obj.put("userID",userId); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + Log.d(TAG, "saveAddress: param"+param); + okHttpUtil.sendJsonStrByPostAsync(getApplicationContext(),false,saveAddressUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + Log.d(TAG, "saveAddress onResponse: "+rsCode); + if("1".equals(rsCode)){ + SpUtils.setString(Constant.LOCATE_LNG,String.valueOf(longitude)); + SpUtils.setString(Constant.LOCATE_LAT,String.valueOf(latitude)); + SpUtils.setString(Constant.ADDRESS,address); + } + } + },null); + } + + /** + * 百度地图初始初始化及定位 + */ + private void initLocation() { + helper = new BdLocationHelper(this,1000); + helper.registerLocationListener(); + helper.setListener(new BdLocationHelper.onSuccessLocate() { + @Override + public void handle(BDLocation bdLocation) { + address = bdLocation.getCity(); + latitude = bdLocation.getLatitude(); + longitude = bdLocation.getLongitude(); + SpUtils.setString(Constant.ADDRESS,address);//首页展示用 + } + }); + requestRuntimePermission(new String[]{Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.RECORD_AUDIO,Manifest.permission.WRITE_EXTERNAL_STORAGE}, new PermissionListener() { + @Override + public void onGranted() { + helper.startLocate(); + init(); + } + + @Override + public void onDenied(List deniedPermission) { + init(); + } + }); + } + + /** + * 在生命周期结束时销毁定位对象 + */ + @Override + protected void onDestroy() { + //退出时销毁定位 +// if (helper != null) { +// helper.stopLocate(); +// helper = null; +// } + super.onDestroy(); + } +} \ No newline at end of file diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/ZXCollectViewActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/ZXCollectViewActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..a79a8626f632ea73cd2d24bb670ba9c5b1a208bd --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/activity/ZXCollectViewActivity.java @@ -0,0 +1,61 @@ +package com.jiuqi.elove.activity; + +import android.os.Bundle; +import android.support.v7.widget.Toolbar; +import android.view.View; +import android.widget.TextView; + +import com.gyf.barlibrary.ImmersionBar; +import com.jiuqi.elove.R; +import com.jiuqi.elove.util.SupportMultiScreenUtil; +import com.stonesun.newssdk.activity.CollectViewActivity; + +public class ZXCollectViewActivity extends CollectViewActivity { + + /** + * 控件 + */ + protected Toolbar toolbar; + protected TextView toolbar_title; + protected View rootView; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_zxcollect_view); + supportMultiScreen();//多屏幕适配 + setUpToolbar(); + ImmersionBar.with(this).statusBarColor(R.color.login_register).fitsSystemWindows(true).keyboardEnable(true).init(); + showView(); + } + + /** + * 多屏幕适配 + */ + private void supportMultiScreen() { + rootView = findViewById(android.R.id.content); + SupportMultiScreenUtil.scale(rootView); + } + + /** + * 设置toolbar + */ + protected void setUpToolbar() { + toolbar = (Toolbar) findViewById(R.id.toolbar); + toolbar_title = (TextView) findViewById(R.id.toolbar_title); + toolbar.setNavigationIcon(R.drawable.icon_leftarrow_w); + toolbar.setNavigationOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + finish(); + } + }); + toolbar_title.setText("我的收藏"); + } + + @Override + public void onDestroy() { + super.onDestroy(); + ImmersionBar.with(this).destroy();//不调用该方法,如果界面bar发生改变,在不关闭app的情况下,退出此界面再进入将记忆最后一次bar改变的状态 + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/ABaseFragmentAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/ABaseFragmentAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..700074d07b63d8e8b0af501c06e2e0c8380b90df --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/ABaseFragmentAdapter.java @@ -0,0 +1,44 @@ +package com.jiuqi.elove.adapter; + +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentStatePagerAdapter; +import android.view.ViewGroup; + +import java.util.List; + +/** + * + * Created by dl on 2016/7/13. + */ +public class ABaseFragmentAdapter extends FragmentStatePagerAdapter { + + private List fragmentlist; + + public ABaseFragmentAdapter(FragmentManager fm){ + super(fm); + } + + public ABaseFragmentAdapter(FragmentManager fm, List fragments){ + super(fm); + this.fragmentlist = fragments; + } + @Override + public Fragment getItem(int position) { + return fragmentlist.get(position); + } + + @Override + public int getCount() { + return fragmentlist==null?0:fragmentlist.size(); + } + + /** + * 空实现,防止viewpager中不断的销毁,在原来的设置里面只允许左右两侧隐藏一定数量的fragment + * fragment嵌套时咋不起作用啊 + */ + @Override + public void destroyItem(ViewGroup container, int position, Object object) { + + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/ActPersonAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/ActPersonAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..d38b1f5b95a300185645866ed250ac457d48572a --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/ActPersonAdapter.java @@ -0,0 +1,87 @@ +package com.jiuqi.elove.adapter; + +import android.content.Context; +import android.content.Intent; +import android.graphics.Bitmap; +import android.support.v4.graphics.drawable.RoundedBitmapDrawable; +import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.TextView; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.target.BitmapImageViewTarget; +import com.jiuqi.elove.R; +import com.jiuqi.elove.activity.OtherPersonCenterActivity; +import com.jiuqi.elove.entity.ActUserModel; +import com.jiuqi.elove.util.EasyGlide; + +import java.util.ArrayList; +import java.util.List; + +/** + * + * Created by dl on 2017/4/26. + */ +public class ActPersonAdapter extends BaseAdapter{ + + private List mlist = new ArrayList<>(); + private Context context; + private LayoutInflater mInflater; + + public ActPersonAdapter(Context context,List mlist){ + this.mlist = mlist; + this.context = context; + mInflater = LayoutInflater.from(context); + } + @Override + public int getCount() { + return mlist.size(); + } + + @Override + public Object getItem(int position) { + return mlist.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertview, ViewGroup viewGroup) { + final ViewHolder vh; + if(null==convertview){ + vh = new ViewHolder(); + convertview = mInflater.inflate(R.layout.item_act_person,null); + vh.tv_network = (TextView) convertview.findViewById(R.id.tv_network); + vh.tv_nikename = (TextView) convertview.findViewById(R.id.tv_nikename); + vh.iv_avatar = (ImageView) convertview.findViewById(R.id.iv_avatar); + convertview.setTag(vh); + }else{ + vh = (ViewHolder) convertview.getTag(); + } + final ActUserModel model = mlist.get(position); + vh.tv_nikename.setText(model.getUsername()); + EasyGlide.getInstance().showImageCircle(model.getUserface(),vh.iv_avatar); + convertview.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Intent intent = new Intent(context, OtherPersonCenterActivity.class); + intent.putExtra("otherid",model.getUser()); + context.startActivity(intent); + } + }); + return convertview; + } + + class ViewHolder{ + TextView tv_network; + TextView tv_nikename; + ImageView iv_avatar; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/AnswerReplyAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/AnswerReplyAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..10837a9557c864559e7c6336aeef67f0a136216b --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/AnswerReplyAdapter.java @@ -0,0 +1,132 @@ +package com.jiuqi.elove.adapter; + +import android.content.Context; +import android.graphics.Bitmap; +import android.support.v4.graphics.drawable.RoundedBitmapDrawable; +import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory; +import android.text.SpannableString; +import android.text.Spanned; +import android.text.style.ForegroundColorSpan; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.TextView; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.target.BitmapImageViewTarget; +import com.jiuqi.elove.R; +import com.jiuqi.elove.entity.QaReplyEachotherModel; +import com.jiuqi.elove.util.AbDateUtil; +import com.jiuqi.elove.util.EasyGlide; +import com.jiuqi.elove.util.JqStrUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * + * Created by dl on 2017/1/11. + */ +public class AnswerReplyAdapter extends BaseAdapter{ + + private List mList; + private Context context; + private LayoutInflater mInflater; + + private AnswerListener mAnswerListener; + + public interface AnswerListener{ + void onAnswerClick(View view,int position); + } + + public AnswerReplyAdapter(Context context){ + this.context = context; + mInflater = LayoutInflater.from(context); + mList = new ArrayList<>(); + } + + public void myAnswerReplyAdapter(List list){ + this.mList.clear(); + this.mList.addAll(list); + } + + public void setOnAnswerListener(AnswerListener listener){ + mAnswerListener = listener; + } + + public void updateListView(List list){ + this.mList.clear(); + this.mList.addAll(list); + notifyDataSetChanged(); + } + @Override + public int getCount() { + return mList.size(); + } + + @Override + public Object getItem(int position) { + return mList.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup viewGroup) { + final ViewHolder vh; + if(convertView==null){ + convertView = mInflater.inflate(R.layout.item_reply_layout,null); + vh = new ViewHolder(); + vh.iv_avatar = (ImageView) convertView.findViewById(R.id.iv_avatar); + vh.tv_nikename = (TextView) convertView.findViewById(R.id.tv_nikename); + vh.tv_questiontime = (TextView) convertView.findViewById(R.id.tv_questiontime); + vh.tv_content = (TextView) convertView.findViewById(R.id.tv_content); + vh.tv_reply = (TextView) convertView.findViewById(R.id.tv_reply); + convertView.setTag(vh); + }else{ + vh = (ViewHolder)convertView.getTag(); + } + /** + * 获取数据并将数据填充如ui + */ + final QaReplyEachotherModel model = mList.get(position); + setData2View(vh,model,position); + return convertView; + } + + private void setData2View(final ViewHolder vh,QaReplyEachotherModel model,final int position) { + EasyGlide.getInstance().showImageCircle(model.getAvatar(),vh.iv_avatar); + vh.tv_nikename.setText(model.getReplyername()); + vh.tv_questiontime.setText(AbDateUtil.formatDateStr2Desc(model.getReplytime(),"yyyy-MM-dd HH:mm","MM-dd HH:mm")); + if(JqStrUtil.isEmpty(model.getAskname())){ + vh.tv_content.setText(model.getReplydetail()); + vh.tv_reply.setVisibility(View.VISIBLE); + }else{ + SpannableString styledText = new SpannableString("回复 "+model.getAskname().trim()+": "+model.getReplydetail()); + styledText.setSpan(new ForegroundColorSpan(context.getResources().getColor(R.color.gray)),0,4+model.getAskname().trim().length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + vh.tv_content.setText(styledText); + vh.tv_reply.setVisibility(View.GONE); + } + vh.tv_reply.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if(mAnswerListener!=null){ + mAnswerListener.onAnswerClick(view,position); + } + } + }); + } + + class ViewHolder{ + public ImageView iv_avatar; + public TextView tv_nikename; + public TextView tv_questiontime; + public TextView tv_content; + public TextView tv_reply; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/AreaDataUtil.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/AreaDataUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..b98b29559690007c9daf7fe47cbcd6798785d374 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/AreaDataUtil.java @@ -0,0 +1,104 @@ +package com.jiuqi.elove.adapter; + +import android.content.Context; + +import com.jiuqi.elove.R; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; + +/** + * 全国省份城市操作类 + * + * @author JiangPing + */ +public class AreaDataUtil { + + /** + * 所有的省市String + */ + public String AREAS_DATA; + /** + * 一个省份对应多个城市 + */ + private String[] single_province_city; + /** + * 全国省市Map key:省份 |Value:城市集合 + */ + private HashMap> mCityMap = new HashMap<>(); + + public AreaDataUtil(Context context,String flag) { + if("arq".equals(flag)){ + AREAS_DATA = context.getResources().getString(R.string.province_and_city_rq); + }else if("origo".equals(flag)){ + AREAS_DATA = context.getResources().getString(R.string.province_and_city_origo); + }else{ + AREAS_DATA = context.getResources().getString(R.string.province_and_city); + } + splitProvince(); + getAllCityMap(); + } + + /** + * 将省份和对应城市分割出来 + *

    + * 得到:宁夏!!银川!石嘴山!吴忠!固原 + */ + private void splitProvince() { + single_province_city = AREAS_DATA.split("!!!"); + } + + /** + * 获得全国省份的列表 + * + * @return + */ + public ArrayList getProvinces() { + ArrayList provinceList = new ArrayList<>(); + for (String str : single_province_city) { + String province = str.split("!!")[0]; + provinceList.add(province); + } + return provinceList; + } + + /** + * 根据省份获取城市列表 + * + * @return + */ + private void getAllCityMap() { + for (String str : single_province_city) { + // 得到省份 + String province = str.split("!!")[0]; + // 得到当前省份对应的城市 + List cityList= new ArrayList<>(); + if(str.split("!!").length>1){//如果大于1则证明有城市或者区 + String city = str.split("!!")[1]; + // 分离城市放入集合 + cityList = Arrays.asList(city.split("!")); + } + + // 省份和城市放入Map中 + mCityMap.put(province, cityList); + } + } + + /** + * 根据省份查找对应的城市列表 + * + * @return 城市集合 + */ + public ArrayList getCityByProvince(String provinceStr) { + + List list = mCityMap.get(provinceStr); + ArrayList arrList = new ArrayList<>(); + for (String city : list) { + arrList.add(city); + } + return arrList; + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/CardAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/CardAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..e2d1e9302c98f27ec912107f57b2d22a61061fba --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/CardAdapter.java @@ -0,0 +1,135 @@ +package com.jiuqi.elove.adapter; + +import android.content.Context; +import android.content.res.Resources; +import android.support.v7.widget.CardView; +import android.util.DisplayMetrics; +import android.view.View; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.bumptech.glide.Glide; +import com.huxq17.swipecardsview.BaseCardAdapter; +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.CommonDataUtil; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.JqBaseActivity; +import com.jiuqi.elove.entity.RecommendUserInfoModel; +import com.jiuqi.elove.util.CommonUtil; +import com.jiuqi.elove.util.JqStrUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by dl on 2017/2/7. + * 首页堆叠适配器 + */ + +public class CardAdapter extends BaseCardAdapter { + + private List datas = new ArrayList(); + private Context context; + + public CardAdapter(List datas, Context context) { + this.datas = datas; + this.context = context; + } + + @Override + public int getCount() { + return datas.size(); + } + + @Override + public int getCardLayoutId() { + return R.layout.card_item; + } + + @Override + public void onBindData(int position, View cardview) { + if (datas == null || datas.size() == 0) { + return; + } +// cardview.setLayoutParams(getMyLayout()); + TextView tv_match = (TextView) cardview.findViewById(R.id.tv_match); + TextView tv_nike = (TextView) cardview.findViewById(R.id.tv_nike); + TextView tv_sex = (TextView) cardview.findViewById(R.id.tv_sex); + TextView tv_age = (TextView) cardview.findViewById(R.id.tv_age); + TextView tv_constellation = (TextView) cardview.findViewById(R.id.tv_constellation); + TextView tv_address = (TextView) cardview.findViewById(R.id.tv_address); + TextView tv_degree = (TextView) cardview.findViewById(R.id.tv_degree); + ImageView iv_o_authstatus = (ImageView) cardview.findViewById(R.id.iv_o_authstatus); + ImageView iv_qiyuan_status = (ImageView) cardview.findViewById(R.id.iv_qiyuan_status); + ImageView ivcard = (ImageView) cardview.findViewById(R.id.iv_card); + ImageView iv_company_auth = (ImageView) cardview.findViewById(R.id.iv_company_auth); + ivcard.setLayoutParams(getMyLayout()); + RecommendUserInfoModel model = datas.get(position); + String url = model.getAvatar(); + if(1==model.getSex()){ + Glide.with(context).load(url).placeholder(R.drawable.img_default_boy).into(ivcard); + }else{ + Glide.with(context).load(url).placeholder(R.drawable.img_default_girl).into(ivcard); + } + if(!JqStrUtil.isEmpty(model.getMatch())&&!"0".equals(model.getMatch())){ + tv_match.setVisibility(View.VISIBLE); + tv_match.setText("匹配度 "+model.getMatch()+"%"); + }else{ + tv_match.setVisibility(View.GONE); + } + if(!JqStrUtil.isEmpty(model.getLocalplace())){ + tv_address.setText(model.getLocalplace()); + } + if(!JqStrUtil.isEmpty(model.getNickname())){ + tv_nike.setText(model.getNickname()); + } + if(!JqStrUtil.isEmpty(model.getConstellation())){ + tv_constellation.setText(model.getConstellation()); + } + if(!JqStrUtil.isEmpty(model.getDegree())){ + tv_degree.setText(CommonDataUtil.degreeMap.get(model.getDegree())); + } + tv_age.setText(String.valueOf(model.getAge())); + tv_sex.setText(CommonDataUtil.sexMap.get(String.valueOf(model.getSex()))); + + if(Constant.REALNAME_PASS.equals(model.getRealnametype())){ + iv_o_authstatus.setImageResource(R.drawable.rz_name_on); + }else{ + iv_o_authstatus.setImageResource(R.drawable.rz_name_un); + } + if(Constant.YOUTH_PASS.equals(model.getYouthLeague())){ + iv_qiyuan_status.setImageResource(R.drawable.rz_qiyuan_on); + }else{ + iv_qiyuan_status.setImageResource(R.drawable.rz_qiyuan_un); + } + if(Constant.COMPANY_PASS.equals(model.getKind())){ + iv_company_auth.setImageResource(R.drawable.icon_company_on); + }else{ + iv_company_auth.setImageResource(R.drawable.icon_company_un); + } + } + + public void setData(List datas) { + this.datas = datas; + } + + /** + * 如果可见的卡片数是5,则可以不用实现这个方法 + * @return + */ + @Override + public int getVisibleCardCount() { + return 3; + } + + private RelativeLayout.LayoutParams getMyLayout(){ + Resources resources = context.getResources(); + DisplayMetrics dm = resources.getDisplayMetrics(); + int width = dm.widthPixels - CommonUtil.dip2px(context,70); +// LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(width,width); + RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(width,width); + return layoutParams; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/ChoicenessAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/ChoicenessAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..8c5554a8969229887a2f5d7f1ffcc55c4d781cff --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/ChoicenessAdapter.java @@ -0,0 +1,142 @@ +package com.jiuqi.elove.adapter; + +import android.content.Context; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.bumptech.glide.Glide; +import com.jiuqi.elove.R; +import com.jiuqi.elove.entity.ChoicenessAndDetailModel; +import com.jiuqi.elove.util.JqStrUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * + * Created by dl on 2017/1/5. + */ +public class ChoicenessAdapter extends RecyclerView.Adapter{ + + private List mList; + private Context context; + private LayoutInflater inflater; + private OnRecyclerViewItemClickListener mOnItemClickListener; + + public ChoicenessAdapter(Context context){ + this.context = context; + this.inflater = LayoutInflater.from(context); + mList = new ArrayList<>(); + } + //define interface + public interface OnRecyclerViewItemClickListener { + void onItemClick(int position); + } + + public void updateRecylerView(List list){ + mList.clear(); + mList.addAll(list); + notifyDataSetChanged(); + } + + public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) { + this.mOnItemClickListener = listener; + } + + @Override + public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = inflater.inflate(R.layout.item_choiceness_layout,parent,false); + MyViewHolder vh = new MyViewHolder(view); + return vh; + } + + @Override + public void onBindViewHolder(final MyViewHolder holder, final int position) { + final ChoicenessAndDetailModel model = mList.get(position); + if("1".equals(model.getIstop())){//2 是否显示置顶字样 + holder.tv_istop.setVisibility(View.VISIBLE); + holder.tv_title.setText("\t\t\t\t\t\t\t "+value2String(model.getTitle()));//1 精选名称 + }else{ + holder.tv_istop.setVisibility(View.GONE); + holder.tv_title.setText(value2String(model.getTitle()));//1 精选名称 + } + holder.tv_content.setText(value2String(model.getTheme()));//3 精选简介 + if(JqStrUtil.isEmpty(model.getScans())){//4 浏览数 + holder.tv_scancount.setText("0"); + }else{ + holder.tv_scancount.setText(model.getScans()); + } + if("1".equals(model.getType())){ + holder.tv_reply_answer.setText("人回复"); + }else{ + holder.tv_reply_answer.setText("人解答"); + } + if(JqStrUtil.isEmpty(model.getReviews())){//5 评论数 + holder.tv_answercount.setText("0"); + }else{ + holder.tv_answercount.setText(model.getReviews()); + } + if(!JqStrUtil.isEmpty(model.getPicture())){//6 精选是否有图片 + holder.ll_iv.setVisibility(View.VISIBLE);//"https://pic4.zhimg.com/02685b7a5f2d8cbf74e1fd1ae61d563b_xll.jpg" + Glide.with(context).load(model.getPicture()).placeholder(R.drawable.img_hx_avatar).centerCrop().dontAnimate().into(holder.iv_choiceness); + } else{ + holder.ll_iv.setVisibility(View.GONE); + } + holder.ll_all.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (mOnItemClickListener != null) { + int layoutPosition = holder.getLayoutPosition(); + mOnItemClickListener.onItemClick(layoutPosition); + } +// Intent intent; +// if("1".equals(model.getType())){ +// intent = new Intent(context,ChoicenessDetailActivity.class); +// intent.putExtra("title",model.getTitle()); +// }else{ +// intent = new Intent(context, QaDetailActivity.class); +// } +// intent.putExtra("id",model.getCreamid()); +// context.startActivity(intent); + } + }); + } + + @Override + public int getItemCount() { + return mList==null ? 0 : mList.size(); + } + + class MyViewHolder extends RecyclerView.ViewHolder { + TextView tv_title; + TextView tv_istop; + TextView tv_content; + TextView tv_answercount; + TextView tv_scancount; + TextView tv_reply_answer; + ImageView iv_choiceness; + LinearLayout ll_iv; + LinearLayout ll_all; + public MyViewHolder(View itemView) { + super(itemView); + tv_title = (TextView) itemView.findViewById(R.id.tv_title); + tv_istop = (TextView) itemView.findViewById(R.id.tv_istop); + tv_content = (TextView) itemView.findViewById(R.id.tv_content); + tv_answercount = (TextView) itemView.findViewById(R.id.tv_answercount); + tv_scancount = (TextView) itemView.findViewById(R.id.tv_scancount); + tv_reply_answer = (TextView) itemView.findViewById(R.id.tv_reply_answer); + iv_choiceness = (ImageView) itemView.findViewById(R.id.iv_choiceness); + ll_iv = (LinearLayout) itemView.findViewById(R.id.ll_iv); + ll_all = (LinearLayout) itemView.findViewById(R.id.ll_all); + } + } + + private String value2String(String value){ + return value==null?"此值得到为null":value; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/ChoicenessCommentAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/ChoicenessCommentAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..80ddc4f6d0a80aeb586f673b15d235ddd9f656c4 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/ChoicenessCommentAdapter.java @@ -0,0 +1,158 @@ +package com.jiuqi.elove.adapter; + +import android.content.Context; +import android.graphics.Bitmap; +import android.support.v4.graphics.drawable.RoundedBitmapDrawable; +import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.TextView; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.target.BitmapImageViewTarget; +import com.jiuqi.elove.R; +import com.jiuqi.elove.entity.ChoicenessCommentModel; +import com.jiuqi.elove.util.AbDateUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * + * Created by dl on 2017/1/10. + */ +public class ChoicenessCommentAdapter extends BaseAdapter{ + + private List mList = new ArrayList<>(); + private LayoutInflater inflater; + private Context context; +// private String myId; +// private final OkHttpUtil okHttpUtil = OkHttpUtil.getInstance(); +// private SharedPreferences sp; + + public ChoicenessCommentAdapter(Context context){ + this.context = context; + inflater = LayoutInflater.from(context); +// glideRequest = Glide.with(context); +// SharedPreferences sp = context.getSharedPreferences("elove",context.MODE_PRIVATE); +// myId = sp.getString("userid",""); +// getDataFromSp(context); + } + +// private void getDataFromSp(Context context){ +// sp = context.getSharedPreferences("elove",Context.MODE_PRIVATE); +// kind = sp.getInt("kind",1000); +// ifac = sp.getString("ifac",""); +// } + + public void MyMsgAdapter(List list){ + this.mList.clear(); + this.mList.addAll(list); + } + + /** + * 当listview数据发生变化时,调用此方法来更新listview + */ + public void updateListView(List list){ + this.mList.clear(); + this.mList.addAll(list); + notifyDataSetChanged(); + } + @Override + public int getCount() { + return mList.size(); + } + + @Override + public Object getItem(int position) { + return mList.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(final int position, View convertView, ViewGroup parent) { + final ViewHolder vh; + if(convertView==null){ + convertView = inflater.inflate(R.layout.item_choiceness_comment,null); + vh = new ViewHolder(); + vh.img_avatar = (ImageView) convertView.findViewById(R.id.img_avatar); + vh.txt_nickname = (TextView) convertView.findViewById(R.id.txt_nickname); + vh.txt_time = (TextView) convertView.findViewById(R.id.txt_time); + vh.txt_words = (TextView) convertView.findViewById(R.id.txt_words); + convertView.setTag(vh); + }else{ + vh = (ViewHolder) convertView.getTag(); + } + final ChoicenessCommentModel model = mList.get(position); + vh.txt_nickname.setText(model.getUsername()); + vh.txt_time.setText(AbDateUtil.formatDateStr2Desc(model.getTime(),"yyyy-MM-dd HH:mm","MM-dd HH:mm")); + vh.txt_words.setText(model.getComment()); + Glide.with(context).load(model.getAvatar()).asBitmap().centerCrop().into(new BitmapImageViewTarget(vh.img_avatar) { + @Override + protected void setResource(Bitmap resource) { + RoundedBitmapDrawable circularBitmapDrawable = + RoundedBitmapDrawableFactory.create(context.getResources(), resource); + circularBitmapDrawable.setCircular(true); + vh.img_avatar.setImageDrawable(circularBitmapDrawable); + } + }); + return convertView; + } + +// private void like(final RecommendUserInfoModel model, final ViewHolder vh, final String action, final int position) { +// String likeUrl = Constant.COMMON_URL + Interface.USER_LIKE; +// SharedPreferences sp = context.getSharedPreferences("elove",context.MODE_PRIVATE); +// String userId = sp.getString("userid",""); +// String likeId = model.getOtherID(); +// JSONObject obj = new JSONObject(); +// obj.put("userID",userId); +// obj.put("likeID",likeId); +// obj.put("action",action); +// obj.put("version",Constant.VERSION); +// String param = obj.toJSONString(); +// Log.d(TAG, "like: param"+param); +// okHttpUtil.sendJsonStrByPostAsync(context,true,likeUrl, param, new OkHttpUtil.OnGetJsonObject() { +// @Override +// public void onResponse(JSONObject jsonObject) { +// String rsCode = jsonObject.getString("retcode"); +// String explanation = jsonObject.getString("explanation"); +// Log.d(TAG, "onResponse: rscode"+rsCode); +// if("1".equals(rsCode)){ +// String isLike = ""; +// if("2".equals(action)){ +// vh.isLike.setImageResource(R.drawable.icon_like); +// agreetemp = agreetemp -1; +// isLike = "2"; +// }else if("1".equals(action)){ +// vh.isLike.setImageResource(R.drawable.icon_like_red); +// agreetemp = agreetemp + 1; +// isLike = "1"; +// } +// //请求接口成功之后才调用这几个方法,否则即使不成功也要走一遍,不合理 +// model.setIflike(isLike); +// model.setLikenum(agreetemp); +// mList.remove(position); +// mList.add(position,model);//更新list中的model,否则获取数据时是已经从服务器中得到的旧list,点赞数据导致不一致 +// notifyDataSetChanged();//通知更新,否则不好用 +// vh.agree.setText(String.valueOf(agreetemp)); +// }else if("100".equals(rsCode)){ +// JqStrUtil.showToast(context,explanation); +// } +// } +// },null); +// } + + class ViewHolder{ + public ImageView img_avatar; + public TextView txt_nickname; + public TextView txt_time; + public TextView txt_words; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/CircleRecentAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/CircleRecentAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..4c38101dae82b72be405f6c5617cfc5e638ff58b --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/CircleRecentAdapter.java @@ -0,0 +1,675 @@ +package com.jiuqi.elove.adapter; + +import android.content.Context; +import android.content.Intent; +import android.os.Handler; +import android.os.Message; +import android.support.v7.widget.RecyclerView; +import android.text.Html; +import android.text.Spannable; +import android.text.SpannableString; +import android.text.Spanned; +import android.text.TextPaint; +import android.text.TextUtils; +import android.text.method.LinkMovementMethod; +import android.text.style.ClickableSpan; +import android.text.style.MetricAffectingSpan; +import android.util.DisplayMetrics; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ListView; +import android.widget.PopupWindow; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.bumptech.glide.Glide; +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.CommonDataUtil; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.entity.CircleModel; +import com.jiuqi.elove.util.AbDateUtil; +import com.jiuqi.elove.util.CommonUtil; +import com.jiuqi.elove.util.EasyGlide; +import com.jiuqi.elove.util.JqStrUtil; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +/** + * 缘圈动态适配器 + * 一定要销毁持有对象的view,否则改view持有的操作对象无法更新!!!!!! + * Created by dl on 2017/5/10. + */ +public class CircleRecentAdapter extends RecyclerView.Adapter{ + + private List mList; + private Context context; + private LayoutInflater layoutInflater; + private DisplayMetrics dm; + private PopupWindow window; + + private OnItemClickListener mOnItemClickListener; + + public CircleRecentAdapter(Context context){ + this.context = context; + layoutInflater = LayoutInflater.from(context); + mList = new ArrayList<>(); + dm = context.getResources().getDisplayMetrics(); + } + + public void updateRecylerView(List list){ + mList.clear(); + mList.addAll(list); + notifyDataSetChanged(); + } + + public void setOnItemClickListener(OnItemClickListener mOnItemClickListener){ + this.mOnItemClickListener = mOnItemClickListener; + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = layoutInflater.inflate(R.layout.item_circle,null,false); + return new CircleViewHolder(view); + } + + @Override + public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { + CircleModel model = mList.get(position); + EasyGlide.getInstance().showImage(true,model.getAvatar(),((CircleViewHolder)holder).iv_avatar,R.drawable.img_hx_avatar); + ((CircleViewHolder)holder).tv_relation.setText(CommonDataUtil.relationMap.get(model.getRelation())); + ((CircleViewHolder)holder).tv_nike.setText(model.getNickname()); + if(Constant.CIRCLE_NOT_LIKE==model.getIflike()){ + ((CircleViewHolder)holder).iv_like.setImageResource(R.drawable.icon_like_grayborder_large); + ((CircleViewHolder)holder).tv_like.setText("赞"); + }else{ + ((CircleViewHolder)holder).iv_like.setImageResource(R.drawable.icon_like_redborder_large); + ((CircleViewHolder)holder).tv_like.setText("取消"); + } + if(JqStrUtil.isEmpty(model.getAddress())){//地址 + ((CircleViewHolder)holder).tv_address.setVisibility(View.GONE); + }else{ + ((CircleViewHolder)holder).tv_address.setVisibility(View.VISIBLE); + ((CircleViewHolder)holder).tv_address.setText(model.getAddress()); + } + handleContent((CircleViewHolder)holder,model);//处理发表的内容 + setIfImgOrVideo2View((CircleViewHolder)holder,model);//是否显示图片和视频封面 + ((CircleViewHolder)holder).tv_time.setText(AbDateUtil.formatDateStr2Desc(model.getTime(), Constant.FORMATBEFOR,Constant.FORMATAFTERNOHOUR));//时间 + setLikeAndCommentList2View((CircleViewHolder)holder,model,position);//设置是否显示点赞和评论列表 + like((CircleViewHolder)holder,model,position);//点赞 + commentThisCircle((CircleViewHolder)holder,model,position);//评论 + reportOrDeleteCircle((CircleViewHolder)holder,model,position);//举报或者删除 + toOtherPage((CircleViewHolder)holder,model);//点击头像进入他人中心 + } + + private void toOtherPage(CircleViewHolder holder, final CircleModel model) { + holder.iv_avatar.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if(mOnItemClickListener!=null){ + mOnItemClickListener.enterOtherCenter(model.getUserid()); + } + } + }); + } + + /** + * 直接评论朋友圈消息 + * @param holder + * @param model + * @param position + */ + private void commentThisCircle(CircleViewHolder holder, final CircleModel model, final int position) { + holder.ll_recommend.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if(mOnItemClickListener!=null){ + mOnItemClickListener.comment(model,position,"",""); + } + } + }); + } + + + /** + * 处理发表的内容 + * @param holder + * @param model + */ + private void handleContent(final CircleViewHolder holder, CircleModel model) { + if(JqStrUtil.isEmpty(model.getContent())){//动态内容 + holder.tv_content.setVisibility(View.GONE); + holder.tv_showall.setVisibility(View.GONE); + }else{ + holder.tv_content.setVisibility(View.VISIBLE); + holder.tv_content.setText(model.getContent()); + showCheckAll(holder,model); +// holder.tv_showall.setVisibility(View.GONE); + } + } + + /** + * 如果TextView没有显示完全就显示查看全部按钮,点击查看全部按钮后TextView会显示全部内容,同时隐藏查看全部按钮 + * @param + */ + private void showCheckAll(final CircleViewHolder holder, CircleModel model) { + final Handler handler = new Handler(){ + @Override + public void handleMessage(Message msg) { + if(holder.tv_content.getLineCount()>Constant.MAX_LINES){ + holder.tv_content.setMaxLines(Constant.MAX_LINES); + holder.tv_showall.setVisibility(View.VISIBLE); + holder.tv_showall.setText("全文"); + }else{ + holder.tv_showall.setVisibility(View.GONE); + } + } + }; + holder.tv_content.post(new Runnable() { + @Override + public void run() { + handler.sendEmptyMessage(0x00); + } + }); + holder.tv_showall.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if("全文".equals(holder.tv_showall.getText())){ + holder.tv_content.setEllipsize(null); + holder.tv_content.setSingleLine(false); + holder.tv_showall.setText("收起"); + }else{ + holder.tv_content.setMaxLines(Constant.MAX_LINES); + holder.tv_showall.setVisibility(View.VISIBLE); + holder.tv_showall.setText("全文"); + } + } + }); + } + + /** + * 举报或者删除该条朋友圈 + */ + private void reportOrDeleteCircle(final CircleViewHolder holder, final CircleModel model, final int position) { + holder.iv_handle.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + showMore(holder,model,position); + } + }); + } + + /** + * 显示更多操作 + * @param model + * @param position + */ + private void showMore(CircleViewHolder holder,final CircleModel model, final int position) { + if(mOnItemClickListener!=null){ + mOnItemClickListener.shoreMore(holder,model,position); + } +// View view = layoutInflater.inflate(R.layout.popupwindow_circle,null); +// TextView tv_handle = (TextView) view.findViewById(R.id.tv_handle); +// //一定要销毁持有对象的view,否则改view持有的操作对象无法更新 +// if(window==null){ +// window = new PopupWindow(view,ViewGroup.LayoutParams.WRAP_CONTENT, +// ViewGroup.LayoutParams.WRAP_CONTENT); +// window.setOutsideTouchable(true); +// window.setTouchable(true); +//// window.setFocusable(true); +// window.setAnimationStyle(R.style.circle_anim_style); +// } +// if("1".equals(model.getRelation())){//本人发的 +// if(tv_handle!=null){ +// tv_handle.setText("删除"); +// tv_handle.setOnClickListener(new View.OnClickListener() { +// @Override +// public void onClick(View view) { +// if(mOnItemClickListener!=null){ +// window.dismiss(); +// mOnItemClickListener.deleteItem(model,position); +// } +// } +// }); +// } +// }else{//非本人发的 +// if(tv_handle!=null){ +// tv_handle.setText("举报"); +// tv_handle.setOnClickListener(new View.OnClickListener() { +// @Override +// public void onClick(View view) { +// if(mOnItemClickListener!=null){ +// window.dismiss(); +// mOnItemClickListener.report(model,position); +// } +// } +// }); +// } +// } +// if(window.isShowing()){ +// window.dismiss(); +// }else{ +// window.showAsDropDown(holder.iv_handle,-holder.iv_handle.getWidth()/2,0); +// } +// window.setOnDismissListener(new PopupWindow.OnDismissListener() { +// @Override +// public void onDismiss() { +// window = null; +// } +// }); + } + + /** + * 点赞 + * @param holder + * @param model + * @param position + */ + private void like(final CircleViewHolder holder, final CircleModel model, final int position) { + holder.ll_like.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if(mOnItemClickListener!=null){ + mOnItemClickListener.likeOrNot(model,position); + } + } + }); + } + + /** + * 是否显示图片或者视频封面 + * @param holder + * @param model + */ + private void setIfImgOrVideo2View(CircleViewHolder holder, CircleModel model) { + List> imgList = model.getImgs(); + if(imgList!=null&&!imgList.isEmpty()){ + if (Constant.PUT_PIC_ACTION == model.getImgstype()) { + setImg2View(holder, imgList, model); + } + }else{ + holder.ll_img1.setVisibility(View.GONE); + holder.ll_img2.setVisibility(View.GONE); + } + if(model.getVideos()!=null&&!JqStrUtil.isEmpty(model.getVideos().getVideoimg())){ + holder.rl_video.setVisibility(View.VISIBLE); + holder.rl_video.setLayoutParams(getMyLineLayout(model.getVideos().getVideoimgwh())); + holder.iv_img.setLayoutParams(getMyReLayout(model.getVideos().getVideoimgwh())); + final String videoUrl = model.getVideos().getVideo(); + final String picUrl = model.getVideos().getVideoimg(); + Glide.with(context).load(picUrl).dontAnimate().into(holder.iv_img); + holder.rl_video.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if(mOnItemClickListener!=null){ + mOnItemClickListener.showVideo(videoUrl,picUrl); + } + } + }); + }else{ + holder.rl_video.setVisibility(View.GONE); + } + } + + /** + * 设置点赞列表和评论列表 + * @param holder + * @param model + */ + private void setLikeAndCommentList2View(CircleViewHolder holder, CircleModel model,int position) { + List commentList = model.getReviews(); + List likeList = model.getLikes(); + if(commentList.isEmpty()){//如果评论列表是空 + holder.view_line.setVisibility(View.GONE); + holder.ll_comment.setVisibility(View.GONE); + if(likeList.isEmpty()){//如果点赞列表为空 + holder.ll_like_content.setVisibility(View.GONE); + holder.ll_like_comment_all.setVisibility(View.GONE); + }else{//如果点赞列表不为空 + holder.ll_like_content.setVisibility(View.VISIBLE); + holder.ll_like_comment_all.setVisibility(View.VISIBLE); + handleLikeList(holder,model,likeList); + } + }else{//如果评论列表不为空 + holder.ll_comment.setVisibility(View.VISIBLE); + holder.ll_like_comment_all.setVisibility(View.VISIBLE); + handleCommentList(holder,model,commentList,position); + if(likeList.isEmpty()){//如果点赞列表为空 + holder.view_line.setVisibility(View.GONE); + holder.ll_like_content.setVisibility(View.GONE); + }else{ + holder.view_line.setVisibility(View.VISIBLE); + holder.ll_like_content.setVisibility(View.VISIBLE); + handleLikeList(holder,model,likeList); + } + } + } + + /** + * 展示评论列表 + * @param holder + * @param model + * @param commentList + * @param position + */ + private void handleCommentList(CircleViewHolder holder,final CircleModel model, List commentList, final int position) { + Spanned spannedAll = Html.fromHtml(""); + for(int i=0;i回复"); + SpannableString replyTextString = new SpannableString(replyText); + replyTextString.setSpan(clickBeReplys,0,2,Spannable.SPAN_INCLUSIVE_INCLUSIVE);//给"回复"两个字设置触发评论的点击事件 + SpannableString replyName = new SpannableString(commentModel.getBecomment()); + replyName.setSpan(spansecond,0,commentModel.getBecomment().length(),Spanned.SPAN_INCLUSIVE_INCLUSIVE);//给被回复的人设置点击进入他人中心 + spannedReply = (Spanned) TextUtils.concat(spannableString,replyTextString,replyName,":"); + }else{ + spannedReply = (Spanned) TextUtils.concat(spannableString,":"); + } + Spanned replyContent; + if(i"+commentModel.getContent()+"
    "); + }else{ + replyContent = Html.fromHtml(""+commentModel.getContent()+""); + } + SpannableString spanBeReply = new SpannableString(replyContent); + ClickableSpan clickBeReply = new ClickableSpan() {//给回复的内容设置触发点击评论的事件 + @Override + public void onClick(View view) { + if(mOnItemClickListener!=null){ + mOnItemClickListener.comment(model,position,commentModel.getUserid(),commentModel.getComment()); + } + } + @Override + public void updateDrawState(TextPaint ds) { + ds.setColor(context.getResources().getColor(R.color.blackFont)); + ds.setUnderlineText(false); + } + }; + spanBeReply.setSpan(clickBeReply,0,commentModel.getContent().length(),Spannable.SPAN_INCLUSIVE_INCLUSIVE);//设置点击评论事件 + Spanned spannedItem = (Spanned) TextUtils.concat(spannedReply,spanBeReply);//将单条回复拼装起来 + spannedAll = (Spanned) TextUtils.concat(spannedAll,spannedItem);//将所有的回复做保存并拼装起来 + } + holder.tv_comment_list.setText(spannedAll==null?"error":spannedAll); + holder.tv_comment_list.setMovementMethod(LinkMovementMethod.getInstance()); + } + + /** + * 给每个点赞人员作相应的设置 + * @param holder + * @param model + * @param likeList + */ + private void handleLikeList(CircleViewHolder holder,CircleModel model,List likeList){ + Spanned spannedAll = Html.fromHtml(""); + for(int i=0;i> mList, CircleModel model) { + holder.ll_img1.setVisibility(View.VISIBLE); + holder.ll_img1.removeAllViews(); + if(mList.size()==1){ + holder.ll_img2.setVisibility(View.GONE); + ImageView iv = new ImageView(context); + iv.setLayoutParams(getMyLayout(model.getImgwh())); + iv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if(mOnItemClickListener!=null){ + mOnItemClickListener.clickPicOrVideo(mList,0); + } + } + }); + iv.setScaleType(ImageView.ScaleType.CENTER_CROP); + Glide.with(context).load(mList.get(0).get("img")).placeholder(R.drawable.img_hx_avatar).dontAnimate().into(iv); + holder.ll_img1.addView(iv); + }else if(mList.size()==2||mList.size()==3){ + holder.ll_img2.setVisibility(View.GONE); + for(int i=0;i> mList,int position); + void showVideo(String videoUrl,String imgUrl); + void enterOtherCenter(String userid); + void shoreMore(CircleViewHolder holder,CircleModel model,int position); + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/CircleRecentAdapter201801.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/CircleRecentAdapter201801.java new file mode 100644 index 0000000000000000000000000000000000000000..29f70de47f040c6a9f3bb3a722eba29f5b660780 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/CircleRecentAdapter201801.java @@ -0,0 +1,548 @@ +package com.jiuqi.elove.adapter; + +import android.content.Context; +import android.content.Intent; +import android.graphics.Bitmap; +import android.support.v7.widget.RecyclerView; +import android.text.TextUtils; +import android.util.DisplayMetrics; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.animation.GlideAnimation; +import com.bumptech.glide.request.target.SimpleTarget; +import com.jiuqi.elove.R; +import com.jiuqi.elove.activity.CommonH5Activity; +import com.jiuqi.elove.activity.NewsActivity; +import com.jiuqi.elove.activity.SysRecommendActivity; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.entity.CircleNewModel; +import com.jiuqi.elove.util.AbDateUtil; +import com.jiuqi.elove.util.CommonUtil; +import com.jiuqi.elove.util.EasyGlide; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.SupportMultiScreenUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * 缘圈动态适配器 + * Created by dl on 2017/5/10. + */ +public class CircleRecentAdapter201801 extends RecyclerView.Adapter{ + + private List mList; + private Context context; + private LayoutInflater layoutInflater; + private DisplayMetrics dm; + private View mHeaderView; + + private OnItemClickListener mOnItemClickListener; + private OnItemLongClickListener mOnItemLongClickListener; + + private static final int FIRST_TYPE = 0;//header + private static final int THRID_TYPE = 2;//常规缘圈 + + public CircleRecentAdapter201801(Context context){ + this.context = context; + layoutInflater = LayoutInflater.from(context); + mList = new ArrayList<>(); + dm = context.getResources().getDisplayMetrics(); + } + + public void updateRecylerView(List list){ + mList.clear(); + mList.addAll(list); + notifyDataSetChanged(); + } + + public void setHeaderView(View header){ + mHeaderView = header; + notifyItemInserted(0); + } + + public void setOnItemClickListener(OnItemClickListener mOnItemClickListener){ + this.mOnItemClickListener = mOnItemClickListener; + } + + public void setOnItemLongClickListener(OnItemLongClickListener mOnItemLongClickListener){ + this.mOnItemLongClickListener = mOnItemLongClickListener; + } + + @Override + public int getItemViewType(int position) { + if(mHeaderView==null) + return THRID_TYPE; + if(position==0) + return FIRST_TYPE; + return THRID_TYPE; + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + if(viewType==FIRST_TYPE){ + return new BrandViewHolder(mHeaderView); + }else{ + View view = layoutInflater.inflate(R.layout.item_circle_recent,parent,false); + SupportMultiScreenUtil.scale(view); + return new CircleViewHolder(view); + } + } + + @Override + public int getItemCount() { + return mHeaderView==null?mList.size():mList.size()+1; + } + + @Override + public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { + if(getItemViewType(position)==FIRST_TYPE) + return; + handleCircleContent(holder,position); + } + + public int getRealPosition(RecyclerView.ViewHolder holder) { + int position = holder.getLayoutPosition(); + return mHeaderView == null ? position : position - 1; + } + + /** + * ui&&事件 处理整个item的内容 + */ + private void handleCircleContent(RecyclerView.ViewHolder holder, int position) { + if(mHeaderView!=null&&position>0){ + position = position - 1; + } + CircleNewModel model = mList.get(position); + + handleHeadAndBottom((CircleViewHolder)holder,model);//头部和尾部的内容 + handleLikeAndComment((CircleViewHolder)holder,model);//展示点赞和评论数,以及点赞状态 + handleContent((CircleViewHolder)holder,model);//处理发表的内容 + setIfImgOrVideo2View((CircleViewHolder)holder,model);//是否显示图片和视频封面 + + like((CircleViewHolder)holder,model,position);//点赞 + commentThisCircle((CircleViewHolder)holder,model,position);//评论 + toOtherPage((CircleViewHolder)holder,model);//点击头像进入他人中心 + itemLongClick((CircleViewHolder)holder,model,position);//长点击 + } + + /** + * 长点击事件 + */ + private void itemLongClick(CircleViewHolder holder, final CircleNewModel model, final int position) { + holder.itemView.setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + if(mOnItemLongClickListener!=null){ + mOnItemLongClickListener.del(model,position); + } + return true; + } + }); + } + + /** + * ui 处理item顶部和尾部地点的内容 + */ + private void handleHeadAndBottom(CircleViewHolder holder, final CircleNewModel model) { + EasyGlide.getInstance().showImage(true,model.getAvatar(),holder.iv_avatar,R.drawable.img_hx_avatar);//头像 + holder.tv_nike.setText(model.getNickname());//昵称 + holder.tv_time.setText(AbDateUtil.formatDateStr2Desc(model.getTime(), Constant.FORMATBEFOR,Constant.FORMATAFTERNOHOUR));//时间 + if(TextUtils.isEmpty(model.getTopic())||TextUtils.isEmpty(model.getTopicid())){ + holder.tv_topic.setVisibility(View.GONE); + }else{ + holder.tv_topic.setVisibility(View.VISIBLE); + holder.tv_topic.setText("#"+model.getTopic()+"#"); + holder.tv_topic.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(mOnItemClickListener!=null){ + mOnItemClickListener.enterTopicDetailPage(model); + } + } + }); + } + if(JqStrUtil.isEmpty(model.getPosition())){//地址 + holder.tv_address.setVisibility(View.GONE); + }else{ + holder.tv_address.setVisibility(View.VISIBLE); + holder.tv_address.setText(model.getPosition()); + } + } + + /** + * ui 处理item的点赞和评论数 + */ + private void handleLikeAndComment(CircleViewHolder holder,CircleNewModel model) { + if(Constant.CIRCLE_NOT_LIKE==model.getIslike()){ + holder.iv_like.setImageResource(R.drawable.circle_like); + }else{ + holder.iv_like.setImageResource(R.drawable.circle_like_on); + } + holder.tv_like_num.setText(model.getLikenum()); + holder.tv_comment_num.setText(model.getCommentnum()); + } + + /** + * ui 处理发表的内容 + * @param holder + * @param model + */ + private void handleContent(final CircleViewHolder holder, CircleNewModel model) { + if(JqStrUtil.isEmpty(model.getText())){//动态内容 + holder.tv_content.setVisibility(View.GONE); + }else{ + holder.tv_content.setVisibility(View.VISIBLE); + holder.tv_content.setText(model.getText()); + } + } + + /** + * ui 显示图片或者视频封面 + * @param holder + * @param model + */ + private void setIfImgOrVideo2View(CircleViewHolder holder, CircleNewModel model) { + List imgList = model.getPictures(); + if(imgList!=null&&!imgList.isEmpty()){ + if (Constant.PUT_PIC_ACTION == model.getImgstype()) { + setImg2View(holder, imgList, model); + } + }else{ + holder.ll_img1.setVisibility(View.GONE); + holder.ll_img2.setVisibility(View.GONE); + } + if(model.getVideo()!=null&&!JqStrUtil.isEmpty(model.getVideo().getVideoimg())){ + holder.rl_video.setVisibility(View.VISIBLE); + holder.rl_video.setLayoutParams(getMyLineLayout(model.getVideo().getVideoimgwh())); + holder.iv_img.setLayoutParams(getMyReLayout(model.getVideo().getVideoimgwh())); + final String videoUrl = model.getVideo().getVideo(); + final String picUrl = model.getVideo().getVideoimg(); + Glide.with(context).load(picUrl).dontAnimate().into(holder.iv_img); + holder.rl_video.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if(mOnItemClickListener!=null){ + mOnItemClickListener.showVideo(videoUrl,picUrl); + } + } + }); + }else{ + holder.rl_video.setVisibility(View.GONE); + } + } + + + /** + * 事件 点击头像进入他人主页 + * @param holder + * @param model + */ + private void toOtherPage(CircleViewHolder holder, final CircleNewModel model) { + holder.iv_avatar.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if(mOnItemClickListener!=null){ + mOnItemClickListener.enterOtherCenter(model.getUserid()); + } + } + }); + } + + /** + * 事件 点赞 + * @param holder + * @param model + * @param position + */ + private void like(final CircleViewHolder holder, final CircleNewModel model, final int position) { + holder.iv_like.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(mOnItemClickListener!=null){ + mOnItemClickListener.likeOrNot(model,position); + } + } + }); + } + + /** + * 直接评论朋友圈消息 + * @param holder + * @param model + * @param position + */ + private void commentThisCircle(CircleViewHolder holder, final CircleNewModel model, final int position) { + holder.ll_comment.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(mOnItemClickListener!=null){ + mOnItemClickListener.comment(model,position); + } + } + }); + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(mOnItemClickListener!=null){ + mOnItemClickListener.comment(model,position); + } + } + }); + } + + /** + * header的容器 + */ + public static class BrandViewHolder extends RecyclerView.ViewHolder{ + + public BrandViewHolder(View itemView) { + super(itemView); + } + } + + /** + * 缘圈列表的item容器 + */ + public static class CircleViewHolder extends RecyclerView.ViewHolder{ + + TextView tv_nike;//用户昵称 + TextView tv_content;//用户发表内容 + TextView tv_address;//发表地址 + TextView tv_topic;//话题 + TextView tv_time;//发表时间 + TextView tv_like_num;//点赞数 + TextView tv_comment_num;//评论数 + LinearLayout ll_like;//点赞点击布局 + LinearLayout ll_comment;//评论点击布局 + LinearLayout ll_img1;//图片布局 + LinearLayout ll_img2;//图片布局 + RelativeLayout rl_video;//视频布局 + ImageView iv_avatar;//用户头像 + ImageView iv_img;//视频图片 + ImageView iv_like;//点赞 + + public CircleViewHolder(View itemView) { + super(itemView); + tv_nike = (TextView) itemView.findViewById(R.id.tv_nike); + tv_like_num = (TextView) itemView.findViewById(R.id.tv_like_num); + tv_comment_num = (TextView) itemView.findViewById(R.id.tv_comment_num); + tv_topic = (TextView) itemView.findViewById(R.id.tv_topic); + tv_content = (TextView) itemView.findViewById(R.id.tv_content); + tv_address = (TextView) itemView.findViewById(R.id.tv_address); + tv_time = (TextView) itemView.findViewById(R.id.tv_time); + ll_like = (LinearLayout) itemView.findViewById(R.id.ll_like); + ll_comment = (LinearLayout) itemView.findViewById(R.id.ll_comment); + ll_img1 = (LinearLayout) itemView.findViewById(R.id.ll_img1); + ll_img2 = (LinearLayout) itemView.findViewById(R.id.ll_img2); + rl_video = (RelativeLayout) itemView.findViewById(R.id.rl_video); + iv_avatar = (ImageView) itemView.findViewById(R.id.iv_avatar); + iv_img = (ImageView) itemView.findViewById(R.id.iv_img); + iv_like = (ImageView) itemView.findViewById(R.id.iv_like); + } + } + + private LinearLayout.LayoutParams getMyLayout(double rate){ + int width; + if(rate<1){ + width = dm.widthPixels*2/5; + }else{ + width = dm.widthPixels*3/5; + } + double height = width/rate; + return new LinearLayout.LayoutParams(width,(int)height); + } + + private LinearLayout.LayoutParams getBeforeEqualLayout(int dmWidth,int rate){ + int width = (dm.widthPixels-dmWidth)/rate; + int height = (dm.widthPixels-dmWidth)/rate; + LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(width,height); + lp.setMargins(0,5,10,5); + return lp; + } + + private LinearLayout.LayoutParams getEndEqualLayout(int dmWidth,int rate){ + int width = (dm.widthPixels-dmWidth)/rate; + int height = (dm.widthPixels-dmWidth)/rate; + LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(width,height); + lp.setMargins(0,5,0,5); + return lp; + } + + private LinearLayout.LayoutParams getPerEqualLayout(){ + int width = (dm.widthPixels-CommonUtil.dip2px(context,93))/3; + int height = (dm.widthPixels-CommonUtil.dip2px(context,93))/3; + LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(width,height); + lp.setMargins(0,CommonUtil.dip2px(context,1),CommonUtil.dip2px(context,2),CommonUtil.dip2px(context,1)); + return lp; + } + + private LinearLayout.LayoutParams getMyLineLayout(double rate){ + int width; + if(rate<1){ + width = dm.widthPixels/5; + }else{ + width = dm.widthPixels*2/5; + } + double height = width/rate; + LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(width,(int)height); + lp.setMargins(0,0,0,CommonUtil.dip2px(context,5)); + return new LinearLayout.LayoutParams(width,(int)height); + } + + private RelativeLayout.LayoutParams getMyReLayout(double rate){ + int width; + if(rate<1){ + width = dm.widthPixels/5; + }else{ + width = dm.widthPixels*2/5; + } + double height = width/rate; + RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(width,(int)height); + lp.setMargins(0,30,0,0); + return lp; + } + + /** + * 将图片放入view + */ + private void setImg2View(CircleViewHolder holder, final List mList, CircleNewModel model) { + holder.ll_img1.setVisibility(View.VISIBLE); + holder.ll_img1.removeAllViews(); + if(mList.size()==1){ + holder.ll_img2.setVisibility(View.GONE); + final ImageView iv = new ImageView(context); + + iv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if(mOnItemClickListener!=null){ + mOnItemClickListener.clickPicOrVideo(mList,0); + } + } + }); + iv.setScaleType(ImageView.ScaleType.CENTER_CROP); + //获取图片真正的宽高 + Glide.with(context).load(mList.get(0).getImg()).asBitmap().into(new SimpleTarget() { + @Override + public void onResourceReady(Bitmap bitmap, GlideAnimation glideAnimation) { + int width = bitmap.getWidth(); + int height = bitmap.getHeight(); + iv.setLayoutParams(getMyLayout((double)width/height)); + iv.setImageBitmap(bitmap); +// Glide.with(context).load(mList.get(0).getImg()).placeholder(R.drawable.img_hx_avatar).dontAnimate().into(iv); +// bitmap.recycle(); + } + }); + holder.ll_img1.addView(iv); + }else if(mList.size()==2){ + holder.ll_img2.setVisibility(View.GONE); + for(int i=0;i mList, int position); + void showVideo(String videoUrl, String imgUrl); + void enterOtherCenter(String userid); + void enterTopicDetailPage(CircleNewModel model); + } + + public interface OnItemLongClickListener{ + void del(final CircleNewModel model, final int position); + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/CircleTopicAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/CircleTopicAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..db990a5bc6b7b8c5c9d09eeb64e15d7e99baf7bf --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/CircleTopicAdapter.java @@ -0,0 +1,93 @@ +package com.jiuqi.elove.adapter; + +import android.content.Context; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.entity.CircleTopicModel; +import com.jiuqi.elove.util.SupportMultiScreenUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * 缘圈话题适配器 + * Created by jq on 2018/1/5. + */ + +public class CircleTopicAdapter extends RecyclerView.Adapter{ + + private List mAddList; + private Context mContext; + private LayoutInflater mInflater; + + private OnRecyclerViewItemClickListener mOnItemClickListener; + + public CircleTopicAdapter(Context context){ + this.mContext = context; + this.mInflater = LayoutInflater.from(mContext); + mAddList = new ArrayList<>(); + } + + public void updateRecylerView(List mList){ + mAddList.clear(); + mAddList.addAll(mList); + notifyDataSetChanged(); + } + + //define interface + public interface OnRecyclerViewItemClickListener { + void onItemClick(CircleTopicModel model, int position); + } + + public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) { + this.mOnItemClickListener = listener; + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = mInflater.inflate(R.layout.item_topic_layout,parent,false); + SupportMultiScreenUtil.scale(view); + MyHolder myHolder = new MyHolder(view); + return myHolder; + } + + @Override + public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) { + final CircleTopicModel model = mAddList.get(position); + ((MyHolder)holder).tv_topic.setText("#"+model.getTitle()+"#"); + ((MyHolder)holder).rl_topic.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(mOnItemClickListener!=null){ + mOnItemClickListener.onItemClick(model,position); + } + } + }); + } + + @Override + public int getItemCount() { + return mAddList.size(); + } + + public class MyHolder extends RecyclerView.ViewHolder{ + + public RelativeLayout rl_topic; + public TextView tv_topic; + + public MyHolder(View itemView) { + super(itemView); + tv_topic = (TextView) itemView.findViewById(R.id.tv_topic); + rl_topic = (RelativeLayout) itemView.findViewById(R.id.rl_topic); + } + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/CoOrganizerAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/CoOrganizerAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..4fa5148c57ed032efa603871c0553ae9106a863a --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/CoOrganizerAdapter.java @@ -0,0 +1,102 @@ +package com.jiuqi.elove.adapter; + +import android.content.Context; +import android.content.res.Resources; +import android.support.v7.widget.RecyclerView; +import android.util.DisplayMetrics; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.bumptech.glide.Glide; +import com.jiuqi.elove.R; +import com.jiuqi.elove.entity.EActDetailModel2_0_3; +import com.jiuqi.elove.entity.RechargeModel; +import com.jiuqi.elove.util.CommonUtil; + +import java.util.List; + +/** + * + * Created by dl on 2017/3/29. + */ +public class CoOrganizerAdapter extends RecyclerView.Adapter implements View.OnClickListener{ + + private List mList; + private Context mContext; + private LayoutInflater mInflater; + private LinearLayout.LayoutParams layoutParams; + + + private OnRecyclerViewItemClickListener mOnItemClickListener; + + public CoOrganizerAdapter(Context context,List list){ + this.mContext = context; + this.mInflater = LayoutInflater.from(context); + this.mList = list; + layoutParams = getMyLayout(); + } + + //define interface + public interface OnRecyclerViewItemClickListener { + void onItemClick(View view, int position); + } + + @Override + public void onClick(View v) { + if (mOnItemClickListener != null) { + //注意这里使用getTag方法获取数据 + mOnItemClickListener.onItemClick(v,(int)v.getTag()); + } + } + + public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) { + this.mOnItemClickListener = listener; + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = mInflater.inflate(R.layout.item_horizontal_list_layout,parent,false); + TextViewHolder textViewHolder = new TextViewHolder(view); + view.setOnClickListener(this); + return textViewHolder; + } + + @Override + public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) { + EActDetailModel2_0_3.CoOrganizer model = mList.get(position); + Glide.with(mContext).load(model.getUrl()).placeholder(R.drawable.img_hx_avatar).dontAnimate().into(((TextViewHolder)holder).mImage); + } + + @Override + public int getItemCount() { + return mList.size(); + } + + @Override + public int getItemViewType(int position) { + return super.getItemViewType(position); + } + + public class TextViewHolder extends RecyclerView.ViewHolder{ + + ImageView mImage; + public TextViewHolder(View itemView) { + super(itemView); + mImage = (ImageView) itemView.findViewById(R.id.img_list_item); + mImage.setLayoutParams(layoutParams); + } + } + + private LinearLayout.LayoutParams getMyLayout(){ + Resources resources = mContext.getResources(); + DisplayMetrics dm = resources.getDisplayMetrics(); + int width = dm.widthPixels - CommonUtil.dip2px(mContext,30); + LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(width/3,width*3/16); + return layoutParams; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/CommentAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/CommentAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..e631ddb16e0524e774dda90f04af56faaa9035ae --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/CommentAdapter.java @@ -0,0 +1,126 @@ +package com.jiuqi.elove.adapter; + +import android.content.Context; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.entity.CommentModel; +import com.jiuqi.elove.util.EasyGlide; +import com.jiuqi.elove.util.SupportMultiScreenUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by jq on 2017/11/9. + */ + +public class CommentAdapter extends RecyclerView.Adapter{ + + public static final String TV_MORE = "tv_more"; + public static final String TV_REPLY = "tv_reply"; + + private Context context; + private OnClickComment onClickComment; + private String flag; + private List mDatas = new ArrayList<>(); + + public CommentAdapter(Context context,String flag) { + this.context = context; + this.flag = flag; + } + + public void setCommentClickListener(OnClickComment onClickComment){ + this.onClickComment = onClickComment; + } + + public void updateListView(List list){ + mDatas.clear(); + mDatas.addAll(list); + notifyDataSetChanged(); + } + + @Override + public CommentViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_comment_layout,parent,false); + return new CommentViewHolder(view); + } + + @Override + public void onBindViewHolder(final CommentViewHolder holder, final int position) { + final CommentModel model = mDatas.get(position); + holder.tv_nike.setText(model.getUserName()); + holder.tv_time.setText(model.getTime()); + holder.tv_comment.setText(model.getComment()); + EasyGlide.getInstance().showImageCircle(model.getUserAvatar(),holder.iv_avatar); + //从评论回复列表中不要再次展示出回复,而从评论列表中展示回复,更多评论同理(但是更多评论字样具体判断是根据下方count来展示的) + if("reply".equals(flag)){ + holder.ll_reply.setVisibility(View.GONE); + holder.tv_more.setVisibility(View.GONE); + }else{ + holder.ll_reply.setVisibility(View.VISIBLE); + holder.tv_more.setVisibility(View.VISIBLE); + } + //具体确定是否展示更多回复字样 + if(model.getChildCount()>0){ + holder.tv_more.setVisibility(View.VISIBLE); + holder.tv_more.setText("查看全部"+model.getChildCount()+"条回复>"); + }else{ + holder.tv_more.setVisibility(View.GONE); + } + holder.ll_reply.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(onClickComment!=null){ + onClickComment.onReplyClick(TV_REPLY,holder,model,position); + } + } + }); + holder.tv_more.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(onClickComment!=null){ + onClickComment.onReplyClick(TV_MORE,holder,model,position); + } + } + }); + } + + @Override + public int getItemCount() { + return mDatas==null?0:mDatas.size(); + } + + public static class CommentViewHolder extends RecyclerView.ViewHolder{ + + TextView tv_nike; + TextView tv_time; + TextView tv_comment; + ImageView iv_avatar; + LinearLayout ll_reply; + TextView tv_more; + + public CommentViewHolder(View itemView) { + super(itemView); + SupportMultiScreenUtil.scale(itemView); + tv_nike = (TextView) itemView.findViewById(R.id.tv_nike); + tv_time = (TextView) itemView.findViewById(R.id.tv_time); + tv_comment = (TextView) itemView.findViewById(R.id.tv_comment); + tv_more = (TextView) itemView.findViewById(R.id.tv_more); + ll_reply = (LinearLayout) itemView.findViewById(R.id.ll_reply); + iv_avatar = (ImageView) itemView.findViewById(R.id.iv_avatar); + } + + } + + public interface OnClickComment{ + void onReplyClick(String flag,CommentViewHolder holder,CommentModel model,int position); + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/CommonFragmentAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/CommonFragmentAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..739012cd27299af18f5050d72a6ea3bd30f50608 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/CommonFragmentAdapter.java @@ -0,0 +1,44 @@ +package com.jiuqi.elove.adapter; + +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentPagerAdapter; +import android.view.View; +import android.view.ViewGroup; + +import java.util.ArrayList; + +/** + * + * Created by liulin on 2016/7/13. + */ +public class CommonFragmentAdapter extends FragmentPagerAdapter{ + + private ArrayList fragmentlist; + + public CommonFragmentAdapter(FragmentManager fm){ + super(fm); + } + + public CommonFragmentAdapter(FragmentManager fm, ArrayList fragments){ + super(fm); + this.fragmentlist = fragments; + } + @Override + public Fragment getItem(int position) { + return fragmentlist.get(position); + } + + @Override + public int getCount() { + return fragmentlist.size(); + } + + /** + * 空实现,防止viewpager中不断的销毁,在原来的设置里面只允许左右两侧隐藏一定数量的fragment + */ + @Override + public void destroyItem(ViewGroup container, int position, Object object) { + + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/CommonPhotoAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/CommonPhotoAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..ba8172d7de987ce63c31329d0e478b915ff79c3c --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/CommonPhotoAdapter.java @@ -0,0 +1,65 @@ +package com.jiuqi.elove.adapter; + +import java.util.List; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; + +import com.jiuqi.elove.entity.ImageViewHolder; + +public abstract class CommonPhotoAdapter extends BaseAdapter +{ + protected LayoutInflater mInflater; + protected Context mContext; + protected List mDatas; + protected final int mItemLayoutId; + + public CommonPhotoAdapter(Context context, List mDatas, int itemLayoutId) + { + this.mContext = context; + this.mInflater = LayoutInflater.from(mContext); + this.mDatas = mDatas; + this.mItemLayoutId = itemLayoutId; + } + + @Override + public int getCount() + { + return mDatas.size(); + } + + @Override + public T getItem(int position) + { + return mDatas.get(position); + } + + @Override + public long getItemId(int position) + { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) + { + final ImageViewHolder imageViewHolder = getViewHolder(position, convertView, + parent); + convert(imageViewHolder, getItem(position)); + return imageViewHolder.getConvertView(); + + } + + public abstract void convert(ImageViewHolder helper, T item); + + private ImageViewHolder getViewHolder(int position, View convertView, + ViewGroup parent) + { + return ImageViewHolder.get(mContext, convertView, parent, mItemLayoutId, + position); + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/ConsumeRedbeanAdapter26.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/ConsumeRedbeanAdapter26.java new file mode 100644 index 0000000000000000000000000000000000000000..825351c99ae4d5e02e687f185c6dd5f6913e0a21 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/ConsumeRedbeanAdapter26.java @@ -0,0 +1,85 @@ +package com.jiuqi.elove.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.TextView; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.entity.ConsumeRedbeanModel; + +import java.util.ArrayList; +import java.util.List; + +/** + * 红豆消费记录 + * Created by dl on 2017/3/21. + */ +public class ConsumeRedbeanAdapter26 extends BaseAdapter{ + + private List mList = new ArrayList<>(); + private LayoutInflater inflater; + private Context context; + + public ConsumeRedbeanAdapter26(Context context){ + this.context = context; + inflater = LayoutInflater.from(context); + } + + /** + * 当listview数据发生变化时,调用此方法来更新listview + */ + public void updateListView(List list){ + this.mList.clear(); + this.mList.addAll(list); + notifyDataSetChanged(); + } + @Override + public int getCount() { + return mList.size(); + } + + @Override + public Object getItem(int position) { + return mList.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + final ViewHolder vh; + if(convertView==null){ + vh = new ViewHolder(); + convertView = inflater.inflate(R.layout.item_redbean_consume,null); + vh.tv_date = (TextView) convertView.findViewById(R.id.tv_date); + vh.tv_handle = (TextView) convertView.findViewById(R.id.tv_handle); + vh.tv_redbean = (TextView) convertView.findViewById(R.id.tv_redbean); + convertView.setTag(vh); + }else{ + vh = (ViewHolder) convertView.getTag(); + } + final ConsumeRedbeanModel model = mList.get(position); + vh.tv_date.setText(model.getCtime()); + vh.tv_handle.setText(model.getType()); + if("消费".equals(model.getType())){ + vh.tv_redbean.setText("-"+model.getRedbean()); + vh.tv_redbean.setTextColor(context.getResources().getColor(R.color.colorPrimary)); + }else{ + vh.tv_redbean.setText("+"+model.getRedbean()); + vh.tv_redbean.setTextColor(context.getResources().getColor(R.color.gray_deep)); + } + return convertView; + } + + class ViewHolder{ + public TextView tv_date; + public TextView tv_handle; + public TextView tv_redbean; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/ContactAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/ContactAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..1d675b7a32d4e38244017ac3159ea299600e8604 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/ContactAdapter.java @@ -0,0 +1,115 @@ +package com.jiuqi.elove.adapter; + +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.graphics.Bitmap; +import android.support.v4.graphics.drawable.RoundedBitmapDrawable; +import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.TextView; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.target.BitmapImageViewTarget; +import com.jiuqi.elove.R; +import com.jiuqi.elove.activity.OtherPersonCenterActivity; +import com.jiuqi.elove.entity.ContactPersonModel; +import com.jiuqi.elove.util.JqStrUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * 我的人脉适配器:好友、粉丝、关注、黑名单 + * Created by dl on 2017/3/1. + */ +public class ContactAdapter extends BaseAdapter { + + private List mList = new ArrayList<>(); + private LayoutInflater mInflater; + private Context mcontext; + private int kind; + private String ifac; + + public ContactAdapter(Context context,List list){ + this.mcontext = context; + this.mList = list; + mInflater = LayoutInflater.from(context); + SharedPreferences sp = mcontext.getSharedPreferences("elove",android.content.Context.MODE_PRIVATE); + kind = sp.getInt("kind",1000); + ifac = sp.getString("ifac",""); + } + + @Override + public int getCount() { + return mList.size(); + } + + @Override + public Object getItem(int position) { + return mList.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View view, ViewGroup viewGroup) { + final ViewHolder vh; + if (view == null) { + view = mInflater.inflate(R.layout.item_contact_child, null); + vh = new ViewHolder(); + vh.imgContactPhoto = (ImageView) view.findViewById(R.id.contact_headphoto); + vh.tvNikeName = (TextView) view.findViewById(R.id.contact_nikename); + vh.tvDescribe = (TextView) view.findViewById(R.id.contact_description); + view.setTag(vh); + } else { + vh = (ViewHolder) view.getTag(); + } + final ContactPersonModel model = mList.get(position); + if(!JqStrUtil.isEmpty(model.getAvatar())){ + Glide.with(mcontext).load(model.getAvatar()).asBitmap().centerCrop().into(new BitmapImageViewTarget(vh.imgContactPhoto) { + @Override + protected void setResource(Bitmap resource) { + RoundedBitmapDrawable circularBitmapDrawable = + RoundedBitmapDrawableFactory.create(mcontext.getResources(), resource); + circularBitmapDrawable.setCircular(true); + vh.imgContactPhoto.setImageDrawable(circularBitmapDrawable); + } + }); + }else{ + Glide.with(mcontext).load(R.drawable.img_recommend_avatar).asBitmap().centerCrop().into(new BitmapImageViewTarget(vh.imgContactPhoto) { + @Override + protected void setResource(Bitmap resource) { + RoundedBitmapDrawable circularBitmapDrawable = + RoundedBitmapDrawableFactory.create(mcontext.getResources(), resource); + circularBitmapDrawable.setCircular(true); + vh.imgContactPhoto.setImageDrawable(circularBitmapDrawable); + } + }); + } + vh.imgContactPhoto.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Intent intent = new Intent(mcontext, OtherPersonCenterActivity.class); + intent.putExtra("otherid",model.getUserID()); + mcontext.startActivity(intent); + } + }); + vh.tvNikeName.setText(model.getNickname()); + vh.tvDescribe.setText(model.getDeclaration()); + return view; + } + + class ViewHolder{ + ImageView imgContactPhoto; + TextView tvNikeName; + TextView tvDescribe; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/ContactPersonAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/ContactPersonAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..4b9a26a2a86d48d11be32ce31ff6e70dffcb1e38 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/ContactPersonAdapter.java @@ -0,0 +1,249 @@ +package com.jiuqi.elove.adapter; + + +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.graphics.Bitmap; +import android.support.v4.graphics.drawable.RoundedBitmapDrawable; +import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseExpandableListAdapter; +import android.widget.CheckBox; +import android.widget.CompoundButton; +import android.widget.ImageView; +import android.widget.TextView; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.target.BitmapImageViewTarget; +import com.jiuqi.elove.R; +import com.jiuqi.elove.activity.OtherPersonCenterActivity; +import com.jiuqi.elove.entity.ContactPersonModel; +import com.jiuqi.elove.util.JqStrUtil; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +/** + * + * Created by liulin on 2016/7/15. + */ +public class ContactPersonAdapter extends BaseExpandableListAdapter{ + + private String[] groups = {"我的关注","我的粉丝","我的好友","黑名单"}; + private List> mList = new ArrayList<>(); + private LayoutInflater mInflater; + private Context mcontext; + private ContactPersonModel model; + /** + * 2.0.2版本加入群聊功能时的选择群组成员 + * 添加群成员时用于是否显示选择按钮以及选择的人 + */ + private String groupName; + private List existMembers; + private List mSelectedPersonName = new LinkedList(); + public List getmSelectedPersonName() { + return mSelectedPersonName; + } + + private SharedPreferences sp; + private int kind; + private String ifac; + + public List getExistMembers() { + return existMembers; + } + + public ContactPersonAdapter(Context context, List> list, String groupName, List existMembers){ + this.mList = list; + this.mcontext = context; + this.groupName = groupName; + this.existMembers = existMembers; + mInflater = LayoutInflater.from(context); + sp = mcontext.getSharedPreferences("elove",mcontext.MODE_PRIVATE); + kind = sp.getInt("kind",1000); + ifac = sp.getString("ifac",""); + } + @Override + public int getGroupCount() { + return groups.length; + } + + @Override + public int getChildrenCount(int i) { + return mList.get(i).size(); + } + + @Override + public Object getGroup(int i) { + return groups[i]; + } + + @Override + public Object getChild(int groupPosition, int childPosition) { + return mList.get(groupPosition).get(childPosition); + } + + @Override + public long getGroupId(int groupPostion) { + return groupPostion; + } + + @Override + public long getChildId(int groupPostion, int childPosition) { + return childPosition; + } + + @Override + public boolean hasStableIds() { + return false; + } + + @Override + public View getGroupView(int groupPosition, boolean isExpanded, View view, ViewGroup viewGroup) { + PviewHolder pviewHolder; + if(view==null){ + view = mInflater.inflate(R.layout.item_contact_parent,null); + pviewHolder = new PviewHolder(); + pviewHolder.tvgroupName = (TextView) view.findViewById(R.id.group_name); + view.setTag(pviewHolder); + }else{ + pviewHolder = (PviewHolder) view.getTag(); + } + if(mList.get(groupPosition)!=null){ + pviewHolder.tvgroupName.setText(groups[groupPosition]+"("+mList.get(groupPosition).size()+")"); + } + return view; + } + + @Override + public View getChildView(int groupPosition,int childPosition, boolean isExpanded, View view, ViewGroup viewGroup) { + final CviewHolder cviewHolder; +// if(view==null){ + view = mInflater.inflate(R.layout.item_contact_child,null); + cviewHolder = new CviewHolder(); + cviewHolder.imgContactPhoto = (ImageView) view.findViewById(R.id.contact_headphoto); + cviewHolder.tvNikeName = (TextView) view.findViewById(R.id.contact_nikename); + cviewHolder.tvDescribe = (TextView) view.findViewById(R.id.contact_description); + cviewHolder.member_select = (CheckBox) view.findViewById(R.id.member_select); + /** + * 2.0.2版本加入群聊功能时的选择群组成员 + */ + if(!JqStrUtil.isEmpty(groupName)){ + cviewHolder.member_select.setVisibility(View.VISIBLE); + } +// view.setTag(cviewHolder); +// }else{ +// cviewHolder = (CviewHolder)view.getTag(); +// } + if(mList.get(groupPosition).size()!=0){ +// model = new ContactPersonModel(); + model = mList.get(groupPosition).get(childPosition); + final String userId = model.getUserID();//很重要,有这个所以头像点击才不错位正常显示 + if(!JqStrUtil.isEmpty(model.getAvatar())){ + Glide.with(mcontext).load(model.getAvatar()).asBitmap().centerCrop().into(new BitmapImageViewTarget(cviewHolder.imgContactPhoto) { + @Override + protected void setResource(Bitmap resource) { + RoundedBitmapDrawable circularBitmapDrawable = + RoundedBitmapDrawableFactory.create(mcontext.getResources(), resource); + circularBitmapDrawable.setCircular(true); + cviewHolder.imgContactPhoto.setImageDrawable(circularBitmapDrawable); + } + }); + }else{//必须写,否则如果出现了没有头像的一项,会复用之前的convertView中的头像 + Glide.with(mcontext).load(R.drawable.img_recommend_avatar).asBitmap().centerCrop().into(new BitmapImageViewTarget(cviewHolder.imgContactPhoto) { + @Override + protected void setResource(Bitmap resource) { + RoundedBitmapDrawable circularBitmapDrawable = + RoundedBitmapDrawableFactory.create(mcontext.getResources(), resource); + circularBitmapDrawable.setCircular(true); + cviewHolder.imgContactPhoto.setImageDrawable(circularBitmapDrawable); + } + }); + } + cviewHolder.imgContactPhoto.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if(kind==0&&"1".equals(ifac)){ + JqStrUtil.showToast(mcontext,mcontext.getString(R.string.view_more_information)); + return; + } + Intent intent = new Intent(mcontext, OtherPersonCenterActivity.class); + intent.putExtra("otherid",userId); + mcontext.startActivity(intent); + } + }); + cviewHolder.tvNikeName.setText(model.getNickname()); + cviewHolder.tvDescribe.setText(model.getDeclaration()); + /** + * 2.0.2版本加入群聊功能时的选择群组成员 + */ + if(!JqStrUtil.isEmpty(groupName)&&existMembers!=null){ + // keep exist members checked + if (existMembers.contains(userId.toLowerCase())||mSelectedPersonName.contains(userId.toLowerCase())) { +// model.setIscheck(true); + cviewHolder.member_select.setChecked(true); + if(!mSelectedPersonName.contains(userId.toLowerCase())){ + mSelectedPersonName.add(userId.toLowerCase()); + } + } else { + cviewHolder.member_select.setChecked(false); + } + cviewHolder.member_select.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) { + // check the exist members + //如果一开始就是存在于群组中的,那么点击状态不再发生变化,用于返回的加入群的成员集合mSelectedPersonName不做任何增加删除 + if (existMembers.contains(userId.toLowerCase())) {// + cviewHolder.member_select.setChecked(true); + }else{ + if (isChecked) { +// isChecked = false; + cviewHolder.member_select.setChecked(true); + if(!mSelectedPersonName.contains(userId.toLowerCase())){ + mSelectedPersonName.add(userId.toLowerCase()); + } +// model.setIscheck(true); +// mList.get(groupPosition).remove(model); +// mList.get(groupPosition).add(childPosition,model); +// notifyDataSetChanged();//通知更改 + }else{ +// isChecked = true; + cviewHolder.member_select.setChecked(false); + if(mSelectedPersonName.contains(userId.toLowerCase())){ + mSelectedPersonName.remove(userId.toLowerCase()); + } +// model.setIscheck(false); +// mList.get(groupPosition).remove(model); +// mList.get(groupPosition).add(childPosition,model); +// notifyDataSetChanged(); + } + } + } + }); + } + return view; + }else{ + return null; + } + } + + @Override + public boolean isChildSelectable(int i, int i1) { + return true; + } + + class PviewHolder{ + TextView tvgroupName; + } + + class CviewHolder{ + ImageView imgContactPhoto; + TextView tvNikeName; + TextView tvDescribe; + CheckBox member_select; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/DepartmentChildAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/DepartmentChildAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..037e2722afbb65108fbe4868f2750f4ab2752fd9 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/DepartmentChildAdapter.java @@ -0,0 +1,43 @@ +package com.jiuqi.elove.adapter; + +import android.content.Context; +import android.content.Intent; +import android.view.View; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.activity.CompanyAuthActivity; +import com.jiuqi.elove.entity.DepartmentModel; +import com.jiuqi.elove.widget.grouplist.base.ViewHolder; +import com.jiuqi.elove.widget.grouplist.item.TreeItem; + +/** + * Created by jq on 2017/12/14. + */ + +public class DepartmentChildAdapter extends TreeItem { + + @Override + protected int initLayoutId() { + return R.layout.item_company_layout; + } + + @Override + public void onBindViewHolder(final ViewHolder holder) { + holder.setText(R.id.tv_company_name,data.getDepartmentName()); + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startNewIntentCompanyAuth(holder.itemView.getContext()); + } + }); + } + + private void startNewIntentCompanyAuth(Context context) { + Intent intent = new Intent(context, CompanyAuthActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + intent.putExtra("name",data.getCompanyName()+"\n"+data.getDepartmentName()); + intent.putExtra("companyId",data.getCompanyId()); + intent.putExtra("departmentId",data.getDepartmentID()); + context.startActivity(intent); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/DepartmentGroupAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/DepartmentGroupAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..546fd0dc33a874e8bfe7f5dd9363b117c7e5a9c2 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/DepartmentGroupAdapter.java @@ -0,0 +1,54 @@ +package com.jiuqi.elove.adapter; + +import android.view.View; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.entity.DepartmentModel; +import com.jiuqi.elove.widget.grouplist.base.ViewHolder; +import com.jiuqi.elove.widget.grouplist.factory.ItemHelperFactory; +import com.jiuqi.elove.widget.grouplist.item.TreeItem; +import com.jiuqi.elove.widget.grouplist.item.TreeItemGroup; + +import java.util.List; + +/** + * Created by jq on 2017/12/14. + */ + +public class DepartmentGroupAdapter extends TreeItemGroup { + + @Override + protected int initLayoutId() { + return R.layout.item_department_title; + } + + @Override + public void onBindViewHolder(final ViewHolder holder) { + holder.setText(R.id.tv_title,data.getDepartmentName()); + holder.setOnClickListener(R.id.ll_title, new View.OnClickListener() { + @Override + public void onClick(View view) { + if(DepartmentGroupAdapter.this.isExpand()){ + holder.setImageResource(R.id.iv_arrow,R.drawable.icon_downarrow); + DepartmentGroupAdapter.this.setExpand(!DepartmentGroupAdapter.this.isExpand()); + }else{ + holder.setImageResource(R.id.iv_arrow,R.drawable.icon_uparrow); + DepartmentGroupAdapter.this.setExpand(!DepartmentGroupAdapter.this.isExpand()); + } + notifyExpand(); + } + }); + } + + @Override + protected List initChildsList(DepartmentModel data) { + String companyId = data.getCompanyId(); + String companyName = data.getCompanyName()+"\n"+data.getDepartmentName(); + List list = data.getChildren(); + for(int i=0;i list = new ArrayList<>(); + private String userid;//当前用户id + private String actid;//当前活动id + + private SharedPreferences sp; + private int kind; + private String ifac; + //对话框 + CustomDialog.Builder builder; + + /** + *设置页码和每一页条数 + */ + private String pageNo = "0"; + private String pageSize = "60"; + + private List dcusList; + private ListViewForScrollView lv_dcus; + private TextView txt_dnum; + + + public DiscussAdapter(Context context,List list,String actid){ + this.context = context; + this.list = list; + inflater = LayoutInflater.from(context); + builder = new CustomDialog.Builder(context); + this.actid = actid; + sp = context.getSharedPreferences("elove",context.MODE_PRIVATE); + kind = sp.getInt("kind",1000); + ifac = sp.getString("ifac",""); + } + @Override + public int getCount() { + Log.d(TAG, "getCount: "+list.size()); + return list.size(); + } + + @Override + public Object getItem(int i) { + return list.get(i); + } + + @Override + public long getItemId(int i) { + return i; + } + + @Override + public View getView(int i, View view, ViewGroup viewGroup) { + final ViewHolder vh; + if(view==null){ + view = inflater.inflate(R.layout.item_discuss,null); + vh = new ViewHolder(); + vh.txt_nickname = (TextView) view.findViewById(R.id.txt_nickname); + vh.txt_time = (TextView) view.findViewById(R.id.txt_time); + vh.txt_words = (TextView) view.findViewById(R.id.txt_words); + vh.img_avatar = (ImageView) view.findViewById(R.id.img_avatar); + vh.responsenikename = (TextView) view.findViewById(R.id.responsenikename); + vh.rsponse = (TextView) view.findViewById(R.id.rsponse); + view.setTag(vh); + }else{ + vh = (ViewHolder) view.getTag(); + } + final DiscussEntity entity = list.get(i); + vh.txt_nickname.setText(entity.getPdnickname()); + vh.txt_time.setText(AbDateUtil.formatDateStr2Desc(entity.getTime(),"yyyy-MM-dd HH:mm","MM-dd HH:mm")); + vh.txt_words.setText(entity.getWords()); + if(JqStrUtil.isEmpty(entity.getRdnickname())){ + vh.responsenikename.setVisibility(View.GONE); + vh.rsponse.setVisibility(View.GONE); + }else{ + vh.responsenikename.setVisibility(View.VISIBLE); + vh.rsponse.setVisibility(View.VISIBLE); + vh.responsenikename.setText(entity.getRdnickname()); + } + EasyGlide.getInstance().showImageCircle(entity.getAvatar(),vh.img_avatar); + //头像点击 + vh.img_avatar.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(!JqStrUtil.isLogin()){ + startLoginPage(); + return; + } + Intent intent = new Intent(context,OtherPersonCenterActivity.class); + intent.putExtra("otherid",entity.getUserid()); + context.startActivity(intent); + } + }); + return view; + } + + private void startLoginPage() { + Intent intent = new Intent(context,LoginActivity.class); + context.startActivity(intent); + } + + class ViewHolder{ + TextView txt_nickname; + TextView txt_time; + TextView txt_words; + ImageView img_avatar; + TextView rsponse; + TextView responsenikename; + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/EnterpriseActAdapter2_0_3.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/EnterpriseActAdapter2_0_3.java new file mode 100644 index 0000000000000000000000000000000000000000..756a00bbff2a8db0817459caca25a5ea9920a702 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/EnterpriseActAdapter2_0_3.java @@ -0,0 +1,151 @@ +package com.jiuqi.elove.adapter; + +import android.content.Context; +import android.content.Intent; +import android.content.res.Resources; +import android.util.DisplayMetrics; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.bumptech.glide.Glide; +import com.jiuqi.elove.R; +import com.jiuqi.elove.activity.EActDetailActivity2_0_3; +import com.jiuqi.elove.entity.EnterpriseActEntity2_0_3; + +import java.util.ArrayList; +import java.util.List; + +/** + * + * Created by FanWenXia on 2016/7/26. + */ +public class EnterpriseActAdapter2_0_3 extends BaseAdapter { + + private List mList = new ArrayList(); + private Context context; + private LayoutInflater mInflater; + private String mflag; + private RelativeLayout.LayoutParams layoutParams; + + public EnterpriseActAdapter2_0_3(Context context,String flag){ + this.context = context; + this.mflag = flag; + mInflater = LayoutInflater.from(context); + layoutParams = getMyLayout(); + } + + public void myEactAdapter(List list){ + this.mList.clear(); + this.mList.addAll(list); + } + + public void updateListView(List list){ + this.mList.clear(); + this.mList.addAll(list); + notifyDataSetChanged(); + } + @Override + public int getCount() { + Log.d("viewview", "getCount: "+mList.size()); + return mList.size(); + } + + @Override + public Object getItem(int position) { + Log.d("viewview", "getItem: "+mList.get(position)); + return mList.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup viewGroup) { + final ViewHolder vh; + if(convertView==null){ + convertView = mInflater.inflate(R.layout.item_eact2_0_3,null); + vh = new ViewHolder(); + vh.iv_poster = (ImageView) convertView.findViewById(R.id.iv_poster); + vh.rlay_blur = (RelativeLayout) convertView.findViewById(R.id.rlay_blur); + vh.tv_title = (TextView) convertView.findViewById(R.id.tv_title); + vh.tv_dayStr1 = (TextView) convertView.findViewById(R.id.tv_dayStr1); + vh.tv_dayStr2 = (TextView) convertView.findViewById(R.id.tv_dayStr2); + vh.tv_dayNum = (TextView) convertView.findViewById(R.id.tv_dayNum); + vh.tv_city = (TextView) convertView.findViewById(R.id.tv_city); + vh.tv_money = (TextView) convertView.findViewById(R.id.tv_money); + convertView.setTag(vh); + }else{ + vh = (ViewHolder)convertView.getTag(); + } + vh.iv_poster.setLayoutParams(layoutParams); + final EnterpriseActEntity2_0_3 model = mList.get(position); + Glide.with(context).load(model.getPoster()).dontAnimate().into(vh.iv_poster); + vh.tv_title.setText(model.getTitle()); + long deadlineTime = model.getDeadline(); + if("past".equals(mflag)){//往期活动 + vh.tv_dayStr1.setText("活动"); + vh.tv_dayNum.setVisibility(View.GONE); + vh.tv_dayStr2.setText("已结束"); + }else if("new".equals(mflag)){//近期活动(报名截止,报名未截止,活动都未结束) + Log.d("time ", ": deadlineTime " + deadlineTime); + long day = (deadlineTime - deadlineTime % 86400000) / 86400000; + if (day==0&&deadlineTime%86400000>0) {//还有不到一天,但是时间还大于0(未到达截止点) + vh.tv_dayStr1.setText("报名"); + vh.tv_dayNum.setVisibility(View.GONE); + vh.tv_dayStr2.setText("即将截止"); + } else if (day >= 1) { + vh.tv_dayStr1.setText("距离报名截止还剩"); + vh.tv_dayNum.setVisibility(View.VISIBLE); + vh.tv_dayNum.setText(String.valueOf(day)); + vh.tv_dayStr2.setText("天"); + } else if (day < 0||deadlineTime<=0) {//恰巧刚截止(剩余时间为0)或者已经截止了很久了(day都小于0了) + vh.tv_dayStr1.setText("报名");//仅仅判断天数小于0是不合理的,因为deadline小于0但是天数可以为0 + vh.tv_dayNum.setVisibility(View.GONE); + vh.tv_dayStr2.setText("已截止"); + } + } + vh.tv_city.setText(model.getCity()); + if("-1".equals(model.getMaxNum())){ + vh.tv_money.setText("人数不限"); + }else{ + vh.tv_money.setText(model.getMaxNum()+"人"); + } + convertView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Intent intent = new Intent(context, EActDetailActivity2_0_3.class); + intent.putExtra("actid",model.getActid()); + context.startActivity(intent); + } + }); + Log.d("viewview", "getView: "+convertView); + return convertView; + } + + class ViewHolder{ + public ImageView iv_poster; + public RelativeLayout rlay_blur; + public TextView tv_title; + public TextView tv_dayStr1; + public TextView tv_dayStr2; + public TextView tv_dayNum; + public TextView tv_city; + public TextView tv_money; + } + + private RelativeLayout.LayoutParams getMyLayout(){ + Resources resources = context.getResources(); + DisplayMetrics dm = resources.getDisplayMetrics(); + int width = dm.widthPixels; + RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(width,width*9/16); + return layoutParams; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/ExchangeCardAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/ExchangeCardAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..350ef7a6a17d535b7e20b7ecadfd3fae43184256 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/ExchangeCardAdapter.java @@ -0,0 +1,154 @@ +package com.jiuqi.elove.adapter; + +import android.content.Context; +import android.content.res.Resources; +import android.util.DisplayMetrics; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.entity.ExchangeCardModel; + +import java.util.ArrayList; +import java.util.List; + +/** + * + * Created by dl on 2017/3/31. + */ +public class ExchangeCardAdapter extends BaseAdapter{ + + private List mList = new ArrayList<>(); + private LayoutInflater inflater; + private Context context; + private LinearLayout.LayoutParams params; + private RelativeLayout.LayoutParams rparams; + + public ExchangeCardAdapter(Context context){ + this.context = context; + inflater = LayoutInflater.from(context); + params = getItemLayout(); + rparams = getItemRLayout(); + } + + /** + * 当listview数据发生变化时,调用此方法来更新listview + */ + public void updateListView(List list){ + this.mList.clear(); + this.mList.addAll(list); + notifyDataSetChanged(); + } + @Override + public int getCount() { + return mList.size(); + } + + @Override + public Object getItem(int position) { + return mList.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + final ViewHolder vh; + if(convertView==null){ + vh = new ViewHolder(); + convertView = inflater.inflate(R.layout.item_exchange_card,null); + vh.rl_card = (RelativeLayout) convertView.findViewById(R.id.rl_card); + vh.rl_money = (RelativeLayout) convertView.findViewById(R.id.rl_money); + vh.ll_card = (LinearLayout) convertView.findViewById(R.id.ll_card); + vh.ll_money = (LinearLayout) convertView.findViewById(R.id.ll_money); + vh.tv_title = (TextView) convertView.findViewById(R.id.tv_title); + vh.tv_time = (TextView) convertView.findViewById(R.id.tv_time); + vh.tv_address = (TextView) convertView.findViewById(R.id.tv_address); + vh.tv_money = (TextView) convertView.findViewById(R.id.tv_money); + vh.tv_time_money = (TextView) convertView.findViewById(R.id.tv_time_money); + vh.iv_timeout = (ImageView) convertView.findViewById(R.id.iv_timeout); + vh.iv_timeout_money = (ImageView) convertView.findViewById(R.id.iv_timeout_money); + vh.iv_used = (ImageView) convertView.findViewById(R.id.iv_used); + vh.iv_used_money = (ImageView) convertView.findViewById(R.id.iv_used_money); + vh.rl_card.setLayoutParams(params); + vh.rl_money.setLayoutParams(params); + vh.ll_money.setLayoutParams(rparams); + vh.ll_card.setLayoutParams(rparams); + convertView.setTag(vh); + }else{ + vh = (ViewHolder) convertView.getTag(); + } + final ExchangeCardModel model = mList.get(position); + if(Constant.CARD_FULL.equals(model.getAction())){ + vh.rl_card.setVisibility(View.VISIBLE); + vh.rl_money.setVisibility(View.GONE); + if(Constant.CARD_TIME_OUT==model.getIfuse()){ + vh.rl_card.setBackgroundResource(R.drawable.card_full_out); + vh.iv_timeout.setVisibility(View.VISIBLE); + vh.iv_used.setVisibility(View.GONE); + }else if(Constant.CARD_USED == model.getIfuse()){ + vh.rl_card.setBackgroundResource(R.drawable.card_full_out); + vh.iv_timeout.setVisibility(View.GONE); + vh.iv_used.setVisibility(View.VISIBLE); + } + vh.tv_title.setText(model.getActtitle()); + vh.tv_time.setText("活动时间:"+model.getActtime()); + vh.tv_address.setText("活动地点:"+model.getActaddress()); + }else{ + vh.rl_card.setVisibility(View.GONE); + vh.rl_money.setVisibility(View.VISIBLE); + if(Constant.CARD_TIME_OUT==model.getIfuse()){ + vh.rl_money.setBackgroundResource(R.drawable.card_money_out); + vh.iv_timeout_money.setVisibility(View.VISIBLE); + vh.iv_used_money.setVisibility(View.GONE); + }else if(Constant.CARD_USED == model.getIfuse()){ + vh.rl_card.setBackgroundResource(R.drawable.card_full_out); + vh.iv_timeout.setVisibility(View.GONE); + vh.iv_used_money.setVisibility(View.VISIBLE); + } + vh.tv_money.setText(model.getMoney()); + vh.tv_time_money.setText("有效期:"+model.getTickettime()); + } + return convertView; + } + + class ViewHolder{ + public RelativeLayout rl_card; + public RelativeLayout rl_money; + public LinearLayout ll_card; + public LinearLayout ll_money; + public TextView tv_title; + public TextView tv_time; + public TextView tv_address; + public TextView tv_money; + public TextView tv_time_money; + public ImageView iv_timeout; + public ImageView iv_timeout_money; + public ImageView iv_used; + public ImageView iv_used_money; + } + + private LinearLayout.LayoutParams getItemLayout(){ + Resources resources = context.getResources(); + DisplayMetrics dm = resources.getDisplayMetrics(); + int width = dm.widthPixels; + return new LinearLayout.LayoutParams(width,width*9/23); + } + + private RelativeLayout.LayoutParams getItemRLayout(){ + Resources resources = context.getResources(); + DisplayMetrics dm = resources.getDisplayMetrics(); + int width = dm.widthPixels; + return new RelativeLayout.LayoutParams(width,width*9/23); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/FellForAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/FellForAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..48c237578d149809135b71705fd25cdfd904ee98 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/FellForAdapter.java @@ -0,0 +1,277 @@ +package com.jiuqi.elove.adapter; + +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.SharedPreferences; +import android.graphics.Bitmap; +import android.support.v4.graphics.drawable.RoundedBitmapDrawable; +import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.alibaba.fastjson.JSONObject; +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.target.BitmapImageViewTarget; +import com.hyphenate.easeui.EaseConstant; +import com.jiuqi.elove.R; +import com.jiuqi.elove.activity.ChatActivity; +import com.jiuqi.elove.common.CommonDataUtil; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.entity.FellForUserInfoModel; +import com.jiuqi.elove.fragment.ContactPersonFragment; +import com.jiuqi.elove.util.EasyGlide; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.widget.dialog.CustomDialog; + + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 倾心adapter,后被用作附近人的adapter + * Created by dl on 2016/7/8. + */ +public class FellForAdapter extends BaseAdapter { + + private static final String TAG = "FellForAdapter"; + + private List mList = new ArrayList(); + private LayoutInflater inflater; + private Context context; + private String ageHeightDegree; + private final OkHttpUtil okHttpUtil = OkHttpUtil.getInstance(); + private int kind; + private String ifac; + + public FellForAdapter(Context context){ + this.context = context; + inflater = LayoutInflater.from(context); + SharedPreferences sp = context.getSharedPreferences("elove",context.MODE_PRIVATE); + kind = sp.getInt("kind",1000); + ifac = sp.getString("ifac",""); + } + + public void setMsgAdapter(List list){ + this.mList.clear(); + this.mList.addAll(list); + } + + /** + * 当listview数据发生变化时,调用此方法来更新listview + */ + public void updateListView(List list){ + this.mList.clear(); + this.mList.addAll(list); + notifyDataSetChanged(); + } + @Override + public int getCount() { + return mList.size(); + } + + @Override + public Object getItem(int position) { + return mList.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(final int position, View convertView, ViewGroup parent) { + + final ViewHolder vh; + if(convertView==null){ + vh = new ViewHolder(); + convertView = inflater.inflate(R.layout.item_facelove_layout,null); + vh.headPhoto = (ImageView) convertView.findViewById(R.id.img_avatar); + vh.nikeName = (TextView) convertView.findViewById(R.id.txt_nickname); + vh.album_num = (TextView) convertView.findViewById(R.id.album_num); + vh.age_height_degree = (TextView) convertView.findViewById(R.id.age_height_degree); + vh.txt_address = (TextView) convertView.findViewById(R.id.txt_address); + vh.leaveMsg = (TextView) convertView.findViewById(R.id.txt_focus); + vh.rlay_focus = (RelativeLayout) convertView.findViewById(R.id.rlay_focus); + vh.rlay_talk = (RelativeLayout) convertView.findViewById(R.id.rlay_talk); + vh.img_focus = (ImageView) convertView.findViewById(R.id.img_focus); + android.view.ViewGroup.LayoutParams params = vh.headPhoto.getLayoutParams(); + params.width = parent.getWidth()/4; + params.height = parent.getWidth()/4; + convertView.setTag(vh); + }else{ + vh = (ViewHolder) convertView.getTag(); + } + final FellForUserInfoModel model = mList.get(position); + vh.nikeName.setText(model.getNickname()); + vh.album_num.setText(model.getDistance()); + String age = model.getAge(); + String height = model.getHeight(); + String degree = model.getDegree(); + if(!JqStrUtil.isEmpty(age)){ + if(!JqStrUtil.isEmpty(height)){ + if(!JqStrUtil.isEmpty(degree)&&!"0".equals(degree)){ + ageHeightDegree = age+"岁/"+height+"cm/"+ CommonDataUtil.degreeMap.get(degree); + }else{ + ageHeightDegree = age+"岁/"+height+"cm"; + } + }else{ + if(!JqStrUtil.isEmpty(degree)&&!"0".equals(degree)){ + ageHeightDegree = age+"岁/"+CommonDataUtil.degreeMap.get(degree); + }else{ + ageHeightDegree = age+"岁"; + } + } + }else { + if(!JqStrUtil.isEmpty(height)){ + if(!JqStrUtil.isEmpty(degree)){ + ageHeightDegree = height+"cm/"+CommonDataUtil.degreeMap.get(degree); + }else{ + ageHeightDegree = height+"cm"; + } + }else{ + if(!JqStrUtil.isEmpty(degree)){ + ageHeightDegree = CommonDataUtil.degreeMap.get(degree); + }else{ + ageHeightDegree = ""; + } + } + } + vh.age_height_degree.setText(ageHeightDegree); + if(JqStrUtil.isEmpty(model.getLocalplace())){ + vh.txt_address.setVisibility(View.GONE); + }else{ + vh.txt_address.setText(model.getLocalplace()); + } + EasyGlide.getInstance().showImageCircle(model.getAvatar(),vh.headPhoto); + //加关注 + final String isLike = model.getIfattention(); + if("0".equals(isLike)){ + vh.img_focus.setImageResource(R.drawable.icon_focus_gray); + }else{ + vh.img_focus.setImageResource(R.drawable.icon_focus_pink); + } + vh.rlay_focus.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Log.d(TAG, "onClick: islike"+isLike); + if("0".equals(isLike)){ + addFocus(model,vh,Constant.ACTION_ADDFOCUS,position); + }else{ + showSureDialog(model,vh,Constant.ACTION_ADDFOCUS,position); + } + } + }); + //打招呼 + vh.rlay_talk.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { +// if(kind==0&&"1".equals(ifac)){ +// JqStrUtil.showToast(context,context.getString(R.string.talk_to_others)); +// return; +// } + startChatActivity(model); + + } + }); + return convertView; + } + + /** + * 进入聊天页面 + * @param model 聊天对象实体 + */ + private void startChatActivity(FellForUserInfoModel model) { + Intent intent = new Intent(context, ChatActivity.class); + intent.putExtra("chatType", EaseConstant.CHATTYPE_SINGLE);//2.0.2版本加群聊之后做区分 + intent.putExtra("userId",model.getUserID().toLowerCase()); + intent.putExtra("nikeName",model.getNickname()); + intent.putExtra("avatar",model.getAvatar()); + context.startActivity(intent); + } + + /** + * 添加关注或者取消关注 + * @param model 附近人列表 + * @param vh 一个item的示例 + * @param action 判断是关注还是取消 + * @param position 更改位置 + */ + private void addFocus(final FellForUserInfoModel model, final ViewHolder vh,final String action,final int position) { + String focusUrl = Constant.COMMON_URL + Interface.ADD_FOCUS; + SharedPreferences sp = context.getSharedPreferences("elove",context.getApplicationContext().MODE_PRIVATE); + String userId = sp.getString("userid",""); + String otherId = model.getUserID(); + JSONObject obj = new JSONObject(); + obj.put("otherID",otherId); + obj.put("userID",userId); + obj.put("action",action); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + Log.d(TAG, "add: param"+param); + okHttpUtil.sendJsonStrByPostAsync(context,true,focusUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + Log.d(TAG, "onResponse: retcode"+rsCode); + String explanation = jsonObject.getString("explanation"); + if("1".equals(rsCode)) { + String isLike = ""; + if ("1".equals(action)) { + isLike = "1"; + vh.img_focus.setImageResource(R.drawable.icon_focus_pink); + } else if ("2".equals(action)) { + vh.img_focus.setImageResource(R.drawable.icon_focus_gray); + isLike = "0"; + } + model.setIfattention(isLike); + mList.remove(position); + mList.add(position,model);//更新list中的model,否则获取数据时是已经从服务器中得到的旧list,点赞数据导致不一致 + notifyDataSetChanged();//通知更新,否则不好用 + JqStrUtil.showToast(context,explanation); + } + } + },null); + } + + private void showSureDialog(final FellForUserInfoModel model, final ViewHolder vh,final String action,final int position) { + CustomDialog.Builder builder = new CustomDialog.Builder(context); + builder.setTitle(""); + builder.setMessage("确定要取消关注吗?"); + builder.setPositiveButton(R.string.confirm,new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + addFocus(model,vh,Constant.ACTION_UNFOCUS,position); + dialog.dismiss(); + } + }); + builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }); + builder.create().show(); + } + class ViewHolder{ + public ImageView headPhoto; + public TextView nikeName; + public TextView album_num; + public TextView age_height_degree; + public TextView txt_address; + public TextView leaveMsg; + public RelativeLayout rlay_focus; + public RelativeLayout rlay_talk; + public ImageView img_focus; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/FindContactAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/FindContactAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..c6f4e9c14b019cc36a68df982dbb27682bd9e731 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/FindContactAdapter.java @@ -0,0 +1,120 @@ +package com.jiuqi.elove.adapter; + +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.graphics.Bitmap; +import android.support.v4.graphics.drawable.RoundedBitmapDrawable; +import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.target.BitmapImageViewTarget; +import com.jiuqi.elove.R; +import com.jiuqi.elove.activity.LoginActivity; +import com.jiuqi.elove.activity.OtherPersonCenterActivity; +import com.jiuqi.elove.common.CommonDataUtil; +import com.jiuqi.elove.entity.FindContactPersonModel; +import com.jiuqi.elove.util.EasyGlide; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.StrUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * + * Created by dl on 2016/7/25. + */ +public class FindContactAdapter extends BaseAdapter{ + + private List mlist = new ArrayList<>(); + private LayoutInflater mLayoutInflater; + private Context mContext; + + public FindContactAdapter(Context context){ + this.mContext = context; + mLayoutInflater = LayoutInflater.from(mContext); + } + + public FindContactAdapter(Context context,List list){ + this.mContext = context; + this.mlist = list; + mLayoutInflater = LayoutInflater.from(mContext); + } + + public void updateListView(List list){ + this.mlist.clear(); + this.mlist.addAll(list); + notifyDataSetChanged(); + } + + @Override + public int getCount() { + return mlist.size(); + } + + @Override + public Object getItem(int i) { + return mlist.get(i); + } + + @Override + public long getItemId(int i) { + return i; + } + + @Override + public View getView(int i, View view, ViewGroup viewGroup) { + final ViewHolder vh; + if(view==null){ + view = mLayoutInflater.inflate(R.layout.item_findcontact_layout,null); + vh = new ViewHolder(); + vh.img_avatar = (ImageView) view.findViewById(R.id.img_avatar); + vh.txt_nickname = (TextView) view.findViewById(R.id.txt_nickname); + vh.age_xingzuo_degree = (TextView) view.findViewById(R.id.age_xingzuo_degree); + vh.txt_address = (TextView) view.findViewById(R.id.txt_address); + view.setTag(vh); + }else{ + vh = (ViewHolder) view.getTag(); + } + final FindContactPersonModel model = mlist.get(i); + EasyGlide.getInstance().showImageCircle(model.getAvatar(),vh.img_avatar); + vh.txt_nickname.setText(model.getNickname()); + vh.txt_address.setText(StrUtil.returnStr(model.getLocalplace())); + vh.age_xingzuo_degree.setText(StrUtil.returnLinkStr("/",StrUtil.returnEmptyOrUnit(String.valueOf(model.getAge()),"岁"), + StrUtil.returnStr(model.getConstellation()), + StrUtil.returnStr(CommonDataUtil.degreeMap.get(model.getDegree())))); + view.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if(!JqStrUtil.isLogin()){ + startLoginPage(); + return; + } + Intent intent = new Intent(mContext, OtherPersonCenterActivity.class); + intent.putExtra("otherid",model.getUserID()); + mContext.startActivity(intent); + } + }); + return view; + } + + private void startLoginPage() { + Intent intent = new Intent(mContext,LoginActivity.class); + mContext.startActivity(intent); + } + + class ViewHolder{ + public ImageView img_avatar; + public TextView txt_nickname; + public TextView age_xingzuo_degree; + public TextView txt_address; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/FirstClassCommentAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/FirstClassCommentAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..10d2fd9ed719b2ab7f868225a26f94f8a697da61 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/FirstClassCommentAdapter.java @@ -0,0 +1,184 @@ +package com.jiuqi.elove.adapter; + +import android.content.Context; +import android.support.v7.widget.RecyclerView; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.entity.CircleCommentModel; +import com.jiuqi.elove.util.EasyGlide; +import com.jiuqi.elove.util.SupportMultiScreenUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by jq on 2018/1/4. + */ + +public class FirstClassCommentAdapter extends RecyclerView.Adapter{ + + private List mList; + private Context context; + private LayoutInflater layoutInflater; + private View mHeaderView; + + private OnItemClickListener mOnItemClickListener; + + private static final int FIRST_TYPE = 0;//header + private static final int THRID_TYPE = 2;//常规评论 + + public FirstClassCommentAdapter(Context context){ + this.context = context; + layoutInflater = LayoutInflater.from(context); + mList = new ArrayList<>(); + } + + public void updateRecylerView(List list){ + mList.clear(); + mList.addAll(list); + notifyDataSetChanged(); + } + + public void setHeaderView(View header){ + mHeaderView = header; + notifyItemInserted(0); + } + + public void setOnItemClickListener(OnItemClickListener mOnItemClickListener){ + this.mOnItemClickListener = mOnItemClickListener; + } + + @Override + public int getItemViewType(int position) { + if(mHeaderView==null) + return THRID_TYPE; + if(position==0) + return FIRST_TYPE; + return THRID_TYPE; + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + if(viewType==FIRST_TYPE){ + return new CircleDetailViewHolder(mHeaderView); + }else{ + View view = layoutInflater.inflate(R.layout.item_circle_comment_layout,parent,false); + SupportMultiScreenUtil.scale(view); + return new CommentViewHolder(view); + } + } + + @Override + public int getItemCount() { + return mHeaderView==null?mList.size():mList.size()+1; + } + + @Override + public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { + if(getItemViewType(position)==FIRST_TYPE) + return; + handleCircleContent(holder,position); + } + + public int getRealPosition(RecyclerView.ViewHolder holder) { + int position = holder.getLayoutPosition(); + return mHeaderView == null ? position : position - 1; + } + + /** + * ui&&事件 处理整个item的内容 + */ + private void handleCircleContent(RecyclerView.ViewHolder holder, int position) { + if(mHeaderView!=null&&position>0){ + position = position - 1; + } + CircleCommentModel model = mList.get(position); + handleContent((CommentViewHolder)holder,model,position); + } + + /** + * 设置内容以及点击事件==跳转到评论详情中 + */ + private void handleContent(final CommentViewHolder holder, final CircleCommentModel model, final int position) { + EasyGlide.getInstance().showImage(true,model.getUserAvatar(),holder.iv_avatar,R.drawable.img_hx_avatar); + holder.tv_nike.setText(model.getUserName()); + holder.tv_time.setText(model.getTime()); + holder.tv_comment.setText(model.getComment()); + if(TextUtils.isEmpty(model.getChildCount())||"0".equals(model.getChildCount())){ + holder.tv_more.setVisibility(View.GONE); + }else{ + holder.tv_more.setVisibility(View.VISIBLE); + holder.tv_more.setText("查看全部"+model.getChildCount()+"条评论>"); + holder.tv_more.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(mOnItemClickListener!=null){ + mOnItemClickListener.toCommentDetailPage(model,position); + } + } + }); + } + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(mOnItemClickListener!=null){ + mOnItemClickListener.toCommentDetailPage(model,position); + } + } + }); + holder.iv_handle.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(mOnItemClickListener!=null){ + mOnItemClickListener.showMore(holder,model,position); + } + } + }); + } + + + /** + * header的容器 + */ + public static class CircleDetailViewHolder extends RecyclerView.ViewHolder{ + + public CircleDetailViewHolder(View itemView) { + super(itemView); + } + } + + /** + * 缘圈列表的item容器 + */ + public static class CommentViewHolder extends RecyclerView.ViewHolder{ + + TextView tv_nike;//用户昵称 + TextView tv_comment;//用户发表内容 + TextView tv_time;//发表时间 + TextView tv_more;//评论数 + ImageView iv_avatar;//用户头像 + public ImageView iv_handle; + + public CommentViewHolder(View itemView) { + super(itemView); + tv_nike = (TextView) itemView.findViewById(R.id.tv_nike); + tv_comment = (TextView) itemView.findViewById(R.id.tv_comment); + tv_more = (TextView) itemView.findViewById(R.id.tv_more); + tv_time = (TextView) itemView.findViewById(R.id.tv_time); + iv_avatar = (ImageView) itemView.findViewById(R.id.iv_avatar); + iv_handle = (ImageView) itemView.findViewById(R.id.iv_handle); + } + } + + public interface OnItemClickListener{ + void toCommentDetailPage(CircleCommentModel model,int position); + + void showMore(CommentViewHolder holder, CircleCommentModel model, int position); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/GiftAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/GiftAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..bb59d2cb768edba71c6de841f853ed9277a5a475 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/GiftAdapter.java @@ -0,0 +1,120 @@ +package com.jiuqi.elove.adapter; + +import android.content.Context; +import android.content.res.Resources; +import android.support.v7.widget.RecyclerView; +import android.util.DisplayMetrics; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.bumptech.glide.Glide; +import com.jiuqi.elove.R; +import com.jiuqi.elove.entity.GiftModel; +import com.jiuqi.elove.entity.RechargeModel; +import com.jiuqi.elove.util.CommonUtil; + +import java.util.List; + +/** + * 礼物展示面板的适配器 + * Created by dl on 2017/3/22. + */ +public class GiftAdapter extends RecyclerView.Adapter{ + + private List mList; + private Context mContext; + private LayoutInflater mInflater; + + private OnRecyclerViewItemClickListener mOnItemClickListener; + + public GiftAdapter(Context context,List list){ + this.mContext = context; + this.mInflater = LayoutInflater.from(context); + this.mList = list; + } + + //define interface + public interface OnRecyclerViewItemClickListener { + void onItemClick(GiftModel model, int position); + } + + public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) { + this.mOnItemClickListener = listener; + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = mInflater.inflate(R.layout.item_gift,null,false); + view.setLayoutParams(getItemViewLayout()); + MyHolder myHolder = new MyHolder(view); + return myHolder; + } + + @Override + public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) { + final GiftModel model = mList.get(position); + ((MyHolder) holder).tv_gift.setText("["+model.getName_real()+"]"); + ((MyHolder) holder).tv_price.setText(String.valueOf(model.getRedbean())+"元宝"); + CommonUtil.setGiftDrawable(mContext,model.getName(),((MyHolder) holder).iv_gift); +// Glide.with(mContext).load(model.getPic()).error(R.drawable.img_other_default).into(((MyHolder) holder).iv_gift); + ((MyHolder) holder).ll_all.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (mOnItemClickListener != null) { + int layoutPosition = holder.getLayoutPosition(); + mOnItemClickListener.onItemClick(model, layoutPosition); + } + } + }); + } + + @Override + public int getItemCount() { + return mList.size(); + } + + @Override + public int getItemViewType(int position) { + return super.getItemViewType(position); + } + + public class MyHolder extends RecyclerView.ViewHolder{ + + public LinearLayout ll_all; + public ImageView iv_gift; + public TextView tv_price; + public TextView tv_gift; + + public MyHolder(View itemView) { + super(itemView); + iv_gift = (ImageView) itemView.findViewById(R.id.iv_gift); + tv_price = (TextView) itemView.findViewById(R.id.tv_price); + tv_gift = (TextView) itemView.findViewById(R.id.tv_gift); + ll_all = (LinearLayout) itemView.findViewById(R.id.ll_all); + iv_gift.setLayoutParams(getItemLayout()); + } + } + + private RelativeLayout.LayoutParams getItemLayout(){ + Resources resources = mContext.getResources(); + DisplayMetrics dm = resources.getDisplayMetrics(); + int width = dm.widthPixels - 100; + return new RelativeLayout.LayoutParams(width/5,width/5); + } + + private LinearLayout.LayoutParams getItemViewLayout(){ + Resources resources = mContext.getResources(); + DisplayMetrics dm = resources.getDisplayMetrics(); + int width = dm.widthPixels; + LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(width/5, ViewGroup.LayoutParams.WRAP_CONTENT); + param.setMargins(0,10,0,10); + return param; + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/GiftDetailAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/GiftDetailAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..8c9dec1a000e99aa489646a4247582967b7050a2 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/GiftDetailAdapter.java @@ -0,0 +1,91 @@ +package com.jiuqi.elove.adapter; + +import android.content.Context; +import android.graphics.Bitmap; +import android.support.v4.graphics.drawable.RoundedBitmapDrawable; +import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.TextView; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.target.BitmapImageViewTarget; +import com.jiuqi.elove.R; +import com.jiuqi.elove.entity.GiftModel; +import com.jiuqi.elove.util.AbDateUtil; +import com.jiuqi.elove.util.EasyGlide; + +import java.util.ArrayList; +import java.util.List; + +/** + * 礼物详情列表 + * Created by dl on 2017/3/29. + */ +public class GiftDetailAdapter extends BaseAdapter{ + + private List mList = new ArrayList<>(); + private LayoutInflater inflater; + private Context context; + + public GiftDetailAdapter(Context context){ + this.context = context; + inflater = LayoutInflater.from(context); + } + + public void setMsgAdapter(List list){ + this.mList.clear(); + this.mList.addAll(list); + } + + /** + * 当listview数据发生变化时,调用此方法来更新listview + */ + public void updateListView(List list){ + this.mList.clear(); + this.mList.addAll(list); + notifyDataSetChanged(); + } + @Override + public int getCount() { + return mList.size(); + } + + @Override + public Object getItem(int position) { + return mList.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + final ViewHolder vh; + if(convertView==null){ + vh = new ViewHolder(); + convertView = inflater.inflate(R.layout.item_likeuser,null); + vh.img_avatar = (ImageView) convertView.findViewById(R.id.img_avatar); + vh.txt_nickname = (TextView) convertView.findViewById(R.id.txt_nickname); + vh.txt_time = (TextView) convertView.findViewById(R.id.txt_time); + convertView.setTag(vh); + }else{ + vh = (ViewHolder) convertView.getTag(); + } + final GiftModel model = mList.get(position); + vh.txt_nickname.setText(model.getNickname()); + vh.txt_time.setText(AbDateUtil.formatDateStr2Desc(model.getTime(),"yyyy-MM-dd HH:mm","MM-dd HH:mm")); + EasyGlide.getInstance().showImageCircle(model.getAvatar(),vh.img_avatar); + return convertView; + } + class ViewHolder{ + public ImageView img_avatar; + public TextView txt_nickname; + public TextView txt_time; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/HorizontalGiftAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/HorizontalGiftAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..a9472e9b45868def8b110567d4d1f6c9efab9842 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/HorizontalGiftAdapter.java @@ -0,0 +1,111 @@ +package com.jiuqi.elove.adapter; + +import android.content.Context; +import android.content.res.Resources; +import android.support.v7.widget.RecyclerView; +import android.util.DisplayMetrics; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.bumptech.glide.Glide; +import com.jiuqi.elove.R; +import com.jiuqi.elove.entity.GiftModel; +import com.jiuqi.elove.util.CommonUtil; + +import java.util.List; + +/** + * 收到的礼物 + * Created by dl on 2017/3/31. + */ +public class HorizontalGiftAdapter extends RecyclerView.Adapter implements View.OnClickListener { + + private List mList; + private List allList; + private Context mContext; + private LayoutInflater mInflater; + private RelativeLayout.LayoutParams layoutParams; + + + private OnRecyclerViewItemClickListener mOnItemClickListener; + + public HorizontalGiftAdapter(Context context,List list,List alllist){ + this.mContext = context; + this.mInflater = LayoutInflater.from(context); + this.mList = list; + this.allList = alllist; + layoutParams = getMyLayout(); + } + + //define interface + public interface OnRecyclerViewItemClickListener { + void onItemClick(View view, int position); + } + + @Override + public void onClick(View v) { + if (mOnItemClickListener != null) { + //注意这里使用getTag方法获取数据 + mOnItemClickListener.onItemClick(v,(int)v.getTag()); + } + } + + public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) { + this.mOnItemClickListener = listener; + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = mInflater.inflate(R.layout.item_gift_receive,parent,false); + TextViewHolder textViewHolder = new TextViewHolder(view); + view.setOnClickListener(this); + return textViewHolder; + } + + @Override + public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) { + GiftModel model = mList.get(position); + CommonUtil.setGiftDrawable(mContext,model.getName(),((TextViewHolder)holder).iv_gift); + String name = ""; + for(GiftModel gift : allList){ + if(model.getName().equals(gift.getName())){ + name = gift.getName_real(); + } + } + ((TextViewHolder) holder).tv_mounts.setText("["+name+"]"+"*"+model.getNum()); + } + + @Override + public int getItemCount() { + return mList.size(); + } + + @Override + public int getItemViewType(int position) { + return super.getItemViewType(position); + } + + public class TextViewHolder extends RecyclerView.ViewHolder{ + + ImageView iv_gift; + TextView tv_mounts; + public TextViewHolder(View itemView) { + super(itemView); + iv_gift = (ImageView) itemView.findViewById(R.id.iv_gift); + tv_mounts = (TextView) itemView.findViewById(R.id.tv_mounts); + iv_gift.setLayoutParams(layoutParams); + } + } + + private RelativeLayout.LayoutParams getMyLayout(){ + Resources resources = mContext.getResources(); + DisplayMetrics dm = resources.getDisplayMetrics(); + int width = dm.widthPixels - CommonUtil.dip2px(mContext,40); + RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(width/6,width/6); + return layoutParams; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/HorizontalListViewAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/HorizontalListViewAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..7365c3a84822c4001565e43367a1d3f9a396e351 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/HorizontalListViewAdapter.java @@ -0,0 +1,85 @@ +package com.jiuqi.elove.adapter; + +import android.content.Context; +import android.content.res.Resources; +import android.util.DisplayMetrics; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; + +import com.bumptech.glide.Glide; +import com.jiuqi.elove.R; +import com.jiuqi.elove.entity.OtherInfoCenterModel; +import com.jiuqi.elove.util.CommonUtil; +import com.jiuqi.elove.util.EasyGlide; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.SupportMultiScreenUtil; + +import java.util.List; + +/** + * + * Created by dl on 2016/8/10. + */ +public class HorizontalListViewAdapter extends BaseAdapter{ + + private List mIconIDs; + private Context mContext; + private LayoutInflater mInflater; + private LinearLayout.LayoutParams layoutParams; + + private int selectIndex = -1; + + public HorizontalListViewAdapter(Context context,List ids){ + this.mContext = context; + this.mIconIDs = ids; + mInflater=(LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);//LayoutInflater.from(mContext); + layoutParams = getMyLayout(); + } + @Override + public int getCount() { + return mIconIDs.size(); + } + @Override + public Object getItem(int position) { + return position; + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + + ViewHolder holder; + if(convertView==null){ + holder = new ViewHolder(); + convertView = mInflater.inflate(R.layout.item_horizontal_list_layout, null); + SupportMultiScreenUtil.scale(convertView); + holder.mImage=(ImageView)convertView.findViewById(R.id.img_list_item); + convertView.setTag(holder); + }else{ + holder=(ViewHolder)convertView.getTag(); + } + holder.mImage.setLayoutParams(layoutParams); + EasyGlide.getInstance().showImage(true,mIconIDs.get(position).getPicUrlcut(),holder.mImage,R.drawable.img_hx_avatar); + return convertView; + } + + private static class ViewHolder { + private ImageView mImage; + } + + private LinearLayout.LayoutParams getMyLayout(){ + Resources resources = mContext.getResources(); + DisplayMetrics dm = resources.getDisplayMetrics(); + int width = dm.widthPixels - 160; + return new LinearLayout.LayoutParams(width/4,width/4); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/HorizontalListViewAvatarAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/HorizontalListViewAvatarAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..6f8f4f13d61dc7c104f1e4ff1644e40f84c96845 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/HorizontalListViewAvatarAdapter.java @@ -0,0 +1,105 @@ +package com.jiuqi.elove.adapter; + +import android.content.Context; +import android.content.res.Resources; +import android.util.DisplayMetrics; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.bumptech.glide.Glide; +import com.jiuqi.elove.R; +import com.jiuqi.elove.entity.OtherInfoCenterModel; +import com.jiuqi.elove.util.CommonUtil; + +import java.util.List; + +/** + * Created by jq on 2017/3/13. + */ +public class HorizontalListViewAvatarAdapter extends BaseAdapter { + + private int[] mIconIDs; + private String[] types; + private Context mContext; + private LayoutInflater mInflater; + private RelativeLayout.LayoutParams layoutParams; + private RelativeLayout.LayoutParams textlayoutParams; + + private int selectIndex = -1; + + public HorizontalListViewAvatarAdapter(Context context,int[] ids,String[] type){ + this.mContext = context; + this.mIconIDs = ids; + this.types = type; + mInflater=(LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);//LayoutInflater.from(mContext); + layoutParams = getMyLayout(); + textlayoutParams = getMyTextLayout(); + } + @Override + public int getCount() { + return mIconIDs.length; + } + @Override + public Object getItem(int position) { + return position; + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + + ViewHolder holder; + if(convertView==null){ + holder = new ViewHolder(); + convertView = mInflater.inflate(R.layout.item_horizontal_avatar_layout, null); + holder.mImage=(ImageView)convertView.findViewById(R.id.img_list_item); + holder.tv_avatar=(TextView) convertView.findViewById(R.id.tv_avatar); + holder.mImage.setLayoutParams(layoutParams); + holder.tv_avatar.setPadding(0,5,0,5); + holder.tv_avatar.setLayoutParams(textlayoutParams); + convertView.setTag(holder); + }else{ + holder=(ViewHolder)convertView.getTag(); + } + Glide.with(mContext).load(mIconIDs[position]).placeholder(R.drawable.img_hx_avatar).dontAnimate().into(holder.mImage); + holder.tv_avatar.setText(types[position]); + return convertView; + } + + private static class ViewHolder { + private ImageView mImage; + private TextView tv_avatar; + } + + public void setSelectIndex(int i){ + selectIndex = i; + } + + private RelativeLayout.LayoutParams getMyLayout(){ + Resources resources = mContext.getResources(); + DisplayMetrics dm = resources.getDisplayMetrics(); +// int width = dm.widthPixels - CommonUtil.dip2px(mContext,24); + int width = dm.widthPixels - CommonUtil.dip2px(mContext,14); + RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(width/6,width/6); + return layoutParams; + } + private RelativeLayout.LayoutParams getMyTextLayout(){ + Resources resources = mContext.getResources(); + DisplayMetrics dm = resources.getDisplayMetrics(); +// int width = dm.widthPixels - CommonUtil.dip2px(mContext,24); + int width = dm.widthPixels - CommonUtil.dip2px(mContext,14); + RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(width/6, RelativeLayout.LayoutParams.WRAP_CONTENT); + layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); + return layoutParams; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/LikeUserAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/LikeUserAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..f8d3f80207b3ecbf3a64716fa0877da17c705fbc --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/LikeUserAdapter.java @@ -0,0 +1,92 @@ +package com.jiuqi.elove.adapter; + +import android.content.Context; +import android.content.Intent; +import android.graphics.Bitmap; +import android.support.v4.graphics.drawable.RoundedBitmapDrawable; +import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.TextView; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.target.BitmapImageViewTarget; +import com.jiuqi.elove.R; +import com.jiuqi.elove.entity.LikeUserEntity; +import com.jiuqi.elove.util.AbDateUtil; +import com.jiuqi.elove.util.EasyGlide; + +import java.util.ArrayList; +import java.util.List; + +/** + * + * Created by FanWenXia on 2016/7/8. + */ +public class LikeUserAdapter extends BaseAdapter { + + private List mList = new ArrayList(); + private LayoutInflater inflater; + private Context context; + + public LikeUserAdapter(Context context){ + this.context = context; + inflater = LayoutInflater.from(context); + } + + public void setMsgAdapter(List list){ + this.mList.clear(); + this.mList.addAll(list); + } + + /** + * 当listview数据发生变化时,调用此方法来更新listview + */ + public void updateListView(List list){ + this.mList.clear(); + this.mList.addAll(list); + notifyDataSetChanged(); + } + @Override + public int getCount() { + return mList.size(); + } + + @Override + public Object getItem(int position) { + return mList.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + final ViewHolder vh; + if(convertView==null){ + vh = new ViewHolder(); + convertView = inflater.inflate(R.layout.item_likeuser,null); + vh.img_avatar = (ImageView) convertView.findViewById(R.id.img_avatar); + vh.txt_nickname = (TextView) convertView.findViewById(R.id.txt_nickname); + vh.txt_time = (TextView) convertView.findViewById(R.id.txt_time); + convertView.setTag(vh); + }else{ + vh = (ViewHolder) convertView.getTag(); + } + final LikeUserEntity model = mList.get(position); + vh.txt_nickname.setText(model.getNickname()); + vh.txt_time.setText(AbDateUtil.formatDateStr2Desc(model.getTime(),"yyyy-MM-dd HH:mm","MM-dd HH:mm")); + EasyGlide.getInstance().showImageCircle(model.getAvatar(),vh.img_avatar); + return convertView; + } + class ViewHolder{ + public ImageView img_avatar; + public TextView txt_nickname; + public TextView txt_time; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/MoreTypeGridAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/MoreTypeGridAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..17e277ae14926f7e8bc1fa6bcf40ccfe0fd75367 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/MoreTypeGridAdapter.java @@ -0,0 +1,193 @@ +package com.jiuqi.elove.adapter; + +import android.content.Context; +import android.content.Intent; +import android.content.res.Resources; +import android.graphics.Color; +import android.os.Bundle; +import android.util.DisplayMetrics; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageButton; +import android.widget.ImageView; +import android.widget.RelativeLayout; + +import com.bumptech.glide.Glide; +import com.jiuqi.elove.R; +import com.jiuqi.elove.activity.PreviewAvatarActivity; +import com.jiuqi.elove.activity.PreviewImgActivity; +import com.jiuqi.elove.entity.MyPhotoModel; +import com.jiuqi.elove.util.CommonUtil; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +/** + * + * Created by liulin on 2016/8/28. + */ +public class MoreTypeGridAdapter extends BaseAdapter { + + /** + * 根据不同的样式进行不同的加载,TYPENUM_CONTENT为样式总数+1 + */ + public static final int TYPENUM_CONTENT = 3; + public static final int ADD_TYPE = 1; + public static final int PIC_TYPE = 2; + + private List mlist = new ArrayList<>(); + private Context mContext; + private LayoutInflater mInflater; + public List mSelectedId = new LinkedList(); + private RelativeLayout.LayoutParams layoutParams; +// public List allSelectedId = new LinkedList(); + + public MoreTypeGridAdapter(Context context){ + this.mContext = context; + this.mInflater = LayoutInflater.from(mContext); + this.mSelectedId = new LinkedList<>(); + layoutParams = getMyLayout(); +// this.allSelectedId = new LinkedList<>(); + } + + public List getmSelectedId() { + return mSelectedId; + } + + /** + * 当ListView数据发生变化时,调用此方法来更新ListView + * + * @param list + */ + public void updateListView(List list,List allList) { + this.mSelectedId.clear(); +// this.allSelectedId.clear(); + layoutParams = getMyLayout(); + this.mlist.clear(); + this.mlist.addAll(list); + if(allList!=null){ + this.mSelectedId.addAll(allList); + } + notifyDataSetChanged(); + } + + @Override + public int getCount() { + return mlist.size(); + } + + @Override + public Object getItem(int position) { + return mlist.get(position); + } + + @Override + public int getItemViewType(int position) { + return position < TYPENUM_CONTENT - 1 ? position : TYPENUM_CONTENT - 1; + } + + @Override + public int getViewTypeCount() { + return TYPENUM_CONTENT; + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + final int index = position-1; + final ViewHolder vh; + if(null==convertView){ + vh = new ViewHolder(); + convertView = mInflater.inflate(R.layout.item_imagechoice_layout,null); + vh.id_item_image = (ImageView) convertView.findViewById(R.id.id_item_image); + vh.id_item_select = (ImageButton) convertView.findViewById(R.id.id_item_select); + vh.id_item_image.setLayoutParams(layoutParams); + convertView.setTag(vh); + }else{ + vh = (ViewHolder) convertView.getTag(); + } + switch (position){ + case 0: + vh.id_item_image.setImageResource(R.drawable.icon_add_with_border); + vh.id_item_select.setVisibility(View.GONE); + break; + default: + final MyPhotoModel model = mlist.get(position); + Glide.with(mContext).load(model.getPicUrlcut()).placeholder(R.drawable.pictures_no).dontAnimate().into(vh.id_item_image); + if(model.isEidtFlag()){ + vh.id_item_select.setVisibility(View.VISIBLE); + vh.id_item_image.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Log.d("MyPhotoActivity", "onClick: "+model.getPhotosId()); + if(mSelectedId.contains(model.getPhotosId())){ + mSelectedId.remove(model.getPhotosId()); + vh.id_item_select.setImageResource(R.drawable.picture_unselected); + vh.id_item_image.setColorFilter(null); + }else{ + mSelectedId.add(model.getPhotosId()); + vh.id_item_select.setImageResource(R.drawable.pictures_selected); + vh.id_item_image.setColorFilter(Color.parseColor("#77000000")); + } + } + }); + }else{ + vh.id_item_select.setVisibility(View.GONE); + vh.id_item_select.setImageResource(R.drawable.picture_unselected); + vh.id_item_image.setColorFilter(null); + vh.id_item_image.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(mlist.size() == 2){ + Intent intent = new Intent(mContext, PreviewAvatarActivity.class); + intent.putExtra("imageUrl",mlist.get(1).getPicUrl()); + mContext.startActivity(intent); + }else{ + Intent intent = new Intent(mContext, PreviewImgActivity.class); + intent.putExtra("currentItem",String.valueOf(index)); + String str[] = new String[mlist.size()-1]; + for(int i=1; i{ + + private List actModelList; + private Context context; + private int resId; + private RelativeLayout.LayoutParams layoutParams; + private ItemClickListener mItemClickListener; + + public void setListener(ItemClickListener mItemClickListener){ + this.mItemClickListener = mItemClickListener; + } + + public interface ItemClickListener{ + + void onItemClick(MyActModel model); + } + + public MyActAdapter(Context context,int resId){ + this.context = context; + this.resId = resId; + actModelList = new ArrayList<>(); + layoutParams = getMyLayout(); + } + + public void updateListView(List list){ + actModelList.clear(); + actModelList.addAll(list); + notifyDataSetChanged(); + } + + + @Override + public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(resId,parent,false); + SupportMultiScreenUtil.scale(view); + return new MyViewHolder(view); + } + + @Override + public void onBindViewHolder(MyViewHolder holder, int position) { + final MyActModel model = actModelList.get(position); + EasyGlide.getInstance().showImage(false,model.getPoster(),holder.iv_poster,-1); + holder.tv_title.setText(model.getTitle()); + holder.tv_city.setText(model.getAddress()); + holder.tv_time.setText(model.getStart()); + if(Constant.ACT_START==model.getStatus()){//活动已开始 + holder.tv_dayNum.setText("已开始"); + }else if(Constant.ACT_END == model.getStatus()){//活动已结束 + holder.tv_dayNum.setText("已结束"); + }else{//活动未开始 + holder.tv_dayNum.setText("未开始"); + } + holder.view.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(mItemClickListener!=null){ + mItemClickListener.onItemClick(model); + } + } + }); + } + + @Override + public int getItemCount() { + return actModelList.isEmpty()?0:actModelList.size(); + } + + public class MyViewHolder extends RecyclerView.ViewHolder{ + + ImageView iv_poster; + TextView tv_title; + TextView tv_dayNum; + TextView tv_city; + TextView tv_time; + View view; + + public MyViewHolder(View itemView) { + super(itemView); + view = itemView; + iv_poster = (ImageView) itemView.findViewById(R.id.iv_poster); + iv_poster.setLayoutParams(layoutParams); + tv_title = (TextView) itemView.findViewById(R.id.tv_title); + tv_dayNum = (TextView) itemView.findViewById(R.id.tv_dayNum); + tv_city = (TextView) itemView.findViewById(R.id.tv_city); + tv_time = (TextView) itemView.findViewById(R.id.tv_time); + } + } + + private RelativeLayout.LayoutParams getMyLayout(){ + Resources resources = context.getResources(); + DisplayMetrics dm = resources.getDisplayMetrics(); + int width = dm.widthPixels; + RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(width,width*9/16); + return layoutParams; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/NewContactAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/NewContactAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..94d4516b0e0dbe104665930b81f3226628b9bf11 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/NewContactAdapter.java @@ -0,0 +1,105 @@ +package com.jiuqi.elove.adapter; + +import android.content.Context; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.entity.ContactPersonModel; +import com.jiuqi.elove.util.EasyGlide; +import com.jiuqi.elove.util.SupportMultiScreenUtil; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; + +/** + * Created by jq on 2017/11/28. + */ + +public class NewContactAdapter extends RecyclerView.Adapter{ + + private List mList = new ArrayList<>(); + private LayoutInflater mInflater; + private Context mcontext; + + private ClickListener clickListener; + + public void setListener(ClickListener clickListener){ + this.clickListener = clickListener; + } + + public NewContactAdapter(Context context,List list){ + this.mcontext = context; + this.mList = list; + mInflater = LayoutInflater.from(context); + } + + @Override + public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = mInflater.inflate(R.layout.item_contact_child,parent,false); + SupportMultiScreenUtil.scale(view); + return new MyViewHolder(view); + } + + @Override + public void onBindViewHolder(MyViewHolder holder, int position) { + final ContactPersonModel model = mList.get(position); + EasyGlide.getInstance().showImageCircle(model.getAvatar(),holder.imgContactPhoto); + holder.tvNikeName.setText(model.getNickname()); + holder.tvDescribe.setText(model.getDeclaration()); + holder.imgContactPhoto.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(clickListener!=null){ + clickListener.avatarClick(model); + } + } + }); + holder.view.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(clickListener!=null){ + clickListener.itemClick(model); + } + } + }); + } + + @Override + public int getItemCount() { + return mList.size(); + } + + + public class MyViewHolder extends RecyclerView.ViewHolder{ + + @BindView(R.id.contact_headphoto) + ImageView imgContactPhoto; + @BindView(R.id.contact_nikename) + TextView tvNikeName; + @BindView(R.id.contact_description) + TextView tvDescribe; + View view; + + public MyViewHolder(View itemView) { + super(itemView); + view = itemView; + imgContactPhoto = (ImageView) itemView.findViewById(R.id.contact_headphoto); + tvNikeName = (TextView) itemView.findViewById(R.id.contact_nikename); + tvDescribe = (TextView) itemView.findViewById(R.id.contact_description); + } + } + + public interface ClickListener{ + + void avatarClick(ContactPersonModel model); + + void itemClick(ContactPersonModel model); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/NineGridImageViewAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/NineGridImageViewAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..d8845e24a4f035620b36c6112ba25bdb6af1425d --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/NineGridImageViewAdapter.java @@ -0,0 +1,17 @@ +package com.jiuqi.elove.adapter; + +import android.content.Context; +import android.widget.ImageView; + +public abstract class NineGridImageViewAdapter { + + public abstract void onDisplayImage(Context context, ImageView imageView, T t); + + public ImageView generateImageView(Context context){ + ImageView imageView = new ImageView(context); + imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); + return imageView; + } + + //这里可以添加你所需要的事件之类的方法 +} \ No newline at end of file diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/OrderManageAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/OrderManageAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..ffa00972befc9214951836ac912f1654fbe7e793 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/OrderManageAdapter.java @@ -0,0 +1,243 @@ +package com.jiuqi.elove.adapter; + +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.TextView; + +import com.alibaba.fastjson.JSONObject; +import com.bumptech.glide.Glide; +import com.jiuqi.elove.R; +import com.jiuqi.elove.activity.OrderDetailActivity254; +import com.jiuqi.elove.activity.WaitingAndSelectPayTypeActivity254; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.entity.OrderManageModel; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.widget.dialog.CustomDialog; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 订单管理适配器 + * Created by jq on 2016/10/11. + */ +public class OrderManageAdapter extends BaseAdapter { + + private static final String TAG = "OrderManageAdapter"; + + private List mList = new ArrayList<>(); + private LayoutInflater inflater; + private Context context; + private final OkHttpUtil okHttpUtil = OkHttpUtil.getInstance(); + + private Map orderstateMap; + private Map refundstateMap;//退款状态 + private Map actstateMap;//参加活动状态 + + + public OrderManageAdapter(Context context){ + this.context = context; + inflater = LayoutInflater.from(context); + setDataMapper(); + } + + private void setDataMapper() { + orderstateMap = new HashMap<>(); + orderstateMap.put("1","待支付"); + orderstateMap.put("2","已支付"); + orderstateMap.put("3","已取消"); + orderstateMap.put("4","已过期"); + refundstateMap = new HashMap<>(); + refundstateMap.put("1","待退款"); + refundstateMap.put("2","已退款"); + actstateMap = new HashMap<>(); + actstateMap.put("1","待审核"); + actstateMap.put("2","已通过"); + actstateMap.put("3","已拒绝"); + } + public void addOrderManageAdapter(List list){ + this.mList.clear(); + this.mList.addAll(list); + } + + /** + * 当listview数据发生变化时,调用此方法来更新listview + */ + public void updateListView(List list){ + this.mList.clear(); + this.mList.addAll(list); + notifyDataSetChanged(); + } + @Override + public int getCount() { + return mList.size(); + } + + @Override + public Object getItem(int position) { + return mList.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(final int position, View convertView, ViewGroup viewGroup) { + final ViewHolder vh; + if(convertView==null){ + vh = new ViewHolder(); + convertView = inflater.inflate(R.layout.item_order,null); + vh.order_name = (TextView) convertView.findViewById(R.id.order_name); + vh.price = (TextView) convertView.findViewById(R.id.price); + vh.wait_apy = (TextView) convertView.findViewById(R.id.wait_apy); + vh.cancel_view_del = (TextView) convertView.findViewById(R.id.cancel_view_del); + vh.tv_time = (TextView) convertView.findViewById(R.id.tv_time); + vh.tv_address = (TextView) convertView.findViewById(R.id.tv_address); + convertView.setTag(vh); + }else{ + vh = (ViewHolder) convertView.getTag(); + } + final OrderManageModel model = mList.get(position); + vh.order_name.setText(model.getSubject()); + vh.tv_address.setText(model.getActaddress()); + vh.tv_time.setText(model.getActtime()); + vh.price.setText(model.getFee()); + vh.cancel_view_del.setText(orderstateMap.get(String.valueOf(model.getOrderstate())));//订单的状态 + if(1==model.getOrderstate()){//待支付 + vh.cancel_view_del.setTextColor(context.getResources().getColor(R.color.colorPrimary)); + vh.cancel_view_del.setBackground(context.getResources().getDrawable(R.drawable.border_red_radius5)); + }else{ + vh.cancel_view_del.setTextColor(context.getResources().getColor(R.color.gray)); + vh.cancel_view_del.setBackground(context.getResources().getDrawable(R.drawable.border_gray_radius5)); + } + if(Constant.ORDER_PAY_SUCCESS == model.getOrderstate()){//已支付 + if("1".equals(model.getRefund_state())){//需要退款覆盖掉之前设置的订单状态 + vh.cancel_view_del.setText(context.getString(R.string.refunding)); + vh.cancel_view_del.setTextColor(context.getResources().getColor(R.color.colorPrimary)); + vh.cancel_view_del.setBackground(context.getResources().getDrawable(R.drawable.border_red_radius5)); + }else if("2".equals(model.getRefund_state())){ + vh.cancel_view_del.setText(context.getString(R.string.refund_already)); + vh.cancel_view_del.setBackground(context.getResources().getDrawable(R.drawable.border_gray_radius5)); + vh.cancel_view_del.setTextColor(context.getResources().getColor(R.color.gray)); + } + } + convertView.setOnClickListener(new View.OnClickListener() {//查看订单 + @Override + public void onClick(View view) { + if(Constant.ORDER_WAIT_PAY==model.getOrderstate()){ + Intent intent = new Intent(context, WaitingAndSelectPayTypeActivity254.class); + intent.putExtra("ordernum",model.getOrdernum()); + intent.putExtra("actid",model.getActid()); + context.startActivity(intent); + }else{ + Intent intent = new Intent(context, OrderDetailActivity254.class); + intent.putExtra("ordernum",model.getOrdernum()); + context.startActivity(intent); + } + } + }); + return convertView; + } + + class ViewHolder{ +// public ImageView img_poster; + public TextView order_name; +// public TextView order_status; + public TextView price; + public TextView wait_apy; + public TextView cancel_view_del; + public TextView tv_time; + public TextView tv_address; + } + + /** + * 删除订单 + */ + private void createdelOrderDialog(final OrderManageModel model) { + //对话框 + CustomDialog.Builder builder = new CustomDialog.Builder(context); + builder.setTitle(context.getString(R.string.order_manage)); + builder.setMessage(context.getString(R.string.makesure_delorder)); + builder.setPositiveButton(R.string.confirm,new DialogInterface.OnClickListener() { + public void onClick(final DialogInterface dialog, int which) { + String delUrl = Constant.COMMON_URL + Interface.DEL_ORDER; + JSONObject obj = new JSONObject(); + obj.put("orderNum",model.getOrdernum()); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(context, false, delUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + if("1".equals(rsCode)){ + dialog.dismiss(); + mList.remove(model); + notifyDataSetChanged(); + } + } + },null); + } + }); + builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }); + builder.create().show(); + } + + /** + * 取消订单 + */ + private void createcancelOrderDialog(final OrderManageModel model,final int position){ + //对话框 + CustomDialog.Builder builder = new CustomDialog.Builder(context); + builder.setTitle(context.getString(R.string.order_manage)); + builder.setMessage(context.getString(R.string.makesure_cancelorder)); + builder.setPositiveButton(R.string.confirm,new DialogInterface.OnClickListener() { + public void onClick(final DialogInterface dialog, int which) { + String cancelUrl = Constant.COMMON_URL + Interface.CANCEL_ORDER; + JSONObject obj = new JSONObject(); + obj.put("orderNum",model.getOrdernum()); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + Log.d(TAG, "onClick: param"+param); + okHttpUtil.sendJsonStrByPostAsync(context, false, cancelUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + Log.d(TAG, "onResponse: "+rsCode); + if("1".equals(rsCode)){ + dialog.dismiss(); + model.setOrderstate(Constant.ORDER_PAY_CANCEL); + mList.remove(model); + mList.add(position,model); + notifyDataSetChanged(); + } + } + },null); + } + }); + builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }); + builder.create().show(); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/PhotoAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/PhotoAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..2a575ac92e9ced04cfa107ccc630b96af5009159 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/PhotoAdapter.java @@ -0,0 +1,108 @@ +package com.jiuqi.elove.adapter; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +import android.content.Context; +import android.graphics.Color; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.ImageView; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.entity.ImageViewHolder; +import com.jiuqi.elove.util.JqStrUtil; + +public class PhotoAdapter extends CommonPhotoAdapter +{ + + private static final String TAG = "PhotoAdapter"; + private Context context; + private int currentCount; + private int totalCount;//总共可以上传的图片 + /** + * 用户选择的图片,存储为图片的完整路径 + */ +// public static List mSelectedImage = new LinkedList();//源代码 + public ArrayList mSelectedImage = new ArrayList<>(); + + /** + * 我加的 + * @return + */ + public ArrayList getmSelectedImage() { + return mSelectedImage; + } + + /** + * 文件夹路径 + */ + private String mDirPath; + + public PhotoAdapter(Context context, List mDatas, int itemLayoutId, + String dirPath,int current,int totalCount) + { + super(context, mDatas, itemLayoutId); + this.mSelectedImage = new ArrayList<>();//我加的 + this.mDirPath = dirPath; + this.context = context; + this.currentCount = current; + this.totalCount = totalCount; + } + + @Override + public void convert(final ImageViewHolder helper, final String item) + { + //设置no_pic + helper.setImageResource(R.id.id_item_image, R.drawable.pictures_no); + //设置no_selected + helper.setImageResource(R.id.id_item_select, + R.drawable.picture_unselected); + //设置图片 + helper.setImageByUrl(R.id.id_item_image, mDirPath + "/" + item); + + final ImageView mImageView = helper.getView(R.id.id_item_image); + final ImageView mSelect = helper.getView(R.id.id_item_select); + + mImageView.setColorFilter(null); + //设置ImageView的点击事件 + mImageView.setOnClickListener(new OnClickListener() + { + //选择,则将图片变暗,反之则反之 + @Override + public void onClick(View v) + { + // 已经选择过该图片 + if (mSelectedImage.contains(mDirPath + "/" + item)) + { + mSelectedImage.remove(mDirPath + "/" + item); + mSelect.setImageResource(R.drawable.picture_unselected); + mImageView.setColorFilter(null); + } else + // 未选择该图片 + { + if(mSelectedImage.size()>=totalCount-currentCount){ + JqStrUtil.showToast(mContext,"选择图片数量达到上限"); + return; + } + mSelectedImage.add(mDirPath + "/" + item); + mSelect.setImageResource(R.drawable.pictures_selected); + mImageView.setColorFilter(Color.parseColor("#77000000")); + + } + + } + }); + + /** + * 已经选择过的图片,显示出选择过的效果 + */ + if (mSelectedImage.contains(mDirPath + "/" + item)) + { + mSelect.setImageResource(R.drawable.pictures_selected); + mImageView.setColorFilter(Color.parseColor("#77000000")); + } + + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/PoiAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/PoiAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..6bdb8ecb548113c7e30715b4e74acc6ede4cb122 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/PoiAdapter.java @@ -0,0 +1,69 @@ +package com.jiuqi.elove.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.TextView; + +import com.baidu.mapapi.search.core.PoiInfo; +import com.jiuqi.elove.R; + +import java.util.ArrayList; +import java.util.List; + +/** + * 附近地址适配器 + * Created by dl on 2017/5/2. + */ +public class PoiAdapter extends BaseAdapter{ + + private List mlist = new ArrayList<>(); + private LayoutInflater mLayoutInflater; + private Context mContext; + + public PoiAdapter(Context context,List list){ + this.mContext = context; + this.mlist = list; + mLayoutInflater = LayoutInflater.from(mContext); + } + + @Override + public int getCount() { + return mlist.size(); + } + + @Override + public Object getItem(int i) { + return mlist.get(i); + } + + @Override + public long getItemId(int i) { + return i; + } + + @Override + public View getView(int i, View view, ViewGroup viewGroup) { + ViewHolder vh; + if(view==null){ + view = mLayoutInflater.inflate(R.layout.item_poi_layout,null); + vh = new ViewHolder(); + vh.simpleadd = (TextView) view.findViewById(R.id.simpleadd); + vh.detailadd = (TextView) view.findViewById(R.id.detailadd); + view.setTag(vh); + }else{ + vh = (ViewHolder) view.getTag(); + } + final PoiInfo model = mlist.get(i); + vh.simpleadd.setText(model.name); + vh.detailadd.setText(model.address); + return view; + } + + class ViewHolder{ + public TextView simpleadd; + public TextView detailadd; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/PriceAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/PriceAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..781c5e1a6826630eef991bdabc5db15eaea10d37 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/PriceAdapter.java @@ -0,0 +1,60 @@ +package com.jiuqi.elove.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.entity.PriceInfoModel; +import com.jiuqi.elove.widget.PriceSingleChoiceView; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by dl on 2016/11/10. + */ +public class PriceAdapter extends BaseAdapter { + + private List mlist = new ArrayList<>(); + private LayoutInflater mLayoutInflater; + private Context mContext; + private String mflag;//判断是否显示单选按钮 + + public PriceAdapter(Context context,List list,String flag){ + this.mContext = context; + this.mlist = list; + mflag = flag; + mLayoutInflater = LayoutInflater.from(mContext); + } + @Override + public int getCount() { + return mlist.size(); + } + + @Override + public Object getItem(int i) { + return mlist.get(i); + } + + @Override + public long getItemId(int i) { + return i; + } + + @Override + public View getView(int i, View view, ViewGroup viewGroup) { + // ViewHolder vh; + PriceSingleChoiceView poiview; + if(view==null){ + poiview = new PriceSingleChoiceView(mContext,mflag); + }else{ + poiview = (PriceSingleChoiceView) view; + } + final PriceInfoModel model = mlist.get(i); + poiview.setText(model.getTicket(),mContext.getResources().getString(R.string.ticket)+model.getReservenum(),mContext.getResources().getString(R.string.yuan)+model.getMoney()); + return poiview; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/ProfessionAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/ProfessionAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..69aae4acedcc1e8439ad9fa4ffbad20122d838ed --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/ProfessionAdapter.java @@ -0,0 +1,99 @@ +package com.jiuqi.elove.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.TextView; + +import com.jiuqi.elove.R; + + +/** + * + * Created by dl on 2016/11/21. + */ +public class ProfessionAdapter extends BaseAdapter{ + + private LayoutInflater mInflater; + private Context mContext; + private String[] professionTitleList; + private String[] professionList; + private int location; + public ProfessionAdapter(Context context,String[] title,String[] content,int m){ + professionTitleList = title; + professionList = content; + mContext = context; + mInflater = LayoutInflater.from(context); + location = m; + } + @Override + public int getCount() { + return professionList.length; + } + + @Override + public Object getItem(int position) { + return professionList[position]; + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View view, ViewGroup viewGroup) { + ViewHolder vh; + String title = professionTitleList[position]; + String content = (String) getItem(position); + if(view==null){ + view = mInflater.inflate(R.layout.item_profession_layout,null); + vh = new ViewHolder(); + vh.tv_background_it = (TextView) view.findViewById(R.id.tv_background_it); + vh.tv_it = (TextView) view.findViewById(R.id.tv_it); + vh.iv_selected = (ImageView) view.findViewById(R.id.iv_selected); + view.setTag(vh); + }else{ + vh = (ViewHolder) view.getTag(); + } + if(position!=12){ + vh.tv_background_it.setText(title); + }else{ + vh.tv_background_it.setText(""); + } + vh.tv_it.setText(content); + if(position<=2){ + vh.tv_background_it.setVisibility(View.VISIBLE);//否则到了最后一项隐藏之后在滑动回去之后显示不出来 + vh.tv_background_it.setBackground(mContext.getResources().getDrawable(R.drawable.profession_blue_solid_border5)); + }else if(position>2&&position<=4){ + vh.tv_background_it.setVisibility(View.VISIBLE); + vh.tv_background_it.setBackground(mContext.getResources().getDrawable(R.drawable.profession_border_solid_radius5)); + }else if(position>4&&position<=6){ + vh.tv_background_it.setVisibility(View.VISIBLE); + vh.tv_background_it.setBackground(mContext.getResources().getDrawable(R.drawable.profession_orange_border)); + }else if(position>6&&position<=9){ + vh.tv_background_it.setVisibility(View.VISIBLE); + vh.tv_background_it.setBackground(mContext.getResources().getDrawable(R.drawable.profession_green_solid_border5)); + }else if(position>9&&position<=11){ + vh.tv_background_it.setVisibility(View.VISIBLE); + vh.tv_background_it.setBackground(mContext.getResources().getDrawable(R.drawable.profession_purple_solid_border5)); + }else{ + vh.tv_background_it.setVisibility(View.INVISIBLE); + } + if(position==location){ + vh.iv_selected.setVisibility(View.VISIBLE); + }else{//选中状态隐藏和显示必须手动设置,否则显示了没法再需要的时候隐藏,隐藏了没法再需要的时候显示 + vh.iv_selected.setVisibility(View.GONE); + } + return view; + } + + class ViewHolder{ + public TextView tv_background_it; + public TextView tv_it; + public ImageView iv_selected; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/QaAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/QaAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..f4382e956a841d6b4a9eb8c738570922c9a97876 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/QaAdapter.java @@ -0,0 +1,170 @@ +package com.jiuqi.elove.adapter; + +import android.content.Context; +import android.content.Intent; +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.support.v4.graphics.drawable.RoundedBitmapDrawable; +import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory; +import android.support.v7.widget.RecyclerView; +import android.util.DisplayMetrics; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.target.BitmapImageViewTarget; +import com.jiuqi.elove.R; +import com.jiuqi.elove.activity.QaDetailActivity; +import com.jiuqi.elove.entity.QaAndDetailModel; +import com.jiuqi.elove.util.AbDateUtil; +import com.jiuqi.elove.util.JqStrUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by dl on 2017/1/5. + */ +public class QaAdapter extends BaseAdapter{ + private List mList; + private Context context; + private LayoutInflater mInflater; + + public QaAdapter(Context context){ + this.context = context; + mInflater = LayoutInflater.from(context); + mList = new ArrayList<>(); + } + + public void myQaAdapter(List list){ + this.mList.clear(); + this.mList.addAll(list); + } + + public void updateListView(List list){ + this.mList.clear(); + this.mList.addAll(list); + notifyDataSetChanged(); + } + @Override + public int getCount() { + return mList.size(); + } + + @Override + public Object getItem(int position) { + return mList.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup viewGroup) { + final ViewHolder vh; + if(convertView==null){ + convertView = mInflater.inflate(R.layout.item_qa_layout,null); + vh = new ViewHolder(); + vh.iv_avatar = (ImageView) convertView.findViewById(R.id.iv_avatar); + vh.iv_qa = (ImageView) convertView.findViewById(R.id.iv_qa); + vh.rl_question = (RelativeLayout) convertView.findViewById(R.id.rl_question); + vh.tv_nikename = (TextView) convertView.findViewById(R.id.tv_nikename); + vh.tv_questiontime = (TextView) convertView.findViewById(R.id.tv_questiontime); + vh.tv_istop = (TextView) convertView.findViewById(R.id.tv_istop); + vh.tv_title = (TextView) convertView.findViewById(R.id.tv_title); + vh.tv_content = (TextView) convertView.findViewById(R.id.tv_content); + vh.tv_answercount = (TextView) convertView.findViewById(R.id.tv_answercount); + vh.tv_scancount = (TextView) convertView.findViewById(R.id.tv_scancount); + vh.tv_reply_nikename = (TextView) convertView.findViewById(R.id.tv_reply_nikename); + vh.tv_reply_content = (TextView) convertView.findViewById(R.id.tv_reply_content); + vh.ll_reply = (LinearLayout) convertView.findViewById(R.id.ll_reply); + convertView.setTag(vh); + }else{ + vh = (ViewHolder)convertView.getTag(); + } + /** + * 获取数据并将数据填充如ui + */ + final QaAndDetailModel model = mList.get(position); + setData2View(vh,model); +// vh.rl_question.setOnClickListener(new View.OnClickListener() { +// @Override +// public void onClick(View view) { +// Intent intent = new Intent(context, QaDetailActivity.class); +// intent.putExtra("id",model.getResolveid()); +// context.startActivity(intent); +// } +// }); + return convertView; + } + + private void setData2View(final ViewHolder vh,QaAndDetailModel model) { + Glide.with(context).load(model.getAvatar()).asBitmap().placeholder(R.drawable.img_hx_avatar).centerCrop().into(new BitmapImageViewTarget(vh.iv_avatar) { + @Override + protected void setResource(Bitmap resource) { + RoundedBitmapDrawable circularBitmapDrawable = + RoundedBitmapDrawableFactory.create(context.getResources(), resource); + circularBitmapDrawable.setCircular(true); + vh.iv_avatar.setImageDrawable(circularBitmapDrawable); + } + }); + if(!JqStrUtil.isEmpty(model.getResolveImg())){ + vh.iv_qa.setVisibility(View.VISIBLE); + Glide.with(context).load(model.getResolveImg()).placeholder(R.drawable.img_hx_avatar).centerCrop().dontAnimate().into(vh.iv_qa); + }else{ + vh.iv_qa.setVisibility(View.GONE); + } + vh.tv_nikename.setText(model.getUsername()); + vh.tv_questiontime.setText(AbDateUtil.formatDateStr2Desc(model.getStarttime(),"yyyy-MM-dd HH:mm","MM-dd HH:mm")); + if("1".equals(model.getIstop())){ + vh.tv_istop.setVisibility(View.VISIBLE); + vh.tv_title.setText("\t\t\t\t\t\t\t "+model.getTitle()); + }else{ + vh.tv_istop.setVisibility(View.GONE); + vh.tv_title.setText(model.getTitle()); + } + vh.tv_content.setText(model.getTheme()); + if(JqStrUtil.isEmpty(model.getScans())){ + vh.tv_scancount.setText("0"); + }else{ + vh.tv_scancount.setText(model.getScans()); + } + if(JqStrUtil.isEmpty(model.getReplys())){ + vh.tv_answercount.setText("0"); + }else{ + vh.tv_answercount.setText(model.getReplys()); + } + if(!JqStrUtil.isEmpty(model.getReplyname())||!JqStrUtil.isEmpty(model.getReplystring())){ + vh.ll_reply.setVisibility(View.VISIBLE); + vh.tv_reply_nikename.setText(model.getReplyname()); + vh.tv_reply_content.setText(model.getReplystring()); + }else{ + vh.ll_reply.setVisibility(View.GONE); + } + } + + class ViewHolder{ + public ImageView iv_avatar; + public RelativeLayout rl_question; + public TextView tv_nikename; + public TextView tv_questiontime; + public TextView tv_istop; + public TextView tv_title; + public TextView tv_content; + public TextView tv_answercount; + public TextView tv_scancount; + public LinearLayout ll_reply; + public TextView tv_reply_nikename; + public TextView tv_reply_content; + public ImageView iv_qa; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/QaAnswersAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/QaAnswersAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..92109209200a57028a70c71a3e4e3e7cbf02ec32 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/QaAnswersAdapter.java @@ -0,0 +1,209 @@ +package com.jiuqi.elove.adapter; + +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.graphics.Bitmap; +import android.graphics.drawable.AnimationDrawable; +import android.support.v4.graphics.drawable.RoundedBitmapDrawable; +import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.target.BitmapImageViewTarget; +import com.jiuqi.elove.R; +import com.jiuqi.elove.activity.QuestionReplyActivity; +import com.jiuqi.elove.activity.RewardActivity; +import com.jiuqi.elove.entity.QaDetailAnswerModel; +import com.jiuqi.elove.util.AbDateUtil; +import com.jiuqi.elove.util.EasyGlide; +import com.jiuqi.elove.util.JqStrUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * + * Created by dl on 2017/1/5. + */ +public class QaAnswersAdapter extends BaseAdapter { + private List mList; + private Context context; + private LayoutInflater mInflater; + private String userid; + private OnUpdateRewardListener mListener; + + public QaAnswersAdapter(Context context){ + this.context = context; + mInflater = LayoutInflater.from(context); + mList = new ArrayList<>(); + getDataFromSp(); + } + + public interface OnUpdateRewardListener{ + void updateReward(int position,QaDetailAnswerModel model); + + void playVoice(int position,QaDetailAnswerModel model,ViewHolder vh); + } + + public void setOnUpdateRewardListener(OnUpdateRewardListener mListener){ + this.mListener = mListener; + } + + private void getDataFromSp(){ + SharedPreferences sp = context.getSharedPreferences("elove",context.MODE_PRIVATE); + userid = sp.getString("userid",""); + } + + public void myQaAnswersAdapter(List list){ + this.mList.clear(); + this.mList.addAll(list); + } + + public void updateListView(List list){ + this.mList.clear(); + this.mList.addAll(list); + notifyDataSetChanged(); + } + @Override + public int getCount() { + return mList.size(); + } + + @Override + public Object getItem(int position) { + return mList.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(final int position, View convertView, ViewGroup viewGroup) { + final ViewHolder vh; + if(convertView==null){ + convertView = mInflater.inflate(R.layout.item_answers_layout,null); + vh = new ViewHolder(); + vh.iv_avatar = (ImageView) convertView.findViewById(R.id.iv_avatar); + vh.iv_reply_voice = (ImageView) convertView.findViewById(R.id.iv_reply_voice); + vh.tv_nikename = (TextView) convertView.findViewById(R.id.tv_nikename); + vh.tv_questiontime = (TextView) convertView.findViewById(R.id.tv_questiontime); + vh.tv_content = (TextView) convertView.findViewById(R.id.tv_content); + vh.tv_answercount = (TextView) convertView.findViewById(R.id.tv_answercount); + vh.tv_paycount = (TextView) convertView.findViewById(R.id.tv_paycount); + vh.tv_voice_time = (TextView) convertView.findViewById(R.id.tv_voice_time); + vh.iv_pay = (ImageView) convertView.findViewById(R.id.iv_pay); + vh.iv_comment = (ImageView) convertView.findViewById(R.id.iv_comment); + vh.ll_reward = (LinearLayout) convertView.findViewById(R.id.ll_reward); + vh.ll_reply_voice = (LinearLayout) convertView.findViewById(R.id.ll_reply_voice); + vh.animeView = convertView.findViewById(R.id.v_anime); + convertView.setTag(vh); + }else{ + vh = (ViewHolder)convertView.getTag(); + } + /** + * 获取数据并将数据填充如ui + */ + final QaDetailAnswerModel model = mList.get(position); + setData2View(vh,model); +// convertView.setOnClickListener(new View.OnClickListener() { +// @Override +// public void onClick(View view) { +// Intent intent = new Intent(context, QuestionReplyActivity.class); +// intent.putExtra("id",model.getCommentid()); +// context.startActivity(intent); +// } +// }); + vh.ll_reward.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if(mListener!=null){ + mListener.updateReward(position,model); + } +// if(!JqStrUtil.isEmpty(userid)&&userid.equals(model.getUserid())){ +// JqStrUtil.showToast(context,"不能打赏自己"); +// return; +// } +// Intent intent = new Intent(context, RewardActivity.class); +// intent.putExtra("otherid",model.getUserid()); +// intent.putExtra("type","2");//问答 +// intent.putExtra("titleid",model.getCommentid()); +// context.startActivity(intent); + } + }); + vh.iv_reply_voice.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if(mListener!=null){ + mListener.playVoice(position,model,vh); + } + } + }); + return convertView; + } + + private void setData2View(final ViewHolder vh,QaDetailAnswerModel model) { + EasyGlide.getInstance().showImageCircle(model.getAvatar(),vh.iv_avatar); + vh.tv_nikename.setText(model.getUsername()); + vh.tv_questiontime.setText(AbDateUtil.formatDateStr2Desc(model.getCommenttime(),"yyyy-MM-dd HH:mm","MM-dd HH:mm")); +// vh.tv_title.setText(model.getTheme()); + if("0".equals(model.getCommenttype())){ + vh.tv_content.setVisibility(View.VISIBLE); + vh.ll_reply_voice.setVisibility(View.GONE); + vh.tv_content.setText(model.getComment()); + vh.iv_comment.setVisibility(View.VISIBLE); + vh.tv_answercount.setVisibility(View.VISIBLE); + vh.ll_reward.setVisibility(View.GONE); + }else{ + vh.tv_content.setVisibility(View.GONE); + vh.ll_reply_voice.setVisibility(View.VISIBLE); + vh.tv_voice_time.setText(model.getVoicetime()+'"'); + vh.iv_comment.setVisibility(View.GONE); + vh.tv_answercount.setVisibility(View.GONE); + vh.ll_reward.setVisibility(View.GONE); + } + + if(JqStrUtil.isEmpty(model.getReplynum())){ + vh.tv_answercount.setText("0"); + }else{ + vh.tv_answercount.setText(model.getReplynum()); + } + if(JqStrUtil.isEmpty(model.getRewards())){ + vh.tv_paycount.setText("0"); + }else{ + vh.tv_paycount.setText(model.getRewards()); + } +// if(!JqStrUtil.isEmpty(model.getReplyname())||!JqStrUtil.isEmpty(model.getReplystring())){ +// vh.ll_reply.setVisibility(View.VISIBLE); +// vh.tv_reply_nikename.setText(model.getReplyname()); +// vh.tv_reply_content.setText(model.getReplystring()); +// }else{ +// vh.ll_reply.setVisibility(View.GONE); +// } + } + + public class ViewHolder{ + public ImageView iv_avatar; + public ImageView iv_reply_voice; + public TextView tv_nikename; + public TextView tv_questiontime; + public TextView tv_content; + public TextView tv_answercount; + public TextView tv_paycount; + public ImageView iv_pay; + public ImageView iv_comment; + public LinearLayout ll_reward; + public LinearLayout ll_reply_voice; + public TextView tv_voice_time; + public View animeView; + } +} + diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/ReceiveGiftAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/ReceiveGiftAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..b09240c5dd8b76c96fa0b366274e26bc3fcd2f58 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/ReceiveGiftAdapter.java @@ -0,0 +1,111 @@ +package com.jiuqi.elove.adapter; + +import android.content.Context; +import android.content.res.Resources; +import android.support.v7.widget.RecyclerView; +import android.util.DisplayMetrics; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.bumptech.glide.Glide; +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.CommonDataUtil; +import com.jiuqi.elove.entity.GiftModel; +import com.jiuqi.elove.util.CommonUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * 收到的礼物的适配器 + * Created by dl on 2017/3/23. + */ +public class ReceiveGiftAdapter extends RecyclerView.Adapter{ + + private List mList; + private Context context; + private LayoutInflater inflater; + private OnRecyclerViewItemClickListener mOnItemClickListener; + private RelativeLayout.LayoutParams params; + + public ReceiveGiftAdapter(Context context){ + this.context = context; + this.inflater = LayoutInflater.from(context); + mList = new ArrayList<>(); + params = getMyLayout(); + } + //define interface + public interface OnRecyclerViewItemClickListener { + void onItemClick(int position); + } + + public void updateRecylerView(List list){ + mList.clear(); + mList.addAll(list); + notifyDataSetChanged(); + } + + public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) { + this.mOnItemClickListener = listener; + } + + @Override + public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = inflater.inflate(R.layout.item_gift_sendandreceive,parent,false); + MyViewHolder vh = new MyViewHolder(view); + return vh; + } + + @Override + public void onBindViewHolder(final MyViewHolder holder, final int position) { + final GiftModel model = mList.get(position); + holder.tv_name.setText("["+CommonDataUtil.giftNameMap.get(model.getName())+"]"); + holder.tv_mounts.setText("X "+model.getNum()); + CommonUtil.setGiftDrawable(context,model.getName(),holder.iv_gift); + holder.ll_all.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (mOnItemClickListener != null) { + int layoutPosition = holder.getLayoutPosition(); + mOnItemClickListener.onItemClick(layoutPosition); + } + } + }); + } + + @Override + public int getItemCount() { + return mList==null ? 0 : mList.size(); + } + + class MyViewHolder extends RecyclerView.ViewHolder { + TextView tv_mounts; + TextView tv_name; + ImageView iv_gift; + LinearLayout ll_all; + public MyViewHolder(View itemView) { + super(itemView); + tv_mounts = (TextView) itemView.findViewById(R.id.tv_mounts); + tv_name = (TextView) itemView.findViewById(R.id.tv_name); + iv_gift = (ImageView) itemView.findViewById(R.id.iv_gift); + ll_all = (LinearLayout) itemView.findViewById(R.id.ll_all); + iv_gift.setLayoutParams(params); + } + } + + private RelativeLayout.LayoutParams getMyLayout(){ + Resources resources = context.getResources(); + DisplayMetrics dm = resources.getDisplayMetrics(); + int width =(dm.widthPixels- CommonUtil.dip2px(context,64))/2; + return new RelativeLayout.LayoutParams(width,width); + } + + private String value2String(String value){ + return value==null?"此值得到为null":value; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/RechargeAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/RechargeAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..303e18594849b2bb18bdc9cdd8ec5ae7f73428ae --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/RechargeAdapter.java @@ -0,0 +1,129 @@ +package com.jiuqi.elove.adapter; + +import android.content.Context; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.EditText; +import android.widget.TextView; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.entity.RechargeModel; + +import java.util.List; + +/** + * Created by dl on 2016/12/20. + */ +public class RechargeAdapter extends RecyclerView.Adapter implements View.OnClickListener{ + + private List mList; + private Context mContext; + private LayoutInflater mInflater; + + private final int lastType = 1; + private final int otherType = 0; + + private OnRecyclerViewItemClickListener mOnItemClickListener; + + public RechargeAdapter(Context context,List list){ + this.mContext = context; + this.mInflater = LayoutInflater.from(context); + this.mList = list; + } + + //define interface + public interface OnRecyclerViewItemClickListener { + void onItemClick(View view, int position); + } + + @Override + public void onClick(View v) { + if (mOnItemClickListener != null) { + //注意这里使用getTag方法获取数据 + mOnItemClickListener.onItemClick(v,(int)v.getTag()); + } + } + + public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) { + this.mOnItemClickListener = listener; + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { +// if(viewType==otherType){ + View view = mInflater.inflate(R.layout.item_chose_recharge,null,false); + TextViewHolder textViewHolder = new TextViewHolder(view); + view.setOnClickListener(this); + return textViewHolder; +// }else{ +// View view = mInflater.inflate(R.layout.item_define_recharge,null,false); +// EditTextViewHolder editTextViewHolder = new EditTextViewHolder(view); +// view.setOnClickListener(this); +// return editTextViewHolder; +// } + } + + @Override + public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) { +// if(holder instanceof TextViewHolder){ +// if(position mList = new ArrayList(); + private LayoutInflater inflater; + private Context context; + private int agreetemp;//点赞功能的中间数量的显示 + private String myId; + private final OkHttpUtil okHttpUtil = OkHttpUtil.getInstance(); + private SharedPreferences sp; + private int kind; + private String ifac; + + public RecommendAdapter(Context context){ + this.context = context; + inflater = LayoutInflater.from(context); + SharedPreferences sp = context.getSharedPreferences("elove",context.MODE_PRIVATE); + myId = sp.getString("userid",""); + getDataFromSp(context); + } + + private void getDataFromSp(Context context){ + sp = context.getSharedPreferences("elove",Context.MODE_PRIVATE); + kind = sp.getInt("kind",1000); + ifac = sp.getString("ifac",""); + } + + public void MyMsgAdapter(List list){ + this.mList.clear(); + this.mList.addAll(list); + } + + /** + * 当listview数据发生变化时,调用此方法来更新listview + */ + public void updateListView(List list){ + this.mList.clear(); + this.mList.addAll(list); + notifyDataSetChanged(); + } + @Override + public int getCount() { + return mList.size(); + } + + @Override + public Object getItem(int position) { + return mList.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(final int position, View convertView, ViewGroup parent) { + final ViewHolder vh; + if(convertView==null){ + vh = new ViewHolder(); + convertView = inflater.inflate(R.layout.item_recommend_layout,null); + vh.headPhoto = (ImageView) convertView.findViewById(R.id.iv_user_photohead); + vh.iv_isVideo = (ImageView) convertView.findViewById(R.id.iv_isVideo); + vh.nikeName = (TextView) convertView.findViewById(R.id.tv_usernikename); + vh.sexAge = (TextView) convertView.findViewById(R.id.tv_user_sex_age); + vh.rlay_user_sex_age = (RelativeLayout) convertView.findViewById(R.id.rlay_user_sex_age); + vh.img_sex = (ImageView) convertView.findViewById(R.id.img_sex); + vh.star = (TextView) convertView.findViewById(R.id.xingzuo); + vh.city = (TextView) convertView.findViewById(R.id.city); + vh.leaveMsg = (TextView) convertView.findViewById(R.id.tv_leaveMessage); + vh.agree = (TextView) convertView.findViewById(R.id.isfor); + vh.ll_talk = (LinearLayout) convertView.findViewById(R.id.ll_talk); + vh.ll_agree = (LinearLayout) convertView.findViewById(R.id.ll_agree); + vh.isLike = (ImageView) convertView.findViewById(R.id.iv_for); + vh.ll_matchpercent = (LinearLayout) convertView.findViewById(R.id.ll_matchpercent); + vh.match_percent = (TextView) convertView.findViewById(R.id.match_percent); + convertView.setTag(vh); + }else{ + vh = (ViewHolder) convertView.getTag(); + } + final RecommendUserInfoModel model = mList.get(position); + vh.nikeName.setText(model.getNickname()); + if("1".equals(model.getIfvideo())){//有视频已被认证 + vh.iv_isVideo.setVisibility(View.VISIBLE); + }else{ + vh.iv_isVideo.setVisibility(View.GONE); + } + if(model.getSex()==1){ + vh.sexAge.setText(""+model.getAge()); + vh.rlay_user_sex_age.setBackgroundResource(R.drawable.sex_man_style); + vh.img_sex.setImageResource(R.drawable.icon_sex_boy); + }else{ + vh.sexAge.setText(""+model.getAge()); + vh.rlay_user_sex_age.setBackgroundResource(R.drawable.sex_woman_style); + vh.img_sex.setImageResource(R.drawable.icon_sex_girl); + } + if("0".equals(model.getMatch())){ + vh.ll_matchpercent.setVisibility(View.GONE); + }else{ + vh.ll_matchpercent.setVisibility(View.VISIBLE); + vh.match_percent.setText(model.getMatch()+"%"); + } + vh.star.setText(model.getConstellation()); + vh.city.setText(model.getLocalplace()); + vh.leaveMsg.setText("打招呼"); + /** + * 全局变量会导致最后一项的数据得到保留,其他项再去点赞操作错误;但是这样的话此次去点击此可以操作的项仍然可以成功; + * 如果设置局部,则因为model是从list中获取的,服务器中的数据经过第一次已经改变,而model未更新,所以set之后将list中的model进行改变 + */ + final String isLike = model.getIflike(); + if("2".equals(isLike)){//2 状态:未点赞 + vh.isLike.setImageResource(R.drawable.icon_like); + }else{//1 状态:已点赞 + vh.isLike.setImageResource(R.drawable.icon_like_red); + } + agreetemp = model.getLikenum();//得到点赞数,用于后面的点赞加减 有问题 + vh.agree.setText(String.valueOf(agreetemp)); +// vh.ll_agree.setOnClickListener(new View.OnClickListener() { +// @Override +// public void onClick(View view) { +// agreetemp = Integer.parseInt(vh.agree.getText().toString().trim()); +// Log.d(TAG, "onClick: "+isLike); +// if("2".equals(isLike)){//action 1点赞 +// like(model,vh,"1",position); +// }else{//action 2 取消点赞 +// showSureDialog(model,vh,"2",position); +// } +// } +// }); + vh.ll_talk.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if(myId.equals(model.getOtherID())){ + JqStrUtil.showToast(context,"亲,何必自说自话呀~"); + return; + } + if(kind==0&&"1".equals(ifac)){ + JqStrUtil.showToast(context,context.getString(R.string.talk_to_others)); + return; + } + Intent intent = new Intent(context, ChatActivity.class); + intent.putExtra("chatType", EaseConstant.CHATTYPE_SINGLE);//2.0.2版本加群聊之后做区分 + intent.putExtra("userId",model.getOtherID().toLowerCase()); + intent.putExtra("nikeName",model.getNickname()); + intent.putExtra("avatar",model.getAvatar()); + context.startActivity(intent); + } + }); +// if(!JqStrUtil.isEmpty(model.getAvatar())){ +// glideRequest.load(model.getAvatar()).error(R.drawable.img_recommend_avatar).centerCrop().transform(new GlideRoundTransform(context,4)).into(vh.headPhoto); +// }else{ +// glideRequest.load(R.drawable.img_recommend_avatar).centerCrop().transform(new GlideRoundTransform(context,4)).into(vh.headPhoto); +// } + Glide.with(context).load(model.getAvatar()).placeholder(R.drawable.img_recommend_avatar).centerCrop().dontAnimate().into(vh.headPhoto); + //item的点击事件,改到了listview所在的fragment,为了通过activityresult获取下一个页面的变化动态 + //更新数据而不请求网络 +// convertView.setOnClickListener(new View.OnClickListener() { +// @Override +// public void onClick(View view) { +// Intent intent = new Intent(context, OtherPersonCenterActivity.class); +// intent.putExtra("otherid",model.getOtherID()); +// context.startActivity(intent); +// } +// }); + return convertView; + } + +// private void showSureDialog(final RecommendUserInfoModel model, final ViewHolder vh,final String action,final int position) { +// CustomDialog.Builder builder = new CustomDialog.Builder(context); +// builder.setTitle(""); +// builder.setMessage("确定要取消赞吗?"); +// builder.setPositiveButton(R.string.confirm,new DialogInterface.OnClickListener() { +// public void onClick(DialogInterface dialog, int which) { +// like(model,vh,action,position); +// dialog.dismiss(); +// } +// }); +// builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { +// @Override +// public void onClick(DialogInterface dialog, int which) { +// dialog.dismiss(); +// } +// }); +// builder.create().show(); +// } + +// private void like(final RecommendUserInfoModel model, final ViewHolder vh,final String action,final int position) { +// String likeUrl = Constant.COMMON_URL + Interface.USER_LIKE; +// SharedPreferences sp = context.getSharedPreferences("elove",context.MODE_PRIVATE); +// String userId = sp.getString("userid",""); +// String likeId = model.getOtherID(); +// JSONObject obj = new JSONObject(); +// obj.put("userID",userId); +// obj.put("likeID",likeId); +// obj.put("action",action); +// obj.put("version",Constant.VERSION); +// String param = obj.toJSONString(); +// Log.d(TAG, "like: param"+param); +// okHttpUtil.sendJsonStrByPostAsync(context,true,likeUrl, param, new OkHttpUtil.OnGetJsonObject() { +// @Override +// public void onResponse(JSONObject jsonObject) { +// String rsCode = jsonObject.getString("retcode"); +// String explanation = jsonObject.getString("explanation"); +// Log.d(TAG, "onResponse: rscode"+rsCode); +// if("1".equals(rsCode)){ +// String isLike = ""; +// if("2".equals(action)){ +// vh.isLike.setImageResource(R.drawable.icon_like); +// agreetemp = agreetemp -1; +// isLike = "2"; +// }else if("1".equals(action)){ +// vh.isLike.setImageResource(R.drawable.icon_like_red); +// agreetemp = agreetemp + 1; +// isLike = "1"; +// } +// //请求接口成功之后才调用这几个方法,否则即使不成功也要走一遍,不合理 +// model.setIflike(isLike); +// model.setLikenum(agreetemp); +// mList.remove(position); +// mList.add(position,model);//更新list中的model,否则获取数据时是已经从服务器中得到的旧list,点赞数据导致不一致 +// notifyDataSetChanged();//通知更新,否则不好用 +// vh.agree.setText(String.valueOf(agreetemp)); +// }else if("100".equals(rsCode)){ +// JqStrUtil.showToast(context,explanation); +// } +// } +// },null); +// } + + class ViewHolder{ + public ImageView headPhoto; + public ImageView iv_isVideo; + public TextView nikeName; + public RelativeLayout rlay_user_sex_age; + public ImageView img_sex; + public TextView sexAge; + public TextView star; + public TextView city; + public TextView leaveMsg; + public TextView agree; + public LinearLayout ll_talk; + public LinearLayout ll_agree; + public ImageView isLike; + public LinearLayout ll_matchpercent; + public TextView match_percent; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/RedBeanConsumAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/RedBeanConsumAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..2232741ac4727f087894f9dec4961b3b93aa8b73 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/RedBeanConsumAdapter.java @@ -0,0 +1,86 @@ +package com.jiuqi.elove.adapter; + +import android.content.Context; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.entity.ConsumeRedbeanModel; + +import java.util.List; + +/** + * Created by dl on 2016/12/20. + */ +public class RedBeanConsumAdapter extends RecyclerView.Adapter{ + + private List mList; + private Context mContext; + private LayoutInflater mInflater; + + public RedBeanConsumAdapter(List list,Context context){ + this.mList = list; + this.mContext = context; + mInflater = LayoutInflater.from(context); + } + + @Override + public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + MyViewHolder holder = new MyViewHolder(mInflater.inflate(R.layout.item_consume_redbean,parent,false)); + return holder; + } + + @Override + public void onBindViewHolder(MyViewHolder holder, int position) { + ConsumeRedbeanModel model = mList.get(position); + if("1".equals(model.getType())){ + holder.tv_consumetype.setText("充值"); + holder.tv_consumemoney.setText("+"+model.getRedbean()); + holder.tv_consumemoney.setTextColor(mContext.getResources().getColor(R.color.colorPrimary)); + }else if("2".equals(model.getType())){ + holder.tv_consumetype.setText("消费"); + holder.tv_consumemoney.setText("-"+model.getRedbean()); + holder.tv_consumemoney.setTextColor(mContext.getResources().getColor(R.color.gray_deep)); + }else if("3".equals(model.getType())){ + holder.tv_consumetype.setText("点赞"); + holder.tv_consumemoney.setText("+"+model.getRedbean()); + holder.tv_consumemoney.setTextColor(mContext.getResources().getColor(R.color.colorPrimary)); + }else if("4".equals(model.getType())){ + holder.tv_consumetype.setText("退款"); + holder.tv_consumemoney.setText("+"+model.getRedbean()); + holder.tv_consumemoney.setTextColor(mContext.getResources().getColor(R.color.colorPrimary)); + }else if("5".equals(model.getType())){ + holder.tv_consumetype.setText("打赏"); + holder.tv_consumemoney.setText("+"+model.getRedbean()); + holder.tv_consumemoney.setTextColor(mContext.getResources().getColor(R.color.colorPrimary)); + }else if("6".equals(model.getType())){ + holder.tv_consumetype.setText("任务奖励"); + holder.tv_consumemoney.setText("+"+model.getRedbean()); + holder.tv_consumemoney.setTextColor(mContext.getResources().getColor(R.color.colorPrimary)); + }else{ + return; + } + holder.tv_consumetime.setText(model.getCtime()); + } + + @Override + public int getItemCount() { + return mList==null?0:mList.size(); + } + + class MyViewHolder extends RecyclerView.ViewHolder { + + TextView tv_consumetype; + TextView tv_consumetime; + TextView tv_consumemoney; + public MyViewHolder(View itemView) { + super(itemView); + tv_consumetype = (TextView) itemView.findViewById(R.id.tv_consumetype); + tv_consumetime = (TextView) itemView.findViewById(R.id.tv_consumetime); + tv_consumemoney = (TextView) itemView.findViewById(R.id.tv_consumemoney); + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/RewardAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/RewardAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..6ca8163bcdc59b6ba51c28d0c76429a432ae3f1f --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/RewardAdapter.java @@ -0,0 +1,128 @@ +package com.jiuqi.elove.adapter; + +import android.content.Context; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.EditText; +import android.widget.TextView; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.entity.RechargeModel; + +import java.util.List; + +/** + * Created by dl on 2017/1/13. + */ +public class RewardAdapter extends RecyclerView.Adapter implements View.OnClickListener{ + private List mList; + private Context mContext; + private LayoutInflater mInflater; + + private final int lastType = 1; + private final int otherType = 0; + + private OnRecyclerViewItemClickListener mOnItemClickListener; + + public RewardAdapter(Context context,List list){ + this.mContext = context; + this.mInflater = LayoutInflater.from(context); + this.mList = list; + } + + //define interface + public interface OnRecyclerViewItemClickListener { + void onItemClick(View view , int position); + } + + @Override + public void onClick(View v) { + if (mOnItemClickListener != null) { + //注意这里使用getTag方法获取数据 + mOnItemClickListener.onItemClick(v,(int)v.getTag()); + } + } + + public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) { + this.mOnItemClickListener = listener; + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { +// if(viewType==otherType){ + View view = mInflater.inflate(R.layout.item_reward_layout,parent,false); + TextViewHolder textViewHolder = new TextViewHolder(view); + view.setOnClickListener(this); + return textViewHolder; +// }else{ +// View view = mInflater.inflate(R.layout.item_define_recharge,null,false); +// EditTextViewHolder editTextViewHolder = new EditTextViewHolder(view); +// view.setOnClickListener(this); +// return editTextViewHolder; +// } + } + + @Override + public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) { +// if(holder instanceof TextViewHolder){ +// if(position{ + + private Context context; + private int layoutId; + private List mAddList = new ArrayList<>(); + private OnItemClickListener onItemClickListener; + + public void setListener(OnItemClickListener onItemClickListener){ + this.onItemClickListener = onItemClickListener; + } + + public RvCardAdapter(Context context, int layoutId){ + this.context = context; + this.layoutId = layoutId; + } + + public void updateList(List mList){ + mAddList.clear(); + mAddList.addAll(mList); + notifyDataSetChanged(); + } + + @Override + public CardViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(layoutId,parent,false); + return new CardViewHolder(view); + } + + @Override + public void onBindViewHolder(CardViewHolder holder, int position) { + final RecommendUserInfoModel model = mAddList.get(position); + String url = model.getAvatar(); + if(1==model.getSex()){ + Glide.with(context).load(url).placeholder(R.drawable.img_default_boy).into(holder.ivcard); + }else{ + Glide.with(context).load(url).placeholder(R.drawable.img_default_girl).into(holder.ivcard); + } + if(!JqStrUtil.isEmpty(model.getMatch())&&!"0".equals(model.getMatch())){ + holder.tv_match.setVisibility(View.VISIBLE); + holder.tv_match.setText("匹配度 "+model.getMatch()+"%"); + }else{ + holder.tv_match.setVisibility(View.GONE); + } + if(!JqStrUtil.isEmpty(model.getLocalplace())){ + holder.tv_address.setText(model.getLocalplace()); + } + if(!JqStrUtil.isEmpty(model.getNickname())){ + holder.tv_nike.setText(model.getNickname()); + } + if(!JqStrUtil.isEmpty(model.getConstellation())){ + holder.tv_constellation.setText(model.getConstellation()); + } + if(!JqStrUtil.isEmpty(model.getDegree())){ + holder.tv_degree.setText(CommonDataUtil.degreeMap.get(model.getDegree())); + } + if(!TextUtils.isEmpty(CommonDataUtil.sexMap.get(String.valueOf(model.getSex())))){ + holder.tv_sex.setText(CommonDataUtil.sexMap.get(String.valueOf(model.getSex()))); + }else{ + holder.tv_sex.setText("未知"); + } + if(!TextUtils.isEmpty(String.valueOf(model.getAge()))){ + holder.tv_age.setText(String.valueOf(model.getAge())+"岁"); + }else{ + holder.tv_age.setText("未知"); + } + holder.ll_sex_age.setBackground(ContextCompat.getDrawable(context,R.drawable.sex_age_bg)); + if(!TextUtils.isEmpty(model.getHeight())){ + holder.tv_height.setText(model.getHeight()+"cm"); + }else{ + holder.tv_height.setText("未知"); + } +// StrUtil.setContentUnOrUnit(holder.tv_sex,,"性别",""); +// StrUtil.setContentUnOrUnit(holder.tv_age,String.valueOf(model.getAge()),"年龄","岁"); +// StrUtil.setContentUnOrUnit(holder.tv_height,model.getHeight(),"身高","cm"); + if(Constant.REALNAME_PASS.equals(model.getRealnametype())){ + holder.iv_o_authstatus.setImageResource(R.drawable.icon_idcard_on); + }else{ + holder.iv_o_authstatus.setImageResource(R.drawable.icon_idcard_un); + } + if(Constant.YOUTH_PASS.equals(model.getYouthLeague())){ + holder.iv_qiyuan_status.setImageResource(R.drawable.icon_qingnian_on); + }else{ + holder.iv_qiyuan_status.setImageResource(R.drawable.icon_qingnian_un); + } + if(Constant.COMPANY_PASS.equals(String.valueOf(model.getKind()))){ + holder.iv_company_auth.setImageResource(R.drawable.icon_company_on); + }else{ + holder.iv_company_auth.setImageResource(R.drawable.icon_company_un); + } + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(onItemClickListener!=null){ + onItemClickListener.onItemClick(model); + } + } + }); + } + + @Override + public int getItemCount() { + return mAddList.size(); + } + + public class CardViewHolder extends RecyclerView.ViewHolder{ + + TextView tv_match; + TextView tv_nike; + TextView tv_sex; + TextView tv_age; + TextView tv_constellation; + TextView tv_address; + TextView tv_degree; + TextView tv_height; + ImageView iv_o_authstatus; + ImageView iv_qiyuan_status; + ImageView ivcard; + ImageView iv_company_auth; + LinearLayout ll_auth; + LinearLayout ll_sex_age; + LinearLayout ll_addr; + + public CardViewHolder(View itemView) { + super(itemView); + tv_match = (TextView) itemView.findViewById(R.id.tv_match); + tv_nike = (TextView) itemView.findViewById(R.id.tv_nike); + tv_sex = (TextView) itemView.findViewById(R.id.tv_sex); + tv_age = (TextView) itemView.findViewById(R.id.tv_age); + tv_constellation = (TextView) itemView.findViewById(R.id.tv_constellation); + tv_address = (TextView) itemView.findViewById(R.id.tv_address); + tv_degree = (TextView) itemView.findViewById(R.id.tv_degree); + tv_height = (TextView) itemView.findViewById(R.id.tv_height); + iv_o_authstatus = (ImageView) itemView.findViewById(R.id.iv_o_authstatus); + iv_qiyuan_status = (ImageView) itemView.findViewById(R.id.iv_qiyuan_status); + ivcard = (ImageView) itemView.findViewById(R.id.iv_card); + iv_company_auth = (ImageView) itemView.findViewById(R.id.iv_company_auth); + ll_auth = (LinearLayout) itemView.findViewById(R.id.ll_auth); + ll_sex_age = (LinearLayout) itemView.findViewById(R.id.ll_sex_age); + ll_addr = (LinearLayout) itemView.findViewById(R.id.ll_addr); + ivcard.setLayoutParams(getMyLayout()); + ll_auth.setLayoutParams(getMyLinearLayout()); + ll_auth.setPadding(0,CommonUtil.dip2px(context,10),0,CommonUtil.dip2px(context,10)); + } + } + + private RelativeLayout.LayoutParams getMyLayout(){ + Resources resources = context.getResources(); + DisplayMetrics dm = resources.getDisplayMetrics(); + int width = dm.widthPixels - CommonUtil.dip2px(context,120); + return new RelativeLayout.LayoutParams(width,width); + } + + private FrameLayout.LayoutParams getMyLinearLayout(){ + Resources resources = context.getResources(); + DisplayMetrics dm = resources.getDisplayMetrics(); + int width = dm.widthPixels - CommonUtil.dip2px(context,120); + return new FrameLayout.LayoutParams(width, ViewGroup.LayoutParams.WRAP_CONTENT); + } + + public interface OnItemClickListener{ + void onItemClick(RecommendUserInfoModel model); + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/SchoolAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/SchoolAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..fc5427a9b627146010604d150e9835e293d51287 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/SchoolAdapter.java @@ -0,0 +1,24 @@ +package com.jiuqi.elove.adapter; + +import android.content.Context; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.widget.rvhelper.adapter.CommonAdapter; +import com.jiuqi.elove.widget.rvhelper.base.ViewHolder; + +import java.util.List; + +/** + * Created by jq on 2017/9/14. + */ + +public class SchoolAdapter extends CommonAdapter { + + public SchoolAdapter(Context context, int layoutId, List datas){ + super(context,layoutId,datas); + } + @Override + protected void convert(ViewHolder holder, String s, int position) { + holder.setText(R.id.tv_school_name,s); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/SecondCommentAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/SecondCommentAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..0b8cc4edd188c9b1790fe191955b757ef95e22f9 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/SecondCommentAdapter.java @@ -0,0 +1,99 @@ +package com.jiuqi.elove.adapter; + +import android.content.Context; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.entity.CircleCommentModel; +import com.jiuqi.elove.entity.CommentModel; +import com.jiuqi.elove.util.EasyGlide; +import com.jiuqi.elove.util.SupportMultiScreenUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by jq on 2017/11/9. + */ + +public class SecondCommentAdapter extends RecyclerView.Adapter{ + + private Context context; + private OnClickComment onClickComment; + private List mDatas = new ArrayList<>(); + + public SecondCommentAdapter(Context context) { + this.context = context; + } + + public void setCommentClickListener(OnClickComment onClickComment){ + this.onClickComment = onClickComment; + } + + public void updateListView(List list){ + mDatas.clear(); + mDatas.addAll(list); + notifyDataSetChanged(); + } + + @Override + public CommentViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_second_comment_layout,parent,false); + SupportMultiScreenUtil.scale(view); + return new CommentViewHolder(view); + } + + @Override + public void onBindViewHolder(final CommentViewHolder holder, final int position) { + final CircleCommentModel model = mDatas.get(position); + holder.tv_nike.setText(model.getUserName()); + holder.tv_time.setText(model.getTime()); + holder.tv_comment.setText(model.getComment()); + EasyGlide.getInstance().showImage(true,model.getUserAvatar(),holder.iv_avatar,R.drawable.img_hx_avatar); + holder.iv_handle.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(onClickComment!=null){ + onClickComment.showMore(holder,model,position); + } + } + }); + } + + @Override + public int getItemCount() { + return mDatas==null?0:mDatas.size(); + } + + public static class CommentViewHolder extends RecyclerView.ViewHolder{ + + TextView tv_nike; + TextView tv_time; + TextView tv_comment; + ImageView iv_avatar; + public ImageView iv_handle; + + public CommentViewHolder(View itemView) { + super(itemView); + SupportMultiScreenUtil.scale(itemView); + tv_nike = (TextView) itemView.findViewById(R.id.tv_nike); + tv_time = (TextView) itemView.findViewById(R.id.tv_time); + tv_comment = (TextView) itemView.findViewById(R.id.tv_comment); + iv_avatar = (ImageView) itemView.findViewById(R.id.iv_avatar); + iv_handle = (ImageView) itemView.findViewById(R.id.iv_handle); + } + + } + + public interface OnClickComment{ + void onReplyClick(String flag, CommentViewHolder holder, CommentModel model, int position); + void showMore(CommentViewHolder holder, CircleCommentModel model, int position); + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/SelectCompanyAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/SelectCompanyAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..e1022f7e60d0347b8450b170789c9972d139706f --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/SelectCompanyAdapter.java @@ -0,0 +1,85 @@ +package com.jiuqi.elove.adapter; + +import android.content.Context; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.entity.CompanyModel; +import com.jiuqi.elove.util.SupportMultiScreenUtil; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; + +/** + * Created by jq on 2017/12/12. + */ + +public class SelectCompanyAdapter extends RecyclerView.Adapter{ + + private Context context; + private int layoutId; + private List mList; + private ItemClickListener listener; + + public SelectCompanyAdapter(Context context,int layoutId){ + this.context = context; + this.layoutId = layoutId; + mList = new ArrayList<>(); + } + + public void updateList(List list){ + mList.clear(); + mList.addAll(list); + notifyDataSetChanged(); + } + + public void setListener(ItemClickListener listener){ + this.listener = listener; + } + + @Override + public CompanyHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(layoutId,null); + return new CompanyHolder(view); + } + + @Override + public void onBindViewHolder(final CompanyHolder holder, int position) { + final CompanyModel model = mList.get(position); + holder.tv_company_name.setText(model.getEnterpriseName()); + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(listener!=null){ + listener.onItemClick(holder,model); + } + } + }); + } + + @Override + public int getItemCount() { + return mList.isEmpty()?0:mList.size(); + } + + public class CompanyHolder extends RecyclerView.ViewHolder{ + + TextView tv_company_name; + + public CompanyHolder(View itemView) { + super(itemView); + SupportMultiScreenUtil.scale(itemView); + tv_company_name = (TextView) itemView.findViewById(R.id.tv_company_name); + } + } + + public interface ItemClickListener{ + void onItemClick(CompanyHolder holder,CompanyModel model); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/SysRecommendAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/SysRecommendAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..169e21aa621e7f1af121f7813f2bd636fc48a7ab --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/SysRecommendAdapter.java @@ -0,0 +1,151 @@ +package com.jiuqi.elove.adapter; + +import android.content.Context; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.CommonDataUtil; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.entity.SysRecommendModel; +import com.jiuqi.elove.util.EasyGlide; +import com.jiuqi.elove.util.StrUtil; +import com.jiuqi.elove.util.SupportMultiScreenUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * 系统推荐 + * Created by dl on 2017/11/27. + */ + +public class SysRecommendAdapter extends RecyclerView.Adapter{ + + private List mList; + private Context context; + private String flag; + private int resId; + private SysRecommendAdapter.ItemClickListener mItemClickListener; + + public void setListener(SysRecommendAdapter.ItemClickListener mItemClickListener){ + this.mItemClickListener = mItemClickListener; + } + + public interface ItemClickListener{ + + void onItemClick(SysRecommendModel model,int position); + + void focus(SysRecommendModel model,MyViewHolder holder); + + void talk(SysRecommendModel model); + + } + + public SysRecommendAdapter(Context context,int resId,String flag){ + this.context = context; + this.resId = resId; + this.flag = flag; + mList = new ArrayList<>(); + } + + public void updateListView(List list){ + mList.clear(); + mList.addAll(list); + notifyDataSetChanged(); + } + + + @Override + public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(resId,parent,false); + SupportMultiScreenUtil.scale(view); + return new MyViewHolder(view); + } + + @Override + public void onBindViewHolder(final MyViewHolder holder, final int position) { + final SysRecommendModel model = mList.get(position); + EasyGlide.getInstance().showImageCircle(model.getAvatar(),holder.headPhoto); + holder.nikeName.setText(model.getNickname()); + holder.txt_address.setText(StrUtil.returnStr(model.getLocalPlace())); + holder.age_height_degree.setText(StrUtil.returnLinkStr("/",StrUtil.returnEmptyOrUnit(model.getAge(),"岁"), + StrUtil.returnEmptyOrUnit(model.getHeight(),"cm"), + StrUtil.returnStr(CommonDataUtil.degreeMap.get(model.getDegree()),"学历"))); + if("recommend".equals(flag)){ + StrUtil.setTitleContentOrUnit(holder.album_num,model.getMatch(),"匹配度","%"); + }else{ + StrUtil.setContentUn(holder.album_num,model.getDistance()); + } + //加关注 + final String isLike = model.getIfattention(); + if(Constant.ATTENTION_NOT.equals(isLike)){ + holder.img_focus.setImageResource(R.drawable.icon_focus_gray); + }else{ + holder.img_focus.setImageResource(R.drawable.icon_focus_pink); + } + holder.rlay_focus.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(mItemClickListener!=null){ + mItemClickListener.focus(model,holder); + } + } + }); + holder.rlay_talk.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(mItemClickListener!=null){ + mItemClickListener.talk(model); + } + } + }); + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(mItemClickListener!=null){ + mItemClickListener.onItemClick(model,position); + } + } + }); + } + + @Override + public int getItemCount() { + return mList.isEmpty()?0:mList.size(); + } + + public class MyViewHolder extends RecyclerView.ViewHolder{ + + ImageView headPhoto; + TextView nikeName; + TextView album_num; + TextView age_height_degree; + TextView txt_address; + public TextView leaveMsg; + RelativeLayout rlay_focus; + RelativeLayout rlay_talk; + public ImageView img_focus; + View view; + + public MyViewHolder(View itemView) { + super(itemView); + view = itemView; + headPhoto = (ImageView) itemView.findViewById(R.id.img_avatar); + img_focus = (ImageView) itemView.findViewById(R.id.img_focus); + nikeName = (TextView) itemView.findViewById(R.id.txt_nickname); + album_num = (TextView) itemView.findViewById(R.id.album_num); + age_height_degree = (TextView) itemView.findViewById(R.id.age_height_degree); + txt_address = (TextView) itemView.findViewById(R.id.txt_address); + leaveMsg = (TextView) itemView.findViewById(R.id.txt_focus); + rlay_focus = (RelativeLayout) itemView.findViewById(R.id.rlay_focus); + rlay_talk = (RelativeLayout) itemView.findViewById(R.id.rlay_talk); + } + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/SystemMsgAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/SystemMsgAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..57d0b69b83b03b7c0e578c444df2a2eeb5f86958 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/SystemMsgAdapter.java @@ -0,0 +1,259 @@ +package com.jiuqi.elove.adapter; + +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.graphics.Bitmap; +import android.support.v4.graphics.drawable.RoundedBitmapDrawable; +import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.TextView; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.activity.CircleDetailActivity; +import com.jiuqi.elove.activity.CommonH5Activity; +import com.jiuqi.elove.activity.CompanyAuthActivity; +import com.jiuqi.elove.activity.EActDetailActivity2_0_3; +import com.jiuqi.elove.activity.MyGiftActivity; +import com.jiuqi.elove.activity.MyNameCardActivity; +import com.jiuqi.elove.activity.MyRealNameActivity; +import com.jiuqi.elove.activity.MyRedbeanActivity2_6; +import com.jiuqi.elove.activity.OtherPersonCenterActivity; +import com.jiuqi.elove.activity.PreviewVideoActivity; +import com.jiuqi.elove.entity.SysMsgModel; +import com.jiuqi.elove.util.AbDateUtil; +import com.jiuqi.elove.util.EasyGlide; +import com.jiuqi.elove.util.JqStrUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * + * Created by dl on 2016/8/3. + */ +public class SystemMsgAdapter extends BaseAdapter{ + + /** + * 推送 + * 1、关注 2点赞 8企业认证通过 9企业认证未通过 10申请参加活动被拒绝 11申请参加活动通过 + * 12参加活动已取消 13申请活动已取消 16头像审核通过 17头像未通过审核 + * 19视频认证通过 20视频认证不通过 22邀请视频认证 31实名认证通过 32实名认证未通过 + * 33获得礼物 34获得元宝 35获得兑换券 36公告 37匹配人推荐 38新活动 39封号 + */ + + private static final String TAG = "SystemMsgAdapter"; + + private List mList = new ArrayList<>(); + private LayoutInflater inflater; + private Context context; + + public SystemMsgAdapter(Context context){ + this.context = context; + inflater = LayoutInflater.from(context); + } + + public void MyMsgAdapter(List list){ + this.mList.clear(); + this.mList.addAll(list); + } + + /** + * 当listview数据发生变化时,调用此方法来更新listview + */ + public void updateListView(List list){ + this.mList.clear(); + this.mList.addAll(list); + notifyDataSetChanged(); + } + @Override + public int getCount() { + return mList.size(); + } + + @Override + public Object getItem(int position) { + return mList.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + final ViewHolder vh; + if(convertView==null){ + vh = new ViewHolder(); + convertView = inflater.inflate(R.layout.item_sysmsg_layout,null); + vh.iv_headPhoto = (ImageView) convertView.findViewById(R.id.iv_headPhoto); + vh.tv_nikeName = (TextView) convertView.findViewById(R.id.tv_nikeName); + vh.tv_time = (TextView) convertView.findViewById(R.id.tv_time); + vh.tv_record = (TextView) convertView.findViewById(R.id.tv_record); + convertView.setTag(vh); + }else{ + vh = (ViewHolder) convertView.getTag(); + } + final SysMsgModel model = mList.get(position); + final int action = model.getAction(); + if(action == 1 || action == 2){//关注和点赞 + vh.tv_nikeName.setText(model.getNickname()); + EasyGlide.getInstance().showImageCircle(model.getAvatar(),vh.iv_headPhoto); + }else if(action == 10 || action == 11 || action == 12 || action == 13 || action == 38){ + vh.tv_nikeName.setText("活动消息"); + EasyGlide.getInstance().showImage(false,R.drawable.qiyuan_acts,vh.iv_headPhoto,R.drawable.img_hx_avatar); + }else if(action == 33 || action == 34 || action == 35){ + vh.tv_nikeName.setText("礼物消息"); + EasyGlide.getInstance().showImage(false,R.drawable.icon_gift_notify,vh.iv_headPhoto,R.drawable.img_hx_avatar); + }else if(action == 40 || action ==41 ){ + vh.tv_nikeName.setText("缘圈通知"); + EasyGlide.getInstance().showImageCircle(R.drawable.icon_sysmsg,vh.iv_headPhoto); + }else{//剩余企缘通知 + vh.tv_nikeName.setText("启缘通知"); + EasyGlide.getInstance().showImageCircle(R.drawable.icon_sysmsg,vh.iv_headPhoto); + } + convertView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(action == 1 || action == 2 || action == 37){//他人中心 + startOtherPage(model); + } + if(action == 8 || action == 9){//单位认证 + startCompanyAuthPage(); + } + if(action == 10 || action == 11 || action == 12 || action == 13 || action == 38){//活动相关 + if( 13 == action || 12 ==action){ + JqStrUtil.showToast(context,"取消的活动不可查看"); + return; + } + startActPage(model); + } + if(action == 16 || action == 17 ){//头像审核 + startNameCardPage(model); + } + if(action == 19 || action == 20 || action == 22){//视频 + startVideoPage(model); + } + if(action == 31 || action ==32){//实名 + startRealName(model); + } + if(action == 33){//礼物 + startMyGiftPage(); + } + if(action == 34 || action == 35){//元宝卡券兑换 + startMyRedBeanPage(); + } + if(action == 36){//公告 + startCommonH5Page(model); + } + if(action == 39){//封禁 + + } + if(action == 40 || action == 41){ + startCirclePage(model); + } + } + }); + vh.tv_time.setText(AbDateUtil.formatDateStr2Desc(model.getTime(),"yyyy-MM-dd HH:mm","MM-dd HH:mm")); + vh.tv_record.setText(model.getMsg()); + return convertView; + } + + /** + * 进入单位认证页面 + */ + private void startCompanyAuthPage() { + Intent intent = new Intent(context,CompanyAuthActivity.class); + context.startActivity(intent); + } + + /** + * 跳转h5页面 + * 公告 + */ + private void startCommonH5Page(SysMsgModel model) { + Intent intent = new Intent(context,CommonH5Activity.class); + intent.putExtra("title","通知"); + intent.putExtra("url",model.getLink()); + context.startActivity(intent); + } + + /** + * 进入我的钱包 + */ + private void startMyRedBeanPage() { + Intent intent = new Intent(context,MyRedbeanActivity2_6.class); + context.startActivity(intent); + } + + /** + * 进入我的礼物页面 + */ + private void startMyGiftPage() { + Intent intent = new Intent(context,MyGiftActivity.class); + context.startActivity(intent); + } + + /** + * 进入到实名认证页面 + */ + private void startRealName(SysMsgModel model) { + Intent intent = new Intent(context, MyRealNameActivity.class); + context.startActivity(intent); + } + + /** + * 进入视频 + */ + private void startVideoPage(SysMsgModel model) { + Intent intent = new Intent(context,PreviewVideoActivity.class); + context.startActivity(intent); + } + + /** + * 进入到名片 + */ + private void startNameCardPage(SysMsgModel model) { + Intent intent = new Intent(context, MyNameCardActivity.class); + context.startActivity(intent); + } + + /** + * 跳转到活动 + */ + private void startActPage(SysMsgModel model) { + Intent intent = new Intent(context, EActDetailActivity2_0_3.class); + intent.putExtra("actid",model.getActID()); + context.startActivity(intent); + } + + /** + * 跳转他人中心 + */ + private void startOtherPage(SysMsgModel model){ + Intent intent = new Intent(context, OtherPersonCenterActivity.class); + intent.putExtra("otherid",model.getUserID()); + context.startActivity(intent); + } + + /** + * 进入缘圈 + */ + private void startCirclePage(SysMsgModel model){ + Intent intent = new Intent(context, CircleDetailActivity.class); + intent.putExtra("circleid",model.getUserID()); + context.startActivity(intent); + } + + class ViewHolder{ + public ImageView iv_headPhoto; + public TextView tv_nikeName; + public TextView tv_time; + public TextView tv_record; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/ViewOrLikeAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/ViewOrLikeAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..6f77192d4820c51b3a1b7dfc49987e9b73459576 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/adapter/ViewOrLikeAdapter.java @@ -0,0 +1,108 @@ +package com.jiuqi.elove.adapter; + +import android.content.Context; +import android.graphics.Bitmap; +import android.support.v4.graphics.drawable.RoundedBitmapDrawable; +import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.TextView; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.target.BitmapImageViewTarget; +import com.jiuqi.elove.R; +import com.jiuqi.elove.entity.LikeUserEntity; +import com.jiuqi.elove.util.AbDateUtil; +import com.jiuqi.elove.util.EasyGlide; + +import java.util.ArrayList; +import java.util.List; + +/** + * + * Created by FanWenXia on 2016/7/8. + */ +public class ViewOrLikeAdapter extends BaseAdapter { + + private List mList = new ArrayList(); + private LayoutInflater inflater; + private Context context; + private String flag; + + public ViewOrLikeAdapter(Context context,String flag){ + this.context = context; + inflater = LayoutInflater.from(context); + this.flag = flag; + } + + public void setMsgAdapter(List list){ + this.mList.clear(); + this.mList.addAll(list); + } + + /** + * 当listview数据发生变化时,调用此方法来更新listview + */ + public void updateListView(List list){ + this.mList.clear(); + this.mList.addAll(list); + notifyDataSetChanged(); + } + @Override + public int getCount() { + return mList.size(); + } + + @Override + public Object getItem(int position) { + return mList.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + final ViewHolder vh; + if(convertView==null){ + vh = new ViewHolder(); + convertView = inflater.inflate(R.layout.item_view_like,null); + vh.img_avatar = (ImageView) convertView.findViewById(R.id.img_avatar); + vh.iv_like = (ImageView) convertView.findViewById(R.id.iv_like); + vh.txt_nickname = (TextView) convertView.findViewById(R.id.txt_nickname); + vh.txt_time = (TextView) convertView.findViewById(R.id.txt_time); + vh.txt_times = (TextView) convertView.findViewById(R.id.txt_times); + convertView.setTag(vh); + }else{ + vh = (ViewHolder) convertView.getTag(); + } + final LikeUserEntity model = mList.get(position); + vh.txt_nickname.setText(model.getNickname()); + if("1".equals(flag)){ + vh.txt_time.setText(AbDateUtil.formatDateStr2Desc(model.getRecodetime(),"yyyy-MM-dd HH:mm","MM-dd HH:mm")+"访问了你的主页"); + vh.txt_times.setText("共"+model.getNum()+"次"); + if("1".equals(model.getClassify())){ + vh.iv_like.setVisibility(View.GONE); + }else{ + vh.iv_like.setVisibility(View.VISIBLE); + } + }else{ + vh.txt_time.setText(AbDateUtil.formatDateStr2Desc(model.getRecodetime(),"yyyy-MM-dd HH:mm","MM-dd HH:mm")+"赞了你"); + vh.txt_times.setVisibility(View.GONE); + } + EasyGlide.getInstance().showImageCircle(model.getAvatar(),vh.img_avatar); + return convertView; + } + class ViewHolder{ + public ImageView img_avatar; + public ImageView iv_like; + public TextView txt_nickname; + public TextView txt_time; + public TextView txt_times; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/application/EloveApplication.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/application/EloveApplication.java new file mode 100644 index 0000000000000000000000000000000000000000..176f661058551883daffa3870bd88552140fb520 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/application/EloveApplication.java @@ -0,0 +1,253 @@ +package com.jiuqi.elove.application; + +import android.content.Context; +import android.hardware.Camera; +import android.support.multidex.MultiDex; +import android.support.multidex.MultiDexApplication; +import android.widget.Toast; + +import com.baidu.mapapi.SDKInitializer; +import com.duanqu.qupai.engine.session.MovieExportOptions; +import com.duanqu.qupai.engine.session.ProjectOptions; +import com.duanqu.qupai.engine.session.ThumbnailExportOptions; +import com.duanqu.qupai.engine.session.UISettings; +import com.duanqu.qupai.engine.session.VideoSessionCreateInfo; +import com.duanqu.qupai.sdk.android.QupaiManager; +import com.duanqu.qupai.sdk.android.QupaiService; +import com.jiuqi.elove.common.CommonDataUtil; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.entity.ConditionBean; +import com.jiuqi.elove.entity.ProvinceBean; +import com.jiuqi.elove.entity.ThridAreaBean; +import com.jiuqi.elove.util.AuthTest; +import com.jiuqi.elove.util.EaseHxHelper; +import com.jiuqi.elove.util.PickerViewDataUtil; +import com.jiuqi.elove.util.SpUtils; +import com.jiuqi.elove.util.SupportMultiScreenUtil; +import com.umeng.socialize.Config; +import com.umeng.socialize.PlatformConfig; + +import java.util.ArrayList; +import java.util.List; + +import cn.jpush.android.api.JPushInterface; + +/** + * Created by dl on 2016/7/7. + * 继承MultiDexApplication来方便android5.0以下的系统使用64K或以上方法的引用 + * 解决办法:(同时hx的demo也是如此方法) + * http://blog.csdn.net/jushenziao/article/details/51316130 + * https://developer.android.com/studio/build/multidex.html + */ +public class EloveApplication extends MultiDexApplication { + + private static final String TAG = "EloveApplication"; + public static List onlyCity = new ArrayList<>();//城市list + public static List onlyAreaCity = new ArrayList<>();//三级list + public static List provinceItems = new ArrayList<>();//省份list + public static List> province_city_or_area = new ArrayList<>();//省份城市或者直辖市区域 + public static List> province_city_or_area_name = new ArrayList<>();//省份城市或者直辖市区域 + public static List> cityItems = new ArrayList<>();//省份城市 + public static List> cityItemsName = new ArrayList<>();//省份城市 + public static List>> province_city_area_items = new ArrayList<>();//城市区域 + public static List>> province_city_area_itemsName = new ArrayList<>();//城市区域 + private static EloveApplication instance; + private static Context context; + + /** + * 获取全局的context + */ + public static Context getAppContext(){ + return context; + } + + //趣拍初始化所需参数 + private float mDurationLimit;//视频录制时长 + private float mMinDurationLimit;//视屏录制最小时长 + private int mVideoBitrate;//趣拍默认码率为2兆,码率越小质量越差,合成更快 + private int beautySkinProgress;//美颜参数:1-100.这里不设指定为80,这个值只在第一次设置,之后在录制界面滑动美颜参数之后系统会记住上一次滑动的状态 + @Override + public void onCreate() { + super.onCreate(); + instance = this; + context = getApplicationContext(); + SupportMultiScreenUtil.init(context); + /** + * 在使用SDK各组件之前初始化context信息,传入ApplicationContext + */ + //环信初始化配置 + EaseHxHelper.getInstance().init(this); + //百度地图初始化,注意该方法要在setContentView方法之前实现。 + SDKInitializer.initialize(this); + //JPush初始化 + JPushInterface.setDebugMode(false); + JPushInterface.init(this); + initSp();//缓存初始化 + //三方登陆以及分享平台需要的id和key + PlatformConfig.setWeixin(Constant.WX_APPID, Constant.WX_SECRET);//微信 appid appsecret + PlatformConfig.setSinaWeibo(Constant.SINA_WEIBO_KEY,Constant.SINA_WEIBO_SECRET);//新浪微博 appkey appsecret + PlatformConfig.setQQZone(Constant.QQ_APPID, Constant.QQ_KEY); // QQ和Qzone appid appkey + Config.REDIRECT_URL="https://api.weibo.com/oauth2/default.html"; + CommonDataUtil.setDataMapper(); + //趣拍初始化 + mDurationLimit = Constant.DEFAULT_DURATION_LIMIT; + mMinDurationLimit = Constant.DEFAULT_MIN_DURATION_LIMIT; + mVideoBitrate = Constant.DEFAULT_BITRATE; + beautySkinProgress = Constant.DEFAULT_BEAUTYSKINPROGRESS; + initQuPaiRecord(); + initAddressData(); + } + + private static void initAddressData() { + new Thread(new Runnable() { + @Override + public void run() { + provinceItems = PickerViewDataUtil.getProvinceList(); + onlyCity = PickerViewDataUtil.getCityOnlyList(); + onlyAreaCity = PickerViewDataUtil.getAreaOnlyList(); + createCityItems(); + createProvinceCityOrCityArea(); + } + }).start(); + } + + /** + * 创建省市或者市区两级 + */ + private static void createProvinceCityOrCityArea() { + for (int i = 0; i < provinceItems.size(); i++) { + List mList = new ArrayList<>();//按省分的城市的list集合 + List mCityNameList = new ArrayList<>();//上面对应的名称 + String proId = provinceItems.get(i).getProID();//当前省份的id + String proName = provinceItems.get(i).getName();//当前省份的名称 + if (!proName.contains("市")) { + for (int j = 0; j < onlyCity.size(); j++) {//其实就是一个省的市的操作,因为内部有判断是否和省id相等,所以 + if (proId.equals(onlyCity.get(j).getProID())) {//如果当前城市的省份id和此次省份的id相同则加入 + mList.add(onlyCity.get(j));//城市的循环,最终将所有属于该省份的城市添加到此list中 + mCityNameList.add(onlyCity.get(j).getName()); + } + } + } else { + for (int m = 0; m < onlyAreaCity.size(); m++) { + if (proId.equals(onlyAreaCity.get(m).getAreaSort())) {//如果当前城市的省份id和此次省份的id相同则加入 + mList.add(onlyAreaCity.get(m));//城市的循环,最终将所有属于该省份的城市添加到此list中 + mCityNameList.add(onlyAreaCity.get(m).getName()); + } + } + } + province_city_or_area.add(mList);//按省分的城市或者直辖市的区的list集合的集合 + province_city_or_area_name.add(mCityNameList);//按省分的城市或者直辖市的区的名称的list集合的集合 + } + } + + /** + * 创建省份城市区域三级 + */ + private static void createCityItems() { + for(int i=0;i mList = new ArrayList<>();//按省分的城市的list集合 + List mCityNameList = new ArrayList<>();//上面对应的名称 + String proId = provinceItems.get(i).getProID();//当前省份的id + List> city_areaNameList = new ArrayList<>(); + List> city_areaList = new ArrayList<>(); + for(int j=0;j areaNameList = new ArrayList<>(); + List areaList = new ArrayList<>();//按城市分的区域list集合,需要添加到根据城市划分的list中去 + for(int m=0;m activityList = new ArrayList<>(); + + /** + * 将当前启动的activity加入list + */ + public static void addActivity(Activity activity){ + activityList.add(activity); + } + + /** + * 将销毁的activity移出list + */ + public static void removeActivity(Activity activity){ + activityList.remove(activity); + } + + /** + * 获取栈顶activity + */ + public static Activity getTopActivity(){ + if(!activityList.isEmpty()){ + return activityList.get(activityList.size()-1); + }else{ + return null; + } + } + + /** + * 关闭size个activity + */ + public static void finish(int size){ + for(int i=0;i sexMap; + public static HashMap degreeMap;//学历和学历要求 + public static HashMap incomeMap;//年薪和年薪要求 + public static HashMap marriageMap;//婚姻和婚姻状况要求 + public static HashMap ageMap;//年龄要求 + public static HashMap heightMap;//身高要求 + public static HashMap carMap; + public static HashMap houseMap; + public static HashMap carRequestMap; + public static HashMap houseRequestMap; + public static HashMap nationMap; + public static HashMap professionMap; + public static ArrayList heightList; + public static ArrayList nationList; + public static ArrayList agerqList; + public static ArrayList ageList; + public static ArrayList weightList;//体重 + public static HashMap giftNameMap; + public static HashMap relationMap; + public static List mSexList; + public static List degreeList; + public static List incomeList; + + //性别 + public static String[] sexCode = {"0","1"}; + public static String[] sexMsg = {"女","男"}; + //学历 + public static String[] degreeMsg = {"大专","本科","硕士","博士","其他"}; + //收入 + public static String[] incomeMsg = {"5w以下","5w-8w","8w-12w","12w-20w","20w-35w","35w-50w","50w以上"}; + + //学校所在的省份 + public static String schoolArea = "[{\"id\":\"00\",\"name\":\"安徽省\",\"pinyin\":\"anhuisheng\"},{\"id\":\"01\",\"name\":\"澳门特别行政区\",\"pinyin\":\"aomengtebiexingzhengqu\"},{\"id\":\"02\",\"name\":\"北京\",\"pinyin\":\"beijing\"},{\"id\":\"03\",\"name\":\"重庆\",\"pinyin\":\"chongqing\"}," + + "{\"id\":\"04\",\"name\":\"福建省\",\"pinyin\":\"fujiansheng\"},{\"id\":\"05\",\"name\":\"甘肃省\",\"pinyin\":\"gansusheng\"}," + + "{\"id\":\"06\",\"name\":\"广东省\",\"pinyin\":\"guangdongsheng\"},{\"id\":\"07\",\"name\":\"广西壮族自治区\",\"pinyin\":\"guangxizhuangzuzizhiqu\"}," + + "{\"id\":\"08\",\"name\":\"贵州省\",\"pinyin\":\"guizhousheng\"},{\"id\":\"09\",\"name\":\"海南省\",\"pinyin\":\"hainansheng\"}," + + "{\"id\":\"10\",\"name\":\"河北省\",\"pinyin\":\"hebeisheng\"},{\"id\":\"11\",\"name\":\"河南省\",\"pinyin\":\"henansheng\"}," + + "{\"id\":\"12\",\"name\":\"黑龙江省\",\"pinyin\":\"heilongjiangsheng\"},{\"id\":\"13\",\"name\":\"湖北省\",\"pinyin\":\"hubeisheng\"}," + + "{\"id\":\"14\",\"name\":\"湖南省\",\"pinyin\":\"hunansheng\"},{\"id\":\"15\",\"name\":\"吉林省\",\"pinyin\":\"jilinsheng\"},{\"id\":\"16\",\"name\":\"江苏省\",\"pinyin\":\"jiangsusheng\"}," + + "{\"id\":\"17\",\"name\":\"江西省\",\"pinyin\":\"jiangxisheng\"},{\"id\":\"18\",\"name\":\"辽宁省\",\"pinyin\":\"liaoningsheng\"}," + + "{\"id\":\"19\",\"name\":\"内蒙古自治区\",\"pinyin\":\"neimengguzizhiqu\"},{\"id\":\"20\",\"name\":\"宁夏回族自治区\",\"pinyin\":\"ningxiahuizuzizhiqu\"}," + + "{\"id\":\"21\",\"name\":\"青海省\",\"pinyin\":\"qinghaisheng\"},{\"id\":\"22\",\"name\":\"山东省\",\"pinyin\":\"shandongsheng\"},{\"id\":\"23\",\"name\":\"山西省\",\"pinyin\":\"shanxisheng\"}," + + "{\"id\":\"24\",\"name\":\"陕西省\",\"pinyin\":\"shanxisheng\"},{\"id\":\"25\",\"name\":\"上海\",\"pinyin\":\"shanghai\"},{\"id\":\"26\",\"name\":\"四川省\",\"pinyin\":\"sichuansheng\"}," + + "{\"id\":\"27\",\"name\":\"台湾省\",\"pinyin\":\"taiwansheng\"},{\"id\":\"28\",\"name\":\"天津\",\"pinyin\":\"tianjin\"},{\"id\":\"29\",\"name\":\"西藏自治区\",\"pinyin\":\"xizangzizhiqu\"}," + + "{\"id\":\"30\",\"name\":\"香港特别行政区\",\"pinyin\":\"xianggangtebiexingzhengqu\"},{\"id\":\"31\",\"name\":\"新疆维吾尔自治区\",\"pinyin\":\"xinjiangweiwuerzizhiqu\"}," + + "{\"id\":\"32\",\"name\":\"云南省\",\"pinyin\":\"yunnansheng\"},{\"id\":\"33\",\"name\":\"浙江省\",\"pinyin\":\"zhejiangsheng\"}]"; + + public static void setSexList(){ + mSexList = new ArrayList<>(); + for(int i=0;i(); + int i = 33; + while(i<=99){ + i = i+2; + weightList.add(i+"kg"); + } + } + + public static void setIncomeList(){ + incomeList = new ArrayList<>(); + for(int i=0;i();//性别 + sexMap.put("0","女"); + sexMap.put("1","男"); + degreeMap = new HashMap<>(); + degreeMap.put("-1","不限"); + degreeMap.put("0","");//未填 + degreeMap.put("1","大专"); + degreeMap.put("2","本科"); + degreeMap.put("3","硕士"); + degreeMap.put("4","博士"); + degreeMap.put("5","其他"); + incomeMap = new HashMap<>(); + incomeMap.put("-1","不限"); + incomeMap.put("0","");//未填 + incomeMap.put("1","5w以下"); + incomeMap.put("2","5w-8w"); + incomeMap.put("3","8w-12w"); + incomeMap.put("4","12w-20w"); + incomeMap.put("5","20w-35w"); + incomeMap.put("6","35w-50w"); + incomeMap.put("7","50w以上"); + marriageMap = new HashMap<>(); + marriageMap.put("-1","不限"); + marriageMap.put("0","");//未填 + marriageMap.put("1","未婚"); + marriageMap.put("2","离异"); + marriageMap.put("3","其他"); + ageMap = new HashMap<>(); + ageMap.put("-1","不限"); + ageMap.put("0","");//未填 + ageMap.put("1","18-25"); + ageMap.put("2","26-35"); + ageMap.put("3","36-45"); + ageMap.put("4","46-55"); + heightMap = new HashMap<>(); + heightMap.put("-1","不限"); + heightMap.put("0","");//未填 + heightMap.put("1","150cm-165cm"); + heightMap.put("2","165cm-175cm"); + heightMap.put("3","175cm-185cm"); + heightMap.put("4","180cm-195cm"); + heightMap.put("5","195cm以上"); + carMap = new HashMap<>(); + carMap.put("-1","未购车"); + carMap.put("0",""); + carMap.put("2","已购车"); + houseMap = new HashMap<>(); + houseMap.put("-1","未购房"); + houseMap.put("0",""); + houseMap.put("2","已购房"); + carRequestMap = new HashMap<>(); + carRequestMap.put("-1","不限"); + carRequestMap.put("0",""); + carRequestMap.put("2","购车"); + houseRequestMap = new HashMap<>(); + houseRequestMap.put("-1","不限"); + houseRequestMap.put("0",""); + houseRequestMap.put("2","购房"); + professionMap = new HashMap<>(); + professionMap.put("1","计算机/互联网/通信"); + professionMap.put("2","生产/工艺/制造"); + professionMap.put("3","医疗/护理/制药"); + professionMap.put("4","金融/银行/投资/保险"); + professionMap.put("5","商业/服务业/个体经营"); + professionMap.put("6","文化/广告/传媒"); + professionMap.put("7","娱乐/艺术/表演"); + professionMap.put("8","律师/法务"); + professionMap.put("9","教育/培训"); + professionMap.put("10","公务员/行政/事业单位"); + professionMap.put("11","模特"); + professionMap.put("12","空姐"); + professionMap.put("13","其他职业"); + giftNameMap = new HashMap<>(); + giftNameMap.put(":qiyuan01:","臭鸡蛋"); + giftNameMap.put(":qiyuan02:","飞吻"); + giftNameMap.put(":qiyuan03:","赞"); + giftNameMap.put(":qiyuan04:","1朵玫瑰"); + giftNameMap.put(":qiyuan05:","棒棒糖"); + giftNameMap.put(":qiyuan06:","啤酒"); + giftNameMap.put(":qiyuan07:","爱神"); + giftNameMap.put(":qiyuan08:","蛋糕"); + giftNameMap.put(":qiyuan09:","3朵玫瑰"); + giftNameMap.put(":qiyuan10:","巧克力"); + giftNameMap.put(":qiyuan11:","单身狗"); + giftNameMap.put(":qiyuan12:","口红"); + giftNameMap.put(":qiyuan13:","99朵玫瑰"); + giftNameMap.put(":qiyuan14:","戒指"); + giftNameMap.put(":qiyuan15:","飞机"); + giftNameMap.put(":qiyuan16:","游艇"); + relationMap = new HashMap<>(); + relationMap.put("1","我"); + relationMap.put("2","好友"); + relationMap.put("3","关注"); + relationMap.put("4","粉丝"); + relationMap.put("5","拉黑"); + relationMap.put("6","陌生人"); + } + + public static void setNationMap(){ + nationMap = new HashMap<>(); + nationMap.put("1","汉族"); + nationMap.put("2","蒙古族"); + nationMap.put("3","回族"); + nationMap.put("4","藏族"); + nationMap.put("5","维吾尔族"); + nationMap.put("6","苗族"); + nationMap.put("7","彝族"); + nationMap.put("8","壮族"); + nationMap.put("9","布依族"); + nationMap.put("10","朝鲜族"); + nationMap.put("11","满族"); + nationMap.put("12","侗族"); + nationMap.put("13","瑶族"); + nationMap.put("14","白族"); + nationMap.put("15","土家族"); + nationMap.put("16","哈尼族"); + nationMap.put("17","哈萨克族"); + nationMap.put("18","傣族"); + nationMap.put("19","黎族"); + nationMap.put("20","傈僳族"); + nationMap.put("21","佤族"); + nationMap.put("22","畲族"); + nationMap.put("23","高山族"); + nationMap.put("24","拉祜族"); + nationMap.put("25","水族"); + nationMap.put("26","东乡族"); + nationMap.put("27","纳西族"); + nationMap.put("28","景颇族"); + nationMap.put("29","柯尔克孜族"); + nationMap.put("30","土族"); + nationMap.put("31","达斡尔族"); + nationMap.put("32","仫佬族"); + nationMap.put("33","羌族"); + nationMap.put("34","布朗族"); + nationMap.put("35","撒拉族"); + nationMap.put("36","毛难族"); + nationMap.put("37","仡佬族"); + nationMap.put("38","锡伯族"); + nationMap.put("39","阿昌族"); + nationMap.put("40","普米族"); + nationMap.put("41","塔吉克族"); + nationMap.put("42","怒族"); + nationMap.put("43","乌孜别克族"); + nationMap.put("44","基诺族"); + nationMap.put("45","俄罗斯族"); + nationMap.put("46","鄂温克族"); + nationMap.put("47","崩龙族"); + nationMap.put("48","保安族"); + nationMap.put("49","裕固族"); + nationMap.put("50","京族"); + nationMap.put("51","塔塔尔族"); + nationMap.put("52","独龙族"); + nationMap.put("53","鄂伦春族"); + nationMap.put("54","赫哲族"); + nationMap.put("55","门巴族"); + nationMap.put("56","珞巴族"); + } + + public static void setHeightList(){ + heightList = new ArrayList<>( + Arrays.asList("150cm","151cm","152cm","153cm","154cm","155cm","156cm","157cm","158cm","159cm", + "160cm","161cm","162cm","163cm","164cm","165cm","166cm","167cm","168cm","169cm", + "170cm","171cm","172cm","173cm","174cm","175cm","176cm","177cm","178cm","179cm", + "180cm","181cm","182cm","183cm","184cm","185cm","186cm","187cm","188cm","189cm", + "190cm","191cm","192cm","193cm","194cm","195cm","196cm","197cm","198cm","199cm", + "200cm","201cm","202cm","203cm","204cm","205cm","206cm","207cm","208cm","209cm", + "210cm","211cm","212cm","213cm","214cm","215cm","216cm","217cm","218cm","219cm", + "220cm") + ); + } + + public static ArrayList setHeightListrq(){ + heightList = new ArrayList<>( + Arrays.asList("不限","150cm","151cm","152cm","153cm","154cm","155cm","156cm","157cm","158cm","159cm", + "160cm","161cm","162cm","163cm","164cm","165cm","166cm","167cm","168cm","169cm", + "170cm","171cm","172cm","173cm","174cm","175cm","176cm","177cm","178cm","179cm", + "180cm","181cm","182cm","183cm","184cm","185cm","186cm","187cm","188cm","189cm", + "190cm","191cm","192cm","193cm","194cm","195cm","196cm","197cm","198cm","199cm", + "200cm","201cm","202cm","203cm","204cm","205cm","206cm","207cm","208cm","209cm", + "210cm","211cm","212cm","213cm","214cm","215cm","216cm","217cm","218cm","219cm", + "220cm") + ); + return heightList; + } + + public static ArrayList setAgeListRq(){ + agerqList = new ArrayList<>( + Arrays.asList("不限","20岁","21岁","22岁","23岁","24岁","25岁","26岁","27岁","28岁","29岁", + "30岁","31岁","32岁","33岁","34岁","35岁","36岁","37岁","38岁","39岁", + "40岁","41岁","42岁","43岁","44岁","45岁","46岁","47岁","48岁","49岁","50岁") + ); + return agerqList; + } + + public static void setAgeList(){ + ageList = new ArrayList<>(); + for(int i=18;i<56;i++){ + ageList.add(i+"岁"); + } + } + + public static void setDegreeList(){ + degreeList = new ArrayList<>(); + for(int i=0;i(); + nationList.add(nationMap.get("1")); + nationList.add(nationMap.get("2")); + nationList.add(nationMap.get("3")); + nationList.add(nationMap.get("4")); + nationList.add(nationMap.get("5")); + nationList.add(nationMap.get("6")); + nationList.add(nationMap.get("7")); + nationList.add(nationMap.get("8")); + nationList.add(nationMap.get("9")); + nationList.add(nationMap.get("10")); + nationList.add(nationMap.get("11")); + nationList.add(nationMap.get("12")); + nationList.add(nationMap.get("13")); + nationList.add(nationMap.get("14")); + nationList.add(nationMap.get("15")); + nationList.add(nationMap.get("16")); + nationList.add(nationMap.get("17")); + nationList.add(nationMap.get("18")); + nationList.add(nationMap.get("19")); + nationList.add(nationMap.get("20")); + nationList.add(nationMap.get("21")); + nationList.add(nationMap.get("22")); + nationList.add(nationMap.get("23")); + nationList.add(nationMap.get("24")); + nationList.add(nationMap.get("25")); + nationList.add(nationMap.get("26")); + nationList.add(nationMap.get("27")); + nationList.add(nationMap.get("28")); + nationList.add(nationMap.get("29")); + nationList.add(nationMap.get("30")); + nationList.add(nationMap.get("31")); + nationList.add(nationMap.get("32")); + nationList.add(nationMap.get("33")); + nationList.add(nationMap.get("34")); + nationList.add(nationMap.get("35")); + nationList.add(nationMap.get("36")); + nationList.add(nationMap.get("37")); + nationList.add(nationMap.get("38")); + nationList.add(nationMap.get("39")); + nationList.add(nationMap.get("40")); + nationList.add(nationMap.get("41")); + nationList.add(nationMap.get("42")); + nationList.add(nationMap.get("43")); + nationList.add(nationMap.get("44")); + nationList.add(nationMap.get("45")); + nationList.add(nationMap.get("46")); + nationList.add(nationMap.get("47")); + nationList.add(nationMap.get("48")); + nationList.add(nationMap.get("49")); + nationList.add(nationMap.get("50")); + nationList.add(nationMap.get("51")); + nationList.add(nationMap.get("52")); + nationList.add(nationMap.get("53")); + nationList.add(nationMap.get("54")); + nationList.add(nationMap.get("55")); + nationList.add(nationMap.get("56")); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/common/Constant.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/common/Constant.java new file mode 100644 index 0000000000000000000000000000000000000000..f546f541e2e53ec985eca3e2cb242bd111d2bc32 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/common/Constant.java @@ -0,0 +1,500 @@ +package com.jiuqi.elove.common; + + +import android.os.Environment; + +import com.jiuqi.elove.R; +import com.umeng.socialize.bean.SHARE_MEDIA; + +import java.util.UUID; + +/** + * 项目常量类 + * Created by dl on 2016/6/28. + */ +public class Constant { + + /**************************************各种链接正式地址***************************************************/ + /**服务器链接地址(正式地址)*/ +// public static final String COMMON_URL = "http://www.e-redbean.com/mobile/";//正式地址 + public static final String COMMON_URL = "http://www.9qiyuan.com/mobile/";//正式地址 + public static final String COMMON_H5_HOST = "http://www.9qiyuan.com/"; + /** + * 各个h5地址(正式) + * SHARE_URL分享活动地址(只有分享企业的) + * SHARE_PERSON_URL分享他人地址 + */ + public static final String SHARE_ACT_URL = "http://www.9qiyuan.com/activity/actdetail.html?actid="; + public static final String SHARE_PERSON_URL = "http://www.9qiyuan.com/prouser/?id="; +// public static final String ABOUT_US = "http://www.9qiyuan.com/about/?version=";//关于我们一直都是这个 + public static final String PAY_PROTOCOL = "http://www.9qiyuan.com/about/paymentAgreement.html";//支付协议 + public static final String REGISTER_PROVISIONS = "http://www.9qiyuan.com/about/registrationAgreement.html";//注册条款 + public static final String SHARE_QGCS = "http://www.9qiyuan.com/qgcs/?id=";//情感测试分享链接 + public static final String SHARE_CHOICENESS_URL = "http://www.9qiyuan.com/loveweb?id=";//分享精选文章 + public static final String MY_MEMBER = "http://www.9qiyuan.com/myvip/index.html?id=";//我的会员 + public static final String REWARD_RULE = "http://www.9qiyuan.com/award/index.html";//奖励规则 + public static final String EMOTION_TEST = "http://www.9qiyuan.com/emotiontest?userid=";//情感测试 +// public static final String ENTERPRISE_INFO = "http://www.9qiyuan.com/mobilesrc/enterprise_introduce?enterid=";//企业介绍 + public static final String CARD_EXPLANATION = "http://www.9qiyuan.com/about/user_name_card.html"; + public static final String AUTH_EXPLANATION = "http://www.9qiyuan.com/about/authentication.html"; + public static final String ABOUT_US = "http://www.9qiyuan.com/about/?version="; + + /***************************************************开发地址**************************************************/ + /**服务器链接地址(测试地址)*/ +// public static final String COMMON_URL = "http://10.40.0.200/mobile/"; + public static final String COMMON_URL2 = "http://10.40.0.200/mobile2/"; +// public static final String COMMON_H5_HOST = "http://10.40.0.200/"; +// public static final String COMMON_URL = "http://10.40.0.13:9797/mobile/"; +// public static final String COMMON_URL = "http://116.62.181.42/mobile/"; +// public static final String COMMON_URL = "http://116.62.181.42:9797/mobile/"; +// public static final String COMMON_URL = "http://ftslwj.oicp.net/mobile/"; +// public static final String COMMON_URL = "http://10.60.11.42:9797/mobile/"; +// public static final String COMMON_URL = "http://liruidong.vicp.io/mobile/"; +// public static final String COMMON_URL = "https://15527z711x.51mypc.cn:24418/mobile/"; +// public static final String MY_MEMBER = "http://10.40.0.200/myvip/index.html?id=";//我的会员 +// public static final String SHARE_PERSON_URL = "http://10.40.0.200/prouser/?id="; + /** + * 各个h5地址(测试) + * SHARE_URL分享活动地址(只有分享企业的) + * SHARE_PERSON_URL分享他人地址 + */ + public static final String CIRCLE_DETAIL = "http://10.40.0.200/mobilesrc/fate_circle?yuanquanid=";//缘圈分享 + public static final String ENTERPRISE_INFO = "http://10.40.0.200/mobilesrc/enterprise_introduce?enterid=";//企业介绍 +// public static final String MY_MEMBER = "http://10.40.0.200/myvip/index.html?id="; +// public static final String REWARD_RULE = "http://10.40.0.200/award/index.html"; +// public static final String SHARE_CHOICENESS_URL = "http://15527z711x.51mypc.cn:50686/loveweb?id=";//分享精选文章 +// public static final String SHARE_CHOICENESS_URL = "http://10.40.0.200/loveweb?id="; +// public static final String SHARE_ACT_URL = "http://15527z711x.51mypc.cn:50686/activity/actdetail.html?actid="; +// public static final String SHARE_PERSON_URL = "http://15527z711x.51mypc.cn:50686/prouser/?id="; +// public static final String SHARE_QGCS = "http://15527z711x.51mypc.cn:50686/qgcs/?id="; +// public static final String EMOTION_TEST = "http://10.40.0.200/emotiontest?userid="; +// public static final String CARD_EXPLANATION = "http://10.40.0.200/about/user_name_card.html"; +// public static final String AUTH_EXPLANATION = "http://10.40.0.200/about/authentication.html"; +// public static final String ABOUT_US = "http://10.40.0.200/about/?version="; + + /****************************************各种公共常量****************************************************/ + + /**连接超时时间*/ + public static final int MAX_CONNECT_TIME = 10*1000; + + /**版本兼容参数**/ + public static final String VERSION = "3.21"; + + /** + * 分享action + */ + public static final String SHARE_PERSON = "1"; + public static final String SHARE_ARTICLE = "2"; + /** + * 1、添加关注或者添加好友ACTION_ADDFOCUS + * 2、取消关注或者删除好友ACTION_UNFOCUS + * 3、屏蔽,拉入黑名单 + * 4、取消,拉出黑名单 + */ + public static final String ACTION_ADDFOCUS = "1"; + public static final String ACTION_UNFOCUS = "2"; + public static final String ACTION_SHIELD = "3"; + public static final String ACTION_UNSHIELD = "4"; + + /** + * 1、查看聊天剩余次数 ACTION_VIEW_TALKTIMES + * 2、减少聊天次数 ACTION_DECREASE_TIMES + */ + public static final String ACTION_VIEW_TALKTIMES = "1"; + public static final String ACTION_DECREASE_TIMES = "2"; + + /** + * 第三方登录及分享平台 + * 微信和朋友圈 appid以及appsecret + * 新浪微博 appkey以及appsecret + * qq和空间 appid以及appkey + */ + public static final String WX_APPID = "wxdaaa79a772bcaa5f"; + public static final String WX_SECRET = "46cc009b1aea346d9dacef931809a9b1"; + public static final String SINA_WEIBO_KEY = "1695601605"; + public static final String SINA_WEIBO_SECRET = "dd674b3e0a9fe81b6f743b803e41ff15"; + public static final String QQ_APPID = "1105708329"; + public static final String QQ_KEY = "aW4Nyya5emckn4sE"; + /** + * 分享平台数组 + */ + public static final SHARE_MEDIA[] DISPLAY_LIST = new SHARE_MEDIA[] + { + SHARE_MEDIA.WEIXIN, SHARE_MEDIA.WEIXIN_CIRCLE, SHARE_MEDIA.SINA, + SHARE_MEDIA.QQ, SHARE_MEDIA.QZONE + }; + + /**部分常量**/ +// public static final String APK_DOWNLOAD_PATH = "/sdcard/elove"; + public static final String APK_DOWNLOAD_PATH = Environment.getExternalStorageDirectory().getPath()+"/elove"; + public static final String CIRCLE_VIDEO_PATH = Environment.getExternalStorageDirectory().getPath()+"/elove/circle_video/"; + public static final String APK_NAME = "elove"; + public static final String UPDATE_SERVICE = "update_service"; + public static final String ACCOUNT_CONFLICT = "conflict"; + public static final String ACTION_GROUP_CHANAGED = "action_group_changed"; + public static final String ACTION_CONTACT_CHANAGED = "action_contact_changed"; + public static final String NEW_FRIENDS_USERNAME = "item_new_friends"; + public static final String GROUP_USERNAME = "item_groups"; + public static final String CHAT_ROOM = "item_chatroom"; + public static final String ACCOUNT_REMOVED = "account_removed"; + public static final String CHAT_ROBOT = "item_robots"; + public static final int CHATTYPE_SINGLE = 1; + public static final int CHATTYPE_GROUP = 2; + public static final String APP_NAME = "启缘"; + public static final String ACTION_NOTIFY_RECEIVED = "com.jiuqi.elove.MSG_ACTION"; + public static final String ACTION_OTHER_UNREADMSG_RECEIVED = "com.jiuqi.elove.OTHER_UREADMSG_ACTION"; + public static final String ACTION_SERVICE_UNREADMSG_RECEIVED = "com.jiuqi.elove.SERVICE_UREADMSG_ACTION"; + public static final String NOTIFY_TYPE = "classify"; + public static final String OTHER_UNREAD_MSG_COUNT = "otherCount"; + public static final String SERVICE_UNREAD_MSG_COUNT = "serviceUnreadMsgCount"; + + /** + * 推送信息类别 + */ + public static final String NOTIFY_SYS = "1"; + public static final String NOTIFY_ACT = "2"; + public static final String NOTIFY_ARTICLE = "3"; + /** + * 角色 + */ + public static final String COMMON_USER = "0";//0 普通用户 + public static final String SPEC_USER = "1";//1专家,拥有语音解答的特权 + public static final String RED_MOTHER = "2";//2 红娘 + public static final String SERVICE_PERSON = "5A698E59E00000212E3230F530FDA55F";//客服id + + /** + * 视频相关 + */ + public static final String VIDEO_PATH = "/elove/video/";//调用系统相机录制后视频保存路径的前半段固定路径 + public static final String OTHER_VIDEO_PATH = "you-seen";//调用系统相机录制后视频保存路径的前半段固定路径 + public static float DEFAULT_DURATION_LIMIT = 10;//默认时长 + public static float DEFAULT_MIN_DURATION_LIMIT = 2;//默认最小时长 + public static int DEFAULT_BITRATE =2;//默认码率 + public static int DEFAULT_BEAUTYSKINPROGRESS =80;//默认码率 + public static final String APP_KEY = "20ca005ff677d2b"; + public static final String APP_SECRET = "5daec6ad699d4a428c72ed7c1f849528"; + public static String accessToken;//accessToken 通过调用授权接口得到 + public static final String space = UUID.randomUUID().toString().replace("-",""); //存储目录 建议使用uid cid之类的信息,不要写死 + public static int RECORDE_SHOW = 200;//请求码 + public final static String PREF_VIDEO_EXIST_USER = "Qupai_has_video_exist_in_user_list_pref";//水印本地路径,文件必须为rgba格式的PNG图片 + /** + * 文件保存地址 + */ + public static final String ELOVE_FILE_DIR = "/elove/"; + public static final String ELOVE_LISTENED_AUDIO = "/elove/temps/"; + public static final String GLIDE_CACHE = "/data/data/com.jiuqi.elove/image_manager_disk_cache"; + + /** + * 友好时间相关 + */ + public static String FORMATBEFOR = "yyyy-MM-dd HH:mm"; + public static String FORMATAFTER = "yyyy年MM月dd日 HH:mm"; + public static String FORMATAFTERNOHOUR = "yyyy年MM月dd日"; + public static String MY_FORMATBEFOR = "yyyy-MM-dd"; + public static String MY_FORMATAFTER = "yyyy年MM月dd日"; + //展示价格列表时是否出现单选按钮 + public static final String RADIO_FLAG_INPRICELIST_YES = "yes"; + public static final String RADIO_FLAG_INPRICELIST_NO = "no"; + /** + * 资料中的兴趣爱好颜色数组 + */ + public static final int[] COLOR_HOBBYS = {R.color.hobby1,R.color.hobby2,R.color.hobby3,R.color.hobby4, + R.color.hobby5,R.color.hobby6,R.color.hobby7,R.color.hobby8,R.color.hobby9, + R.color.hobby10,R.color.hobby11,R.color.hobby12,R.color.hobby13}; + /** + * 资料中的标签颜色数组 + */ + public static final int[] COLOR_LABELS = {R.color.hobby13,R.color.hobby3,R.color.hobby11,R.color.hobby2, + R.color.hobby9,R.color.hobby8,R.color.hobby7,R.color.hobby6,R.color.hobby5, + R.color.hobby4,R.color.hobby12,R.color.hobby10,R.color.hobby1}; + + /** + * 收到和送出的礼物 + */ + public static final int RECEIVE_ACTION = 1; + public static final int SEND_ACTION = 2; + + /** + * 企业认证状态 + */ + public static final String E_KIND_NOT = "0";//非企业用户 + public static final String E_KIND_IS = "1";//企业用户 + public static final String E_KIND_ING = "2";//正在认证中 + + /** + * 实名认证状态 + */ + public static final String NAME_START = "0";//实名认证初始状态 + public static final String NAME_IS = "1";//实名认证通过 + public static final String NAME_ING = "2";//实名认证中 + public static final String NAME_NOT = "3";//实名认证未通过 + + /** + * 邮箱认证 + */ + public static final String EMAIL_START = "0";//邮箱认证初始 + public static final String EMAIL_IS = "2";//邮箱已认证 + public static final String EMAIL_ING = "1";//邮箱审核中 + + /** + * 全票非全票 + */ + public static final String CARD_FULL = "1"; + public static final String CARD_NOT_FULL = "2"; + + /** + * 优惠券使用状态和过期状态 + * ifuse 1已使用2已过期0正常 + */ + public static final int CARD_NOT_USED = 0;//正常 + public static final int CARD_USED = 1;//已使用 + public static final int CARD_TIME_OUT = 2;//已过期 + + /** + * 订单状态 + */ + public static final int ORDER_WAIT_PAY = 1; + public static final int ORDER_PAY_SUCCESS = 2; + public static final int ORDER_PAY_CANCEL = 3; + public static final int ORDER_TIME_OUT = 4; + + /** + * 头像状态含义 + * 0 未提交 + * 1 通过 + * 2 审核中 + * 3 未通过 + */ + public static final int AVATAR_UNCOMMIT = 0; + public static final int AVATAR_PASS = 1; + public static final int AVATAR_EXAMINE = 2; + public static final int AVATAR_UNPASS = 3; + + /** + * 全局的变量保存key + */ + public static final String AVATAR_TYPE = "avatartype";//avatartype 1和2是上传(审核中和通过状态),其他均未上传(未上传以及审核失败 + public static final String USER_ID = "userid"; + public static final String RED_BEAN = "bean"; + public static final String E_KIND = "kind"; + public static final String NIKE_NAME = "nikename"; + public static final String SEX = "sex"; + public static final String AVATAR = "avatar"; + public static final String AUTH_IS = "isGetAuth"; + public static final String VERSION_CODE = "versonCode"; + public static final String IF_UP = "ifup"; + public static final String IF_AC = "ifac"; + public static final String AD_VERSION = "version"; + public static final String AD_ID = "adid"; + public static final String AD_TYPE = "adtype"; + public static final String LOCATE_LNG = "lng"; + public static final String LOCATE_LAT = "lat"; + public static final String ADDRESS = "address"; + public static final String MOBILE = "mobilephone"; + public static final String USER_ROLE = "userrole"; + public static final String ID_CARD = "IDCard"; + public static final String AUDIT_TYPE = "audittype"; + public static final String EMAIL_TYPE = "emailtype"; + public static final String FIRST_IS = "isFirst"; + public static final String YOUTH = "youth";//青年之声认证 + + /** + * 用户账号状态 + * 0未激活1激活2被封禁3被举报 + */ + public static final String ACCOUNT_UNACTIVATED = "0"; + public static final String ACCOUNT_ACTIVATED = "1"; + public static final String ACCOUNT_BANNED = "2"; + public static final String ACCOUNT_IS_REPORTED = "3"; + + /** + * 活动报名状态 + */ + public static final String ACT_SIGN_NOT = "-1"; + public static final String ACT_SIGN_CHECK = "1"; + public static final String ACT_SIGN_PASS = "2"; + public static final String ACT_SIGN_NOTPASS = "3"; + public static final String ACT_SIGN_PAYING = "4"; + + /** + * 活动状态 + */ + public static final String ACT_SIGNING = "0"; + + /** + * 上传视频、图片 + */ + public static final int PUT_VIDEO_ACTION = 1; + public static final int PUT_PIC_ACTION = 2; + public static final int PUT_NO_ACTION = 0; + + /** + * 缘圈点赞 + */ + public static final int CIRCLE_NOT_LIKE = 0;//未点赞 + public static final int CIRCLE_LIKE = 1;//已经点赞 + + /** + * 朋友圈点赞 + */ + public static final int LIKE_IS = 1;//点赞 + public static final int LIKE_CANCEL = 2;//取消点赞 + + /** + * 朋友圈发表内容最多显示的行数 + */ + public static final int MAX_LINES = 3; + + public static final String SUCCESS_CODE = "1"; + public static final String FAIL_CODE = "0"; + + /** + * 获取验证码 + */ + public static final int REGISTER_CODE = 3; + public static final int OLD_PHONE_CODE = 6; + public static final int NEW_PHONE_CODE = 7; + public static final int RESET_PWD_CODE = 4; + + /** + * 验证手机 + */ + public static final int PHONE_VERIFY = 1; + public static final int PHONE_BOUND = 4; + + /** + * 实名认证状态 + */ + public static final int VERIFY_INIT = 0; + public static final int VERIFY_PASS = 1; + public static final int VERIFY_ING = 2; + public static final int VERIFY_NOT_PASS = 3; + + /** + * 性别 + */ + public static final String GIRL = "0"; + public static final String BOY = "1"; + + /** + * 照片地址 + */ + //头像 + public static final String AVATAR_IMG_NAME = "avatar.jpg"; + public static final String TEMP_IMG = "feedback.jpg"; + + /** + * 活动状态 + * 0 1未开始 2开始 3结束 + */ + public static final int ACT_START = 2; + public static final int ACT_END = 3; + + /** + * 关注 + */ + public static final String ATTENTION_NOT = "0"; + public static final String ATTENTION_IS = "1"; + + /** + * 联系人类型 + */ + public static final String CONTACT_FRIEND ="1";//我的好友 + public static final String CONTACT_FANS ="2";//我的粉丝 + public static final String CONTACT_FOCUS ="3";//我的关注 + public static final String CONTACT_BLACK ="4";//我的黑名单 + + /** + * 缘圈关系类型 + */ + public static final String CIRCLE_UNFOCUS ="";//未关注 + public static final String CIRCLE_FOCUS ="0";//关注 + public static final String CIRCLE_FRIEND ="1";//好友 + public static final String CIRCLE_BLACK ="2";//拉黑 + + /** + * 实名认证 + */ + public static final String REALNAME_NOPUT = "-1";//未提交过 + public static final String REALNAME_WAITING = "0";//等待 + public static final String REALNAME_PASS = "1";//通过 + public static final String REALNAME_NOTPASS = "2";//拒绝 + + /** + * 共青团认证 + */ + public static final String YOUTH_NOT = "-1"; + public static final String YOUTH_PASS = "1"; + + /** + * 单位认证 + */ + public static final String COMPANY_NOPUT = "-1";//未提交过 + public static final String COMPANY_WAITING = "0";//等待 + public static final String COMPANY_PASS = "1";//通过 + public static final String COMPANY_NOTPASS = "2";//拒绝 + + /** + * 今日签到 + */ + public static final String SIGN_TODAY = "1"; + public static final String SIGN_NOT_TODAY = "0"; + + /** + * 推送 + * 1、关注 2点赞 8企业认证通过 9企业认证未通过 10申请参加活动被拒绝 11申请参加活动通过 + * 12参加活动已取消 13申请活动已取消 16头像审核通过 17头像未通过审核 + * 19视频认证通过 20视频认证不通过 22邀请视频认证 31实名认证通过 32实名认证未通过 + * 33获得礼物 34获得元宝 35获得兑换券 36公告 37匹配人推荐 38新活动 39封号 + */ + public static final String PUSH_FOUCUS = "1"; + public static final String PUSH_THUMB_UP = "2"; + public static final String PUSH_COMPANY_PASS = "8"; + public static final String PUSH_COMPANY_REJECT = "9"; + public static final String PUSH_ACT_APPLY_REJECT = "10"; + public static final String PUSH_ACT_APPLY_PASS = "11"; + public static final String PUSH_ACT_ATTEND_CANCEL = "12"; + public static final String PUSH_ACT_APPLY_CANCEL = "13"; + public static final String PUSH_AVATAR_PASS = "16"; + public static final String PUSH_AVATAR_REJECT = "17"; + public static final String PUSH_VIDEO_PASS = "19"; + public static final String PUSH_VIDEO_REJECT = "20"; + public static final String PUSH_VIDEO_INVITE = "22"; + public static final String PUSH_REALNAME_PASS = "31"; + public static final String PUSH_REALNAME_REJECT = "32"; + public static final String PUSH_RECEIVE_GIFT = "33"; + public static final String PUSH_RECEIVE_REDBEAN = "34"; + public static final String PUSH_RECEIVE_RECHARGE = "35"; + public static final String PUSH_OPEN_NEWS = "36"; + public static final String PUSH_MATCH_PERSON = "37"; + public static final String PUSH_NEW_ACT = "38"; + public static final String PUSH_ACCOUNT_BANNED = "39"; + + /** + * 环信传递字符串 + */ +// public static final String RECEIVE_AVATAR = "otheravatar"; +// public static final String RECEIVE_NAME = "othernike"; +// public static final String SEND_NAME = "nikename"; + + + /** + * 环信消息体key值 + */ + public static final String SEND_AVATAR = "send_avatar"; + public static final String SEND_NAME = "send_name"; + public static final String SEND_ID = "send_id"; + + public static final String RECEIVE_AVATAR = "receive_avatar"; + public static final String RECEIVE_NAME = "receive_name"; + public static final String RECEIVE_ID = "receive_id"; + + /** + * 收藏的状态 + * 0未收藏 + * 1已收藏 + */ + public static final String CIRCLE_COLLECTION_NOT = "0"; + public static final String CIRCLE_COLLECTION_IS = "1"; + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/common/Interface.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/common/Interface.java new file mode 100644 index 0000000000000000000000000000000000000000..b3744b5e4e5a6b65a0ac2741919074f01667f501 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/common/Interface.java @@ -0,0 +1,266 @@ +package com.jiuqi.elove.common; + +/** + * + * Created by dl on 2016/6/28. + */ +public class Interface { + + //确认变更身份 + public static final String INFO_CHANGE = "upinfologin"; + //广告页 + public static final String WELCOME_AD_PHOTO = "ad"; + //手机号注册获取验证码 + public static final String GET_VERIFYCODE = "code"; + //注册 + public static final String USER_REGISTER = "userreg"; + //登录 + public static final String USER_LOGIN = "userlogin"; + //附近 + public static final String GET_NEARBY = "near"; + //获取推荐列表 +// public static final String GET_RECOMMEND = "homepage"; + public static final String GET_RECOMMEND = "homepagenew"; + //获取倾心列表 + public static final String GET_FELLFOR = "admire"; + //获取联系人列表 +// public static final String GET_CONTACT_PERSON = "contact"; + public static final String GET_CONTACT_PERSON = "contactlist"; + //获取个人活动列表 + public static final String GET_PERSON_ACTLIST = "personact/actlist"; + //找回密码界面的提交 + public static final String GET_BACK_PWD = "userpassword"; + //修改密码界面的提交 + public static final String UPDATE_PWD = "usermodifypsw"; + //自我介绍 + public static final String MY_INTRODUCE = "myintroduce"; + //意见反馈 + public static final String SUBMIT_FEEDBACK = "idea"; + //申请认证 + public static final String AUTHENTICATION = "autehntication"; + //条件速配 + public static final String MATCH_USERS = "conditionmating"; + //权限设置 + public static final String UPDATE_AUTHORITY = "myaccess"; + //我的资料 + public static final String MY_INFO = "myinfo"; + //我的资料新 + public static final String MY_NEWINFO = "myprofilenew"; + //他人主页 + public static final String OTHER_MAINPAGE = "mainpage"; + //我的相册 + public static final String MY_PHOTO = "myphoto"; + //更新相册,添加图片 + public static final String PHOTO_UPDATE = "myphotoup"; + //删除图片 + public static final String PHOTO_DEL = "myphotodl"; + //我的标签 + public static final String MY_LABEL = "mylabel"; + //我的兴趣爱好myhobby + public static final String MY_HOBBY = "myhobby"; + //更新我的资料 + public static final String UPDATE_MYINFO = "personalupdate"; + //更新我的资料新版2.4.1 + public static final String UPDATE_MYINFO_NEW = "updatemyprofilenew"; + //从联系人tab页面找人 + public static final String CONTACT_FIND = "queryuser"; + //添加关注 + public static final String ADD_FOCUS = "friendadd"; + //上传坐标 + public static final String SAVE_ADDURL = "lngandlat"; + //用户点赞 + public static final String USER_LIKE = "userlike"; + //消息中心 +// public static final String INFO_CENTER = "infocenter"; + public static final String INFO_CENTER = "infocenternew"; + //聊天页面对方的头像和昵称,也用于更新红豆 + public static final String CHAT_INFO = "hxinfo"; + //删除消息中心内容 + public static final String DELETE_INFOCENTER = "infocenterdele"; + //推送设置 + public static final String PUSH_SET = "jpushset"; + public static final String PUSH_SET_NEW = "jpushsetnew"; + //用户举报 + public static final String USER_JUBAO = "userreport"; + //群组举报 + public static final String GROUP_JUBAO = "regroup"; + //打招呼次数 + public static final String TALK_NUM = "msgnum"; + //封禁 + public static final String USER_BAN = "banned"; + //完成任务获得奖励 + public static final String TASK_REWARD = "userawardlist"; + /** + * 活动相关 + */ + //举报活动 + public static final String ACT_REPORT = "act/reportact"; + //企业活动 + //企业活动列表 + public static final String EACT_LIST = "enterpriseact/actlist"; + public static final String EACT_LIST2_0_3 = "enterpriseact/actlistnew"; + //企业活动内容 + public static final String EACT_DETAIL = "enterpriseact/singleact"; + //新版活动详情 + public static final String EACT_DETAIL2_0_3 = "enterpriseact/information"; + //报名活动用户列表 + public static final String EACT_REPORTLIST = "enterpriseact/prlist"; + //新版(2.0.3)企业活动列表(参数:userid) + public static final String ACT_LIST_NEW = "enterpriseact/actlistnew"; + //企业活动评论列表 + public static final String EACT_DCUS = "act/discusswords"; + //报名企业活动 + public static final String EACT_SIGN = "enterpriseact/sign"; + //报名活动2.2.1版本 + public static final String ACT_SIGN = "enterpriseact/joineact"; + public static final String ACT_SIGN_NEW = "enterpriseact/joineactnew"; + //企业活动点赞用户列表 + public static final String ACT_LIKES = "act/likeusers"; + //活动点赞 + public static final String ACT_LIKE = "act/like"; + //发表评论 + public static final String PUSH_DISCUSS = "act/publishdiscuss"; + //删除评论 + public static final String DELETE_DISCUSS = "act/deletediscuss"; + //获取阿里云服务器上的图片情况(是否上传过,filepath) + public static final String GET_ALIYUN = "getfileupurl"; + //屏蔽活动 + public static final String ACT_SHIELD = "act/shieldact"; + //报名用户列表 + public static final String PACT_USERLIST = "personact/userlist"; + + /** + * 企业认证 + */ + public static final String AUTHENTICATE_PHOTO = "auditphoto";//工牌和名片认证,实名认证 + public static final String AUTHENTICATE_EMAIL_NEW = "auditemailnew";//邮箱认证 + /** + * 视频认证 + */ + public static final String AUTHENTICATE_VIDEO = "video"; + public static final String RETURN_VIDEO = "returnvideo"; + + + public static final String AUTHENTICATE_INVITE = "auditinvite";//邀请认证 + /** + * 第三方登录 + */ + public static final String THIRD_BOUND = "third_unwrap"; + public static final String THIRD_LOGIN_NEW = "thirdnew"; + //绑定状态 + public static final String BOUND_STATUS = "thirdlist"; + + //更新版本请求接口 + public static final String UPDATE_CHECK = "getapkdownloadurl"; + //返回商品信息 + public static final String GET_ORDERINFO = "returntrade"; + public static final String GET_ORDERINFO_CARD = "wallet/returntradenew";//有券的时候 + //支付宝支付 + public static final String GET_ALIPAY_SIGN = "alipay_order_sign"; + //微信支付 + public static final String GET_WECHAT_SIGN = "wechatpay/returnsign"; + //订单列表 + public static final String GET_ORDERLIST = "orderlist";//ordernum + //删除订单 + public static final String DEL_ORDER = "deleteorder";//orderNum + //取消订单 + public static final String CANCEL_ORDER = "wechatpay/cancelorder";//orderNum + + //整点推荐 + public static final String RECOMMENDED_USER = "referrernew"; + + //分享成功回调 + public static final String SHARE_SUCCESS = "enterpriseact/shareSuccessful"; + + //每日推荐后续操作处理回调接口 + public static final String HANDLED_RECOMMEND = "referrerdeal"; + + /***************************************2.4******************************************/ + public static final String INFO_IMPROVE = "improveinformation";//完善信息 + public static final String NEARBY_NEW = "nearbyuser";//附近人 + public static final String EMOTION_LIST = "discover/emotionlist";//获取情感题目列表 + public static final String COMMIT_EMOTION_ANSWER = "discover/emotionkeys";//完成情感题目 + public static final String IS_COMPLETE = "discover/checkcomplete";//查看信息是否完成或者情感是否测试完成 + public static final String VIEW_EMOTIONRESULT = "discover/emotionresult";//查看自己或者他人的测评结果 + public static final String VIEW_EMOTIONMATCH = "discover/emotionmatching";//根据测评结果查找人 + public static final String GET_GOUPQRCODE = "returngroupcode";//获取群组二维码图片 + public static final String GET_ADBANNER = "rollad";//轮播图,原发现页面广告轮播图 + public static final String REDBEAN_BALANCE = "wallet/beannum";//我的红豆页面 + public static final String REDBEAN_LIST = "wallet/consumerlist";//我的红豆清单记录 + public static final String REDBEAN_LIST_NEW = "wallet/consumerlistnew";//我的红豆清单记录 + public static final String RECHARGE_LIST = "wallet/rechargeable";//充值金额列表 + public static final String RECHARGE_COMMIT = "wallet/submitmoney";//提交充值 + public static final String REDBEAN_PAY_ATTENDACT = "wallet/redbeanpay";//参加活动,通过红豆支付 + public static final String RETURN_GROUP_AVATAR = "returnavatars";//返回群成员头像 + + /************************************2.5********************************************/ + public static final String CHOICENESS_LIST = "article/creamlist";//精选列表 + public static final String CHOICENESS_DETAIL = "article/creamdetail";//精选详细 + public static final String PUT_QUESTION = "article/publishresolve";//发布问题或者草稿 + public static final String CHOICENESS_COMMENT_LIST = "article/creamcommentlist";//获取精选评论 + public static final String CREATE_COMMENT = "article/creamsendcomment";//精选问答发表评论 + public static final String QA_LIST = "article/resolvelist";//问答列表 + public static final String MY_QA_LIST = "article/myresolvelist";//我的问答列表 + public static final String Q_DETAIL = "article/resolvedetail";//问答详情页面中的问题详情 + public static final String QA_DETAIL_LIST = "article/resolvecommentlist";//问答详情页面中的列表详情 + public static final String QA_REPLY_DETAIL = "article/replydetail";//问答的某个回答点进详情页后的该回答详情 + public static final String QA_REPLY_LIST = "article/replydetaillist";//问答的某个回答点进详情页后的回复列表 + public static final String REPLY_ANSWER_REPLY = "article/resolvereply";//回复他人的解答或者他人的回复 + public static final String MY_REPLYLIST = "article/myreplylist";//回复他人的解答或者他人的回复 + public static final String REWARD_OTHERS = "article/stick";//打赏 + public static final String QUESTION_DRAFT = "article/mydraftlist";//获取草稿 + public static final String UP_AUDIO_ALIYUN = "article/upaudio";//上传语音评论,获取阿里云上传路径 + public static final String SHARE_PERSON_ARTICLE = "article/sharelove";//分享成功回调,用于增加红豆 + + /************************************2.54********************************************/ + public static final String WHO_VIEW_LIKE = "userrecode";//查看浏览过或者点赞过自己的有哪些人 type1浏览过 type2点赞过 + public static final String REGISTER_NEW = "regusernew";//新的注册 + public static final String EXCHANGE_CODE = "game/gamecode";//游戏兑换码 + public static final String SIGN_EACH_DAY = "signin";//每日签到 + public static final String SEND_GIFT = "gift/giftsend";//送礼物 + public static final String MY_GIFT = "gift/mygift";//我的礼物(别人送我,我送别人) + public static final String GIFT_SEND_RECEIVE_DETAIL = "gift/giftsendinfo";//谁什么时候送的我礼物,我什么时候送了别人礼物 + public static final String WEIXIN_UPDATE_INFO = "webtoappup";//微信注册用户首次登录app更新信息接口 + public static final String MY_EXCHANGE_TICKET = "game/myticket";//微信小游戏兑换券 action : 1全票 2代金券 + public static final String AUTH_STATUS_LIST = "adultlist";//各种认证状态 + public static final String THIS_ACTTICKET_LIST = "game/actticket";//参加活动对应的抵扣券 + public static final String FULL_CARD_PAY = "enter_act/ticketjoin";//全票报名活动 + /***************************************2.55*********************************************/ + public static final String UPLOAD_PIC = "face";//新版上传头像 + public static final String CIRCLE_RECENT = "circle/publish";//发表动态 + public static final String CIRCLE_SHOW = "circle/all";//朋友圈列表 + public static final String CIRCLE_LIKE = "circle/like";//朋友圈点赞 + public static final String CIRCLE_REPORT = "circle/report";//朋友圈举报 + public static final String CIRCLE_COMMENT = "circle/review/publish";//朋友圈评论 + public static final String CIRCLE_DEL = "circle/delete";//朋友圈删除 + /****************************************3.20************************************************/ + public static final String ARTICLE_COMMENT_LIST = "zhitong/commentList";//文章评论列表 + public static final String ARTICLE_ADD_COMMENT = "zhitong/addComment";//文章评论 + /*****************************************3.3.0*************************************************/ + public static final String MY_APPLY_ACT = "enterpriseact/myApply";//我参加的以及我申请的活动 + public static final String NAMECARD_QUERY = "cardquery";//查询名片 + public static final String NAMECARD_UPDATE = "cardupdate";//更新名片 + public static final String UPLOAD_AVATAR_COMMENT = "faceinfo";//名片上传头像打分 + public static final String AD_BANNER = "rollingAd";//广告位 + public static final String REALNAME_AUTH = "authReq";//实名认证 + public static final String REALNAME_RESULT = "authQuery";//实名认证结果 + public static final String MY_CIRCLE = "myCircle";//我的足迹 + public static final String SYS_RECOMMEND = "myMatchs";//系统推荐 + public static final String COMPANY_AUTH_QUERY = "enterpriseAuthQuery";//企业认证信息查询 + public static final String COMPANY_AUTH_SUBMIT = "enterpriseAuthReq";//企业认证信息提交 + public static final String COMPANY_LIST = "enterpriseList";//企业认证获取企业列表 + public static final String DEPARTMENT_LIST = "departmentList";//企业认证部门列表 + /*****************************************3.3.1*************************************************/ + public static final String CIRCLE_NEW = "yuanquanList";//缘圈列表和话题列表(查询话题列表时添加两个字段:sort(new hot)/topicid) + public static final String CIRCLE_DETAIL_NEW = "yuanquanDetail";//缘圈详情 + public static final String CIRCLE_COMMENTS = "yuanquanComments";//缘圈详情 + public static final String CIRCLE_TOPIC_LIST = "topicList";//发表话题可选列表 + public static final String CIRCLE_PUBLISH = "addYuanquan";//发表缘圈(可以发表话题) + public static final String CIRCLE_TOPIC_DETAIL = "topicDetail";//话题详情 + public static final String ADD_CIRCLE_COLLECT = "addYuanquanCollection";//添加收藏 + public static final String DEL_CIRCLE_COLLECT = "deleteYuanquanCollection";//删除收藏 + public static final String CIRCLE_COLLECT = "listYuanquanCollection";//缘圈收藏 + public static final String CIRCLE_LIST_PUBLISH = "listYuanquanPublish";//缘圈我发布的 + public static final String CIRCLE_REPORT_NEW = "yuanquanCommentReport";//缘圈评论举报 + public static final String CIRCLE_DEL_NEW = "deleteYuanquanComment";//缘圈评论删除 +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/common/JqBaseActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/common/JqBaseActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..1a26a892e940cb1ae85e713745e47cce396603d5 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/common/JqBaseActivity.java @@ -0,0 +1,168 @@ +package com.jiuqi.elove.common; + +import android.app.Activity; +import android.content.Context; +import android.content.pm.PackageManager; +import android.os.Bundle; +import android.os.IBinder; +import android.support.annotation.NonNull; +import android.support.v4.app.ActivityCompat; +import android.support.v4.content.ContextCompat; +import android.support.v7.app.AppCompatActivity; +import android.view.MotionEvent; +import android.view.View; +import android.view.inputmethod.InputMethodManager; +import android.widget.EditText; + +import com.jiuqi.elove.util.OkHttpUtil; +import com.umeng.analytics.MobclickAgent; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by dl on 2016/6/6. + * 基类 + */ +public class JqBaseActivity extends AppCompatActivity { + + protected final OkHttpUtil okHttpUtil = OkHttpUtil.getInstance(); + private static PermissionListener mListener; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if(getSupportActionBar()!=null){ + getSupportActionBar().hide(); + } + ActivityCollector.addActivity(this); + } + + /** + * findViewById的简化版 + * @param id xml中组件的id + * @param 繁星继承自view + * @return 继承自view的组件类型 + */ + protected T easyFind(int id){ + return (T)findViewById(id); + } + + @Override + protected void onResume() { + super.onResume(); + //umeng埋点 + MobclickAgent.onResume(this); + } + + @Override + protected void onPause() { + super.onPause(); + //umeng + MobclickAgent.onPause(this); + } + + /** + * 申请运行时权限(不需要实例的静态方法) + * @param permissions 目标权限 + * @param listener 回调接口 + */ + public static void requestRuntimePermission(String[] permissions, PermissionListener listener){ + Activity topActivity = ActivityCollector.getTopActivity(); + if(topActivity==null){ + return; + } + mListener = listener; + List perissionList = new ArrayList<>(); + for (String permission : permissions){ + if(ContextCompat.checkSelfPermission(topActivity,permission) != PackageManager.PERMISSION_GRANTED){ + perissionList.add(permission); + } + } + if(!perissionList.isEmpty()){ + ActivityCompat.requestPermissions(topActivity,perissionList.toArray(new String[perissionList.size()]),1); + }else{ + mListener.onGranted(); + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + switch (requestCode){ + case 1: + if (grantResults.length > 0) { + List deniedPermissions = new ArrayList<>(); + for (int i = 0; i < grantResults.length; i++) { + int grantResult = grantResults[i]; + String permission = permissions[i]; + if (grantResult != PackageManager.PERMISSION_GRANTED) { + deniedPermissions.add(permission); + } + } + if(deniedPermissions.isEmpty()){ + mListener.onGranted(); + }else{ + mListener.onDenied(deniedPermissions); + } + } + break; + default: + break; + } + } + + @Override + public boolean dispatchTouchEvent(MotionEvent ev) { + if (ev.getAction() == MotionEvent.ACTION_DOWN) { + // 获得当前得到焦点的View,一般情况下就是EditText(特殊情况就是轨迹求或者实体案件会移动焦点) + View v = getCurrentFocus(); + if (isShouldHideInput(v, ev)) { + hideSoftInput(v.getWindowToken()); + } + } + return super.dispatchTouchEvent(ev); + } + + /** + * 根据EditText所在坐标和用户点击的坐标相对比,来判断是否隐藏键盘,因为当用户点击EditText时没必要隐藏 + * + * @param v + * @param event + * @return + */ + private boolean isShouldHideInput(View v, MotionEvent event) { + if (v != null && (v instanceof EditText)) { + int[] l = {0, 0}; + v.getLocationInWindow(l); + int left = l[0], top = l[1], bottom = top + v.getHeight(), right = left + + v.getWidth(); + if (event.getX() > left && event.getX() < right && event.getY() > top && event.getY() < bottom) { + // 点击EditText的事件,忽略它。 + return false; + } else { + return true; + } + } + // 如果焦点不是EditText则忽略,这个发生在视图刚绘制完,第一个焦点不在EditView上,和用户用轨迹球选择其他的焦点 + return false; + } + + /** + * 多种隐藏软件盘方法的其中一种 + * + * @param token + */ + public void hideSoftInput(IBinder token) { + if (token != null) { + InputMethodManager im = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); + im.hideSoftInputFromWindow(token, InputMethodManager.HIDE_NOT_ALWAYS); + } + } + + @Override + protected void onDestroy() { + super.onDestroy(); + okHttpUtil.cancelTag(this); + ActivityCollector.removeActivity(this); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/common/PermissionListener.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/common/PermissionListener.java new file mode 100644 index 0000000000000000000000000000000000000000..4ef07bde9a9a905fc1d9feb81134a65df27859d9 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/common/PermissionListener.java @@ -0,0 +1,11 @@ +package com.jiuqi.elove.common; + +import java.util.List; + +/** + * Created by dl on 2017/4/20. + */ +public interface PermissionListener { + void onGranted(); + void onDenied(List deniedPermission); +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/common/Share.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/common/Share.java new file mode 100644 index 0000000000000000000000000000000000000000..e48dbf8c299521b69bec1175c281d72c6a55d504 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/common/Share.java @@ -0,0 +1,143 @@ +package com.jiuqi.elove.common; + +import android.app.Activity; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.os.Handler; +import android.os.Message; +import android.util.Log; +import android.widget.ImageView; +import android.widget.Toast; + +import com.alibaba.fastjson.JSON; +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.target.BitmapImageViewTarget; +import com.jiuqi.elove.R; +import com.jiuqi.elove.activity.EActDetailActivity2_0_3; +import com.jiuqi.elove.util.BitmapUtils; +import com.jiuqi.elove.util.OkHttpUtil; +import com.stonesun.newssdk.sharesdk.NewsSDKShare; +import com.umeng.socialize.ShareAction; +import com.umeng.socialize.UMShareListener; +import com.umeng.socialize.bean.SHARE_MEDIA; +import com.umeng.socialize.media.UMImage; +import com.umeng.socialize.shareboard.SnsPlatform; +import com.umeng.socialize.utils.ShareBoardlistener; + +import org.json.JSONException; +import org.json.JSONObject; + +/** + * Created by 王子中 on 2017/11/15 0015. + * 分享需要继承sdk中的NewsSDKshare类 + */ + +public class Share extends NewsSDKShare { + JSONObject jsonObject; + private String title; + private String url; + private String imageUrl; + private String spot; + private String item_id; + private String set; + private String mid; + private String ad; + private JSONObject reqJson; + private Bitmap bitmap; + private Context context; + private boolean download = true; + + public Share() { + } + + public void showShare(String a, final Context ctx) { + //点击分享按钮会调用showShare()方法,a中有分享所需要的数据 + //这里有一个精彩的资讯,快来查看 + context = ctx; + try { + JSONObject obj = new JSONObject(a); + title = obj.getString("title"); + url = obj.getString("url"); + imageUrl = obj.getString("_IMAGES"); + } catch (JSONException e) { + e.printStackTrace(); + }finally { +// if(imageUrl.contains("|")){ +// imageUrl = imageUrl.substring(0,imageUrl.indexOf("|")); +// } + } +// ImageView iv = new ImageView(context); +// Glide.with(context.getApplicationContext()).load("https://www.baidu.com/img/bd_logo1.png").asBitmap().placeholder(R.mipmap.app_logo).into(new BitmapImageViewTarget(iv) { +// @Override +// protected void setResource(Bitmap resource) { +// bitmap = resource; +// +// } +// }); + shareInfo(); + } + + private void shareInfo() { + initUmengShare();//umeng平台分享配置初始化 + } + private void initUmengShare() { + UMImage image; + if(bitmap==null){ + image = new UMImage(context, BitmapFactory.decodeResource(context.getResources(), R.mipmap.app_logo)); + }else{ + image = new UMImage(context,bitmap); + } + ShareAction action = new ShareAction((Activity)context); + action.setDisplayList(Constant.DISPLAY_LIST); + action.withTitle("这里有一个精彩的资讯,快来查看"); + action.withText(title); + action.withTargetUrl(url);//点击分享内容打开的链接 + action.withMedia(image);//附带的图片,音乐,视频等多媒体对象 + action.setShareboardclickCallback(mShareBoardlistener);//设置友盟集成的分享面板的点击监听回调 + action.open();//打开集成的分享面板 + } + /** + * 友盟分享面板PopupWindow监听器 + */ + private ShareBoardlistener mShareBoardlistener = new ShareBoardlistener() { + + @Override + public void onclick(SnsPlatform snsPlatform, SHARE_MEDIA share_media) { + UMImage image; + if(bitmap==null){ + image = new UMImage(context, BitmapFactory.decodeResource(context.getResources(), R.mipmap.app_logo)); + }else{ + image = new UMImage(context,bitmap); + } + ShareAction shareAction = new ShareAction((Activity)context); + shareAction.setPlatform(share_media); + shareAction.setCallback(mUmShareListener);//设置每个平台的点击事件 + shareAction.withTitle("这里有一个精彩的资讯,快来查看"); + shareAction.withText(title); + shareAction.withTargetUrl(url);//点击分享内容打开的链接 + shareAction.withMedia(image);//附带的图片,音乐,视频等多媒体对象 + shareAction.share();//发起分享,调起微信,QQ,微博客户端进行分享。 + } + }; + /** + * 友盟分享后事件监听器 + */ + private UMShareListener mUmShareListener = new UMShareListener() { + + @Override + public void onResult(SHARE_MEDIA platform) { + Toast.makeText(context,"分享成功",Toast.LENGTH_LONG).show(); + } + + @Override + public void onError(SHARE_MEDIA platform, Throwable t) { + Toast.makeText(context,"分享失败",Toast.LENGTH_LONG).show(); + } + + @Override + public void onCancel(SHARE_MEDIA platform) { +// Toast.makeText(EActDetailActivity2_0_3.this,"分享取消",Toast.LENGTH_LONG).show(); + } + }; +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/dao/InviteMessgeDao.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/dao/InviteMessgeDao.java new file mode 100644 index 0000000000000000000000000000000000000000..d7e8b2124eeabb1ec39c07e43f2ebfabcda824f8 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/dao/InviteMessgeDao.java @@ -0,0 +1,82 @@ +/** + * Copyright (C) 2016 Hyphenate Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.jiuqi.elove.dao; + +import java.util.List; + +import android.content.ContentValues; +import android.content.Context; + +import com.jiuqi.elove.db.DemoDBManager; +import com.jiuqi.elove.entity.InviteMessage; + + +public class InviteMessgeDao { + public static final String TABLE_NAME = "new_friends_msgs"; + public static final String COLUMN_NAME_ID = "id"; + public static final String COLUMN_NAME_FROM = "username"; + public static final String COLUMN_NAME_GROUP_ID = "groupid"; + public static final String COLUMN_NAME_GROUP_Name = "groupname"; + public static final String COLUMN_NIKENAME = "nikename"; + + public static final String COLUMN_NAME_TIME = "time"; + public static final String COLUMN_NAME_REASON = "reason"; + public static final String COLUMN_NAME_STATUS = "status"; + public static final String COLUMN_NAME_ISINVITEFROMME = "isInviteFromMe"; + public static final String COLUMN_NAME_GROUPINVITER = "groupinviter"; + + public static final String COLUMN_NAME_UNREAD_MSG_COUNT = "unreadMsgCount"; + + + public InviteMessgeDao(Context context){ + } + + /** + * save message + * @param message + * @return return cursor of the message + */ + public Integer saveMessage(InviteMessage message){ + return DemoDBManager.getInstance().saveMessage(message); + } + + /** + * update message + * @param msgId + * @param values + */ + public void updateMessage(int msgId,ContentValues values){ + DemoDBManager.getInstance().updateMessage(msgId, values); + } + + /** + * get messges + * @return + */ + public List getMessagesList(){ + return DemoDBManager.getInstance().getMessagesList(); + } + + public void deleteMessage(String from){ + DemoDBManager.getInstance().deleteMessage(from); + } + + public int getUnreadMessagesCount(){ + return DemoDBManager.getInstance().getUnreadNotifyCount(); + } + + public void saveUnreadMessageCount(int count){ + DemoDBManager.getInstance().setUnreadNotifyCount(count); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/dao/UserDao.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/dao/UserDao.java new file mode 100644 index 0000000000000000000000000000000000000000..77134c7bbe9ecf5c873b387d3753c0353935dae8 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/dao/UserDao.java @@ -0,0 +1,102 @@ +/** + * Copyright (C) 2016 Hyphenate Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.jiuqi.elove.dao; + +import java.util.List; +import java.util.Map; + +import android.content.Context; + +//import com.hyphenate.chatuidemo.domain.RobotUser; +import com.hyphenate.easeui.domain.EaseUser; +import com.jiuqi.elove.db.DemoDBManager; + +public class UserDao { + public static final String TABLE_NAME = "uers"; + public static final String COLUMN_NAME_ID = "username"; + public static final String COLUMN_NAME_NICK = "nick"; + public static final String COLUMN_NAME_AVATAR = "avatar"; + + public static final String PREF_TABLE_NAME = "pref"; + public static final String COLUMN_NAME_DISABLED_GROUPS = "disabled_groups"; + public static final String COLUMN_NAME_DISABLED_IDS = "disabled_ids"; + + public static final String ROBOT_TABLE_NAME = "robots"; + public static final String ROBOT_COLUMN_NAME_ID = "username"; + public static final String ROBOT_COLUMN_NAME_NICK = "nick"; + public static final String ROBOT_COLUMN_NAME_AVATAR = "avatar"; + + + public UserDao(Context context) { + } + + /** + * save contact list + * + * @param contactList + */ + public void saveContactList(List contactList) { + DemoDBManager.getInstance().saveContactList(contactList); + } + + /** + * get contact list + * + * @return + */ + public Map getContactList() { + + return DemoDBManager.getInstance().getContactList(); + } + + /** + * delete a contact + * @param username + */ + public void deleteContact(String username){ + DemoDBManager.getInstance().deleteContact(username); + } + + /** + * save a contact + * @param user + */ + public void saveContact(EaseUser user){ + DemoDBManager.getInstance().saveContact(user); + } + + public void setDisabledGroups(List groups){ + DemoDBManager.getInstance().setDisabledGroups(groups); + } + + public List getDisabledGroups(){ + return DemoDBManager.getInstance().getDisabledGroups(); + } + + public void setDisabledIds(List ids){ + DemoDBManager.getInstance().setDisabledIds(ids); + } + + public List getDisabledIds(){ + return DemoDBManager.getInstance().getDisabledIds(); + } + +// public Map getRobotUser(){ +// return DemoDBManager.getInstance().getRobotList(); +// } + +// public void saveRobotUser(List robotList){ +// DemoDBManager.getInstance().saveRobotList(robotList); +// } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/db/DbOpenHelper.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/db/DbOpenHelper.java new file mode 100644 index 0000000000000000000000000000000000000000..9a6d69f2890ef6730e6b07c30fefffe0350f88aa --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/db/DbOpenHelper.java @@ -0,0 +1,119 @@ +/** + * Copyright (C) 2016 Hyphenate Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.jiuqi.elove.db; + +import android.content.Context; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; + +import com.jiuqi.elove.dao.InviteMessgeDao; +import com.jiuqi.elove.dao.UserDao; +import com.jiuqi.elove.util.EaseHxHelper; + +public class DbOpenHelper extends SQLiteOpenHelper{ + + private static final int DATABASE_VERSION = 6; + private static DbOpenHelper instance; + + private static final String USERNAME_TABLE_CREATE = "CREATE TABLE " + + UserDao.TABLE_NAME + " (" + + UserDao.COLUMN_NAME_NICK + " TEXT, " + + UserDao.COLUMN_NAME_AVATAR + " TEXT, " + + UserDao.COLUMN_NAME_ID + " TEXT PRIMARY KEY);"; + + private static final String INIVTE_MESSAGE_TABLE_CREATE = "CREATE TABLE " + + InviteMessgeDao.TABLE_NAME + " (" + + InviteMessgeDao.COLUMN_NAME_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + + InviteMessgeDao.COLUMN_NAME_FROM + " TEXT, " + + InviteMessgeDao.COLUMN_NIKENAME + " TEXT ," + + InviteMessgeDao.COLUMN_NAME_GROUP_ID + " TEXT, " + + InviteMessgeDao.COLUMN_NAME_GROUP_Name + " TEXT, " + + InviteMessgeDao.COLUMN_NAME_REASON + " TEXT, " + + InviteMessgeDao.COLUMN_NAME_STATUS + " INTEGER, " + + InviteMessgeDao.COLUMN_NAME_ISINVITEFROMME + " INTEGER, " + + InviteMessgeDao.COLUMN_NAME_UNREAD_MSG_COUNT + " INTEGER, " + + InviteMessgeDao.COLUMN_NAME_TIME + " TEXT, " + + InviteMessgeDao.COLUMN_NAME_GROUPINVITER + " TEXT); "; + + private static final String ROBOT_TABLE_CREATE = "CREATE TABLE " + + UserDao.ROBOT_TABLE_NAME + " (" + + UserDao.ROBOT_COLUMN_NAME_ID + " TEXT PRIMARY KEY, " + + UserDao.ROBOT_COLUMN_NAME_NICK + " TEXT, " + + UserDao.ROBOT_COLUMN_NAME_AVATAR + " TEXT);"; + + private static final String CREATE_PREF_TABLE = "CREATE TABLE " + + UserDao.PREF_TABLE_NAME + " (" + + UserDao.COLUMN_NAME_DISABLED_GROUPS + " TEXT, " + + UserDao.COLUMN_NAME_DISABLED_IDS + " TEXT);"; + + private DbOpenHelper(Context context) { + super(context, getUserDatabaseName(), null, DATABASE_VERSION); + } + + public static DbOpenHelper getInstance(Context context) { + if (instance == null) { + instance = new DbOpenHelper(context.getApplicationContext()); + } + return instance; + } + + private static String getUserDatabaseName() { + return EaseHxHelper.getInstance().getCurrentUsernName() + "_demo.db"; + } + + @Override + public void onCreate(SQLiteDatabase db) { + db.execSQL(USERNAME_TABLE_CREATE); + db.execSQL(INIVTE_MESSAGE_TABLE_CREATE); + db.execSQL(CREATE_PREF_TABLE); + db.execSQL(ROBOT_TABLE_CREATE); + + } + + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + if(oldVersion < 2){ + db.execSQL("ALTER TABLE "+ UserDao.TABLE_NAME +" ADD COLUMN "+ + UserDao.COLUMN_NAME_AVATAR + " TEXT ;"); + } + + if(oldVersion < 3){ + db.execSQL(CREATE_PREF_TABLE); + } + if(oldVersion < 4){ + db.execSQL(ROBOT_TABLE_CREATE); + } + if(oldVersion < 5){ + db.execSQL("ALTER TABLE " + InviteMessgeDao.TABLE_NAME + " ADD COLUMN " + + InviteMessgeDao.COLUMN_NAME_UNREAD_MSG_COUNT + " INTEGER ;"); + } + if (oldVersion < 6) { + db.execSQL("ALTER TABLE " + InviteMessgeDao.TABLE_NAME + " ADD COLUMN " + + InviteMessgeDao.COLUMN_NAME_GROUPINVITER + " TEXT;"); + } + } + + public void closeDB() { + if (instance != null) { + try { + SQLiteDatabase db = instance.getWritableDatabase(); + db.close(); + } catch (Exception e) { + e.printStackTrace(); + } + instance = null; + } + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/db/DemoDBManager.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/db/DemoDBManager.java new file mode 100644 index 0000000000000000000000000000000000000000..8a2630ca583b5068531501500987f6c38b6083ff --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/db/DemoDBManager.java @@ -0,0 +1,390 @@ +package com.jiuqi.elove.db; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Hashtable; +import java.util.List; +import java.util.Map; + +//import com.hyphenate.chatuidemo.Constant; +//import com.hyphenate.chatuidemo.DemoApplication; +//import com.hyphenate.chatuidemo.domain.InviteMessage; +//import com.hyphenate.chatuidemo.domain.InviteMessage.InviteMesageStatus; +//import com.hyphenate.chatuidemo.domain.RobotUser; +import com.hyphenate.easeui.domain.EaseUser; +import com.hyphenate.easeui.utils.EaseCommonUtils; +import com.hyphenate.util.HanziToPinyin; +import com.jiuqi.elove.application.EloveApplication; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.dao.InviteMessgeDao; +import com.jiuqi.elove.dao.UserDao; +import com.jiuqi.elove.entity.InviteMessage; + +import android.content.ContentValues; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.text.TextUtils; + +public class DemoDBManager { + static private DemoDBManager dbMgr = new DemoDBManager(); + private DbOpenHelper dbHelper; + + private DemoDBManager(){ + dbHelper = DbOpenHelper.getInstance(EloveApplication.getInstance().getApplicationContext()); + } + + public static synchronized DemoDBManager getInstance(){ + if(dbMgr == null){ + dbMgr = new DemoDBManager(); + } + return dbMgr; + } + + /** + * save contact list + * + * @param contactList + */ + synchronized public void saveContactList(List contactList) { + SQLiteDatabase db = dbHelper.getWritableDatabase(); + if (db.isOpen()) { + db.delete(UserDao.TABLE_NAME, null, null); + for (EaseUser user : contactList) { + ContentValues values = new ContentValues(); + values.put(UserDao.COLUMN_NAME_ID, user.getUsername()); + if(user.getNick() != null) + values.put(UserDao.COLUMN_NAME_NICK, user.getNick()); + if(user.getAvatar() != null) + values.put(UserDao.COLUMN_NAME_AVATAR, user.getAvatar()); + db.replace(UserDao.TABLE_NAME, null, values); + } + } + } + + /** + * get contact list + * + * @return + */ + synchronized public Map getContactList() { + SQLiteDatabase db = dbHelper.getReadableDatabase(); + Map users = new Hashtable(); + if (db.isOpen()) { + Cursor cursor = db.rawQuery("select * from " + UserDao.TABLE_NAME /* + " desc" */, null); + while (cursor.moveToNext()) { + String username = cursor.getString(cursor.getColumnIndex(UserDao.COLUMN_NAME_ID)); + String nick = cursor.getString(cursor.getColumnIndex(UserDao.COLUMN_NAME_NICK)); + String avatar = cursor.getString(cursor.getColumnIndex(UserDao.COLUMN_NAME_AVATAR)); + EaseUser user = new EaseUser(username); + user.setNick(nick); + user.setAvatar(avatar); + if (username.equals(Constant.NEW_FRIENDS_USERNAME) || username.equals(Constant.GROUP_USERNAME) + || username.equals(Constant.CHAT_ROOM)|| username.equals(Constant.CHAT_ROBOT)) { + user.setInitialLetter(""); + } else { + EaseCommonUtils.setUserInitialLetter(user); + } + users.put(username, user); + } + cursor.close(); + } + return users; + } + + /** + * delete a contact + * @param username + */ + synchronized public void deleteContact(String username){ + SQLiteDatabase db = dbHelper.getWritableDatabase(); + if(db.isOpen()){ + db.delete(UserDao.TABLE_NAME, UserDao.COLUMN_NAME_ID + " = ?", new String[]{username}); + } + } + + /** + * save a contact + * @param user + */ + synchronized public void saveContact(EaseUser user){ + SQLiteDatabase db = dbHelper.getWritableDatabase(); + ContentValues values = new ContentValues(); + values.put(UserDao.COLUMN_NAME_ID, user.getUsername()); + if(user.getNick() != null) + values.put(UserDao.COLUMN_NAME_NICK, user.getNick()); + if(user.getAvatar() != null) + values.put(UserDao.COLUMN_NAME_AVATAR, user.getAvatar()); + if(db.isOpen()){ + db.replace(UserDao.TABLE_NAME, null, values); + } + } + + public void setDisabledGroups(List groups){ + setList(UserDao.COLUMN_NAME_DISABLED_GROUPS, groups); + } + + public List getDisabledGroups(){ + return getList(UserDao.COLUMN_NAME_DISABLED_GROUPS); + } + + public void setDisabledIds(List ids){ + setList(UserDao.COLUMN_NAME_DISABLED_IDS, ids); + } + + public List getDisabledIds(){ + return getList(UserDao.COLUMN_NAME_DISABLED_IDS); + } + + synchronized private void setList(String column, List strList){ + StringBuilder strBuilder = new StringBuilder(); + + for(String hxid:strList){ + strBuilder.append(hxid).append("$"); + } + + SQLiteDatabase db = dbHelper.getWritableDatabase(); + if (db.isOpen()) { + ContentValues values = new ContentValues(); + values.put(column, strBuilder.toString()); + + db.update(UserDao.PREF_TABLE_NAME, values, null,null); + } + } + + synchronized private List getList(String column){ + SQLiteDatabase db = dbHelper.getReadableDatabase(); + Cursor cursor = db.rawQuery("select " + column + " from " + UserDao.PREF_TABLE_NAME,null); + if (!cursor.moveToFirst()) { + cursor.close(); + return null; + } + + String strVal = cursor.getString(0); + if (strVal == null || strVal.equals("")) { + return null; + } + + cursor.close(); + + String[] array = strVal.split("$"); + + if(array != null && array.length > 0){ + List list = new ArrayList(); + for(String str:array){ + list.add(str); + } + + return list; + } + + return null; + } + + /** + * save a message + * @param message + * @return return cursor of the message + */ + public synchronized Integer saveMessage(InviteMessage message){ + SQLiteDatabase db = dbHelper.getWritableDatabase(); + int id = -1; + if(db.isOpen()){ + ContentValues values = new ContentValues(); + values.put(InviteMessgeDao.COLUMN_NAME_FROM, message.getFrom()); + values.put(InviteMessgeDao.COLUMN_NAME_GROUP_ID, message.getGroupId()); + values.put(InviteMessgeDao.COLUMN_NAME_GROUP_Name, message.getGroupName()); + values.put(InviteMessgeDao.COLUMN_NAME_REASON, message.getReason()); + values.put(InviteMessgeDao.COLUMN_NAME_TIME, message.getTime()); + values.put(InviteMessgeDao.COLUMN_NAME_STATUS, message.getStatus().ordinal()); + values.put(InviteMessgeDao.COLUMN_NAME_GROUPINVITER, message.getGroupInviter()); + values.put(InviteMessgeDao.COLUMN_NIKENAME,message.getNikename()); + db.insert(InviteMessgeDao.TABLE_NAME, null, values); + + Cursor cursor = db.rawQuery("select last_insert_rowid() from " + InviteMessgeDao.TABLE_NAME,null); + if(cursor.moveToFirst()){ + id = cursor.getInt(0); + } + + cursor.close(); + } + return id; + } + + /** + * update message + * @param msgId + * @param values + */ + synchronized public void updateMessage(int msgId,ContentValues values){ + SQLiteDatabase db = dbHelper.getWritableDatabase(); + if(db.isOpen()){ + db.update(InviteMessgeDao.TABLE_NAME, values, InviteMessgeDao.COLUMN_NAME_ID + " = ?", new String[]{String.valueOf(msgId)}); + } + } + + /** + * get messges + * @return + */ + synchronized public List getMessagesList(){ + SQLiteDatabase db = dbHelper.getReadableDatabase(); + List msgs = new ArrayList(); + if(db.isOpen()){ + Cursor cursor = db.rawQuery("select * from " + InviteMessgeDao.TABLE_NAME + " desc",null); + while(cursor.moveToNext()){ + InviteMessage msg = new InviteMessage(); + int id = cursor.getInt(cursor.getColumnIndex(InviteMessgeDao.COLUMN_NAME_ID)); + String from = cursor.getString(cursor.getColumnIndex(InviteMessgeDao.COLUMN_NAME_FROM)); + String groupid = cursor.getString(cursor.getColumnIndex(InviteMessgeDao.COLUMN_NAME_GROUP_ID)); + String groupname = cursor.getString(cursor.getColumnIndex(InviteMessgeDao.COLUMN_NAME_GROUP_Name)); + String reason = cursor.getString(cursor.getColumnIndex(InviteMessgeDao.COLUMN_NAME_REASON)); + long time = cursor.getLong(cursor.getColumnIndex(InviteMessgeDao.COLUMN_NAME_TIME)); + int status = cursor.getInt(cursor.getColumnIndex(InviteMessgeDao.COLUMN_NAME_STATUS)); + String groupInviter = cursor.getString(cursor.getColumnIndex(InviteMessgeDao.COLUMN_NAME_GROUPINVITER)); + String nikename = cursor.getString(cursor.getColumnIndex(InviteMessgeDao.COLUMN_NIKENAME)); + + msg.setId(id); + msg.setFrom(from); + msg.setGroupId(groupid); + msg.setGroupName(groupname); + msg.setReason(reason); + msg.setTime(time); + msg.setGroupInviter(groupInviter); + msg.setNikename(nikename); + + if(status == InviteMessage.InviteMesageStatus.BEINVITEED.ordinal()) + msg.setStatus(InviteMessage.InviteMesageStatus.BEINVITEED); + else if(status == InviteMessage.InviteMesageStatus.BEAGREED.ordinal()) + msg.setStatus(InviteMessage.InviteMesageStatus.BEAGREED); + else if(status == InviteMessage.InviteMesageStatus.BEREFUSED.ordinal()) + msg.setStatus(InviteMessage.InviteMesageStatus.BEREFUSED); + else if(status == InviteMessage.InviteMesageStatus.AGREED.ordinal()) + msg.setStatus(InviteMessage.InviteMesageStatus.AGREED); + else if(status == InviteMessage.InviteMesageStatus.REFUSED.ordinal()) + msg.setStatus(InviteMessage.InviteMesageStatus.REFUSED); + else if(status == InviteMessage.InviteMesageStatus.BEAPPLYED.ordinal()) + msg.setStatus(InviteMessage.InviteMesageStatus.BEAPPLYED); + else if(status == InviteMessage.InviteMesageStatus.GROUPINVITATION.ordinal()) + msg.setStatus(InviteMessage.InviteMesageStatus.GROUPINVITATION); + else if(status == InviteMessage.InviteMesageStatus.GROUPINVITATION_ACCEPTED.ordinal()) + msg.setStatus(InviteMessage.InviteMesageStatus.GROUPINVITATION_ACCEPTED); + else if(status == InviteMessage.InviteMesageStatus.GROUPINVITATION_DECLINED.ordinal()) + msg.setStatus(InviteMessage.InviteMesageStatus.GROUPINVITATION_DECLINED); + + msgs.add(msg); + } + cursor.close(); + } + return msgs; + } + + /** + * delete invitation message + * @param from + */ + synchronized public void deleteMessage(String from){ + SQLiteDatabase db = dbHelper.getWritableDatabase(); + if(db.isOpen()){ + db.delete(InviteMessgeDao.TABLE_NAME, InviteMessgeDao.COLUMN_NAME_FROM + " = ?", new String[]{from}); + } + } + + synchronized public void deleteMessage(){ + SQLiteDatabase db = dbHelper.getWritableDatabase(); + if(db.isOpen()){ + db.delete(InviteMessgeDao.TABLE_NAME, null, null); + } + } + + public synchronized int getUnreadNotifyCount(){ + int count = 0; + SQLiteDatabase db = dbHelper.getReadableDatabase(); + if(db.isOpen()){ + Cursor cursor = db.rawQuery("select " + InviteMessgeDao.COLUMN_NAME_UNREAD_MSG_COUNT + " from " + InviteMessgeDao.TABLE_NAME, null); + if(cursor.moveToFirst()){ + count = cursor.getInt(0); + } + cursor.close(); + } + return count; + } + + public synchronized void setUnreadNotifyCount(int count){ + SQLiteDatabase db = dbHelper.getWritableDatabase(); + if(db.isOpen()){ + ContentValues values = new ContentValues(); + values.put(InviteMessgeDao.COLUMN_NAME_UNREAD_MSG_COUNT, count); + + db.update(InviteMessgeDao.TABLE_NAME, values, null,null); + } + } + + synchronized public void closeDB(){ + if(dbHelper != null){ + dbHelper.closeDB(); + } + dbMgr = null; + } + + + /** + * Save Robot list + */ +// synchronized public void saveRobotList(List robotList) { +// SQLiteDatabase db = dbHelper.getWritableDatabase(); +// if (db.isOpen()) { +// db.delete(UserDao.ROBOT_TABLE_NAME, null, null); +// for (RobotUser item : robotList) { +// ContentValues values = new ContentValues(); +// values.put(UserDao.ROBOT_COLUMN_NAME_ID, item.getUsername()); +// if (item.getNick() != null) +// values.put(UserDao.ROBOT_COLUMN_NAME_NICK, item.getNick()); +// if (item.getAvatar() != null) +// values.put(UserDao.ROBOT_COLUMN_NAME_AVATAR, item.getAvatar()); +// db.replace(UserDao.ROBOT_TABLE_NAME, null, values); +// } +// } +// } + + /** + * load robot list + */ +// synchronized public Map getRobotList() { +// SQLiteDatabase db = dbHelper.getReadableDatabase(); +// Map users = null; +// if (db.isOpen()) { +// Cursor cursor = db.rawQuery("select * from " + UserDao.ROBOT_TABLE_NAME, null); +// if(cursor.getCount()>0){ +// users = new Hashtable(); +// }; +// while (cursor.moveToNext()) { +// String username = cursor.getString(cursor.getColumnIndex(UserDao.ROBOT_COLUMN_NAME_ID)); +// String nick = cursor.getString(cursor.getColumnIndex(UserDao.ROBOT_COLUMN_NAME_NICK)); +// String avatar = cursor.getString(cursor.getColumnIndex(UserDao.ROBOT_COLUMN_NAME_AVATAR)); +// RobotUser user = new RobotUser(username); +// user.setNick(nick); +// user.setAvatar(avatar); +// String headerName = null; +// if (!TextUtils.isEmpty(user.getNick())) { +// headerName = user.getNick(); +// } else { +// headerName = user.getUsername(); +// } +// if(Character.isDigit(headerName.charAt(0))){ +// user.setInitialLetter("#"); +// }else{ +// user.setInitialLetter(HanziToPinyin.getInstance().get(headerName.substring(0, 1)).get(0).target +// .substring(0, 1).toUpperCase()); +// char header = user.getInitialLetter().toLowerCase().charAt(0); +// if (header < 'a' || header > 'z') { +// user.setInitialLetter("#"); +// } +// } +// +// users.put(username, user); +// } +// cursor.close(); +// } +// return users; +// } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/ActUserModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/ActUserModel.java new file mode 100644 index 0000000000000000000000000000000000000000..3dd36d8faa9c9fafab9ad2bd05936c6bd0c07911 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/ActUserModel.java @@ -0,0 +1,35 @@ +package com.jiuqi.elove.entity; + +/** + * Created by dl on 2017/4/26. + */ +public class ActUserModel { + + private String user;//id + private String username; + private String userface;//头像 + + public String getUser() { + return user; + } + + public void setUser(String user) { + this.user = user; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getUserface() { + return userface; + } + + public void setUserface(String userface) { + this.userface = userface; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/AdvertisementModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/AdvertisementModel.java new file mode 100644 index 0000000000000000000000000000000000000000..838bb8712234c8636a1ca50fe5092e74cbfa749b --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/AdvertisementModel.java @@ -0,0 +1,53 @@ +package com.jiuqi.elove.entity; + +/** + * + * Created by dl on 2016/9/29. + */ +public class AdvertisementModel { + private String SkipID; + private String photo; + private int type;//1活动2链接3会员 + private String version; + private String skipURL; + + public String getSkipURL() { + return skipURL; + } + + public void setSkipURL(String skipURL) { + this.skipURL = skipURL; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getSkipID() { + return SkipID; + } + + public void setSkipID(String skipID) { + SkipID = skipID; + } + + public String getPhoto() { + return photo; + } + + public void setPhoto(String photo) { + this.photo = photo; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/AuthAllModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/AuthAllModel.java new file mode 100644 index 0000000000000000000000000000000000000000..35abd8f609a534840ac87a4887a34d2d51c71dfc --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/AuthAllModel.java @@ -0,0 +1,112 @@ +package com.jiuqi.elove.entity; + +import java.io.Serializable; + +/** + * 认证状态以及认证的其他信息 + * Created by dl on 2017/3/31. + */ +public class AuthAllModel implements Serializable{ + + private String phone; + private String phonetype;//1 已认证 + + private String email;//邮箱 + private String emailtype;//邮箱认证状态 1认证中 2 已认证 + private String kind;//企业状态 0非企业用户1企业用户2正在认证 + private String enterprise;//企业名称 + private String name;//实名 + private String cardphoto;//工牌 + private String idcard;//身份证号 + private String idcardphoto;//身份证证件照片 + private String idcardtype;//身份证认证状态 0:初始 1:通过 2:审核中 3:未通过 + + public String getCardphoto() { + return cardphoto; + } + + public void setCardphoto(String cardphoto) { + this.cardphoto = cardphoto; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getEmailtype() { + return emailtype; + } + + public void setEmailtype(String emailtype) { + this.emailtype = emailtype; + } + + public String getEnterprise() { + return enterprise; + } + + public void setEnterprise(String enterprise) { + this.enterprise = enterprise; + } + + public String getIdcard() { + return idcard; + } + + public void setIdcard(String idcard) { + this.idcard = idcard; + } + + public String getIdcardphoto() { + return idcardphoto; + } + + public void setIdcardphoto(String idcardphoto) { + this.idcardphoto = idcardphoto; + } + + public String getIdcardtype() { + return idcardtype; + } + + public void setIdcardtype(String idcardtype) { + this.idcardtype = idcardtype; + } + + public String getKind() { + return kind; + } + + public void setKind(String kind) { + this.kind = kind; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getPhonetype() { + return phonetype; + } + + public void setPhonetype(String phonetype) { + this.phonetype = phonetype; + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/AuthModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/AuthModel.java new file mode 100644 index 0000000000000000000000000000000000000000..a4dc079b4971971f560f9c83b79e41e588c13b7f --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/AuthModel.java @@ -0,0 +1,60 @@ +package com.jiuqi.elove.entity; + +/** + * + * Created by dl on 2016/7/23. + */ +public class AuthModel { + + /** + * ifcar : 4 + * income : 3 + * name : 1 + * ifhouse : 3 + */ + private String ifcar; + private String income; + private String name; + private String ifhouse; + private String share; + + public String getShare() { + return share; + } + + public void setShare(String share) { + this.share = share; + } + + public void setIfcar(String ifcar) { + this.ifcar = ifcar; + } + + public void setIncome(String income) { + this.income = income; + } + + public void setName(String name) { + this.name = name; + } + + public void setIfhouse(String ifhouse) { + this.ifhouse = ifhouse; + } + + public String getIfcar() { + return ifcar; + } + + public String getIncome() { + return income; + } + + public String getName() { + return name; + } + + public String getIfhouse() { + return ifhouse; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/CharacterModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/CharacterModel.java new file mode 100644 index 0000000000000000000000000000000000000000..6286791c6015cbdf779edea952ddce4c9cdd8608 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/CharacterModel.java @@ -0,0 +1,36 @@ +package com.jiuqi.elove.entity; + +/** + * + * Created by dl on 2016/12/6. + */ +public class CharacterModel { + + private String character; + private String characterInfo; + private Integer characterscore; + + public String getCharacter() { + return character; + } + + public void setCharacter(String character) { + this.character = character; + } + + public String getCharacterInfo() { + return characterInfo; + } + + public void setCharacterInfo(String characterInfo) { + this.characterInfo = characterInfo; + } + + public Integer getCharacterscore() { + return characterscore; + } + + public void setCharacterscore(Integer characterscore) { + this.characterscore = characterscore; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/ChatPersonModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/ChatPersonModel.java new file mode 100644 index 0000000000000000000000000000000000000000..bae4883076eb816d88c7d94f91c34fd5b2eb75ba --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/ChatPersonModel.java @@ -0,0 +1,217 @@ +package com.jiuqi.elove.entity; + +/** + * + * Created by dl on 2016/8/5. + */ +public class ChatPersonModel { + + /** + * userID : 56BB4A78C00000212477DB6DC2B1D33E + * audittype : 1 + * bean : 100 + * nickname : 范范 + * avatartype : 2 + * IDNum : 100012 + * avatar : http://redbean.oss-cn-hangzhou.aliyuncs.com/newDir/GpvUsk/C8cGQinYJZQrCwA%3D%3D + * kind : 0 + * ifup : 0 + * iscomplete:0未完善 1完善 + * completeness 完善度 + * videotype + * ifac 0 后台未开启强认证 1 开启认证 + * IDCard 0 未认证 1 认证 + */ + + private String userID; + private int audittype; + private int bean; + private String nickname; + private int avatartype; + private String IDNum; + private String avatar; + private int kind; + private int ifup; + private int complete; + private String birthday; + private String localplace; + private String name; + private String sex; + private String completeness; + private String videotype; + private String ifac; + private String realnametype; + private String signtoday; + private String emailtype; + private String youthLeague; + + public String getYouthLeague() { + return youthLeague; + } + + public void setYouthLeague(String youthLeague) { + this.youthLeague = youthLeague; + } + + public String getSigntoday() { + return signtoday; + } + + public void setSigntoday(String signtoday) { + this.signtoday = signtoday; + } + + public String getEmailtype() { + return emailtype; + } + + public void setEmailtype(String emailtype) { + this.emailtype = emailtype; + } + + public String getRealnametype() { + return realnametype; + } + + public void setRealnametype(String realnametype) { + this.realnametype = realnametype; + } + + public String getIfac() { + return ifac; + } + + public void setIfac(String ifac) { + this.ifac = ifac; + } + + public String getVideotype(){ + return videotype; + } + + public void setVideotype(String videotype){ + this.videotype = videotype; + } + + public String getCompleteness() { + return completeness; + } + + public void setCompleteness(String completeness) { + this.completeness = completeness; + } + + public String getBirthday() { + return birthday; + } + + public void setBirthday(String birthday) { + this.birthday = birthday; + } + + public String getLocalplace() { + return localplace; + } + + public void setLocalplace(String localplace) { + this.localplace = localplace; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + + public int getComplete() { + return complete; + } + + public void setComplete(int complete) { + this.complete = complete; + } + + public String getUserID() { + return userID; + } + + public void setUserID(String userID) { + this.userID = userID; + } + + public int getAudittype() { + return audittype; + } + + public void setAudittype(int audittype) { + this.audittype = audittype; + } + + public int getBean() { + return bean; + } + + public void setBean(int bean) { + this.bean = bean; + } + + public String getNickname() { + return nickname; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } + + public int getAvatartype() { + return avatartype; + } + + public void setAvatartype(int avatartype) { + this.avatartype = avatartype; + } + + public String getIDNum() { + return IDNum; + } + + public void setIDNum(String IDNum) { + this.IDNum = IDNum; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public int getKind() { + return kind; + } + + public void setKind(int kind) { + this.kind = kind; + } + + public int getIfup() { + return ifup; + } + + public void setIfup(int ifup) { + this.ifup = ifup; + } + + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/ChoicenessAndDetailModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/ChoicenessAndDetailModel.java new file mode 100644 index 0000000000000000000000000000000000000000..d45c2c296e6b8dc3eb3dc87505b87f3a703d7658 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/ChoicenessAndDetailModel.java @@ -0,0 +1,100 @@ +package com.jiuqi.elove.entity; + +import java.io.Serializable; + +/** + * 精选和问答实体对象 + * Created by dl on 2017/1/4. + */ +public class ChoicenessAndDetailModel implements Serializable{ + private String title;//主题 + private String theme;//简介 + private String picture; + private String scans;//浏览次数 + private String reviews;//评论次数 + private String istop;// 1置顶 0未置顶 + private String creamid;//精选id + private String type;//文章类型 1精选文章 2问答 + private String creamhtml;//文章详情html串 + private String rewards;//打赏次数 + + public String getCreamhtml() { + return creamhtml; + } + + public void setCreamhtml(String creamhtml) { + this.creamhtml = creamhtml; + } + + public String getRewards() { + return rewards; + } + + public void setRewards(String rewards) { + this.rewards = rewards; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getTheme() { + return theme; + } + + public void setTheme(String theme) { + this.theme = theme; + } + + public String getPicture() { + return picture; + } + + public void setPicture(String picture) { + this.picture = picture; + } + + public String getScans() { + return scans; + } + + public void setScans(String scans) { + this.scans = scans; + } + + public String getReviews() { + return reviews; + } + + public void setReviews(String reviews) { + this.reviews = reviews; + } + + public String getIstop() { + return istop; + } + + public void setIstop(String istop) { + this.istop = istop; + } + + public String getCreamid() { + return creamid; + } + + public void setCreamid(String creamid) { + this.creamid = creamid; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/ChoicenessCommentModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/ChoicenessCommentModel.java new file mode 100644 index 0000000000000000000000000000000000000000..6e3610057d5db9f96a5f5cc92cd89c0645b858d9 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/ChoicenessCommentModel.java @@ -0,0 +1,52 @@ +package com.jiuqi.elove.entity; + +/** + * Created by dl on 2017/1/4. + */ +public class ChoicenessCommentModel { + private String avatar;//用户头像 + private String username;//用户名字 + private String userid;//用户id + private String time;//评论时间 + private String comment;//评论内容 + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getUserid() { + return userid; + } + + public void setUserid(String userid) { + this.userid = userid; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/CircleCommentModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/CircleCommentModel.java new file mode 100644 index 0000000000000000000000000000000000000000..185449e9f39b2a5b2a032f9261578d469a14ed07 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/CircleCommentModel.java @@ -0,0 +1,83 @@ +package com.jiuqi.elove.entity; + +import java.io.Serializable; + +/** + * Created by jq on 2018/1/4. + */ + +public class CircleCommentModel implements Serializable{ + + /** + * userAvatar : http://redbean.oss-cn-hangzhou.aliyuncs.com/newDir/CA30A439E4063B1788E8D5CB0692BCA8 + * comment : tomorrow + * childCount : 0 + * time : 今天 10:48 + * userName : DHASA + * recid : CAB0CFA45B8641E6AB704FF767E9181B + */ + + private String userAvatar; + private String comment; + private String childCount; + private String time; + private String userName; + private String recid; + private String userid; + + public String getUserid() { + return userid; + } + + public void setUserid(String userid) { + this.userid = userid; + } + + public String getUserAvatar() { + return userAvatar; + } + + public void setUserAvatar(String userAvatar) { + this.userAvatar = userAvatar; + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + + public String getChildCount() { + return childCount; + } + + public void setChildCount(String childCount) { + this.childCount = childCount; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getRecid() { + return recid; + } + + public void setRecid(String recid) { + this.recid = recid; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/CircleModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/CircleModel.java new file mode 100644 index 0000000000000000000000000000000000000000..0cb5289143ab4a80e4acc885f136de962e7abfe8 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/CircleModel.java @@ -0,0 +1,269 @@ +package com.jiuqi.elove.entity; + +import java.util.HashMap; +import java.util.List; + +/** + * 缘圈model + * Created by dl on 2017/5/10. + */ +public class CircleModel { + private String address; + private int iflike; + private String time; + private List likes;//点赞人列表 + private String nickname; + private List> imgs;//图片或者视频的路径集合 + private String titleid;//该动态id + private String content;//内容 + private double imgwh;//一张时返回图片宽高比 + private String relation;//和当前登录用户的关系 + private String avatar;//该动态的头像 + private int imgstype;//返回文件类型 2图片 1视频 + private List reviews;//评论数,列表中最多二十条 + private VideoModel videos; + private String userid; + + public String getUserid() { + return userid; + } + + public void setUserid(String userid) { + this.userid = userid; + } + + public VideoModel getVideos() { + return videos; + } + + public void setVideos(VideoModel model) { + this.videos = model; + } + + public int getImgstype() { + return imgstype; + } + + public void setImgstype(int imgstype) { + this.imgstype = imgstype; + } + + public List getReviews() { + return reviews; + } + + public void setReviews(List reviews) { + this.reviews = reviews; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public String getRelation() { + return relation; + } + + public void setRelation(String relation) { + this.relation = relation; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public List getLikes() { + return likes; + } + + public void setLikes(List likes) { + this.likes = likes; + } + +// public List getImgs() { +// return imgs; +// } +// +// public void setImgs(List imgs) { +// this.imgs = imgs; +// } + + + public List> getImgs() { + return imgs; + } + + public void setImgs(List> imgs) { + this.imgs = imgs; + } + + public String getTitleid() { + return titleid; + } + + public void setTitleid(String titleid) { + this.titleid = titleid; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public double getImgwh() { + return imgwh; + } + + public void setImgwh(double imgwh) { + this.imgwh = imgwh; + } + + public int getIflike() { + return iflike; + } + + public void setIflike(int iflike) { + this.iflike = iflike; + } + + public String getNickname() { + return nickname; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } + + /** + * list remove对象时通过equals方法来判断是否有 + * 而本有的equals比较的是否为同一个对象(同一个内存) + * 现在重写equals方法 + */ + public static class UserSimpleModel{ + private String likeid; + private String likename; + + public String getLikeid() { + return likeid; + } + + public void setLikeid(String likeid) { + this.likeid = likeid; + } + + public String getLikename() { + return likename; + } + + public void setLikename(String likename) { + this.likename = likename; + } + + @Override + public boolean equals(Object o) { + if(o instanceof UserSimpleModel){ + UserSimpleModel model = (UserSimpleModel)o; + return model.getLikeid().equals(this.getLikeid())&&model.getLikename().equals(this.getLikename()); + } + return false; + } + } + + public static class VideoModel{ + private int videoimgwh; + private String video; + private String videoimg; + + public int getVideoimgwh() { + return videoimgwh; + } + + public void setVideoimgwh(int videoimgwh) { + this.videoimgwh = videoimgwh; + } + + public String getVideo() { + return video; + } + + public void setVideo(String video) { + this.video = video; + } + + public String getVideoimg() { + return videoimg; + } + + public void setVideoimg(String videoimg) { + this.videoimg = videoimg; + } + } + + public static class CommentModel{ + + private String becomment;//被评论的人 + private String parentid;//被回复的评论id + private String comment;//评论的人 + private String content;//评论的内容 + private String userid;//谁回复的或者谁评论的 + + public String getBecomment() { + return becomment; + } + + public void setBecomment(String becomment) { + this.becomment = becomment; + } + + public String getParentid() { + return parentid; + } + + public void setParentid(String parentid) { + this.parentid = parentid; + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getUserid() { + return userid; + } + + public void setUserid(String userid) { + this.userid = userid; + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/CircleNewModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/CircleNewModel.java new file mode 100644 index 0000000000000000000000000000000000000000..100bd513545517e846d03207d9d2beb351469da5 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/CircleNewModel.java @@ -0,0 +1,250 @@ +package com.jiuqi.elove.entity; + +import java.io.Serializable; +import java.util.List; + +/** + * Created by jq on 2018/1/3. + */ + +public class CircleNewModel implements Serializable{ + + /** + * avatar : http://redbean.oss-cn-hangzhou.aliyuncs.com/newDir/8E14CADB948E7D866F2A576B37D5C447 + * userid : 5627A95DC00000217B38554BBF2EAC0E + * likenum : 1 + * pictures : [{"imgwh":0.75,"img":"http://redbean.oss-cn-hangzhou.aliyuncs.com/newDir/2F13950177687E0A174FF467DEC48315","cutimg":"http://redbean.oss-cn-hangzhou.aliyuncs.com/newDir/2F13950177687E0A174FF467DEC48315?x-oss-process=image/resize,m_lfit,h_150,w_150"}] + * topicid : + * islike : 0 + * nickname : 梵凡 + * topic : + * imgstype : 2 + * yuanquanid : D6F1F19019134772ADC552B8A2728882 + * position : + * time : 2017-12-18 17:31 + * text : + * commentnum : 2 + * + */ + + private String avatar; + private String userid; + private String likenum; + private String topicid; + private int islike; + private String nickname; + private String topic; + private int imgstype; + private String yuanquanid; + private String position; + private String time; + private String text; + private String commentnum; + private VideoModel video; + private String firendship; + private String collection; + + public String getFirendship() { + return firendship; + } + + public void setFirendship(String firendship) { + this.firendship = firendship; + } + + public VideoModel getVideo() { + return video; + } + + public void setVideo(VideoModel video) { + this.video = video; + } + + /** + * imgwh : 0.75 + * img : http://redbean.oss-cn-hangzhou.aliyuncs.com/newDir/2F13950177687E0A174FF467DEC48315 + * cutimg : http://redbean.oss-cn-hangzhou.aliyuncs.com/newDir/2F13950177687E0A174FF467DEC48315?x-oss-process=image/resize,m_lfit,h_150,w_150 + */ + + private List pictures; + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public String getUserid() { + return userid; + } + + public void setUserid(String userid) { + this.userid = userid; + } + + public String getLikenum() { + return likenum; + } + + public void setLikenum(String likenum) { + this.likenum = likenum; + } + + public String getTopicid() { + return topicid; + } + + public void setTopicid(String topicid) { + this.topicid = topicid; + } + + public int getIslike() { + return islike; + } + + public void setIslike(int islike) { + this.islike = islike; + } + + public String getNickname() { + return nickname; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } + + public String getTopic() { + return topic; + } + + public void setTopic(String topic) { + this.topic = topic; + } + + public int getImgstype() { + return imgstype; + } + + public void setImgstype(int imgstype) { + this.imgstype = imgstype; + } + + public String getYuanquanid() { + return yuanquanid; + } + + public void setYuanquanid(String yuanquanid) { + this.yuanquanid = yuanquanid; + } + + public String getPosition() { + return position; + } + + public void setPosition(String position) { + this.position = position; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + public String getCommentnum() { + return commentnum; + } + + public void setCommentnum(String commentnum) { + this.commentnum = commentnum; + } + + public String getCollection() { + return collection; + } + + public void setCollection(String collection) { + this.collection = collection; + } + + public List getPictures() { + return pictures; + } + + public void setPictures(List pictures) { + this.pictures = pictures; + } + + public static class VideoModel implements Serializable{ + private int videoimgwh; + private String video; + private String videoimg; + + public int getVideoimgwh() { + return videoimgwh; + } + + public void setVideoimgwh(int videoimgwh) { + this.videoimgwh = videoimgwh; + } + + public String getVideo() { + return video; + } + + public void setVideo(String video) { + this.video = video; + } + + public String getVideoimg() { + return videoimg; + } + + public void setVideoimg(String videoimg) { + this.videoimg = videoimg; + } + } + + public static class PicturesBean implements Serializable{ + private double imgwh; + private String img; + private String cutimg; + + public double getImgwh() { + return imgwh; + } + + public void setImgwh(double imgwh) { + this.imgwh = imgwh; + } + + public String getImg() { + return img; + } + + public void setImg(String img) { + this.img = img; + } + + public String getCutimg() { + return cutimg; + } + + public void setCutimg(String cutimg) { + this.cutimg = cutimg; + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/CircleTopicModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/CircleTopicModel.java new file mode 100644 index 0000000000000000000000000000000000000000..661d0fbda5f1079c50d7ff14436cc0d52b4fd2ba --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/CircleTopicModel.java @@ -0,0 +1,44 @@ +package com.jiuqi.elove.entity; + +import java.io.Serializable; + +/** + * Created by jq on 2018/1/5. + */ + +public class CircleTopicModel implements Serializable{ + + /** + * time : 2018-01-05 10:43:01 + * title : 李瑞东天下最帅 + * recid : 4005370BB0DE40EE877D4D833D399324 + */ + + private String time; + private String title; + private String recid; + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getRecid() { + return recid; + } + + public void setRecid(String recid) { + this.recid = recid; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/CommentModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/CommentModel.java new file mode 100644 index 0000000000000000000000000000000000000000..145f6e52740b90b8fd358a527828168b9b7197e4 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/CommentModel.java @@ -0,0 +1,99 @@ +package com.jiuqi.elove.entity; + +/** + * Created by jq on 2017/11/9. + */ + +import java.io.Serializable; + +/** + * Created by jq on 2017/11/1. + */ + +public class CommentModel implements Serializable{ + + + /** + * userAvatar : http://jq-qiyuan.oss-cn-hangzhou.aliyuncs.com/loveImg/624.png + * comment : 因为一个人,爱上一座城 + * otherName : + * childCount : 0 + * time : 刚刚 + * userName : 张仪(我) + * recid : 194459EE9EFE4916975D81EDB42C7B23 + * firstid : + */ + + private String userAvatar; + private String comment; + private String otherName; + private int childCount; + private String time; + private String userName; + private String recid; + private String firstid; + + public String getUserAvatar() { + return userAvatar; + } + + public void setUserAvatar(String userAvatar) { + this.userAvatar = userAvatar; + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + + public String getOtherName() { + return otherName; + } + + public void setOtherName(String otherName) { + this.otherName = otherName; + } + + public int getChildCount() { + return childCount; + } + + public void setChildCount(int childCount) { + this.childCount = childCount; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getRecid() { + return recid; + } + + public void setRecid(String recid) { + this.recid = recid; + } + + public String getFirstid() { + return firstid; + } + + public void setFirstid(String firstid) { + this.firstid = firstid; + } +} \ No newline at end of file diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/CommentWrapModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/CommentWrapModel.java new file mode 100644 index 0000000000000000000000000000000000000000..79cc255d8c625c0ce7d81353fa274f1a373df408 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/CommentWrapModel.java @@ -0,0 +1,38 @@ +package com.jiuqi.elove.entity; + +import java.util.List; + +/** + * Created by jq on 2017/11/1. + */ + +public class CommentWrapModel { + + private int pageCount; + private CommentModel user; + private List list; + + public int getPageCount() { + return pageCount; + } + + public void setPageCount(int pageCount) { + this.pageCount = pageCount; + } + + public List getList() { + return list; + } + + public void setList(List list) { + this.list = list; + } + + public CommentModel getUser() { + return user; + } + + public void setUser(CommentModel user) { + this.user = user; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/CompanyAuthModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/CompanyAuthModel.java new file mode 100644 index 0000000000000000000000000000000000000000..a5c05576d03a6df6048d64d87fbd08ac9facad4c --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/CompanyAuthModel.java @@ -0,0 +1,93 @@ +package com.jiuqi.elove.entity; + +/** + * 单位认证 + * Created by jq on 2017/12/12. + */ + +public class CompanyAuthModel { + + /** + * departname : + * reason : + * phone : 15210115164 + * enterprise : + * sex : 1 + * name : 刘琳 + * department : + * status : -1 + */ + + private String departname; + private String reason; + private String phone; + private String enterprise; + private String sex; + private String name; + private String department; + private String status; + + public String getDepartname() { + return departname; + } + + public void setDepartname(String departname) { + this.departname = departname; + } + + public String getReason() { + return reason; + } + + public void setReason(String reason) { + this.reason = reason; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getEnterprise() { + return enterprise; + } + + public void setEnterprise(String enterprise) { + this.enterprise = enterprise; + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDepartment() { + return department; + } + + public void setDepartment(String department) { + this.department = department; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/CompanyModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/CompanyModel.java new file mode 100644 index 0000000000000000000000000000000000000000..4eac0af1e627f39095ddb7dbcf6571d76e8a7273 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/CompanyModel.java @@ -0,0 +1,42 @@ +package com.jiuqi.elove.entity; + +/** + * Created by jq on 2017/12/12. + */ + +public class CompanyModel { + + /** + * enterpriseName : 红娘软件科技有限公司 + * enterpriseID : 53931D43600000211569BD256E0F262B + * children + */ + + private String enterpriseName; + private String enterpriseID; + private String children; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getEnterpriseName() { + return enterpriseName; + } + + public void setEnterpriseName(String enterpriseName) { + this.enterpriseName = enterpriseName; + } + + public String getEnterpriseID() { + return enterpriseID; + } + + public void setEnterpriseID(String enterpriseID) { + this.enterpriseID = enterpriseID; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/ConditionBean.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/ConditionBean.java new file mode 100644 index 0000000000000000000000000000000000000000..8a216edc359c2ff24d64b5db949c07fb2f0fdfff --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/ConditionBean.java @@ -0,0 +1,40 @@ +package com.jiuqi.elove.entity; + +import com.bigkoo.pickerview.model.IPickerViewData; + +/** + * 条件以及基本资料码和实际意义的对应 + * Created by dl on 2017/11/28. + */ + +public class ConditionBean implements IPickerViewData { + + private String code; + private String msg; + + public ConditionBean(String code,String msg){ + this.code = code; + this.msg = msg; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + @Override + public String getPickerViewText() { + return this.msg; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/ConsumeRedbeanModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/ConsumeRedbeanModel.java new file mode 100644 index 0000000000000000000000000000000000000000..da96a695ef1da2e9cfbb63f7dd62f2a4176eeabd --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/ConsumeRedbeanModel.java @@ -0,0 +1,35 @@ +package com.jiuqi.elove.entity; + +/** + * Created by dl on 2016/12/20. + */ +public class ConsumeRedbeanModel { + + private String ctime; + private String type;//1 充值 2 消费 + private String redbean; + + public String getCtime() { + return ctime; + } + + public void setCtime(String ctime) { + this.ctime = ctime; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getRedbean() { + return redbean; + } + + public void setRedbean(String redbean) { + this.redbean = redbean; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/ContactPersonModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/ContactPersonModel.java new file mode 100644 index 0000000000000000000000000000000000000000..95364cc5a913e68556981c4a71876d1b5faa53b1 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/ContactPersonModel.java @@ -0,0 +1,89 @@ +package com.jiuqi.elove.entity; + +/** + * Created by dl on 2016/7/15. + */ +public class ContactPersonModel { + + /** + * number : 10 + * kind : 1 + * sex : 1 + * nickname : bbedword + * avatar : http://redbean.oss-cn-hangzhou.aliyuncs.com/mobilepicture/540A121B60000021AFC3E67254FAACF7?Expires=1468555752&OSSAccessKeyId=ow4Kw1qlNtkl87hH&Signature=EgqfVtbdG2EZpQDWRHGQxJWkfW4%3D + * userID : 53A91C07E00000218968786AF40C26A4 + * declaration : + * ischeck false + */ + private int number; + private int kind; + private int sex; + private String nickname; + private String avatar; + private String userID; + private String declaration; + private boolean ischeck;//是否选择了,保持状态 + + public boolean ischeck() { + return ischeck; + } + public void setIscheck(boolean ischeck) { + this.ischeck = ischeck; + } + + public void setNumber(int number) { + this.number = number; + } + + public void setKind(int kind) { + this.kind = kind; + } + + public void setSex(int sex) { + this.sex = sex; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public void setUserID(String userID) { + this.userID = userID; + } + + public void setDeclaration(String declaration) { + this.declaration = declaration; + } + + public int getNumber() { + return number; + } + + public int getKind() { + return kind; + } + + public int getSex() { + return sex; + } + + public String getNickname() { + return nickname; + } + + public String getAvatar() { + return avatar; + } + + public String getUserID() { + return userID; + } + + public String getDeclaration() { + return declaration; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/DepartmentModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/DepartmentModel.java new file mode 100644 index 0000000000000000000000000000000000000000..f77fde09802f21c8a31502897871794378a646f2 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/DepartmentModel.java @@ -0,0 +1,122 @@ +package com.jiuqi.elove.entity; + +import java.util.List; + +/** + * Created by jq on 2017/12/14. + */ + +public class DepartmentModel { + + /** + * departmentID : EB44F4506063458093B77C300B271FA2 + * departmentName : 分子公司1 + * children : [{"departmentID":"E08342C2B5EE4B03AF9A20DE69D19B79","departmentName":"分子公司1部门1","children":[]}] + */ + + private String companyName;//自己加的字段 + private String companyId;//自己加的字段 + + private String departmentID; + private String departmentName; + + public String getCompanyName() { + return companyName; + } + + public void setCompanyName(String companyName) { + this.companyName = companyName; + } + + public String getCompanyId() { + return companyId; + } + + public void setCompanyId(String companyId) { + this.companyId = companyId; + } + + /** + * departmentID : E08342C2B5EE4B03AF9A20DE69D19B79 + * departmentName : 分子公司1部门1 + * children : [] + */ + + + + private List children; + + public String getDepartmentID() { + return departmentID; + } + + public void setDepartmentID(String departmentID) { + this.departmentID = departmentID; + } + + public String getDepartmentName() { + return departmentName; + } + + public void setDepartmentName(String departmentName) { + this.departmentName = departmentName; + } + + public List getChildren() { + return children; + } + + public void setChildren(List children) { + this.children = children; + } + + public static class ChildrenBean { + + private String companyName;//自己加的字段 + private String companyId;//自己加的字段 + + private String departmentID; + private String departmentName; + private List children; + + public String getDepartmentID() { + return departmentID; + } + + public void setDepartmentID(String departmentID) { + this.departmentID = departmentID; + } + + public String getDepartmentName() { + return departmentName; + } + + public void setDepartmentName(String departmentName) { + this.departmentName = departmentName; + } + + public List getChildren() { + return children; + } + + public void setChildren(List children) { + this.children = children; + } + + public String getCompanyName() { + return companyName; + } + + public void setCompanyName(String companyName) { + this.companyName = companyName; + } + + public String getCompanyId() { + return companyId; + } + + public void setCompanyId(String companyId) { + this.companyId = companyId; + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/DiscussEntity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/DiscussEntity.java new file mode 100644 index 0000000000000000000000000000000000000000..c16c89c95de6d7974bedd8f730801f3b85fc72bb --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/DiscussEntity.java @@ -0,0 +1,66 @@ +package com.jiuqi.elove.entity; + +/** + * + * Created by FanWenXia on 2016/7/19. + */ +public class DiscussEntity { + private String avatar;//发表评论的用户的头像 + private String pdnickname;//发表评论的用户的昵称 + private String time;//评论发表时间 + private String words;//评论内容 + private String rdnickname;//该评论回复的用户的昵称 + private String recid;//评论的ID + private String userid;//用户的ID + private int kind;//用户类型 1:企业用户; 0:普通用户; 2:中间状态 + + public String getAvatar(){ + return avatar; + } + public void setAvatar(String avatar){ + this.avatar = avatar; + } + public String getPdnickname(){ + return pdnickname; + } + public void setPdnickname(String pdnickname){ + this.pdnickname = pdnickname; + } + public String getTime(){ + return time; + } + public void setTime(String time){ + this.time = time; + } + public String getWords(){ + return words; + } + public void setWords(String words){ + this.words = words; + } + public String getRdnickname(){ + return rdnickname; + } + public void setRdnickname(String rdnickname){ + this.rdnickname = rdnickname; + } + public String getRecid(){ + return recid; + } + public void setRecid(String recid){ + this.recid = recid; + } + public String getUserid(){ + return userid; + } + public void setUserid(String userid){ + this.userid = userid; + } + public int getKind(){ + return kind; + } + public void setKind(int kind){ + this.kind = kind; + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/EActDetailModel2_0_3.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/EActDetailModel2_0_3.java new file mode 100644 index 0000000000000000000000000000000000000000..06729213508ed901a3e42d9bfe7714b4a353b981 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/EActDetailModel2_0_3.java @@ -0,0 +1,331 @@ +package com.jiuqi.elove.entity; + + +import java.util.List; + +/** + * + * Created by dl on 2016/11/11. + */ +public class EActDetailModel2_0_3 { + + private String picture;//活动图片 + private String title;//活动标题 + private String publish_time;//发布时间 + private String apply_time;//报名开始时间,没有用上 + private String start_time;//活动开始时间 + private String finish_time;//活动结束时间 + private String area;//活动举办地点 + private Double longitude;//举办地经度 + private Double latitude;//举办地纬度 + private String city;//举办城市 + private String maxnum;//报名最大人数 + private String apply_num;//已经报名人数 + private String holder;//举办单位名称 + private String company_details;//举办单位详情 + private String act_details;//活动介绍html + private String reviews;//活动评论数 + private String act_status;//活动状态,没有用上 + private String signstatus;//报名状态 +// private String order_status;//活动订单状态 + private String actid;//活动id + private String scans;//浏览次数 + private String shares;//分享次数 + private String pricerange;//价格区间 + private String ordernum;//订单号 + private Double viprate;//会员折扣 + private String holderid;//举办方id,用于屏蔽其活动使用 + private String version;//版本兼容 +// private HashMap pricelist; + private List pricelist; + private String linkname; + private String linkphone; + private String signLink; + private List co; + + public String getSignLink() { + return signLink; + } + + public void setSignLink(String signLink) { + this.signLink = signLink; + } + + public String getLinkname() { + return linkname; + } + + public void setLinkname(String linkname) { + this.linkname = linkname; + } + + public String getLinkphone() { + return linkphone; + } + + public void setLinkphone(String linkphone) { + this.linkphone = linkphone; + } + + public List getPricelist() { + return pricelist; + } + + public void setPricelist(List pricelist) { + this.pricelist = pricelist; + } + + public String getHolderid() { + return holderid; + } + + public void setHolderid(String holderid) { + this.holderid = holderid; + } + + public String getHolder() { + return holder; + } + + public void setHolder(String holder) { + this.holder = holder; + } + + public String getPicture() { + return picture; + } + + public void setPicture(String picture) { + this.picture = picture; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getPublish_time() { + return publish_time; + } + + public void setPublish_time(String publish_time) { + this.publish_time = publish_time; + } + + public String getApply_time() { + return apply_time; + } + + public void setApply_time(String apply_time) { + this.apply_time = apply_time; + } + + public String getStart_time() { + return start_time; + } + + public void setStart_time(String start_time) { + this.start_time = start_time; + } + + public String getFinish_time() { + return finish_time; + } + + public void setFinish_time(String finish_time) { + this.finish_time = finish_time; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public Double getLongitude() { + return longitude; + } + + public void setLongitude(Double longitude) { + this.longitude = longitude; + } + + public Double getLatitude() { + return latitude; + } + + public void setLatitude(Double latitude) { + this.latitude = latitude; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getMaxnum() { + return maxnum; + } + + public void setMaxnum(String maxnum) { + this.maxnum = maxnum; + } + + public String getApply_num() { + return apply_num; + } + + public void setApply_num(String apply_num) { + this.apply_num = apply_num; + } + + public String getCompany_details() { + return company_details; + } + + public void setCompany_details(String company_details) { + this.company_details = company_details; + } + + public String getAct_details() { + return act_details; + } + + public void setAct_details(String act_details) { + this.act_details = act_details; + } + + public String getReviews() { + return reviews; + } + + public void setReviews(String reviews) { + this.reviews = reviews; + } + + public String getAct_status() { + return act_status; + } + + public void setAct_status(String act_status) { + this.act_status = act_status; + } + + public String getSignstatus() { + return signstatus; + } + + public void setSignstatus(String signstatus) { + this.signstatus = signstatus; + } + +// public String getOrder_status() { +// return order_status; +// } +// +// public void setOrder_status(String order_status) { +// this.order_status = order_status; +// } + + public String getActid() { + return actid; + } + + public void setActid(String actid) { + this.actid = actid; + } + + public String getScans() { + return scans; + } + + public void setScans(String scans) { + this.scans = scans; + } + + public String getShares() { + return shares; + } + + public void setShares(String shares) { + this.shares = shares; + } + + public String getPricerange() { + return pricerange; + } + + public void setPricerange(String pricerange) { + this.pricerange = pricerange; + } + + public String getOrdernum() { + return ordernum; + } + + public void setOrdernum(String ordernum) { + this.ordernum = ordernum; + } + + public Double getViprate() { + return viprate; + } + + public void setViprate(Double viprate) { + this.viprate = viprate; + } + +// public HashMap getPricelist() { +// return pricelist; +// } +// +// public void setPricelist(HashMap pricelist) { +// this.pricelist = pricelist; +// } + + + public List getCo() { + return co; + } + + public void setCo(List co) { + this.co = co; + } + + public static class CoOrganizer { + private String url; + private String name; + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/EnterpriseActEntity2_0_3.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/EnterpriseActEntity2_0_3.java new file mode 100644 index 0000000000000000000000000000000000000000..c104e639061fc27cf91d7bd5b44f7551e1a9b2c9 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/EnterpriseActEntity2_0_3.java @@ -0,0 +1,129 @@ +package com.jiuqi.elove.entity; + +/** + * Created by FanWenXia on 2016/10/26. + */ +public class EnterpriseActEntity2_0_3 { + + /** + * actid : 57FFEC002000000110DFFAD2770E3046 + * city : 北京市 + * deadline : 4228753903 + * deadlineStr : 距离报名截止还剩 48 天 + * money : 0.01 + * poster : http://redbean.oss-cn-hangzhou.aliyuncs.com/newDir/1D2BDE0583EB0CF1AD03BD5EA65E0FF0 + * posterHeight : 600 + * posterWdith : 1066 + * status : 0 + * title : 想和你一起看美丽的晚霞 + */ + + private String actid; + private String city; + private long deadline; + private String deadlineStr; + private String money; + private String poster; + private String posterHeight; + private String posterWdith; + private int status; + private String title; + private String version; + private String maxNum; + + public String getMaxNum() { + return maxNum; + } + + public void setMaxNum(String maxNum) { + this.maxNum = maxNum; + } + + public String getActid() { + return actid; + } + + public void setActid(String actid) { + this.actid = actid; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public long getDeadline() { + return deadline; + } + + public void setDeadline(long deadline) { + this.deadline = deadline; + } + + public String getDeadlineStr() { + return deadlineStr; + } + + public void setDeadlineStr(String deadlineStr) { + this.deadlineStr = deadlineStr; + } + + public String getMoney() { + return money; + } + + public void setMoney(String money) { + this.money = money; + } + + public String getPoster() { + return poster; + } + + public void setPoster(String poster) { + this.poster = poster; + } + + public String getPosterHeight() { + return posterHeight; + } + + public void setPosterHeight(String posterHeight) { + this.posterHeight = posterHeight; + } + + public String getPosterWdith() { + return posterWdith; + } + + public void setPosterWdith(String posterWdith) { + this.posterWdith = posterWdith; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/ExchangeCardModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/ExchangeCardModel.java new file mode 100644 index 0000000000000000000000000000000000000000..c6e71b84a93eb370176ba1b79fd6cc58e4b2b642 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/ExchangeCardModel.java @@ -0,0 +1,80 @@ +package com.jiuqi.elove.entity; + +/** + * 卡券 + * Created by dl on 2017/3/31. + */ +public class ExchangeCardModel { + private String acttitle; + private String action; + private String tickettime; + private String money; + private String ticket; + private String actaddress; + private String acttime; + private int ifuse;//1已使用0正常2过期 + + public int getIfuse() { + return ifuse; + } + + public void setIfuse(int ifuse) { + this.ifuse = ifuse; + } + + public String getActtitle() { + return acttitle; + } + + public void setActtitle(String acttitle) { + this.acttitle = acttitle; + } + + public String getAction() { + return action; + } + + public void setAction(String action) { + this.action = action; + } + + public String getTickettime() { + return tickettime; + } + + public void setTickettime(String tickettime) { + this.tickettime = tickettime; + } + + public String getMoney() { + return money; + } + + public void setMoney(String money) { + this.money = money; + } + + public String getTicket() { + return ticket; + } + + public void setTicket(String ticket) { + this.ticket = ticket; + } + + public String getActaddress() { + return actaddress; + } + + public void setActaddress(String actaddress) { + this.actaddress = actaddress; + } + + public String getActtime() { + return acttime; + } + + public void setActtime(String acttime) { + this.acttime = acttime; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/FaceModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/FaceModel.java new file mode 100644 index 0000000000000000000000000000000000000000..e93debff0f069d6a1ecac5a0e06007df47d863df --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/FaceModel.java @@ -0,0 +1,43 @@ +package com.jiuqi.elove.entity; + +/** + * Created by dl on 2017/11/23. + */ + +public class FaceModel { + + /** + * expression : 1 + * sex : male + * facescore : 40 + */ + + private int expression; + private String sex; + private int age; + private String facescore; + + public int getExpression() { + return expression; + } + + public void setExpression(int expression) { + this.expression = expression; + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + + public String getFacescore() { + return facescore; + } + + public void setFacescore(String facescore) { + this.facescore = facescore; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/FellForUserInfoModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/FellForUserInfoModel.java new file mode 100644 index 0000000000000000000000000000000000000000..1fbb2d53e36f298fd2c88cd01cac7c232acc4ef0 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/FellForUserInfoModel.java @@ -0,0 +1,153 @@ +package com.jiuqi.elove.entity; + +import java.io.Serializable; + +/** + * + * Created by dl on 2016/7/8. + */ +public class FellForUserInfoModel implements Serializable{ + + + /** + * userID : 5659BD7B400000217E469D142AD96B59 + * sex : 1 + * degree : 2 + * height : 180 + * localplace : 天津市 和平区 + * nickname : 祝大捷 + * ifattention : 0 + * age : 22 + * avatar : http://redbean.oss-cn-hangzhou.aliyuncs.com/newDir/sEBtIuCYGTdzI9KlbldXgA%3D%3D + * photonum : 0 + * kind : 0 + * ifattention + */ + + private String userID; + private String sex; + private String degree; + private String height; + private String localplace; + private String nickname; + private String ifattention; + private String age; + private String avatar; + private String photonum; + private String kind; + private String distance; + private Double lng; + private Double lat; + + public Double getLng() { + return lng; + } + + public void setLng(Double lng) { + this.lng = lng; + } + + public Double getLat() { + return lat; + } + + public void setLat(Double lat) { + this.lat = lat; + } + + public String getDistance() { + return distance; + } + + public void setDistance(String distance) { + this.distance = distance; + } + + public String getUserID() { + return userID; + } + + public void setUserID(String userID) { + this.userID = userID; + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + + public String getDegree() { + return degree; + } + + public void setDegree(String degree) { + this.degree = degree; + } + + public String getHeight() { + return height; + } + + public void setHeight(String height) { + this.height = height; + } + + public String getLocalplace() { + return localplace; + } + + public void setLocalplace(String localplace) { + this.localplace = localplace; + } + + public String getNickname() { + return nickname; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } + + public String getIfattention() { + return ifattention; + } + + public void setIfattention(String ifattention) { + this.ifattention = ifattention; + } + + public String getAge() { + return age; + } + + public void setAge(String age) { + this.age = age; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public String getPhotonum() { + return photonum; + } + + public void setPhotonum(String photonum) { + this.photonum = photonum; + } + + public String getKind() { + return kind; + } + + public void setKind(String kind) { + this.kind = kind; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/FindContactPersonModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/FindContactPersonModel.java new file mode 100644 index 0000000000000000000000000000000000000000..bffec23b2f96bb3a1e874e39e20c628c528bd739 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/FindContactPersonModel.java @@ -0,0 +1,111 @@ +package com.jiuqi.elove.entity; + +/** + * + * Created by liulin on 2016/7/25. + */ +public class FindContactPersonModel { + + /** + * constellation : 天秤座 + * enterprise : 红娘软件科技有限公司 + * kind : 1 + * sex : 1 + * nickname : 红娘软件科技有限公司 + * avatar : http://redbean.oss-cn-hangzhou.aliyuncs.com/newDir/nVjGAxyxDpMGEGExJoL20g%3D%3D + * localplace : 贵州省黔西南布依族苗族自治州 + * userID : 539891F1200000213985884663EB63B7 + * age : 46 + */ + + private String constellation; + private String enterprise; + private int kind; + private int sex; + private String nickname; + private String avatar; + private String localplace; + private String userID; + private int age; + private String degree; + + public String getDegree() { + return degree; + } + + public void setDegree(String degree) { + this.degree = degree; + } + + public void setConstellation(String constellation) { + this.constellation = constellation; + } + + public void setEnterprise(String enterprise) { + this.enterprise = enterprise; + } + + public void setKind(int kind) { + this.kind = kind; + } + + public void setSex(int sex) { + this.sex = sex; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public void setLocalplace(String localplace) { + this.localplace = localplace; + } + + public void setUserID(String userID) { + this.userID = userID; + } + + public void setAge(int age) { + this.age = age; + } + + public String getConstellation() { + return constellation; + } + + public String getEnterprise() { + return enterprise; + } + + public int getKind() { + return kind; + } + + public int getSex() { + return sex; + } + + public String getNickname() { + return nickname; + } + + public String getAvatar() { + return avatar; + } + + public String getLocalplace() { + return localplace; + } + + public String getUserID() { + return userID; + } + + public int getAge() { + return age; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/GiftModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/GiftModel.java new file mode 100644 index 0000000000000000000000000000000000000000..6a7f60e18a5ed388a4d71e96538ec625e2fb8c4b --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/GiftModel.java @@ -0,0 +1,92 @@ +package com.jiuqi.elove.entity; + +/** + * 礼物 + * Created by dl on 2017/3/22. + */ +public class GiftModel { + + private String name; + private String name_real; + private int num; + private int redbean; + private String pic; + + //送礼物详情 + private String time; + private String nickname; + private String avatar; + private String userid; + + public String getUserid() { + return userid; + } + + public void setUserid(String userid) { + this.userid = userid; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getNickname() { + return nickname; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + public String getName_real() { + return name_real; + } + + public void setName_real(String name_real) { + this.name_real = name_real; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getRedbean() { + return redbean; + } + + public void setRedbean(int redbean) { + this.redbean = redbean; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/GroupMemModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/GroupMemModel.java new file mode 100644 index 0000000000000000000000000000000000000000..200d14b448cb5d58946398fa7c421b4c3763b33a --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/GroupMemModel.java @@ -0,0 +1,35 @@ +package com.jiuqi.elove.entity; + +/** + * Created by dl on 2016/12/23. + */ +public class GroupMemModel { + + private String userid; + private String avatar; + private String nickname; + + public String getUserid() { + return userid; + } + + public void setUserid(String userid) { + this.userid = userid; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public String getNickname() { + return nickname; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/ImageFloderModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/ImageFloderModel.java new file mode 100644 index 0000000000000000000000000000000000000000..0b3c759d5c59876bbe16c4ce4a6ef692b394587f --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/ImageFloderModel.java @@ -0,0 +1,67 @@ +package com.jiuqi.elove.entity; + +/** + * 自定义选择照片时用到的照片model + * @author dl + */ +public class ImageFloderModel +{ + /** + * 图片的文件夹路径 + */ + private String dir; + + /** + * 第一张图片的路径 + */ + private String firstImagePath; + + /** + * 文件夹的名称 + */ + private String name; + + /** + * 图片的数量 + */ + private int count; + + public String getDir() + { + return dir; + } + + public void setDir(String dir) + { + this.dir = dir; + int lastIndexOf = this.dir.lastIndexOf("/"); + this.name = this.dir.substring(lastIndexOf); + } + + public String getFirstImagePath() + { + return firstImagePath; + } + + public void setFirstImagePath(String firstImagePath) + { + this.firstImagePath = firstImagePath; + } + + public String getName() + { + return name; + } + public int getCount() + { + return count; + } + + public void setCount(int count) + { + this.count = count; + } + + + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/ImageViewHolder.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/ImageViewHolder.java new file mode 100644 index 0000000000000000000000000000000000000000..c55ddd14cbd7c138baba282fb02b5907dae99ac0 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/ImageViewHolder.java @@ -0,0 +1,140 @@ +package com.jiuqi.elove.entity; + +import android.content.Context; +import android.graphics.Bitmap; +import android.util.SparseArray; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import com.jiuqi.elove.util.ImageLoader; + + +public class ImageViewHolder +{ + private final SparseArray mViews; + private int mPosition; + private View mConvertView; + + private ImageViewHolder(Context context, ViewGroup parent, int layoutId, + int position) + { + this.mPosition = position; + this.mViews = new SparseArray(); + mConvertView = LayoutInflater.from(context).inflate(layoutId, parent, + false); + // setTag + mConvertView.setTag(this); + } + + /** + * 拿到一个ViewHolder对象 + * + * @param context + * @param convertView + * @param parent + * @param layoutId + * @param position + * @return + */ + public static ImageViewHolder get(Context context, View convertView, + ViewGroup parent, int layoutId, int position) + { + ImageViewHolder holder = null; + if (convertView == null) + { + holder = new ImageViewHolder(context, parent, layoutId, position); + } else + { + holder = (ImageViewHolder) convertView.getTag(); + holder.mPosition = position; + } + return holder; + } + + public View getConvertView() + { + return mConvertView; + } + + /** + * 通过控件的Id获取对于的控件,如果没有则加入views + * + * @param viewId + * @return + */ + public T getView(int viewId) + { + View view = mViews.get(viewId); + if (view == null) + { + view = mConvertView.findViewById(viewId); + mViews.put(viewId, view); + } + return (T) view; + } + + /** + * 为TextView设置字符串 + * + * @param viewId + * @param text + * @return + */ + public ImageViewHolder setText(int viewId, String text) + { + TextView view = getView(viewId); + view.setText(text); + return this; + } + + /** + * 为ImageView设置图片 + * + * @param viewId + * @param drawableId + * @return + */ + public ImageViewHolder setImageResource(int viewId, int drawableId) + { + ImageView view = getView(viewId); + view.setImageResource(drawableId); + + return this; + } + + /** + * 为ImageView设置图片 + * + * @param viewId + * @param + * @return + */ + public ImageViewHolder setImageBitmap(int viewId, Bitmap bm) + { + ImageView view = getView(viewId); + view.setImageBitmap(bm); + return this; + } + + /** + * 为ImageView设置图片 + * + * @param viewId + * @param + * @return + */ + public ImageViewHolder setImageByUrl(int viewId, String url) + { + ImageLoader.getInstance(3, ImageLoader.Type.LIFO).loadImage(url, (ImageView) getView(viewId)); + return this; + } + + public int getPosition() + { + return mPosition; + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/InviteMessage.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/InviteMessage.java new file mode 100644 index 0000000000000000000000000000000000000000..20872d0b0fba24d0d6a21e955e3a8a699e85ed27 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/InviteMessage.java @@ -0,0 +1,137 @@ +/** + * Copyright (C) 2016 Hyphenate Inc. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.jiuqi.elove.entity; + +public class InviteMessage { + private String from; + private long time; + private String reason; + + private InviteMesageStatus status; + private String groupId; + private String groupName; + private String groupInviter; + + private String nikename; + + public String getNikename() { + return nikename; + } + + public void setNikename(String nikename) { + this.nikename = nikename; + } + + private int id; + + public String getFrom() { + return from; + } + + public void setFrom(String from) { + this.from = from; + } + + public long getTime() { + return time; + } + + public void setTime(long time) { + this.time = time; + } + + + public String getReason() { + return reason; + } + + public void setReason(String reason) { + this.reason = reason; + } + + public InviteMesageStatus getStatus() { + return status; + } + + public void setStatus(InviteMesageStatus status) { + this.status = status; + } + + + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getGroupId() { + return groupId; + } + + public void setGroupId(String groupId) { + this.groupId = groupId; + } + + public String getGroupName() { + return groupName; + } + + public void setGroupName(String groupName) { + this.groupName = groupName; + } + + public void setGroupInviter(String inviter) { + groupInviter = inviter; + } + + public String getGroupInviter() { + return groupInviter; + } + + + + public enum InviteMesageStatus{ + + //==contact + /**being invited*/ + BEINVITEED, + /**being refused*/ + BEREFUSED, + /**remote user already agreed*/ + BEAGREED, + + //==group application + /**remote user apply to join*/ + BEAPPLYED, + /**you have agreed to join*/ + AGREED, + /**you refused the join request*/ + REFUSED, + + //==group invitation + /**received remote user's invitation**/ + GROUPINVITATION, + /**remote user accept your invitation**/ + GROUPINVITATION_ACCEPTED, + /**remote user declined your invitation**/ + GROUPINVITATION_DECLINED + } + +} + + + diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/LikeUserEntity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/LikeUserEntity.java new file mode 100644 index 0000000000000000000000000000000000000000..448529b67ffca89ab988c2f1d4799ec4d2093027 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/LikeUserEntity.java @@ -0,0 +1,90 @@ +package com.jiuqi.elove.entity; + +/** + * Created by FanWenXia on 2016/7/25. + */ +public class LikeUserEntity { + + /** + * time : 2016-08-02 15:48 + * nickname : 烦烦酸奶 + * userid : 5397CD406000002123D29275FCB63AA2 + * avatar : + * kind : 3 + * recodetime + * num + */ + + private String time; + private String nickname; + private String userid; + private String avatar; + private int kind; + private String num; + private String recodetime; + private String classify; + + public String getClassify() { + return classify; + } + + public void setClassify(String classify) { + this.classify = classify; + } + + public String getNum() { + return num; + } + + public void setNum(String num) { + this.num = num; + } + + public String getRecodetime() { + return recodetime; + } + + public void setRecodetime(String recodetime) { + this.recodetime = recodetime; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getNickname() { + return nickname; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } + + public String getUserid() { + return userid; + } + + public void setUserid(String userid) { + this.userid = userid; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public int getKind() { + return kind; + } + + public void setKind(int kind) { + this.kind = kind; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/MyActModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/MyActModel.java new file mode 100644 index 0000000000000000000000000000000000000000..834a724ece1b846186d114a17cf6b2fe9bc7380e --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/MyActModel.java @@ -0,0 +1,92 @@ +package com.jiuqi.elove.entity; + +/** + * Created by jq on 2017/11/22. + */ + +public class MyActModel { + + /** + * title : dasdasdasd + * status : 0 + * address : 北京市东城区南池子大街80号 + * start : 2017-11-30 + * posterWdith : 1066 + * recid : 5FB818DFE00000217CED41AE9D6E70DE + * poster : http://redbean.oss-cn-hangzhou.aliyuncs.com/newDir/55F3895DC4B45B59CBC0095170A8ED8D + * posterHeight : 600 + */ + + private String title; + private int status; + private String address; + private String start; + private int posterWdith; + private String recid; + private String poster; + private int posterHeight; + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getStart() { + return start; + } + + public void setStart(String start) { + this.start = start; + } + + public int getPosterWdith() { + return posterWdith; + } + + public void setPosterWdith(int posterWdith) { + this.posterWdith = posterWdith; + } + + public String getRecid() { + return recid; + } + + public void setRecid(String recid) { + this.recid = recid; + } + + public String getPoster() { + return poster; + } + + public void setPoster(String poster) { + this.poster = poster; + } + + public int getPosterHeight() { + return posterHeight; + } + + public void setPosterHeight(int posterHeight) { + this.posterHeight = posterHeight; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/MyInfoModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/MyInfoModel.java new file mode 100644 index 0000000000000000000000000000000000000000..549dc8df54cd88573df2bd5b8c54c3bd0f809850 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/MyInfoModel.java @@ -0,0 +1,481 @@ +package com.jiuqi.elove.entity; + +import java.util.List; + +/** + * + * Created by dl on 2016/7/22. + */ +public class MyInfoModel { + + /** + * IDNum : 100006 + * agerequest : 2 + * birthday : 1993-12-02 + * carrequest : 1 + * degree : 2 + * degreerequest : 2 + * enterprise : + * height : 160 + * heightrequest : 2 + * houserequest : 1 + * ifcar : 1 + * ifhouse : 1 + * income : 2 + * incomerequest : 4 + * kind : 0 + * localplace : 北京西城区 + * locationrequest : 北京西城区 + * marrige : 1 + * marrigerequest : 1 + * name : 苏凡 + * nickname : 樊凡 + * sex : 0 + * enterpriseid + *audittype 企业认证状态 1正在审核 0其他状态 + * realnametype :实名认证 + * visitortodaynum :今日访客 + * visitornum :总数 + * photos :相册 + * ifvideo :0未传 1传了 + * video + * completeness完成度 + * youthLeague 团认证 + * realnametype + * age + */ + + private String realnametype; + private String visitortodaynum; + private String visitornum; + private String IDNum; + private String agerequest; + private String birthday; + private String carrequest; + private String degree; + private String degreerequest; + private String enterprise; + private String height; + private String heightrequest; + private String houserequest; + private String ifcar; + private String ifhouse; + private String income; + private String incomerequest; + private String kind; + private String localplace; + private String locationrequest; + private String marrige; + private String marrigerequest; + private String name; + private String nickname; + private String sex; + private String enterpriseid; + private String declaration; + private String origo; + private String nation; + private String profession; + private List hobbys; + private List labels; + private String avatar; + private int avatartype; + private String minagerequest;// 最低年龄要求 + private String maxagerequest;// 最大年龄要求 + private String minheightrequest;// 最低身高 + private String maxheightrequest;// 最高身高 + private String audittype;//认证状态 + private String ifvideo; + private String video; + private String completeness; + private String emailtype; + private String youthLeague;//共青团 + private String weight; + private String school; + private String age; + + public String getAge() { + return age; + } + + public void setAge(String age) { + this.age = age; + } + + public String getSchool() { + return school; + } + + public void setSchool(String school) { + this.school = school; + } + + public String getWeight() { + return weight; + } + + public void setWeight(String weight) { + this.weight = weight; + } + + public String getYouthLeague() { + return youthLeague; + } + + public void setYouthLeague(String youthLeague) { + this.youthLeague = youthLeague; + } + + public String getEmailtype() { + return emailtype; + } + + public void setEmailtype(String emailtype) { + this.emailtype = emailtype; + } + + private List photos; + + public String getCompleteness() { + return completeness; + } + + public void setCompleteness(String completeness) { + this.completeness = completeness; + } + + public String getVideo() { + return video; + } + + public void setVideo(String video) { + this.video = video; + } + + public String getIfvideo() { + return ifvideo; + } + + public void setIfvideo(String ifvideo) { + this.ifvideo = ifvideo; + } + + public String getRealnametype() { + return realnametype; + } + + public void setRealnametype(String realnametype) { + this.realnametype = realnametype; + } + + public String getVisitortodaynum() { + return visitortodaynum; + } + + public void setVisitortodaynum(String visitortodaynum) { + this.visitortodaynum = visitortodaynum; + } + + public String getVisitornum() { + return visitornum; + } + + public void setVisitornum(String visitornum) { + this.visitornum = visitornum; + } + + public String getAudittype() { + return audittype; + } + + public void setAudittype(String audittype) { + this.audittype = audittype; + } + + public String getMinagerequest() { + return minagerequest; + } + + public void setMinagerequest(String minagerequest) { + this.minagerequest = minagerequest; + } + + public String getMaxagerequest() { + return maxagerequest; + } + + public void setMaxagerequest(String maxagerequest) { + this.maxagerequest = maxagerequest; + } + + public String getMinheightrequest() { + return minheightrequest; + } + + public void setMinheightrequest(String minheightrequest) { + this.minheightrequest = minheightrequest; + } + + public String getMaxheightrequest() { + return maxheightrequest; + } + + public void setMaxheightrequest(String maxheightrequest) { + this.maxheightrequest = maxheightrequest; + } + + public int getAvatartype() { + return avatartype; + } + + public void setAvatartype(int avatartype) { + this.avatartype = avatartype; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public String getEnterpriseid() { + return enterpriseid; + } + + public void setEnterpriseid(String enterpriseid) { + this.enterpriseid = enterpriseid; + } + + public String getIDNum() { + return IDNum; + } + + public void setIDNum(String IDNum) { + this.IDNum = IDNum; + } + + public String getAgerequest() { + return agerequest; + } + + public void setAgerequest(String agerequest) { + this.agerequest = agerequest; + } + + public String getBirthday() { + return birthday; + } + + public void setBirthday(String birthday) { + this.birthday = birthday; + } + + public String getCarrequest() { + return carrequest; + } + + public void setCarrequest(String carrequest) { + this.carrequest = carrequest; + } + + public String getDegree() { + return degree; + } + + public void setDegree(String degree) { + this.degree = degree; + } + + public String getDegreerequest() { + return degreerequest; + } + + public void setDegreerequest(String degreerequest) { + this.degreerequest = degreerequest; + } + + public String getEnterprise() { + return enterprise; + } + + public void setEnterprise(String enterprise) { + this.enterprise = enterprise; + } + + public String getHeight() { + return height; + } + + public void setHeight(String height) { + this.height = height; + } + + public String getHeightrequest() { + return heightrequest; + } + + public void setHeightrequest(String heightrequest) { + this.heightrequest = heightrequest; + } + + public String getHouserequest() { + return houserequest; + } + + public void setHouserequest(String houserequest) { + this.houserequest = houserequest; + } + + public String getIfcar() { + return ifcar; + } + + public void setIfcar(String ifcar) { + this.ifcar = ifcar; + } + + public String getIfhouse() { + return ifhouse; + } + + public void setIfhouse(String ifhouse) { + this.ifhouse = ifhouse; + } + + public String getIncome() { + return income; + } + + public void setIncome(String income) { + this.income = income; + } + + public String getIncomerequest() { + return incomerequest; + } + + public void setIncomerequest(String incomerequest) { + this.incomerequest = incomerequest; + } + + public String getKind() { + return kind; + } + + public void setKind(String kind) { + this.kind = kind; + } + + public String getLocalplace() { + return localplace; + } + + public void setLocalplace(String localplace) { + this.localplace = localplace; + } + + public String getLocationrequest() { + return locationrequest; + } + + public void setLocationrequest(String locationrequest) { + this.locationrequest = locationrequest; + } + + public String getMarrige() { + return marrige; + } + + public void setMarrige(String marrige) { + this.marrige = marrige; + } + + public String getMarrigerequest() { + return marrigerequest; + } + + public void setMarrigerequest(String marrigerequest) { + this.marrigerequest = marrigerequest; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getNickname() { + return nickname; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + + public String getDeclaration() { + return declaration; + } + + public void setDeclaration(String declaration) { + this.declaration = declaration; + } + + public String getOrigo() { + return origo; + } + + public void setOrigo(String origo) { + this.origo = origo; + } + + public String getNation() { + return nation; + } + + public void setNation(String nation) { + this.nation = nation; + } + + public String getProfession() { + return profession; + } + + public void setProfession(String profession) { + this.profession = profession; + } + + public List getHobbys() { + return hobbys; + } + + public void setHobbys(List hobbys) { + this.hobbys = hobbys; + } + + public List getLabels() { + return labels; + } + + public void setLabels(List labels) { + this.labels = labels; + } + + public List getPhotos() { + return photos; + } + + public void setPhotos(List photos) { + this.photos = photos; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/MyPhotoModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/MyPhotoModel.java new file mode 100644 index 0000000000000000000000000000000000000000..0cba146f815a2433640cfa5c2565386f42b67335 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/MyPhotoModel.java @@ -0,0 +1,48 @@ +package com.jiuqi.elove.entity; + +/** + * Created by dl on 2016/8/25. + */ +public class MyPhotoModel { + + /** + * photosId : mobilepicture/55238604A0000021E9F56C0B5D532DD9 + * picUrl : http://redbean.oss-cn-hangzhou.aliyuncs.com/mobilepicture/55238604A0000021E9F56C0B5D532DD9 + */ + private String photosId; + private String picUrl; + private String picUrlcut; + private boolean isEidtFlag; + + public String getPicUrlcut() { + return picUrlcut; + } + + public void setPicUrlcut(String picUrlcut) { + this.picUrlcut = picUrlcut; + } + + public boolean isEidtFlag() { + return isEidtFlag; + } + + public void setEidtFlag(boolean eidtFlag) { + isEidtFlag = eidtFlag; + } + + public void setPhotosId(String photosId) { + this.photosId = photosId; + } + + public void setPicUrl(String picUrl) { + this.picUrl = picUrl; + } + + public String getPhotosId() { + return photosId; + } + + public String getPicUrl() { + return picUrl; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/MyRealNameBean.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/MyRealNameBean.java new file mode 100644 index 0000000000000000000000000000000000000000..7412cfb2faf81556738a050feed5b0bcae83aaad --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/MyRealNameBean.java @@ -0,0 +1,63 @@ +package com.jiuqi.elove.entity; + +/** + * + * Created by dl on 2017/11/29. + */ + +public class MyRealNameBean { + + /** + * realName : 刘琳 + * photo : http://redbean.oss-cn-hangzhou.aliyuncs.com/upImage/254197D1D2874A6EB218F8BEF0BDBDAF + * reason : + * cardNo : 130128199007261855 + * status : 0等待 1通过 2拒绝 -1没有提交过 + */ + + private String realName; + private String photo; + private String reason; + private String cardNo; + private String status; + + public String getRealName() { + return realName; + } + + public void setRealName(String realName) { + this.realName = realName; + } + + public String getPhoto() { + return photo; + } + + public void setPhoto(String photo) { + this.photo = photo; + } + + public String getReason() { + return reason; + } + + public void setReason(String reason) { + this.reason = reason; + } + + public String getCardNo() { + return cardNo; + } + + public void setCardNo(String cardNo) { + this.cardNo = cardNo; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/NameCardModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/NameCardModel.java new file mode 100644 index 0000000000000000000000000000000000000000..ad3e4948c077d05e601996c6c7d1f92998ae7e0d --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/NameCardModel.java @@ -0,0 +1,124 @@ +package com.jiuqi.elove.entity; + +import com.google.gson.annotations.SerializedName; + +/** + * Created by jq on 2017/11/24. + */ + +public class NameCardModel { + + /** + * sex : 0 + * degree : 0 + * height : 0 + * localplace : + * nickname : 张仪 + * income : 0 + * profession : 0 + * age : 47 + * idcardtype : 0 + * avatar : http://redbean.oss-cn-hangzhou.aliyuncs.com/faceImage/F430D31A6B40F8BA240CBD4FE39392FA + * facescore : 0 + */ + + private String sex; + private String degree; + private String height; + private String localplace; + private String nickname; + private String income; + private String profession; + private String age; + private int realnametype; + private String avatar; + private String facescore; + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + + public String getDegree() { + return degree; + } + + public void setDegree(String degree) { + this.degree = degree; + } + + public String getHeight() { + return height; + } + + public void setHeight(String height) { + this.height = height; + } + + public String getLocalplace() { + return localplace; + } + + public void setLocalplace(String localplace) { + this.localplace = localplace; + } + + public String getNickname() { + return nickname; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } + + public String getIncome() { + return income; + } + + public void setIncome(String income) { + this.income = income; + } + + public String getProfession() { + return profession; + } + + public void setProfession(String profession) { + this.profession = profession; + } + + public String getAge() { + return age; + } + + public void setAge(String age) { + this.age = age; + } + + public int getRealnametype() { + return realnametype; + } + + public void setRealnametype(int realnametype) { + this.realnametype = realnametype; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public String getFacescore() { + return facescore; + } + + public void setFacescore(String facescore) { + this.facescore = facescore; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/NotifyModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/NotifyModel.java new file mode 100644 index 0000000000000000000000000000000000000000..34efdc5840dff6ea6093fde1f9cf3e14b6f2d94c --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/NotifyModel.java @@ -0,0 +1,39 @@ +package com.jiuqi.elove.entity; + +import java.io.Serializable; +import java.util.List; + +/** + * 通知消息model + * Created by dl on 2017/3/16. + */ +public class NotifyModel implements Serializable{ + + private List mSysList; + private List mActList; + private List mArticleList; + + public List getmSysList() { + return mSysList; + } + + public void setmSysList(List mSysList) { + this.mSysList = mSysList; + } + + public List getmActList() { + return mActList; + } + + public void setmActList(List mActList) { + this.mActList = mActList; + } + + public List getmArticleList() { + return mArticleList; + } + + public void setmArticleList(List mArticleList) { + this.mArticleList = mArticleList; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/OrderManageModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/OrderManageModel.java new file mode 100644 index 0000000000000000000000000000000000000000..064d3ad39e1e98869569d98d86655c6f47477634 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/OrderManageModel.java @@ -0,0 +1,118 @@ +package com.jiuqi.elove.entity; + +/** + * Created by dl on 2016/10/11. + */ +public class OrderManageModel { + + /** + * act_state : + * fee : 0.01 + * ordernum : 20161011170814119571526474754536 + * orderstate : 1 + * post : + * refund_fee : + * refund_state : + * subject : "mmm密密麻麻密密麻麻"活动报名 + */ + + private String act_state; + private String fee; + private String ordernum; + private int orderstate; + private String post; + private String refund_fee; + private String refund_state; + private String subject; + private String actid; + private String actaddress; + private String acttime; + + public String getActaddress() { + return actaddress; + } + + public void setActaddress(String actaddress) { + this.actaddress = actaddress; + } + + public String getActtime() { + return acttime; + } + + public void setActtime(String acttime) { + this.acttime = acttime; + } + + public String getActid() { + return actid; + } + + public void setActid(String actid) { + this.actid = actid; + } + + public String getAct_state() { + return act_state; + } + + public void setAct_state(String act_state) { + this.act_state = act_state; + } + + public String getFee() { + return fee; + } + + public void setFee(String fee) { + this.fee = fee; + } + + public String getOrdernum() { + return ordernum; + } + + public void setOrdernum(String ordernum) { + this.ordernum = ordernum; + } + + public int getOrderstate() { + return orderstate; + } + + public void setOrderstate(int orderstate) { + this.orderstate = orderstate; + } + + public String getPost() { + return post; + } + + public void setPost(String post) { + this.post = post; + } + + public String getRefund_fee() { + return refund_fee; + } + + public void setRefund_fee(String refund_fee) { + this.refund_fee = refund_fee; + } + + public String getRefund_state() { + return refund_state; + } + + public void setRefund_state(String refund_state) { + this.refund_state = refund_state; + } + + public String getSubject() { + return subject; + } + + public void setSubject(String subject) { + this.subject = subject; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/OrderModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/OrderModel.java new file mode 100644 index 0000000000000000000000000000000000000000..117048e4c3c0dd890e760c1ad7730b9ad6dfb9ab --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/OrderModel.java @@ -0,0 +1,197 @@ +package com.jiuqi.elove.entity; + +/** + * Created by dl on 2016/9/27. + * 订单信息 + */ +public class OrderModel { + private String actstart; + private String fee; + private String title; + private String address; + private String post; + private String order_num; + private long ex_time; + private String order_state;//订单信息中(不是支付的时候) + private String act_state; + private String refund_fee; + private String refund_state; + private Double needpay; + private String payredbean; + private String userredbean; + private String realfee;//实际支付 + private String remarknm;//姓名 + private String remarkep;//公司 + private String ticketid; + private String tickettype;//类型 + private String ticketmoney;//票价 + private int myticketnum;//优惠券数量 + + public int getMyticketnum() { + return myticketnum; + } + + public void setMyticketnum(int myticketnum) { + this.myticketnum = myticketnum; + } + + public String getTickettype() { + return tickettype; + } + + public void setTickettype(String tickettype) { + this.tickettype = tickettype; + } + + public String getTicketmoney() { + return ticketmoney; + } + + public void setTicketmoney(String ticketmoney) { + this.ticketmoney = ticketmoney; + } + + public String getTicketid() { + return ticketid; + } + + public void setTicketid(String ticketid) { + this.ticketid = ticketid; + } + + public String getRemarknm() { + return remarknm; + } + + public void setRemarknm(String remarknm) { + this.remarknm = remarknm; + } + + public String getRemarkep() { + return remarkep; + } + + public void setRemarkep(String remarkep) { + this.remarkep = remarkep; + } + + public String getRealfee() { + return realfee; + } + + public void setRealfee(String realfee) { + this.realfee = realfee; + } + + public Double getNeedpay() { + return needpay; + } + + public void setNeedpay(Double needpay) { + this.needpay = needpay; + } + + public String getPayredbean() { + return payredbean; + } + + public void setPayredbean(String payredbean) { + this.payredbean = payredbean; + } + + public String getUserredbean() { + return userredbean; + } + + public void setUserredbean(String userredbean) { + this.userredbean = userredbean; + } + + public String getAct_state() { + return act_state; + } + + public void setAct_state(String act_state) { + this.act_state = act_state; + } + + public String getRefund_fee() { + return refund_fee; + } + + public void setRefund_fee(String refund_fee) { + this.refund_fee = refund_fee; + } + + public String getRefund_state() { + return refund_state; + } + + public void setRefund_state(String refund_state) { + this.refund_state = refund_state; + } + + public String getOrder_state() { + return order_state; + } + + public void setOrder_state(String order_state) { + this.order_state = order_state; + } + + public String getActstart() { + return actstart; + } + + public void setActstart(String actstart) { + this.actstart = actstart; + } + + public String getFee() { + return fee; + } + + public void setFee(String fee) { + this.fee = fee; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getPost() { + return post; + } + + public void setPost(String post) { + this.post = post; + } + + public String getOrder_num() { + return order_num; + } + + public void setOrder_num(String order_num) { + this.order_num = order_num; + } + + public long getEx_time() { + return ex_time; + } + + public void setEx_time(long ex_time) { + this.ex_time = ex_time; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/OtherInfoCenterModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/OtherInfoCenterModel.java new file mode 100644 index 0000000000000000000000000000000000000000..7b5b604e1851412f050823063890e0bc2a35d546 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/OtherInfoCenterModel.java @@ -0,0 +1,584 @@ +package com.jiuqi.elove.entity; + +import java.util.List; + +/** + * + * Created by dl on 2016/7/26. + */ +public class OtherInfoCenterModel { + + /** + * IDNum : + * address : 北京市大兴区西环中路6号 + * age : 25 + * agerequest : 1 + * avatar : http://redbean.oss-cn-hangzhou.aliyuncs.com/newDir/hCMIXFSII9RnUzrly0C6rQ%3D%3D + * birthday : 1991-08-29 + * carrequest : 2 + * degree : 2 + * degreerequest : 2 + * enterName : 久其软件 + * enterpriseid : 53AE263F600000213FECFA24EF56EE81 + * firendship : 0 + * height : 165 + * heightrequest : 3 + * hobbys : [] + * houserequest : 2 + * ifcar : 2 + * ifhouse : 2 + * iflike : 2 + * income : 3 + * incomerequest : 3 + * introduce : 暂时没收到简介,正在努力收集 + * kind : 1 + * labels : ["高贵冷艳","勤俭持家","端庄大方","青春活泼","妹妹"] + * lat : 39.78565 + * likenum : 3 + * lng : 116.505649 + * localplace : 海南省 海口市 + * locationrequest : 海南省 海口市 + * lovedeclaration : 尽职尽责京召开 + * marrige : 1 + * name : 孙雅美 + * nickname : 没什么 + * pictures : [{"photosId":"56DF7E9520000021E15E0F87EBE7CAAD","picUrl":"http://redbean.oss-cn-hangzhou.aliyuncs.com/newDir/%2B0TwxHmUkeULAgrw68pPkA%3D%3D"},{"photosId":"56DF7E95200000416CCB81A292B286A9","picUrl":"http://redbean.oss-cn-hangzhou.aliyuncs.com/newDir/sXxq8rlQvQZp1Vs3J/XE9A%3D%3D"},{"photosId":"56E37676C00000214DA71E4F95492196","picUrl":"http://redbean.oss-cn-hangzhou.aliyuncs.com/newDir/PVIU8iBQJmbYXlGSxEJrww%3D%3D"}] + * sex : 0 + * videotype : 0 + * video : "" + * profession职业 + * nation民族 + * origo籍贯 + * bereave 是否封禁 1被封禁 0正常 + * testRecord 0未测试 + *usertestRecord 1测试过 0未测试过 + * scannum 看过他的人数 + * likenum 赞过他的人数 + * match 匹配度 + */ + + private String IDNum; + private String address; + private String age; + private String agerequest; + private String avatar; + private String birthday; + private String carrequest; + private String degree; + private String degreerequest; + private String enterName; + private String enterpriseid; + private String firendship; + private String height; + private String heightrequest; + private String houserequest; + private String ifcar; + private String ifhouse; + private String iflike; + private String income; + private String incomerequest; + private String introduce; + private String kind; + private String lat; + private String likenum; + private String lng; + private String localplace; + private String locationrequest; + private String lovedeclaration; + private String marrige; + private String name; + private String nickname; + private String sex; + private String ifvideo; + private String video; + private List hobbys; + private List labels; + private String profession; + private String nation; + private String origo; + private String bereave; + private String testRecord; + private String minagerequest;// 最低年龄要求 + private String maxagerequest;// 最大年龄要求 + private String minheightrequest;// 最低身高 + private String maxheightrequest;// 最高身高 + private String usertestRecord;//当前用户是否测试过 + private String scannum; + private String match; + private String realnametype;//实名认证 + private String emailtype; + private String youthLeague; + private String weight; + private String school;//毕业院校 + + public String getSchool() { + return school; + } + + public void setSchool(String school) { + this.school = school; + } + + public String getWeight() { + return weight; + } + + public void setWeight(String weight) { + this.weight = weight; + } + + public String getYouthLeague() { + return youthLeague; + } + + public void setYouthLeague(String youthLeague) { + this.youthLeague = youthLeague; + } + + public String getEmailtype() { + return emailtype; + } + + public void setEmailtype(String emailtype) { + this.emailtype = emailtype; + } + + public String getRealnametype() { + return realnametype; + } + + public void setRealnametype(String realnametype) { + this.realnametype = realnametype; + } + + public String getMatch() { + return match; + } + + public void setMatch(String match) { + this.match = match; + } + + public String getUsertestRecord() { + return usertestRecord; + } + + public void setUsertestRecord(String usertestRecord) { + this.usertestRecord = usertestRecord; + } + + public String getMinagerequest() { + return minagerequest; + } + + public void setMinagerequest(String minagerequest) { + this.minagerequest = minagerequest; + } + + public String getMaxagerequest() { + return maxagerequest; + } + + public void setMaxagerequest(String maxagerequest) { + this.maxagerequest = maxagerequest; + } + + public String getMinheightrequest() { + return minheightrequest; + } + + public void setMinheightrequest(String minheightrequest) { + this.minheightrequest = minheightrequest; + } + + public String getMaxheightrequest() { + return maxheightrequest; + } + + public void setMaxheightrequest(String maxheightrequest) { + this.maxheightrequest = maxheightrequest; + } + + public String getTestRecord() { + return testRecord; + } + + public void setTestRecord(String testRecord) { + this.testRecord = testRecord; + } + + public String getBereave() { + return bereave; + } + + public void setBereave(String bereave) { + this.bereave = bereave; + } + + public String getProfession() { + return profession; + } + + public void setProfession(String profession) { + this.profession = profession; + } + + public String getNation() { + return nation; + } + + public void setNation(String nation) { + this.nation = nation; + } + + public String getOrigo() { + return origo; + } + + public void setOrigo(String origo) { + this.origo = origo; + } + + /** + * photosId : 56DF7E9520000021E15E0F87EBE7CAAD + * picUrl : http://redbean.oss-cn-hangzhou.aliyuncs.com/newDir/%2B0TwxHmUkeULAgrw68pPkA%3D%3D + */ + + + private List pictures; + + public String getIDNum() { + return IDNum; + } + + public void setIDNum(String IDNum) { + this.IDNum = IDNum; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getAge() { + return age; + } + + public void setAge(String age) { + this.age = age; + } + + public String getAgerequest() { + return agerequest; + } + + public void setAgerequest(String agerequest) { + this.agerequest = agerequest; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public String getBirthday() { + return birthday; + } + + public void setBirthday(String birthday) { + this.birthday = birthday; + } + + public String getCarrequest() { + return carrequest; + } + + public void setCarrequest(String carrequest) { + this.carrequest = carrequest; + } + + public String getDegree() { + return degree; + } + + public void setDegree(String degree) { + this.degree = degree; + } + + public String getDegreerequest() { + return degreerequest; + } + + public void setDegreerequest(String degreerequest) { + this.degreerequest = degreerequest; + } + + public String getEnterName() { + return enterName; + } + + public void setEnterName(String enterName) { + this.enterName = enterName; + } + + public String getEnterpriseid() { + return enterpriseid; + } + + public void setEnterpriseid(String enterpriseid) { + this.enterpriseid = enterpriseid; + } + + public String getFirendship() { + return firendship; + } + + public void setFirendship(String firendship) { + this.firendship = firendship; + } + + public String getHeight() { + return height; + } + + public void setHeight(String height) { + this.height = height; + } + + public String getHeightrequest() { + return heightrequest; + } + + public void setHeightrequest(String heightrequest) { + this.heightrequest = heightrequest; + } + + public String getHouserequest() { + return houserequest; + } + + public void setHouserequest(String houserequest) { + this.houserequest = houserequest; + } + + public String getIfcar() { + return ifcar; + } + + public void setIfcar(String ifcar) { + this.ifcar = ifcar; + } + + public String getIfhouse() { + return ifhouse; + } + + public void setIfhouse(String ifhouse) { + this.ifhouse = ifhouse; + } + + public String getIflike() { + return iflike; + } + + public void setIflike(String iflike) { + this.iflike = iflike; + } + + public String getIncome() { + return income; + } + + public void setIncome(String income) { + this.income = income; + } + + public String getIncomerequest() { + return incomerequest; + } + + public void setIncomerequest(String incomerequest) { + this.incomerequest = incomerequest; + } + + public String getIntroduce() { + return introduce; + } + + public void setIntroduce(String introduce) { + this.introduce = introduce; + } + + public String getKind() { + return kind; + } + + public void setKind(String kind) { + this.kind = kind; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public String getLikenum() { + return likenum; + } + + public void setLikenum(String likenum) { + this.likenum = likenum; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getLocalplace() { + return localplace; + } + + public void setLocalplace(String localplace) { + this.localplace = localplace; + } + + public String getLocationrequest() { + return locationrequest; + } + + public void setLocationrequest(String locationrequest) { + this.locationrequest = locationrequest; + } + + public String getLovedeclaration() { + return lovedeclaration; + } + + public void setLovedeclaration(String lovedeclaration) { + this.lovedeclaration = lovedeclaration; + } + + public String getMarrige() { + return marrige; + } + + public void setMarrige(String marrige) { + this.marrige = marrige; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getNickname() { + return nickname; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + + public String getIfvideo() { + return ifvideo; + } + + public void setIfvideo(String ifvideo) { + this.ifvideo = ifvideo; + } + + + public String getVideo() { + return video; + } + + public void setVideo(String video) { + this.video = video; + } + + public String getScannum() { + return scannum; + } + + public void setScannum(String scannum) { + this.scannum = scannum; + } + + public List getHobbys() { + return hobbys; + } + + public void setHobbys(List hobbys) { + this.hobbys = hobbys; + } + + public List getLabels() { + return labels; + } + + public void setLabels(List labels) { + this.labels = labels; + } + + public List getPictures() { + return pictures; + } + + public void setPictures(List pictures) { + this.pictures = pictures; + } + + public static class PicturesBean { + private String photosId; + private String picUrl; + private String picUrlcut; + + public String getPicUrlcut() { + return picUrlcut; + } + + public void setPicUrlcut(String picUrlcut) { + this.picUrlcut = picUrlcut; + } + + public String getPhotosId() { + return photosId; + } + + public void setPhotosId(String photosId) { + this.photosId = photosId; + } + + public String getPicUrl() { + return picUrl; + } + + public void setPicUrl(String picUrl) { + this.picUrl = picUrl; + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/PreVideoEntity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/PreVideoEntity.java new file mode 100644 index 0000000000000000000000000000000000000000..81b43db041774ec3344c807bc76725c17ad84db6 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/PreVideoEntity.java @@ -0,0 +1,80 @@ +package com.jiuqi.elove.entity; + +/** + * Created by dl on 2016/9/20. + */ +public class PreVideoEntity { + + /** + * age : 22 + * avatar : http://redbean.oss-cn-hangzhou.aliyuncs.com/newDir/24D81A42F94E3BD54D712F973D7A0780 + * nickname : 饭饭 + * sex : 0 + * video : http://redbean.oss-cn-hangzhou.aliyuncs.com/newDir/video/5A000081D4CBA5A8CD5C6BFD08818D3E.mp4 + * videotype : 2 + */ + private String IDNum; + private int age; + private String avatar; + private String nickname; + private int sex; + private String video; + private int videotype; + + public String getIDNum() { + return IDNum; + } + + public void setIDNum(String IDNum) { + this.IDNum = IDNum; + } + + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public String getNickname() { + return nickname; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } + + public int getSex() { + return sex; + } + + public void setSex(int sex) { + this.sex = sex; + } + + public String getVideo() { + return video; + } + + public void setVideo(String video) { + this.video = video; + } + + public int getVideotype() { + return videotype; + } + + public void setVideotype(int videotype) { + this.videotype = videotype; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/PriceInfoModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/PriceInfoModel.java new file mode 100644 index 0000000000000000000000000000000000000000..f4acef88b5c2809c47a3ccbfb55249101792b411 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/PriceInfoModel.java @@ -0,0 +1,45 @@ +package com.jiuqi.elove.entity; + +/** + * + * Created by liulin on 2016/11/10. + */ +public class PriceInfoModel { + + private String money; + private String ticketid;//类目id + private String ticket;//类目 + private String reservenum;//剩余票数 + + public String getMoney() { + return money; + } + + public void setMoney(String money) { + this.money = money; + } + + public String getTicketid() { + return ticketid; + } + + public void setTicketid(String ticketid) { + this.ticketid = ticketid; + } + + public String getTicket() { + return ticket; + } + + public void setTicket(String ticket) { + this.ticket = ticket; + } + + public String getReservenum() { + return reservenum; + } + + public void setReservenum(String reservenum) { + this.reservenum = reservenum; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/ProvinceBean.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/ProvinceBean.java new file mode 100644 index 0000000000000000000000000000000000000000..f9b9191e324a4666403e9179da6500ca8b5540c6 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/ProvinceBean.java @@ -0,0 +1,101 @@ +package com.jiuqi.elove.entity; + +import com.bigkoo.pickerview.model.IPickerViewData; + +import java.util.List; + +/** + * Created by dl on 2017/7/18 + */ +public class ProvinceBean implements IPickerViewData { + + private String ProID; + private String name; + private String ProSort; + private String ProRemark; + private List cityList; + + public String getProID() { + return ProID; + } + + public void setProID(String proID) { + ProID = proID; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getProSort() { + return ProSort; + } + + public void setProSort(String proSort) { + ProSort = proSort; + } + + public String getProRemark() { + return ProRemark; + } + + public void setProRemark(String proRemark) { + ProRemark = proRemark; + } + + public List getCityList() { + return cityList; + } + + public void setCityList(List cityList) { + this.cityList = cityList; + } + + @Override + public String getPickerViewText() { + return this.name; + } + + public static class CityBean{ + private String CityID; + private String name; + private String ProID; + private String CitySort; + + public String getCityID() { + return CityID; + } + + public void setCityID(String cityID) { + CityID = cityID; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getProID() { + return ProID; + } + + public void setProID(String proID) { + ProID = proID; + } + + public String getCitySort() { + return CitySort; + } + + public void setCitySort(String citySort) { + CitySort = citySort; + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/PushModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/PushModel.java new file mode 100644 index 0000000000000000000000000000000000000000..5bfebd4cf97ec2da1fc057ecdf7abb1746ae5087 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/PushModel.java @@ -0,0 +1,81 @@ +package com.jiuqi.elove.entity; + +/** + * + * Created by jq on 2016/8/10. + */ +public class PushModel { + + /** + * msg : 0 + * act : 0 + * like : 0 + * atten : 0 + * artical + * inform + */ + private String msg; + private String act; + private String like; + private String atten; + private String recommend; + private String article; + private String inform; + + + public String getArticle() { + return article; + } + + public void setArticle(String article) { + this.article = article; + } + + public String getInform() { + return inform; + } + + public void setInform(String inform) { + this.inform = inform; + } + + public String getRecommend() { + return recommend; + } + + public void setRecommend(String recommend) { + this.recommend = recommend; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public void setAct(String act) { + this.act = act; + } + + public void setLike(String like) { + this.like = like; + } + + public void setAtten(String atten) { + this.atten = atten; + } + + public String getMsg() { + return msg; + } + + public String getAct() { + return act; + } + + public String getLike() { + return like; + } + + public String getAtten() { + return atten; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/QaAndDetailModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/QaAndDetailModel.java new file mode 100644 index 0000000000000000000000000000000000000000..0d239393aeeb0c24237a8ecda738133e9c912ad1 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/QaAndDetailModel.java @@ -0,0 +1,126 @@ +package com.jiuqi.elove.entity; + +import java.io.Serializable; + +/** + * Created by dl on 2017/1/4. + */ +public class QaAndDetailModel implements Serializable{ + private String avatar; + private String userid; + private String username; + private String istop;//1 置顶 0 未置顶 + private String resolveid;//问答id + private String title;//主题 + private String theme;//介绍 + private String scans;//浏览次数 + private String replys;//问答次数 + private String starttime;//发布时间 + private String replyname;//回答者名字 + private String replystring;//回答内容 + private String resolveImg;//图片 + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public String getUserid() { + return userid; + } + + public void setUserid(String userid) { + this.userid = userid; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getIstop() { + return istop; + } + + public void setIstop(String istop) { + this.istop = istop; + } + + public String getResolveid() { + return resolveid; + } + + public void setResolveid(String resolveid) { + this.resolveid = resolveid; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getTheme() { + return theme; + } + + public void setTheme(String theme) { + this.theme = theme; + } + + public String getScans() { + return scans; + } + + public void setScans(String scans) { + this.scans = scans; + } + + public String getReplys() { + return replys; + } + + public void setReplys(String replys) { + this.replys = replys; + } + + public String getStarttime() { + return starttime; + } + + public void setStarttime(String starttime) { + this.starttime = starttime; + } + + public String getReplyname() { + return replyname; + } + + public void setReplyname(String replyname) { + this.replyname = replyname; + } + + public String getReplystring() { + return replystring; + } + + public void setReplystring(String replystring) { + this.replystring = replystring; + } + + public String getResolveImg() { + return resolveImg; + } + + public void setResolveImg(String resolveImg) { + this.resolveImg = resolveImg; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/QaAnswerReplyModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/QaAnswerReplyModel.java new file mode 100644 index 0000000000000000000000000000000000000000..729589b20f46163218ad8442d6d1479b0d1ab9a1 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/QaAnswerReplyModel.java @@ -0,0 +1,52 @@ +package com.jiuqi.elove.entity; + +/** + * Created by dl on 2017/1/4. + */ +public class QaAnswerReplyModel { + private String replytime; + private String replyername; + private String replyid; + private String replydetail; + private String askname; + + public String getReplytime() { + return replytime; + } + + public void setReplytime(String replytime) { + this.replytime = replytime; + } + + public String getReplyername() { + return replyername; + } + + public void setReplyername(String replyername) { + this.replyername = replyername; + } + + public String getReplyid() { + return replyid; + } + + public void setReplyid(String replyid) { + this.replyid = replyid; + } + + public String getReplydetail() { + return replydetail; + } + + public void setReplydetail(String replydetail) { + this.replydetail = replydetail; + } + + public String getAskname() { + return askname; + } + + public void setAskname(String askname) { + this.askname = askname; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/QaDetailAnswerModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/QaDetailAnswerModel.java new file mode 100644 index 0000000000000000000000000000000000000000..b169039feea30707363d598354664a333858e79a --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/QaDetailAnswerModel.java @@ -0,0 +1,169 @@ +package com.jiuqi.elove.entity; + +import java.io.Serializable; +import java.util.List; + +/** + * 问答的列表评论及回复 + * Created by dl on 2017/1/4. + */ +public class QaDetailAnswerModel implements Serializable{ + private String avatar; + private String userid; + private String username; + private String comment; + private String commentid; + private String time; + private String commenttime; + private String replynum;//评论数 + private String rewards;//打赏数 + private List replylist; + private String title;//主题 + private String commenttype;//0文字 1语音 + private String voicetime;//语音时间 + private boolean islisten;//是否在听 + + public boolean islisten() { + return islisten; + } + + public void setIslisten(boolean islisten) { + this.islisten = islisten; + } + + public String getVoicetime() { + return voicetime; + } + + public void setVoicetime(String voicetime) { + this.voicetime = voicetime; + } + + public String getCommenttype() { + return commenttype; + } + + public void setCommenttype(String commenttype) { + this.commenttype = commenttype; + } + + public String getCommenttime() { + return commenttime; + } + + public void setCommenttime(String commenttime) { + this.commenttime = commenttime; + } + + public String getReplynum() { + return replynum; + } + + public void setReplynum(String replynum) { + this.replynum = replynum; + } + + public List getReplylist() { + return replylist; + } + + public void setReplylist(List replylist) { + this.replylist = replylist; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public String getUserid() { + return userid; + } + + public void setUserid(String userid) { + this.userid = userid; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + + public String getCommentid() { + return commentid; + } + + public void setCommentid(String commentid) { + this.commentid = commentid; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + + public String getRewards() { + return rewards; + } + + public void setRewards(String rewards) { + this.rewards = rewards; + } + + + public static class ReplyModel implements Serializable{ + private String replyername;//评论者名字 + private String replydetail; + private String askname;//回复者的名字 + + public String getReplyername() { + return replyername; + } + + public void setReplyername(String replyername) { + this.replyername = replyername; + } + + public String getReplydetail() { + return replydetail; + } + + public void setReplydetail(String replydetail) { + this.replydetail = replydetail; + } + + public String getAskname() { + return askname; + } + + public void setAskname(String askname) { + this.askname = askname; + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/QaReplyEachotherModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/QaReplyEachotherModel.java new file mode 100644 index 0000000000000000000000000000000000000000..0e822c5a6aa6050de83fd358c150b0fa47f1b9a4 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/QaReplyEachotherModel.java @@ -0,0 +1,88 @@ +package com.jiuqi.elove.entity; + +/** + * Created by dl on 2017/1/4. + */ +public class QaReplyEachotherModel { + private String replytime; + private String replyername; + private String replyid; + private String replydetail; + private String askname; + private String avatar; + private String commentid; + private String replys; + private String titleid; + + public String getReplys() { + return replys; + } + + public void setReplys(String replys) { + this.replys = replys; + } + + public String getTitleid() { + return titleid; + } + + public void setTitleid(String titleid) { + this.titleid = titleid; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public String getCommentid() { + return commentid; + } + + public void setCommentid(String commentid) { + this.commentid = commentid; + } + + public String getReplytime() { + return replytime; + } + + public void setReplytime(String replytime) { + this.replytime = replytime; + } + + public String getReplyername() { + return replyername; + } + + public void setReplyername(String replyername) { + this.replyername = replyername; + } + + public String getReplyid() { + return replyid; + } + + public void setReplyid(String replyid) { + this.replyid = replyid; + } + + public String getReplydetail() { + return replydetail; + } + + public void setReplydetail(String replydetail) { + this.replydetail = replydetail; + } + + public String getAskname() { + return askname; + } + + public void setAskname(String askname) { + this.askname = askname; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/QuestionModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/QuestionModel.java new file mode 100644 index 0000000000000000000000000000000000000000..769ab7668e596cabbb5cad309db73b6c53d38e58 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/QuestionModel.java @@ -0,0 +1,82 @@ +package com.jiuqi.elove.entity; + +import java.io.Serializable; +import java.util.List; + +/** + * 情感测评题目 + * Created by dl on 2016/12/1. + */ +public class QuestionModel implements Serializable{ + + + /** + * testcode : 3 + * testid : 58B97ECF200000218E1C1AF8A5E472E0 + * testkeylist : [{"answer":"当然可以,完全不介意","answercode":"item1"},{"answer":"算是能接受吧","answercode":"item2"},{"answer":"不太能接受,赚的还不如我,要他干嘛","answercode":"item3"},{"answer":"完全不能接受,难道要我养家?","answercode":"item4"}] + * tests : 你可以接受男友赚的只有自己的80%吗? + */ + + private String testcode; + private String testid; + private String tests; + /** + * answer : 当然可以,完全不介意 + * answercode : item1 + */ + + private List testkeylist; + + public String getTestcode() { + return testcode; + } + + public void setTestcode(String testcode) { + this.testcode = testcode; + } + + public String getTestid() { + return testid; + } + + public void setTestid(String testid) { + this.testid = testid; + } + + public String getTests() { + return tests; + } + + public void setTests(String tests) { + this.tests = tests; + } + + public List getTestkeylist() { + return testkeylist; + } + + public void setTestkeylist(List testkeylist) { + this.testkeylist = testkeylist; + } + + public static class TestkeylistBean implements Serializable{ + private String answer; + private String answercode; + + public String getAnswer() { + return answer; + } + + public void setAnswer(String answer) { + this.answer = answer; + } + + public String getAnswercode() { + return answercode; + } + + public void setAnswercode(String answercode) { + this.answercode = answercode; + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/RechargeModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/RechargeModel.java new file mode 100644 index 0000000000000000000000000000000000000000..382fcc437b89af57aff7f84700d6244a357dc5a9 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/RechargeModel.java @@ -0,0 +1,79 @@ +package com.jiuqi.elove.entity; + +/** + * Created by liulin on 2016/12/20. + */ +public class RechargeModel { + private String wealtype; + private String wealnum; + private String redbean; + private String redbeantotal; + private String name; + private int money; + private String wealrate; + private boolean ischeck; + + public boolean ischeck() { + return ischeck; + } + + public void setIscheck(boolean ischeck) { + this.ischeck = ischeck; + } + + public String getWealtype() { + return wealtype; + } + + public void setWealtype(String wealtype) { + this.wealtype = wealtype; + } + + public String getWealnum() { + return wealnum; + } + + public void setWealnum(String wealnum) { + this.wealnum = wealnum; + } + + public String getRedbean() { + return redbean; + } + + public void setRedbean(String redbean) { + this.redbean = redbean; + } + + public String getRedbeantotal() { + return redbeantotal; + } + + public void setRedbeantotal(String redbeantotal) { + this.redbeantotal = redbeantotal; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getMoney() { + return money; + } + + public void setMoney(int money) { + this.money = money; + } + + public String getWealrate() { + return wealrate; + } + + public void setWealrate(String wealrate) { + this.wealrate = wealrate; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/RecommendUserInfoModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/RecommendUserInfoModel.java new file mode 100644 index 0000000000000000000000000000000000000000..b1b431f758076afc0956aa96a6b10bc25d7c726e --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/RecommendUserInfoModel.java @@ -0,0 +1,188 @@ +package com.jiuqi.elove.entity; + +import java.io.Serializable; + +/** + * + * Created by dl on 2016/7/8. + */ +public class RecommendUserInfoModel implements Serializable{ + + private static final long serialVersionUID = 1L; + /** + * otherID : 555491CA0000002175B4E9E6837B29FA 被推荐人的id + * messagenum : 0 留言条数 + * kind : 0 1企业用户 0普通用户 + * sex : 1 1男 0女 + * nickname : fiive 昵称 + * avatar : 头像路径url + * localplace : 居住地 + * likenum : 0 点赞条数 + * age : 0 年龄 + * constellation:星座 + * iflike 是否点赞 + * match + */ + private String otherID; + private int messagenum; + private int kind; + private int sex; + private String nickname; + private String avatar; + private String localplace; + private int likenum; + private int age; + private String constellation; + private String iflike; + private String ifvideo; + private String match; + private String degree; + private String emailtype; + private String realnametype; + private String youthLeague; + private String height; + + public String getHeight() { + return height; + } + + public void setHeight(String height) { + this.height = height; + } + + public String getYouthLeague() { + return youthLeague; + } + + public void setYouthLeague(String youthLeague) { + this.youthLeague = youthLeague; + } + + public String getEmailtype() { + return emailtype; + } + + public void setEmailtype(String emailtype) { + this.emailtype = emailtype; + } + + public String getRealnametype() { + return realnametype; + } + + public void setRealnametype(String realnametype) { + this.realnametype = realnametype; + } + + public String getDegree() { + return degree; + } + + public void setDegree(String degree) { + this.degree = degree; + } + + public String getMatch() { + return match; + } + + public void setMatch(String match) { + this.match = match; + } + + public String getIflike() { + return iflike; + } + + public void setIflike(String iflike) { + this.iflike = iflike; + } + + public void setOtherID(String otherID) { + this.otherID = otherID; + } + + public void setMessagenum(int messagenum) { + this.messagenum = messagenum; + } + + public void setKind(int kind) { + this.kind = kind; + } + + public void setSex(int sex) { + this.sex = sex; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public void setLocalplace(String localplace) { + this.localplace = localplace; + } + + public void setLikenum(int likenum) { + this.likenum = likenum; + } + + public void setAge(int age) { + this.age = age; + } + + public void setConstellation(String constellation){ + this.constellation = constellation; + } + + public String getOtherID() { + return otherID; + } + + public int getMessagenum() { + return messagenum; + } + + public int getKind() { + return kind; + } + + public int getSex() { + return sex; + } + + public String getNickname() { + return nickname; + } + + public String getAvatar() { + return avatar; + } + + public String getLocalplace() { + return localplace; + } + + public int getLikenum() { + return likenum; + } + + public int getAge() { + return age; + } + + public String getConstellation() { + return constellation; + } + + public String getIfvideo() { + return ifvideo; + } + + public void setIfvideo(String ifvideo) { + this.ifvideo = ifvideo; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/SchoolBean.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/SchoolBean.java new file mode 100644 index 0000000000000000000000000000000000000000..d0681c1c7a1d8c7be6cf9193951227b163615f68 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/SchoolBean.java @@ -0,0 +1,37 @@ +package com.jiuqi.elove.entity; + + +import java.io.Serializable; +import java.util.List; + +/** + * Created by jq on 2017/9/14. + */ + +public class SchoolBean implements Serializable{ + + + /** + * id : 30 + * data : ["香港大学","香港中文大学","香港科技大学","香港城市大学","香港理工大学","香港浸会大学","香港岭南大学","香港教育学院"] + */ + + private String id; + private List data; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/SysMsgModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/SysMsgModel.java new file mode 100644 index 0000000000000000000000000000000000000000..a77311da1ed1d313b2cada6af2974d6a60316247 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/SysMsgModel.java @@ -0,0 +1,119 @@ +package com.jiuqi.elove.entity; + +/** + * + * Created by liulin on 2016/8/3. + */ +public class SysMsgModel { + + /** + * msg : 冰与火之歌赞了你 + * entact_name : + * nickname : 冰与火之歌 + * actID : + * action : 2 + * peract_name : + * time : 2016-08-02 15:34:35 + * avatar : http://redbean.oss-cn-hangzhou.aliyuncs.com/newDir/AlVNlfpVIsa1HpK6g5X/kg%3D%3D + * userID : 539891F1200000213985884663EB63B7 + */ + private String msg; + private String entact_name; + private String nickname; + private String actID; + private int action; + private String peract_name; + private String time; + private String avatar; + private String userID; + private String version; + private String link; + + public String getLink() { + return link; + } + + public void setLink(String link) { + this.link = link; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public void setEntact_name(String entact_name) { + this.entact_name = entact_name; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } + + public void setActID(String actID) { + this.actID = actID; + } + + public void setAction(int action) { + this.action = action; + } + + public void setPeract_name(String peract_name) { + this.peract_name = peract_name; + } + + public void setTime(String time) { + this.time = time; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public void setUserID(String userID) { + this.userID = userID; + } + + public String getMsg() { + return msg; + } + + public String getEntact_name() { + return entact_name; + } + + public String getNickname() { + return nickname; + } + + public String getActID() { + return actID; + } + + public int getAction() { + return action; + } + + public String getPeract_name() { + return peract_name; + } + + public String getTime() { + return time; + } + + public String getAvatar() { + return avatar; + } + + public String getUserID() { + return userID; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/SysRecommendModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/SysRecommendModel.java new file mode 100644 index 0000000000000000000000000000000000000000..1b072a810d10cfa7bd43b9b2be8095e05d2a42fc --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/SysRecommendModel.java @@ -0,0 +1,142 @@ +package com.jiuqi.elove.entity; + +import java.io.Serializable; + +/** + * 系统推荐 + * Created by dl on 2017/11/27. + */ + +public class SysRecommendModel implements Serializable { + + /** + * userID : 58D2EA54E0000021B152514208229B98 + * match : 93 + * nickname : 主持人 + * avatar : http://redbean.oss-cn-hangzhou.aliyuncs.com/newDir/49114229B549859DF571B9425C460312 + * age : 30 + * height : 180.0 + * degree : 2 + * kind : 0 + * ifattention : 0 + * localPlace : 北京 北京 + */ + + private String userID; + private String match; + private String nickname; + private String avatar; + private String age; + private String height; + private String degree; + private int kind; + private String ifattention; + private String localPlace; + private String distance; + private Double lng; + private Double lat; + + public Double getLng() { + return lng; + } + + public void setLng(Double lng) { + this.lng = lng; + } + + public Double getLat() { + return lat; + } + + public void setLat(Double lat) { + this.lat = lat; + } + + public String getDistance() { + return distance; + } + + public void setDistance(String distance) { + this.distance = distance; + } + + public String getUserID() { + return userID; + } + + public void setUserID(String userID) { + this.userID = userID; + } + + public String getMatch() { + return match; + } + + public void setMatch(String match) { + this.match = match; + } + + public String getNickname() { + return nickname; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public String getAge() { + return age; + } + + public void setAge(String age) { + this.age = age; + } + + public String getHeight() { + return height; + } + + public void setHeight(String height) { + this.height = height; + } + + public String getDegree() { + return degree; + } + + public void setDegree(String degree) { + this.degree = degree; + } + + public int getKind() { + return kind; + } + + public void setKind(int kind) { + this.kind = kind; + } + + public String getIfattention() { + return ifattention; + } + + public void setIfattention(String ifattention) { + this.ifattention = ifattention; + } + + public String getLocalPlace() { + return localPlace; + } + + public void setLocalPlace(String localPlace) { + this.localPlace = localPlace; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/TaskRewardModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/TaskRewardModel.java new file mode 100644 index 0000000000000000000000000000000000000000..6f4444c93081f50e4d09daa8dbc93f551872f3de --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/TaskRewardModel.java @@ -0,0 +1,35 @@ +package com.jiuqi.elove.entity; + + +/** + * Created by dl on 2017/1/19. + */ +public class TaskRewardModel { + private String redbean; + private String name; + private String iffinish; + + public String getRedbean() { + return redbean; + } + + public void setRedbean(String redbean) { + this.redbean = redbean; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getIffinish() { + return iffinish; + } + + public void setIffinish(String iffinish) { + this.iffinish = iffinish; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/ThridAreaBean.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/ThridAreaBean.java new file mode 100644 index 0000000000000000000000000000000000000000..bd0167bad430ff920856dd66051ce8d94d082994 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/ThridAreaBean.java @@ -0,0 +1,44 @@ +package com.jiuqi.elove.entity; + +/** + * Created by jq on 2017/8/11. + */ + +public class ThridAreaBean { + private String AreaID; + private String name; + private String CityID; + private String AreaSort; + + public String getAreaID() { + return AreaID; + } + + public void setAreaID(String areaID) { + AreaID = areaID; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCityID() { + return CityID; + } + + public void setCityID(String cityID) { + CityID = cityID; + } + + public String getAreaSort() { + return AreaSort; + } + + public void setAreaSort(String areaSort) { + AreaSort = areaSort; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/TopicModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/TopicModel.java new file mode 100644 index 0000000000000000000000000000000000000000..6d7772398457435c7ab846fca1592cdfd8d6717f --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/TopicModel.java @@ -0,0 +1,72 @@ +package com.jiuqi.elove.entity; + +/** + * Created by dl on 2018/1/9. + */ + +public class TopicModel { + + /** + * detail : 谁是最帅的人?发表你的观点吧 + * time : 2018-01-05 10:43:19 + * title : 谁是最帅的人 + * hot : 1 + * poster : + * recid : 8EF14BB9A9EA4618BBF9FACDD7A3D5D8 + */ + + private String detail; + private String time; + private String title; + private String hot; + private String poster; + private String recid; + + public String getDetail() { + return detail; + } + + public void setDetail(String detail) { + this.detail = detail; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getHot() { + return hot; + } + + public void setHot(String hot) { + this.hot = hot; + } + + public String getPoster() { + return poster; + } + + public void setPoster(String poster) { + this.poster = poster; + } + + public String getRecid() { + return recid; + } + + public void setRecid(String recid) { + this.recid = recid; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/UserInfoModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/UserInfoModel.java new file mode 100644 index 0000000000000000000000000000000000000000..9ab1aa4d1fc58f5488d8276cab8a6c7f128233e0 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/UserInfoModel.java @@ -0,0 +1,151 @@ +package com.jiuqi.elove.entity; + +import java.io.Serializable; + +/** + * + * Created by liulin on 2016/7/7. + */ +public class UserInfoModel implements Serializable{ + + private static final long serialVersionUID = 1L; + /** + * iscomplete : 0 资料是否完善 0未完善 1完善 + * phone : 15904956736 手机号 + * kind : 企业认证 0普通 1企业认证 + * sex : 0 性别 0女 1男 + * nickname : elove 昵称 + * avatar : 图片url + * userid : 559B1754E0000001BFCF96A3F50C8F8C 用户id + * age : 0 年龄 + * ifup:0 + * userrole + * status + */ + private int iscomplete; + private String phone; + private int kind; + private String sex; + private String nickname; + private String avatar; + private String userid; + private int age; + private int ifup; + private int bean; + private String ifac; + private String userrole; + private String status; + private int avatartype; + + public int getAvatartype() { + return avatartype; + } + + public void setAvatartype(int avatartype) { + this.avatartype = avatartype; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getIfac() { + return ifac; + } + + public void setIfac(String ifac) { + this.ifac = ifac; + } + + public int getBean() { + return bean; + } + + public void setBean(int bean) { + this.bean = bean; + } + + public int getIfup() { + return ifup; + } + + public void setIfup(int ifup) { + this.ifup = ifup; + } + + public void setIscomplete(int iscomplete) { + this.iscomplete = iscomplete; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public void setKind(int kind) { + this.kind = kind; + } + + public void setSex(String sex) { + this.sex = sex; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public void setUserid(String userid) { + this.userid = userid; + } + + public void setAge(int age) { + this.age = age; + } + + public int getIscomplete() { + return iscomplete; + } + + public String getPhone() { + return phone; + } + + public int getKind() { + return kind; + } + + public String getSex() { + return sex; + } + + public String getNickname() { + return nickname; + } + + public String getAvatar() { + return avatar; + } + + public String getUserid() { + return userid; + } + + public int getAge() { + return age; + } + + public String getUserrole() { + return userrole; + } + + public void setUserrole(String userrole) { + this.userrole = userrole; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/VideoRecordResult.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/VideoRecordResult.java new file mode 100644 index 0000000000000000000000000000000000000000..3df76f63f445d106ca6d6bd810ca762bbc4cba66 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/VideoRecordResult.java @@ -0,0 +1,31 @@ +package com.jiuqi.elove.entity; + +import android.content.Intent; +import android.os.Bundle; + +public class VideoRecordResult { + + private final Bundle _Bundle; + public static final String RESULT_KEY = "qupai.edit.result"; + public static final String XTRA_PATH = "path"; + public static final String XTRA_THUMBNAIL = "thumbnail"; + + + public VideoRecordResult(Intent intent) { + _Bundle = intent.getBundleExtra(RESULT_KEY); + } + + public String getPath() { + return _Bundle.getString(XTRA_PATH); + } + + public String[] getThumbnail() { + return _Bundle.getStringArray(XTRA_THUMBNAIL); + } + + + public static final String XTRA_DURATION = "duration"; + public long getDuration() { + return _Bundle.getLong(XTRA_DURATION); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/WeChatPaySignModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/WeChatPaySignModel.java new file mode 100644 index 0000000000000000000000000000000000000000..416ec2cc63fd84e9dd0d9d830328de1814ef65c5 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/entity/WeChatPaySignModel.java @@ -0,0 +1,72 @@ +package com.jiuqi.elove.entity; + +/** + * Created by jq on 2016/9/27. + * 微信支付签名返回的model + */ +public class WeChatPaySignModel { + + private String appid;//应用id 可以前端写死 + private String partnerId;//商户号 可以前端写死 + private String prepayid;//微信预支付id + private String noncestr;//随机数 + private String timestamp;//时间戳 + private String wechat_package;//拓展字段暂填固定值 "Sign=WXPay" + private String sign;//签名 + + public String getAppid() { + return appid; + } + + public void setAppid(String appid) { + this.appid = appid; + } + + public String getPartnerId() { + return partnerId; + } + + public void setPartnerId(String partnerId) { + this.partnerId = partnerId; + } + + public String getPrepayid() { + return prepayid; + } + + public void setPrepayid(String prepayid) { + this.prepayid = prepayid; + } + + public String getNoncestr() { + return noncestr; + } + + public void setNoncestr(String noncestr) { + this.noncestr = noncestr; + } + + public String getTimestamp() { + return timestamp; + } + + public void setTimestamp(String timestamp) { + this.timestamp = timestamp; + } + + public String getWechat_package() { + return wechat_package; + } + + public void setWechat_package(String wechat_package) { + this.wechat_package = wechat_package; + } + + public String getSign() { + return sign; + } + + public void setSign(String sign) { + this.sign = sign; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/ABaseFragment.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/ABaseFragment.java new file mode 100644 index 0000000000000000000000000000000000000000..44acda671a3ca22501eaadacea5921800d04ada4 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/ABaseFragment.java @@ -0,0 +1,85 @@ +package com.jiuqi.elove.fragment; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentTransaction; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.jiuqi.elove.application.EloveApplication; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SupportMultiScreenUtil; + +import butterknife.ButterKnife; +import butterknife.Unbinder; + +/** + * 基类 + * Created by dl on 2017/6/19. + */ +public abstract class ABaseFragment extends Fragment { + + protected static final String STATE_SAVE_IS_HIDDEN = "STATE_SAVE_IS_HIDDEN"; + + protected View rootView; + protected Unbinder unbinder; + protected OkHttpUtil okHttpUtil = OkHttpUtil.getInstance(); + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if(savedInstanceState !=null){ + boolean isSupportHidden = savedInstanceState.getBoolean(STATE_SAVE_IS_HIDDEN); + FragmentTransaction ft = getFragmentManager().beginTransaction(); + if(isSupportHidden){ + ft.hide(this); + }else{ + ft.show(this); + } + ft.commit(); + } + } + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + if(rootView==null){ + rootView = inflater.inflate(getLayoutResource(),container,false); + } +// SupportMultiScreenUtil.scale(rootView); + unbinder = ButterKnife.bind(this,rootView);//绑定 + initView(); + return rootView; + } + + /** + * 初始化view + */ + protected abstract void initView(); + + /** + * 获取fragment布局文件 + */ + protected abstract int getLayoutResource(); + + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + outState.putBoolean(STATE_SAVE_IS_HIDDEN,isHidden()); + } + + + protected void showToast(String msg){ + JqStrUtil.showToast(EloveApplication.getAppContext(),msg); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + unbinder.unbind();//解绑 + okHttpUtil.cancelTag(getActivity()); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/ActFragment2_0_3.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/ActFragment2_0_3.java new file mode 100644 index 0000000000000000000000000000000000000000..b00573b19f4e1ab984daaaee1770422d205accc1 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/ActFragment2_0_3.java @@ -0,0 +1,220 @@ +package com.jiuqi.elove.fragment; + +import android.content.Intent; +import android.content.SharedPreferences; +import android.media.Image; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.support.v4.content.ContextCompat; +import android.text.TextUtils; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ListView; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.jiuqi.elove.R; +import com.jiuqi.elove.activity.LoginActivity; +import com.jiuqi.elove.activity.MyActActivity; +import com.jiuqi.elove.activity.NearbyMapActivity; +import com.jiuqi.elove.activity.OrderManagementActivity; +import com.jiuqi.elove.adapter.EnterpriseActAdapter2_0_3; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.entity.EnterpriseActEntity2_0_3; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; +import com.jiuqi.elove.util.StatusBarUtil; +import com.jiuqi.elove.widget.SlowScrollView; +import com.jiuqi.elove.widget.pulltorefresh.PullToRefreshLayout; + +import java.util.List; + +import butterknife.BindView; +import butterknife.OnClick; + +/** + * 活动画面 + */ +public class ActFragment2_0_3 extends ABaseFragment implements PullToRefreshLayout.OnRefreshListener{ + private static final String TAG = "ActFragment2_0_3"; + + /** + * 组件 + */ + @BindView(R.id.tvTitle) + TextView tvTitle; + @BindView(R.id.img_rightBtn) + ImageView rightImg; + @BindView(R.id.ll_right) + LinearLayout ll_right; + @BindView(R.id.scroll_view) + SlowScrollView scroll_view; + @BindView(R.id.rlay_nodata) + RelativeLayout rlay_nodata; + @BindView(R.id.lv_newacts) + ListView lv_newacts; + @BindView(R.id.lv_pastacts) + ListView lv_pastacts; + @BindView(R.id.rlay_hidden) + RelativeLayout rlay_hidden; + @BindView(R.id.tv_hidden) + TextView tv_hidden; + @BindView(R.id.iv_hidden) + ImageView iv_hidden; + @BindView(R.id.eact_refresh) + PullToRefreshLayout eact_refresh; + @BindView(R.id.top_view) + View top_view; + + /** + * 数据 + */ + private List newActList; + private List pastActList; + private EnterpriseActAdapter2_0_3 newadapter; + private EnterpriseActAdapter2_0_3 pastadapter; + private OkHttpUtil okHttpUtil = OkHttpUtil.getInstance(); + + private Boolean flag = true; + + @Override + protected void initView() { + top_view.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, StatusBarUtil.intStatusView())); + top_view.setBackgroundColor(ContextCompat.getColor(getActivity(),R.color.colorPrimaryDark)); + tvTitle.setText("精彩活动"); + rightImg.setImageResource(R.drawable.icon_myact); + rightImg.setVisibility(View.VISIBLE); + } + + @Override + protected int getLayoutResource() { + return R.layout.fragment_tab_activity2_0_3; + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + newadapter = new EnterpriseActAdapter2_0_3(getActivity(),"new"); + pastadapter = new EnterpriseActAdapter2_0_3(getActivity(),"past"); + lv_newacts.setAdapter(newadapter); + lv_pastacts.setAdapter(pastadapter); + flag = true; + initEvents(); + getActList(); + } + + private void startLoginPage() { + Intent intent = new Intent(getActivity(),LoginActivity.class); + startActivity(intent); + } + + @OnClick({R.id.tv_hidden,R.id.rlay_hidden,R.id.eact_refresh,R.id.ll_right}) + public void onClick(View view){ + switch (view.getId()){ + case R.id.rlay_hidden: + case R.id.tv_hidden: + if(lv_pastacts.getVisibility() == View.GONE){ + tv_hidden.setText(R.string.pastact_hidden); + iv_hidden.setImageResource(R.drawable.icon_arrowup); + lv_pastacts.setVisibility(View.VISIBLE); + scroll_view.smoothScrollBySlow(0,200,1000); + }else{ + iv_hidden.setImageResource(R.drawable.icon_arrowdown); + tv_hidden.setText(R.string.pastact_show); + lv_pastacts.setVisibility(View.GONE); + } + break; + case R.id.ll_right: + if(!JqStrUtil.isLogin()){ + startLoginPage(); + return; + } + startMyActPage(); + break; + default: + break; + } + } + + private void initEvents() { + eact_refresh.setOnRefreshListener(this); + } + + + private void startMyActPage() { + if(!JqStrUtil.isLogin()){ + startLoginPage(); + return; + } + Intent intent = new Intent(getActivity(), MyActActivity.class); + startActivity(intent); + } + + /** + * 获取最新企业活动列表 + */ + private void getActList() { + final String eactsUrl = Constant.COMMON_URL + Interface.EACT_LIST2_0_3; + JSONObject obj = new JSONObject(); + obj.put("userid",""); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(getActivity(),flag,eactsUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + Log.d(TAG, "onResponse: rsCode"+rsCode); + if(Constant.SUCCESS_CODE.equals(rsCode)){ + String result = jsonObject.getString("message"); + JSONObject obj = JSON.parseObject(result); + String newactlistStr = obj.getString("recentActList"); + Log.d(TAG, "onResponse1: "+newactlistStr); + String pastactlistStr = obj.getString("pastActList"); + Log.d(TAG, "onResponse1: "+pastactlistStr); + newActList = JSON.parseArray(newactlistStr, EnterpriseActEntity2_0_3.class); + pastActList = JSON.parseArray(pastactlistStr, EnterpriseActEntity2_0_3.class); + if(newActList.size()<=0&&pastActList.size()<=0){ + rlay_nodata.setVisibility(View.VISIBLE); + }else{ + rlay_nodata.setVisibility(View.GONE); + rlay_hidden.setVisibility(View.VISIBLE); + if(newActList.size()>0){ + newadapter.updateListView(newActList); + } + if(pastActList.size()>0){ + pastadapter.updateListView(pastActList); + } + } + eact_refresh.refreshFinish(PullToRefreshLayout.SUCCEED); + } + + } + },null); + } + + @Override + public void onRefresh(PullToRefreshLayout pullToRefreshLayout) { + flag = false; + getActList(); + } + + @Override + public void onLoadMore(PullToRefreshLayout pullToRefreshLayout) { + + } + + public void refresh(){ + flag = false; + getActList(); + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/ChoicenessFragment.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/ChoicenessFragment.java new file mode 100644 index 0000000000000000000000000000000000000000..daf36efc52f09b34659ed14a57a98a6c573672aa --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/ChoicenessFragment.java @@ -0,0 +1,543 @@ +package com.jiuqi.elove.fragment; + +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.jiuqi.elove.R; +import com.jiuqi.elove.activity.ChoicenessDetailActivity; +import com.jiuqi.elove.activity.QaDetailActivity; +import com.jiuqi.elove.adapter.ChoicenessAdapter; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.entity.ChoicenessAndDetailModel; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.widget.pulltorefresh.PullToRefreshLayout; + +import java.util.ArrayList; +import java.util.List; + +/** + * + * Created by liulin on 2017/1/4. + */ +public class ChoicenessFragment extends Fragment implements PullToRefreshLayout.OnRefreshListener,View.OnClickListener{ + /** + * 上拉加载下拉刷新(精选) + */ + private PullToRefreshLayout choicenessRefreshView; + private RecyclerView lv_choiceness; + private RelativeLayout rlay_nodata; + private RelativeLayout rlay_nodata_contellation; + private RelativeLayout rlay_nodata_emotion; + private View view; + /** + * 星座 + */ + private PullToRefreshLayout constellationRefreshView; + private RecyclerView lv_constellation; + /** + * 情感 + */ + private PullToRefreshLayout emotionRefreshView; + private RecyclerView lv_emotion; + + /** + * 其他控件 + */ + private LinearLayout ll_choiceness; + private LinearLayout ll_emotion; + private LinearLayout ll_constellation; + private LinearLayout ll_chiceness_content; + private LinearLayout ll_emotion_content; + private LinearLayout ll_constellation_content; + private TextView tv_choiceness; + private TextView tv_emotion; + private TextView tv_constellation; + private View line_choicess; + private View line_emotion; + private View line_constellation; + /** + *设置页码和每一页条数 + */ + private int pageindex= 1;//offset + private int pagesize= 10;//limit + private int emotionpageindex= 1;//offset + private int constellationpageindex= 1;//offset + /** + * 数据 + */ + private String userid; + private List choicenessList; + private List choicenessAddList; + private int modifyposition;//点击则改变该位置的数据 + private List emotionList; + private List emotionAddList; + private List constellationList; + private List constellationAddList; + /** + * 工具 + */ + private ChoicenessAdapter adapter; + private ChoicenessAdapter emotionAdapter; + private ChoicenessAdapter constellationAdapter; + private OkHttpUtil okHttpUtil = OkHttpUtil.getInstance(); + private Boolean flag = true; +// public static ChoicenessFragment instance; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { +// EventBus.getDefault().register(this); +// instance = this; + view = inflater.inflate(R.layout.fragment_choiceness_layout, container, false); + initView(); + return view; + } + + private void initView() { + rlay_nodata = (RelativeLayout) view.findViewById(R.id.rlay_nodata); + rlay_nodata_contellation = (RelativeLayout) view.findViewById(R.id.rlay_nodata_contellation); + rlay_nodata_emotion = (RelativeLayout) view.findViewById(R.id.rlay_nodata_emotion); + choicenessRefreshView = (PullToRefreshLayout) view.findViewById(R.id.choicenessRefreshView); + constellationRefreshView = (PullToRefreshLayout) view.findViewById(R.id.constellationRefreshView); + emotionRefreshView = (PullToRefreshLayout) view.findViewById(R.id.emotionRefreshView); + lv_choiceness = (RecyclerView) view.findViewById(R.id.lv_choiceness); + lv_emotion = (RecyclerView) view.findViewById(R.id.lv_emotion); + lv_constellation = (RecyclerView) view.findViewById(R.id.lv_constellation); + ll_choiceness = (LinearLayout) view.findViewById(R.id.ll_choiceness); + ll_chiceness_content = (LinearLayout) view.findViewById(R.id.ll_chiceness_content); + ll_emotion = (LinearLayout) view.findViewById(R.id.ll_emotion); + ll_emotion_content = (LinearLayout) view.findViewById(R.id.ll_emotion_content); + ll_constellation = (LinearLayout) view.findViewById(R.id.ll_constellation); + ll_constellation_content = (LinearLayout) view.findViewById(R.id.ll_constellation_content); + tv_choiceness = (TextView) view.findViewById(R.id.tv_choiceness); + tv_emotion = (TextView) view.findViewById(R.id.tv_emotion); + tv_constellation = (TextView) view.findViewById(R.id.tv_constellation); + line_choicess = view.findViewById(R.id.line_choicess); + line_emotion = view.findViewById(R.id.line_emotion); + line_constellation = view.findViewById(R.id.line_constellation); + } + +// @Override +// public void setUserVisibleHint(boolean isVisibleToUser) { +// super.setUserVisibleHint(isVisibleToUser); +// if (isVisibleToUser) { +// getDataFromSp(); +// eActAddList = new ArrayList<>(); +// offset = 0;//页码从零开始 +// flag = false; +// getEnterpriseActList(offset); +// //相当于Fragment的onResume +// } else { +// //相当于Fragment的onPause +// } +// } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + getDataFromSp(); + //精选 + RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity()); + lv_choiceness.setLayoutManager(layoutManager); + adapter = new ChoicenessAdapter(getActivity()); + lv_choiceness.setAdapter(adapter); + choicenessAddList = new ArrayList<>(); + pageindex = 1;//页码从零开始 + flag = true; + getChoicenessList(); + tv_choiceness.setTextColor(getResources().getColor(R.color.colorPrimary)); + line_choicess.setBackgroundColor(getResources().getColor(R.color.colorPrimary)); + //情感 + RecyclerView.LayoutManager layoutManager1 = new LinearLayoutManager(getActivity()); + lv_emotion.setLayoutManager(layoutManager1); + emotionAdapter = new ChoicenessAdapter(getActivity()); + lv_emotion.setAdapter(emotionAdapter); + emotionAddList = new ArrayList<>(); + emotionpageindex = 1; + getEmotionList();//情感, + //星座 + RecyclerView.LayoutManager layoutManager2 = new LinearLayoutManager(getActivity()); + lv_constellation.setLayoutManager(layoutManager2); + constellationAdapter = new ChoicenessAdapter(getActivity()); + lv_constellation.setAdapter(constellationAdapter); + constellationAddList = new ArrayList<>();//星座 + constellationpageindex = 1; + getConstellationList(); + initEvents();//上拉加载下拉刷新事件 + } + + private void reSetTabUI(){ + tv_choiceness.setTextColor(getResources().getColor(R.color.blackFont)); + line_choicess.setBackgroundColor(getResources().getColor(R.color.type_color_gray)); + tv_emotion.setTextColor(getResources().getColor(R.color.blackFont)); + line_emotion.setBackgroundColor(getResources().getColor(R.color.type_color_gray)); + tv_constellation.setTextColor(getResources().getColor(R.color.blackFont)); + line_constellation.setBackgroundColor(getResources().getColor(R.color.type_color_gray)); + } + + private void getDataFromSp(){ + SharedPreferences sp = getActivity().getSharedPreferences("elove",getActivity().MODE_PRIVATE); + userid = sp.getString("userid",""); + } + + /** + * 根据条件获取精选列表 + */ + private void getChoicenessList() { + final String choicenessListUrl = Constant.COMMON_URL + Interface.CHOICENESS_LIST; + JSONObject obj = new JSONObject(); + obj.put("pageindex",pageindex); + obj.put("pagesize",pagesize); + obj.put("userid",userid); + obj.put("classify","1");//1精选 + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(getActivity(), flag, choicenessListUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if("1".equals(rsCode)){ + String choicelistStr = jsonObject.getString("creamlist"); + choicenessList = JSON.parseArray(choicelistStr,ChoicenessAndDetailModel.class); + choicenessAddList.addAll(choicenessList); + if(pageindex==1&&choicenessAddList.isEmpty()&&choicenessList.isEmpty()){ + rlay_nodata.setVisibility(View.VISIBLE); + }else if(!choicenessList.isEmpty()){ + rlay_nodata.setVisibility(View.GONE); + adapter.updateRecylerView(choicenessAddList); + if(1==pageindex){//第一页且有数据为刷新 + choicenessRefreshView.refreshFinish(PullToRefreshLayout.SUCCEED); + }else{//非第一页且有数据为加载,加载成功不必悬停 + choicenessRefreshView.refreshFinish(PullToRefreshLayout.SUCCEED); + } + }else if(choicenessList.isEmpty()){ + choicenessRefreshView.loadmoreFinish(PullToRefreshLayout.SUC_NODATA); + } + }else{ + JqStrUtil.showToast(getActivity(),explanation); + } + } + },null); + } + /** + * 根据条件获取星座列表 + */ + private void getConstellationList() { + final String choicenessListUrl = Constant.COMMON_URL + Interface.CHOICENESS_LIST; + JSONObject obj = new JSONObject(); + obj.put("pageindex",constellationpageindex); + obj.put("pagesize",pagesize); + obj.put("userid",userid); + obj.put("classify","3");//3为星座 + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(getActivity(), false, choicenessListUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if("1".equals(rsCode)){ + String choicelistStr = jsonObject.getString("creamlist"); + constellationList = JSON.parseArray(choicelistStr,ChoicenessAndDetailModel.class); + constellationAddList.addAll(constellationList); + if(pageindex==1&&constellationAddList.isEmpty()&&constellationList.isEmpty()){ + rlay_nodata_contellation.setVisibility(View.VISIBLE); + }else if(!constellationList.isEmpty()){ + rlay_nodata_contellation.setVisibility(View.GONE); + constellationAdapter.updateRecylerView(constellationAddList); + if(1==pageindex){//第一页且有数据为刷新 + constellationRefreshView.refreshFinish(PullToRefreshLayout.SUCCEED); + }else{//非第一页且有数据为加载,加载成功不必悬停 + constellationRefreshView.refreshFinish(PullToRefreshLayout.SUCCEED); + } + }else if(constellationList.isEmpty()){ + constellationRefreshView.loadmoreFinish(PullToRefreshLayout.SUC_NODATA); + } + }else{ + JqStrUtil.showToast(getActivity(),explanation); + } + } + },null); + } + /** + * 根据条件获取情感列表 + */ + private void getEmotionList() { + final String choicenessListUrl = Constant.COMMON_URL + Interface.CHOICENESS_LIST; + JSONObject obj = new JSONObject(); + obj.put("pageindex",emotionpageindex); + obj.put("pagesize",pagesize); + obj.put("userid",userid); + obj.put("classify","2");//2情感 + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(getActivity(), false, choicenessListUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if("1".equals(rsCode)){ + String choicelistStr = jsonObject.getString("creamlist"); + emotionList = JSON.parseArray(choicelistStr,ChoicenessAndDetailModel.class); + emotionAddList.addAll(emotionList); + if(pageindex==1&&emotionAddList.isEmpty()&&emotionList.isEmpty()){ + rlay_nodata_emotion.setVisibility(View.VISIBLE); + }else if(!emotionList.isEmpty()){ + rlay_nodata_emotion.setVisibility(View.GONE); + emotionAdapter.updateRecylerView(emotionAddList); + if(1==pageindex){//第一页且有数据为刷新 + emotionRefreshView.refreshFinish(PullToRefreshLayout.SUCCEED); + }else{//非第一页且有数据为加载,加载成功不必悬停 + emotionRefreshView.refreshFinish(PullToRefreshLayout.SUCCEED); + } + }else if(emotionList.isEmpty()){ + emotionRefreshView.loadmoreFinish(PullToRefreshLayout.SUC_NODATA); + } + }else{ + JqStrUtil.showToast(getActivity(),explanation); + } + } + },null); + } + + /** + * 上拉加载下拉刷新以及删选排序点击事件的注册 + */ + private void initEvents() { + choicenessRefreshView.setOnRefreshListener(this); + emotionRefreshView.setOnRefreshListener(this); + constellationRefreshView.setOnRefreshListener(this); + ll_choiceness.setOnClickListener(this); + ll_constellation.setOnClickListener(this); + ll_emotion.setOnClickListener(this); + setAdapterClick(); + } + + @Override + public void onRefresh(PullToRefreshLayout pullToRefreshLayout) { + // 下拉刷新操作 + switch (pullToRefreshLayout.getId()){ + case R.id.choicenessRefreshView: + choicenessAddList = new ArrayList<>(); + pageindex = 1; + flag = false; + getChoicenessList(); + break; + case R.id.emotionRefreshView: + emotionAddList = new ArrayList<>(); + emotionpageindex = 1; + flag = false; + getEmotionList(); + break; + case R.id.constellationRefreshView: + constellationAddList = new ArrayList<>(); + constellationpageindex = 1; + flag = false; + getConstellationList(); + break; + default: + break; + } + } + + @Override + public void onLoadMore(PullToRefreshLayout pullToRefreshLayout) { + switch (pullToRefreshLayout.getId()){ + case R.id.choicenessRefreshView: + ++pageindex; + flag = false; + getChoicenessList(); + break; + case R.id.emotionRefreshView: + ++emotionpageindex; + flag = false; + getEmotionList(); + break; + case R.id.constellationRefreshView: + ++constellationpageindex; + flag = false; + getConstellationList(); + break; + default: + break; + } + } + +// @Override +// public void onDestroy() { +// super.onDestroy(); +// if(instance!=null){ +// instance = null; +// } +// EventBus.getDefault().unregister(this); +// } + +// @Subscribe(threadMode = ThreadMode.MainThread) +// public void helloEventBus(ReadEvent message){ +// +// } + + private void setAdapterClick(){ + adapter.setOnItemClickListener(new ChoicenessAdapter.OnRecyclerViewItemClickListener() { + @Override + public void onItemClick(int position) { + if(choicenessAddList.size()<=0){ + return; + } + modifyposition = position; + ChoicenessAndDetailModel model = choicenessAddList.get(position); + Intent intent; + if("1".equals(model.getType())){ + intent = new Intent(getActivity(),ChoicenessDetailActivity.class); + intent.putExtra("title",model.getTitle()); + }else{ + intent = new Intent(getActivity(), QaDetailActivity.class); + intent.putExtra("preflag","choicefragment"); + } + intent.putExtra("model",model); + intent.putExtra("id",model.getCreamid()); + getRootFragment().startActivityForResult(intent,0x01); + } + }); + + + emotionAdapter.setOnItemClickListener(new ChoicenessAdapter.OnRecyclerViewItemClickListener() { + @Override + public void onItemClick(int position) { + if(emotionAddList.size()<=0){ + return; + } + modifyposition = position; + ChoicenessAndDetailModel model = emotionAddList.get(position); + Intent intent; + if("1".equals(model.getType())){ + intent = new Intent(getActivity(),ChoicenessDetailActivity.class); + intent.putExtra("title",model.getTitle()); + }else{ + intent = new Intent(getActivity(), QaDetailActivity.class); + intent.putExtra("preflag","choicefragment"); + } + intent.putExtra("model",model); + intent.putExtra("id",model.getCreamid()); + getRootFragment().startActivityForResult(intent,0x012); + } + }); + + constellationAdapter.setOnItemClickListener(new ChoicenessAdapter.OnRecyclerViewItemClickListener() { + @Override + public void onItemClick(int position) { + if(constellationAddList.size()<=0){ + return; + } + modifyposition = position; + ChoicenessAndDetailModel model = constellationAddList.get(position); + Intent intent; + if("1".equals(model.getType())){ + intent = new Intent(getActivity(),ChoicenessDetailActivity.class); + intent.putExtra("title",model.getTitle()); + }else{ + intent = new Intent(getActivity(), QaDetailActivity.class); + intent.putExtra("preflag","choicefragment"); + } + intent.putExtra("model",model); + intent.putExtra("id",model.getCreamid()); + getRootFragment().startActivityForResult(intent,0x013); + } + }); + } + + /** + * 得到根Fragment + * + * @return + */ + private Fragment getRootFragment() { + Fragment fragment = getParentFragment(); + while (fragment.getParentFragment() != null) { + fragment = fragment.getParentFragment(); + } + return fragment; + + } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if(0x01==requestCode&&0x11==resultCode){ + ChoicenessAndDetailModel model = (ChoicenessAndDetailModel) data.getSerializableExtra("newmodel"); + if(model!=null){ + choicenessAddList.remove(modifyposition); + choicenessAddList.add(modifyposition,model); + adapter.updateRecylerView(choicenessAddList); + } + } + if(0x012==requestCode&&0x11==resultCode){ + ChoicenessAndDetailModel model = (ChoicenessAndDetailModel) data.getSerializableExtra("newmodel"); + if(model!=null){ + emotionAddList.remove(modifyposition); + emotionAddList.add(modifyposition,model); + emotionAdapter.updateRecylerView(emotionAddList); + } + } + if(0x013==requestCode&&0x11==resultCode){ + ChoicenessAndDetailModel model = (ChoicenessAndDetailModel) data.getSerializableExtra("newmodel"); + if(model!=null){ + constellationAddList.remove(modifyposition); + constellationAddList.add(modifyposition,model); + constellationAdapter.updateRecylerView(constellationAddList); + } + } + } + + @Override + public void onClick(View view) { + reSetTabUI(); + hideAll(); + switch (view.getId()){ + case R.id.ll_choiceness: + tv_choiceness.setTextColor(getResources().getColor(R.color.colorPrimary)); + line_choicess.setBackgroundColor(getResources().getColor(R.color.colorPrimary)); + ll_chiceness_content.setVisibility(View.VISIBLE); + break; + case R.id.ll_emotion: + tv_emotion.setTextColor(getResources().getColor(R.color.colorPrimary)); + line_emotion.setBackgroundColor(getResources().getColor(R.color.colorPrimary)); + ll_emotion_content.setVisibility(View.VISIBLE); + break; + case R.id.ll_constellation: + tv_constellation.setTextColor(getResources().getColor(R.color.colorPrimary)); + line_constellation.setBackgroundColor(getResources().getColor(R.color.colorPrimary)); + ll_constellation_content.setVisibility(View.VISIBLE); + break; + default: + break; + } + } + + private void hideAll() { + ll_chiceness_content.setVisibility(View.GONE); + ll_emotion_content.setVisibility(View.GONE); + ll_constellation_content.setVisibility(View.GONE); + } + +// public void refresh(){ +// adapter.notifyDataSetChanged(); +// } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/CircleCollectFragment.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/CircleCollectFragment.java new file mode 100644 index 0000000000000000000000000000000000000000..fb7f8eb00b82d015ed85c1488ddc9630b9c82639 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/CircleCollectFragment.java @@ -0,0 +1,288 @@ +package com.jiuqi.elove.fragment; + +import android.content.Intent; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.RelativeLayout; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.jiuqi.elove.R; +import com.jiuqi.elove.activity.CircleDetailActivity; +import com.jiuqi.elove.activity.OtherPersonCenterActivity; +import com.jiuqi.elove.activity.PlayCircleVideoActivity; +import com.jiuqi.elove.activity.PreviewAvatarActivity; +import com.jiuqi.elove.activity.PreviewImgActivity; +import com.jiuqi.elove.activity.PutRecentActivity; +import com.jiuqi.elove.activity.TopicDetailActivity; +import com.jiuqi.elove.adapter.CircleRecentAdapter201801; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.entity.CircleNewModel; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; +import com.jiuqi.elove.widget.pulltorefresh.PullToRefreshLayout; + +import java.util.ArrayList; +import java.util.List; + +/** + * 发布的缘圈 + * Created by dl on 2017/3/23. + */ +public class CircleCollectFragment extends Fragment implements PullToRefreshLayout.OnRefreshListener{ + + /** + * 控件 + */ + private RecyclerView lv_gift; + private RelativeLayout rlay_nodata; + private PullToRefreshLayout circleRefreshView; + + /** + * 数据 + */ + private int page = 1; + private int pagesize = 10; + private String userId; + private List mList; + private List mAddList; + private int clickPosition; + + /** + * 工具 + */ + private CircleRecentAdapter201801 adapter; + private OkHttpUtil okHttpUtil = OkHttpUtil.getInstance(); + private Boolean isshow = true; + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_circle_publish,container,false); + initView(view); + return view; + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + getDataFromSp();//从sp中获取需要的数据 + setLayoutAndAdapter();//给recyclerview设置layoutmanager和adapter + retrieveDataAndSet();//初始化数据容器,获取服务器数据并进行设置 + setEvents(); + } + + /** + * 初始化控件 + * @param view 上下文view + */ + private void initView(View view) { + lv_gift = (RecyclerView) view.findViewById(R.id.lv_gift); + rlay_nodata = (RelativeLayout) view.findViewById(R.id.rlay_nodata); + circleRefreshView = (PullToRefreshLayout) view.findViewById(R.id.circleRefreshView); + } + + private void getDataFromSp() { + userId = SpUtils.getString(Constant.USER_ID); + } + + private void setLayoutAndAdapter() { + //给recyclerview设置manager,并通过自定义给其设置间距 + lv_gift.setLayoutManager(new LinearLayoutManager(getActivity())); +// lv_gift.addItemDecoration(new GridSpacingItemDecoration(2,18,false)); + //创建adapter,并设置 + adapter = new CircleRecentAdapter201801(getActivity()); + lv_gift.setAdapter(adapter); + circleRefreshView.setOnRefreshListener(this); + adapter.setOnItemClickListener(new CircleRecentAdapter201801.OnItemClickListener() { + @Override + public void likeOrNot(CircleNewModel model, int position) {//点赞或者取消点赞 + likeOrNotThisCircle(model,position); + } + + @Override + public void comment(CircleNewModel model,int position) {//评论 + Intent intent = new Intent(getActivity(), CircleDetailActivity.class); + intent.putExtra("circleid",model.getYuanquanid()); + clickPosition = position; + startActivityForResult(intent,0x110); + } + + @Override + public void clickPicOrVideo(List mList, int position) {//查看大图 + Intent intent; + if(mList.size()==1){ + intent = new Intent(getActivity(), PreviewAvatarActivity.class); + intent.putExtra("imageUrl",mList.get(0).getImg()); + }else{ + intent = new Intent(getActivity(), PreviewImgActivity.class); + intent.putExtra("currentItem",String.valueOf(position)); + Bundle bundle = new Bundle(); + String[] imgUrls = new String[mList.size()]; + for(int i=0;i(); + getCircleRecent();//从服务器获取数据并进行设置 + } + + private void setEvents() { + + } + + private void getCircleRecent() { + String receivegiftUrl = Constant.COMMON_URL + Interface.CIRCLE_COLLECT; + JSONObject obj = new JSONObject(); + obj.put("version",Constant.VERSION); + obj.put("userid",userId); + obj.put("offset",page); + obj.put("limit",pagesize); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(getActivity(), isshow, receivegiftUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + if(Constant.SUCCESS_CODE.equals(rsCode)){ + String result = jsonObject.getString("message"); + mList = JSONArray.parseArray(result,CircleNewModel.class); + mAddList.addAll(mList); + if(page==1&&mAddList.isEmpty()&&mList.isEmpty()){ + rlay_nodata.setVisibility(View.VISIBLE); + }else if(!mList.isEmpty()){ + rlay_nodata.setVisibility(View.GONE); + adapter.updateRecylerView(mAddList); + if(1==page){//第一页且有数据为刷新 + circleRefreshView.refreshFinish(PullToRefreshLayout.SUCCEED); + }else{//非第一页且有数据为加载,加载成功不必悬停 + circleRefreshView.refreshFinish(PullToRefreshLayout.SUCCEED); + } + }else if(mList.isEmpty()){ + circleRefreshView.loadmoreFinish(PullToRefreshLayout.SUC_NODATA); + } + } + } + },null); + } + + /** + * 下拉刷新 + */ + @Override + public void onRefresh(PullToRefreshLayout pullToRefreshLayout) { + loadFirstPageData(); + } + + /** + * 上拉加载 + */ + @Override + public void onLoadMore(PullToRefreshLayout pullToRefreshLayout) { + ++page; + isshow = false; + getCircleRecent(); + } + + /** + * 清楚数组,加载第一页数据显示 + */ + private void loadFirstPageData(){ + mAddList = new ArrayList<>(); + page = 1; + isshow = false; + getCircleRecent(); + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/CirclePublishFragment.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/CirclePublishFragment.java new file mode 100644 index 0000000000000000000000000000000000000000..cb44e3b30bac97fd0519d86c00a139fc44f2c767 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/CirclePublishFragment.java @@ -0,0 +1,365 @@ +package com.jiuqi.elove.fragment; + +import android.content.Intent; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.support.v7.app.AlertDialog; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.jiuqi.elove.R; +import com.jiuqi.elove.activity.CircleDetailActivity; +import com.jiuqi.elove.activity.OtherPersonCenterActivity; +import com.jiuqi.elove.activity.PlayCircleVideoActivity; +import com.jiuqi.elove.activity.PreviewAvatarActivity; +import com.jiuqi.elove.activity.PreviewImgActivity; +import com.jiuqi.elove.activity.PutRecentActivity; +import com.jiuqi.elove.activity.TopicDetailActivity; +import com.jiuqi.elove.adapter.CircleRecentAdapter201801; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.entity.CircleNewModel; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; +import com.jiuqi.elove.util.SupportMultiScreenUtil; +import com.jiuqi.elove.widget.pulltorefresh.PullToRefreshLayout; + +import java.util.ArrayList; +import java.util.List; + +/** + * 发布的缘圈 + * Created by dl on 2017/3/23. + */ +public class CirclePublishFragment extends Fragment implements PullToRefreshLayout.OnRefreshListener{ + + /** + * 控件 + */ + private RecyclerView lv_gift; + private RelativeLayout rlay_nodata; + private PullToRefreshLayout circleRefreshView; + private LinearLayout del_conversation; + private LinearLayout cancel_del_conversation; + private AlertDialog dialog; + + /** + * 数据 + */ + private int page = 1; + private int pagesize = 10; + private String userId; + private List mList; + private List mAddList; + private int clickPosition; + + /** + * 工具 + */ + private CircleRecentAdapter201801 adapter; + private OkHttpUtil okHttpUtil = OkHttpUtil.getInstance(); + private Boolean isshow = true; + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_circle_publish,container,false); + initView(view); + return view; + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + getDataFromSp();//从sp中获取需要的数据 + setLayoutAndAdapter();//给recyclerview设置layoutmanager和adapter + retrieveDataAndSet();//初始化数据容器,获取服务器数据并进行设置 + setEvents(); + } + + /** + * 初始化控件 + * @param view 上下文view + */ + private void initView(View view) { + lv_gift = (RecyclerView) view.findViewById(R.id.lv_gift); + rlay_nodata = (RelativeLayout) view.findViewById(R.id.rlay_nodata); + circleRefreshView = (PullToRefreshLayout) view.findViewById(R.id.circleRefreshView); + } + + private void getDataFromSp() { + userId = SpUtils.getString(Constant.USER_ID); + } + + private void setLayoutAndAdapter() { + //给recyclerview设置manager,并通过自定义给其设置间距 + lv_gift.setLayoutManager(new LinearLayoutManager(getActivity())); +// lv_gift.addItemDecoration(new GridSpacingItemDecoration(2,18,false)); + //创建adapter,并设置 + adapter = new CircleRecentAdapter201801(getActivity()); + lv_gift.setAdapter(adapter); + circleRefreshView.setOnRefreshListener(this); + adapter.setOnItemClickListener(new CircleRecentAdapter201801.OnItemClickListener() { + @Override + public void likeOrNot(CircleNewModel model, int position) {//点赞或者取消点赞 + likeOrNotThisCircle(model,position); + } + + @Override + public void comment(CircleNewModel model,int position) {//评论 + Intent intent = new Intent(getActivity(), CircleDetailActivity.class); + intent.putExtra("circleid",model.getYuanquanid()); + clickPosition = position; + startActivityForResult(intent,0x110); + } + + @Override + public void clickPicOrVideo(List mList, int position) {//查看大图 + Intent intent; + if(mList.size()==1){ + intent = new Intent(getActivity(), PreviewAvatarActivity.class); + intent.putExtra("imageUrl",mList.get(0).getImg()); + }else{ + intent = new Intent(getActivity(), PreviewImgActivity.class); + intent.putExtra("currentItem",String.valueOf(position)); + Bundle bundle = new Bundle(); + String[] imgUrls = new String[mList.size()]; + for(int i=0;i(); + getCircleRecent();//从服务器获取数据并进行设置 + } + + private void setEvents() { + + } + + private void getCircleRecent() { + String receivegiftUrl = Constant.COMMON_URL + Interface.CIRCLE_LIST_PUBLISH; + JSONObject obj = new JSONObject(); + obj.put("version",Constant.VERSION); + obj.put("userid",userId); + obj.put("offset",page); + obj.put("limit",pagesize); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(getActivity(), isshow, receivegiftUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + if(Constant.SUCCESS_CODE.equals(rsCode)){ + String result = jsonObject.getString("message"); + mList = JSONArray.parseArray(result,CircleNewModel.class); + mAddList.addAll(mList); + if(page==1&&mAddList.isEmpty()&&mList.isEmpty()){ + rlay_nodata.setVisibility(View.VISIBLE); + }else if(!mList.isEmpty()){ + rlay_nodata.setVisibility(View.GONE); + adapter.updateRecylerView(mAddList); + if(1==page){//第一页且有数据为刷新 + circleRefreshView.refreshFinish(PullToRefreshLayout.SUCCEED); + }else{//非第一页且有数据为加载,加载成功不必悬停 + circleRefreshView.refreshFinish(PullToRefreshLayout.SUCCEED); + } + }else if(mList.isEmpty()){ + circleRefreshView.loadmoreFinish(PullToRefreshLayout.SUC_NODATA); + } + } + } + },null); + } + + /** + * 下拉刷新 + */ + @Override + public void onRefresh(PullToRefreshLayout pullToRefreshLayout) { + loadFirstPageData(); + } + + /** + * 上拉加载 + */ + @Override + public void onLoadMore(PullToRefreshLayout pullToRefreshLayout) { + ++page; + isshow = false; + getCircleRecent(); + } + + /** + * 清楚数组,加载第一页数据显示 + */ + private void loadFirstPageData(){ + mAddList = new ArrayList<>(); + page = 1; + isshow = false; + getCircleRecent(); + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/ContactPersonFragment.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/ContactPersonFragment.java new file mode 100644 index 0000000000000000000000000000000000000000..90ed0318f0d0418c9298e76c04389c32c460affb --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/ContactPersonFragment.java @@ -0,0 +1,260 @@ +package com.jiuqi.elove.fragment; + +import android.content.DialogInterface; +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ExpandableListView; +import android.widget.RelativeLayout; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.hyphenate.easeui.EaseConstant; +import com.jiuqi.elove.R; +import com.jiuqi.elove.activity.ChatActivity; +import com.jiuqi.elove.adapter.ContactPersonAdapter; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.entity.ContactPersonModel; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.widget.dialog.CustomDialog; + +import java.util.ArrayList; +import java.util.List; + +/** + * + * Created by dl on 2016/7/13. + */ +public class ContactPersonFragment extends Fragment{ + + private static final String TAG = "ContactPersonFragment"; + + private String userid; + private int kind; + private String ifac; + private final OkHttpUtil okHttpUtil = OkHttpUtil.getInstance(); + private List fansList; + private List friendsList; + private List attentionList; + private List blackList; + private List> mList; + private ContactPersonAdapter adapter; + private ExpandableListView contactPersonList; + private RelativeLayout rlay_nodata; + public static ContactPersonFragment instance; + + /** + * 2.0.2版本加入群聊功能时的选择群组成员 + * 同样进入联系人页面 + */ + private Bundle fragmentArgs; + private String groupName=""; + private List existMembers; + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_contact_person, container, false); + initView(view); + return view; + } + + private void initView(View view) { + contactPersonList = (ExpandableListView) view.findViewById(R.id.contact_preson_list); + rlay_nodata = (RelativeLayout) view.findViewById(R.id.rlay_nodata); + + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + SharedPreferences sp = getActivity().getSharedPreferences("elove",getActivity().getApplicationContext().MODE_PRIVATE); + userid = sp.getString("userid",""); + kind = sp.getInt("kind",1000); + ifac = sp.getString("ifac",""); + /** + * 2.0.2版本加入群聊功能时的选择群组成员 + */ + instance = this; + fragmentArgs = getArguments(); + if(fragmentArgs!=null){ + groupName = fragmentArgs.getString("groupName"); + existMembers = fragmentArgs.getStringArrayList("existMembers"); + } + getContactList(); + } + @Override + public void setUserVisibleHint(boolean isVisibleToUser) { + super.setUserVisibleHint(isVisibleToUser); + if (isVisibleToUser) { + getContactList(); + //相当于Fragment的onResume + } else { + //相当于Fragment的onPause + } + } + + public void getContactList() { + String contactUrl = Constant.COMMON_URL + Interface.GET_CONTACT_PERSON; + JSONObject obj = new JSONObject(); + obj.put("userID",userid); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(getActivity(),true,contactUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + if("1".equals(rsCode)){ + rlay_nodata.setVisibility(View.GONE); + contactPersonList.setVisibility(View.VISIBLE); + /** + * 获取三个列表人的数据结合并转换为JSONObject格式 + */ + String contactString = jsonObject.getString("message"); + Log.d(TAG, "onResponse: "+contactString); + JSONObject contactObj = com.alibaba.fastjson.JSON.parseObject(contactString); + //获取粉丝列表数据 + String fans = contactObj.getString("fans"); + fansList = JSON.parseArray(fans,ContactPersonModel.class); + //获取朋友列表数据 + String friends = contactObj.getString("friend"); + friendsList = JSON.parseArray(friends,ContactPersonModel.class); + //获取关注人列表数据 + String attention = contactObj.getString("attention"); + attentionList = JSON.parseArray(attention,ContactPersonModel.class); + //获取黑名单列表数据 + String black = contactObj.getString("black"); + blackList = JSON.parseArray(black,ContactPersonModel.class); + mList = new ArrayList<>(); + mList.add(0,attentionList); + mList.add(1,fansList); + mList.add(2,friendsList); + mList.add(3,blackList);//2.0.2版本添加黑名单 + Log.d("recent", "onResponse: "+mList.size()); +// Log.d("recent", "onResponse: "+mList.get(0).get(0).getNickname()); + getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + /** + * 2.0.2版本添加了groupName和existMembers + * 用于判断是否显示选择框和存在的组内成员 + */ + adapter = new ContactPersonAdapter(getActivity(),mList,groupName,existMembers); + contactPersonList.setAdapter(adapter); + if(!JqStrUtil.isEmpty(groupName)&&existMembers!=null){ + for (int i=0;i getmSelectedPersonName(){ + return adapter.getmSelectedPersonName(); + } + + /** + * 选择是否取消屏蔽他人 + */ + private void showUnShieldingDialog(final String userid,final ContactPersonModel model) { + //对话框 + CustomDialog.Builder builder = new CustomDialog.Builder(getActivity()); + builder.setTitle("取消屏蔽用户"); + builder.setMessage("确定要取消屏蔽此用户吗?"); + builder.setPositiveButton(R.string.confirm,new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + unShieldingMethod(userid,model); + } + }); + builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }); + builder.create().show(); + } + + /** + * 取消屏蔽他人 + */ + private void unShieldingMethod(String userid,final ContactPersonModel model) { + String focusUrl = Constant.COMMON_URL + Interface.ADD_FOCUS; + SharedPreferences sp = getActivity().getSharedPreferences("elove",getActivity().MODE_PRIVATE); + String userId = sp.getString("userid",""); + JSONObject obj = new JSONObject(); + obj.put("otherID",userid); + obj.put("userID",userId); + obj.put("action",Constant.ACTION_UNSHIELD);//4 此时操作则为取消屏蔽他人 + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + Log.d("ok", "add: param"+param); + okHttpUtil.sendJsonStrByPostAsync(getActivity(),true,focusUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if("1".equals(rsCode)) { + blackList.remove(model); + adapter.notifyDataSetChanged(); + }else{ + JqStrUtil.showToast(getActivity(), explanation); + } + } + },null); + } + + @Override + public void onDestroy() { + super.onDestroy(); + if(instance!=null){ + instance = null; + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/EmotionQuestionFragment.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/EmotionQuestionFragment.java new file mode 100644 index 0000000000000000000000000000000000000000..229296d759e76394a10fc9de3a59920516e604af --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/EmotionQuestionFragment.java @@ -0,0 +1,149 @@ +package com.jiuqi.elove.fragment; + +import android.app.Activity; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.alibaba.fastjson.JSON; +import com.jiuqi.elove.R; +import com.jiuqi.elove.entity.QuestionModel; +import com.jiuqi.elove.util.JqStrUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * + * Created by liulin on 2016/12/1. + */ +public class EmotionQuestionFragment extends Fragment{ + +// private TextView question_no; + private TextView question_text; +// private TextView tv_id; + private LinearLayout ll_answer; + private Bundle fragmentArgs; + private QuestionModel model; + private QuestionModel.TestkeylistBean bean; + private List mList; + private MyListener myListener; + private ArrayList imgviewList; + + public interface MyListener{ + public void comfirmData(String answercode); + } + + @Override + public void onAttach(Activity activity) { + super.onAttach(activity); + try{ + myListener = (MyListener) activity; + }catch (ClassCastException exception){ + throw new ClassCastException(getActivity().getClass().getName() + +" must implements interface MyListener"); + } + + } + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View mView = inflater.inflate(R.layout.fragment_emotion_question,container,false); + initView(mView); + return mView; + } + + private void initView(View mView) { +// question_no = (TextView) mView.findViewById(R.id.question_no); + question_text = (TextView) mView.findViewById(R.id.question_text); +// tv_id = (TextView) mView.findViewById(R.id.tv_id); + ll_answer = (LinearLayout) mView.findViewById(R.id.ll_answer); + } + + public void setDataToView(String answer,final String answercode) { +// LinearLayout ll = new LinearLayout(getActivity()); + RelativeLayout rl = new RelativeLayout(getActivity()); +// rl.setGravity(RelativeLayout.CENTER_VERTICAL); + rl.setGravity(RelativeLayout.ALIGN_PARENT_TOP); +// ll.setOrientation(LinearLayout.HORIZONTAL); +// ll.setPadding(0,50,0,0); +// rl.setPadding(0,50,0,0); + TextView tv = new TextView(getActivity()); + final ImageView iv = new ImageView(getActivity()); +// LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT); + RelativeLayout.LayoutParams rp = new RelativeLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT); +// rp.addRule(RelativeLayout.ALIGN_PARENT_TOP); +// LinearLayout.LayoutParams lp2 = new LinearLayout.LayoutParams(50,50); + RelativeLayout.LayoutParams rp2 = new RelativeLayout.LayoutParams(50,50); + rp2.setMargins(0,50,0,0); +// rp2.addRule(RelativeLayout.ALIGN_PARENT_TOP); +// rp2.addRule(RelativeLayout.ALIGN_BASELINE); +// rp.addRule(RelativeLayout.ALIGN_BASELINE); +// rp.addRule(RelativeLayout.CENTER_VERTICAL); +// rp2.addRule(RelativeLayout.CENTER_VERTICAL); +// tv.setLayoutParams(lp); + rp.setMargins(22,50,0,0); +// rp.setMarginStart(22); + +// tv.setPadding(22,0,0,0); +// tv.setTextSize(16); + tv.setTextColor(getResources().getColor(R.color.emotion_test_lead)); + tv.setText(answer); +// tv.setGravity(rl.getBaseline()); +// iv.setLayoutParams(lp2); + iv.setLayoutParams(rp2); + iv.setImageResource(R.drawable.answer_uncheck); + iv.setId(Integer.valueOf(answercode.substring(4))); +// ll.addView(iv); +// ll.addView(tv); + rp.addRule(RelativeLayout.RIGHT_OF,iv.getId()); + tv.setLayoutParams(rp); + rl.addView(iv); + rl.addView(tv); + imgviewList.add(iv); + rl.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { +// JqStrUtil.showToast(getActivity(),tv2.getText().toString()); + iv.setImageResource(R.drawable.answer_checked); + myListener.comfirmData(answercode); + for(int i=0;i(); + mList = model.getTestkeylist(); + for(int i=0;i mAdList; + private String lat; + private String lng; + /** + *工具 + */ + private final OkHttpUtil okHttpUtil = OkHttpUtil.getInstance(); + + + @Override + protected void initView() { + top_view.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, StatusBarUtil.intStatusView())); + top_view.setBackgroundColor(ContextCompat.getColor(getActivity(),R.color.colorPrimaryDark)); + tvTitle.setText(getString(R.string.find_out)); + img_leftBtn.setImageResource(R.drawable.icon_scan); + img_rightBtn.setImageResource(R.drawable.icon_search); + img_leftBtn.setVisibility(View.GONE); + img_rightBtn.setVisibility(View.VISIBLE); + getDataFromSp(); + MyLayoutManager.setViewLayout(getActivity(),slide_view,0,1,1,16,9); + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + getBanner(); + } + + private void getDataFromSp() { + lat = SpUtils.getString(Constant.LOCATE_LAT); + lng = SpUtils.getString(Constant.LOCATE_LNG); + } + + @Override + protected int getLayoutResource() { + return R.layout.fragment_find; + } + + private void getBanner() { + String bannerUrl = Constant.COMMON_URL + Interface.AD_BANNER; + JSONObject obj = new JSONObject(); + obj.put("version",Constant.VERSION); + obj.put("lng",lng); + obj.put("lat",lat); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(getActivity(), true, bannerUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if("1".equals(rsCode)){ + String result = jsonObject.getString("message"); + mAdList = JSONArray.parseArray(result,AdvertisementModel.class); + Log.d(TAG, "onResponse: "+result); + if(mAdList!=null&&!mAdList.isEmpty()){ + slide_view.setVisibility(View.VISIBLE); + initBannerData(mAdList); + }else{ + slide_view.setVisibility(View.GONE); + } + }else{ + slide_view.setVisibility(View.GONE); + JqStrUtil.showToast(getActivity(),explanation); + } + } + },null); + } + + @OnClick({R.id.rl_circle,R.id.rl_news,R.id.rl_visitor,R.id.rl_friend,R.id.rl_recommend,R.id.rl_test,R.id.img_leftBtn,R.id.img_rightBtn}) + public void onClick(View view) { + switch (view.getId()){ + case R.id.rl_circle: + Intent circle = new Intent(getActivity(), FriendCircleActivity.class); + circle.putExtra("title","缘圈"); + startActivity(circle); + break; + case R.id.rl_news: + Intent actIntent = new Intent(getActivity(), NewsActivity.class); + startActivity(actIntent); + break; + case R.id.rl_visitor://最近访客 + if(!JqStrUtil.isLogin()){ + startLoginPage(); + return; + } + Intent nearIntent = new Intent(getActivity(), ViewOrLikeMeActivity.class); + startActivity(nearIntent); + break; + case R.id.rl_friend: + if(!JqStrUtil.isLogin()){ + startLoginPage(); + return; + } + Intent friend = new Intent(getActivity(), MyRelationPersonActivity.class); + startActivity(friend); + break; + case R.id.rl_recommend://系统推荐 + if(!JqStrUtil.isLogin()){ + startLoginPage(); + return; + } + Intent sysIntent = new Intent(getActivity(),SysRecommendActivity.class); + sysIntent.putExtra("title","系统推荐"); + startActivity(sysIntent); + break; + case R.id.rl_test://情感测试 + if(!JqStrUtil.isLogin()){ + startLoginPage(); + return; + } + Intent testIntent = new Intent(getActivity(),CommonH5Activity.class); + testIntent.putExtra("title","缘分测试"); + startActivity(testIntent); + break; + case R.id.img_leftBtn://右侧扫描二维码 + getPermission(); + break; + case R.id.img_rightBtn://查找人 + Intent intent = new Intent(getActivity(), FindPersonConditionActivity.class); + startActivity(intent); + break; + default: + break; + } + } + + private void startLoginPage() { + Intent intent = new Intent(getActivity(),LoginActivity.class); + startActivity(intent); + } + + /** + * 获取权限 + */ + private void getPermission() { + JqBaseActivity.requestRuntimePermission(new String[]{Manifest.permission.CAMERA}, new PermissionListener() { + @Override + public void onGranted() { + Intent qrIntent = new Intent(getActivity(), CaptureActivity.class); + startActivity(qrIntent); + } + + @Override + public void onDenied(List deniedPermission) { + + } + }); + } + + @Override + public void onPause() { + super.onPause(); + slide_view.pause();//暂停轮播 + } + + @Override + public void onResume() { + super.onResume(); + slide_view.start();//开始轮播 + } + + /** + * 轮播图 + * + * @param bannerList + */ + private void initBannerData(List bannerList) { + slide_view.setPages(bannerList, new MZHolderCreator() { + @Override + public MZViewHolder createViewHolder() { + return new ViewPagerHolder(); + } + }); + slide_view.start();//开始轮播 + } + + public final class ViewPagerHolder implements MZViewHolder { + private ImageView mImageView; + private TextView tvLogin; + + @Override + public View createView(Context context) { + View view = LayoutInflater.from(context).inflate(R.layout.sliding_play_view_item,null); + mImageView = (ImageView) view.findViewById(R.id.viewPager_item_image); + tvLogin = (TextView) view.findViewById(R.id.goto_login); + return view; + } + + @Override + public void onBind(Context context, int position, final AdvertisementModel data) { + EasyGlide.getInstance().showImage(false,data.getPhoto(),mImageView,-1); + tvLogin.setVisibility(View.GONE); + mImageView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (1==data.getType()) {//活动 + startActPage(data); + }else if(2==data.getType()){//链接 + startLinkPage(data); + }else if(3==data.getType()){//会员 + startMemMainPage(data); + } + } + }); + } + } + + /** + * 打开会员详情 + * @param data 广告对象 + */ + private void startMemMainPage(AdvertisementModel data) { + Intent intent = new Intent(getActivity(), OtherPersonCenterActivity.class); + intent.putExtra("otherid", data.getSkipID()); + startActivity(intent); + } + + /** + * 打开链接详情 + * @param data 广告对象 + */ + private void startLinkPage(AdvertisementModel data) { + Intent intent = new Intent(getActivity(), CommonH5Activity.class); + intent.putExtra("title","广告"); + intent.putExtra("url", data.getSkipURL()); + startActivity(intent); + } + + /** + * 打开活动详情 + * @param data 广告对象 + */ + private void startActPage(AdvertisementModel data) { + Intent intent = new Intent(getActivity(), EActDetailActivity2_0_3.class); + intent.putExtra("actid", data.getSkipID()); + startActivity(intent); + } + +} \ No newline at end of file diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/FindFragment201801.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/FindFragment201801.java new file mode 100644 index 0000000000000000000000000000000000000000..e768e84f29ebe366e996564d9b52848ac04b8a5a --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/FindFragment201801.java @@ -0,0 +1,577 @@ +package com.jiuqi.elove.fragment; + +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.content.ContextCompat; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.jiuqi.elove.R; +import com.jiuqi.elove.activity.CircleCommentDetailActivity; +import com.jiuqi.elove.activity.CircleDetailActivity; +import com.jiuqi.elove.activity.CommonH5Activity; +import com.jiuqi.elove.activity.EActDetailActivity2_0_3; +import com.jiuqi.elove.activity.LoginActivity; +import com.jiuqi.elove.activity.NewsActivity; +import com.jiuqi.elove.activity.OtherPersonCenterActivity; +import com.jiuqi.elove.activity.PlayCircleVideoActivity; +import com.jiuqi.elove.activity.PreviewAvatarActivity; +import com.jiuqi.elove.activity.PreviewImgActivity; +import com.jiuqi.elove.activity.PutRecentActivity; +import com.jiuqi.elove.activity.SysRecommendActivity; +import com.jiuqi.elove.activity.TopicDetailActivity; +import com.jiuqi.elove.adapter.CircleRecentAdapter201801; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.entity.AdvertisementModel; +import com.jiuqi.elove.entity.CircleModel; +import com.jiuqi.elove.entity.CircleNewModel; +import com.jiuqi.elove.util.EasyGlide; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; +import com.jiuqi.elove.util.StatusBarUtil; +import com.jiuqi.elove.util.SupportMultiScreenUtil; +import com.jiuqi.elove.widget.pulltorefresh.PullToRefreshLayout; +import com.zhouwei.mzbanner.MZBannerView; +import com.zhouwei.mzbanner.holder.MZHolderCreator; +import com.zhouwei.mzbanner.holder.MZViewHolder; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; + +/** + * 新版发现 + * Created by dl on 2018/1/2. + */ +public class FindFragment201801 extends ABaseFragment implements PullToRefreshLayout.OnRefreshListener{ + + /** + * 组件 + */ + @BindView(R.id.rv_circle) + RecyclerView rv_circle; + @BindView(R.id.rl_nodata) + RelativeLayout rl_nodata; + @BindView(R.id.circleRefreshView) + PullToRefreshLayout circleRefreshView; + @BindView(R.id.rl_right) + RelativeLayout rl_right; + @BindView(R.id.iv_right) + ImageView iv_right; + @BindView(R.id.toolbar_title) + TextView tv_title; + @BindView(R.id.top_view) + View top_view; + MZBannerView slide_view; + LinearLayout ll_zx; + LinearLayout ll_recommend; + LinearLayout ll_test; + + /** + * 数据 + */ + public static FindFragment201801 instance; + private int page = 1; + private int pagesize = 10; + private boolean isshow = true; + private List mAdList;//广告数据 + private List mList;//缘圈列表 + private List mAddList;//缘圈列表 + private CircleRecentAdapter201801 adapter; + private String userid; + private String lat; + private String lng; + private int clickPosition; + + @Override + protected void initView() { + instance = this; + SupportMultiScreenUtil.scale(rootView); + top_view.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, StatusBarUtil.intStatusView())); + top_view.setBackgroundColor(ContextCompat.getColor(getActivity(),R.color.colorPrimaryDark)); + tv_title.setText("发现"); + iv_right.setImageResource(R.drawable.icon_qa_publish); + rl_right.setVisibility(View.VISIBLE); + } + + @Override + protected int getLayoutResource() { + return R.layout.fragment_friend_circle201801; + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + instance = this; + getDataFromSp(); + initView(); + initAdapter(); + setEvents(); + } + + /** + * 从缓存中获取需要的数据 + */ + private void getDataFromSp() { + userid = SpUtils.getString(Constant.USER_ID); + lat = SpUtils.getString(Constant.LOCATE_LAT); + lng = SpUtils.getString(Constant.LOCATE_LNG); + } + + /** + * 初始化adapter + */ + private void initAdapter() { + RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity()); + rv_circle.setLayoutManager(layoutManager); + adapter = new CircleRecentAdapter201801(getActivity()); + rv_circle.setAdapter(adapter); + mAddList = new ArrayList<>(); + getBanner();//获取轮播图 + } + + /** + * 获取轮播图 + */ + private void getBanner() { + String bannerUrl = Constant.COMMON_URL + Interface.AD_BANNER; + JSONObject obj = new JSONObject(); + obj.put("version",Constant.VERSION); + obj.put("lng",lng); + obj.put("lat",lat); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(getActivity(), true, bannerUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if(Constant.SUCCESS_CODE.equals(rsCode)){ + String result = jsonObject.getString("message"); + mAdList = JSONArray.parseArray(result,AdvertisementModel.class); + setHeader(rv_circle);//给recyclerview设置header + getCircleRecent();//获取缘圈列表 + }else{ + showToast(explanation); + } + } + },null); + } + + /** + * 获取缘圈列表 + */ + private void getCircleRecent() { + userid = SpUtils.getString(Constant.USER_ID); + String circleUrl = Constant.COMMON_URL + Interface.CIRCLE_NEW; + JSONObject obj = new JSONObject(); + obj.put("version",Constant.VERSION); + obj.put("userid",userid); + obj.put("offset",page); + obj.put("limit",pagesize); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(getActivity(), isshow, circleUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + if(Constant.SUCCESS_CODE.equals(rsCode)){ + String result = jsonObject.getString("message"); + mList = JSONArray.parseArray(result,CircleNewModel.class); + mAddList.addAll(mList); + if(page==1&&mAddList.isEmpty()&&mList.isEmpty()){ + rl_nodata.setVisibility(View.VISIBLE); + }else if(!mList.isEmpty()){ + rl_nodata.setVisibility(View.GONE); + adapter.updateRecylerView(mAddList); + if(1==page){//第一页且有数据为刷新 + circleRefreshView.refreshFinish(PullToRefreshLayout.SUCCEED); + }else{//非第一页且有数据为加载,加载成功不必悬停 + circleRefreshView.refreshFinish(PullToRefreshLayout.SUCCEED); + } + }else if(mList.isEmpty()){ + circleRefreshView.loadmoreFinish(PullToRefreshLayout.SUC_NODATA); + } + } + } + },null); + } + + /** + * 给recyclerview设置header + */ + private void setHeader(RecyclerView rv_circle) { + View view = LayoutInflater.from(getActivity()).inflate(R.layout.item_brand,rv_circle,false); + SupportMultiScreenUtil.scale(view); + setData2ViewOrClick(view); + adapter.setHeaderView(view); + } + + /** + * 设置header的内容和点击事件 + */ + private void setData2ViewOrClick(View view) { + slide_view = (MZBannerView) view.findViewById(R.id.slide_view); + ll_recommend = (LinearLayout) view.findViewById(R.id.ll_recommend); + ll_zx = (LinearLayout) view.findViewById(R.id.ll_zx); + ll_test = (LinearLayout) view.findViewById(R.id.ll_test); + slide_view.setPages(mAdList, new MZHolderCreator() { + @Override + public MZViewHolder createViewHolder() { + return new FindFragment201801.ViewPagerHolder(); + } + }); + slide_view.start();//开始轮播 + setBrandClick();//点击各个板块 + } + + /** + * 轮播图的item的容器 + */ + public final class ViewPagerHolder implements MZViewHolder { + private ImageView mImageView; + private TextView tvLogin; + + @Override + public View createView(Context context) { + View view = LayoutInflater.from(context).inflate(R.layout.sliding_play_view_item,rv_circle,false); + mImageView = (ImageView) view.findViewById(R.id.viewPager_item_image); + tvLogin = (TextView) view.findViewById(R.id.goto_login); + return view; + } + + @Override + public void onBind(Context context, int position, final AdvertisementModel data) { + EasyGlide.getInstance().showImage(false,data.getPhoto(),mImageView,-1); + tvLogin.setVisibility(View.GONE); + mImageView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (1==data.getType()) {//活动 + startActPage(data); + }else if(2==data.getType()){//链接 + startLinkPage(data); + }else if(3==data.getType()){//会员 + startMemMainPage(data); + } + } + }); + } + } + + /** + * 打开会员详情 + * @param data 广告对象 + */ + private void startMemMainPage(AdvertisementModel data) { + Intent intent = new Intent(getActivity(), OtherPersonCenterActivity.class); + intent.putExtra("otherid", data.getSkipID()); + startActivity(intent); + } + + /** + * 打开链接详情 + * @param data 广告对象 + */ + private void startLinkPage(AdvertisementModel data) { + Intent intent = new Intent(getActivity(), CommonH5Activity.class); + intent.putExtra("title","广告"); + intent.putExtra("url", data.getSkipURL()); + startActivity(intent); + } + + /** + * 打开活动详情 + * @param data 广告对象 + */ + private void startActPage(AdvertisementModel data) { + Intent intent = new Intent(getActivity(), EActDetailActivity2_0_3.class); + intent.putExtra("actid", data.getSkipID()); + startActivity(intent); + } + + @Override + public void onPause() { + super.onPause(); + if(slide_view!=null) + slide_view.pause();//暂停轮播 + } + + @Override + public void onResume() { + super.onResume(); + if(slide_view!=null) + slide_view.start();//开始轮播 + } + + /** + * header中各个板块的点击事件 + */ + private void setBrandClick() { + ll_zx.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startZxPage(); + } + }); + ll_recommend.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(!JqStrUtil.isLogin()) + startLoginPage(); + else + startRecommend(); + } + + }); + ll_test.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(!JqStrUtil.isLogin()) + startLoginPage(); + else + startTestPage(); + } + }); + } + + /** + * 进入缘分测试 + */ + private void startTestPage() { + Intent intent = new Intent(getContext(), CommonH5Activity.class); + intent.putExtra("title","缘分测试"); + startActivity(intent); + } + + /** + * 进入系统推荐 + */ + private void startRecommend() { + Intent intent = new Intent(getContext(), SysRecommendActivity.class); + intent.putExtra("title","系统推荐"); + startActivity(intent); + } + + /** + * 进入启缘资讯 + */ + private void startZxPage() { + Intent intent = new Intent(getContext(), NewsActivity.class); + startActivity(intent); + } + + /** + * 未登录进行登录 + */ + private void startLoginPage() { + Intent intent = new Intent(getActivity(),LoginActivity.class); + startActivity(intent); + } + + /** + * 上拉加载下拉刷新事件绑定 + * 缘圈列表中的点击事件 + * 进入发表页面的点击事件 + */ + private void setEvents() { + circleRefreshView.setOnRefreshListener(this); + rl_right.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startPutCircle(); + } + }); + adapter.setOnItemClickListener(new CircleRecentAdapter201801.OnItemClickListener() { + @Override + public void likeOrNot(CircleNewModel model, int position) {//点赞或者取消点赞 + if(!JqStrUtil.isLogin()){ + startLoginPage(); + }else{ + likeOrNotThisCircle(model,position); + } + } + + @Override + public void comment(CircleNewModel model,int position) {//评论 + if(!JqStrUtil.isLogin()){ + startLoginPage(); + }else{ + Intent intent = new Intent(getActivity(), CircleDetailActivity.class); + intent.putExtra("circleid",model.getYuanquanid()); + clickPosition = position; + startActivityForResult(intent,0x110); + } + } + + @Override + public void clickPicOrVideo(List mList, int position) {//查看大图 + Intent intent; + if(mList.size()==1){ + intent = new Intent(getActivity(), PreviewAvatarActivity.class); + intent.putExtra("imageUrl",mList.get(0).getImg()); + }else{ + intent = new Intent(getActivity(), PreviewImgActivity.class); + intent.putExtra("currentItem",String.valueOf(position)); + Bundle bundle = new Bundle(); + String[] imgUrls = new String[mList.size()]; + for(int i=0;i(); + page = 1; + isshow = false; + getCircleRecent(); + } + + public void refresh(){ + loadFirstPageData(); + } + + @Override + public void onDestroy() { + super.onDestroy(); + if(instance!=null){ + instance = null; + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/FriendCircleFragment.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/FriendCircleFragment.java new file mode 100644 index 0000000000000000000000000000000000000000..8c68dbd6cdbbe506f091afc571a20ef706955d7f --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/FriendCircleFragment.java @@ -0,0 +1,500 @@ +package com.jiuqi.elove.fragment; + +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.graphics.Rect; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewTreeObserver; +import android.view.inputmethod.InputMethodManager; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.PopupWindow; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.jiuqi.elove.R; +import com.jiuqi.elove.activity.LoginActivity; +import com.jiuqi.elove.activity.OtherPersonCenterActivity; +import com.jiuqi.elove.activity.PlayCircleVideoActivity; +import com.jiuqi.elove.activity.PlayVideoActivity; +import com.jiuqi.elove.activity.PreviewAvatarActivity; +import com.jiuqi.elove.activity.PreviewImgActivity; +import com.jiuqi.elove.activity.ReportUserActivity; +import com.jiuqi.elove.adapter.CircleRecentAdapter; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.entity.CircleModel; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; +import com.jiuqi.elove.widget.pulltorefresh.PullToRefreshLayout; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +/** + * 朋友圈 + * Created by dl on 2017/5/2. + */ +public class FriendCircleFragment extends Fragment implements PullToRefreshLayout.OnRefreshListener{ + + /** + * 控件 + */ + private PullToRefreshLayout circleRefreshView; + private RelativeLayout rlay_nodata; + private RecyclerView lv_circle; + private LinearLayout ll_edit; + private EditText et_comment; + private TextView tv_sure; + /** + * 数据 + */ + private String userid; + private String nikename; + private int page = 1; + private int pagesize = 5; + private List mList; + private List mAddList; + private String title; + /** + * 工具 + */ + private final OkHttpUtil okHttpUtil = OkHttpUtil.getInstance(); + private boolean isshow = true; + private CircleRecentAdapter adapter; + public static FriendCircleFragment instance; + private PopupWindow window; + + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_friend_circle,container,false); + instance = this; + initView(view); + return view; + } + + private void initView(View view){ + circleRefreshView = (PullToRefreshLayout) view.findViewById(R.id.circleRefreshView); + lv_circle = (RecyclerView) view.findViewById(R.id.lv_circle); + rlay_nodata = (RelativeLayout) view.findViewById(R.id.rlay_nodata); + ll_edit = (LinearLayout) view.findViewById(R.id.ll_edit); + et_comment = (EditText) view.findViewById(R.id.et_comment); + tv_sure = (TextView) view.findViewById(R.id.tv_sure); + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + getDataFromSp(); + initAdapter(); + setEvents();//注册监听事件 + } + + /** + * 初始化adapter + */ + private void initAdapter() { + RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity()); + lv_circle.setLayoutManager(layoutManager); + adapter = new CircleRecentAdapter(getActivity()); + lv_circle.setAdapter(adapter); + mAddList = new ArrayList<>(); + getCircleRecent(); + } + + private void getDataFromSp() { + userid = SpUtils.getString(Constant.USER_ID); + nikename = SpUtils.getString(Constant.NIKE_NAME); + title = getArguments().getString("title"); + } + + private void getCircleRecent() { + String circleUrl; + if("我的足迹".equals(title)){ + circleUrl = Constant.COMMON_URL + Interface.MY_CIRCLE; + }else{ + circleUrl = Constant.COMMON_URL + Interface.CIRCLE_SHOW; + } + JSONObject obj = new JSONObject(); + obj.put("version",Constant.VERSION); + if("我的足迹".equals(title)){ + obj.put("userID",userid); + obj.put("offset",page); + obj.put("limit",pagesize); + }else{ + obj.put("userid",userid); + obj.put("pageindex",page); + obj.put("pagesize",pagesize); + } + + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(getActivity(), isshow, circleUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + if("1".equals(rsCode)){ + String result = jsonObject.getString("message"); + mList = JSONArray.parseArray(result,CircleModel.class); + mAddList.addAll(mList); + if(page==1&&mAddList.isEmpty()&&mList.isEmpty()){ + rlay_nodata.setVisibility(View.VISIBLE); + }else if(!mList.isEmpty()){ + rlay_nodata.setVisibility(View.GONE); + adapter.updateRecylerView(mAddList); + if(1==page){//第一页且有数据为刷新 + circleRefreshView.refreshFinish(PullToRefreshLayout.SUCCEED); + }else{//非第一页且有数据为加载,加载成功不必悬停 + circleRefreshView.refreshFinish(PullToRefreshLayout.SUCCEED); + } + }else if(mList.isEmpty()){ + circleRefreshView.loadmoreFinish(PullToRefreshLayout.SUC_NODATA); + } + } + } + },null); + } + + private void startLoginPage() { + Intent intent = new Intent(getActivity(),LoginActivity.class); + startActivity(intent); + } + + private void setEvents() { + circleRefreshView.setOnRefreshListener(this); + adapter.setOnItemClickListener(new CircleRecentAdapter.OnItemClickListener() { + @Override + public void likeOrNot(CircleModel model, int position) {//点赞或者取消点赞 + if(!JqStrUtil.isLogin()){ + startLoginPage(); + }else{ + likeOrNotThisCircle(model,position); + } + } + + @Override + public void comment(CircleModel model,int position,String otherid,String othername) {//评论 + if(!JqStrUtil.isLogin()){ + startLoginPage(); + }else{ + openKeyBoard("评论",model.getTitleid(),position,otherid,othername); + } + } + + @Override + public void deleteItem(CircleModel model, int position) {//删除 + if(!JqStrUtil.isLogin()){ + startLoginPage(); + }else{ + delThisCircle(model,position); + } + + } + + @Override + public void report(CircleModel model, int position) {//举报 + if(!JqStrUtil.isLogin()){ + startLoginPage(); + }else{ + Intent intent = new Intent(getActivity(), ReportUserActivity.class); + intent.putExtra("prepage","circle"); + intent.putExtra("myId",userid); + intent.putExtra("otherId",model.getTitleid()); + startActivity(intent); + } + } + + @Override + public void clickPicOrVideo(List> mList, int position) {//查看大图 + Intent intent; + if(mList.size()==1){ + intent = new Intent(getActivity(), PreviewAvatarActivity.class); + intent.putExtra("imageUrl",mList.get(0).get("img")); + }else{ + intent = new Intent(getActivity(), PreviewImgActivity.class); + intent.putExtra("currentItem",String.valueOf(position)); + Bundle bundle = new Bundle(); + String[] imgUrls = new String[mList.size()]; + for(int i=0;i mlist = circleModel.getReviews(); + mlist.add(model); + circleModel.setReviews(mlist); + mAddList.remove(position); + mAddList.add(position,circleModel); + adapter.updateRecylerView(mAddList); + }else{ + JqStrUtil.showToast(getActivity(),explanation); + } + } + },null); + } + + /** + * 删除自己的朋友圈 + */ + private void delThisCircle(final CircleModel model,final int position) { + String delCircleUrl = Constant.COMMON_URL + Interface.CIRCLE_DEL; + JSONObject obj = new JSONObject(); + obj.put("version",Constant.VERSION); + obj.put("userid",userid); + obj.put("titleid",model.getTitleid()); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(getActivity(), false, delCircleUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if("1".equals(rsCode)){ + mAddList.remove(model); + adapter.updateRecylerView(mAddList); + }else{ + JqStrUtil.showToast(getActivity(),explanation); + } + } + },null); + } + + /** + * 点赞或者取消赞 + * @param model + * @param position + */ + private void likeOrNotThisCircle(final CircleModel model,final int position) { + String circleLikeUrl = Constant.COMMON_URL + Interface.CIRCLE_LIKE; + JSONObject obj = new JSONObject(); + obj.put("version",Constant.VERSION); + obj.put("userid",userid); + obj.put("titleid",model.getTitleid()); + if(Constant.CIRCLE_NOT_LIKE==model.getIflike()){//点赞 + obj.put("action",Constant.LIKE_IS); + }else{ + obj.put("action",Constant.LIKE_CANCEL); + } + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(getActivity(), true, circleLikeUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if("1".equals(rsCode)){ + CircleModel.UserSimpleModel userSimpleModel = new CircleModel.UserSimpleModel(); + userSimpleModel.setLikeid(userid); + userSimpleModel.setLikename(nikename); + if(Constant.CIRCLE_NOT_LIKE==model.getIflike()){ + model.setIflike(Constant.CIRCLE_LIKE); + List likeList = model.getLikes(); + likeList.add(userSimpleModel); + model.setLikes(likeList); + mAddList.remove(position); + mAddList.add(position,model); + adapter.updateRecylerView(mAddList); + }else{ + model.setIflike(Constant.CIRCLE_NOT_LIKE); + List likeList = model.getLikes(); + likeList.remove(userSimpleModel); + model.setLikes(likeList); + mAddList.remove(position); + mAddList.add(position,model); + adapter.updateRecylerView(mAddList); + } + }else{ + JqStrUtil.showToast(getActivity(),explanation); + } + } + },null); + } + + @Override + public void onRefresh(PullToRefreshLayout pullToRefreshLayout) { + loadFirstPageData(); + } + + @Override + public void onLoadMore(PullToRefreshLayout pullToRefreshLayout) { + ++page; + isshow = false; + getCircleRecent(); + } + + @Override + public void onDestroy() { + super.onDestroy(); + if(instance!=null){ + instance = null; + } + } + + public void refresh(){ + loadFirstPageData(); + } + + private void loadFirstPageData(){ + mAddList = new ArrayList<>(); + page = 1; + isshow = false; + getCircleRecent(); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/HomePageFragment.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/HomePageFragment.java new file mode 100644 index 0000000000000000000000000000000000000000..967d1214f103f717d78fadc2e3d58b562dc93ce6 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/HomePageFragment.java @@ -0,0 +1,316 @@ +package com.jiuqi.elove.fragment; + +import android.content.Intent; +import android.graphics.Bitmap; +import android.graphics.drawable.BitmapDrawable; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.support.v4.content.ContextCompat; +import android.support.v7.widget.RecyclerView; +import android.text.TextUtils; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.jiuqi.elove.R; +import com.jiuqi.elove.activity.LoginActivity; +import com.jiuqi.elove.activity.NearbyMapActivity; +import com.jiuqi.elove.activity.NotifyRecentMessageActivity; +import com.jiuqi.elove.activity.OtherPersonCenterActivity; +import com.jiuqi.elove.adapter.RvCardAdapter; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.entity.NotifyModel; +import com.jiuqi.elove.entity.RecommendUserInfoModel; +import com.jiuqi.elove.util.BitmapUtils; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; +import com.jiuqi.elove.util.StatusBarUtil; +import com.jiuqi.elove.widget.slide_card.DiscreteScrollView; +import com.jiuqi.elove.widget.slide_card.ScaleTransformer; + +import java.util.ArrayList; +import java.util.List; + +/** + * 首页 + * Created by dl on 2017/12/27. + */ + + +public class HomePageFragment extends Fragment implements DiscreteScrollView.CurrentItemChangeListener{ + + private static final String TAG = "HomePageFragment26"; + /** + * 控件 + */ + private TextView tvTitle; + private RelativeLayout rlay_nodata; + private DiscreteScrollView slide_card; + private TextView tv_refresh; + private LinearLayout ll_locate;//定位 + private RelativeLayout rl_msg;//消息 + public ImageView right_unread_img;//右上角未读信息 + private LinearLayout ll_bg; + private View view_top; + /** + * 数据 + */ + private String userId; + private List mlist; + private List mlistAdd; + /** + *工具 + */ + public static HomePageFragment instance; + private String pageNo = "0"; + private String pageSize = "10"; + private RvCardAdapter cardAdapter; + private OkHttpUtil okHttpUtil = OkHttpUtil.getInstance(); + private Bundle fragmentArgs; + private NotifyModel model; + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_homepage_layout_new,container,false); + instance = this; + initView(view); + return view; + } + + private void initView(View view) { + ll_bg = (LinearLayout) view.findViewById(R.id.ll_bg); + view_top = view.findViewById(R.id.view_top); + view_top.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, StatusBarUtil.intStatusView())); +// view_top.setBackgroundColor(ContextCompat.getColor(getActivity(),R.color.colorPrimaryDark)); + Bitmap bitmap = BitmapUtils.compressBySize(getResources(),R.drawable.icon_homepage_bg,720,1280); + ll_bg.setBackground(new BitmapDrawable(bitmap)); + tvTitle = (TextView) view.findViewById(R.id.tvTitle); + tv_refresh = (TextView) view.findViewById(R.id.tv_refresh); + tv_refresh.setVisibility(View.GONE); + tvTitle.setText("首页"); + rlay_nodata = (RelativeLayout) view.findViewById(R.id.rlay_nodata); + rl_msg = (RelativeLayout) view.findViewById(R.id.rl_msg); + ll_locate = (LinearLayout) view.findViewById(R.id.ll_locate); + right_unread_img = (ImageView) view.findViewById(R.id.right_unread_img); + slide_card = (DiscreteScrollView) view.findViewById(R.id.slide_card); + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + getDataFromActivity(); + mlistAdd = new ArrayList<>(); + setAdapter(); + getRecommendList(); + initEvents(); + } + + + private void setAdapter() { + cardAdapter = new RvCardAdapter(getActivity(),R.layout.card_item); + slide_card.setAdapter(cardAdapter); + slide_card.setItemTransformer(new ScaleTransformer.Builder().setMinScale(0.8f).build()); + slide_card.setCurrentItemChangeListener(this); + slide_card.setScrollStateChangeListener(new DiscreteScrollView.ScrollStateChangeListener() { + @Override + public void onScrollStart(RecyclerView.ViewHolder currentItemHolder, int adapterPosition) { + Log.d("eee", "onScroll: 滑动"+adapterPosition); + if(adapterPosition==mlistAdd.size()-5){ + getMoreData(); + } + } + + @Override + public void onScrollEnd(RecyclerView.ViewHolder currentItemHolder, int adapterPosition) { + if(adapterPosition==mlistAdd.size()-1){ + getMoreData(); + } + } + + @Override + public void onScroll(float scrollPosition) { + + } + }); + cardAdapter.setListener(new RvCardAdapter.OnItemClickListener() { + @Override + public void onItemClick(RecommendUserInfoModel model) { + startOtherPage(model); + } + }); + } + + private void startOtherPage(RecommendUserInfoModel model) { + if(!JqStrUtil.isLogin()){ + startLoginPage(); + return; + } + Intent intent = new Intent(getActivity(), OtherPersonCenterActivity.class); + intent.putExtra("otherid", model.getOtherID()); + startActivity(intent); + } + + /** + * 从主页页面获取数据 + */ + private void getDataFromActivity() { + fragmentArgs = getArguments(); + model = (NotifyModel) fragmentArgs.getSerializable("message"); + } + + //获取推荐数据 + private void getRecommendList() { + userId = SpUtils.getString(Constant.USER_ID); + final String recommendUrl = Constant.COMMON_URL+ Interface.GET_RECOMMEND; + JSONObject obj = new JSONObject(); + if(TextUtils.isEmpty(userId)){ + userId = "00000000000000000000000000000000"; + } + obj.put("userID",userId); + obj.put("page",pageNo); + obj.put("pagesize",pageSize); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(getActivity(),false, recommendUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + if ("1".equals(rsCode)) { + String jsonString = jsonObject.getString("message"); + mlist = JSON.parseArray(jsonString, RecommendUserInfoModel.class); + mlistAdd.addAll(mlist); + if (mlistAdd.size() <= 0) { + rlay_nodata.setVisibility(View.VISIBLE); + } else { + rlay_nodata.setVisibility(View.GONE); + show(); + + } + } + if ("114".equals(rsCode)) { + doRetry(); + } + } + }, new OkHttpUtil.OnUnGetJsonObject() { + @Override + public void onResponse() { + tv_refresh.setVisibility(View.VISIBLE); + } + }); + + } + + private void initEvents() { + tv_refresh.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + tv_refresh.setVisibility(View.GONE); + getRecommendList(); + } + }); + ll_locate.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startNearByPage(); + } + }); + rl_msg.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(!JqStrUtil.isLogin()){ + startLoginPage(); + return; + } + startMsgPage(); + } + }); + } + + private void startLoginPage(){ + Intent intent = new Intent(getActivity(), LoginActivity.class); + startActivity(intent); + } + + /** + * 进入消息页面 + */ + private void startMsgPage() { + if(!JqStrUtil.isLogin()){ + startLoginPage(); + return; + } + Intent intent = new Intent(getActivity(), NotifyRecentMessageActivity.class); + intent.putExtra("model",model); + startActivity(intent); + } + + /** + * 进入附近人页面(地图) + */ + private void startNearByPage() { + Intent intent = new Intent(getActivity(), NearbyMapActivity.class); + startActivity(intent); + } + + + private void getMoreData(){ + pageNo = String.valueOf(Integer.parseInt(pageNo)+1); + getRecommendList(); + } + + @Override + public void onDestroy() { + super.onDestroy(); + if(instance!=null){ + instance = null; + } + okHttpUtil.cancelTag(getActivity()); + } + + /** + * 从头开始,重新浏览 + */ + public void doRetry() { + //必须先改变adapter中的数据,然后才能由数据变化带动页面刷新 + if (mlistAdd != null) { + cardAdapter.updateList(mlistAdd); + cardAdapter.notifyItemChanged(0); + } + } + /** + * 显示cardsview + */ + private void show() { + if (cardAdapter == null) { + cardAdapter = new RvCardAdapter(getActivity(),R.layout.card_item); + slide_card.setAdapter(cardAdapter); + cardAdapter.updateList(mlistAdd); + } else { + cardAdapter.updateList(mlistAdd); + } + } + + public void refresh(){ + mlistAdd.clear(); + setAdapter(); + pageNo = "0"; + getRecommendList(); + } + + @Override + public void onCurrentItemChanged(RecyclerView.ViewHolder viewHolder, int adapterPosition) { + Log.d("eee", "onCurrentItemChanged: "+adapterPosition+":"+(mlistAdd.size()-8)); + + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/HomePageFragment26.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/HomePageFragment26.java new file mode 100644 index 0000000000000000000000000000000000000000..5c8f2f67424d77fc87899a8debc3e93e5468a15b --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/HomePageFragment26.java @@ -0,0 +1,350 @@ +package com.jiuqi.elove.fragment; + +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.ColorDrawable; +import android.os.Build; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentActivity; +import android.support.v7.widget.CardView; +import android.text.TextUtils; +import android.util.DisplayMetrics; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; +import android.widget.AdapterView; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ListView; +import android.widget.PopupWindow; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.huxq17.swipecardsview.BaseCardAdapter; +import com.huxq17.swipecardsview.SwipeCardsView; +import com.jiuqi.elove.R; +import com.jiuqi.elove.activity.CharacterTestActivity; +import com.jiuqi.elove.activity.LoginActivity; +import com.jiuqi.elove.activity.MsgActivity; +import com.jiuqi.elove.activity.NearbyMapActivity; +import com.jiuqi.elove.activity.NotifyRecentMessageActivity; +import com.jiuqi.elove.activity.OtherPersonCenterActivity; +import com.jiuqi.elove.activity.PutAvatarActivity; +import com.jiuqi.elove.activity.TaskRewardActivity; +import com.jiuqi.elove.adapter.CardAdapter; +import com.jiuqi.elove.adapter.RecommendAdapter; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.entity.NotifyModel; +import com.jiuqi.elove.entity.RecommendUserInfoModel; +import com.jiuqi.elove.util.BitmapUtils; +import com.jiuqi.elove.util.CommonUtil; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; +import com.jiuqi.elove.widget.RangeSeekBar; +import com.jiuqi.elove.widget.pulltorefresh.PullToRefreshLayout; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by dl on 2017/2/7. + * 首页 + */ +public class HomePageFragment26 extends Fragment { + + private static final String TAG = "HomePageFragment26"; + /** + * 控件 + */ + private TextView tvTitle; + private RelativeLayout rlay_nodata; + private SwipeCardsView swipeCardsView; + private RelativeLayout ll_loading; + private ImageView iv_loading; + private TextView tv_refresh; + private TextView tv_address;//定位 + private LinearLayout ll_locate;//定位 + private RelativeLayout rl_msg;//消息 + public ImageView right_unread_img;//右上角未读信息 + private LinearLayout ll_bg; + /** + * 数据 + */ + private String userId; + private String city; + private List mlist; + private List mlistAdd; + /** + *工具 + */ + public static HomePageFragment26 instance; + private String pageNo = "0"; + private String pageSize = "10"; + private int curIndex = 0; + private int countIndex; + private CardAdapter cardAdapter; + private OkHttpUtil okHttpUtil = OkHttpUtil.getInstance(); + private boolean isshow = true; + private boolean isfinished = false; + private Bundle fragmentArgs; + private NotifyModel model; + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_homepage26_layout,container,false); + instance = this; + getDataFromSp(); + initView(view); + return view; + } + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + getDataFromActivity(); + Glide.with(HomePageFragment26.this).load(R.drawable.loading_homepage).placeholder(R.drawable.loading_homepage).diskCacheStrategy(DiskCacheStrategy.SOURCE).into(iv_loading); + mlistAdd = new ArrayList<>(); + getRecommendList(); + initEvents(); + } + + /** + * 从主页页面获取数据 + */ + private void getDataFromActivity() { + fragmentArgs = getArguments(); + model = (NotifyModel) fragmentArgs.getSerializable("message"); + } + + /** + * 获取数据 + */ + private void getDataFromSp() { + city = SpUtils.getString(Constant.ADDRESS); + } + + + + private void initView(View view) { + ll_bg = (LinearLayout) view.findViewById(R.id.ll_bg); + Bitmap bitmap = BitmapUtils.compressBySize(getResources(),R.drawable.icon_homepage_bg,720,1280); + ll_bg.setBackground(new BitmapDrawable(bitmap)); + tvTitle = (TextView) view.findViewById(R.id.tvTitle); + tv_refresh = (TextView) view.findViewById(R.id.tv_refresh); + tv_refresh.setVisibility(View.GONE); + tvTitle.setText("首页"); + rlay_nodata = (RelativeLayout) view.findViewById(R.id.rlay_nodata); + rl_msg = (RelativeLayout) view.findViewById(R.id.rl_msg); + ll_locate = (LinearLayout) view.findViewById(R.id.ll_locate); + tv_address = (TextView) view.findViewById(R.id.tv_address); + ll_loading = (RelativeLayout) view.findViewById(R.id.ll_loading); + iv_loading = (ImageView) view.findViewById(R.id.iv_loading); + right_unread_img = (ImageView) view.findViewById(R.id.right_unread_img); + swipeCardsView = (SwipeCardsView) view.findViewById(R.id.swipCardsView); + swipeCardsView.enableSwipe(true); + tv_address.setText(city); + } + //获取推荐数据 + private void getRecommendList() { + userId = SpUtils.getString(Constant.USER_ID); + final String recommendUrl = Constant.COMMON_URL+ Interface.GET_RECOMMEND; + JSONObject obj = new JSONObject(); + if(TextUtils.isEmpty(userId)){ + userId = "00000000000000000000000000000000"; + } + obj.put("userID",userId); + obj.put("page",pageNo); + obj.put("pagesize",pageSize); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(getActivity(),isshow, recommendUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + ll_loading.setVisibility(View.GONE); + String rsCode = jsonObject.getString("retcode"); + if ("1".equals(rsCode)) { + String jsonString = jsonObject.getString("message"); + mlist = JSON.parseArray(jsonString, RecommendUserInfoModel.class); + mlistAdd.addAll(mlist); + if (mlistAdd.size() <= 0) { + rlay_nodata.setVisibility(View.VISIBLE); + } else { + rlay_nodata.setVisibility(View.GONE); + Log.d(TAG, "onResponse:单次获取的list的长度 " + mlist.size()); + show(); + + } + } + if ("114".equals(rsCode)) { + Log.d(TAG, "onResponse: " + pageNo + ":" + mlistAdd.size()); + isfinished = true; + doRetry(); + } + } + }, new OkHttpUtil.OnUnGetJsonObject() { + @Override + public void onResponse() { + ll_loading.setVisibility(View.GONE); + tv_refresh.setVisibility(View.VISIBLE); + } + }); + + } + + private void initEvents() { + tv_refresh.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + tv_refresh.setVisibility(View.GONE); + isshow = true; + getRecommendList(); + } + }); + ll_locate.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startNearByPage(); + } + }); + rl_msg.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(!JqStrUtil.isLogin()){ + startLoginPage(); + return; + } + startMsgPage(); + } + }); + + //设置滑动监听 + swipeCardsView.setCardsSlideListener(new SwipeCardsView.CardsSlideListener() { + @Override + public void onShow(int index) { + curIndex = index; + countIndex = index+1; + } + + @Override + public void onCardVanish(int index, SwipeCardsView.SlideType type) { + if(mlistAdd.size()==countIndex){ + if(!isfinished){ + getMoreData(); + }else{ + doRetry(); + } + } + } + + @Override + public void onItemClick(View cardImageView, int index) { + if(!JqStrUtil.isLogin()){ + startLoginPage(); + return; + } + RecommendUserInfoModel model = mlistAdd.get(index); + Intent intent = new Intent(getActivity(), OtherPersonCenterActivity.class); + intent.putExtra("otherid", model.getOtherID()); + startActivity(intent); + } + }); + } + + private void startLoginPage(){ + Intent intent = new Intent(getActivity(), LoginActivity.class); + startActivity(intent); + } + + /** + * 进入消息页面 + */ + private void startMsgPage() { + if(!JqStrUtil.isLogin()){ + startLoginPage(); + return; + } + Intent intent = new Intent(getActivity(), NotifyRecentMessageActivity.class); + intent.putExtra("model",model); + startActivity(intent); + } + + /** + * 进入附近人页面(地图) + */ + private void startNearByPage() { + Intent intent = new Intent(getActivity(), NearbyMapActivity.class); + startActivity(intent); + } + + + private void getMoreData(){ + pageNo = String.valueOf(Integer.parseInt(pageNo)+1); + isshow = false; + if(ll_loading!=null){ + ll_loading.setVisibility(View.VISIBLE); + } + getRecommendList(); + } + + @Override + public void onDestroy() { + super.onDestroy(); + if(instance!=null){ + instance = null; + } + okHttpUtil.cancelTag(getActivity()); + } + + /** + * 从头开始,重新浏览 + */ + public void doRetry() { + //必须先改变adapter中的数据,然后才能由数据变化带动页面刷新 + if (mlistAdd != null) { + cardAdapter.setData(mlistAdd); + swipeCardsView.notifyDatasetChanged(0); + } + } + /** + * 显示cardsview + */ + private void show() { + if (cardAdapter == null) { + cardAdapter = new CardAdapter(mlistAdd, getActivity()); + swipeCardsView.setAdapter(cardAdapter); + } else { + //if you want to change the UI of SwipeCardsView,you must modify the data first + Log.d(TAG, "获取数据更新后的show: "+curIndex); + cardAdapter.setData(mlistAdd); + if(curIndex<119){ + swipeCardsView.notifyDatasetChanged(curIndex+1);//数据刷新之后不能再显示刷新前的那个数据,因为我们这里用到的只有加载下一页,无其他刷新 + }else{ + swipeCardsView.notifyDatasetChanged(curIndex);//数据刷新之后不能再显示刷新前的那个数据,因为我们这里用到的只有加载下一页,无其他刷新 + } + + } + } + + public void refresh(){ + mlistAdd.clear(); + curIndex = 0; + countIndex = 0; + pageNo = "0"; + getRecommendList(); + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/HotTopicFragment.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/HotTopicFragment.java new file mode 100644 index 0000000000000000000000000000000000000000..063fd9983dd108d57d71eeb2b4a67e2dec3bd800 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/HotTopicFragment.java @@ -0,0 +1,280 @@ +package com.jiuqi.elove.fragment; + +import android.content.Intent; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.View; +import android.widget.RelativeLayout; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.jiuqi.elove.R; +import com.jiuqi.elove.activity.CircleDetailActivity; +import com.jiuqi.elove.activity.OtherPersonCenterActivity; +import com.jiuqi.elove.activity.PlayCircleVideoActivity; +import com.jiuqi.elove.activity.PreviewAvatarActivity; +import com.jiuqi.elove.activity.PreviewImgActivity; +import com.jiuqi.elove.activity.TopicDetailActivity; +import com.jiuqi.elove.adapter.CircleRecentAdapter201801; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.entity.CircleNewModel; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; +import com.jiuqi.elove.widget.pulltorefresh.PullToRefreshLayout; +import com.jiuqi.elove.widget.pulltorefresh.PullableRecylerView; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; + +/** + * Created by jq on 2018/1/9. + */ + +public class HotTopicFragment extends ABaseFragment implements PullToRefreshLayout.OnRefreshListener{ + + @BindView(R.id.rv_book) + PullableRecylerView rv_book; + @BindView(R.id.refresh_view) + PullToRefreshLayout refresh_view; + @BindView(R.id.rlay_nodata) + RelativeLayout rlay_nodata; + + private String userId; + private List mList;//缘圈列表 + private List mAddList;//缘圈列表 + private CircleRecentAdapter201801 adapter; + private boolean isshow = true; + private int page = 1; + private int pagesize = 10; + public static HotTopicFragment instance; + private int clickPosition; + + public static HotTopicFragment newInstance(){ + return new HotTopicFragment(); + } + + @Override + protected void initView() { + instance = this; + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if(instance!=null){ + instance = null; + } + } + + public void refresh(){ + loadFirstPageData(); + } + + @Override + protected int getLayoutResource() { + return R.layout.fragment_topic_layout; + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + getDataFromSp(); + initAdapter(); + } + + /** + * 初始化adapter + */ + private void initAdapter() { + RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity()); + rv_book.setLayoutManager(layoutManager); + adapter = new CircleRecentAdapter201801(getActivity()); + rv_book.setAdapter(adapter); + refresh_view.setOnRefreshListener(this); + mAddList = new ArrayList<>(); + getCircleRecent();//获取缘圈列表 + adapter.setOnItemClickListener(new CircleRecentAdapter201801.OnItemClickListener() { + @Override + public void likeOrNot(CircleNewModel model, int position) {//点赞或者取消点赞 + likeOrNotThisCircle(model,position); + } + + @Override + public void comment(CircleNewModel model,int position) {//评论 + Intent intent = new Intent(getActivity(), CircleDetailActivity.class); + intent.putExtra("circleid",model.getYuanquanid()); + clickPosition = position; + startActivityForResult(intent,0x110); + } + + @Override + public void clickPicOrVideo(List mList, int position) {//查看大图 + Intent intent; + if(mList.size()==1){ + intent = new Intent(getActivity(), PreviewAvatarActivity.class); + intent.putExtra("imageUrl",mList.get(0).getImg()); + }else{ + intent = new Intent(getActivity(), PreviewImgActivity.class); + intent.putExtra("currentItem",String.valueOf(position)); + Bundle bundle = new Bundle(); + String[] imgUrls = new String[mList.size()]; + for(int i=0;i(); + page = 1; + isshow = false; + getCircleRecent(); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/MessageFragment.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/MessageFragment.java new file mode 100644 index 0000000000000000000000000000000000000000..fd816f1786ddd611bdac49b93da246547b89b9b5 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/MessageFragment.java @@ -0,0 +1,236 @@ +package com.jiuqi.elove.fragment; + + +import android.Manifest; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.support.v4.content.ContextCompat; +import android.support.v4.view.ViewPager; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.LinearLayout; +import android.widget.RadioButton; + +import com.hyphenate.EMMessageListener; +import com.hyphenate.chat.EMCmdMessageBody; +import com.hyphenate.chat.EMMessage; +import com.jiuqi.elove.R; +import com.jiuqi.elove.activity.CaptureActivity; +import com.jiuqi.elove.activity.FindPersonConditionActivity; +import com.jiuqi.elove.adapter.CommonFragmentAdapter; +import com.jiuqi.elove.util.EaseHxHelper; +import com.jiuqi.elove.util.JqStrUtil; +import com.umeng.analytics.MobclickAgent; + +import java.util.ArrayList; +import java.util.List; + +/** + * 消息画面 + */ +public class MessageFragment extends Fragment implements View.OnClickListener{ + +// private LinearLayout rootview; +// private MainActivity mainActivity = new MainActivity(); + private RadioButton recentMsg; + private RadioButton connectPerson; + private ViewPager msgViewPager; +// private ImageView findPerson; +// private ImageView img_qrcode; + private LinearLayout ll_qrcode; + private LinearLayout ll_findperson; + private ArrayList fragmentlist; + private ContactPersonFragment mContactPersonFragment; + private RecentMessageFragment conversationListFragment; + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_tab_msg,container,false); + initView(view); + return view; + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + initEvents(); + } + + private void initEvents() { + recentMsg.setOnClickListener(this); + connectPerson.setOnClickListener(this); +// findPerson.setOnClickListener(this); +// img_qrcode.setOnClickListener(this); + ll_qrcode.setOnClickListener(this); + ll_findperson.setOnClickListener(this); + msgViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int i, float v, int i1) { + + } + + @Override + public void onPageSelected(int i) { + switch (i){ + case 0: + MobclickAgent.onEvent(getActivity(),"message1"); + recentMsg.setChecked(true); + connectPerson.setChecked(false); + recentMsg.setTextColor(getResources().getColor(R.color.topbarBackground)); + connectPerson.setTextColor(getResources().getColor(R.color.white)); + break; + case 1: + MobclickAgent.onEvent(getActivity(),"message2"); + connectPerson.setChecked(true); + recentMsg.setChecked(false); + connectPerson.setTextColor(getResources().getColor(R.color.topbarBackground)); + recentMsg.setTextColor(getResources().getColor(R.color.white)); + break; + } + } + + @Override + public void onPageScrollStateChanged(int i) { + + } + }); + } + + private void initView(View view) { +// rootview = (LinearLayout) view.findViewById(R.id.rootview); +// rootview.setPadding(0,0,0,150); + //设置高度为状态栏高度 +// txt_statusBar = (TextView) view.findViewById(R.id.txt_statusBar); +// txt_statusBar.setHeight(JqStrUtil.getStatusHeight(getActivity())); + recentMsg = (RadioButton) view.findViewById(R.id.tv_recent_msg); + connectPerson = (RadioButton) view.findViewById(R.id.tv_person_connect); +// findPerson = (ImageView) view.findViewById(R.id.img_findperson); + ll_qrcode = (LinearLayout) view.findViewById(R.id.ll_qrcode); + ll_findperson = (LinearLayout) view.findViewById(R.id.ll_findperson); + msgViewPager = (ViewPager) view.findViewById(R.id.vPager); +// img_qrcode = (ImageView) view.findViewById(R.id.img_qrcode); + conversationListFragment = new RecentMessageFragment(); + mContactPersonFragment = new ContactPersonFragment(); + fragmentlist = new ArrayList<>(); + fragmentlist.add(conversationListFragment); + fragmentlist.add(mContactPersonFragment); + msgViewPager.setAdapter(new CommonFragmentAdapter(getChildFragmentManager(),fragmentlist)); + msgViewPager.setCurrentItem(0); + recentMsg.setChecked(true); + recentMsg.setTextColor(getResources().getColor(R.color.topbarBackground)); + connectPerson.setTextColor(getResources().getColor(R.color.white)); + } + + @Override + public void onClick(View view) { + switch (view.getId()){ + case R.id.tv_recent_msg: + MobclickAgent.onEvent(getActivity(),"message1"); + msgViewPager.setCurrentItem(0); + recentMsg.setTextColor(getResources().getColor(R.color.topbarBackground)); + connectPerson.setTextColor(getResources().getColor(R.color.white)); + break; + case R.id.tv_person_connect: + MobclickAgent.onEvent(getActivity(),"message2"); + msgViewPager.setCurrentItem(1); + connectPerson.setTextColor(getResources().getColor(R.color.topbarBackground)); + recentMsg.setTextColor(getResources().getColor(R.color.white)); + break; +// case R.id.img_findperson: + case R.id.ll_findperson: + MobclickAgent.onEvent(getActivity(),"message3"); + Intent intent = new Intent(getActivity(),FindPersonConditionActivity.class); + startActivity(intent); + break; +// case R.id.img_qrcode: + case R.id.ll_qrcode: + if(ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.CAMERA)!= PackageManager.PERMISSION_GRANTED){ + requestPermissions(new String[]{Manifest.permission.CAMERA},1); + }else{ + startActivityForResult(new Intent(getActivity(),CaptureActivity.class),0x04); + } + break; + default: + break; + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + switch (requestCode){ + case 1: + if(grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED){ + startActivityForResult(new Intent(getActivity(),CaptureActivity.class),0x04); + }else{ + JqStrUtil.showToast(getActivity(),"请先允许使用相机功能"); + } + break; + default: + break; + } + } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if(requestCode==0x04&&resultCode==getActivity().RESULT_OK){ + Bundle bundle = data.getExtras(); + String result = bundle.getString("result"); + JqStrUtil.showToast(getActivity(),result); + } + } + EMMessageListener messageListener = new EMMessageListener() { + + @Override + public void onMessageReceived(List messages) { + // notify new message + for (EMMessage message : messages) { + EaseHxHelper.getInstance().getNotifier().onNewMsg(message); + } + refreshUIWithMessage(); + } + + @Override + public void onCmdMessageReceived(List messages) { + for (EMMessage message : messages) { + EMCmdMessageBody cmdMsgBody = (EMCmdMessageBody) message.getBody(); + final String action = cmdMsgBody.action();//get the action user defined in command message +// if (action.equals(RedPacketConstant.REFRESH_GROUP_RED_PACKET_ACTION) && message.getChatType() == EMMessage.ChatType.GroupChat) { +// RedPacketUtil.receiveRedPacketAckMessage(message); +// } + } + refreshUIWithMessage(); + } + + @Override + public void onMessageReadAckReceived(List messages) { + } + + @Override + public void onMessageDeliveryAckReceived(List message) { + } + + @Override + public void onMessageChanged(EMMessage message, Object change) {} + }; + + private void refreshUIWithMessage() { + getActivity().runOnUiThread(new Runnable() { + public void run() { + // refresh unread count + + // refresh conversation list + if (conversationListFragment != null) { + conversationListFragment.refresh(); + } + } + + }); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/MessageFragment2_6.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/MessageFragment2_6.java new file mode 100644 index 0000000000000000000000000000000000000000..6900c3443025709ab1c4d510f16328a205436dcf --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/MessageFragment2_6.java @@ -0,0 +1,267 @@ +package com.jiuqi.elove.fragment; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.support.v4.content.LocalBroadcastManager; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.hyphenate.chat.EMClient; +import com.hyphenate.chat.EMConversation; +import com.hyphenate.easeui.EaseConstant; +import com.jiuqi.elove.R; +import com.jiuqi.elove.activity.RecentMsgActivity; +import com.jiuqi.elove.activity.ChatActivity; +import com.jiuqi.elove.activity.MsgSetActivity; +import com.jiuqi.elove.activity.SystemMsgActivity; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.entity.NotifyModel; +import com.jiuqi.elove.util.SpUtils; + +import java.util.ArrayList; +import java.util.List; + +import cn.jpush.android.api.JPushInterface; + +/** + * 2.6版本消息 + * Created by dl on 2017/2/28. + */ +public class MessageFragment2_6 extends Fragment implements View.OnClickListener{ + + /** + * 组件 + */ + private RelativeLayout rl_sysmsg; + private RelativeLayout rl_actmsg; + private RelativeLayout rl_article; + private RelativeLayout rl_talk; + private RelativeLayout rl_service; + private ImageView qiyuan_reddot;//客服提醒 + private ImageView act_reddot;//活动提醒 + private ImageView artical_reddot;//文章提醒 + private ImageView talk_reddot;//聊天提醒 + private ImageView service_reddot;//客服提醒 + /** + * 数据 + */ + private String classify;//1企缘 2活动 3文章 4聊天 5客服 + private List mSysList;//企缘通知,用于从企缘通知进去关闭通知栏消息 + private List mActList; + private List mArticleList; + private Bundle fragmentArgs; + /** + * 工具 + */ + private LocalBroadcastManager broadcastManager; + private BroadcastReceiver broadcastReceiver; + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_tab_msg2_6,null); + initView(view); + initSp(); + updateUi();//根据获取到的内容更新 + registerBroadCastReceiver(); + setEvents(); + return view; + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + initNotifyList(); + fragmentArgs = getArguments(); + NotifyModel model = (NotifyModel) fragmentArgs.getSerializable("message"); + if(model!=null){ + mSysList.addAll(model.getmSysList()); + mActList.addAll(model.getmActList()); + mArticleList.addAll(model.getmArticleList()); + } + } + + private void initNotifyList() { + mSysList = new ArrayList<>(); + mActList = new ArrayList<>(); + mArticleList = new ArrayList<>(); + } + + private void initSp() { + } + + private void initView(View view) { + rl_sysmsg = (RelativeLayout) view.findViewById(R.id.rl_sysmsg); + rl_actmsg = (RelativeLayout) view.findViewById(R.id.rl_actmsg); + rl_article = (RelativeLayout) view.findViewById(R.id.rl_article); + rl_talk = (RelativeLayout) view.findViewById(R.id.rl_talk); + rl_service = (RelativeLayout) view.findViewById(R.id.rl_service); + qiyuan_reddot = (ImageView) view.findViewById(R.id.qiyuan_reddot); + act_reddot = (ImageView) view.findViewById(R.id.act_reddot); + artical_reddot = (ImageView) view.findViewById(R.id.artical_reddot); + talk_reddot = (ImageView) view.findViewById(R.id.talk_reddot); + service_reddot = (ImageView) view.findViewById(R.id.service_reddot); + } + + private void registerBroadCastReceiver(){ + broadcastManager = LocalBroadcastManager.getInstance(getActivity()); + IntentFilter intentFilter = new IntentFilter(); + intentFilter.addAction(Constant.ACTION_NOTIFY_RECEIVED); + intentFilter.addAction(Constant.ACTION_OTHER_UNREADMSG_RECEIVED); + intentFilter.addAction(Constant.ACTION_SERVICE_UNREADMSG_RECEIVED); + broadcastReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if(Constant.ACTION_NOTIFY_RECEIVED.equals(intent.getAction())){ + String flag = intent.getStringExtra(Constant.NOTIFY_TYPE); + if(Constant.NOTIFY_SYS.equals(flag)){ + qiyuan_reddot.setVisibility(View.VISIBLE); + mSysList.add(intent.getIntExtra(JPushInterface.EXTRA_NOTIFICATION_ID,0)); + }else if(Constant.NOTIFY_ACT.equals(flag)){ + act_reddot.setVisibility(View.VISIBLE); + mActList.add(intent.getIntExtra(JPushInterface.EXTRA_NOTIFICATION_ID,0)); + }else if(Constant.NOTIFY_ARTICLE.equals(flag)){ + artical_reddot.setVisibility(View.VISIBLE); + mArticleList.add(intent.getIntExtra(JPushInterface.EXTRA_NOTIFICATION_ID,0)); + } + SpUtils.setBoolean(flag,true); + }else if(Constant.ACTION_OTHER_UNREADMSG_RECEIVED.equals(intent.getAction())){ + talk_reddot.setVisibility(View.VISIBLE); + }else if(Constant.ACTION_SERVICE_UNREADMSG_RECEIVED.equals(intent.getAction())){ + service_reddot.setVisibility(View.VISIBLE); + } + } + }; + broadcastManager.registerReceiver(broadcastReceiver,intentFilter); + } + + public int getUnreadMsgCountTotal() { + int unreadMsgCountTotal = 0; + int chatroomUnreadMsgCount = 0; + unreadMsgCountTotal = EMClient.getInstance().chatManager().getUnreadMsgsCount(); + for(EMConversation conversation:EMClient.getInstance().chatManager().getAllConversations().values()){ + if(conversation.getType() == EMConversation.EMConversationType.ChatRoom) + chatroomUnreadMsgCount=chatroomUnreadMsgCount+conversation.getUnreadMsgCount(); + } + return unreadMsgCountTotal-chatroomUnreadMsgCount; + } + + private void setEvents() { + rl_sysmsg.setOnClickListener(this); + rl_actmsg.setOnClickListener(this); + rl_article.setOnClickListener(this); + rl_talk.setOnClickListener(this); + rl_service.setOnClickListener(this); + } + + @Override + public void onClick(View view) { + switch (view.getId()){ + case R.id.rl_sysmsg: + classify = "1"; + for(int notifyId : mSysList){//如果非点击通知栏通知进入则在此关闭通知栏此类信息 + JPushInterface.clearNotificationById(getActivity(),notifyId); + } + mSysList.clear(); + startSystemMsgActivity(); + break; + case R.id.rl_actmsg: + classify = "2"; + for(int notifyId : mActList){//如果非点击通知栏通知进入则在此关闭通知栏此类信息 + JPushInterface.clearNotificationById(getActivity(),notifyId); + } + mActList.clear(); + startSystemMsgActivity(); + break; + case R.id.rl_article: + classify = "3"; + for(int notifyId : mArticleList){//如果非点击通知栏通知进入则在此关闭通知栏此类信息 + JPushInterface.clearNotificationById(getActivity(),notifyId); + } + mArticleList.clear(); + startSystemMsgActivity(); + break; + case R.id.rl_talk: + Intent recentMsgIntent = new Intent(getActivity(), RecentMsgActivity.class); + startActivity(recentMsgIntent); + break; + case R.id.rl_service: + chatWithServicePerson(); + break; + default: + break; + } + } + + private void startSystemMsgActivity(){ + Intent intent = new Intent(getActivity(), SystemMsgActivity.class); + intent.putExtra("classify",classify); + startActivity(intent); + } + + /** + * 撩客服 = = + */ + private void chatWithServicePerson() { + Intent intent = new Intent(getContext(), ChatActivity.class); + intent.putExtra("chatType", EaseConstant.CHATTYPE_SINGLE);//2.0.2版本加群聊之后做区分 + intent.putExtra("userId", Constant.SERVICE_PERSON.toLowerCase()); + intent.putExtra("nikeName","客服"); + startActivity(intent); + } + + @Override + public void onDestroy() { + super.onDestroy(); + broadcastManager.unregisterReceiver(broadcastReceiver); + } + + @Override + public void onResume() { + super.onResume(); + updateUi(); + } + + private void updateUi() { + boolean sys = SpUtils.getBoolean(Constant.NOTIFY_SYS); + boolean act = SpUtils.getBoolean(Constant.NOTIFY_ACT); + boolean article = SpUtils.getBoolean(Constant.NOTIFY_ARTICLE); +// int talk = SpUtils.getInt(Constant.OTHER_UNREAD_MSG_COUNT); + int talk = getUnreadMsgCountTotal(); + int service = SpUtils.getInt(Constant.SERVICE_UNREAD_MSG_COUNT); + if(sys){//企缘通知 + qiyuan_reddot.setVisibility(View.VISIBLE); + }else{ + qiyuan_reddot.setVisibility(View.GONE); + } + if(act){//活动通知 + act_reddot.setVisibility(View.VISIBLE); + }else{ + act_reddot.setVisibility(View.GONE); + } + if(article){//文章通知 + artical_reddot.setVisibility(View.VISIBLE); + }else{ + artical_reddot.setVisibility(View.GONE); + } + if(talk>0){//聊天通知 + talk_reddot.setVisibility(View.VISIBLE); + }else{ + talk_reddot.setVisibility(View.GONE); + } + if(service>0){//客服 + service_reddot.setVisibility(View.VISIBLE); + }else{ + service_reddot.setVisibility(View.GONE); + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/MyChatFragment.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/MyChatFragment.java new file mode 100644 index 0000000000000000000000000000000000000000..bd64a924a9a38afcc42b3ff10dc3e6d23f104dee --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/MyChatFragment.java @@ -0,0 +1,183 @@ +package com.jiuqi.elove.fragment; + +import android.content.Intent; +import android.os.Bundle; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.PopupWindow; +import android.widget.Toast; + +import com.hyphenate.chat.EMMessage; +import com.hyphenate.easeui.EaseConstant; +import com.hyphenate.easeui.controller.EaseUI; +import com.hyphenate.easeui.ui.EaseChatFragment; +import com.hyphenate.easeui.widget.chatrow.EaseCustomChatRowProvider; +import com.jiuqi.elove.R; +import com.jiuqi.elove.activity.OtherPersonCenterActivity; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.util.SpUtils; + +import java.util.List; + +/** + * + * Created by dl on 2016/7/11. + */ +public class MyChatFragment extends EaseChatFragment implements EaseChatFragment.EaseChatFragmentHelper{ + + private static final String TAG = "MyChatFragment"; + + private static final int REQUEST_CODE_GROUP_DETAIL = 13; + protected String toChatNikeName; + protected String otheravatar; + protected String myId; + protected String myavatar; + protected String myNike; + private String receiveOtherNike; + private String receiveOtherAvatar; + private String receiveId;//获取到对方id进入他人中心时用 + public static MyChatFragment instance; + + /** + * 初始化本app体系中的用户数据 + */ + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + myId = SpUtils.getString(Constant.USER_ID); + myavatar = SpUtils.getString(Constant.AVATAR); + myNike = SpUtils.getString(Constant.NIKE_NAME); + return super.onCreateView(inflater, container, savedInstanceState); + } + + @Override + protected void initView() { + super.initView(); + } + + /** + * 对titlebar做自定义修改 + */ + @Override + protected void setUpView() { + super.setUpView(); + setChatFragmentListener(this);//需要注册此事件 + titleBar.setBackgroundColor(getResources().getColor(R.color.colorPrimary)); + if(chatType == EaseConstant.CHATTYPE_SINGLE){ + titleBar.setTitle(toChatNikeName);//group的名称在父类中进行 + } + + } + + public void refreshGroupTitle(String groupTitle){ + titleBar.setTitle(groupTitle); + } + + /** + *获取从依附的activity中传过来的聊天对象的昵称头像信息 + */ + @Override + public void onActivityCreated(Bundle savedInstanceState) { + fragmentArgs = getArguments(); + toChatNikeName = fragmentArgs.getString("nikename"); + otheravatar = fragmentArgs.getString("avatar"); + instance = this; + super.onActivityCreated(savedInstanceState); + } + + /** + * 发送消息携带头像昵称信息 + * @param message + * 少一个id + */ + @Override + protected void sendMessage(EMMessage message) { + message.setAttribute(Constant.SEND_ID,myId);//群聊时添加的 + message.setAttribute(Constant.SEND_NAME,myNike); + message.setAttribute(Constant.SEND_AVATAR,myavatar); + message.setAttribute(Constant.RECEIVE_NAME,toChatNikeName); + message.setAttribute(Constant.RECEIVE_AVATAR,otheravatar); + super.sendMessage(message); + } + + /** + * 收到消息提取头像昵称信息 + * @param messages + */ + @Override + public void onMessageReceived(List messages) { + super.onMessageReceived(messages); + for (EMMessage message : messages) { + String username = null; + // group message + if (message.getChatType() == EMMessage.ChatType.GroupChat || message.getChatType() == EMMessage.ChatType.ChatRoom) { + username = message.getTo(); + } else { + // single chat message + username = message.getFrom(); + } + receiveOtherNike = message.getStringAttribute(Constant.RECEIVE_NAME,""); + receiveOtherAvatar = message.getStringAttribute(Constant.RECEIVE_AVATAR,""); + receiveId = message.getStringAttribute(Constant.RECEIVE_ID,""); + // if the message is for current conversation + if (username.equals(toChatUsername)) { + messageList.refreshSelectLast(); + EaseUI.getInstance().getNotifier().vibrateAndPlayTone(message); + } else { + EaseUI.getInstance().getNotifier().onNewMsg(message); + } + } + } + + @Override + public void onSetMessageAttributes(EMMessage message) { + + } + + @Override + public void onEnterToChatDetails() { + } + + @Override + public void onAvatarClick(String username) { + if(Constant.SERVICE_PERSON.equalsIgnoreCase(username)){ + return; + } + Intent intent = new Intent(getActivity(), OtherPersonCenterActivity.class); + intent.putExtra("otherid",username.toUpperCase()); + startActivity(intent); + } + + @Override + public void onAvatarLongClick(String username) { + + } + + @Override + public boolean onMessageBubbleClick(EMMessage message) { + return false; + } + + @Override + public void onMessageBubbleLongClick(EMMessage message) { + + } + + @Override + public boolean onExtendMenuItemClick(int itemId, View view) { + return false; + } + + @Override + public EaseCustomChatRowProvider onSetCustomChatRowProvider() { + return null; + } + + + @Override + public void onResume() { + super.onResume(); + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/MyFansFragment.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/MyFansFragment.java new file mode 100644 index 0000000000000000000000000000000000000000..13ff9efdbd75c05dde1d639f60e30c876235bdd4 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/MyFansFragment.java @@ -0,0 +1,166 @@ +package com.jiuqi.elove.fragment; + +import android.content.Intent; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v7.widget.LinearLayoutManager; +import android.view.View; +import android.widget.RelativeLayout; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.hyphenate.easeui.EaseConstant; +import com.jiuqi.elove.R; +import com.jiuqi.elove.activity.ChatActivity; +import com.jiuqi.elove.activity.OtherPersonCenterActivity; +import com.jiuqi.elove.adapter.NewContactAdapter; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.entity.ContactPersonModel; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; +import com.jiuqi.elove.widget.pulltorefresh.PullToRefreshLayout; +import com.jiuqi.elove.widget.pulltorefresh.PullableDownOnlyRecylerView; + +import java.util.List; + +import butterknife.BindView; + +/** + * Created by dl on 2017/11/28. + */ + +public class MyFansFragment extends ABaseFragment implements PullToRefreshLayout.OnRefreshListener{ + + @BindView(R.id.rv_book) + PullableDownOnlyRecylerView rv_book; + @BindView(R.id.refresh_view) + PullToRefreshLayout refresh_view; + @BindView(R.id.rlay_nodata) + RelativeLayout rlay_nodata; + + private String userId; + private List contactList;//联系人列表 + private NewContactAdapter adapter; + private boolean isshow = true; + private String contact_type = Constant.CONTACT_FANS; + + public static MyFansFragment newInstance(){ + return new MyFansFragment(); + } + + @Override + protected void initView() { + + } + + @Override + protected int getLayoutResource() { + return R.layout.fragment_item_book; + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + getDataFromSp(); + setRecyclerView(); + loadData(); + } + + private void setRecyclerView() { + rv_book.setLayoutManager(new LinearLayoutManager(getActivity())); + refresh_view.setOnRefreshListener(this); + } + + /** + * 进入单聊页面 + */ + private void startSingleChat(ContactPersonModel model) { + Intent intent = new Intent(getActivity(), ChatActivity.class); + intent.putExtra("chatType", EaseConstant.CHATTYPE_SINGLE);//2.0.2版本加群聊之后做区分 + intent.putExtra("userId",model.getUserID().toLowerCase()); + intent.putExtra("nikeName",model.getNickname()); + intent.putExtra("avatar",model.getAvatar()); + startActivity(intent); + } + + /** + * 进入他人主页 + * @param model + */ + private void startOtherMainPage(ContactPersonModel model) { + Intent intent = new Intent(getActivity(),OtherPersonCenterActivity.class); + intent.putExtra("otherid",model.getUserID()); + startActivity(intent); + } + + private void getDataFromSp() { + userId = SpUtils.getString(Constant.USER_ID); + } + + private void loadData() { + String url = Constant.COMMON_URL + Interface.GET_CONTACT_PERSON; + JSONObject obj = new JSONObject(); + obj.put("userID",userId); + obj.put("version",Constant.VERSION); + obj.put("type",contact_type); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(getActivity(),isshow,url, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + if(Constant.SUCCESS_CODE.equals(rsCode)){ + rlay_nodata.setVisibility(View.GONE); + refresh_view.setVisibility(View.VISIBLE); + /** + *获取三个列表人的数据结合并转换为JSONObject格式 + */ + String contactString = jsonObject.getString("message"); + contactList = JSON.parseArray(contactString,ContactPersonModel.class); + if(contactList!=null&&!contactList.isEmpty()){ + adapter = new NewContactAdapter(getActivity(),contactList); + rv_book.setAdapter(adapter); + adapter.setListener(new NewContactAdapter.ClickListener() { + @Override + public void avatarClick(ContactPersonModel model) { + startOtherMainPage(model);//进入他人主页 + } + + @Override + public void itemClick(ContactPersonModel model) { + startSingleChat(model);//进入聊天页面 + } + }); + }else{ + rlay_nodata.setVisibility(View.VISIBLE); + refresh_view.setVisibility(View.GONE); + } + refresh_view.refreshFinish(PullToRefreshLayout.SUCCEED); + }else if("122".equals(rsCode)){ + rlay_nodata.setVisibility(View.VISIBLE); + refresh_view.setVisibility(View.GONE); + refresh_view.refreshFinish(PullToRefreshLayout.SUCCEED); + } + } + },null); + } + + + @Override + public void onRefresh(PullToRefreshLayout pullToRefreshLayout) { + // 下拉刷新操作 + isshow = false; + loadData(); + } + + @Override + public void onLoadMore(PullToRefreshLayout pullToRefreshLayout) { + + } + + @Override + public void onDestroy() { + super.onDestroy(); + okHttpUtil.cancelTag(getActivity()); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/MyFocusFragment.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/MyFocusFragment.java new file mode 100644 index 0000000000000000000000000000000000000000..c3c0740d278a1a472e68b82ef50c53636c3f6782 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/MyFocusFragment.java @@ -0,0 +1,167 @@ +package com.jiuqi.elove.fragment; + +import android.content.Intent; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v7.widget.LinearLayoutManager; +import android.view.View; +import android.widget.RelativeLayout; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.hyphenate.easeui.EaseConstant; +import com.jiuqi.elove.R; +import com.jiuqi.elove.activity.ChatActivity; +import com.jiuqi.elove.activity.OtherPersonCenterActivity; +import com.jiuqi.elove.adapter.NewContactAdapter; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.entity.ContactPersonModel; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; +import com.jiuqi.elove.widget.pulltorefresh.PullToRefreshLayout; +import com.jiuqi.elove.widget.pulltorefresh.PullableDownOnlyRecylerView; + +import java.util.List; + +import butterknife.BindView; + +/** + * Created by dl on 2017/11/28. + */ + +public class MyFocusFragment extends ABaseFragment implements PullToRefreshLayout.OnRefreshListener{ + + @BindView(R.id.rv_book) + PullableDownOnlyRecylerView rv_book; + @BindView(R.id.refresh_view) + PullToRefreshLayout refresh_view; + @BindView(R.id.rlay_nodata) + RelativeLayout rlay_nodata; + + private String userId; + private List contactList;//联系人列表 + private NewContactAdapter adapter; + private boolean isshow = true; + private String contact_type = Constant.CONTACT_FOCUS; + + public static MyFocusFragment newInstance(){ + return new MyFocusFragment(); + } + + @Override + protected void initView() { + + } + + @Override + protected int getLayoutResource() { + return R.layout.fragment_item_book; + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + getDataFromSp(); + setRecyclerView(); + loadData(); + } + + private void setRecyclerView() { + rv_book.setLayoutManager(new LinearLayoutManager(getActivity())); + refresh_view.setOnRefreshListener(this); + + } + + /** + * 进入单聊页面 + */ + private void startSingleChat(ContactPersonModel model) { + Intent intent = new Intent(getActivity(), ChatActivity.class); + intent.putExtra("chatType", EaseConstant.CHATTYPE_SINGLE);//2.0.2版本加群聊之后做区分 + intent.putExtra("userId",model.getUserID().toLowerCase()); + intent.putExtra("nikeName",model.getNickname()); + intent.putExtra("avatar",model.getAvatar()); + startActivity(intent); + } + + /** + * 进入他人主页 + * @param model + */ + private void startOtherMainPage(ContactPersonModel model) { + Intent intent = new Intent(getActivity(),OtherPersonCenterActivity.class); + intent.putExtra("otherid",model.getUserID()); + startActivity(intent); + } + + private void getDataFromSp() { + userId = SpUtils.getString(Constant.USER_ID); + } + + private void loadData() { + String url = Constant.COMMON_URL + Interface.GET_CONTACT_PERSON; + JSONObject obj = new JSONObject(); + obj.put("userID",userId); + obj.put("version",Constant.VERSION); + obj.put("type",contact_type); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(getActivity(),isshow,url, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + if(Constant.SUCCESS_CODE.equals(rsCode)){ + rlay_nodata.setVisibility(View.GONE); + refresh_view.setVisibility(View.VISIBLE); + /** + *获取三个列表人的数据结合并转换为JSONObject格式 + */ + String contactString = jsonObject.getString("message"); + contactList = JSON.parseArray(contactString,ContactPersonModel.class); + if(contactList!=null&&!contactList.isEmpty()){ + adapter = new NewContactAdapter(getActivity(),contactList); + rv_book.setAdapter(adapter); + adapter.setListener(new NewContactAdapter.ClickListener() { + @Override + public void avatarClick(ContactPersonModel model) { + startOtherMainPage(model);//进入他人主页 + } + + @Override + public void itemClick(ContactPersonModel model) { + startSingleChat(model);//进入聊天页面 + } + }); + }else{ + rlay_nodata.setVisibility(View.VISIBLE); + refresh_view.setVisibility(View.GONE); + } + refresh_view.refreshFinish(PullToRefreshLayout.SUCCEED); + }else if("122".equals(rsCode)){ + rlay_nodata.setVisibility(View.VISIBLE); + refresh_view.setVisibility(View.GONE); + refresh_view.refreshFinish(PullToRefreshLayout.SUCCEED); + } + } + },null); + } + + + @Override + public void onRefresh(PullToRefreshLayout pullToRefreshLayout) { + // 下拉刷新操作 + isshow = false; + loadData(); + } + + @Override + public void onLoadMore(PullToRefreshLayout pullToRefreshLayout) { + + } + + @Override + public void onDestroy() { + super.onDestroy(); + okHttpUtil.cancelTag(getActivity()); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/MyFriendFragment.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/MyFriendFragment.java new file mode 100644 index 0000000000000000000000000000000000000000..19e71c899bc0210c377099ab842dc66eb82fd055 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/MyFriendFragment.java @@ -0,0 +1,166 @@ +package com.jiuqi.elove.fragment; + +import android.content.Intent; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v7.widget.LinearLayoutManager; +import android.view.View; +import android.widget.RelativeLayout; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.hyphenate.easeui.EaseConstant; +import com.jiuqi.elove.R; +import com.jiuqi.elove.activity.ChatActivity; +import com.jiuqi.elove.activity.OtherPersonCenterActivity; +import com.jiuqi.elove.adapter.NewContactAdapter; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.entity.ContactPersonModel; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; +import com.jiuqi.elove.widget.pulltorefresh.PullToRefreshLayout; +import com.jiuqi.elove.widget.pulltorefresh.PullableDownOnlyRecylerView; + +import java.util.List; + +import butterknife.BindView; + +/** + * Created by dl on 2017/11/28. + */ + +public class MyFriendFragment extends ABaseFragment implements PullToRefreshLayout.OnRefreshListener{ + + @BindView(R.id.rv_book) + PullableDownOnlyRecylerView rv_book; + @BindView(R.id.refresh_view) + PullToRefreshLayout refresh_view; + @BindView(R.id.rlay_nodata) + RelativeLayout rlay_nodata; + + private String userId; + private List contactList;//联系人列表 + private NewContactAdapter adapter; + private boolean isshow = true; + private String contact_type = Constant.CONTACT_FRIEND; + + public static MyFriendFragment newInstance(){ + return new MyFriendFragment(); + } + + @Override + protected void initView() { + + } + + @Override + protected int getLayoutResource() { + return R.layout.fragment_item_book; + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + getDataFromSp(); + setRecyclerView(); + loadData(); + } + + private void setRecyclerView() { + rv_book.setLayoutManager(new LinearLayoutManager(getActivity())); + refresh_view.setOnRefreshListener(this); + } + + /** + * 进入单聊页面 + */ + private void startSingleChat(ContactPersonModel model) { + Intent intent = new Intent(getActivity(), ChatActivity.class); + intent.putExtra("chatType", EaseConstant.CHATTYPE_SINGLE);//2.0.2版本加群聊之后做区分 + intent.putExtra("userId",model.getUserID().toLowerCase()); + intent.putExtra("nikeName",model.getNickname()); + intent.putExtra("avatar",model.getAvatar()); + startActivity(intent); + } + + /** + * 进入他人主页 + * @param model + */ + private void startOtherMainPage(ContactPersonModel model) { + Intent intent = new Intent(getActivity(),OtherPersonCenterActivity.class); + intent.putExtra("otherid",model.getUserID()); + startActivity(intent); + } + + private void getDataFromSp() { + userId = SpUtils.getString(Constant.USER_ID); + } + + private void loadData() { + String url = Constant.COMMON_URL + Interface.GET_CONTACT_PERSON; + JSONObject obj = new JSONObject(); + obj.put("userID",userId); + obj.put("version",Constant.VERSION); + obj.put("type",contact_type); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(getActivity(),isshow,url, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + if(Constant.SUCCESS_CODE.equals(rsCode)){ + rlay_nodata.setVisibility(View.GONE); + refresh_view.setVisibility(View.VISIBLE); + /** + *获取三个列表人的数据结合并转换为JSONObject格式 + */ + String friendlist = jsonObject.getString("message"); + contactList = JSON.parseArray(friendlist,ContactPersonModel.class); + if(contactList!=null&&!contactList.isEmpty()){ + adapter = new NewContactAdapter(getActivity(),contactList); + rv_book.setAdapter(adapter); + adapter.setListener(new NewContactAdapter.ClickListener() { + @Override + public void avatarClick(ContactPersonModel model) { + startOtherMainPage(model);//进入他人主页 + } + + @Override + public void itemClick(ContactPersonModel model) { + startSingleChat(model);//进入聊天页面 + } + }); + }else{ + rlay_nodata.setVisibility(View.VISIBLE); + refresh_view.setVisibility(View.GONE); + } + refresh_view.refreshFinish(PullToRefreshLayout.SUCCEED); + }else if("122".equals(rsCode)){ + rlay_nodata.setVisibility(View.VISIBLE); + refresh_view.setVisibility(View.GONE); + refresh_view.refreshFinish(PullToRefreshLayout.SUCCEED); + } + } + },null); + } + + + @Override + public void onRefresh(PullToRefreshLayout pullToRefreshLayout) { + // 下拉刷新操作 + isshow = false; + loadData(); + } + + @Override + public void onLoadMore(PullToRefreshLayout pullToRefreshLayout) { + + } + + @Override + public void onDestroy() { + super.onDestroy(); + okHttpUtil.cancelTag(getActivity()); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/MyInfoCenterFragment.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/MyInfoCenterFragment.java new file mode 100644 index 0000000000000000000000000000000000000000..c36c2d654c86cd312ddd453256f8a182fb24561c --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/MyInfoCenterFragment.java @@ -0,0 +1,717 @@ +package com.jiuqi.elove.fragment; + +import android.Manifest; +import android.app.Dialog; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.drawable.ColorDrawable; +import android.media.Image; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.provider.MediaStore; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.support.v4.content.ContextCompat; +import android.support.v4.content.FileProvider; +import android.support.v4.graphics.drawable.RoundedBitmapDrawable; +import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory; +import android.text.TextUtils; +import android.util.DisplayMetrics; +import android.util.Log; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.PopupWindow; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.target.BitmapImageViewTarget; +import com.jiuqi.elove.R; +import com.jiuqi.elove.activity.CollectCircleActivity; +import com.jiuqi.elove.activity.ContactListActivity; +import com.jiuqi.elove.activity.CutPictureAty; +import com.jiuqi.elove.activity.LoginActivity; +import com.jiuqi.elove.activity.MyAuthListActivity; +import com.jiuqi.elove.activity.MyCircleActivity; +import com.jiuqi.elove.activity.MyGiftActivity; +import com.jiuqi.elove.activity.MyInfoActivity; +import com.jiuqi.elove.activity.MyInfoActivity2_53; +import com.jiuqi.elove.activity.MyNameCardActivity; +import com.jiuqi.elove.activity.MyRealNameActivity; +import com.jiuqi.elove.activity.MyRedbeanActivity2_6; +import com.jiuqi.elove.activity.MyRelationPersonActivity; +import com.jiuqi.elove.activity.SettingActivity; +import com.jiuqi.elove.adapter.HorizontalListViewAvatarAdapter; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.common.JqBaseActivity; +import com.jiuqi.elove.common.PermissionListener; +import com.jiuqi.elove.entity.ChatPersonModel; +import com.jiuqi.elove.util.CommonUtil; +import com.jiuqi.elove.util.EasyGlide; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; +import com.jiuqi.elove.util.StatusBarUtil; +import com.jiuqi.elove.widget.HorizontalListView; +import com.jiuqi.elove.widget.mediapicker.model.Photo; +import com.jiuqi.elove.widget.mediapicker.util.GalleryFinal; +import com.umeng.analytics.MobclickAgent; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +/** + * 我的画面 + */ +public class MyInfoCenterFragment extends Fragment implements View.OnClickListener{ + + public static final String PROVIDER_IMG = "com.jiuqi.elove.fileprovider"; + private static final String TAG = "MyInfoCenterFragment"; + /** + * 控件 + */ + private LinearLayout ll_rightBtn; + private PopupWindow window; + private RelativeLayout rl_profile; + private RelativeLayout rl_foot; + private RelativeLayout rl_auth; + private RelativeLayout rl_myredbean; + private RelativeLayout rl_mygift;//我的礼物 + private RelativeLayout rl_invite;//邀请好友 + private RelativeLayout rl_black;//我的黑名单 + private RelativeLayout rl_friend; + private TextView myNikeName; + private TextView txt_redbean; + private TextView tv_signin; + private ImageView myheadPhoto; + private ImageView iv_o_authstatus; + private ImageView iv_qiyuan_status; + private LinearLayout ll_user_detail; + private RelativeLayout rl_unlogin; + private TextView tv_login; + private ImageView iv_company_auth; + private LinearLayout ll_rz; + private View top_view; + private RelativeLayout rl_collect; + + /** + * 数据 + */ + private String userid; + private int redbean; + private int audittype;//认证状态.三种方式认证 0不变更的状态1申请认证(过渡状态) + private String avatar; + private String nikeName; + private int kind; + private String completeness; + private String IDCard;//0 未通过实名认证 1通过 + private String signtoday;//0今日未签到 + private Bitmap photo; + private Uri imgUri; + private String youth; + + + /** + * 工具 + */ + private final OkHttpUtil okHttpUtil = OkHttpUtil.getInstance(); + private static final int TAKE_PHOTO = 0X11; + private static final int SELECT_PHOTO = 0x12; + private static final int CLOSE_WINDOW = 0x13; + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View mView = inflater.inflate(R.layout.fragment_tab_myinfocenter,container,false); + initView(mView); + initHeaderViewByUserId(); + return mView; + } + + private void initHeaderViewByUserId() { + userid = SpUtils.getString(Constant.USER_ID); + if(TextUtils.isEmpty(userid)){ + rl_unlogin.setVisibility(View.VISIBLE); + ll_user_detail.setVisibility(View.GONE); + }else{ + rl_unlogin.setVisibility(View.GONE); + ll_user_detail.setVisibility(View.VISIBLE); + getHisInfoAndInit(); + } + } + + /** + * 环信 + */ + private void getHisInfoAndInit() { + String getChatUrl = Constant.COMMON_URL + Interface.CHAT_INFO; + JSONObject obj = new JSONObject(); + obj.put("userID",userid); + obj.put("action","1");//为了解决个人中心可以看自己的头像 + obj.put("version",Constant.VERSION); + String param = JSON.toJSONString(obj); + okHttpUtil.sendJsonStrByPostAsync(getActivity(),false,getChatUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + if(jsonObject==null){ + return; + } + String rsCode = jsonObject.getString("retcode"); + Log.d(TAG, "onResponse: rsCode"+rsCode); + if ("1".equals(rsCode)){ + String result = jsonObject.getString("message"); + Log.d(TAG, "onResponse: message"+result); + ChatPersonModel model = JSON.parseObject(result,ChatPersonModel.class); + saveData2Sp(model); + initDataAndView(); + } + } + },null); + + } + + /** + * 将必要的信息保存到sp中 + * 比如各种认证状态,认证页面用 + */ + private void saveData2Sp(ChatPersonModel model) { + signtoday = model.getSigntoday(); + redbean = model.getBean(); + kind = model.getKind(); + avatar = model.getAvatar(); + nikeName = model.getNickname(); + completeness = model.getCompleteness(); + audittype = model.getAudittype(); + IDCard = model.getRealnametype(); + youth = model.getYouthLeague(); + SpUtils.setString(Constant.AVATAR,avatar); + SpUtils.setString(Constant.NIKE_NAME,nikeName); + SpUtils.setInt(Constant.E_KIND,kind);//单位认证 + SpUtils.setString(Constant.ID_CARD,IDCard);//实名认证 + SpUtils.setString(Constant.YOUTH,youth);//青年之声认证 + SpUtils.setInt(Constant.RED_BEAN,redbean); + SpUtils.setInt(Constant.IF_UP,model.getIfup()); + SpUtils.setInt(Constant.AUDIT_TYPE,audittype); + } + + + private void initDataAndView() { + myNikeName.setText(nikeName); + EasyGlide.getInstance().showImageCircle(avatar,myheadPhoto); + if(Constant.REALNAME_PASS.equals(IDCard)){ + iv_o_authstatus.setImageResource(R.drawable.rz_name_on); + }else{ + iv_o_authstatus.setImageResource(R.drawable.rz_name_un); + } + if(Constant.YOUTH_PASS.equals(youth)){ + iv_qiyuan_status.setImageResource(R.drawable.rz_qiyuan_on); + }else{ + iv_qiyuan_status.setImageResource(R.drawable.rz_qiyuan_un); + } + if(Constant.COMPANY_PASS.equals(kind)){ + iv_company_auth.setImageResource(R.drawable.icon_company_on_else); + }else{ + iv_company_auth.setImageResource(R.drawable.icon_company_un_else); + } + if(Constant.SIGN_NOT_TODAY.equals(signtoday)){ + tv_signin.setText("签到"); + }else{ + tv_signin.setText("已签到"); + } + txt_redbean.setText("红豆:"+String.valueOf(redbean)); + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + initEvents(); + } + + private void initEvents() { + /*注销*/ + ll_rightBtn.setOnClickListener(this); + /*我的资料*/ + rl_profile.setOnClickListener(this); + //我的头像 + myheadPhoto.setOnClickListener(this); + //我的钱包 + rl_myredbean.setOnClickListener(this); + //我的会员 + rl_foot.setOnClickListener(this); + //我的认证 + rl_auth.setOnClickListener(this); + //点击签到 + tv_signin.setOnClickListener(this); + //我的礼物 + rl_mygift.setOnClickListener(this); + //邀请好友 + rl_invite.setOnClickListener(this); + //我的黑名单 + rl_black.setOnClickListener(this); + //我的人脉 + rl_friend.setOnClickListener(this); + //我的认证 + ll_rz.setOnClickListener(this); + //我的收藏 + rl_collect.setOnClickListener(this); + //我的登录 + tv_login.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent loginIntent = new Intent(getActivity(), LoginActivity.class); + startActivity(loginIntent); + } + }); + } + + private void initView(View mView) { + ll_user_detail = (LinearLayout) mView.findViewById(R.id.ll_user_detail); + ll_rightBtn = (LinearLayout) mView.findViewById(R.id.ll_rightBtn); + rl_profile = (RelativeLayout) mView.findViewById(R.id.rl_profile); + rl_foot = (RelativeLayout) mView.findViewById(R.id.rl_foot); + rl_unlogin = (RelativeLayout) mView.findViewById(R.id.rl_unlogin); + rl_auth = (RelativeLayout)mView.findViewById(R.id.rl_auth); + rl_myredbean = (RelativeLayout)mView.findViewById(R.id.rl_myredbean); + rl_mygift = (RelativeLayout)mView.findViewById(R.id.rl_mygift); + rl_invite = (RelativeLayout)mView.findViewById(R.id.rl_invite); + rl_black = (RelativeLayout)mView.findViewById(R.id.rl_black); + rl_friend = (RelativeLayout)mView.findViewById(R.id.rl_friend); + myheadPhoto = (ImageView) mView.findViewById(R.id.iv_headPhoto); + iv_o_authstatus = (ImageView) mView.findViewById(R.id.iv_o_authstatus); + iv_qiyuan_status = (ImageView) mView.findViewById(R.id.iv_qiyuan_status); + myNikeName = (TextView) mView.findViewById(R.id.tv_myNikeName); + txt_redbean = (TextView) mView.findViewById(R.id.txt_redbean); + tv_signin = (TextView) mView.findViewById(R.id.tv_signin); + tv_login = (TextView) mView.findViewById(R.id.tv_login); + iv_company_auth = (ImageView) mView.findViewById(R.id.iv_company_auth); + ll_rz = (LinearLayout) mView.findViewById(R.id.ll_rz); + rl_collect = (RelativeLayout) mView.findViewById(R.id.rl_collect); + top_view = mView.findViewById(R.id.top_view); + top_view.setLayoutParams(new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, StatusBarUtil.intStatusView())); + top_view.setBackgroundColor(ContextCompat.getColor(getActivity(),R.color.colorPrimaryDark)); + } + + @Override + public void onClick(View view) { + if(!JqStrUtil.isLogin()){ + startLoginPage(); + return; + } + switch (view.getId()){ + case R.id.rl_foot://我的足迹 + if(JqStrUtil.isLogin()){ + Intent collectIntent = new Intent(getActivity(),CollectCircleActivity.class); + startActivity(collectIntent); + }else{ + startLoginPage(); + } +// Intent memberIntent = new Intent(getActivity(), MyCircleActivity.class); +// startActivity(memberIntent); + break; + case R.id.rl_auth: + case R.id.ll_rz: +// Intent authListIntent = new Intent(getActivity(), MyRealNameActivity.class); + Intent authListIntent = new Intent(getActivity(), MyAuthListActivity.class); + startActivity(authListIntent); + break; + case R.id.rl_profile: + MobclickAgent.onEvent(getActivity(),"mycore3"); +// Intent intent = new Intent(getActivity(), MyInfoActivity2_53.class); + Intent intent = new Intent(getActivity(), MyInfoActivity.class); + intent.putExtra("lastPage","mycenter"); + startActivity(intent); + break; + case R.id.ll_rightBtn: + MobclickAgent.onEvent(getActivity(),"mycore7"); + Intent authIntent = new Intent(getActivity(), SettingActivity.class); + startActivity(authIntent); + break; + case R.id.iv_headPhoto: +// getPermissionAndUpload(); + Intent avatarIntent = new Intent(getActivity(),MyNameCardActivity.class); + startActivity(avatarIntent); + break; + case R.id.rl_myredbean: + Intent redbeanIntent = new Intent(getActivity(), MyRedbeanActivity2_6.class); + redbeanIntent.putExtra("avatar",avatar); + redbeanIntent.putExtra("nikename",nikeName); + startActivity(redbeanIntent); + break; + case R.id.tv_signin: + signEachDay(); + break; + case R.id.rl_mygift: + Intent giftIntent = new Intent(getActivity(),MyGiftActivity.class); + startActivity(giftIntent); + break; + case R.id.rl_invite: + Intent inviteIntent = new Intent(getActivity(),MyGiftActivity.class); + startActivity(inviteIntent); + break; + case R.id.rl_black: + Intent blackIntent = new Intent(getActivity(),ContactListActivity.class); + blackIntent.putExtra("type",Constant.CONTACT_BLACK); + startActivity(blackIntent); + break; + case R.id.rl_collect: + if(JqStrUtil.isLogin()){ + Intent collectIntent = new Intent(getActivity(),CollectCircleActivity.class); + startActivity(collectIntent); + }else{ + startLoginPage(); + } + break; + case R.id.rl_friend: + if(!JqStrUtil.isLogin()){ + startLoginPage(); + return; + } + Intent friend = new Intent(getActivity(), MyRelationPersonActivity.class); + startActivity(friend); + break; + default: + break; + } + } + + private void startLoginPage() { + Intent intent = new Intent(getActivity(),LoginActivity.class); + startActivity(intent); + } + + /** + * 获取权限,上传头像 + */ + private void getPermissionAndUpload() { + List permissionLists = new ArrayList<>(); + if(ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.CAMERA)!= PackageManager.PERMISSION_GRANTED){ + permissionLists.add(Manifest.permission.CAMERA); + } + if(ContextCompat.checkSelfPermission(getActivity(),Manifest.permission.WRITE_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED){ + permissionLists.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); + } + if(!permissionLists.isEmpty()){ + JqBaseActivity.requestRuntimePermission(permissionLists.toArray(new String[permissionLists.size()]), new PermissionListener() { + @Override + public void onGranted() { + createPopWindow(); + } + + @Override + public void onDenied(List deniedPermission) { + + } + }); + }else{ + createPopWindow(); + } + } + + /** + * 每日签到 + */ + private void signEachDay() { + if("0".equals(signtoday)){ + String signUrl = Constant.COMMON_URL + Interface.SIGN_EACH_DAY; + JSONObject obj = new JSONObject(); + obj.put("userID",userid); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(getActivity(), true, signUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + if("1".equals(rsCode)){ + String result = jsonObject.getString("message"); + JSONObject obj = JSON.parseObject(result); + String redbean = obj.getString("redbeannum"); + //手动更改,防止可以继续签到,并且使ui保持一致 + signtoday = "1"; + tv_signin.setText("已签到"); + createSignSuccessDialog(getActivity(),redbean); + } + } + },null); + }else{ + startMyRedbean(); + } + } + + /** + * 签到成功 + */ + public void createSignSuccessDialog(Context context,String num) { + // 首先得到整个View + View view = LayoutInflater.from(context).inflate( + R.layout.sign_success_layout, null); + // 获取整个布局 + LinearLayout layout = (LinearLayout) view + .findViewById(R.id.dialog_view); + layout.setLayoutParams(getSignSuccessLayout()); + TextView tv_getbean = (TextView) view.findViewById(R.id.tv_getbean); + TextView tv_view = (TextView) view.findViewById(R.id.tv_view); + tv_getbean.setText("+"+num+"元宝"); + final Dialog loadingDialog = new Dialog(context, R.style.loading_sign_success); + // 设置返回键返回 + loadingDialog.setCancelable(true); + //点击空白取消 + loadingDialog.setCanceledOnTouchOutside(true); + loadingDialog.setContentView(layout, getSignSuccessLayout()); + layout.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + loadingDialog.dismiss(); + } + }); + tv_view.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + startMyRedbean(); + loadingDialog.dismiss(); + } + }); + loadingDialog.show(); + } + + private void startMyRedbean(){ + Intent intent = new Intent(getActivity(),MyRedbeanActivity2_6.class); + startActivity(intent); + } + + private LinearLayout.LayoutParams getSignSuccessLayout(){ + Resources resources = getResources(); + DisplayMetrics dm = resources.getDisplayMetrics(); + int width = dm.widthPixels; + int height = dm.heightPixels; + return new LinearLayout.LayoutParams(width*2/3,width*8/9); + } + + /** + * 点击上传头像显示popupwindow + */ + private void createPopWindow() { + LayoutInflater layoutInflater = getActivity().getLayoutInflater(); + View view = layoutInflater.inflate(R.layout.submit_popwindow_layout,null); + window = new PopupWindow(view, WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT); + TextView tv_takeavatar = (TextView) view.findViewById(R.id.tv_takeavatar); + TextView tv_selectavatar = (TextView) view.findViewById(R.id.tv_selectavatar); + TextView tv_cancel = (TextView) view.findViewById(R.id.tv_cancel); + HorizontalListView hlist_avatar = (HorizontalListView) view.findViewById(R.id.hlist_avatar); + LinearLayout ll_blank = (LinearLayout) view.findViewById(R.id.ll_blank); + hlist_avatar.setLayoutParams(getMyLayout()); + tv_takeavatar.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new Thread(){ + @Override + public void run() { + handler.sendEmptyMessageDelayed(TAKE_PHOTO,100); + } + }.start(); + } + }); + tv_selectavatar.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new Thread(){ + @Override + public void run() { + handler.sendEmptyMessageDelayed(SELECT_PHOTO,100); + } + }.start(); + } + }); + tv_cancel.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new Thread(){ + @Override + public void run() { + handler.sendEmptyMessageDelayed(CLOSE_WINDOW,100); + } + }.start(); + } + }); + ll_blank.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new Thread(){ + @Override + public void run() { + handler.sendEmptyMessageDelayed(CLOSE_WINDOW,100); + } + }.start(); + } + }); + HorizontalListViewAvatarAdapter imgAdapter = new HorizontalListViewAvatarAdapter(getActivity(),new int[]{R.drawable.icon_feiren, + R.drawable.icon_zhedang,R.drawable.icon_mohu,R.drawable.icon_baolu,R.drawable.icon_qingxie, + R.drawable.icon_feitou},new String[]{"非人物照","五官遮挡","模糊不清","衣着不当","倾斜颠倒","非头部照"}); + hlist_avatar.setAdapter(imgAdapter); + // 设置popWindow弹出窗体可点击,这句话必须添加,并且是true + window.setFocusable(true); + // 实例化一个ColorDrawable颜色为半透明 + ColorDrawable dw = new ColorDrawable(0xb0000000); + window.setBackgroundDrawable(dw); + // 设置popWindow的显示和消失动画 + window.setAnimationStyle(R.style.mypopwindow_anim_style); + // 在底部显示 + window.showAtLocation(view, Gravity.BOTTOM, 0, 0); + } + + private Handler handler = new Handler(){ + @Override + public void handleMessage(Message msg) { + switch (msg.what){ + case TAKE_PHOTO: + startTookPicture(); + if(window.isShowing()){ + window.dismiss(); + } + break; + case SELECT_PHOTO: + openAlbum2Cut(); + if(window.isShowing()){ + window.dismiss(); + } + break; + case CLOSE_WINDOW: + if(window.isShowing()){ + window.dismiss(); + } + break; + default: + break; + } + } + }; + + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + if(resultCode==android.support.v4.app.FragmentActivity.RESULT_OK){ + switch (requestCode){ + case TAKE_PHOTO: + startCutImg(getActivity().getExternalCacheDir()+Constant.AVATAR_IMG_NAME); + break; + case 0x06: + if (data != null) { + String dirPath = data.getStringExtra("path"); + photo = BitmapFactory.decodeFile(dirPath); + uploadPerPicMethod();//裁剪成功后,重新再最后一次调用接口成功回调中调用刷新页面接口 + } + break; + } + + } + } + + /** + * 拍照 + */ + private void startTookPicture() {//拍照 + File avatarFile = new File(getActivity().getExternalCacheDir() + Constant.AVATAR_IMG_NAME); + try { + avatarFile.createNewFile(); + } catch (IOException e) { + e.printStackTrace(); + } + if (Build.VERSION.SDK_INT >= 24) { + imgUri = FileProvider.getUriForFile(getActivity(), PROVIDER_IMG, avatarFile); + } else { + imgUri = Uri.fromFile(avatarFile); + } + Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); + intent.putExtra(MediaStore.EXTRA_OUTPUT, imgUri); + startActivityForResult(intent, TAKE_PHOTO); + } + + + private void openAlbum2Cut() {//打开相册 + GalleryFinal.selectMedias(getActivity(), GalleryFinal.TYPE_IMAGE,1, new GalleryFinal.OnSelectMediaListener() { + @Override + public void onSelected(ArrayList photoArrayList) { + String path = photoArrayList.get(0).getPath(); + startCutImg(path); + } + }); + } + + private void startCutImg(String path){ + Intent intent = new Intent(getActivity(), CutPictureAty.class); + intent.putExtra("path", path); + startActivityForResult(intent, 0x06); + } + + + /** + * 上传图片的方法入口 + */ + private void uploadPerPicMethod() { + String urlserver = Constant.COMMON_URL + Interface.UPLOAD_PIC; + String base64file = CommonUtil.bitmap2StrByBase64(photo,80); + JSONObject obj = new JSONObject(); + obj.put("userid",userid); + obj.put("version",Constant.VERSION); + obj.put("file",base64file); + String param = obj.toJSONString(); + Log.d(TAG, "uploadPerPicMethod: "+param); + okHttpUtil.sendJsonStrByPostAsync(getActivity(), true, urlserver, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + String message = jsonObject.getString("message"); + JSONObject obj = JSON.parseObject(message); + String avatar = obj.getString("faceimage"); + EasyGlide.getInstance().showImageCircle(avatar,myheadPhoto); + } + },null); + } + + + @Override + public void onResume() { + super.onResume(); + initHeaderViewByUserId(); + } + + @Override + public void onHiddenChanged(boolean hidden) { + super.onHiddenChanged(hidden); + if(!hidden){ + initHeaderViewByUserId(); + } + } + + private LinearLayout.LayoutParams getMyLayout(){ + Resources resources = getResources(); + DisplayMetrics dm = resources.getDisplayMetrics(); + int width = dm.widthPixels; + LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(width,(width-14)/6); + layoutParams.setMargins(0,CommonUtil.dip2px(getActivity(),20),0,CommonUtil.dip2px(getActivity(),20)); + return layoutParams; + } + + @Override + public void onDestroy() { + super.onDestroy(); + okHttpUtil.cancelTag(getActivity()); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/NewTopicFragment.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/NewTopicFragment.java new file mode 100644 index 0000000000000000000000000000000000000000..58e15b5c5d73aa6da93000ac46eba0f935e796cc --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/NewTopicFragment.java @@ -0,0 +1,281 @@ +package com.jiuqi.elove.fragment; + +import android.content.Intent; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.View; +import android.widget.RelativeLayout; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.jiuqi.elove.R; +import com.jiuqi.elove.activity.CircleDetailActivity; +import com.jiuqi.elove.activity.OtherPersonCenterActivity; +import com.jiuqi.elove.activity.PlayCircleVideoActivity; +import com.jiuqi.elove.activity.PreviewAvatarActivity; +import com.jiuqi.elove.activity.PreviewImgActivity; +import com.jiuqi.elove.activity.TopicDetailActivity; +import com.jiuqi.elove.adapter.CircleRecentAdapter201801; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.entity.CircleNewModel; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; +import com.jiuqi.elove.widget.pulltorefresh.PullToRefreshLayout; +import com.jiuqi.elove.widget.pulltorefresh.PullableRecylerView; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; + +/** + * Created by jq on 2018/1/9. + */ + +public class NewTopicFragment extends ABaseFragment implements PullToRefreshLayout.OnRefreshListener{ + + @BindView(R.id.rv_book) + PullableRecylerView rv_book; + @BindView(R.id.refresh_view) + PullToRefreshLayout refresh_view; + @BindView(R.id.rlay_nodata) + RelativeLayout rlay_nodata; + + private String userId; + private List mList;//缘圈列表 + private List mAddList;//缘圈列表 + private CircleRecentAdapter201801 adapter; + private boolean isshow = true; + private int page = 1; + private int pagesize = 10; + public static NewTopicFragment instance; + private int clickPosition; + + public static NewTopicFragment newInstance(){ + return new NewTopicFragment(); + } + + @Override + protected void initView() { + instance = this; + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if(instance!=null){ + instance = null; + } + } + + public void refresh(){ + loadFirstPageData(); + } + + @Override + protected int getLayoutResource() { + return R.layout.fragment_topic_layout; + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + getDataFromSp(); + initAdapter(); + } + + /** + * 初始化adapter + */ + private void initAdapter() { + RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity()); + rv_book.setLayoutManager(layoutManager); + adapter = new CircleRecentAdapter201801(getActivity()); + rv_book.setAdapter(adapter); + refresh_view.setOnRefreshListener(this); + mAddList = new ArrayList<>(); + getCircleRecent();//获取缘圈列表 + adapter.setOnItemClickListener(new CircleRecentAdapter201801.OnItemClickListener() { + @Override + public void likeOrNot(CircleNewModel model, int position) {//点赞或者取消点赞 + likeOrNotThisCircle(model,position); + } + + @Override + public void comment(CircleNewModel model,int position) {//评论 + Intent intent = new Intent(getActivity(), CircleDetailActivity.class); + intent.putExtra("circleid",model.getYuanquanid()); + clickPosition = position; + startActivityForResult(intent,0x110); + } + + @Override + public void clickPicOrVideo(List mList, int position) {//查看大图 + Intent intent; + if(mList.size()==1){ + intent = new Intent(getActivity(), PreviewAvatarActivity.class); + intent.putExtra("imageUrl",mList.get(0).getImg()); + }else{ + intent = new Intent(getActivity(), PreviewImgActivity.class); + intent.putExtra("currentItem",String.valueOf(position)); + Bundle bundle = new Bundle(); + String[] imgUrls = new String[mList.size()]; + for(int i=0;i(); + page = 1; + isshow = false; + getCircleRecent(); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/QaFragment.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/QaFragment.java new file mode 100644 index 0000000000000000000000000000000000000000..d674279ee183e0891776f7214c03173007b6557a --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/QaFragment.java @@ -0,0 +1,202 @@ +package com.jiuqi.elove.fragment; + +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.ListView; +import android.widget.RelativeLayout; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.jiuqi.elove.R; +import com.jiuqi.elove.activity.QaDetailActivity; +import com.jiuqi.elove.adapter.QaAdapter; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.entity.ChoicenessAndDetailModel; +import com.jiuqi.elove.entity.QaAndDetailModel; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.widget.pulltorefresh.PullToRefreshLayout; + +import java.util.ArrayList; +import java.util.List; + +/** + * + * Created by dl on 2017/1/4. + */ +public class QaFragment extends Fragment implements PullToRefreshLayout.OnRefreshListener{ + + + private String userId; + + /** + * 个人活动列表的list以及适配 + */ + private List qaList; + private List qaAddList; + private QaAdapter adapter; + private int modifyposition; + /** + * 上拉加载下拉刷新 + */ + private PullToRefreshLayout qaRefreshView; + private ListView qaListView; + private RelativeLayout rlay_nodata; + + private int pagesize = 10;//每页的条数 + private int pageindex = 1;//起始页为0 + + private final OkHttpUtil okHttpUtil = OkHttpUtil.getInstance(); + public static QaFragment instance; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + instance = this; + View view = inflater.inflate(R.layout.fragment_qa_layout, container, false); + initView(view); + return view; + } + + private void initView(View view) { + rlay_nodata = (RelativeLayout) view.findViewById(R.id.rlay_nodata); + qaRefreshView = (PullToRefreshLayout) view.findViewById(R.id.qaRefreshView); + qaListView = (ListView) view.findViewById(R.id.qaListView); + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + getDataFromSp(); + adapter = new QaAdapter(getActivity()); + qaListView.setAdapter(adapter); + qaAddList = new ArrayList<>(); + pageindex = 1;//页码从零开始 + getQaList(); + initEvents();//上拉加载下拉刷新事件 + } + + private void getDataFromSp(){ + SharedPreferences sp = getActivity().getSharedPreferences("elove",getActivity().MODE_PRIVATE); + userId = sp.getString("userid",""); + } + + private void getQaList() { + String qaListUrl = Constant.COMMON_URL + Interface.QA_LIST; + JSONObject obj = new JSONObject(); + obj.put("userid",userId); + obj.put("pageindex",pageindex); + obj.put("pagesize",pagesize); + obj.put("version",Constant.VERSION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(getActivity(), false, qaListUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + String explanation = jsonObject.getString("explanation"); + if("1".equals(rsCode)){ + String result = jsonObject.getString("resolvelist"); + qaList = JSON.parseArray(result,QaAndDetailModel.class); + qaAddList.addAll(qaList); + if(pageindex==1&&qaAddList.isEmpty()&&qaList.isEmpty()){ + rlay_nodata.setVisibility(View.VISIBLE); + }else if(!qaList.isEmpty()){ + rlay_nodata.setVisibility(View.GONE); + adapter.updateListView(qaAddList); + if(1==pageindex){//第一页且有数据为刷新 + qaRefreshView.refreshFinish(PullToRefreshLayout.SUCCEED); + }else{//非第一页且有数据为加载,加载成功不必悬停 + qaRefreshView.refreshFinish(PullToRefreshLayout.SUCCEED); + } + }else if(qaList.isEmpty()){ + qaRefreshView.loadmoreFinish(PullToRefreshLayout.SUC_NODATA); + } + }else{ + JqStrUtil.showToast(getActivity(),explanation); + } + } + },null); + } + + private void initEvents() { + qaRefreshView.setOnRefreshListener(this); + qaListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView adapterView, View view, int position, long l) { + if(qaAddList.size()<=0){ + return; + } + modifyposition = position; + QaAndDetailModel model = qaAddList.get(position); + Intent intent = new Intent(getActivity(), QaDetailActivity.class); + intent.putExtra("id",model.getResolveid()); + intent.putExtra("preflag","qafragment"); + intent.putExtra("model",model); + getRootFragment().startActivityForResult(intent,0x02); + } + }); + } + + /** + * 得到根Fragment + * + * @return + */ + private Fragment getRootFragment() { + Fragment fragment = getParentFragment(); + while (fragment.getParentFragment() != null) { + fragment = fragment.getParentFragment(); + } + return fragment; + + } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if(0x02==requestCode&&0x11==resultCode){ + QaAndDetailModel model = (QaAndDetailModel) data.getSerializableExtra("newmodel"); + if(model!=null){ + qaAddList.remove(modifyposition); + qaAddList.add(modifyposition,model); + adapter.updateListView(qaAddList); + } + } + } + + @Override + public void onRefresh(PullToRefreshLayout pullToRefreshLayout) { + // 下拉刷新操作 + qaAddList = new ArrayList<>(); + pageindex = 1; + getQaList(); + } + + @Override + public void onLoadMore(PullToRefreshLayout pullToRefreshLayout) { + ++pageindex; + getQaList(); + } + + public void refresh(){ + // 下拉刷新操作 + qaAddList = new ArrayList<>(); + pageindex = 1; + getQaList(); + } + + @Override + public void onDestroy() { + super.onDestroy(); + if(instance!=null){ + instance=null; + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/ReceiveGiftFragment.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/ReceiveGiftFragment.java new file mode 100644 index 0000000000000000000000000000000000000000..c49cfebcf42dd15ed14e385fce91e1ff132268b0 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/ReceiveGiftFragment.java @@ -0,0 +1,146 @@ +package com.jiuqi.elove.fragment; + +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.support.v7.widget.GridLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.RelativeLayout; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.jiuqi.elove.R; +import com.jiuqi.elove.activity.GiftDetailListActivity; +import com.jiuqi.elove.adapter.ReceiveGiftAdapter; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.entity.GiftModel; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; + +import java.util.ArrayList; +import java.util.List; + +/** + * 收到的礼物 + * Created by dl on 2017/3/23. + */ +public class ReceiveGiftFragment extends Fragment{ + + /** + * 控件 + */ + private RecyclerView lv_gift; + private RelativeLayout rlay_nodata; + + /** + * 数据 + */ + private String userId; + private List giftList; + private List giftAddList; + + /** + * 工具 + */ + private ReceiveGiftAdapter adapter; + private OkHttpUtil okHttpUtil = OkHttpUtil.getInstance(); + private Boolean isshow = true; + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.gift_receive_layout,container,false); + initView(view); + return view; + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + getDataFromSp();//从sp中获取需要的数据 + setLayoutAndAdapter();//给recyclerview设置layoutmanager和adapter + retrieveDataAndSet();//初始化数据容器,获取服务器数据并进行设置 + setEvents(); + } + + /** + * 初始化控件 + * @param view 上下文view + */ + private void initView(View view) { + lv_gift = (RecyclerView) view.findViewById(R.id.lv_gift); + rlay_nodata = (RelativeLayout) view.findViewById(R.id.rlay_nodata); + } + + private void getDataFromSp() { + userId = SpUtils.getString(Constant.USER_ID); + } + + private void setLayoutAndAdapter() { + //创建manager并进行设置 + GridLayoutManager manager = new GridLayoutManager(getActivity(),2); + manager.setAutoMeasureEnabled(true); + //给recyclerview设置manager,并通过自定义给其设置间距 + lv_gift.setLayoutManager(manager); +// lv_gift.addItemDecoration(new GridSpacingItemDecoration(2,18,false)); + //创建adapter,并设置 + adapter = new ReceiveGiftAdapter(getActivity()); + lv_gift.setAdapter(adapter); + } + + private void retrieveDataAndSet() { + giftAddList = new ArrayList<>(); + getReceiveGiftList();//从服务器获取数据并进行设置 +// initData(); + } + + private void setEvents() { + adapter.setOnItemClickListener(new ReceiveGiftAdapter.OnRecyclerViewItemClickListener() { + @Override + public void onItemClick(int position) { + if(giftAddList.size()<=0){ + return; + } + GiftModel model = giftAddList.get(position); + Intent intent = new Intent(getActivity(),GiftDetailListActivity.class); + intent.putExtra("name",model.getName()); + intent.putExtra("action",Constant.RECEIVE_ACTION); + startActivity(intent); + } + }); + } + + private void getReceiveGiftList() { + String receivegiftUrl = Constant.COMMON_URL + Interface.MY_GIFT; + JSONObject obj = new JSONObject(); + obj.put("userid",userId); + obj.put("version",Constant.VERSION); + obj.put("action",Constant.RECEIVE_ACTION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(getActivity(), isshow, receivegiftUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + if("1".equals(rsCode)){ + String result = jsonObject.getString("message"); + giftList = JSONArray.parseArray(result,GiftModel.class); + if(giftList!=null&&!giftList.isEmpty()){ + rlay_nodata.setVisibility(View.GONE); + giftAddList.addAll(giftList); + adapter.updateRecylerView(giftAddList); + }else{ + rlay_nodata.setVisibility(View.VISIBLE); + } + } + } + },null); + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/RecentMessageFragment.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/RecentMessageFragment.java new file mode 100644 index 0000000000000000000000000000000000000000..6efccfe5e51ef0db1dd2b0b2d64ba9b784c06501 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/RecentMessageFragment.java @@ -0,0 +1,220 @@ +package com.jiuqi.elove.fragment; + +import android.app.AlertDialog; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.support.v4.content.LocalBroadcastManager; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.widget.AdapterView; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; + +import com.hyphenate.chat.EMClient; +import com.hyphenate.chat.EMConversation; +import com.hyphenate.chat.EMMessage; +import com.hyphenate.easeui.EaseConstant; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.activity.ChatActivity; +import com.jiuqi.elove.activity.MainActivity; +import com.jiuqi.elove.activity.SystemMsgActivity; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.util.EaseHxHelper; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.SpUtils; +import com.jiuqi.elove.widget.hx_widget.EaseConversationList; +import com.jiuqi.elove.widget.hx_widget.EaseConversationListFragment; + +import java.util.Map; + + +/** + * + * Created by dl on 2016/8/16. + */ +public class RecentMessageFragment extends EaseConversationListFragment { + + private View view; + private String avatar; + private String nikename; + private RelativeLayout rlay_nodata; + public static RecentMessageFragment instance; + private final static int SYS_MORE_GROUPDATA = 10000; + private final static int SYS_DEL_GROUPDATA = 10001; + + private LinearLayout del_conversation; + private LinearLayout cancel_del_conversation; + + /** + * 工具 + */ + private LocalBroadcastManager broadcastManager; + private BroadcastReceiver broadcastReceiver; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + view = inflater.inflate(R.layout.recentmsg_fragment_layout, container, false); + return view; + } + + @Override + public void setUserVisibleHint(boolean isVisibleToUser) { + super.setUserVisibleHint(isVisibleToUser); + if (isVisibleToUser) { + //群组环信推送的群组消息 + if(EaseHxHelper.unreadGroupMsg!=0){ + handler.sendEmptyMessage(SYS_MORE_GROUPDATA); + }else if(EaseHxHelper.unreadGroupMsg==0){ + handler.sendEmptyMessage(SYS_DEL_GROUPDATA); + } + } else { + //相当于Fragment的onPause + } + } + + private void registerBroadCastReceiver(){ + broadcastManager = LocalBroadcastManager.getInstance(getActivity()); + IntentFilter intentFilter = new IntentFilter(); + intentFilter.addAction(Constant.ACTION_OTHER_UNREADMSG_RECEIVED); + broadcastReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + refresh(); + } + }; + broadcastManager.registerReceiver(broadcastReceiver,intentFilter); + } + @Override + protected void initView() { + super.initView(); + rlay_nodata = (RelativeLayout) view.findViewById(R.id.rlay_nodata); + conversationListView = (EaseConversationList) view.findViewById(R.id.list); + conversationListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView adapterView, View view, int i, long l) { + final EMConversation conversation = conversationList.get(i); + if(conversation.getType() == EMConversation.EMConversationType.GroupChat){ + // TODO: 2017/12/6 + }else{ + handleSingleConversation(conversation);//可能走环信,也可能走推送页面 + } + } + }); + + //增加长按删除方法 + conversationListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { + @Override + public boolean onItemLongClick(AdapterView adapterView, View view, int i, long l) { + final EMConversation conversation = conversationList.get(i); + EMMessage lastMessage = conversation.getLastMessage(); + String type = lastMessage.getStringAttribute("type",""); + if(TextUtils.isEmpty(type)){ + final AlertDialog dialog = new AlertDialog.Builder(getActivity()).create(); + dialog.show(); + Window window = dialog.getWindow(); + window.setContentView(R.layout.longclick_choice); + del_conversation = (LinearLayout) window.findViewById(R.id.del_conversation); + cancel_del_conversation = (LinearLayout) window.findViewById(R.id.cancel_del_conversation); + del_conversation.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + EMClient.getInstance().chatManager().deleteConversation(conversation.getUserName(),true); + dialog.dismiss(); + refresh(); + if(MainActivity.instance!=null){ + MainActivity.instance.updateUnreadLabel(); + } + } + }); + cancel_del_conversation.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + dialog.dismiss(); + } + }); + } + return true; + } + }); + } + + private void handleSingleConversation(EMConversation conversation) { + EMMessage lastMessage = conversation.getLastMessage(); + String type = lastMessage.getStringAttribute("type",""); + if(TextUtils.isEmpty(type)){ + startSingleChat(conversation); + }else{ + startHxPushActivity(conversation); + } + } + + /** + * 进入推送页面 + * @param conversation + */ + private void startHxPushActivity(EMConversation conversation) { + if (conversation.getAllMsgCount() != 0) { + Intent intent = new Intent(getActivity(), SystemMsgActivity.class); + intent.putExtra("conversation",conversation.getUserName()); + startActivity(intent); + } + } + + private void startSingleChat(EMConversation conversation) { + if (conversation.getAllMsgCount() != 0) { + EMMessage lastMessage = conversation.getLastMessage(); + String nikename = ""; + String avatar = ""; + if (lastMessage.direct() == EMMessage.Direct.SEND) {//最后一条信息为发送出去的消息 + avatar = lastMessage.getStringAttribute(Constant.RECEIVE_AVATAR,""); + nikename = lastMessage.getStringAttribute(Constant.RECEIVE_NAME,""); + } else {//最后一条信息为收到的信息 + avatar = lastMessage.getStringAttribute(Constant.SEND_AVATAR,""); + nikename = lastMessage.getStringAttribute(Constant.SEND_NAME,""); + } + Intent intent = new Intent(getActivity(), ChatActivity.class); + intent.putExtra("nikeName",nikename); + intent.putExtra(Constant.AVATAR,avatar); + intent.putExtra("userId",conversation.getUserName()); + intent.putExtra(EaseConstant.EXTRA_CHAT_TYPE,EaseConstant.CHATTYPE_SINGLE); + startActivity(intent); + } + } + + @Override + protected void setUpView() { + super.setUpView(); + if(conversationList==null||conversationList.isEmpty()){ + rlay_nodata.setVisibility(View.VISIBLE); + }else{ + rlay_nodata.setVisibility(View.GONE); + } + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + //2.0.2版本 + registerBroadCastReceiver(); + instance = this; + } + + + + @Override + public void onDestroy() { + super.onDestroy(); + if(instance!=null){ + instance = null; + } + broadcastManager.unregisterReceiver(broadcastReceiver); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/SayloveFragment.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/SayloveFragment.java new file mode 100644 index 0000000000000000000000000000000000000000..62cbdbde15ce642c261ee12060b141990b3cb75d --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/SayloveFragment.java @@ -0,0 +1,171 @@ +package com.jiuqi.elove.fragment; + + +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.support.v4.view.ViewPager; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.LinearLayout; +import android.widget.RadioButton; +import com.jiuqi.elove.R; +import com.jiuqi.elove.activity.PutQuestionActivity; +import com.jiuqi.elove.adapter.CommonFragmentAdapter; + +import java.util.ArrayList; + +/** + * 社区画面 + */ +public class SayloveFragment extends Fragment implements View.OnClickListener{ + /** + * 顶部菜单栏 + */ + private RadioButton tv_choiceness; + private RadioButton tv_qa; + private LinearLayout ll_qa_publish; + private ViewPager actVpager; + private ArrayList fragmentlist; + private ChoicenessFragment mChoicenessFragment; + private QaFragment mQaFragment; + + + private String userid; + private String userrole; + //点击选择城市等之前的页面标示,回来时根据此标示显示对应的fragment + private String prePageTag = "eact"; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_tab_saylove,container,false); + SharedPreferences sp = getActivity().getSharedPreferences("elove", Context.MODE_PRIVATE); + userid = sp.getString("userid",""); + userrole = sp.getString("userrole",""); + initView(view); + addFragment(); + return view; + } + + private void addFragment() { + fragmentlist = new ArrayList<>(); + mChoicenessFragment = new ChoicenessFragment(); + mQaFragment = new QaFragment(); + fragmentlist.add(mChoicenessFragment); + fragmentlist.add(mQaFragment); + actVpager.setAdapter(new CommonFragmentAdapter(getChildFragmentManager(),fragmentlist)); + if("eact".equals(prePageTag)){ + ll_qa_publish.setVisibility(View.GONE); + tv_choiceness.setTextColor(getResources().getColor(R.color.topbarBackground)); + tv_qa.setTextColor(getResources().getColor(R.color.white)); + actVpager.setCurrentItem(0); + }else if("pact".equals(prePageTag)){ + if(!"1".equals(userrole)){ + ll_qa_publish.setVisibility(View.VISIBLE); + }else{ + ll_qa_publish.setVisibility(View.GONE); + } + tv_qa.setTextColor(getResources().getColor(R.color.topbarBackground)); + tv_choiceness.setTextColor(getResources().getColor(R.color.white)); + actVpager.setCurrentItem(1); + } + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + initEvents(); + } + + private void initEvents() { + tv_choiceness.setOnClickListener(this); + tv_qa.setOnClickListener(this); + ll_qa_publish.setOnClickListener(this); + actVpager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int i, float v, int i1) { + + } + + @Override + public void onPageSelected(int i) { + switch (i){ + case 0: + prePageTag = "eact"; + tv_choiceness.setChecked(true); + tv_qa.setChecked(false); + tv_choiceness.setTextColor(getResources().getColor(R.color.topbarBackground)); + tv_qa.setTextColor(getResources().getColor(R.color.white)); + actVpager.setCurrentItem(0); + ll_qa_publish.setVisibility(View.GONE); + break; + case 1: + prePageTag = "pact"; + tv_qa.setChecked(true); + tv_choiceness.setChecked(false); + tv_qa.setTextColor(getResources().getColor(R.color.topbarBackground)); + tv_choiceness.setTextColor(getResources().getColor(R.color.white)); + if(!"1".equals(userrole)){ + ll_qa_publish.setVisibility(View.VISIBLE); + }else{ + ll_qa_publish.setVisibility(View.GONE); + } + actVpager.setCurrentItem(1); + break; + } + } + + @Override + public void onPageScrollStateChanged(int i) { + + } + }); + } + + private void initView(View view) { + tv_choiceness = (RadioButton) view.findViewById(R.id.tv_choiceness); + tv_qa = (RadioButton) view.findViewById(R.id.tv_qa); + actVpager = (ViewPager) view.findViewById(R.id.actVpager); +// img_question_publish = (ImageView) view.findViewById(R.id.img_question_publish); + ll_qa_publish = (LinearLayout) view.findViewById(R.id.ll_qa_publish); + //默认设置企业活动 + prePageTag = "eact"; + tv_choiceness.setChecked(true); + tv_choiceness.setTextColor(getResources().getColor(R.color.topbarBackground)); + tv_qa.setTextColor(getResources().getColor(R.color.white)); + } + + @Override + public void onClick(View view) { + switch (view.getId()){ + case R.id.tv_choiceness: + prePageTag = "eact"; + ll_qa_publish.setVisibility(View.GONE); + tv_choiceness.setTextColor(getResources().getColor(R.color.topbarBackground)); + tv_qa.setTextColor(getResources().getColor(R.color.white)); + actVpager.setCurrentItem(0); + break; + case R.id.tv_qa: + prePageTag = "pact"; + if(!"1".equals(userrole)){ + ll_qa_publish.setVisibility(View.VISIBLE); + }else{ + ll_qa_publish.setVisibility(View.GONE); + } + tv_qa.setTextColor(getResources().getColor(R.color.topbarBackground)); + tv_choiceness.setTextColor(getResources().getColor(R.color.white)); + actVpager.setCurrentItem(1); + break; + case R.id.ll_qa_publish: + Intent intent = new Intent(getActivity(),PutQuestionActivity.class); + startActivity(intent); + break; + default: + break; + } + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/SayloveFragment255.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/SayloveFragment255.java new file mode 100644 index 0000000000000000000000000000000000000000..47b39a7c4e92cb7b60fe5bd3f341c43eec7d2044 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/SayloveFragment255.java @@ -0,0 +1,143 @@ +package com.jiuqi.elove.fragment; + +import android.content.Intent; +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.support.v4.view.ViewPager; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.LinearLayout; +import android.widget.RadioButton; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.activity.NewsDetailActivity; +import com.jiuqi.elove.activity.PutRecentActivity; +import com.jiuqi.elove.adapter.CommonFragmentAdapter; +import com.stonesun.newssdk.NewsAgent; + +import java.util.ArrayList; + +/** + * + * Created by dl on 2017/5/4. + */ +public class SayloveFragment255 extends Fragment implements View.OnClickListener{ + /** + * 顶部菜单栏 + */ + private RadioButton tv_circle; + private RadioButton tv_article; + private LinearLayout ll_qa_publish; + private ViewPager actVpager; + + private Fragment mEmotionFragment; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_tab_saylove255,container,false); + initView(view); + addFragment(); + return view; + } + + private void addFragment() { + ArrayList fragmentlist = new ArrayList<>(); +// ChoicenessFragment mChoicenessFragment = new ChoicenessFragment(); + FriendCircleFragment mFriendCircleFragment = new FriendCircleFragment(); + if(mEmotionFragment ==null) { + NewsAgent.setContentViewActivity(new NewsDetailActivity(), "重写的详情页"); + NewsAgent.createDefaultRecomFragment("自定义推荐", "SPOTS-82647", "重写的详情页"); + mEmotionFragment = NewsAgent.getDefaultRecomFragment("自定义推荐"); + } + fragmentlist.add(mFriendCircleFragment); + fragmentlist.add(mEmotionFragment); + actVpager.setAdapter(new CommonFragmentAdapter(getChildFragmentManager(),fragmentlist)); + changePage2Circle();//默认为缘圈 + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + initEvents(); + } + + private void initEvents() { + tv_circle.setOnClickListener(this); + tv_article.setOnClickListener(this); + ll_qa_publish.setOnClickListener(this); + actVpager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int i, float v, int i1) { + + } + + @Override + public void onPageSelected(int i) { + switch (i){ + case 0: + changePage2Circle(); + break; + case 1: + changePage2Article(); + break; + } + } + + @Override + public void onPageScrollStateChanged(int i) { + + } + }); + } + + private void initView(View view) { + tv_circle = (RadioButton) view.findViewById(R.id.tv_circle); + tv_article = (RadioButton) view.findViewById(R.id.tv_article); + actVpager = (ViewPager) view.findViewById(R.id.actVpager); + ll_qa_publish = (LinearLayout) view.findViewById(R.id.ll_qa_publish); + } + + + @Override + public void onClick(View view) { + switch (view.getId()){ + case R.id.tv_circle: + changePage2Circle(); + break; + case R.id.tv_article: + changePage2Article(); + break; + case R.id.ll_qa_publish: + Intent intent = new Intent(getActivity(),PutRecentActivity.class); + startActivity(intent); + break; + default: + break; + } + } + + /** + * 切换页面到缘圈 + */ + private void changePage2Circle(){ + tv_circle.setChecked(true); + tv_article.setChecked(false); + ll_qa_publish.setVisibility(View.VISIBLE); + tv_circle.setTextColor(getResources().getColor(R.color.topbarBackground)); + tv_article.setTextColor(getResources().getColor(R.color.white)); + actVpager.setCurrentItem(0); + } + + /** + * 切换页面到文章 + */ + private void changePage2Article(){ + tv_article.setChecked(true); + tv_circle.setChecked(false); + ll_qa_publish.setVisibility(View.GONE); + tv_article.setTextColor(getResources().getColor(R.color.topbarBackground)); + tv_circle.setTextColor(getResources().getColor(R.color.white)); + actVpager.setCurrentItem(1); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/SendGiftFragment.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/SendGiftFragment.java new file mode 100644 index 0000000000000000000000000000000000000000..d528ff8ffc0290c2d29fe881cc997e37e1fca35b --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/fragment/SendGiftFragment.java @@ -0,0 +1,144 @@ +package com.jiuqi.elove.fragment; + +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.support.v7.widget.GridLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.RelativeLayout; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.jiuqi.elove.R; +import com.jiuqi.elove.activity.GiftDetailListActivity; +import com.jiuqi.elove.adapter.ReceiveGiftAdapter; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.entity.GiftModel; +import com.jiuqi.elove.util.OkHttpUtil; +import com.jiuqi.elove.util.SpUtils; + +import java.util.ArrayList; +import java.util.List; + +/** + * 送出的礼物 + * Created by dl on 2017/3/23. + */ +public class SendGiftFragment extends Fragment{ + /** + * 控件 + */ + private RecyclerView lv_gift; + private RelativeLayout rlay_nodata; + + /** + * 数据 + */ + private String userId; + private List giftList; + private List giftAddList; + + /** + * 工具 + */ + private ReceiveGiftAdapter adapter; + private OkHttpUtil okHttpUtil = OkHttpUtil.getInstance(); + private Boolean isshow = true; + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.gift_receive_layout,container,false); + initView(view); + return view; + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + getDataFromSp();//从sp中获取需要的数据 + setLayoutAndAdapter();//给recyclerview设置layoutmanager和adapter + retrieveDataAndSet();//初始化数据容器,获取服务器数据并进行设置 + setEvents(); + } + + /** + * 初始化控件 + * @param view 上下文view + */ + private void initView(View view) { + lv_gift = (RecyclerView) view.findViewById(R.id.lv_gift); + rlay_nodata = (RelativeLayout) view.findViewById(R.id.rlay_nodata); + } + + private void getDataFromSp() { + userId = SpUtils.getString(Constant.USER_ID); + } + + private void setLayoutAndAdapter() { + //创建manager并进行设置 + GridLayoutManager manager = new GridLayoutManager(getActivity(),2); + manager.setAutoMeasureEnabled(true); + //给recyclerview设置manager,并通过自定义给其设置间距 + lv_gift.setLayoutManager(manager); +// lv_gift.addItemDecoration(new GridSpacingItemDecoration(2,18,false)); + //创建adapter,并设置 + adapter = new ReceiveGiftAdapter(getActivity()); + lv_gift.setAdapter(adapter); + } + + private void retrieveDataAndSet() { + giftAddList = new ArrayList<>(); + getReceiveGiftList();//从服务器获取数据并进行设置 +// initData(); + } + + private void setEvents() { + adapter.setOnItemClickListener(new ReceiveGiftAdapter.OnRecyclerViewItemClickListener() { + @Override + public void onItemClick(int position) { + if(giftAddList.size()<=0){ + return; + } + GiftModel model = giftAddList.get(position); + Intent intent = new Intent(getActivity(),GiftDetailListActivity.class); + intent.putExtra("name",model.getName()); + intent.putExtra("action", Constant.SEND_ACTION); + startActivity(intent); + } + }); + } + + private void getReceiveGiftList() { + String sendgiftUrl = Constant.COMMON_URL + Interface.MY_GIFT; + JSONObject obj = new JSONObject(); + obj.put("userid",userId); + obj.put("version",Constant.VERSION); + obj.put("action",Constant.SEND_ACTION); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(getActivity(), isshow, sendgiftUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + if("1".equals(rsCode)){ + String result = jsonObject.getString("message"); + giftList = JSONArray.parseArray(result,GiftModel.class); + if(!giftList.isEmpty()){ + rlay_nodata.setVisibility(View.GONE); + giftAddList.addAll(giftList); + adapter.updateRecylerView(giftAddList); + }else{ + rlay_nodata.setVisibility(View.VISIBLE); + } + } + } + },null); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/jpushreceiver/MyReceiver.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/jpushreceiver/MyReceiver.java new file mode 100644 index 0000000000000000000000000000000000000000..0626158efcf1fea67fb7243eb6bbd83409dea593 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/jpushreceiver/MyReceiver.java @@ -0,0 +1,171 @@ +package com.jiuqi.elove.jpushreceiver; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.support.v4.content.LocalBroadcastManager; +import android.util.Log; + +import com.jiuqi.elove.activity.SystemMsgActivity; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.fragment.RecentMessageFragment; +import com.jiuqi.elove.util.JqStrUtil; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.Iterator; + +import cn.jpush.android.api.JPushInterface; + +/** + * 自定义接收器 + * + * 如果不定义这个 Receiver,则: + * 1) 默认用户会打开主界面 + * 2) 接收不到自定义消息 + */ +public class MyReceiver extends BroadcastReceiver { + + private static final String TAG = "JPush"; + + private LocalBroadcastManager broadcastManager; + + private String classify;//用于区分推送的类型,后台接口定义并且加入,返回给前端 + + @Override + public void onReceive(Context context, Intent intent) { + /** + * 通过intent得到推送的信息内容并且加以处理 + */ + Bundle bundle = intent.getExtras(); + String message = bundle.getString("cn.jpush.android.EXTRA",""); + if(!JqStrUtil.isEmpty(message)){ + try { + JSONObject obj = new JSONObject(message); + classify = obj.getString("classify"); + } catch (JSONException e) { + e.printStackTrace(); + } + } + Log.d(TAG, "[MyReceiver] onReceive - " + intent.getAction() + ", extras: " + printBundle(bundle));//打印出了获取到的所有推送数据 + if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) { + String regId = bundle.getString(JPushInterface.EXTRA_REGISTRATION_ID); + Log.d(TAG, "[MyReceiver] 接收Registration Id : " + regId); + //send the Registration Id to your server... + + } else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) { + Log.d(TAG, "[MyReceiver] 接收到推送下来的自定义消息: " + bundle.getString(JPushInterface.EXTRA_MESSAGE)); +// processCustomMessage(context, bundle); + + } else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) { + Log.d(TAG, "[MyReceiver] 接收到推送下来的通知"); + broadcastManager = LocalBroadcastManager.getInstance(context); + int notifactionId = bundle.getInt(JPushInterface.EXTRA_NOTIFICATION_ID); + Log.d(TAG, "[MyReceiver] 接收到推送下来的通知的ID: " + notifactionId); + Intent notifyIntent = new Intent(Constant.ACTION_NOTIFY_RECEIVED); + notifyIntent.putExtra(Constant.NOTIFY_TYPE,classify); + notifyIntent.putExtra(JPushInterface.EXTRA_NOTIFICATION_ID,notifactionId); + broadcastManager.sendBroadcast(notifyIntent); + } else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) { + Log.d(TAG, "[MyReceiver] 用户点击打开了通知"); + //打开自定义的Activity + Intent i = new Intent(context, SystemMsgActivity.class); + i.putExtra("classify",classify); + i.putExtras(bundle); + i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); +// i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP ); + context.startActivity(i); + + } else if (JPushInterface.ACTION_RICHPUSH_CALLBACK.equals(intent.getAction())) { + Log.d(TAG, "[MyReceiver] 用户收到到RICH PUSH CALLBACK: " + bundle.getString(JPushInterface.EXTRA_EXTRA)); + //在这里根据 JPushInterface.EXTRA_EXTRA 的内容处理代码,比如打开新的Activity, 打开一个网页等.. + + } else if(JPushInterface.ACTION_CONNECTION_CHANGE.equals(intent.getAction())) { + boolean connected = intent.getBooleanExtra(JPushInterface.EXTRA_CONNECTION_CHANGE, false); + Log.w(TAG, "[MyReceiver]" + intent.getAction() +" connected state change to "+connected); + } else { + Log.d(TAG, "[MyReceiver] Unhandled intent - " + intent.getAction()); + } + } + + // 打印所有的 intent extra 数据 + private static String printBundle(Bundle bundle) { + StringBuilder sb = new StringBuilder(); + for (String key : bundle.keySet()) { + if (key.equals(JPushInterface.EXTRA_NOTIFICATION_ID)) { + sb.append("\nkey:" + key + ", value:" + bundle.getInt(key)); + }else if(key.equals(JPushInterface.EXTRA_CONNECTION_CHANGE)){ + sb.append("\nkey:" + key + ", value:" + bundle.getBoolean(key)); + } else if (key.equals(JPushInterface.EXTRA_EXTRA)) { + if (bundle.getString(JPushInterface.EXTRA_EXTRA).isEmpty()) { + Log.i(TAG, "This message has no Extra data"); + continue; + } + try { + JSONObject json = new JSONObject(bundle.getString(JPushInterface.EXTRA_EXTRA)); + Iterator it = json.keys(); + while (it.hasNext()) { + String myKey = it.next().toString(); + sb.append("\nkey:" + key + ", value: [" + + myKey + " - " +json.optString(myKey) + "]"); + } + } catch (JSONException e) { + Log.e(TAG, "Get message extra JSON error!"); + } + + } else { + sb.append("\nkey:" + key + ", value:" + bundle.getString(key)); + } + } + return sb.toString(); + } + + //send msg to MainActivity +// private void processCustomMessage(Context context, Bundle bundle) { +// if (MainActivity.isForeground) { +// String message = bundle.getString(JPushInterface.EXTRA_MESSAGE); +// String extras = bundle.getString(JPushInterface.EXTRA_EXTRA); +// Intent msgIntent = new Intent(MainActivity.MESSAGE_RECEIVED_ACTION); +// msgIntent.putExtra(MainActivity.KEY_MESSAGE, message); +// if (!ExampleUtil.isEmpty(extras)) { +// try { +// JSONObject extraJson = new JSONObject(extras); +// if (null != extraJson && extraJson.length() > 0) { +// msgIntent.putExtra(MainActivity.KEY_EXTRAS, extras); +// } +// } catch (JSONException e) { +// +// } +// +// } +// context.sendBroadcast(msgIntent); +// } +// } + +// private void openNotification(Context context, Bundle bundle){ +// String extras = bundle.getString(JPushInterface.EXTRA_EXTRA); +// String myValue = ""; +// try { +// JSONObject extrasJson = new JSONObject(extras); +// myValue = extrasJson.optString("myKey"); +// } catch (Exception e) { +// Logger.w(TAG, "Unexpected: extras is not a valid json", e); +// return; +// } +// if (TYPE_THIS.equals(myValue)) { +// Intent mIntent = new Intent(context, ThisActivity.class); +// mIntent.putExtras(bundle); +// mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); +// context.startActivity(mIntent); +// } else if (TYPE_ANOTHER.equals(myValue)){ +// Intent mIntent = new Intent(context, AnotherActivity.class); +// mIntent.putExtras(bundle); +// mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); +// context.startActivity(mIntent); +// } +// } +//} + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/jpushreceiver/StartServiceReceiver.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/jpushreceiver/StartServiceReceiver.java new file mode 100644 index 0000000000000000000000000000000000000000..1acbab0b8ce01f607ac0655a8d34b0767e261489 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/jpushreceiver/StartServiceReceiver.java @@ -0,0 +1,34 @@ +/************************************************************ + * * Hyphenate CONFIDENTIAL + * __________________ + * Copyright (C) 2016 Hyphenate Inc. All rights reserved. + * + * NOTICE: All information contained herein is, and remains + * the property of Hyphenate Inc.. + * Dissemination of this information or reproduction of this material + * is strictly forbidden unless prior written permission is obtained + * from Hyphenate Inc. + */ +package com.jiuqi.elove.jpushreceiver; + +import com.hyphenate.chat.EMChatService; +import com.hyphenate.util.EMLog; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; + +/** + * @deprecated instead of use {@link} + * + */ +public class StartServiceReceiver extends BroadcastReceiver{ + + @Override + public void onReceive(Context context, Intent intent) { + EMLog.d("boot", "start IM service on boot"); + Intent startServiceIntent=new Intent(context, EMChatService.class); + startServiceIntent.putExtra("reason", "boot"); + context.startService(startServiceIntent); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/updateapk/CheckApkUpdate.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/updateapk/CheckApkUpdate.java new file mode 100644 index 0000000000000000000000000000000000000000..ee1890b70926efdad11f32d4dfbb6066fcf4f408 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/updateapk/CheckApkUpdate.java @@ -0,0 +1,158 @@ +package com.jiuqi.elove.updateapk; + +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.net.Uri; +import android.os.Build; +import android.support.v4.content.FileProvider; +import android.util.Log; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.OkHttpUtil; + +import java.io.File; + + +/** + * Created by dl on 2016/8/3 + */ +public class CheckApkUpdate { + + public static final String PROVIDER_FILE = "com.jiuqi.elove.fileprovider"; + private static final String TAG = "CheckApkUpdate"; +// private SelectAppVersionEntity selectAppVersionEntity;//APK更新 + private PackageManager packageManager;//管理应用程序包,通过它就可以获取应用程序信息 + private String apkFilePath = Constant.APK_DOWNLOAD_PATH + "/" + Constant.APK_NAME;//下载的apk存放的目录 + private int apk_version;//当前apk版本号 + private String apk_versionName;//暂用做版本号,因为接口不对呢 + private int remoteVersion = -1;//发布apk版本号 + private int apkPackageInfo = -1;//下载apk版本号 + private String isPost;//是否提示无更新 + + private Context context; + private final OkHttpUtil okHttpUtil = OkHttpUtil.getInstance(); + + public CheckApkUpdate(Context context,String isPost) { + this.context = context; + this.isPost = isPost; + packageManager = context.getPackageManager(); + } + + /** + * APK更新 + */ + public void updateApk() { + +// SelectAppVersionFormEntity selectAppVersionFormEntity = new SelectAppVersionFormEntity(); +// selectAppVersionFormEntity.setAppType("1"); + String updateUrl = Constant.COMMON_URL + Interface.UPDATE_CHECK; + PackageInfo pinfo = null; + try { + pinfo = packageManager.getPackageInfo(context.getPackageName(), PackageManager.GET_CONFIGURATIONS); + //检测是否有新版下载未安装 + if (new File(apkFilePath).exists()) { + PackageInfo apkInfo = packageManager.getPackageArchiveInfo(apkFilePath, PackageManager.GET_ACTIVITIES); + if(apkInfo!=null){//bug修改 + apkPackageInfo = apkInfo.versionCode; + } + } + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + } + //获取当前APK版本 + apk_version = pinfo.versionCode; + apk_versionName = pinfo.versionName; + if (apkPackageInfo > apk_version) {//本地已经有新版本了 + Log.d(TAG, "updateApk: "+context); + new AlertDialog.Builder(context) + .setIcon(R.mipmap.app_logo) + .setCancelable(false) + .setTitle("企缘新版本发布") + .setMessage(" 最新安装包已下载,\n 现在是否安装?") + .setPositiveButton("立即安装", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int i) { + dialog.dismiss(); + startInstallActivity(context, apkFilePath); + } + }) + .setNegativeButton("暂不安装", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int i) { + dialog.dismiss(); + } + }) + .show(); + return; + } + JSONObject obj = new JSONObject(); + obj.put("versionCode", apk_version); + obj.put("version",apk_versionName); + String param = JSON.toJSONString(obj); + Log.d(TAG, "updateApk: " + apk_version); + okHttpUtil.sendJsonStrByPostAsync(context, false, updateUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + final String downUrl = jsonObject.getString("apkurl"); + //有新版本 + if ("1".equals(rsCode)) { + new AlertDialog.Builder(context).setTitle("企缘新版本发布")//设置对话框标题 + .setIcon(R.mipmap.app_logo) + .setCancelable(false) + .setMessage("是否下载最新版安装包?")//设置显示的内容 + .setPositiveButton("立即下载", new DialogInterface.OnClickListener() {//添加确定按钮 + @Override + public void onClick(DialogInterface dialog, int which) {//确定按钮的响应事件 + dialog.dismiss(); + Intent intent = new Intent(context, DownloadService.class); + intent.putExtra(Constant.UPDATE_SERVICE, downUrl); + context.startService(intent); + } + }) + .setNegativeButton("暂不更新", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int i) { + dialog.dismiss(); + } + }).show();//在按键响应事件中显示此对话框 + } else if ("0".equals(rsCode)) { + Log.d(TAG, "onResponse: " + context); + if("MainActivity".equals(isPost)){//进入软件如果没有最新版本不进行提示 + }else{//手动检查才进行提示 + JqStrUtil.showToast(context,"已经是最新版本"); + } + } + } + }, null); + } + + /** + * 打开安装APK安装目录 + */ + private void startInstallActivity(Context context, String apkFilePath) { + Intent installIntent = new Intent(Intent.ACTION_VIEW); + if (Build.VERSION.SDK_INT >= 24) { + // Android7.0及以上版本 + installIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + installIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + installIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); + Uri contentUri = FileProvider.getUriForFile(context, PROVIDER_FILE, new File(apkFilePath));//参数二:应用包名+".fileProvider"(和步骤二中的Manifest文件中的provider节点下的authorities对应) + installIntent.setDataAndType(contentUri, "application/vnd.android.package-archive"); + } else { + installIntent.setDataAndType(Uri.fromFile(new File(apkFilePath)), "application/vnd.android.package-archive"); + } + context.startActivity(installIntent); + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/updateapk/DownloadService.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/updateapk/DownloadService.java new file mode 100644 index 0000000000000000000000000000000000000000..d83ca54600d47f332d8d84fef979e5872f9107d7 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/updateapk/DownloadService.java @@ -0,0 +1,155 @@ +package com.jiuqi.elove.updateapk; + +import android.app.IntentService; +import android.app.Notification; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.os.Build; +import android.support.v4.app.NotificationCompat.Builder; +import android.support.v4.content.FileProvider; +import android.util.Log; + +import com.jiuqi.elove.common.Constant; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URL; + +import static com.jiuqi.elove.updateapk.CheckApkUpdate.PROVIDER_FILE; + +/** + * 下载APK + */ +public class DownloadService extends IntentService { + private static final int BUFFER_SIZE = 30 * 1024; // 8k ~ 32K + private static final String TAG = "DownloadService"; + private NotificationManager mNotifyManager; + private Builder mBuilder; + + public DownloadService() { + super("DownloadService"); + } + + @Override + protected void onHandleIntent(Intent intent) { + + mNotifyManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); + mBuilder = new Builder(this); + + String appName = getString(getApplicationInfo().labelRes); + int icon = getApplicationInfo().icon; + + mBuilder.setContentTitle(appName).setSmallIcon(icon); + String urlStr = intent.getStringExtra(Constant.UPDATE_SERVICE); + InputStream in = null; + FileOutputStream out = null; + try { + URL url = new URL(urlStr); + HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); + + urlConnection.setRequestMethod("GET"); + urlConnection.setDoOutput(false); + urlConnection.setConnectTimeout(10 * 1000); + urlConnection.setReadTimeout(10 * 1000); + urlConnection.setRequestProperty("Connection", "Keep-Alive"); + urlConnection.setRequestProperty("Charset", "UTF-8"); + urlConnection.setRequestProperty("Accept-Encoding", "gzip, deflate"); + + urlConnection.connect(); + long bytetotal = urlConnection.getContentLength(); + long bytesum = 0; + int byteread = 0; + in = urlConnection.getInputStream(); + + File dir = FileUtils.getAPKUpdateDir(this); + + File apkFile = new File(dir, Constant.APK_NAME); + if (!apkFile.exists()) { + apkFile.createNewFile(); + } + out = new FileOutputStream(apkFile); + byte[] buffer = new byte[BUFFER_SIZE]; + + int oldProgress = 0; + + while ((byteread = in.read(buffer)) != -1) { + bytesum += byteread; + out.write(buffer, 0, byteread); + + int progress = (int) (bytesum * 100L / bytetotal); + // 如果进度与之前进度相等,则不更新,如果更新太频繁,否则会造成界面卡顿 + if (progress != oldProgress) { + updateProgress(progress); + } + oldProgress = progress; + } + // 下载完成 + mBuilder.setContentText("下载成功").setProgress(0, 0, false); + + Intent installAPKIntent = new Intent(Intent.ACTION_VIEW); + //如果没有设置SDCard写权限,或者没有sdcard,apk文件保存在内存中,需要授予权限才能安装 + String[] command = {"chmod", "777", apkFile.toString()}; + ProcessBuilder builder = new ProcessBuilder(command); + builder.start(); + + PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, installAPKIntent, PendingIntent.FLAG_UPDATE_CURRENT); + + mBuilder.setContentIntent(pendingIntent); + Notification noti = mBuilder.build(); + noti.flags = Notification.FLAG_AUTO_CANCEL; + mNotifyManager.notify(0, noti); + mNotifyManager.cancelAll(); + if (Build.VERSION.SDK_INT >= 24) { + // Android7.0及以上版本 + Uri contentUri = FileProvider.getUriForFile(this, PROVIDER_FILE, apkFile);//参数二:应用包名+".fileProvider"(和步骤二中的Manifest文件中的provider节点下的authorities对应) + installAPKIntent.setDataAndType(contentUri, "application/vnd.android.package-archive"); + } else{ + installAPKIntent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive"); + } + installAPKIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + installAPKIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + installAPKIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); + startActivity(installAPKIntent); + + } catch (Exception e) { + Log.e("ok", "download apk file error", e); + } finally { + if (out != null) { + try { + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (in != null) { + try { + in.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + + /** + * 进度条更新 + * + * @param progress + */ + private void updateProgress(int progress) { + //"正在下载:" + progress + "%" + mBuilder.setContentText("正在下载"+progress+"%").setProgress(100, progress, false); +// mBuilder.setContentText(this.getString(R.string.download_progress, progress)).setProgress(100, progress, false); + //setContentInent如果不设置在4.0+上没有问题,在4.0以下会报异常 + PendingIntent pendingintent = PendingIntent.getActivity(this, 0, new Intent(), PendingIntent.FLAG_CANCEL_CURRENT); + mBuilder.setContentIntent(pendingintent); + mNotifyManager.notify(0, mBuilder.build()); + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/updateapk/FileUtils.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/updateapk/FileUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..b77c2c3f3ce84efeacc0cfdacfd4c7a737fe4d3e --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/updateapk/FileUtils.java @@ -0,0 +1,350 @@ +package com.jiuqi.elove.updateapk; + +import android.content.Context; +import android.os.Environment; + +import com.jiuqi.elove.common.Constant; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Enumeration; +import java.util.zip.ZipEntry; +import java.util.zip.ZipException; +import java.util.zip.ZipFile; +import java.util.zip.ZipInputStream; + +/*** + * 文件操作 + */ +public class FileUtils { + + private static String SDPATH = Environment.getExternalStorageDirectory() + "/"; + + private static int FILESIZE = 4 * 1024; + + public static String getSDPATH() { + return SDPATH; + } + + public static File lodeSDFile(String fileName) { + File file = new File(SDPATH + fileName); + return file; + } + + /** + * @param fileName + * @return + * @throws IOException + */ + public static File createSDFile(String fileName) throws IOException { + File file = new File(SDPATH + fileName); + file.createNewFile(); + return file; + } + + /** + * 获取APK升级路径 + * + * @return + */ + public static File getAPKUpdateDir(Context context) { + File update_apk_path = new File(Constant.APK_DOWNLOAD_PATH); + + if (!update_apk_path.exists()) { + update_apk_path.mkdirs(); + } + + if (!update_apk_path.exists()) { + update_apk_path = StorageUtils.getCacheDirectory(context); + } + + return update_apk_path; + } + + + /** + * 获取文件夹,没有的话创建一个 + * + * @param dirName + * @return + */ + public static File getDir(String dirName) { + File file = new File(dirName); + if (file.exists()) { + return file; + } + file.mkdirs(); + return file; + } + + /** + * 获取文件,没有的话创建一个 + * + * @param filePath + * @return + * @throws IOException + */ + public static File getFile(String filePath) throws IOException { + File file = new File(filePath); + if (file.exists()) { + return file; + } + file.createNewFile(); + return file; + } + + /** + * @param dirName + * @return + */ + public static File createSDDir(String dirName) { + File dir = new File(SDPATH + dirName); + dir.mkdir(); + return dir; + } + + /** + * @param fileName + * @return + */ + public static boolean isSDFileExist(String fileName) { + File file = new File(SDPATH + fileName); + return file.exists(); + } + + /** + * @param fileName + * @return + */ + public static boolean isFileExist(String fileName) { + File file = new File(fileName); + return file.exists(); + } + + /** + * @param path + * @param fileName + * @param input + * @return + */ + public static File write2SDFromInput(String path, String fileName, InputStream input) { + File file = null; + OutputStream output = null; + try { + createSDDir(path); + file = createSDFile(path + fileName); + output = new FileOutputStream(file); + byte[] buffer = new byte[FILESIZE]; + while ((input.read(buffer)) != -1) { + output.write(buffer); + } + output.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + output.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return file; + } + + public static File writeFileFromInput(String filePath, InputStream input) { + File file = null; + OutputStream output = null; + + if (null == input) + return null; + + try { + file = new File(filePath); + output = new FileOutputStream(file); + byte[] buffer = new byte[FILESIZE]; + while ((input.read(buffer)) != -1) { + output.write(buffer); + } + output.flush(); + } catch (Exception e) { + if (null != file) { + file.delete(); + file = null; + } + } finally { + try { + output.close(); + output = null; + + input.close(); + input = null; + } catch (IOException e) { + if (null != file) { + file.delete(); + file = null; + } + } + } + return file; + } + + /** + * + */ + public static boolean deleteFile(String sPath) { + boolean flag = false; + File file = new File(sPath); + if (file.isFile() && file.exists()) { + file.delete(); + flag = true; + } + return flag; + } + + /** + * + */ + + public static boolean deleteDirectory(String sPath) { + boolean flag = false; + + if (!sPath.endsWith(File.separator)) { + sPath = sPath + File.separator; + } + File dirFile = new File(sPath); + + if (!dirFile.exists() || !dirFile.isDirectory()) { + return false; + } + flag = true; + + File[] files = dirFile.listFiles(); + for (int i = 0; i < files.length; i++) { + if (files[i].isFile()) { + flag = deleteFile(files[i].getAbsolutePath()); + if (!flag) break; + } else { + flag = deleteDirectory(files[i].getAbsolutePath()); + if (!flag) break; + } + } + if (!flag) return false; + if (dirFile.delete()) { + return true; + } else { + return false; + } + } + + private static final int BUFF_SIZE = 1024 * 1024; // 1M Byte + + public static void upZipFile(String inZipFilePath, String outFolderPath) throws ZipException, IOException { + File zipFile = new File(inZipFilePath); + File desDir = new File(outFolderPath); + if (!desDir.exists()) { + desDir.mkdirs(); + } + ZipFile zf = new ZipFile(zipFile); + for (Enumeration entries = zf.entries(); entries.hasMoreElements(); ) { + + ZipEntry entry = ((ZipEntry) entries.nextElement()); + String str = outFolderPath + File.separator + entry.getName(); + File desFile = new File(str); + + if (entry.isDirectory()) { + desFile.mkdirs(); + + } else { + InputStream in = zf.getInputStream(entry); + + if (!desFile.exists()) { + File fileParentDir = desFile.getParentFile(); + if (!fileParentDir.exists()) { + fileParentDir.mkdirs(); + } + desFile.createNewFile(); + } + OutputStream out = new FileOutputStream(desFile); + byte buffer[] = new byte[BUFF_SIZE]; + int realLength; + while ((realLength = in.read(buffer)) > 0) { + out.write(buffer, 0, realLength); + } + in.close(); + out.close(); + } + } + } + + public static boolean unzip(InputStream zipFileName, String outputDirectory) { + try { + ZipInputStream in = new ZipInputStream(zipFileName); + // 获取ZipInputStream中的ZipEntry条目,一个zip文件中可能包含多个ZipEntry, + // 当getNextEntry方法的返回值为null,则代表ZipInputStream中没有下一个ZipEntry, + // 输入流读取完成; + ZipEntry entry = in.getNextEntry(); + while (entry != null) { + + // 创建以zip包文件名为目录名的根目录 + File file = new File(outputDirectory); + if (!file.isDirectory()) { + file.mkdir(); + } + if (entry.isDirectory()) { + String name = entry.getName(); + name = name.substring(0, name.length() - 1); + + file = new File(outputDirectory + File.separator + name); + file.mkdir(); + + } else { + file = new File(outputDirectory + File.separator + entry.getName()); + if (!file.exists()) { + file.createNewFile(); + } + FileOutputStream out = new FileOutputStream(file); + byte[] buffer = new byte[4096 * 10]; + int length = 0; + + while ((length = in.read(buffer)) != -1) { + out.write(buffer, 0, length); + } + + out.close(); + } + // 读取下一个ZipEntry + entry = in.getNextEntry(); + } + in.close(); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + + return true; + } + + /*** + * 根据路径获取文件名 + * + * @param pathandname + * @return + */ + public static String getFileNameByPath(String pathandname) { + int start = pathandname.lastIndexOf("/"); + int end = pathandname.lastIndexOf("."); + if (start != -1 && end != -1) { + return pathandname.substring(start + 1, end); + } else { + return null; + } + + } + + public static String getFileNameByURL(String urlString) { + return urlString.substring(urlString.lastIndexOf("/") + 1, urlString.length()); + } +} \ No newline at end of file diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/updateapk/StorageUtils.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/updateapk/StorageUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..d5f54bc0022beb32cc347ca1458963d87c3f77c6 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/updateapk/StorageUtils.java @@ -0,0 +1,72 @@ +package com.jiuqi.elove.updateapk; + +import android.content.Context; +import android.content.pm.PackageManager; +import android.os.Environment; +import android.util.Log; + +import java.io.File; +import java.io.IOException; + +import static android.os.Environment.MEDIA_MOUNTED; + +/** + * Provides application storage paths + * + * @author Sergey Tarasevich (nostra13[at]gmail[dot]com) + * @since 1.0.0 + */ +public final class StorageUtils { + + private static final String EXTERNAL_STORAGE_PERMISSION = "android.permission.WRITE_EXTERNAL_STORAGE"; + //private static final String INDIVIDUAL_DIR_NAME = "uil-images"; + private static final String TAG = "StorageUtils"; + + private StorageUtils() { + } + + /** + * Returns application cache directory. Cache directory will be created on SD card + * ("/Android/data/[app_package_name]/cache") if card is mounted and app has appropriate permission. Else - + * Android defines cache directory on device's file system. + * + * @param context Application context + * @return Cache {@link File directory} + */ + public static File getCacheDirectory(Context context) { + File appCacheDir = null; + if (MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) && hasExternalStoragePermission(context)) { + appCacheDir = getExternalCacheDir(context); + } + if (appCacheDir == null) { + appCacheDir = context.getCacheDir(); + } + if (appCacheDir == null) { + Log.w(TAG, "Can't define system cache directory! The app should be re-installed."); + } + return appCacheDir; + } + + + private static File getExternalCacheDir(Context context) { + File dataDir = new File(new File(Environment.getExternalStorageDirectory(), "Android"), "data"); + File appCacheDir = new File(new File(dataDir, context.getPackageName()), "cache"); + if (!appCacheDir.exists()) { + if (!appCacheDir.mkdirs()) { + Log.w(TAG, "Unable to create external cache directory"); + return null; + } + try { + new File(appCacheDir, ".nomedia").createNewFile(); + } catch (IOException e) { + Log.i(TAG, "Can't create \".nomedia\" file in application external cache directory"); + } + } + return appCacheDir; + } + + private static boolean hasExternalStoragePermission(Context context) { + int perm = context.checkCallingOrSelfPermission(EXTERNAL_STORAGE_PERMISSION); + return perm == PackageManager.PERMISSION_GRANTED; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/AbDateUtil.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/AbDateUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..30e10f769a5ebe1302ce01a491a100c8cd5cd234 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/AbDateUtil.java @@ -0,0 +1,732 @@ +package com.jiuqi.elove.util; + +import android.text.format.Time; +import android.util.Log; + +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.HashMap; +import java.util.Map; + +public class AbDateUtil { + + /** 时间日期格式化到年月日时分秒. */ + public static final String dateFormatYMDHMS = "yyyy-MM-dd HH:mm:ss"; + + /** 时间日期格式化到年月日. */ + public static final String dateFormatYMD = "yyyy-MM-dd"; + + /** 时间日期格式化到年月. */ + public static final String dateFormatYM = "yyyy-MM"; + + /** 时间日期格式化到年月日时分. */ + public static final String dateFormatYMDHM = "yyyy-MM-dd HH:mm"; + + /** 时间日期格式化到月日. */ + public static final String dateFormatMD = "MM/dd"; + + /** 时分秒. */ + public static final String dateFormatHMS = "HH:mm:ss"; + + /** 时分. */ + public static final String dateFormatHM = "HH:mm"; + + /** 上午. */ + public static final String AM = "AM"; + + /** 下午. */ + public static final String PM = "PM"; + + + /** + * 描述:String类型的日期时间转化为Date类型. + * + * @param strDate String形式的日期时间 + * @param format 格式化字符串,如:"yyyy-MM-dd HH:mm:ss" + * @return Date Date类型日期时间 + */ + public static Date getDateByFormat(String strDate, String format) { + SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format); + Date date = null; + try { + date = mSimpleDateFormat.parse(strDate); + } catch (ParseException e) { + e.printStackTrace(); + } + return date; + } + + /** + * 描述:获取偏移之后的Date. + * @param date 日期时间 + * @param calendarField Calendar属性,对应offset的值, 如(Calendar.DATE,表示+offset天,Calendar.HOUR_OF_DAY,表示+offset小时) + * @param offset 偏移(值大于0,表示+,值小于0,表示-) + * @return Date 偏移之后的日期时间 + */ + public Date getDateByOffset(Date date,int calendarField,int offset) { + Calendar c = new GregorianCalendar(); + try { + c.setTime(date); + c.add(calendarField, offset); + } catch (Exception e) { + e.printStackTrace(); + } + return c.getTime(); + } + + /** + * 描述:获取指定日期时间的字符串(可偏移). + * + * @param strDate String形式的日期时间 + * @param format 格式化字符串,如:"yyyy-MM-dd HH:mm:ss" + * @param calendarField Calendar属性,对应offset的值, 如(Calendar.DATE,表示+offset天,Calendar.HOUR_OF_DAY,表示+offset小时) + * @param offset 偏移(值大于0,表示+,值小于0,表示-) + * @return String String类型的日期时间 + */ + public static String getStringByOffset(String strDate, String format,int calendarField,int offset) { + String mDateTime = null; + try { + Calendar c = new GregorianCalendar(); + SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format); + c.setTime(mSimpleDateFormat.parse(strDate)); + c.add(calendarField, offset); + mDateTime = mSimpleDateFormat.format(c.getTime()); + } catch (ParseException e) { + e.printStackTrace(); + } + return mDateTime; + } + + /** + * 描述:Date类型转化为String类型(可偏移). + * + * @param date the date + * @param format the format + * @param calendarField the calendar field + * @param offset the offset + * @return String String类型日期时间 + */ + public static String getStringByOffset(Date date, String format,int calendarField,int offset) { + String strDate = null; + try { + Calendar c = new GregorianCalendar(); + SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format); + c.setTime(date); + c.add(calendarField, offset); + strDate = mSimpleDateFormat.format(c.getTime()); + } catch (Exception e) { + e.printStackTrace(); + } + return strDate; + } + + + /** + * 描述:Date类型转化为String类型. + * + * @param date the date + * @param format the format + * @return String String类型日期时间 + */ + public static String getStringByFormat(Date date, String format) { + SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format); + String strDate = null; + try { + strDate = mSimpleDateFormat.format(date); + } catch (Exception e) { + e.printStackTrace(); + } + return strDate; + } + + + /** + * 描述:获取指定日期时间的字符串,用于导出想要的格式. + * + * @param strDate String形式的日期时间,必须为yyyy-MM-dd HH:mm:ss格式 + * @param formatBefor 输入格式化字符串,如:"yyyy-MM-dd HH:mm:ss" + * @param formatAfter 输出格式化字符串,如:"yyyy-MM-dd HH:mm:ss" + * @return + */ + public static String getStringByFormat(String strDate, String formatBefor, String formatAfter) { + String mDateTime = null; + try { + Calendar c = new GregorianCalendar(); + SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(formatBefor); + c.setTime(mSimpleDateFormat.parse(strDate)); + SimpleDateFormat mSimpleDateFormat2 = new SimpleDateFormat(formatAfter); + mDateTime = mSimpleDateFormat2.format(c.getTime()); + } catch (Exception e) { + e.printStackTrace(); + } + return mDateTime; + } + + /** + * 描述:获取milliseconds表示的日期时间的字符串. + * + * @param milliseconds the milliseconds + * @param format 格式化字符串,如:"yyyy-MM-dd HH:mm:ss" + * @return String 日期时间字符串 + */ + public static String getStringByFormat(long milliseconds,String format) { + String thisDateTime = null; + try { + SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format); + thisDateTime = mSimpleDateFormat.format(milliseconds); + } catch (Exception e) { + e.printStackTrace(); + } + return thisDateTime; + } + + /** + * 描述:获取表示当前日期时间的字符串. + * + * @param format 格式化字符串,如:"yyyy-MM-dd HH:mm:ss" + * @return String String类型的当前日期时间 + */ + public static String getCurrentDate(String format) { + String curDateTime = null; + try { + SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format); + Calendar c = new GregorianCalendar(); + curDateTime = mSimpleDateFormat.format(c.getTime()); + } catch (Exception e) { + e.printStackTrace(); + } + return curDateTime; + + } + + /** + * 描述:获取表示当前日期时间的字符串(可偏移). + * + * @param format 格式化字符串,如:"yyyy-MM-dd HH:mm:ss" + * @param calendarField Calendar属性,对应offset的值, 如(Calendar.DATE,表示+offset天,Calendar.HOUR_OF_DAY,表示+offset小时) + * @param offset 偏移(值大于0,表示+,值小于0,表示-) + * @return String String类型的日期时间 + */ + public static String getCurrentDateByOffset(String format,int calendarField,int offset) { + String mDateTime = null; + try { + SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format); + Calendar c = new GregorianCalendar(); + c.add(calendarField, offset); + mDateTime = mSimpleDateFormat.format(c.getTime()); + } catch (Exception e) { + e.printStackTrace(); + } + return mDateTime; + + } + + /** + * 描述:计算两个日期所差的天数. + * + * @param milliseconds1 the milliseconds1 + * @param milliseconds2 the milliseconds2 + * @return int 所差的天数 + */ + public static int getOffectDay(long milliseconds1, long milliseconds2) { + Calendar calendar1 = Calendar.getInstance(); + calendar1.setTimeInMillis(milliseconds1); + Calendar calendar2 = Calendar.getInstance(); + calendar2.setTimeInMillis(milliseconds2); + //先判断是否同年 + int y1 = calendar1.get(Calendar.YEAR); + int y2 = calendar2.get(Calendar.YEAR); + int d1 = calendar1.get(Calendar.DAY_OF_YEAR); + int d2 = calendar2.get(Calendar.DAY_OF_YEAR); + int maxDays = 0; + int day = 0; + if (y1 - y2 > 0) { + maxDays = calendar2.getActualMaximum(Calendar.DAY_OF_YEAR); + day = d1 - d2 + maxDays; + } else if (y1 - y2 < 0) { + maxDays = calendar1.getActualMaximum(Calendar.DAY_OF_YEAR); + day = d1 - d2 - maxDays; + } else { + day = d1 - d2; + } + return day; + } + + /** + * 描述:计算两个日期所差的小时数. + * + * @param date1 第一个时间的毫秒表示 + * @param date2 第二个时间的毫秒表示 + * @return int 所差的小时数 + */ + public static int getOffectHour(long date1, long date2) { + Calendar calendar1 = Calendar.getInstance(); + calendar1.setTimeInMillis(date1); + Calendar calendar2 = Calendar.getInstance(); + calendar2.setTimeInMillis(date2); + int h1 = calendar1.get(Calendar.HOUR_OF_DAY); + int h2 = calendar2.get(Calendar.HOUR_OF_DAY); + int h = 0; + int day = getOffectDay(date1, date2); + h = h1-h2+day*24; + return h; + } + + /** + * 描述:计算两个日期所差的分钟数. + * + * @param date1 第一个时间的毫秒表示 + * @param date2 第二个时间的毫秒表示 + * @return int 所差的分钟数 + */ + public static int getOffectMinutes(long date1, long date2) { + Calendar calendar1 = Calendar.getInstance(); + calendar1.setTimeInMillis(date1); + Calendar calendar2 = Calendar.getInstance(); + calendar2.setTimeInMillis(date2); + int m1 = calendar1.get(Calendar.MINUTE); + int m2 = calendar2.get(Calendar.MINUTE); + int h = getOffectHour(date1, date2); + int m = 0; + m = m1-m2+h*60; + return m; + } + + /** + * 描述:获取本周一. + * + * @param format the format + * @return String String类型日期时间 + */ + public static String getFirstDayOfWeek(String format) { + return getDayOfWeek(format,Calendar.MONDAY); + } + + /** + * 描述:获取本周日. + * + * @param format the format + * @return String String类型日期时间 + */ + public static String getLastDayOfWeek(String format) { + return getDayOfWeek(format,Calendar.SUNDAY); + } + + /** + * 描述:获取本周的某一天. + * + * @param format the format + * @param calendarField the calendar field + * @return String String类型日期时间 + */ + private static String getDayOfWeek(String format,int calendarField) { + String strDate = null; + try { + Calendar c = new GregorianCalendar(); + SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format); + int week = c.get(Calendar.DAY_OF_WEEK); + if (week == calendarField){ + strDate = mSimpleDateFormat.format(c.getTime()); + }else{ + int offectDay = calendarField - week; + if (calendarField == Calendar.SUNDAY) { + offectDay = 7-Math.abs(offectDay); + } + c.add(Calendar.DATE, offectDay); + strDate = mSimpleDateFormat.format(c.getTime()); + } + } catch (Exception e) { + e.printStackTrace(); + } + return strDate; + } + + /** + * 描述:获取本月第一天. + * + * @param format the format + * @return String String类型日期时间 + */ + public static String getFirstDayOfMonth(String format) { + String strDate = null; + try { + Calendar c = new GregorianCalendar(); + SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format); + //当前月的第一天 + c.set(GregorianCalendar.DAY_OF_MONTH, 1); + strDate = mSimpleDateFormat.format(c.getTime()); + } catch (Exception e) { + e.printStackTrace(); + } + return strDate; + + } + + /** + * 描述:获取本月最后一天. + * + * @param format the format + * @return String String类型日期时间 + */ + public static String getLastDayOfMonth(String format) { + String strDate = null; + try { + Calendar c = new GregorianCalendar(); + SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format); + // 当前月的最后一天 + c.set(Calendar.DATE, 1); + c.roll(Calendar.DATE, -1); + strDate = mSimpleDateFormat.format(c.getTime()); + } catch (Exception e) { + e.printStackTrace(); + } + return strDate; + } + + + + /** + * 描述:获取表示当前日期的0点时间毫秒数. + * + * @return the first time of day + */ + public static long getFirstTimeOfDay() { + Date date = null; + try { + String currentDate = getCurrentDate(dateFormatYMD); + date = getDateByFormat(currentDate+" 00:00:00",dateFormatYMDHMS); + return date.getTime(); + } catch (Exception e) { + } + return -1; + } + + /** + * 描述:获取表示当前日期24点时间毫秒数. + * + * @return the last time of day + */ + public static long getLastTimeOfDay() { + Date date = null; + try { + String currentDate = getCurrentDate(dateFormatYMD); + date = getDateByFormat(currentDate+" 24:00:00",dateFormatYMDHMS); + return date.getTime(); + } catch (Exception e) { + } + return -1; + } + + /** + * 描述:判断是否是闰年() + *

    (year能被4整除 并且 不能被100整除) 或者 year能被400整除,则该年为闰年. + * + * @param year 年代(如2012) + * @return boolean 是否为闰年 + */ + public static boolean isLeapYear(int year) { + if ((year % 4 == 0 && year % 400 != 0) || year % 400 == 0) { + return true; + } else { + return false; + } + } + + + /** + * 判断是否是当年的活动是的话去掉年份,否则返回带年份结果 + * @param strDate 时间字符串 + * @param formatBefor 输入时间字符串格式 + * @param formatAfter 输出时间字符串格式 + * @return + */ + public static String friendlyTime(String strDate, String formatBefor, String formatAfter){ + strDate = getStringByFormat(strDate,formatBefor,formatAfter); +// strDate = getStringByFormat(strDate,"yyyy-MM-dd HH:mm","yyyy年MM月dd日 HH:mm"); + String strYearDate; + Time t=new Time(); + t.setToNow(); + int year = Integer.parseInt(strDate.substring(0,4)); + if(year == t.year){ + strYearDate = strDate.substring(5); + }else{ + strYearDate = strDate; + } + return strYearDate; + } + + + /** + * 描述:根据时间返回格式化后的时间的描述. + * 小于1小时显示多少分钟前 大于1小时显示今天+实际日期,大于今天全部显示实际时间 + * + * @param strDate the str date + * @param inFormat the in format + * @param outFormat the out format + * @return + */ + public static String formatDateStr2Desc(String strDate,String inFormat,String outFormat) { + + DateFormat df = new SimpleDateFormat(inFormat); + Calendar c1 = Calendar.getInstance(); + Calendar c2 = Calendar.getInstance(); + try { + c2.setTime(df.parse(strDate)); + c1.setTime(new Date()); + int d = getOffectDay(c1.getTimeInMillis(), c2.getTimeInMillis()); + if(d==0){ + int h = getOffectHour(c1.getTimeInMillis(), c2.getTimeInMillis()); + if(h>0){ + return "今天"+getStringByFormat(strDate,inFormat,dateFormatHM); + //return h + "小时前"; + }else if(h<0){ + //return Math.abs(h) + "小时后"; + }else if(h==0){ + int m = getOffectMinutes(c1.getTimeInMillis(), c2.getTimeInMillis()); + if(m>0){ + return m + "分钟前"; + }else if(m<0){ + //return Math.abs(m) + "分钟后"; + }else{ + return "刚刚"; + } + } + + }else if(d>0){ + if(d == 1){ + return "昨天"+getStringByFormat(strDate,inFormat,dateFormatHM); + }else if(d==2){ + return "前天"+getStringByFormat(strDate,inFormat,dateFormatHM); + } + } + + String out = getStringByFormat(strDate,inFormat,outFormat); + if(!JqStrUtil.isEmpty(out)){ + return out; + } + } catch (Exception e) { + } + + return strDate; + } + + + /** + * 取指定日期为星期几. + * + * @param strDate 指定日期 + * @param inFormat 指定日期格式 + * @return String 星期几 + */ + public static String getWeekNumber(String strDate,String inFormat) { + String week = "星期日"; + Calendar calendar = new GregorianCalendar(); + DateFormat df = new SimpleDateFormat(inFormat); + try { + calendar.setTime(df.parse(strDate)); + } catch (Exception e) { + return "错误"; + } + int intTemp = calendar.get(Calendar.DAY_OF_WEEK) - 1; + switch (intTemp){ + case 0: + week = "星期日"; + break; + case 1: + week = "星期一"; + break; + case 2: + week = "星期二"; + break; + case 3: + week = "星期三"; + break; + case 4: + week = "星期四"; + break; + case 5: + week = "星期五"; + break; + case 6: + week = "星期六"; + break; + } + return week; + } + + /** + * 根据给定的日期判断是否为上下午. + * + * @param strDate the str date + * @param format the format + * @return the time quantum + */ + public static String getTimeQuantum(String strDate, String format) { + Date mDate = getDateByFormat(strDate, format); + int hour = mDate.getHours(); + if(hour >=12) + return "PM"; + else + return "AM"; + } + + /** + * 根据给定的毫秒数算得时间的描述. + * + * @param milliseconds the milliseconds + * @return the time description + */ + public static String getTimeDescription(long milliseconds) { + if(milliseconds > 1000){ + //大于一分 + if(milliseconds/1000/60>1){ + long minute = milliseconds/1000/60; + long second = milliseconds/1000%60; + return minute+"分"+second+"秒"; + }else{ + //显示秒 + return milliseconds/1000+"秒"; + } + }else{ + return milliseconds+"毫秒"; + } + } + + /** + * 判断某个时间是否为过去时间 + * @param s1 + * @return + * @throws Exception + */ + public static boolean isPastDate(String s1) throws Exception { + //设定时间的模板 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + //得到指定模范的时间 + Date d1 = sdf.parse(s1); + Date d2 = new Date(System.currentTimeMillis()); + //比较 + if(d1.getTime() - d2.getTime() < 0) { + return true; + }else{ + return false; + } + } + + /** + * 判断两个时间的前后顺序 + * @param s1,s2 + * @return + * @throws Exception + */ + public static boolean d1InFrontOfd2(String s1,String s2) throws Exception { + //设定时间的模板 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + //得到指定模范的时间 + Date d1 = sdf.parse(s1); + Date d2 = sdf.parse(s2); + //比较 + if(d1.getTime() - d2.getTime() <= 0) { + return true; + }else{ + return false; + } + } + + /** + * 根据秒数获取时分秒 + * @param time + * @return + */ + public static String secToTime(int time) { + String timeStr = null; + int hour = 0; + int minute = 0; + int second = 0; + if (time <= 0) + return "00:00"; + else { + minute = time / 60; + if (minute < 60) { + second = time % 60; + timeStr = unitFormat(minute) + ":" + unitFormat(second); + } else { + hour = minute / 60; + if (hour > 99) + return "99:59:59"; + minute = minute % 60; + second = time - hour * 3600 - minute * 60; + timeStr = unitFormat(hour) + ":" + unitFormat(minute) + ":" + unitFormat(second); + } + } + return timeStr; + } + + /** + * 获取时分秒的map数据 + * @param time + * @return + */ + public static Map secToTimeMap(int time) { +// String timeStr = null; + int hour = 0; + int minute = 0; + int second = 0; + Map timeMap = new HashMap<>(); + if (time <= 0){ + timeMap.put("hour","00"); + timeMap.put("min","00"); + timeMap.put("sec","00"); + return timeMap; + } else { + minute = time / 60; + if (minute < 60) { + second = time % 60; + timeMap.put("hour","00"); + timeMap.put("min",unitFormat(minute)); + timeMap.put("sec",unitFormat(second)); +// timeStr = unitFormat(minute) + ":" + unitFormat(second); + return timeMap; + } else { + hour = minute / 60; + if (hour > 99){ + timeMap.put("hour","99"); + timeMap.put("min","59"); + timeMap.put("sec","59"); + return timeMap; +// return "99:59:59"; + } + minute = minute % 60; + second = time - hour * 3600 - minute * 60; + timeMap.put("hour",unitFormat(hour)); + timeMap.put("min",unitFormat(minute)); + timeMap.put("sec",unitFormat(second)); + return timeMap; +// timeStr = unitFormat(hour) + ":" + unitFormat(minute) + ":" + unitFormat(second); + } + } +// return timeMap; + } + + public static String unitFormat(int i) { + String retStr = null; + if (i >= 0 && i < 10) + retStr = "0" + Integer.toString(i); + else + retStr = "" + i; + return retStr; + } + /** + * The main method. + * + * @param args the arguments + */ + public static void main(String[] args) { + System.out.println(formatDateStr2Desc("2012-3-2 12:2:20","yyyy-MM-dd HH:mm:ss","MM月dd日 HH:mm")); + System.out.println(getDateByFormat("2012-3-2 12:2:20","yyyy-MM-dd HH:mm:ss")); + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/AliPayResult.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/AliPayResult.java new file mode 100644 index 0000000000000000000000000000000000000000..759aa7e4c3cdd3a053e2934cafe44fa67df5fb86 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/AliPayResult.java @@ -0,0 +1 @@ +package com.jiuqi.elove.util; import java.util.Map; import android.text.TextUtils; /** * 支付宝支付结果 */ public class AliPayResult { private String resultStatus; private String result; private String memo; public AliPayResult(Map rawResult) { if (rawResult == null) { return; } for (String key : rawResult.keySet()) { if (TextUtils.equals(key, "resultStatus")) { resultStatus = rawResult.get(key); } else if (TextUtils.equals(key, "result")) { result = rawResult.get(key); } else if (TextUtils.equals(key, "memo")) { memo = rawResult.get(key); } } } @Override public String toString() { return "resultStatus={" + resultStatus + "};memo={" + memo + "};result={" + result + "}"; } /** * @return the resultStatus */ public String getResultStatus() { return resultStatus; } /** * @return the memo */ public String getMemo() { return memo; } /** * @return the result */ public String getResult() { return result; } } \ No newline at end of file diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/AppPhoneUtil.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/AppPhoneUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..0311780a99f0933ca37c54c44625d93e310b0911 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/AppPhoneUtil.java @@ -0,0 +1,40 @@ +package com.jiuqi.elove.util; + +import android.content.Context; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.application.EloveApplication; + +/** + * 获取app和手机信息 + * Created by dl on 2017/7/7. + */ +public class AppPhoneUtil { + + public static String getVersionCode() { + try { + PackageManager manager = EloveApplication.getAppContext().getPackageManager(); + PackageInfo info = manager.getPackageInfo(EloveApplication.getAppContext().getPackageName(), 0); + return String.valueOf(info.versionCode); + } catch (Exception e) { + e.printStackTrace(); + return EloveApplication.getAppContext().getString(R.string.version_error); + } + } + + /** + * 获取版本号 + */ + public static String getVersion(Context context) { + try { + PackageManager manager = context.getPackageManager(); + PackageInfo info = manager.getPackageInfo(context.getPackageName(), 0); + return "v"+info.versionName; + } catch (Exception e) { + e.printStackTrace(); + return context.getString(R.string.version_error); + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/AuthTest.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/AuthTest.java new file mode 100644 index 0000000000000000000000000000000000000000..9306923085d693826bc7474b83b818719d679637 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/AuthTest.java @@ -0,0 +1,53 @@ +package com.jiuqi.elove.util; + +import android.content.Context; +import android.util.Log; + +import com.duanqu.qupai.auth.AuthService; +import com.duanqu.qupai.auth.QupaiAuthListener; +import com.jiuqi.elove.common.Constant; + +/** + * 趣拍 + */ +public class AuthTest { + + private static AuthTest instance; + + public static AuthTest getInstance() { + if (instance == null) { + instance = new AuthTest(); + } + return instance; + } + + private static final String AUTHTAG = "QupaiAuth"; + + /** + * 鉴权 建议只调用一次,在demo里面为了测试调用了多次 得到accessToken,通常一个用户对应一个token + * @param context + * @param appKey appkey + * @param appsecret appsecret + * @param space space + */ + public void initAuth(Context context , String appKey, String appsecret, String space){ + Log.e("Live","accessToken" + Constant.accessToken); + Log.e("Live","space" + Constant.space); + + AuthService service = AuthService.getInstance(); + service.setQupaiAuthListener(new QupaiAuthListener() { + @Override + public void onAuthError(int errorCode, String message) { + Log.e(AUTHTAG, "ErrorCode" + errorCode + "message" + message); + } + + @Override + public void onAuthComplte(int responseCode, String responseMessage) { + Log.e(AUTHTAG, "onAuthComplte" + responseCode + "message" + responseMessage); + Constant.accessToken = responseMessage; + } + }); + service.startAuth(context,appKey, appsecret, space); + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/BdLocationHelper.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/BdLocationHelper.java new file mode 100644 index 0000000000000000000000000000000000000000..7a876cb2ab91b71532f2f3cf4eb24f892fdb60cd --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/BdLocationHelper.java @@ -0,0 +1,85 @@ +package com.jiuqi.elove.util; + +import android.content.Context; + +import com.baidu.location.BDLocation; +import com.baidu.location.BDLocationListener; +import com.baidu.location.LocationClient; +import com.baidu.location.LocationClientOption; + +/** + * 百度地图工具类 + * Created by dl on 2017/5/5. + */ +public class BdLocationHelper { + + private LocationClient mLocationClient; + private int span; + private onSuccessLocate mOnSuccessLocate; + + public BdLocationHelper(Context context,int span){ + mLocationClient = new LocationClient(context); + this.span = span; + LocationClientOption option = setOption(); + mLocationClient.setLocOption(option); + } + + private LocationClientOption setOption(){ + LocationClientOption option = new LocationClientOption(); + option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);//可选,默认Hight_Accuracy,设置定位模式有高精度,低功耗,仅设备这三种 + option.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系,百度手机地图对外接口中的坐标系默认是bd09ll + option.setScanSpan(span);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的 + option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要,所以需要手动设置,否则获取不到丰富的位置信息 + option.setOpenGps(true);//可选,默认false,设置是否使用gps + option.setLocationNotify(true);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果 + option.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近” + option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到 + option.setIgnoreKillProcess(false);//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死 + option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集 + option.setEnableSimulateGps(false);//可选,默认false,设置是否需要过滤gps仿真结果,默认需要 + return option; + } + + public void setListener(onSuccessLocate mOnSuccessLocate){ + this.mOnSuccessLocate = mOnSuccessLocate; + } + + /** + * 注册定位监听listener + */ + public void registerLocationListener(){ + mLocationClient.registerLocationListener(new BDLocationListener() {//注册监听函数 + @Override + public void onReceiveLocation(BDLocation bdLocation) { + int stateCode = bdLocation.getLocType(); + if(stateCode==161){ + mOnSuccessLocate.handle(bdLocation); + } + } + }); + } + + /** + * 启动定位 + */ + public void startLocate(){ + mLocationClient.start(); + } + + /** + * 停止定位,并释放client + */ + public void stopLocate(){ + if (mLocationClient!=null){ + mLocationClient.stop(); + mLocationClient = null; + } + } + + /** + * 接口,提供给外部处理定位得到的location对象 + */ + public interface onSuccessLocate{ + void handle(BDLocation bdLocation); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/BitmapUtils.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/BitmapUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..0c95cb0255d8556c08fa1e91bf5a04484e7a9ace --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/BitmapUtils.java @@ -0,0 +1,236 @@ +package com.jiuqi.elove.util; + +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.util.DisplayMetrics; +import android.util.TypedValue; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.net.URLConnection; + +/** + * + * Created by liulin on 2016/8/12. + */ +public class BitmapUtils { + + //压缩图片尺寸 + public static Bitmap compressBySize(String pathName, int targetWidth, + int targetHeight) { + BitmapFactory.Options options = new BitmapFactory.Options(); + options.inJustDecodeBounds = true;// 不去真的解析图片,只是获取图片的头部信息,包含宽高等; + Bitmap bitmap = BitmapFactory.decodeFile(pathName, options); + // 得到图片的宽度、高度; + float imgWidth = options.outWidth; + float imgHeight = options.outHeight; + // 分别计算图片宽度、高度与目标宽度、高度的比例;取大于等于该比例的最小整数; + int widthRatio = (int) Math.ceil(imgWidth / (float) targetWidth); + int heightRatio = (int) Math.ceil(imgHeight / (float) targetHeight); + options.inSampleSize = 1; + // 如果尺寸接近则不压缩,否则进行比例压缩 + if (widthRatio > 1 || widthRatio > 1) { + if (widthRatio > heightRatio) { + options.inSampleSize = widthRatio; + } else { + options.inSampleSize = heightRatio; + } + } + //设置好缩放比例后,加载图片进内容; + options.inJustDecodeBounds = false; // 这里一定要设置false + bitmap = BitmapFactory.decodeFile(pathName, options); + return bitmap; + } + + //压缩图片尺寸 + public static Bitmap compressBySize(Resources res,int resId, int targetWidth, + int targetHeight) { + BitmapFactory.Options options = new BitmapFactory.Options(); + options.inJustDecodeBounds = true;// 不去真的解析图片,只是获取图片的头部信息,包含宽高等; + Bitmap bitmap = BitmapFactory.decodeResource(res,resId,options); + // 得到图片的宽度、高度; + float imgWidth = options.outWidth; + float imgHeight = options.outHeight; + // 分别计算图片宽度、高度与目标宽度、高度的比例;取大于等于该比例的最小整数; + int widthRatio = (int) Math.ceil(imgWidth / (float) targetWidth); + int heightRatio = (int) Math.ceil(imgHeight / (float) targetHeight); + options.inSampleSize = 1; + // 如果尺寸接近则不压缩,否则进行比例压缩 + if (widthRatio > 1 || widthRatio > 1) { + if (widthRatio > heightRatio) { + options.inSampleSize = widthRatio; + } else { + options.inSampleSize = heightRatio; + } + } + //设置好缩放比例后,加载图片进内容; + options.inJustDecodeBounds = false; // 这里一定要设置false + bitmap = BitmapFactory.decodeResource(res,resId, options); + return bitmap; + } + + public static Bitmap decodeResource(Resources resources, int id) { + + int densityDpi = resources.getDisplayMetrics().densityDpi; + Bitmap bitmap; + TypedValue value = new TypedValue(); + resources.openRawResource(id, value); + BitmapFactory.Options opts = new BitmapFactory.Options(); + opts.inPreferredConfig = Bitmap.Config.ALPHA_8; + if (densityDpi > DisplayMetrics.DENSITY_HIGH) { + opts.inTargetDensity = value.density; + bitmap = BitmapFactory.decodeResource(resources, id, opts); + }else{ + bitmap = BitmapFactory.decodeResource(resources, id); + } + + return bitmap; + } + // //计算图片的缩放值 +// public static int calculateInSampleSize(BitmapFactory.Options options,int reqWidth, int reqHeight) { +// final int height = options.outHeight; +// final int width = options.outWidth; +// int inSampleSize = 1; +// +// if (height > reqHeight || width > reqWidth) { +// final int heightRatio = Math.round((float) height/ (float) reqHeight); +// final int widthRatio = Math.round((float) width / (float) reqWidth); +// inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio; +// } +// return inSampleSize; +// } +//把bitmap转换成String + public static Bitmap compressBitmapToSmall(Bitmap bitmap) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + bitmap.compress(Bitmap.CompressFormat.JPEG, 40, baos); + byte[] b = baos.toByteArray(); + return bitmap; + } + + /** + * Get bitmap from specified image path + * + * @param imgPath + * @return + */ + public static Bitmap getBitmap(String imgPath) { + // Get bitmap through image path + BitmapFactory.Options newOpts = new BitmapFactory.Options(); + newOpts.inJustDecodeBounds = false; + newOpts.inPurgeable = true; + newOpts.inInputShareable = true; + // Do not compress + newOpts.inSampleSize = 1; + newOpts.inPreferredConfig = Bitmap.Config.RGB_565; + return BitmapFactory.decodeFile(imgPath, newOpts); + } + + /** + * 是否需要压缩图片 + * + * @param path + * @return + * @throws Exception + */ + + public boolean isompress(String path) throws Exception { + if (null != path && !path.equals("")) { + // Bitmap bmp = BitmapFactory.decodeFile(path); + File file = new File(path); + FileInputStream fs = new FileInputStream(file); + int len = fs.available() / 1024; + if (len < 100) { + return false; + } else { + return true; + } + } + return false; + } + + //压缩图片质量 + public Bitmap compressImage(Bitmap bitmap) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中 + int options = 100; + while (baos.toByteArray().length / 1024 > 200) { //循环判断如果压缩后图片是否大于200kb,大于继续压缩 + baos.reset();//重置baos即清空baos + bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中 + options -= 10;//每次都减少10 + } + ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中 + Bitmap bitmap2 = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream数据生成图片 + return bitmap2; + } + + public static ByteArrayOutputStream compressImageFromBitmap(Bitmap image,int sizekb) { + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + image.compress(Bitmap.CompressFormat.JPEG, 30, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中 + int options = 30; + while (options>10&&baos.toByteArray().length / 1024!=0&&baos.toByteArray().length / 1024>sizekb) { //循环判断如果压缩后图片是否大于100kb,大于继续压缩 + baos.reset();//重置baos即清空baos + image.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中 + options -= 10;//每次都减少10 + } + while(options>0&&baos.toByteArray().length / 1024!=0&&baos.toByteArray().length / 1024>sizekb){ + baos.reset();//重置baos即清空baos + image.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中 + options -= 5;//每次都减少10 + } +// ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中 +// Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream数据生成图片 + return baos; + } + + public static byte[] convertBitmap2Byte(Bitmap image) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中 + return baos.toByteArray(); + } + + /** + * 加载本地图片 + * http://bbs.3gstdy.com + * @param path + * @return + */ + public static Bitmap getLoacalBitmap(String path) { + try { + FileInputStream fis = new FileInputStream(path); + return BitmapFactory.decodeStream(fis); + } catch (FileNotFoundException e) { + e.printStackTrace(); + return null; + } + } + + /** + * @param urlpath + * @return Bitmap + * 根据图片url获取图片对象 + */ + public static Bitmap getBitMapFromUrl(String urlpath) { + Bitmap map = null; + try { + URL url = new URL(urlpath); + URLConnection conn = url.openConnection(); + conn.connect(); + InputStream in; + in = conn.getInputStream(); + map = BitmapFactory.decodeStream(in); + // TODO Auto-generated catch block + } catch (IOException e) { + e.printStackTrace(); + } + return map; + } + +} \ No newline at end of file diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/BlurImageview.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/BlurImageview.java new file mode 100644 index 0000000000000000000000000000000000000000..01b9d273ef8188ff3149cbd656ade7b1a2cd41d1 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/BlurImageview.java @@ -0,0 +1,144 @@ +package com.jiuqi.elove.util; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; + +/** + * 模糊图片方法 + * Created by FanWenXia on 2016/9/7. + */ +public class BlurImageview { + /** 水平方向模糊度 */ + private static float hRadius = 10; + /** 竖直方向模糊度 */ + private static float vRadius = 10; + /** 模糊迭代度 */ + private static int iterations = 10; + + /** + * 图片高斯模糊处理  + */ + public static Drawable BlurImages (Bitmap bmp, Context context) { + + int width = bmp.getWidth(); + int height = bmp.getHeight(); + int[] inPixels = new int[width * height]; + int[] outPixels = new int[width * height]; + Bitmap bitmap = Bitmap. createBitmap(width, height, + Bitmap.Config. ARGB_8888); + bmp.getPixels(inPixels, 0, width, 0, 0, width, height); + for ( int i = 0; i < iterations; i++) { + blur(inPixels, outPixels, width, height, hRadius); + blur(outPixels, inPixels, height, width, vRadius); + } + blurFractional(inPixels, outPixels, width, height, hRadius); + blurFractional(outPixels, inPixels, height, width, vRadius); + bitmap.setPixels(inPixels, 0, width, 0, 0, width, height); + Drawable drawable = new BitmapDrawable(context.getResources(), bitmap); + return drawable; + } + + /** + * 图片高斯模糊算法 + */ + public static void blur(int[] in, int[] out, int width, int height, + float radius) { + int widthMinus1 = width - 1; + int r = ( int) radius; + int tableSize = 2 * r + 1; + int divide[] = new int[256 * tableSize]; + + for ( int i = 0; i < 256 * tableSize; i++) + divide[i] = i / tableSize; + + int inIndex = 0; + + for ( int y = 0; y < height; y++) { + int outIndex = y; + int ta = 0, tr = 0, tg = 0, tb = 0; + + for ( int i = -r; i <= r; i++) { + int rgb = in[inIndex + clamp(i, 0, width - 1)]; + ta += (rgb >> 24) & 0xff; + tr += (rgb >> 16) & 0xff; + tg += (rgb >> 8) & 0xff; + tb += rgb & 0xff; + } + + for ( int x = 0; x < width; x++) { + out[outIndex] = (divide[ta] << 24) | (divide[tr] << 16) + | (divide[tg] << 8) | divide[tb]; + + int i1 = x + r + 1; + if (i1 > widthMinus1) + i1 = widthMinus1; + int i2 = x - r; + if (i2 < 0) + i2 = 0; + int rgb1 = in[inIndex + i1]; + int rgb2 = in[inIndex + i2]; + + ta += ((rgb1 >> 24) & 0xff) - ((rgb2 >> 24) & 0xff); + tr += ((rgb1 & 0xff0000) - (rgb2 & 0xff0000)) >> 16; + tg += ((rgb1 & 0xff00) - (rgb2 & 0xff00)) >> 8; + tb += (rgb1 & 0xff) - (rgb2 & 0xff); + outIndex += height; + } + inIndex += width; + } + } + + /** + * 图片高斯模糊算法  + */ + public static void blurFractional( int[] in, int[] out, int width, + int height, float radius) { + radius -= ( int) radius; + float f = 1.0f / (1 + 2 * radius); + int inIndex = 0; + + for ( int y = 0; y < height; y++) { + int outIndex = y; + + out[outIndex] = in[0]; + outIndex += height; + for ( int x = 1; x < width - 1; x++) { + int i = inIndex + x; + int rgb1 = in[i - 1]; + int rgb2 = in[i]; + int rgb3 = in[i + 1]; + + int a1 = (rgb1 >> 24) & 0xff; + int r1 = (rgb1 >> 16) & 0xff; + int g1 = (rgb1 >> 8) & 0xff; + int b1 = rgb1 & 0xff; + int a2 = (rgb2 >> 24) & 0xff; + int r2 = (rgb2 >> 16) & 0xff; + int g2 = (rgb2 >> 8) & 0xff; + int b2 = rgb2 & 0xff; + int a3 = (rgb3 >> 24) & 0xff; + int r3 = (rgb3 >> 16) & 0xff; + int g3 = (rgb3 >> 8) & 0xff; + int b3 = rgb3 & 0xff; + a1 = a2 + ( int) ((a1 + a3) * radius); + r1 = r2 + ( int) ((r1 + r3) * radius); + g1 = g2 + ( int) ((g1 + g3) * radius); + b1 = b2 + ( int) ((b1 + b3) * radius); + a1 *= f; + r1 *= f; + g1 *= f; + b1 *= f; + out[outIndex] = (a1 << 24) | (r1 << 16) | (g1 << 8) | b1; + outIndex += height; + } + out[outIndex] = in[width - 1]; + inIndex += width; + } + } + + public static int clamp(int x, int a, int b) { + return (x < a) ? a : (x > b) ? b : x; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/CommonUtil.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/CommonUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..2c5e80c17bdf1e27e0eb871c9a9ee4072505b13d --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/CommonUtil.java @@ -0,0 +1,682 @@ +package com.jiuqi.elove.util; + +import android.app.Activity; +import android.app.ActivityManager; +import android.app.ProgressDialog; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.media.MediaMetadataRetriever; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; +import android.os.Build; +import android.os.Environment; +import android.util.Base64; +import android.util.DisplayMetrics; +import android.util.Log; +import android.view.Display; +import android.view.View; +import android.view.WindowManager; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.TextView; + +import com.bumptech.glide.Glide; +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.Constant; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Method; +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +/** + * + * Created by dl on 2016/8/25. + */ +public class CommonUtil { + + //是否连接WIFI + public static boolean isWifiConnected(Context context) + { + ConnectivityManager connectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkInfo wifiNetworkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); + if(wifiNetworkInfo.isConnected()) + { + return true ; + } + + return false ; + } + + /** + * 检查当前网络是否可用 + * + * @param context + * @return + */ + + public static boolean isNetworkAvailable(Context context) + { + + // 获取手机所有连接管理对象(包括对wi-fi,net等连接的管理) + ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); + + if (connectivityManager == null) + { + return false; + } + else + { + // 获取NetworkInfo对象 + NetworkInfo[] networkInfo = connectivityManager.getAllNetworkInfo(); + + if (networkInfo != null && networkInfo.length > 0) + { + for (int i = 0; i < networkInfo.length; i++) + { + // 判断当前网络状态是否为连接状态 + if (networkInfo[i].getState() == NetworkInfo.State.CONNECTED) + { + return true; + } + } + } + } + return false; + } + + + /** + * 代码生成progressbar + */ + public static ProgressDialog createProgressBar(Context context) { + ProgressDialog progressBar = new ProgressDialog(context); + progressBar.setCancelable(true); + progressBar.setMessage("请稍候 ..."); + progressBar.setProgressStyle(ProgressDialog.STYLE_SPINNER); + progressBar.setProgress(0); + progressBar.setMax(100); + return progressBar; + } + + /** + * 判断进程是否运行 + * @return + */ + public static boolean isProessRunning(Context context, String proessName) { + + boolean isRunning = false; + ActivityManager am = (ActivityManager) context + .getSystemService(Context.ACTIVITY_SERVICE); + + List lists = am.getRunningAppProcesses(); + for (ActivityManager.RunningAppProcessInfo info : lists) { + if (info.processName.equals(proessName)) { + isRunning = true; + } + } + + return isRunning; + } + + /** + * 判断是否在前台 + * @param context + * @return + */ + public static boolean isRunningForeground(Context context){ + ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); + ComponentName cn = am.getRunningTasks(1).get(0).topActivity; + String currentPackageName = cn.getPackageName(); + if(currentPackageName != null && currentPackageName.equals(context.getPackageName())){ + return true; + } + return false; + } + + /** + * 检查手机上是否安装了指定的软件 + * @param context + * @param packageName:应用包名 + * @return + */ + public static boolean isAvilible(Context context, String packageName){ + //获取packagemanager + final PackageManager packageManager = context.getPackageManager(); + //获取所有已安装程序的包信息 + List packageInfos = packageManager.getInstalledPackages(0); + //用于存储所有已安装程序的包名 + List packageNames = new ArrayList(); + //从pinfo中将包名字逐一取出,压入pName list中 + if(packageInfos != null){ + for(int i = 0; i < packageInfos.size(); i++){ + String packName = packageInfos.get(i).packageName; + packageNames.add(packName); + } + } + //判断packageNames中是否有目标程序的包名,有TRUE,没有FALSE + return packageNames.contains(packageName); + } + + public static void goToNaviActivity(Context context,String sourceApplication , String slat , String slon ,String dlat , String dlon ,String dev , String style,String dname){ + StringBuffer stringBuffer = new StringBuffer("androidamap://route?sourceApplication=") + .append(sourceApplication); + stringBuffer.append("&slat=").append(slat) + .append("&slon=").append(slon) + .append("&sname=").append("当前位置") + .append("&dlat=").append(dlat) + .append("&dlon=").append(dlon) + .append("&dname=").append(dname) + .append("&dev=").append(dev) + .append("&t=").append(style); + Intent intent = new Intent("android.intent.action.VIEW", android.net.Uri.parse(stringBuffer.toString())); + intent.setPackage("com.autonavi.minimap"); + context.startActivity(intent); + } + + /** + * 网页版百度地图 有经纬度 + * @param originLat + * @param originLon + * @param originName ->注:必填 + * @param desLat + * @param desLon + * @param destination + * @param region : 当给定region时,认为起点和终点都在同一城市,除非单独给定起点或终点的城市。-->注:必填,不填不会显示导航路线 + * @param appName + * @return + */ + public static String getWebBaiduMapUri(String originLat, String originLon, String originName, String desLat, String desLon, String destination, String region, String appName) { + String uri = "http://api.map.baidu.com/direction?origin=latlng:%1$s,%2$s|name:%3$s" + + "&destination=latlng:%4$s,%5$s|name:%6$s&mode=driving®ion=%7$s&output=html" + + "&src=%8$s"; + return String.format(uri, originLat, originLon, originName, desLat, desLon, destination, region, appName); + } + + /** + * 获取打开百度地图应用uri [http://lbsyun.baidu.com/index.php?title=uri/api/android] + * @param originLat + * @param originLon + * @param desLat + * @param desLon + * @return + */ + public static String getBaiduMapUri(String originLat, String originLon, String originName, String desLat, String desLon, String destination, String region, String src){ + String uri = "intent://map/direction?origin=latlng:%1$s,%2$s|name:%3$s" + + "&destination=latlng:%4$s,%5$s|name:%6$s&mode=driving®ion=%7$s&src=%8$s#Intent;" + + "scheme=bdapp;package=com.baidu.BaiduMap;end"; + + return String.format(uri, originLat, originLon, originName, desLat, desLon, destination, region, src); + } + + /** + * 获取打开高德地图应用uri + */ + public static String getGdMapUri(String appName, String slat, String slon, String sname, String dlat, String dlon, String dname){ + String uri = "androidamap://route?sourceApplication=%1$s&slat=%2$s&slon=%3$s&sname=%4$s&dlat=%5$s&dlon=%6$s&dname=%7$s&dev=0&m=0&t=2"; + return String.format(uri, appName, slat, slon, sname, dlat, dlon, dname); + } + + /** + * 百度地图定位经纬度转高德经纬度 + * @param bd_lat + * @param bd_lon + * @return + */ + public static double[] bdToGaoDe(double bd_lat, double bd_lon) { + double[] gd_lat_lon = new double[2]; + double PI = 3.14159265358979324 * 3000.0 / 180.0; + double x = bd_lon - 0.0065, y = bd_lat - 0.006; + double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * PI); + double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * PI); + gd_lat_lon[0] = z * Math.cos(theta); + gd_lat_lon[1] = z * Math.sin(theta); + return gd_lat_lon; + } + + /** + * 高德地图定位经纬度转百度经纬度 + * @param gd_lon + * @param gd_lat + * @return + */ + public static double[] gaoDeToBaidu(double gd_lon, double gd_lat) { + double[] bd_lat_lon = new double[2]; + double PI = 3.14159265358979324 * 3000.0 / 180.0; + double x = gd_lon, y = gd_lat; + double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * PI); + double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * PI); + bd_lat_lon[0] = z * Math.cos(theta) + 0.0065; + bd_lat_lon[1] = z * Math.sin(theta) + 0.006; + return bd_lat_lon; + } + + /** + * 根据手机的分辨率从 dp 的单位 转成为 px(像素) + */ + public static int dip2px(Context context, float dpValue) { + final float scale = context.getResources().getDisplayMetrics().density; + return (int) (dpValue * scale + 0.5f); + } + + /** + * 根据手机的分辨率从 px(像素) 的单位 转成为 dp + */ + public static int px2dip(Context context, float pxValue) { + final float scale = context.getResources().getDisplayMetrics().density; + return (int) (pxValue / scale + 0.5f); + } + + public static boolean isHaveNavigationBar(Context context) { + + boolean isHave = false; + Resources rs = context.getResources(); + int id = rs.getIdentifier("config_showNavigationBar", "bool", "android"); + if (id > 0) { +// hasNavigationBar = rs.getBoolean(id); + } + try { + Class systemPropertiesClass = Class.forName("android.os.SystemProperties"); + Method m = systemPropertiesClass.getMethod("get", String.class); + String navBarOverride = (String) m.invoke(systemPropertiesClass, "qemu.hw.mainkeys"); + if ("1".equals(navBarOverride)) { + isHave = false; + } else if ("0".equals(navBarOverride)) { + isHave = true; + } + } catch (Exception e) { + Log.w("TAG", e); + } + + + return isHave; + } + + /** + * 此方法在模拟器还是在真机都是完全正确 + * + * @param activity + * @return + */ + public static boolean navigationBarExist(Activity activity) { + WindowManager windowManager = activity.getWindowManager(); + Display d = windowManager.getDefaultDisplay(); + + DisplayMetrics realDisplayMetrics = new DisplayMetrics(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + d.getRealMetrics(realDisplayMetrics); + } + + int realHeight = realDisplayMetrics.heightPixels; + int realWidth = realDisplayMetrics.widthPixels; + + DisplayMetrics displayMetrics = new DisplayMetrics(); + d.getMetrics(displayMetrics); + + int displayHeight = displayMetrics.heightPixels; + int displayWidth = displayMetrics.widthPixels; + + return (realWidth - displayWidth) > 0 || (realHeight - displayHeight) > 0; + } + + public static void transportStatus(Activity context){ + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + context.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + if (!navigationBarExist(context)){ + context.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); + }else{ + hideBottomUIMenu(context); + } + } + } + + /** + * 隐藏虚拟按键,并且全屏 + */ + public static void hideBottomUIMenu(Activity context) { + //隐藏虚拟按键,并且全屏 + if (Build.VERSION.SDK_INT > 11 && Build.VERSION.SDK_INT < 19) { // lower api + View v = context.getWindow().getDecorView(); + v.setSystemUiVisibility(View.GONE); + } else if (Build.VERSION.SDK_INT >= 19) { + //for new api versions. + View decorView = context.getWindow().getDecorView(); + int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_FULLSCREEN; + decorView.setSystemUiVisibility(uiOptions); + } + } + + /** + * 获取版本号 + */ + public static String getVersion(Context context) { + try { + PackageManager manager = context.getPackageManager(); + PackageInfo info = manager.getPackageInfo(context.getPackageName(), 0); + return "v"+info.versionName; + } catch (Exception e) { + e.printStackTrace(); + return context.getString(R.string.version_error); + } + } + + /** + * 给出url,获取视频的第一帧 + * + * @param url 网络地址路径 + * @return bitmap + */ + public static Bitmap getVideoThumbnail(String url,int width,int height) { + Bitmap bitmap = null; + //MediaMetadataRetriever 是android中定义好的一个类,提供了统一 + //的接口,用于从输入的媒体文件中取得帧和元数据; + MediaMetadataRetriever retriever = new MediaMetadataRetriever(); + try { + //根据文件路径获取缩略图 + retriever.setDataSource(url, new HashMap()); + //获得第一帧图片 + bitmap = retriever.getFrameAtTime(); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } finally { + retriever.release(); + } + if (bitmap == null) { + return null; + } + bitmap = Bitmap.createScaledBitmap(bitmap, width, height, true); + return bitmap; + } + + /** + * 给出url,获取视频的第一帧 + * + * @param url + * @return + */ + public static Bitmap getVideoThumbnail(String url) { + Bitmap bitmap = null; + //MediaMetadataRetriever 是android中定义好的一个类,提供了统一 + //的接口,用于从输入的媒体文件中取得帧和元数据; + MediaMetadataRetriever retriever = new MediaMetadataRetriever(); + try { + //根据文件路径获取缩略图 + retriever.setDataSource(url, new HashMap()); + //获得第一帧图片 + bitmap = retriever.getFrameAtTime(); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } finally { + retriever.release(); + } + return bitmap; + } + + /** + * 获取本地视频的第一帧 + * + * @param filePath 本地视频路径 + * @return bitmap + */ + public static Bitmap getLocalVideoThumbnail(String filePath) { + Bitmap bitmap = null; + //MediaMetadataRetriever 是android中定义好的一个类,提供了统一 + //的接口,用于从输入的媒体文件中取得帧和元数据; + MediaMetadataRetriever retriever = new MediaMetadataRetriever(); + try { + //根据文件路径获取缩略图 + retriever.setDataSource(filePath); + //获得第一帧图片 + bitmap = retriever.getFrameAtTime(); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } finally { + retriever.release(); + } + return bitmap; + } + + /** + * 获取文件夹大小 + * + * @return long + * @throws Exception + */ + public static long getFileSize(File file) throws Exception { + long size = 0; + File flist[] = file.listFiles(); + for (int i = 0; i < flist.length; i++) { + if (flist[i].isDirectory()) { + size = size + getFileSize(flist[i]); + } else { + size = size + flist[i].length(); + } + } + return size; + } + + /** + * 转换文件大小单位 + * @param fileS + * @return + */ + public static String FormetFileSize(long fileS) {// 转换文件大小 + DecimalFormat df = new DecimalFormat("#.00"); + String fileSizeString = ""; + if(fileS<=0){ + fileSizeString = ""; + }else if (fileS < 1024) { + fileSizeString = df.format((double) fileS) + "B"; + } else if (fileS < 1048576) { + fileSizeString = df.format((double) fileS / 1024) + "K"; + } else if (fileS < 1073741824) { + fileSizeString = df.format((double) fileS / 1048576) + "M"; + } else { + fileSizeString = df.format((double) fileS / 1073741824) + "G"; + } + return fileSizeString; + } + + /** + * 删除所有缓存文件. + * + * @return true, if successful + */ + public static boolean removeAllFileCache() { + + try { + if (!isCanUseSD()) { + return false; + } + + File path = Environment.getExternalStorageDirectory(); + File fileDirectory = new File(path.getAbsolutePath() + Constant.ELOVE_FILE_DIR); + File[] files = fileDirectory.listFiles(); + if (files == null) { + return true; + } + for (int i = 0; i < files.length; i++) { + files[i].delete(); + } + } catch (Exception e) { + e.printStackTrace(); + return false; + } + return true; + } + + /** + * 递归删除 + * @param file + * @return + */ + public static boolean removeFileCache(File file){ + try { + if (!isCanUseSD()) { + return false; + } + File[] files = file.listFiles(); + if (files == null) { + return true; + } + for (int i = 0; i < files.length; i++) { + if(files[i].isDirectory()){ + removeFileCache(files[i]); + }else{ + files[i].delete(); + } + } + } catch (Exception e) { + e.printStackTrace(); + return false; + } + return true; + } + + /** + * 描述:SD卡是否能用. + * + * @return true 可用,false不可用 + */ + public static boolean isCanUseSD() { + try { + return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED); + } catch (Exception e) { + e.printStackTrace(); + } + return false; + } + + /** + * 读取文本数据 + * + * @param context + * 程序上下文 + * @param fileName + * 文件名 + * @return String, 读取到的文本内容,失败返回null + */ + public static String readAssets(Context context, String fileName) + { + InputStream is = null; + String content = null; + try + { + is = context.getAssets().open(fileName); + if (is != null) + { + + byte[] buffer = new byte[1024]; + ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream(); + while (true) + { + int readLength = is.read(buffer); + if (readLength == -1) break; + arrayOutputStream.write(buffer, 0, readLength); + } + is.close(); + arrayOutputStream.close(); + content = new String(arrayOutputStream.toByteArray()); + + } + } + catch (FileNotFoundException e) + { + e.printStackTrace(); + } + catch (IOException e) + { + e.printStackTrace(); + content = null; + } + finally + { + try + { + if (is != null) is.close(); + } + catch (IOException ioe) + { + ioe.printStackTrace(); + } + } + return content; + } + + public static void setGiftDrawable(Context mContext,String name,ImageView iv){ + if(":qiyuan01:".equals(name)){ + Glide.with(mContext).load(R.drawable.lw_cjd).error(R.drawable.img_hx_avatar).into(iv); + }else if(":qiyuan02:".equals(name)){ + Glide.with(mContext).load(R.drawable.lw_fw).error(R.drawable.img_hx_avatar).into(iv); + }else if(":qiyuan03:".equals(name)){ + Glide.with(mContext).load(R.drawable.lw_dz).error(R.drawable.img_hx_avatar).into(iv); + }else if(":qiyuan04:".equals(name)){ + Glide.with(mContext).load(R.drawable.lw_mg1).error(R.drawable.img_hx_avatar).into(iv); + }else if(":qiyuan05:".equals(name)){ + Glide.with(mContext).load(R.drawable.lw_bbt).error(R.drawable.img_hx_avatar).into(iv); + }else if(":qiyuan06:".equals(name)){ + Glide.with(mContext).load(R.drawable.lw_pj).error(R.drawable.img_hx_avatar).into(iv); + }else if(":qiyuan07:".equals(name)){ + Glide.with(mContext).load(R.drawable.lw_as).error(R.drawable.img_hx_avatar).into(iv); + }else if(":qiyuan08:".equals(name)){ + Glide.with(mContext).load(R.drawable.lw_dg).error(R.drawable.img_hx_avatar).into(iv); + }else if(":qiyuan09:".equals(name)){ + Glide.with(mContext).load(R.drawable.lw_mg3).error(R.drawable.img_hx_avatar).into(iv); + }else if(":qiyuan10:".equals(name)){ + Glide.with(mContext).load(R.drawable.lw_qkl).error(R.drawable.img_hx_avatar).into(iv); + }else if(":qiyuan11:".equals(name)){ + Glide.with(mContext).load(R.drawable.lw_dsg).error(R.drawable.img_hx_avatar).into(iv); + }else if(":qiyuan12:".equals(name)){ + Glide.with(mContext).load(R.drawable.lw_kh).error(R.drawable.img_hx_avatar).into(iv); + }else if(":qiyuan13:".equals(name)){ + Glide.with(mContext).load(R.drawable.lw_mg99).error(R.drawable.img_hx_avatar).into(iv); + }else if(":qiyuan14:".equals(name)){ + Glide.with(mContext).load(R.drawable.lw_jz).error(R.drawable.img_hx_avatar).into(iv); + }else if(":qiyuan15:".equals(name)){ + Glide.with(mContext).load(R.drawable.lw_fj).error(R.drawable.img_hx_avatar).into(iv); + }else if(":qiyuan16:".equals(name)){ + Glide.with(mContext).load(R.drawable.lw_yt).error(R.drawable.img_hx_avatar).into(iv); + }else{ + Glide.with(mContext).load(R.drawable.img_hx_avatar).error(R.drawable.img_hx_avatar).into(iv); + } + } + + public static String bitmap2StrByBase64(Bitmap bit,int percent){ + ByteArrayOutputStream bos=new ByteArrayOutputStream(); + bit.compress(Bitmap.CompressFormat.JPEG, percent, bos);//参数100表示不压缩 + byte[] bytes=bos.toByteArray(); + return Base64.encodeToString(bytes, Base64.DEFAULT); + } + + public static byte[] bitmap2Byte(Bitmap bit,int percent){ + ByteArrayOutputStream bos=new ByteArrayOutputStream(); + bit.compress(Bitmap.CompressFormat.JPEG, percent, bos);//参数100表示不压缩 + return bos.toByteArray(); + } + + public static String getStrFromTv(TextView tv){ + return tv.getText().toString().trim(); + } + public static String getStrFromEt(EditText tv){ + return tv.getText().toString().trim(); + } + public static void setSex(TextView tv,String sex){ + if(Constant.GIRL.equals(sex)){ + tv.setText("女"); + }else{ + tv.setText("男"); + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/DemoModel.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/DemoModel.java new file mode 100644 index 0000000000000000000000000000000000000000..0211d8e58f040f9e8f64532e8b007d8834b883db --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/DemoModel.java @@ -0,0 +1,253 @@ +package com.jiuqi.elove.util; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import android.content.Context; + +import com.hyphenate.easeui.domain.EaseUser; + +/** + * 环信相关的实体对象 + */ +public class DemoModel { +// UserDao dao = null; + protected Context context = null; + protected Map valueCache = new HashMap(); + + public DemoModel(Context ctx){ + context = ctx; + PreferenceManager.init(context); + } + + public boolean saveContactList(List contactList) { +// UserDao dao = new UserDao(context); +// dao.saveContactList(contactList); + return true; + } + +// public Map getContactList() { +// UserDao dao = new UserDao(context); +// return dao.getContactList(); +// } + +// public void saveContact(EaseUser user){ +// UserDao dao = new UserDao(context); +// dao.saveContact(user); +// } + + /** + * save current username + * @param username + */ + public void setCurrentUserName(String username){ + PreferenceManager.getInstance().setCurrentUserName(username); + } + + public String getCurrentUsernName(){ + return PreferenceManager.getInstance().getCurrentUsername(); + } + +// public Map getRobotList(){ +// UserDao dao = new UserDao(context); +// return dao.getRobotUser(); +// } + +// public boolean saveRobotList(List robotList){ +// UserDao dao = new UserDao(context); +// dao.saveRobotUser(robotList); +// return true; +// } + + public void setSettingMsgNotification(boolean paramBoolean) { + PreferenceManager.getInstance().setSettingMsgNotification(paramBoolean); + valueCache.put(Key.VibrateAndPlayToneOn, paramBoolean); + } + + public boolean getSettingMsgNotification() { + Object val = valueCache.get(Key.VibrateAndPlayToneOn); + + if(val == null){ + val = PreferenceManager.getInstance().getSettingMsgNotification(); + valueCache.put(Key.VibrateAndPlayToneOn, val); + } + + return (Boolean) (val != null?val:true); + } + + public void setSettingMsgSound(boolean paramBoolean) { + PreferenceManager.getInstance().setSettingMsgSound(paramBoolean); + valueCache.put(Key.PlayToneOn, paramBoolean); + } + + public boolean getSettingMsgSound() { + Object val = valueCache.get(Key.PlayToneOn); + + if(val == null){ + val = PreferenceManager.getInstance().getSettingMsgSound(); + valueCache.put(Key.PlayToneOn, val); + } + + return (Boolean) (val != null?val:true); + } + + public void setSettingMsgVibrate(boolean paramBoolean) { + PreferenceManager.getInstance().setSettingMsgVibrate(paramBoolean); + valueCache.put(Key.VibrateOn, paramBoolean); + } + + public boolean getSettingMsgVibrate() { + Object val = valueCache.get(Key.VibrateOn); + + if(val == null){ + val = PreferenceManager.getInstance().getSettingMsgVibrate(); + valueCache.put(Key.VibrateOn, val); + } + + return (Boolean) (val != null?val:true); + } + + public void setSettingMsgSpeaker(boolean paramBoolean) { + PreferenceManager.getInstance().setSettingMsgSpeaker(paramBoolean); + valueCache.put(Key.SpakerOn, paramBoolean); + } + + public boolean getSettingMsgSpeaker() { + Object val = valueCache.get(Key.SpakerOn); + + if(val == null){ + val = PreferenceManager.getInstance().getSettingMsgSpeaker(); + valueCache.put(Key.SpakerOn, val); + } + + return (Boolean) (val != null?val:true); + } + + +// public void setDisabledGroups(List groups){ +// if(dao == null){ +// dao = new UserDao(context); +// } +// +// List list = new ArrayList(); +// list.addAll(groups); +// //直接删除groups的内容,可能会有并发的错误 +// synchronized (list) { +// for(int i = 0; i < list.size(); i++){ +// if(EaseAtMessageHelper.get().getAtMeGroups().contains(list.get(i))){ +// list.remove(i); +// i--; +// } +// } +// } +// +// dao.setDisabledGroups(list); +// valueCache.put(Key.DisabledGroups, list); +// } + +// public List getDisabledGroups(){ +// Object val = valueCache.get(Key.DisabledGroups); +// +// if(dao == null){ +// dao = new UserDao(context); +// } +// +// if(val == null){ +// val = dao.getDisabledGroups(); +// valueCache.put(Key.DisabledGroups, val); +// } +// +// return (List) val; +// } +// +// public void setDisabledIds(List ids){ +// if(dao == null){ +// dao = new UserDao(context); +// } +// +// dao.setDisabledIds(ids); +// valueCache.put(Key.DisabledIds, ids); +// } +// +// public List getDisabledIds(){ +// Object val = valueCache.get(Key.DisabledIds); +// +// if(dao == null){ +// dao = new UserDao(context); +// } +// +// if(val == null){ +// val = dao.getDisabledIds(); +// valueCache.put(Key.DisabledIds, val); +// } +// +// return (List) val; +// } + + public void setGroupsSynced(boolean synced){ + PreferenceManager.getInstance().setGroupsSynced(synced); + } + + public boolean isGroupsSynced(){ + return PreferenceManager.getInstance().isGroupsSynced(); + } + + public void setContactSynced(boolean synced){ + PreferenceManager.getInstance().setContactSynced(synced); + } + + public boolean isContactSynced(){ + return PreferenceManager.getInstance().isContactSynced(); + } + + public void setBlacklistSynced(boolean synced){ + PreferenceManager.getInstance().setBlacklistSynced(synced); + } + + public boolean isBacklistSynced(){ + return PreferenceManager.getInstance().isBacklistSynced(); + } + + public void allowChatroomOwnerLeave(boolean value){ + PreferenceManager.getInstance().setSettingAllowChatroomOwnerLeave(value); + } + + public boolean isChatroomOwnerLeaveAllowed(){ + return PreferenceManager.getInstance().getSettingAllowChatroomOwnerLeave(); + } + + public void setDeleteMessagesAsExitGroup(boolean value) { + PreferenceManager.getInstance().setDeleteMessagesAsExitGroup(value); + } + + public boolean isDeleteMessagesAsExitGroup() { + return PreferenceManager.getInstance().isDeleteMessagesAsExitGroup(); + } + + public void setAutoAcceptGroupInvitation(boolean value) { + PreferenceManager.getInstance().setAutoAcceptGroupInvitation(value); + } + + public boolean isAutoAcceptGroupInvitation() { + return PreferenceManager.getInstance().isAutoAcceptGroupInvitation(); + } + + + public void setAdaptiveVideoEncode(boolean value) { + PreferenceManager.getInstance().setAdaptiveVideoEncode(value); + } + + public boolean isAdaptiveVideoEncode() { + return PreferenceManager.getInstance().isAdaptiveVideoEncode(); + } + + enum Key{ + VibrateAndPlayToneOn, + VibrateOn, + PlayToneOn, + SpakerOn, + DisabledGroups, + DisabledIds + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/EaseHxHelper.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/EaseHxHelper.java new file mode 100644 index 0000000000000000000000000000000000000000..933f7f79bae5e224b97b47dc5313941d5d4a6f9d --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/EaseHxHelper.java @@ -0,0 +1,1457 @@ +package com.jiuqi.elove.util; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Hashtable; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +//import com.easemob.redpacketui.RedPacketConstant; +//import com.easemob.redpacketui.utils.RedPacketUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.hyphenate.EMCallBack; +import com.hyphenate.EMConnectionListener; +import com.hyphenate.EMContactListener; +import com.hyphenate.EMError; +import com.hyphenate.EMGroupChangeListener; +import com.hyphenate.EMMessageListener; +import com.hyphenate.EMValueCallBack; +import com.hyphenate.chat.EMClient; +import com.hyphenate.chat.EMCmdMessageBody; +import com.hyphenate.chat.EMGroup; +import com.hyphenate.chat.EMMessage; +import com.hyphenate.chat.EMMessage.ChatType; +import com.hyphenate.chat.EMMessage.Status; +import com.hyphenate.chat.EMMessage.Type; +import com.hyphenate.chat.EMOptions; +import com.hyphenate.chat.EMTextMessageBody; +//import com.hyphenate.chatuidemo.db.DemoDBManager; +//import com.hyphenate.chatuidemo.db.InviteMessgeDao; +//import com.hyphenate.chatuidemo.db.UserDao; +//import com.hyphenate.chatuidemo.domain.EmojiconExampleGroupData; +//import com.hyphenate.chatuidemo.domain.InviteMessage; +//import com.hyphenate.chatuidemo.domain.InviteMessage.InviteMesageStatus; +//import com.hyphenate.chatuidemo.domain.RobotUser; +//import com.hyphenate.chatuidemo.parse.UserProfileManager; +//import com.hyphenate.chatuidemo.receiver.CallReceiver; +//import com.hyphenate.chatuidemo.ui.ChatActivity; +//import com.hyphenate.chatuidemo.ui.MainActivity; +//import com.hyphenate.chatuidemo.ui.VideoCallActivity; +//import com.hyphenate.chatuidemo.ui.VoiceCallActivity; +//import com.hyphenate.chatuidemo.utils.PreferenceManager; +import com.hyphenate.easeui.controller.EaseUI; +import com.hyphenate.easeui.controller.EaseUI.EaseEmojiconInfoProvider; +import com.hyphenate.easeui.controller.EaseUI.EaseSettingsProvider; +import com.hyphenate.easeui.controller.EaseUI.EaseUserProfileProvider; +import com.hyphenate.easeui.domain.EaseEmojicon; +import com.hyphenate.easeui.domain.EaseUser; +import com.hyphenate.easeui.model.EaseAtMessageHelper; +import com.hyphenate.easeui.model.EaseNotifier; +import com.hyphenate.easeui.model.EaseNotifier.EaseNotificationInfoProvider; +import com.hyphenate.easeui.utils.EaseCommonUtils; +import com.hyphenate.exceptions.HyphenateException; +import com.hyphenate.util.EMLog; +import com.jiuqi.elove.R; +import com.jiuqi.elove.activity.ChatActivity; +import com.jiuqi.elove.activity.MainActivity; +import com.jiuqi.elove.application.EloveApplication; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.dao.InviteMessgeDao; +import com.jiuqi.elove.dao.UserDao; +import com.jiuqi.elove.db.DemoDBManager; +import com.jiuqi.elove.entity.ChatPersonModel; +import com.jiuqi.elove.entity.InviteMessage; + +import android.app.Activity; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.SharedPreferences; +import android.support.v4.content.LocalBroadcastManager; +import android.text.TextUtils; +import android.util.Log; + +public class EaseHxHelper { + + /** + * 环信登录 + */ + public static void hxLogin(String userId){ + String emcUsername = userId.toLowerCase(); + if(TextUtils.isEmpty(emcUsername)){ + JqStrUtil.showToast(EloveApplication.getAppContext(),"登录失败"); + return; + } + EMClient.getInstance().login(emcUsername, emcUsername, new EMCallBack() {//回调 + @Override + public void onSuccess() { + EMClient.getInstance().groupManager().loadAllGroups(); + EMClient.getInstance().chatManager().loadAllConversations(); + Log.d("main", "登录聊天服务器成功!"); + } + @Override + public void onProgress(int progress, String status) { + + } + @Override + public void onError(int code, String message) { + Log.d("main", "登录聊天服务器失败!"); + } + }); + } + + /** + * 环信退出 + */ + public static void hxLogout(){ + EMClient.getInstance().logout(true, new EMCallBack() { + @Override + public void onSuccess() { + Log.d(TAG, "onSuccess: 环信退出成功"); + } + + @Override + public void onError(int i, String s) { + + } + @Override + public void onProgress(int i, String s) { + + } + }); + } + /** + * data sync listener + */ + static public interface DataSyncListener { + /** + * sync complete + * @param success true:data sync successful,false: failed to sync data + */ + public void onSyncComplete(boolean success); + } + + public static int unreadGroupMsg = 0; + protected static final String TAG = "EaseHxHelper"; + + private EaseUI easeUI; + + + + /** + * EMEventListener + */ + protected EMMessageListener messageListener = null; + + private Map contactList; + +// private Map robotList; + +// private UserProfileManager userProManager; + + private static EaseHxHelper instance = null; + + private DemoModel demoModel = null; + + /** + * sync groups status listener + */ + private List syncGroupsListeners; + /** + * sync contacts status listener + */ + private List syncContactsListeners; + /** + * sync blacklist status listener + */ + private List syncBlackListListeners; + + private boolean isSyncingGroupsWithServer = false; + private boolean isSyncingContactsWithServer = false; + private boolean isSyncingBlackListWithServer = false; + private boolean isGroupsSyncedWithServer = false; + private boolean isContactsSyncedWithServer = false; + private boolean isBlackListSyncedWithServer = false; + + public boolean isVoiceCalling; + public boolean isVideoCalling; + + private String username; + + private Context appContext; + +// private CallReceiver callReceiver; + + private EMConnectionListener connectionListener; + + private InviteMessgeDao inviteMessgeDao; + private UserDao userDao; + + private LocalBroadcastManager broadcastManager; + + private boolean isGroupAndContactListenerRegisted; + + private EaseHxHelper() { + } + + public synchronized static EaseHxHelper getInstance() { + if (instance == null) { + instance = new EaseHxHelper(); + } + return instance; + } + private InviteMessage msg;//自己加的 + private EMMessage message; + /** + * init helper + * + * @param context + * application context + */ + public void init(Context context) { + demoModel = new DemoModel(context); + EMOptions options = initChatOptions(); + //use default options if options is null + if (EaseUI.getInstance().init(context, options)) { + appContext = context; + + //debug mode, you'd better set it to false, if you want release your App officially. + EMClient.getInstance().setDebugMode(false); + //get easeui instance + easeUI = EaseUI.getInstance(); + //to set user's profile and avatar + setEaseUIProviders(); + //initialize preference manager + PreferenceManager.init(context); + //initialize profile manager +// getUserProfileManager().init(context); + + EMClient.getInstance().callManager().getVideoCallHelper().setAdaptiveVideoFlag(getModel().isAdaptiveVideoEncode()); + + setGlobalListeners(); + broadcastManager = LocalBroadcastManager.getInstance(appContext); + initDbDao(); + } + } + + + private EMOptions initChatOptions(){ + Log.d(TAG, "init HuanXin Options"); + + EMOptions options = new EMOptions(); + // set if accept the invitation automatically + options.setAcceptInvitationAlways(false); + // set if you need read ack + options.setRequireAck(true); + // set if you need delivery ack + options.setRequireDeliveryAck(false); + + //you need apply & set your own id if you want to use google cloud messaging. +// options.setGCMNumber("324169311137"); + //you need apply & set your own id if you want to use Mi push notification +// options.setMipushConfig("2882303761517426801", "5381742660801"); +// options.setMipushConfig("2882303761517495452", "5391749597452"); + options.setMipushConfig("2882303761517514308", "5791751420308"); + //you need apply & set your own id if you want to use Huawei push notification +// options.setHuaweiPushAppId("10492024"); + + options.allowChatroomOwnerLeave(getModel().isChatroomOwnerLeaveAllowed()); + options.setDeleteMessagesAsExitGroup(getModel().isDeleteMessagesAsExitGroup()); + options.setAutoAcceptGroupInvitation(getModel().isAutoAcceptGroupInvitation()); + + return options; + } + + protected void setEaseUIProviders() { + // set profile provider if you want easeUI to handle avatar and nickname + easeUI.setUserProfileProvider(new EaseUserProfileProvider() { + + @Override + public EaseUser getUser(String username) { + return getUserInfo(username); + } + }); + + //set options + easeUI.setSettingsProvider(new EaseSettingsProvider() { + + @Override + public boolean isSpeakerOpened() { + return demoModel.getSettingMsgSpeaker(); + } + + @Override + public boolean isMsgVibrateAllowed(EMMessage message) { + return demoModel.getSettingMsgVibrate(); + } + + @Override + public boolean isMsgSoundAllowed(EMMessage message) { + return demoModel.getSettingMsgSound(); + } + + @Override + public boolean isMsgNotifyAllowed(EMMessage message) { + if(message == null){ + return demoModel.getSettingMsgNotification(); + } + if(!demoModel.getSettingMsgNotification()){ + return false; + }else{ + String chatUsename = null; + List notNotifyIds = null; + // get user or group id which was blocked to show message notifications + if (message.getChatType() == ChatType.Chat) { + chatUsename = message.getFrom(); +// notNotifyIds = demoModel.getDisabledIds(); + } else { + chatUsename = message.getTo(); +// notNotifyIds = demoModel.getDisabledGroups(); + } + + if (notNotifyIds == null || !notNotifyIds.contains(chatUsename)) { + return true; + } else { + return false; + } + } + } + }); + //set emoji icon provider + easeUI.setEmojiconInfoProvider(new EaseEmojiconInfoProvider() { + + @Override + public EaseEmojicon getEmojiconInfo(String emojiconIdentityCode) { +// EaseEmojiconGroupEntity data = EmojiconExampleGroupData.getData(); +// for(EaseEmojicon emojicon : data.getEmojiconList()){ +// if(emojicon.getIdentityCode().equals(emojiconIdentityCode)){ +// return emojicon; +// } +// } + return null; + } + + @Override + public Map getTextEmojiconMapping() { + return null; + } + }); + + //set notification options, will use default if you don't set it + easeUI.getNotifier().setNotificationInfoProvider(new EaseNotificationInfoProvider() { + + @Override + public String getTitle(EMMessage message) { + //you can update title here + return null; + } + + @Override + public int getSmallIcon(EMMessage message) { + //you can update icon here + return 0; + } + + @Override + public String getDisplayedText(EMMessage message) { + // be used on notification bar, different text according the message type. + String ticker = EaseCommonUtils.getMessageDigest(message, appContext); + if(message.getType() == Type.TXT){ + ticker = ticker.replaceAll("\\[.{2,3}\\]", "[表情]"); + } + EaseUser user = getUserInfo(message.getFrom());//看了getUserInfo肯定不为空 + if(user != null){ + if(EaseAtMessageHelper.get().isAtMeMsg(message)){ + return String.format(appContext.getString(R.string.at_your_in_group), user.getNick()); + } +// return user.getNick() + ": " + ticker;//源代码我给主掉了,不能显示id要显示昵称 + return message.getStringAttribute("nikename","") + ": " + ticker;//应该显示昵称 + }else{ + if(EaseAtMessageHelper.get().isAtMeMsg(message)){ + return String.format(appContext.getString(R.string.at_your_in_group), message.getFrom()); + } +// return message.getFrom() + ": " + ticker; + return message.getStringAttribute("nikename","") + ": " + ticker; + } + } + + @Override + public String getLatestText(EMMessage message, int fromUsersNum, int messageNum) { + // here you can customize the text. + // return fromUsersNum + "contacts send " + messageNum + "messages to you"; + return null; + } + + @Override + public Intent getLaunchIntent(EMMessage message) { + // you can set what activity you want display when user click the notification + Intent intent = new Intent(appContext, ChatActivity.class);//源代码 +// Intent intent = new Intent(appContext, MainActivity.class); +// intent.putExtra("notify","notify"); + // open calling activity if there is call + if(isVideoCalling){ +// intent = new Intent(appContext, VideoCallActivity.class); + }else if(isVoiceCalling){ +// intent = new Intent(appContext, VoiceCallActivity.class); + }else{ + ChatType chatType = message.getChatType(); + if (chatType == ChatType.Chat) { // single chat message + intent.putExtra("userId", message.getFrom()); + intent.putExtra("nikeName",message.getStringAttribute("nikename",""));//加一条,用于显示昵称 + intent.putExtra("chatType", Constant.CHATTYPE_SINGLE); + } else { // group chat message + // message.getTo() is the group id + intent.putExtra("userId", message.getTo()); + if(chatType == ChatType.GroupChat){ + intent.putExtra("chatType", Constant.CHATTYPE_GROUP); + }else{ +// intent.putExtra("chatType", Constant.CHATTYPE_CHATROOM); + } + + } + } + return intent; + } + }); + } + + /** + * set global listener + */ + protected void setGlobalListeners(){ + syncGroupsListeners = new ArrayList(); + syncContactsListeners = new ArrayList(); + syncBlackListListeners = new ArrayList(); + + isGroupsSyncedWithServer = demoModel.isGroupsSynced(); + isContactsSyncedWithServer = demoModel.isContactSynced(); + isBlackListSyncedWithServer = demoModel.isBacklistSynced(); + + // create the global connection listener + connectionListener = new EMConnectionListener() { + @Override + public void onDisconnected(int error) { + if (error == EMError.USER_REMOVED) { +// onCurrentAccountRemoved(); + }else if (error == EMError.USER_LOGIN_ANOTHER_DEVICE) { + onConnectionConflict(); + } + } + + @Override + public void onConnected() { + // in case group and contact were already synced, we supposed to notify sdk we are ready to receive the events + if(isGroupsSyncedWithServer && isContactsSyncedWithServer){ + EMLog.d(TAG, "group and contact already synced with servre"); + }else{ + if(!isGroupsSyncedWithServer){ + asyncFetchGroupsFromServer(null); + } + + if(!isContactsSyncedWithServer){ + asyncFetchContactsFromServer(null); + } + + if(!isBlackListSyncedWithServer){ + asyncFetchBlackListFromServer(null); + } + } + } + }; + + IntentFilter callFilter = new IntentFilter(EMClient.getInstance().callManager().getIncomingCallBroadcastAction()); +// if(callReceiver == null){ +// callReceiver = new CallReceiver(); +// } + + //register incoming call receiver +// appContext.registerReceiver(callReceiver, callFilter); + //register connection listener + EMClient.getInstance().addConnectionListener(connectionListener); + //register group and contact event listener + registerGroupAndContactListener(); + //register message event listener + registerMessageListener(); + + } + + private void initDbDao() { + inviteMessgeDao = new InviteMessgeDao(appContext); + userDao = new UserDao(appContext); + } + + /** + * register group and contact listener, you need register when login + */ + public void registerGroupAndContactListener(){ + if(!isGroupAndContactListenerRegisted){ + EMClient.getInstance().groupManager().addGroupChangeListener(new MyGroupChangeListener()); + EMClient.getInstance().contactManager().setContactListener(new MyContactListener()); + isGroupAndContactListenerRegisted = true; + } + + } + + private OkHttpUtil okHttpUtil = OkHttpUtil.getInstance(); + String getChatUrl = Constant.COMMON_URL + Interface.CHAT_INFO; + /** + * group change listener + */ + class MyGroupChangeListener implements EMGroupChangeListener { + + @Override + public void onInvitationReceived(String groupId, String groupName, String inviter, String reason) { + + new InviteMessgeDao(appContext).deleteMessage(groupId); + + // user invite you to join group + msg = new InviteMessage(); + msg.setFrom(groupId); + msg.setTime(System.currentTimeMillis()); + msg.setGroupId(groupId); + msg.setGroupName(groupName); + msg.setReason(reason); + msg.setGroupInviter(inviter); + msg.setStatus(InviteMessage.InviteMesageStatus.GROUPINVITATION); + JSONObject obj = new JSONObject(); + obj.put("userID",inviter); + obj.put("version",Constant.VERSION); + String param = JSON.toJSONString(obj); + okHttpUtil.sendJsonStrByPostAsync(appContext,false,getChatUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + Log.d(TAG, "onResponse: rsCode"+rsCode); + if ("1".equals(rsCode)){ + String result = jsonObject.getString("message"); + Log.d(TAG, "onResponse: message"+result); + ChatPersonModel model = JSON.parseObject(result,ChatPersonModel.class); + String nikeName = model.getNickname(); + msg.setNikename(nikeName); + notifyNewInviteMessage(msg); + broadcastManager.sendBroadcast(new Intent(Constant.ACTION_GROUP_CHANAGED)); + } + } + },null); + unreadGroupMsg++; +// msg.setGroupInviter(inviter); + Log.d(TAG, "receive invitation to join the group:" + groupName); + } + + @Override + public void onInvitationAccpted(String groupId, String invitee, String reason) { + + new InviteMessgeDao(appContext).deleteMessage(groupId); + + //user accept your invitation + boolean hasGroup = false; + EMGroup _group = null; + for (EMGroup group : EMClient.getInstance().groupManager().getAllGroups()) { + if (group.getGroupId().equals(groupId)) { + hasGroup = true; + _group = group; + break; + } + } + if (!hasGroup) + return; + + msg = new InviteMessage(); + msg.setFrom(groupId); + msg.setTime(System.currentTimeMillis()); + msg.setGroupId(groupId); + msg.setGroupName(_group == null ? groupId : _group.getGroupName()); + msg.setReason(reason); + msg.setGroupInviter(invitee); + Log.d(TAG, invitee + "Accept to join the group:" + _group == null ? groupId : _group.getGroupName()); + msg.setStatus(InviteMessage.InviteMesageStatus.GROUPINVITATION_ACCEPTED); + JSONObject obj = new JSONObject(); + obj.put("userID",invitee); + obj.put("version",Constant.VERSION); + String param = JSON.toJSONString(obj); + okHttpUtil.sendJsonStrByPostAsync(appContext,false,getChatUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + Log.d(TAG, "onResponse: rsCode"+rsCode); + if ("1".equals(rsCode)){ + String result = jsonObject.getString("message"); + Log.d(TAG, "onResponse: message"+result); + ChatPersonModel model = JSON.parseObject(result,ChatPersonModel.class); + String nikeName = model.getNickname(); + msg.setNikename(nikeName); + notifyNewInviteMessage(msg); + broadcastManager.sendBroadcast(new Intent(Constant.ACTION_GROUP_CHANAGED)); + } + } + },null); + unreadGroupMsg++; + } + + @Override + public void onInvitationDeclined(String groupId, String invitee, String reason) { + + new InviteMessgeDao(appContext).deleteMessage(groupId); + + //user declined your invitation + boolean hasGroup = false; + EMGroup group = null; + for (EMGroup _group : EMClient.getInstance().groupManager().getAllGroups()) { + if (_group.getGroupId().equals(groupId)) { + group = _group; + hasGroup = true; + break; + } + } + if (!hasGroup) + return; + + msg = new InviteMessage(); + msg.setFrom(groupId); + msg.setTime(System.currentTimeMillis()); + msg.setGroupId(groupId); + msg.setGroupName(group == null ? groupId : group.getGroupName()); + msg.setReason(reason); + msg.setGroupInviter(invitee); + Log.d(TAG, invitee + "Declined to join the group:" + group == null ? groupId : group.getGroupName()); + msg.setStatus(InviteMessage.InviteMesageStatus.GROUPINVITATION_DECLINED); + JSONObject obj = new JSONObject(); + obj.put("userID",invitee); + obj.put("version",Constant.VERSION); + String param = JSON.toJSONString(obj); + okHttpUtil.sendJsonStrByPostAsync(appContext,false,getChatUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + Log.d(TAG, "onResponse: rsCode"+rsCode); + if ("1".equals(rsCode)){ + String result = jsonObject.getString("message"); + Log.d(TAG, "onResponse: message"+result); + ChatPersonModel model = JSON.parseObject(result,ChatPersonModel.class); + String nikeName = model.getNickname(); + msg.setNikename(nikeName); + notifyNewInviteMessage(msg); + broadcastManager.sendBroadcast(new Intent(Constant.ACTION_GROUP_CHANAGED)); + } + } + },null); + unreadGroupMsg++; + } + + @Override + public void onUserRemoved(String groupId, String groupName) { + //user is removed from group + broadcastManager.sendBroadcast(new Intent(Constant.ACTION_GROUP_CHANAGED)); + } + + @Override + public void onGroupDestroy(String groupId, String groupName) { + // group is dismissed, + broadcastManager.sendBroadcast(new Intent(Constant.ACTION_GROUP_CHANAGED)); + } + + @Override + public void onApplicationReceived(String groupId, String groupName, String applyer, String reason) { + + // user apply to join group + msg = new InviteMessage(); + msg.setFrom(applyer); + msg.setTime(System.currentTimeMillis()); + msg.setGroupId(groupId); + msg.setGroupName(groupName); + msg.setReason(reason); + Log.d(TAG, applyer + " Apply to join group:" + groupName); + msg.setStatus(InviteMessage.InviteMesageStatus.BEAPPLYED); + JSONObject obj = new JSONObject(); + obj.put("userID",applyer); + obj.put("version",Constant.VERSION); + String param = JSON.toJSONString(obj); + okHttpUtil.sendJsonStrByPostAsync(appContext,false,getChatUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + Log.d(TAG, "onResponse: rsCode"+rsCode); + if ("1".equals(rsCode)){ + String result = jsonObject.getString("message"); + Log.d(TAG, "onResponse: message"+result); + ChatPersonModel model = JSON.parseObject(result,ChatPersonModel.class); + String nikeName = model.getNickname(); + msg.setNikename(nikeName); + notifyNewInviteMessage(msg); + broadcastManager.sendBroadcast(new Intent(Constant.ACTION_GROUP_CHANAGED)); + } + } + },null); + unreadGroupMsg++; +// notifyNewInviteMessage(msg); +// broadcastManager.sendBroadcast(new Intent(Constant.ACTION_GROUP_CHANAGED)); + + } + + @Override + public void onApplicationAccept(String groupId, String groupName, String accepter) { + + final String st4 = appContext.getString(R.string.Agreed_to_your_group_chat_application); + // your application was accepted + message = EMMessage.createReceiveMessage(Type.TXT); + message.setChatType(ChatType.GroupChat); +// message.setFrom(accepter); + message.setTo(groupId); + message.setMsgId(UUID.randomUUID().toString()); +// message.addBody(new EMTextMessageBody(accepter + " " +st4)); + message.setStatus(Status.SUCCESS); + JSONObject obj = new JSONObject(); + obj.put("userID",accepter); + obj.put("version",Constant.VERSION); + String param = JSON.toJSONString(obj); + okHttpUtil.sendJsonStrByPostAsync(appContext,false,getChatUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + Log.d(TAG, "onResponse: rsCode"+rsCode); + if ("1".equals(rsCode)){ + String result = jsonObject.getString("message"); + Log.d(TAG, "onResponse: message"+result); + ChatPersonModel model = JSON.parseObject(result,ChatPersonModel.class); + String nikeName = model.getNickname(); + String avatar = model.getAvatar(); + message.setFrom(nikeName); + message.addBody(new EMTextMessageBody(nikeName + " " +st4)); + message.setAttribute(Constant.SEND_ID,"");//群聊时添加的 + message.setAttribute(Constant.SEND_NAME,nikeName); + message.setAttribute(Constant.SEND_AVATAR,avatar); + message.setAttribute(Constant.RECEIVE_NAME,nikeName); + message.setAttribute(Constant.RECEIVE_AVATAR,avatar); + // save accept message + EMClient.getInstance().chatManager().saveMessage(message); + // notify the accept message + getNotifier().vibrateAndPlayTone(message); + broadcastManager.sendBroadcast(new Intent(Constant.ACTION_GROUP_CHANAGED)); + } + } + },null); + + + broadcastManager.sendBroadcast(new Intent(Constant.ACTION_GROUP_CHANAGED)); + } + + @Override + public void onApplicationDeclined(String groupId, String groupName, String decliner, String reason) { + // your application was declined, we do nothing here in demo + } + + @Override + public void onAutoAcceptInvitationFromGroup(String groupId, String inviter, String inviteMessage) { + // got an invitation + final String st3 = appContext.getString(R.string.Invite_you_to_join_a_group_chat); + message = EMMessage.createReceiveMessage(Type.TXT); + message.setChatType(ChatType.GroupChat); +// msg.setFrom(inviter); + message.setTo(groupId); + message.setMsgId(UUID.randomUUID().toString()); +// message.addBody(new EMTextMessageBody(inviter + " " +st3)); + message.setStatus(Status.SUCCESS); +// // save invitation as messages +// EMClient.getInstance().chatManager().saveMessage(message); +// // notify invitation message +// getNotifier().vibrateAndPlayTone(message); + EMLog.d(TAG, "onAutoAcceptInvitationFromGroup groupId:" + groupId); +// broadcastManager.sendBroadcast(new Intent(Constant.ACTION_GROUP_CHANAGED)); + JSONObject obj = new JSONObject(); + obj.put("userID",inviter); + obj.put("version",Constant.VERSION); + String param = JSON.toJSONString(obj); + okHttpUtil.sendJsonStrByPostAsync(appContext,false,getChatUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + Log.d(TAG, "onResponse: rsCode"+rsCode); + if ("1".equals(rsCode)){ + String result = jsonObject.getString("message"); + Log.d(TAG, "onResponse: message"+result); + ChatPersonModel model = JSON.parseObject(result,ChatPersonModel.class); + String nikeName = model.getNickname(); + String avatar = model.getAvatar(); + message.addBody(new EMTextMessageBody(nikeName + " " +st3)); + message.setAttribute(Constant.SEND_ID,"");//群聊时添加的 + message.setAttribute(Constant.SEND_NAME,nikeName); + message.setAttribute(Constant.SEND_AVATAR,avatar); + message.setAttribute(Constant.RECEIVE_NAME,nikeName); + message.setAttribute(Constant.RECEIVE_AVATAR,avatar); + // save invitation as messages + EMClient.getInstance().chatManager().saveMessage(message); + // notify invitation message + getNotifier().vibrateAndPlayTone(message); + broadcastManager.sendBroadcast(new Intent(Constant.ACTION_GROUP_CHANAGED)); + } + } + },null); + } + } + + /*** + * 好友变化listener + * + */ + public class MyContactListener implements EMContactListener { + + @Override + public void onContactAdded(String username) { + // save contact + Map localUsers = getContactList(); + Map toAddUsers = new HashMap(); + EaseUser user = new EaseUser(username); + + if (!localUsers.containsKey(username)) { + userDao.saveContact(user); + } + toAddUsers.put(username, user); + localUsers.putAll(toAddUsers); + + broadcastManager.sendBroadcast(new Intent(Constant.ACTION_CONTACT_CHANAGED)); + } + + @Override + public void onContactDeleted(String username) { + Map localUsers = EaseHxHelper.getInstance().getContactList(); + localUsers.remove(username); + userDao.deleteContact(username); + inviteMessgeDao.deleteMessage(username); + + broadcastManager.sendBroadcast(new Intent(Constant.ACTION_CONTACT_CHANAGED)); + } + + @Override + public void onContactInvited(String username, String reason) { + List msgs = inviteMessgeDao.getMessagesList(); + + for (InviteMessage inviteMessage : msgs) { + if (inviteMessage.getGroupId() == null && inviteMessage.getFrom().equals(username)) { + inviteMessgeDao.deleteMessage(username); + } + } + // save invitation as message + InviteMessage msg = new InviteMessage(); + msg.setFrom(username); + msg.setTime(System.currentTimeMillis()); + msg.setReason(reason); + Log.d(TAG, username + "apply to be your friend,reason: " + reason); + // set invitation status + msg.setStatus(InviteMessage.InviteMesageStatus.BEINVITEED); + notifyNewInviteMessage(msg); + broadcastManager.sendBroadcast(new Intent(Constant.ACTION_CONTACT_CHANAGED)); + } + + @Override + public void onContactAgreed(String username) { + List msgs = inviteMessgeDao.getMessagesList(); + for (InviteMessage inviteMessage : msgs) { + if (inviteMessage.getFrom().equals(username)) { + return; + } + } + // save invitation as message + InviteMessage msg = new InviteMessage(); + msg.setFrom(username); + msg.setTime(System.currentTimeMillis()); + Log.d(TAG, username + "accept your request"); + msg.setStatus(InviteMessage.InviteMesageStatus.BEAGREED); + notifyNewInviteMessage(msg); + broadcastManager.sendBroadcast(new Intent(Constant.ACTION_CONTACT_CHANAGED)); + } + + @Override + public void onContactRefused(String username) { + // your request was refused + Log.d(username, username + " refused to your request"); + } + } + + /** + * save and notify invitation message + * @param msg + */ + private void notifyNewInviteMessage(InviteMessage msg){ + if(inviteMessgeDao == null){ + inviteMessgeDao = new InviteMessgeDao(appContext); + } + inviteMessgeDao.saveMessage(msg); + //increase the unread message count + inviteMessgeDao.saveUnreadMessageCount(1); + // notify there is new message + getNotifier().vibrateAndPlayTone(null); + } + + /** + * user has logged into another device + */ + protected void onConnectionConflict(){ + Intent intent = new Intent(appContext, MainActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.putExtra(Constant.ACCOUNT_CONFLICT, true); + appContext.startActivity(intent); + } + + protected void onBanned(){ + Intent intent = new Intent(appContext, MainActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.putExtra("banned", true); + SpUtils.setBoolean("banned",true); + appContext.startActivity(intent); + } + + /** + * account is removed + */ +// protected void onCurrentAccountRemoved(){ +// Intent intent = new Intent(appContext, MainActivity.class); +// intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); +// intent.putExtra(Constant.ACCOUNT_REMOVED, true); +// appContext.startActivity(intent); +// } + + private EaseUser getUserInfo(String username){ + // To get instance of EaseUser, here we get it from the user list in memory + // You'd better cache it if you get it from your server + EaseUser user = null; + if(username.equals(EMClient.getInstance().getCurrentUser())) +// return getUserProfileManager().getCurrentUserInfo(); + user = getContactList().get(username); +// if(user == null && getRobotList() != null){ +// user = getRobotList().get(username); +// } + + // if user is not in your contacts, set inital letter for him/her + if(user == null){ + user = new EaseUser(username); + EaseCommonUtils.setUserInitialLetter(user); + } + return user; + } + + /** + * Global listener + * If this event already handled by an activity, you don't need handle it again + * activityList.size() <= 0 means all activities already in background or not in Activity Stack + */ + protected void registerMessageListener() { + messageListener = new EMMessageListener() { + private BroadcastReceiver broadCastReceiver = null; + + @Override + public void onMessageReceived(List messages) { + for (EMMessage message : messages) { + EMLog.d(TAG, "onMessageReceived id : " + message.getMsgId()); + // in background, do not refresh UI, notify it in notification bar + if(!easeUI.hasForegroundActivies()){ + getNotifier().onNewMsg(message); + } + String action = message.getStringAttribute("action",""); + if(Constant.PUSH_ACCOUNT_BANNED.equals(action)){ + onBanned(); + } + } + } + + @Override + public void onCmdMessageReceived(List messages) { + for (EMMessage message : messages) { + EMLog.d(TAG, "receive command message"); + //get message body + EMCmdMessageBody cmdMsgBody = (EMCmdMessageBody) message.getBody(); + final String action = cmdMsgBody.action();//get your predefined action + if(!easeUI.hasForegroundActivies()){ + //红包不介入 +// if (action.equals(RedPacketConstant.REFRESH_GROUP_RED_PACKET_ACTION)){ +// RedPacketUtil.receiveRedPacketAckMessage(message); +// broadcastManager.sendBroadcast(new Intent(RedPacketConstant.REFRESH_GROUP_RED_PACKET_ACTION)); +// } + } + //maybe you need get extension of your message + //message.getStringAttribute(""); + EMLog.d(TAG, String.format("Command:action:%s,message:%s", action,message.toString())); + } + } + + @Override + public void onMessageReadAckReceived(List messages) { + } + + @Override + public void onMessageDeliveryAckReceived(List message) { + } + + @Override + public void onMessageChanged(EMMessage message, Object change) { + + } + }; + + EMClient.getInstance().chatManager().addMessageListener(messageListener); + } + + /** + * if ever logged in + * + * @return + */ + public boolean isLoggedIn() { + return EMClient.getInstance().isLoggedInBefore(); + } + + /** + * logout + * + * @param unbindDeviceToken + * whether you need unbind your device token + * @param callback + * callback + */ + public void logout(boolean unbindDeviceToken, final EMCallBack callback) { + endCall(); + Log.d(TAG, "logout: " + unbindDeviceToken); + EMClient.getInstance().logout(unbindDeviceToken, new EMCallBack() { + + @Override + public void onSuccess() { + Log.d(TAG, "logout: onSuccess"); + reset(); + if (callback != null) { + callback.onSuccess(); + } + + } + + @Override + public void onProgress(int progress, String status) { + if (callback != null) { + callback.onProgress(progress, status); + } + } + + @Override + public void onError(int code, String error) { + Log.d(TAG, "logout: onSuccess"); + reset(); + if (callback != null) { + callback.onError(code, error); + } + } + }); + } + + /** + * get instance of EaseNotifier + * @return + */ + public EaseNotifier getNotifier(){ + return easeUI.getNotifier(); + } + + public DemoModel getModel(){ + return (DemoModel) demoModel; + } + + /** + * update contact list + * + * @param + */ + public void setContactList(Map aContactList) { + if(aContactList == null){ + if (contactList != null) { + contactList.clear(); + } + return; + } + + contactList = aContactList; + } + + /** + * save single contact + */ + public void saveContact(EaseUser user){ +// contactList.put(user.getUsername(), user); +// demoModel.saveContact(user); + } + + /** + * get contact list + * + * @return + */ + public Map getContactList() { + if (isLoggedIn() && contactList == null) { +// contactList = demoModel.getContactList(); + } + + // return a empty non-null object to avoid app crash + if(contactList == null){ + return new Hashtable(); + } + + return contactList; + } + + /** + * set current username + * @param username + */ + public void setCurrentUserName(String username){ + this.username = username; + demoModel.setCurrentUserName(username); + } + + /** + * get current user's id + */ + public String getCurrentUsernName(){ + if(username == null){ + username = demoModel.getCurrentUsernName(); + } + return username; + } +// +// public void setRobotList(Map robotList) { +// this.robotList = robotList; +// } +// +// public Map getRobotList() { +// if (isLoggedIn() && robotList == null) { +// robotList = demoModel.getRobotList(); +// } +// return robotList; +// } + + /** + * update user list to cache and database + * + * @param + */ + public void updateContactList(List contactInfoList) { + for (EaseUser u : contactInfoList) { + contactList.put(u.getUsername(), u); + } + ArrayList mList = new ArrayList(); + mList.addAll(contactList.values()); + demoModel.saveContactList(mList); + } + +// public UserProfileManager getUserProfileManager() { +// if (userProManager == null) { +// userProManager = new UserProfileManager(); +// } +// return userProManager; +// } + + void endCall() { + try { + EMClient.getInstance().callManager().endCall(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void addSyncGroupListener(DataSyncListener listener) { + if (listener == null) { + return; + } + if (!syncGroupsListeners.contains(listener)) { + syncGroupsListeners.add(listener); + } + } + + public void removeSyncGroupListener(DataSyncListener listener) { + if (listener == null) { + return; + } + if (syncGroupsListeners.contains(listener)) { + syncGroupsListeners.remove(listener); + } + } + + public void addSyncContactListener(DataSyncListener listener) { + if (listener == null) { + return; + } + if (!syncContactsListeners.contains(listener)) { + syncContactsListeners.add(listener); + } + } + + public void removeSyncContactListener(DataSyncListener listener) { + if (listener == null) { + return; + } + if (syncContactsListeners.contains(listener)) { + syncContactsListeners.remove(listener); + } + } + + public void addSyncBlackListListener(DataSyncListener listener) { + if (listener == null) { + return; + } + if (!syncBlackListListeners.contains(listener)) { + syncBlackListListeners.add(listener); + } + } + + public void removeSyncBlackListListener(DataSyncListener listener) { + if (listener == null) { + return; + } + if (syncBlackListListeners.contains(listener)) { + syncBlackListListeners.remove(listener); + } + } + + /** + * Get group list from server + * This method will save the sync state + * @throws HyphenateException + */ + public synchronized void asyncFetchGroupsFromServer(final EMCallBack callback){ + if(isSyncingGroupsWithServer){ + return; + } + + isSyncingGroupsWithServer = true; + + new Thread(){ + @Override + public void run(){ + try { + EMClient.getInstance().groupManager().getJoinedGroupsFromServer(); + + // in case that logout already before server returns, we should return immediately + if(!isLoggedIn()){ + isGroupsSyncedWithServer = false; + isSyncingGroupsWithServer = false; + noitifyGroupSyncListeners(false); + return; + } + + demoModel.setGroupsSynced(true); + + isGroupsSyncedWithServer = true; + isSyncingGroupsWithServer = false; + + //notify sync group list success + noitifyGroupSyncListeners(true); + + if(callback != null){ + callback.onSuccess(); + } + } catch (HyphenateException e) { + demoModel.setGroupsSynced(false); + isGroupsSyncedWithServer = false; + isSyncingGroupsWithServer = false; + noitifyGroupSyncListeners(false); + if(callback != null){ + callback.onError(e.getErrorCode(), e.toString()); + } + } + + } + }.start(); + } + + public void noitifyGroupSyncListeners(boolean success){ + for (DataSyncListener listener : syncGroupsListeners) { + listener.onSyncComplete(success); + } + } + + public void asyncFetchContactsFromServer(final EMValueCallBack> callback){ + if(isSyncingContactsWithServer){ + return; + } + + isSyncingContactsWithServer = true; + + new Thread(){ + @Override + public void run(){ + List usernames = null; + try { + usernames = EMClient.getInstance().contactManager().getAllContactsFromServer(); + // in case that logout already before server returns, we should return immediately + if(!isLoggedIn()){ + isContactsSyncedWithServer = false; + isSyncingContactsWithServer = false; + notifyContactsSyncListener(false); + return; + } + + Map userlist = new HashMap(); + for (String username : usernames) { + EaseUser user = new EaseUser(username); + EaseCommonUtils.setUserInitialLetter(user); + userlist.put(username, user); + } + // save the contact list to cache + getContactList().clear(); + getContactList().putAll(userlist); + // save the contact list to database + UserDao dao = new UserDao(appContext); + List users = new ArrayList(userlist.values()); + dao.saveContactList(users); + + demoModel.setContactSynced(true); + EMLog.d(TAG, "set contact syn status to true"); + + isContactsSyncedWithServer = true; + isSyncingContactsWithServer = false; + + //notify sync success + notifyContactsSyncListener(true); + +// getUserProfileManager().asyncFetchContactInfosFromServer(usernames,new EMValueCallBack>() { +// +// @Override +// public void onSuccess(List uList) { +// updateContactList(uList); +// getUserProfileManager().notifyContactInfosSyncListener(true); +// } +// +// @Override +// public void onError(int error, String errorMsg) { +// } +// }); + if(callback != null){ + callback.onSuccess(usernames); + } + } catch (HyphenateException e) { + demoModel.setContactSynced(false); + isContactsSyncedWithServer = false; + isSyncingContactsWithServer = false; + notifyContactsSyncListener(false); + e.printStackTrace(); + if(callback != null){ + callback.onError(e.getErrorCode(), e.toString()); + } + } + + } + }.start(); + } + + public void notifyContactsSyncListener(boolean success){ + for (DataSyncListener listener : syncContactsListeners) { + listener.onSyncComplete(success); + } + } + + public void asyncFetchBlackListFromServer(final EMValueCallBack> callback){ + + if(isSyncingBlackListWithServer){ + return; + } + + isSyncingBlackListWithServer = true; + + new Thread(){ + @Override + public void run(){ + try { + List usernames = EMClient.getInstance().contactManager().getBlackListFromServer(); + + // in case that logout already before server returns, we should return immediately + if(!isLoggedIn()){ + isBlackListSyncedWithServer = false; + isSyncingBlackListWithServer = false; + notifyBlackListSyncListener(false); + return; + } + + demoModel.setBlacklistSynced(true); + + isBlackListSyncedWithServer = true; + isSyncingBlackListWithServer = false; + + notifyBlackListSyncListener(true); + if(callback != null){ + callback.onSuccess(usernames); + } + } catch (HyphenateException e) { + demoModel.setBlacklistSynced(false); + + isBlackListSyncedWithServer = false; + isSyncingBlackListWithServer = true; + e.printStackTrace(); + + if(callback != null){ + callback.onError(e.getErrorCode(), e.toString()); + } + } + + } + }.start(); + } + + public void notifyBlackListSyncListener(boolean success){ + for (DataSyncListener listener : syncBlackListListeners) { + listener.onSyncComplete(success); + } + } + + public boolean isSyncingGroupsWithServer() { + return isSyncingGroupsWithServer; + } + + public boolean isSyncingContactsWithServer() { + return isSyncingContactsWithServer; + } + + public boolean isSyncingBlackListWithServer() { + return isSyncingBlackListWithServer; + } + + public boolean isGroupsSyncedWithServer() { + return isGroupsSyncedWithServer; + } + + public boolean isContactsSyncedWithServer() { + return isContactsSyncedWithServer; + } + + public boolean isBlackListSyncedWithServer() { + return isBlackListSyncedWithServer; + } + + synchronized void reset(){ + isSyncingGroupsWithServer = false; + isSyncingContactsWithServer = false; + isSyncingBlackListWithServer = false; + + demoModel.setGroupsSynced(false); + demoModel.setContactSynced(false); + demoModel.setBlacklistSynced(false); + + isGroupsSyncedWithServer = false; + isContactsSyncedWithServer = false; + isBlackListSyncedWithServer = false; + + isGroupAndContactListenerRegisted = false; + + setContactList(null); +// setRobotList(null); +// getUserProfileManager().reset(); + DemoDBManager.getInstance().closeDB(); + } + + public void pushActivity(Activity activity) { + easeUI.pushActivity(activity); + } + + public void popActivity(Activity activity) { + easeUI.popActivity(activity); + } + +} \ No newline at end of file diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/EasyGlide.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/EasyGlide.java new file mode 100644 index 0000000000000000000000000000000000000000..5b2d7ebd56e4cce158f6c30e0265fbd837e4d9c9 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/EasyGlide.java @@ -0,0 +1,183 @@ +package com.jiuqi.elove.util; + +import android.graphics.Bitmap; +import android.support.v4.graphics.drawable.RoundedBitmapDrawable; +import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory; +import android.text.TextUtils; +import android.widget.ImageView; +import android.widget.TextView; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.RequestManager; +import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.bumptech.glide.request.animation.GlideAnimation; +import com.bumptech.glide.request.target.BitmapImageViewTarget; +import com.jiuqi.elove.R; +import com.jiuqi.elove.activity.MyInfoActivity; +import com.jiuqi.elove.application.EloveApplication; + +/** + * Created by jq on 2017/8/1. + */ +public class EasyGlide { + + private static RequestManager manager; + + private EasyGlide() { + manager = Glide.with(EloveApplication.getAppContext()); + } + + public static EasyGlide getInstance() { + return Singleton.INSTANCE; + } + + public void showImage(boolean round,String url,ImageView view,int placeholder) { + if(round){ + if(!TextUtils.isEmpty(url)){ + manager.load(url).placeholder(placeholder).dontAnimate().centerCrop().transform(new GlideRoundTransform(EloveApplication.getAppContext(),8)).into(view); + }else{//必须判断,否则如果没有了图片则圆角就没法设置了,如果没有对加载的图片做任何操作,则无需进行else处理 + manager.load(placeholder).dontAnimate().centerCrop().transform(new GlideRoundTransform(EloveApplication.getAppContext(),8)).into(view); + } + }else{ + manager.load(url).placeholder(placeholder).dontAnimate().centerCrop().into(view); + } + } + + public void showImageNoCrop(boolean round,String url,ImageView view,int placeholder) { + if(round){ + if(!TextUtils.isEmpty(url)){ + manager.load(url).placeholder(placeholder).dontAnimate().centerCrop().transform(new GlideRoundTransform(EloveApplication.getAppContext(),8)).into(view); + }else{//必须判断,否则如果没有了图片则圆角就没法设置了,如果没有对加载的图片做任何操作,则无需进行else处理 + manager.load(placeholder).dontAnimate().centerCrop().transform(new GlideRoundTransform(EloveApplication.getAppContext(),8)).into(view); + } + }else{ + manager.load(url).placeholder(placeholder).dontAnimate().into(view); + } + } + + public void showImage(boolean round,byte[] bytes,ImageView view,int placeholder) { + if(round){ + if(bytes.length>0){ + manager.load(bytes).placeholder(placeholder).dontAnimate().centerCrop().transform(new GlideRoundTransform(EloveApplication.getAppContext(),8)).into(view); + }else{//必须判断,否则如果没有了图片则圆角就没法设置了,如果没有对加载的图片做任何操作,则无需进行else处理 + manager.load(placeholder).dontAnimate().centerCrop().transform(new GlideRoundTransform(EloveApplication.getAppContext(),8)).into(view); + } + }else{ + manager.load(bytes).placeholder(placeholder).dontAnimate().centerCrop().into(view); + } + } + + public void showImage(boolean round,int resId,ImageView view,int placeholder) { + if(round){ + if(resId>-1){ + manager.load(resId).placeholder(placeholder).dontAnimate().centerCrop().transform(new GlideRoundTransform(EloveApplication.getAppContext(),8)).into(view); + }else{ + manager.load(placeholder).dontAnimate().centerCrop().transform(new GlideRoundTransform(EloveApplication.getAppContext(),8)).into(view); + } + }else{ + manager.load(resId).placeholder(placeholder).dontAnimate().centerCrop().into(view); + } + } + + public void showImageCircleNoCache(String url,ImageView view) { + manager.load(url).asBitmap().skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.NONE).centerCrop().dontAnimate().placeholder(R.drawable.img_yuanqueshengtouxiang).into(new BitmapImageViewTarget(view) { + @Override + protected void setResource(Bitmap resource) { + RoundedBitmapDrawable circularBitmapDrawable = + RoundedBitmapDrawableFactory.create(EloveApplication.getAppContext().getResources(), resource); + circularBitmapDrawable.setCircular(true); + view.setImageDrawable(circularBitmapDrawable); + } + }); + } + + public void showImageCircle(String url,ImageView view) { + manager.load(url).asBitmap().centerCrop().dontAnimate().placeholder(R.drawable.img_yuanqueshengtouxiang).into(new BitmapImageViewTarget(view) { + @Override + protected void setResource(Bitmap resource) { + RoundedBitmapDrawable circularBitmapDrawable = + RoundedBitmapDrawableFactory.create(EloveApplication.getAppContext().getResources(), resource); + circularBitmapDrawable.setCircular(true); + view.setImageDrawable(circularBitmapDrawable); + } + }); + } + public void showImageCircle(int resId,ImageView view) { + manager.load(resId).asBitmap().centerCrop().dontAnimate().placeholder(R.drawable.img_yuanqueshengtouxiang).into(new BitmapImageViewTarget(view) { + @Override + protected void setResource(Bitmap resource) { + RoundedBitmapDrawable circularBitmapDrawable = + RoundedBitmapDrawableFactory.create(EloveApplication.getAppContext().getResources(), resource); + circularBitmapDrawable.setCircular(true); + view.setImageDrawable(circularBitmapDrawable); + } + }); + } + + + public void showTextCircleAvatar(TextView view, String namepre,String name){ + int resId; + if(equalsLetter("a","n",namepre)){ + resId = R.drawable.circle_avatar_bg; + }else if(equalsLetter("b","o",namepre)){ + resId = R.drawable.circle_avatar_bg1; + }else if(equalsLetter("c","p",namepre)){ + resId = R.drawable.circle_avatar_bg2; + }else if(equalsLetter("d","q",namepre)){ + resId = R.drawable.circle_avatar_bg3; + }else if(equalsLetter("e","r",namepre)){ + resId = R.drawable.circle_avatar_bg4; + }else if(equalsLetter("f","s",namepre)){ + resId = R.drawable.circle_avatar_bg5; + }else if(equalsLetter("g","t",namepre)){ + resId = R.drawable.circle_avatar_bg6; + }else if(equalsLetter("h","u",namepre)){ + resId = R.drawable.circle_avatar_bg7; + }else if(equalsLetter("i","v",namepre)){ + resId = R.drawable.circle_avatar_bg8; + }else if(equalsLetter("j","w",namepre)){ + resId = R.drawable.circle_avatar_bg9; + }else if(equalsLetter("k","x",namepre)){ + resId = R.drawable.circle_avatar_bg10; + }else if(equalsLetter("l","y",namepre)){ + resId = R.drawable.circle_avatar_bg11; + }else if(equalsLetter("m","z",namepre)){ + resId = R.drawable.circle_avatar_bg12; + }else{ + resId = R.drawable.circle_avatar_bg1; + } + view.setText(name); + view.setBackground(EloveApplication.getAppContext().getResources().getDrawable(resId)); + } + + private boolean equalsLetter(String first,String next,String des){ + return first.equalsIgnoreCase(des)||next.equalsIgnoreCase(des); + } + + /** + * 静态内部类实现单例模式 + * 获取RetrofitHelper对象的单例 + **/ + private static class Singleton { + private static final EasyGlide INSTANCE = new EasyGlide(); + } + + public void showImage(boolean round, String url, ImageView view, final ImageView iv_blur, int placeholder) { + if(round){ + if(!TextUtils.isEmpty(url)){ + manager.load(url).asBitmap().placeholder(placeholder).centerCrop().transform(new GlideRoundTransform(EloveApplication.getAppContext(),8)).into(new BitmapImageViewTarget(view){ + @Override + public void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) { + view.setImageBitmap(resource); + iv_blur.setImageDrawable(BlurImageview.BlurImages(resource, EloveApplication.getAppContext())); + } + }); +// manager.load(url).placeholder(placeholder).dontAnimate().centerCrop().transform(new GlideRoundTransform(EloveApplication.getAppContext(),8)).into(view); + }else{//必须判断,否则如果没有了图片则圆角就没法设置了,如果没有对加载的图片做任何操作,则无需进行else处理 + manager.load(placeholder).dontAnimate().centerCrop().transform(new GlideRoundTransform(EloveApplication.getAppContext(),8)).into(view); + } + }else{ + manager.load(url).placeholder(placeholder).dontAnimate().centerCrop().into(view); + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/FormatUtil.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/FormatUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..0269b8d9f3b6262702fb340ed9c63548952f697e --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/FormatUtil.java @@ -0,0 +1,418 @@ +package com.jiuqi.elove.util; + +import android.text.TextUtils; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.GregorianCalendar; +import java.util.Hashtable; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class FormatUtil { + /** + * 验证手机格式 + */ +// public static boolean isMobileNO(String mobiles) { +// /* +// 移动:134、135、136、137、138、139、150、151、157(TD)、158、159、187、188、178 +// 联通:130、131、132、152、155、156、185、186、176 +// 电信:133、153、180、189、(1349卫通)、177 +// 总结起来就是第一位必定为1,第二位必定为3或5或8或7,其他位置的可以为0-9 +// */ +// String telRegex = "[1][34578]\\d{9}";//"[1]"代表第1位为数字1,"[3458]"代表第二位可以为3、4、5、8中的一个,"\\d{9}"代表后面是可以是0~9的数字,有9位。 +// if (TextUtils.isEmpty(mobiles)) return false; +// else return mobiles.matches(telRegex); +// } + + /** + * 判断字符串是否为手机号 + * @param str + * @return true or false + */ + public static boolean isMobileNO(String str) { + Pattern p = Pattern.compile("^((13[0-9])|(15[^4,\\D])|(17[0,6-8])|(18[0-9]))\\d{8}$"); + Matcher m = p.matcher(str); + return m.matches(); + } + + /** + * 判断email格式是否正确 + * @param email + * @return + */ + public static boolean isEmail(String email) { + String str = "^([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$"; + Pattern p = Pattern.compile(str); + Matcher m = p.matcher(email); + + return m.matches(); + } + + /** + * 判断是否全是数字 + * @param str + * @return + */ + public static boolean isNumeric(String str) { + Pattern pattern = Pattern.compile("[0-9]*"); + Matcher isNum = pattern.matcher(str); + if (!isNum.matches()) { + return false; + } + return true; + } + + /** + * 判断身份证格式 + */ + public static boolean isIdCardNo(String idNum){ + //定义判别用户身份证号的正则表达式(要么是15位或18位,最后一位可以为字母) + Pattern idNumPattern = Pattern.compile("(\\d{14}[0-9a-zA-Z])|(\\d{17}[0-9a-zA-Z])"); + //通过Pattern获得Matcher + Matcher idNumMatcher = idNumPattern.matcher(idNum); + if(!idNumMatcher.matches()){ + return false; + } + return true; + } + + /** + * 判定输入汉字 + * @param c + * @return + */ + public static boolean isChinese(char c) { + Character.UnicodeBlock ub = Character.UnicodeBlock.of(c); + if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS + || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS + || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A + || ub == Character.UnicodeBlock.GENERAL_PUNCTUATION + || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION + || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) { + return true; + } + return false; + } + + /** + * 检测String是否全是中文 + * @param name + * @return + */ + public static boolean checkNameChese(String name) + { + boolean res=true; + if(name.length()>6||name.length()<2){ + res = false; + } + char [] cTemp = name.toCharArray(); + for(int i=0;i= 0; i--, j++) { + int k = chs[i] - '0'; + if (j % 2 == 0) { + k *= 2; + k = k / 10 + k % 10; + } + luhmSum += k; + } + return (luhmSum % 10 == 0) ? '0' : (char) ((10 - luhmSum % 10) + '0'); + } + + /** + * 功能:身份证的有效验证 + * + * @param IDStr + * 身份证号 + * @return 有效:返回"" 无效:返回String信息 + * @throws ParseException + */ + public static boolean IDCardValidate(String IDStr) throws ParseException { + String errorInfo = "";// 记录错误信息 + String[] ValCodeArr = { "1", "0", "x", "9", "8", "7", "6", "5", "4", + "3", "2" }; + String[] Wi = { "7", "9", "10", "5", "8", "4", "2", "1", "6", "3", "7", + "9", "10", "5", "8", "4", "2" }; + String Ai = ""; + // ================ 号码的长度 15位或18位 ================ + if (IDStr.length() != 15 && IDStr.length() != 18) { + errorInfo = "身份证号码长度应该为15位或18位。"; + return false; + } + // =======================(end)======================== + + // ================ 数字 除最后一位都为数字 ================ + if (IDStr.length() == 18) { + Ai = IDStr.substring(0, 17); + } else if (IDStr.length() == 15) { + Ai = IDStr.substring(0, 6) + "19" + IDStr.substring(6, 15); + } + if (isNumeric(Ai) == false) { + errorInfo = "身份证15位号码都应为数字 ; 18位号码除最后一位外,都应为数字。"; + return false; + } + // =======================(end)======================== + + // ================ 出生年月是否有效 ================ + String strYear = Ai.substring(6, 10);// 年份 + String strMonth = Ai.substring(10, 12);// 月份 + String strDay = Ai.substring(12, 14);// 月份 + if (isDataFormat(strYear + "-" + strMonth + "-" + strDay) == false) { + errorInfo = "身份证生日无效。"; + return false; + } + GregorianCalendar gc = new GregorianCalendar(); + SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd"); + try { + if ((gc.get(Calendar.YEAR) - Integer.parseInt(strYear)) > 150 + || (gc.getTime().getTime() - s.parse( + strYear + "-" + strMonth + "-" + strDay).getTime()) < 0) { + errorInfo = "身份证生日不在有效范围。"; + return false; + } + } catch (NumberFormatException e) { + e.printStackTrace(); + } catch (ParseException e) { + e.printStackTrace(); + } + if (Integer.parseInt(strMonth) > 12 || Integer.parseInt(strMonth) == 0) { + errorInfo = "身份证月份无效"; + return false; + } + if (Integer.parseInt(strDay) > 31 || Integer.parseInt(strDay) == 0) { + errorInfo = "身份证日期无效"; + return false; + } + // =====================(end)===================== + + // ================ 地区码时候有效 ================ + Hashtable h = GetAreaCode(); + if (h.get(Ai.substring(0, 2)) == null) { + errorInfo = "身份证地区编码错误。"; + return false; + } + // ============================================== + + // ================ 判断最后一位的值 ================ + int TotalmulAiWi = 0; + for (int i = 0; i < 17; i++) { + TotalmulAiWi = TotalmulAiWi + + Integer.parseInt(String.valueOf(Ai.charAt(i))) + * Integer.parseInt(Wi[i]); + } + int modValue = TotalmulAiWi % 11; + String strVerifyCode = ValCodeArr[modValue]; + Ai = Ai + strVerifyCode; + + if (IDStr.length() == 18) { + if (Ai.equals(IDStr) == false) { + errorInfo = "身份证无效,不是合法的身份证号码"; + return false; + } + } else { + return true; + } + // =====================(end)===================== + + return true; + } + + /** + * 获取星座 + * + * @param + * @return + */ + public static String constellation(int month,int day) { +// SimpleDateFormat month_format = new SimpleDateFormat("MM"); +// SimpleDateFormat day_format = new SimpleDateFormat("dd"); +// Date date = new Date(time); +// int month = Integer.parseInt(month_format.format(date)); +// int day = Integer.parseInt(day_format.format(date)); + String star = ""; + if (month == 1 && day >= 20 || month == 2 && day <= 18) { + star = "水瓶座"; + } + if (month == 2 && day >= 19 || month == 3 && day <= 20) { + star = "双鱼座"; + } + if (month == 3 && day >= 21 || month == 4 && day <= 19) { + star = "白羊座"; + } + if (month == 4 && day >= 20 || month == 5 && day <= 20) { + star = "金牛座"; + } + if (month == 5 && day >= 21 || month == 6 && day <= 21) { + star = "双子座"; + } + if (month == 6 && day >= 22 || month == 7 && day <= 22) { + star = "巨蟹座"; + } + if (month == 7 && day >= 23 || month == 8 && day <= 22) { + star = "狮子座"; + } + if (month == 8 && day >= 23 || month == 9 && day <= 22) { + star = "处女座"; + } + if (month == 9 && day >= 23 || month == 10 && day <= 22) { + star = "天秤座"; + } + if (month == 10 && day >= 23 || month == 11 && day <= 21) { + star = "天蝎座"; + } + if (month == 11 && day >= 22 || month == 12 && day <= 21) { + star = "射手座"; + } + if (month == 12 && day >= 22 || month == 1 && day <= 19) { + star = "摩羯座"; + } + return star; + } + + /** + * 获取生肖 + * + * @param year + * @return + */ + public static String getZodiac(int year) { +// SimpleDateFormat year_format = new SimpleDateFormat("yyyy"); +// Date date = new Date(time); +// int year = Integer.parseInt(year_format.format(date)); + if (year < 1900) { + return ""; + } + int start = 1900; + String[] years = new String[] { "鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪" }; + return years[(year - start) % years.length]; + } + + + + /** + * 功能:设置地区编码 + * + * @return Hashtable 对象 + */ + @SuppressWarnings({ "rawtypes", "unchecked" }) + private static Hashtable GetAreaCode() { + Hashtable hashtable = new Hashtable(); + hashtable.put("11", "北京"); + hashtable.put("12", "天津"); + hashtable.put("13", "河北"); + hashtable.put("14", "山西"); + hashtable.put("15", "内蒙古"); + hashtable.put("21", "辽宁"); + hashtable.put("22", "吉林"); + hashtable.put("23", "黑龙江"); + hashtable.put("31", "上海"); + hashtable.put("32", "江苏"); + hashtable.put("33", "浙江"); + hashtable.put("34", "安徽"); + hashtable.put("35", "福建"); + hashtable.put("36", "江西"); + hashtable.put("37", "山东"); + hashtable.put("41", "河南"); + hashtable.put("42", "湖北"); + hashtable.put("43", "湖南"); + hashtable.put("44", "广东"); + hashtable.put("45", "广西"); + hashtable.put("46", "海南"); + hashtable.put("50", "重庆"); + hashtable.put("51", "四川"); + hashtable.put("52", "贵州"); + hashtable.put("53", "云南"); + hashtable.put("54", "西藏"); + hashtable.put("61", "陕西"); + hashtable.put("62", "甘肃"); + hashtable.put("63", "青海"); + hashtable.put("64", "宁夏"); + hashtable.put("65", "新疆"); + hashtable.put("71", "台湾"); + hashtable.put("81", "香港"); + hashtable.put("82", "澳门"); + hashtable.put("91", "国外"); + return hashtable; + } + + /** + * 验证日期字符串是否是YYYY-MM-DD格式 + * + * @param str + * @return + */ + private static boolean isDataFormat(String str) { + boolean flag = false; + // String + // regxStr="[1-9][0-9]{3}-[0-1][0-2]-((0[1-9])|([12][0-9])|(3[01]))"; + String regxStr = "^((\\d{2}(([02468][048])|([13579][26]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])))))|(\\d{2}(([02468][1235679])|([13579][01345789]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))(\\s(((0?[0-9])|([1-2][0-3]))\\:([0-5]?[0-9])((\\s)|(\\:([0-5]?[0-9])))))?$"; + Pattern pattern1 = Pattern.compile(regxStr); + Matcher isNo = pattern1.matcher(str); + if (isNo.matches()) { + flag = true; + } + return flag; + } + + /** + * 空值null返回"",防止脏数据奔溃 + */ + public static String checkValue(String str) { + return TextUtils.isEmpty(str)?"":str; + } + + /** + * 身材范围 + */ + public static String getBMI(double weight,double height){ + //体质指数(BMI)=体重(kg)÷身高^2(m) + double BMI = weight/(height*height); + if (BMI >= 24.00) {// 超丰满 5 + return "超丰满"; + }else if (BMI >= 22.00 && BMI < 24.00){//丰满 4 + return "丰满"; + }else if (BMI >= 20.00 && BMI < 22.00){// 匀称 3 + return "匀称"; + }else if (BMI >= 18.00 && BMI < 20.00){// 苗条 2 + return "苗条"; + }else if (BMI < 18.00){// 骨感 1 + return "骨感"; + } + return ""; + } +} + diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/GlideRoundTransform.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/GlideRoundTransform.java new file mode 100644 index 0000000000000000000000000000000000000000..73cbbf3dab3486a98dcccd74633f46b081e9cd32 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/GlideRoundTransform.java @@ -0,0 +1,55 @@ +package com.jiuqi.elove.util; + +import android.content.Context; +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.BitmapShader; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.RectF; + +import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool; +import com.bumptech.glide.load.resource.bitmap.BitmapTransformation; + +/** + * 动态设定图片的圆角 + * Created by dl on 2016/8/13. + */ +public class GlideRoundTransform extends BitmapTransformation { + + private static float radius = 0f; + + public GlideRoundTransform(Context context) { + this(context, 4); + } + + public GlideRoundTransform(Context context, int dp) { + super(context); + this.radius = Resources.getSystem().getDisplayMetrics().density * dp; + } + + @Override protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) { + return roundCrop(pool, toTransform); + } + + private static Bitmap roundCrop(BitmapPool pool, Bitmap source) { + if (source == null) return null; + + Bitmap result = pool.get(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888); + if (result == null) { + result = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888); + } + + Canvas canvas = new Canvas(result); + Paint paint = new Paint(); + paint.setShader(new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP)); + paint.setAntiAlias(true); + RectF rectF = new RectF(0f, 0f, source.getWidth(), source.getHeight()); + canvas.drawRoundRect(rectF, radius, radius, paint); + return result; + } + + @Override public String getId() { + return getClass().getName() + Math.round(radius); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/HttpsUtils.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/HttpsUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..6f9921028b1834276abbab68904d406e58ed5a45 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/HttpsUtils.java @@ -0,0 +1,233 @@ +package com.jiuqi.elove.util; + +import java.io.IOException; +import java.io.InputStream; +import java.security.KeyManagementException; +import java.security.KeyStore; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.UnrecoverableKeyException; +import java.security.cert.CertificateException; +import java.security.cert.CertificateFactory; +import java.security.cert.X509Certificate; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.KeyManager; +import javax.net.ssl.KeyManagerFactory; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSession; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; +import javax.net.ssl.TrustManagerFactory; +import javax.net.ssl.X509TrustManager; + +/** + * + * Created by dl on 15/12/14. + */ +public class HttpsUtils +{ + public static class SSLParams + { + public SSLSocketFactory sSLSocketFactory; + public X509TrustManager trustManager; + } + + public static SSLParams getSslSocketFactory(InputStream[] certificates, InputStream bksFile, String password) + { + SSLParams sslParams = new SSLParams(); + try + { + TrustManager[] trustManagers = prepareTrustManager(certificates); + KeyManager[] keyManagers = prepareKeyManager(bksFile, password); + SSLContext sslContext = SSLContext.getInstance("TLS"); + X509TrustManager trustManager = null; + if (trustManagers != null) + { + trustManager = new MyTrustManager(chooseTrustManager(trustManagers)); + } else + { + trustManager = new UnSafeTrustManager(); + } + sslContext.init(keyManagers, new TrustManager[]{trustManager},null); + sslParams.sSLSocketFactory = sslContext.getSocketFactory(); + sslParams.trustManager = trustManager; + return sslParams; + } catch (NoSuchAlgorithmException e) + { + throw new AssertionError(e); + } catch (KeyManagementException e) + { + throw new AssertionError(e); + } catch (KeyStoreException e) + { + throw new AssertionError(e); + } + } + + private class UnSafeHostnameVerifier implements HostnameVerifier + { + @Override + public boolean verify(String hostname, SSLSession session) + { + return true; + } + } + + private static class UnSafeTrustManager implements X509TrustManager + { + @Override + public void checkClientTrusted(X509Certificate[] chain, String authType) + throws CertificateException + { + } + + @Override + public void checkServerTrusted(X509Certificate[] chain, String authType) + throws CertificateException + { + } + + @Override + public X509Certificate[] getAcceptedIssuers() + { + return new java.security.cert.X509Certificate[]{}; + } + } + + private static TrustManager[] prepareTrustManager(InputStream... certificates) + { + if (certificates == null || certificates.length <= 0) return null; + try + { + + CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509"); + KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); + keyStore.load(null); + int index = 0; + for (InputStream certificate : certificates) + { + String certificateAlias = Integer.toString(index++); + keyStore.setCertificateEntry(certificateAlias, certificateFactory.generateCertificate(certificate)); + try + { + if (certificate != null) + certificate.close(); + } catch (IOException e) + + { + } + } + TrustManagerFactory trustManagerFactory = null; + + trustManagerFactory = TrustManagerFactory. + getInstance(TrustManagerFactory.getDefaultAlgorithm()); + trustManagerFactory.init(keyStore); + + TrustManager[] trustManagers = trustManagerFactory.getTrustManagers(); + + return trustManagers; + } catch (NoSuchAlgorithmException e) + { + e.printStackTrace(); + } catch (CertificateException e) + { + e.printStackTrace(); + } catch (KeyStoreException e) + { + e.printStackTrace(); + } catch (Exception e) + { + e.printStackTrace(); + } + return null; + + } + + private static KeyManager[] prepareKeyManager(InputStream bksFile, String password) + { + try + { + if (bksFile == null || password == null) return null; + + KeyStore clientKeyStore = KeyStore.getInstance("BKS"); + clientKeyStore.load(bksFile, password.toCharArray()); + KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); + keyManagerFactory.init(clientKeyStore, password.toCharArray()); + return keyManagerFactory.getKeyManagers(); + + } catch (KeyStoreException e) + { + e.printStackTrace(); + } catch (NoSuchAlgorithmException e) + { + e.printStackTrace(); + } catch (UnrecoverableKeyException e) + { + e.printStackTrace(); + } catch (CertificateException e) + { + e.printStackTrace(); + } catch (IOException e) + { + e.printStackTrace(); + } catch (Exception e) + { + e.printStackTrace(); + } + return null; + } + + private static X509TrustManager chooseTrustManager(TrustManager[] trustManagers) + { + for (TrustManager trustManager : trustManagers) + { + if (trustManager instanceof X509TrustManager) + { + return (X509TrustManager) trustManager; + } + } + return null; + } + + + private static class MyTrustManager implements X509TrustManager + { + private X509TrustManager defaultTrustManager; + private X509TrustManager localTrustManager; + + public MyTrustManager(X509TrustManager localTrustManager) throws NoSuchAlgorithmException, KeyStoreException + { + TrustManagerFactory var4 = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); + var4.init((KeyStore) null); + defaultTrustManager = chooseTrustManager(var4.getTrustManagers()); + this.localTrustManager = localTrustManager; + } + + + @Override + public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException + { + + } + + @Override + public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException + { + try + { + defaultTrustManager.checkServerTrusted(chain, authType); + } catch (CertificateException ce) + { + localTrustManager.checkServerTrusted(chain, authType); + } + } + + + @Override + public X509Certificate[] getAcceptedIssuers() + { + return new X509Certificate[0]; + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/IdcardValidator.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/IdcardValidator.java new file mode 100644 index 0000000000000000000000000000000000000000..9c90cd1fd650c5484bcc9bfa6dbf8366120890a9 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/IdcardValidator.java @@ -0,0 +1,436 @@ +package com.jiuqi.elove.util; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.regex.Pattern; + +/** + * 身份证号校验 + * @author liruidong + * + * 2017年8月21日 下午4:28:14 + */ +public class IdcardValidator { + /** + * 省,直辖市代码表: { 11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古", + * 21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏", + * 33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南", + * 42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆", + * 51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃", + * 63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"} + */ + protected String codeAndCity[][] = { { "11", "北京" }, { "12", "天津" }, + { "13", "河北" }, { "14", "山西" }, { "15", "内蒙古" }, { "21", "辽宁" }, + { "22", "吉林" }, { "23", "黑龙江" }, { "31", "上海" }, { "32", "江苏" }, + { "33", "浙江" }, { "34", "安徽" }, { "35", "福建" }, { "36", "江西" }, + { "37", "山东" }, { "41", "河南" }, { "42", "湖北" }, { "43", "湖南" }, + { "44", "广东" }, { "45", "广西" }, { "46", "海南" }, { "50", "重庆" }, + { "51", "四川" }, { "52", "贵州" }, { "53", "云南" }, { "54", "西藏" }, + { "61", "陕西" }, { "62", "甘肃" }, { "63", "青海" }, { "64", "宁夏" }, + { "65", "新疆" }, { "71", "台湾" }, { "81", "香港" }, { "82", "澳门" }, + { "91", "国外" } }; + + private String cityCode[] = { "11", "12", "13", "14", "15", "21", "22", + "23", "31", "32", "33", "34", "35", "36", "37", "41", "42", "43", + "44", "45", "46", "50", "51", "52", "53", "54", "61", "62", "63", + "64", "65", "71", "81", "82", "91" }; + + // 每位加权因子 + private int power[] = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 }; + + // 第18位校检码 +// private String verifyCode[] = { "1", "0", "X", "9", "8", "7", "6", "5", +// "4", "3", "2" }; + + public static void main(String[] args) throws Exception { + + String idcard15 = ""; + String idcard18 = ""; + IdcardValidator iv = new IdcardValidator(); + boolean flag = false; + flag = iv.isValidate18Idcard(idcard18); + System.out.println(flag); + + flag = iv.isValidate15Idcard(idcard15); + System.out.println(flag); + + System.out.println(iv.convertIdcarBy15bit(idcard15)); + flag = iv.isValidate18Idcard(iv.convertIdcarBy15bit(idcard15)); + System.out.println(flag); + + System.out.println(iv.isValidatedAllIdcard(idcard18)); + + } + + /** + * 验证所有的身份证的合法性 + * + * @param idcard + * @return + */ + public boolean isValidatedAllIdcard(String idcard) { + if (idcard.length() == 15) { + idcard = this.convertIdcarBy15bit(idcard); + } + return this.isValidate18Idcard(idcard); + } + + /** + *

    + * 判断18位身份证的合法性 + *

    + * 根据〖中华人民共和国国家标准GB11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。 + * 排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。 + *

    + * 顺序码: 表示在同一地址码所标识的区域范围内,对同年、同月、同 日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配 给女性。 + *

    + *

    + * 1.前1、2位数字表示:所在省份的代码; 2.第3、4位数字表示:所在城市的代码; 3.第5、6位数字表示:所在区县的代码; + * 4.第7~14位数字表示:出生年、月、日; 5.第15、16位数字表示:所在地的派出所的代码; + * 6.第17位数字表示性别:奇数表示男性,偶数表示女性; + * 7.第18位数字是校检码:也有的说是个人信息码,一般是随计算机的随机产生,用来检验身份证的正确性。校检码可以是0~9的数字,有时也用x表示。 + *

    + *

    + * 第十八位数字(校验码)的计算方法为: 1.将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7 9 10 5 8 4 + * 2 1 6 3 7 9 10 5 8 4 2 + *

    + *

    + * 2.将这17位数字和系数相乘的结果相加。 + *

    + *

    + * 3.用加出来和除以11,看余数是多少? + *

    + * 4.余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字。其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3 + * 2。 + *

    + * 5.通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ。如果余数是10,身份证的最后一位号码就是2。 + *

    + * + * @param idcard + * @return + */ + public boolean isValidate18Idcard(String idcard) { + // 非18位为假 + if (idcard.length() != 18) { + return false; + } + // 获取前17位 + String idcard17 = idcard.substring(0, 17); + // 获取第18位 + String idcard18Code = idcard.substring(17, 18); + char c[] = null; + String checkCode = ""; + // 是否都为数字 + if (isDigital(idcard17)) { + c = idcard17.toCharArray(); + } else { + return false; + } + + if (null != c) { + int bit[] = new int[idcard17.length()]; + + bit = converCharToInt(c); + + int sum17 = 0; + + sum17 = getPowerSum(bit); + + // 将和值与11取模得到余数进行校验码判断 + checkCode = getCheckCodeBySum(sum17); + if (null == checkCode) { + return false; + } + // 将身份证的第18位与算出来的校码进行匹配,不相等就为假 + if (!idcard18Code.equalsIgnoreCase(checkCode)) { + return false; + } + } + return true; + } + + /** + * 验证15位身份证的合法性,该方法验证不准确,最好是将15转为18位后再判断,该类中已提供。 + * + * @param idcard + * @return + */ + public boolean isValidate15Idcard(String idcard) { + // 非15位为假 + if (idcard.length() != 15) { + return false; + } + + // 是否全都为数字 + if (isDigital(idcard)) { + String provinceid = idcard.substring(0, 2); + String birthday = idcard.substring(6, 12); + int year = Integer.parseInt(idcard.substring(6, 8)); + int month = Integer.parseInt(idcard.substring(8, 10)); + int day = Integer.parseInt(idcard.substring(10, 12)); + + // 判断是否为合法的省份 + boolean flag = false; + for (String id : cityCode) { + if (id.equals(provinceid)) { + flag = true; + break; + } + } + if (!flag) { + return false; + } + // 该身份证生出日期在当前日期之后时为假 + Date birthdate = null; + try { + birthdate = new SimpleDateFormat("yyMMdd").parse(birthday); + } catch (ParseException e) { + e.printStackTrace(); + } + if (birthdate == null || new Date().before(birthdate)) { + return false; + } + + // 判断是否为合法的年份 + GregorianCalendar curDay = new GregorianCalendar(); + int curYear = curDay.get(Calendar.YEAR); + int year2bit = Integer.parseInt(String.valueOf(curYear) + .substring(2)); + + // 判断该年份的两位表示法,小于50的和大于当前年份的,为假 + if ((year < 50 && year > year2bit)) { + return false; + } + + // 判断是否为合法的月份 + if (month < 1 || month > 12) { + return false; + } + + // 判断是否为合法的日期 + boolean mflag = false; + curDay.setTime(birthdate); // 将该身份证的出生日期赋于对象curDay + switch (month) { + case 1: + case 3: + case 5: + case 7: + case 8: + case 10: + case 12: + mflag = (day >= 1 && day <= 31); + break; + case 2: // 公历的2月非闰年有28天,闰年的2月是29天。 + if (curDay.isLeapYear(curDay.get(Calendar.YEAR))) { + mflag = (day >= 1 && day <= 29); + } else { + mflag = (day >= 1 && day <= 28); + } + break; + case 4: + case 6: + case 9: + case 11: + mflag = (day >= 1 && day <= 30); + break; + } + if (!mflag) { + return false; + } + } else { + return false; + } + return true; + } + + /** + * 将15位的身份证转成18位身份证 + * + * @param idcard + * @return + */ + public String convertIdcarBy15bit(String idcard) { + String idcard17 = null; + // 非15位身份证 + if (idcard.length() != 15) { + return null; + } + + if (isDigital(idcard)) { + // 获取出生年月日 + String birthday = idcard.substring(6, 12); + Date birthdate = null; + try { + birthdate = new SimpleDateFormat("yyMMdd").parse(birthday); + } catch (ParseException e) { + e.printStackTrace(); + } + Calendar cday = Calendar.getInstance(); + cday.setTime(birthdate); + String year = String.valueOf(cday.get(Calendar.YEAR)); + + idcard17 = idcard.substring(0, 6) + year + idcard.substring(8); + + char c[] = idcard17.toCharArray(); + String checkCode = ""; + + if (null != c) { + int bit[] = new int[idcard17.length()]; + + // 将字符数组转为整型数组 + bit = converCharToInt(c); + int sum17 = 0; + sum17 = getPowerSum(bit); + + // 获取和值与11取模得到余数进行校验码 + checkCode = getCheckCodeBySum(sum17); + // 获取不到校验位 + if (null == checkCode) { + return null; + } + + // 将前17位与第18位校验码拼接 + idcard17 += checkCode; + } + } else { // 身份证包含数字 + return null; + } + return idcard17; + } + + /** + * 15位和18位身份证号码的基本数字和位数验校 + * + * @param idcard + * @return + */ + public boolean isIdcard(String idcard) { + return idcard == null || "".equals(idcard) ? false : Pattern.matches( + "(^\\d{15}$)|(\\d{17}(?:\\d|x|X)$)", idcard); + } + + /** + * 15位身份证号码的基本数字和位数验校 + * + * @param idcard + * @return + */ + public boolean is15Idcard(String idcard) { + return idcard == null || "".equals(idcard) ? false : Pattern.matches( + "^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$", + idcard); + } + + /** + * 18位身份证号码的基本数字和位数验校 + * + * @param idcard + * @return + */ + public boolean is18Idcard(String idcard) { + return Pattern + .matches( + "^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([\\d|x|X]{1})$", + idcard); + } + + /** + * 数字验证 + * + * @param str + * @return + */ + public boolean isDigital(String str) { + return str == null || "".equals(str) ? false : str.matches("^[0-9]*$"); + } + + /** + * 将身份证的每位和对应位的加权因子相乘之后,再得到和值 + * + * @param bit + * @return + */ + public int getPowerSum(int[] bit) { + + int sum = 0; + + if (power.length != bit.length) { + return sum; + } + + for (int i = 0; i < bit.length; i++) { + for (int j = 0; j < power.length; j++) { + if (i == j) { + sum = sum + bit[i] * power[j]; + } + } + } + return sum; + } + + /** + * 将和值与11取模得到余数进行校验码判断 + * + * @param checkCode + * @param sum17 + * @return 校验位 + */ + public String getCheckCodeBySum(int sum17) { + String checkCode = null; + switch (sum17 % 11) { + case 10: + checkCode = "2"; + break; + case 9: + checkCode = "3"; + break; + case 8: + checkCode = "4"; + break; + case 7: + checkCode = "5"; + break; + case 6: + checkCode = "6"; + break; + case 5: + checkCode = "7"; + break; + case 4: + checkCode = "8"; + break; + case 3: + checkCode = "9"; + break; + case 2: + checkCode = "x"; + break; + case 1: + checkCode = "0"; + break; + case 0: + checkCode = "1"; + break; + } + return checkCode; + } + + /** + * 将字符数组转为整型数组 + * + * @param c + * @return + * @throws NumberFormatException + */ + public int[] converCharToInt(char[] c) throws NumberFormatException { + int[] a = new int[c.length]; + int k = 0; + for (char temp : c) { + a[k++] = Integer.parseInt(String.valueOf(temp)); + } + return a; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/ImageLoader.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/ImageLoader.java new file mode 100644 index 0000000000000000000000000000000000000000..157a8fa2734ec6cfa507e381d9a46db268675379 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/ImageLoader.java @@ -0,0 +1,436 @@ +package com.jiuqi.elove.util; + +import java.lang.reflect.Field; +import java.util.LinkedList; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Semaphore; + +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import android.support.v4.util.LruCache; +import android.util.DisplayMetrics; +import android.util.Log; +import android.view.ViewGroup.LayoutParams; +import android.widget.ImageView; + +public class ImageLoader +{ + /** + * 图片缓存的核心类 + */ + private LruCache mLruCache; + /** + * 线程池 + */ + private ExecutorService mThreadPool; + /** + * 线程池的线程数量,默认为1 + */ + private int mThreadCount = 1; + /** + * 队列的调度方式 + */ + private Type mType = Type.LIFO; + /** + * 任务队列 + */ + private LinkedList mTasks; + /** + * 轮询的线程 + */ + private Thread mPoolThread; + private Handler mPoolThreadHander; + + /** + * 运行在UI线程的handler,用于给ImageView设置图片 + */ + private Handler mHandler; + + /** + * 引入一个值为1的信号量,防止mPoolThreadHander未初始化完成 + */ + private volatile Semaphore mSemaphore = new Semaphore(0); + + /** + * 引入一个值为1的信号量,由于线程池内部也有一个阻塞线程,防止加入任务的速度过快,使LIFO效果不明显 + */ + private volatile Semaphore mPoolSemaphore; + + private static ImageLoader mInstance; + + /** + * 队列的调度方式 + * + * @author zhy + * + */ + public enum Type + { + FIFO, LIFO + } + + + /** + * 单例获得该实例对象 + * + * @return + */ + public static ImageLoader getInstance() + { + + if (mInstance == null) + { + synchronized (ImageLoader.class) + { + if (mInstance == null) + { + mInstance = new ImageLoader(1, Type.LIFO); + } + } + } + return mInstance; + } + + private ImageLoader(int threadCount, Type type) + { + init(threadCount, type); + } + + private void init(int threadCount, Type type) + { + // loop thread + mPoolThread = new Thread() + { + @Override + public void run() + { + Looper.prepare(); + + mPoolThreadHander = new Handler() + { + @Override + public void handleMessage(Message msg) + { + mThreadPool.execute(getTask()); + try + { + mPoolSemaphore.acquire(); + } catch (InterruptedException e) + { + } + } + }; + // 释放一个信号量 + mSemaphore.release(); + Looper.loop(); + } + }; + mPoolThread.start(); + + // 获取应用程序最大可用内存 + int maxMemory = (int) Runtime.getRuntime().maxMemory(); + int cacheSize = maxMemory / 8; + mLruCache = new LruCache(cacheSize) + { + @Override + protected int sizeOf(String key, Bitmap value) + { + return value.getRowBytes() * value.getHeight(); + }; + }; + + mThreadPool = Executors.newFixedThreadPool(threadCount); + mPoolSemaphore = new Semaphore(threadCount); + mTasks = new LinkedList(); + mType = type == null ? Type.LIFO : type; + + } + + /** + * 加载图片 + * + * @param path + * @param imageView + */ + public void loadImage(final String path, final ImageView imageView) + { + // set tag + imageView.setTag(path); + // UI线程 + if (mHandler == null) + { + mHandler = new Handler() + { + @Override + public void handleMessage(Message msg) + { + ImgBeanHolder holder = (ImgBeanHolder) msg.obj; + ImageView imageView = holder.imageView; + Bitmap bm = holder.bitmap; + String path = holder.path; + if (imageView.getTag().toString().equals(path)) + { + imageView.setImageBitmap(bm); + } + } + }; + } + + Bitmap bm = getBitmapFromLruCache(path); + if (bm != null) + { + ImgBeanHolder holder = new ImgBeanHolder(); + holder.bitmap = bm; + holder.imageView = imageView; + holder.path = path; + Message message = Message.obtain(); + message.obj = holder; + mHandler.sendMessage(message); + } else + { + addTask(new Runnable() + { + @Override + public void run() + { + + ImageSize imageSize = getImageViewWidth(imageView); + + int reqWidth = imageSize.width; + int reqHeight = imageSize.height; + + Bitmap bm = decodeSampledBitmapFromResource(path, reqWidth, + reqHeight); + addBitmapToLruCache(path, bm); + ImgBeanHolder holder = new ImgBeanHolder(); + holder.bitmap = getBitmapFromLruCache(path); + holder.imageView = imageView; + holder.path = path; + Message message = Message.obtain(); + message.obj = holder; + // Log.e("TAG", "mHandler.sendMessage(message);"); + mHandler.sendMessage(message); + mPoolSemaphore.release(); + } + }); + } + + } + + /** + * 添加一个任务 + * + * @param runnable + */ + private synchronized void addTask(Runnable runnable) + { + try + { + // 请求信号量,防止mPoolThreadHander为null + if (mPoolThreadHander == null) + mSemaphore.acquire(); + } catch (InterruptedException e) + { + } + mTasks.add(runnable); + + mPoolThreadHander.sendEmptyMessage(0x110); + } + + /** + * 取出一个任务 + * + * @return + */ + private synchronized Runnable getTask() + { + if (mType == Type.FIFO) + { + return mTasks.removeFirst(); + } else if (mType == Type.LIFO) + { + return mTasks.removeLast(); + } + return null; + } + + /** + * 单例获得该实例对象 + * + * @return + */ + public static ImageLoader getInstance(int threadCount, Type type) + { + + if (mInstance == null) + { + synchronized (ImageLoader.class) + { + if (mInstance == null) + { + mInstance = new ImageLoader(threadCount, type); + } + } + } + return mInstance; + } + + + /** + * 根据ImageView获得适当的压缩的宽和高 + * + * @param imageView + * @return + */ + private ImageSize getImageViewWidth(ImageView imageView) + { + ImageSize imageSize = new ImageSize(); + final DisplayMetrics displayMetrics = imageView.getContext() + .getResources().getDisplayMetrics(); + final LayoutParams params = imageView.getLayoutParams(); + + int width = params.width == LayoutParams.WRAP_CONTENT ? 0 : imageView + .getWidth(); // Get actual image width + if (width <= 0) + width = params.width; // Get layout width parameter + if (width <= 0) + width = getImageViewFieldValue(imageView, "mMaxWidth"); // Check + // maxWidth + // parameter + if (width <= 0) + width = displayMetrics.widthPixels; + int height = params.height == LayoutParams.WRAP_CONTENT ? 0 : imageView + .getHeight(); // Get actual image height + if (height <= 0) + height = params.height; // Get layout height parameter + if (height <= 0) + height = getImageViewFieldValue(imageView, "mMaxHeight"); // Check + // maxHeight + // parameter + if (height <= 0) + height = displayMetrics.heightPixels; + imageSize.width = width; + imageSize.height = height; + return imageSize; + + } + + /** + * 从LruCache中获取一张图片,如果不存在就返回null。 + */ + private Bitmap getBitmapFromLruCache(String key) + { + return mLruCache.get(key); + } + + /** + * 往LruCache中添加一张图片 + * + * @param key + * @param bitmap + */ + private void addBitmapToLruCache(String key, Bitmap bitmap) + { + if (getBitmapFromLruCache(key) == null) + { + if (bitmap != null) + mLruCache.put(key, bitmap); + } + } + + /** + * 计算inSampleSize,用于压缩图片 + * + * @param options + * @param reqWidth + * @param reqHeight + * @return + */ + private int calculateInSampleSize(BitmapFactory.Options options, + int reqWidth, int reqHeight) + { + // 源图片的宽度 + int width = options.outWidth; + int height = options.outHeight; + int inSampleSize = 1; + + if (width > reqWidth && height > reqHeight) + { + // 计算出实际宽度和目标宽度的比率 + int widthRatio = Math.round((float) width / (float) reqWidth); + int heightRatio = Math.round((float) width / (float) reqWidth); + inSampleSize = Math.max(widthRatio, heightRatio); + } + return inSampleSize; + } + + /** + * 根据计算的inSampleSize,得到压缩后图片 + * + * @param pathName + * @param reqWidth + * @param reqHeight + * @return + */ + private Bitmap decodeSampledBitmapFromResource(String pathName, + int reqWidth, int reqHeight) + { + // 第一次解析将inJustDecodeBounds设置为true,来获取图片大小 + final BitmapFactory.Options options = new BitmapFactory.Options(); + options.inJustDecodeBounds = true; + BitmapFactory.decodeFile(pathName, options); + // 调用上面定义的方法计算inSampleSize值 + options.inSampleSize = calculateInSampleSize(options, reqWidth, + reqHeight); + // 使用获取到的inSampleSize值再次解析图片 + options.inJustDecodeBounds = false; + Bitmap bitmap = BitmapFactory.decodeFile(pathName, options); + + return bitmap; + } + + private class ImgBeanHolder + { + Bitmap bitmap; + ImageView imageView; + String path; + } + + private class ImageSize + { + int width; + int height; + } + + /** + * 反射获得ImageView设置的最大宽度和高度 + * + * @param object + * @param fieldName + * @return + */ + private static int getImageViewFieldValue(Object object, String fieldName) + { + int value = 0; + try + { + Field field = ImageView.class.getDeclaredField(fieldName); + field.setAccessible(true); + int fieldValue = (Integer) field.get(object); + if (fieldValue > 0 && fieldValue < Integer.MAX_VALUE) + { + value = fieldValue; + + Log.e("TAG", value + ""); + } + } catch (Exception e) + { + } + return value; + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/JpushUtil.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/JpushUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..71bb1a34cdd5a058922030aea7da4451d1f410b7 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/JpushUtil.java @@ -0,0 +1,90 @@ +package com.jiuqi.elove.util; + +import android.annotation.SuppressLint; +import android.os.Handler; +import android.text.TextUtils; + +import com.jiuqi.elove.application.EloveApplication; + +import java.util.HashSet; +import java.util.Set; + +import cn.jpush.android.api.JPushInterface; +import cn.jpush.android.api.TagAliasCallback; + +/** + * 极光推送封装 + * Created by dl on 2017/7/11 + */ +public class JpushUtil { + + private static final int MSG_SET_ALIAS = 1001; + private static String tag; + + /** + * 绑定与解绑都可以用此方法 + * 绑定 传递相应的userid和identity + * 解绑 传递两个空字符串 + * @param userid 用户id,用于设置别名 + * @param identity 用户身份,用于设置tag + */ + public static void setAlias(String userid, String identity) { + tag = identity; + // 调用 Handler 来异步设置别名 + mHandler.sendMessage(mHandler.obtainMessage(MSG_SET_ALIAS, userid)); + } + + /** + * 解绑 + * 还是向外提供了一个专门用于解绑的方法 + * 不在调用handler而是直接设置 + */ + public static void shutPush() { + unOrSetAliasAndTags("",""); + } + + private static void unOrSetAliasAndTags(String alias,String tag){ + HashSet tagSet = new HashSet<>(); + if(!TextUtils.isEmpty(tag)){ + tagSet.add(tag); + } + // 调用 JPush 接口来设置别名。 + JPushInterface.setAliasAndTags(EloveApplication.getAppContext(), + alias, + tagSet, + mAliasCallback); + } + /** + * 极光推送handler + */ + @SuppressLint("HandlerLeak") + private final static Handler mHandler = new Handler() { + @Override + public void handleMessage(android.os.Message msg) { + super.handleMessage(msg); + switch (msg.what) { + case MSG_SET_ALIAS: + unOrSetAliasAndTags(String.valueOf(msg.obj),tag); + break; + default: + break; + } + } + }; + + private static final TagAliasCallback mAliasCallback = new TagAliasCallback() { + @Override + public void gotResult(int code, String alias, Set tags) { + switch (code) { + case 0: + break; + case 6002: + // 延迟 60 秒来调用 Handler 设置别名 + mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_SET_ALIAS, alias), 1000 * 60); + break; + default: + break; + } + } + }; +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/JqStrUtil.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/JqStrUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..4e7cbf32f66efffe70cfe0f7f50f50fe24fb94b7 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/JqStrUtil.java @@ -0,0 +1,126 @@ +package com.jiuqi.elove.util; + +import android.content.Context; +import android.widget.Toast; + +import com.jiuqi.elove.common.Constant; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Created by liulin on 2016/6/6 + */ +public class JqStrUtil { + + private static Toast toast; + + /** + * 判断一个字符串是否为null或空值 + * @param str 指定的字符串 + * @return true or false + */ + public static boolean isEmpty(String str){ + return str == null || str.trim().length() == 0; + } + + /** + * 判断字符串是否为手机号 + * @param str + * @return true or false + */ + public static boolean isMobileNo(String str) { + Pattern p = Pattern.compile("^((13[0-9])|(15[^4,\\D])|(17[0,6-8])|(18[0-9]))\\d{8}$"); + Matcher m = p.matcher(str); + return m.matches(); + } + + /** + * 判断是否为邮箱 + * @param str + * @return true or false + */ + public static Boolean isEmail(String str) { + Boolean isEmail = false; + String expr = "^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$"; + if (str.matches(expr)) { + isEmail = true; + } + return isEmail; + } + + /** + * 判断是否为中文,且位数不大于4位 + */ + public static Boolean isChinese(String str){ + Pattern pattern = Pattern.compile("[\u4e00-\u9fa5]+"); + Matcher m = pattern.matcher(str); + return m.matches(); + } + + /** + * 判断是否为英文,且不大于15位 + */ + public static Boolean isEnglish(String str){ + Pattern pattern = Pattern.compile("[a-zA-Z]+"); + Matcher m = pattern.matcher(str); + return m.matches(); + } + + /** + * 判断只为英文汉字数字下划线 + */ + public static Boolean isNikeName(String str){ + Pattern pattern = Pattern.compile("[\\u4e00-\\u9fa5\\w]+"); + Matcher m = pattern.matcher(str); + return m.matches(); + } + + /** + * toast提示消息 + * @param context + * @param content + */ + public static void showToast(Context context,String content){ + if(toast==null){ + toast = Toast.makeText(context,content,Toast.LENGTH_SHORT); + }else{ + toast.setText(content); + } + toast.show(); + } + + /** + * + * @param phonenum + * @return + */ + public static String returnStarPhone(String phonenum){ + if(isEmpty(phonenum) || phonenum.length()!=11){ + return ""; + } + String str1; + String str2; + String starPhone; + str1 = phonenum.substring(0,3); + str2 = phonenum.substring(7); + starPhone = str1 +"****"+str2; + return starPhone; + } + + /** + * 18位身份证号码的基本数字和位数验校 + * + * @param idcard + * @return + */ + public static boolean is18Idcard(String idcard) { + return Pattern.matches("^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([\\d|x|X]{1})$", idcard); + } + + public static boolean isLogin(){ + String userid = SpUtils.getString(Constant.USER_ID); + return !isEmpty(userid); + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/JsonUtil.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/JsonUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..2db1b1971c3fcac0dbe46906e3af3bcf81776ab8 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/JsonUtil.java @@ -0,0 +1,30 @@ +package com.jiuqi.elove.util; + +import android.content.Context; +import android.content.res.AssetManager; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +/** + * Created by dl on 2017/7/17 + */ +public class JsonUtil { + + public static String getJson(Context context,String fileName){ + StringBuilder sb = new StringBuilder(); + AssetManager manager = context.getAssets(); + try { + BufferedReader br = new BufferedReader(new InputStreamReader(manager.open(fileName))); + String next = ""; + while (null!=(next = br.readLine())){ + sb.append(next); + } + } catch (IOException e) { + e.printStackTrace(); + sb.delete(0,sb.length()); + } + return sb.toString().trim(); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/JudgeMultiMediaTypeUtil.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/JudgeMultiMediaTypeUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..66c3730b8a89064700cff6beb7f5098be39ba1e2 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/JudgeMultiMediaTypeUtil.java @@ -0,0 +1,123 @@ +package com.jiuqi.elove.util; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +/** + * framwork层hide没有给外部提供判断是否是视频的方法 + * 利用反射判断文件类型 + * 图片||视频 + * + * 使用方法(测试可用): + * JudgeMultiMediaTypeUtil util = new JudgeMultiMediaTypeUtil(); + * util.initReflect(); + * int type = util.getMediaFileType(dirPath); + * if(util.isImageFile(type)){ + * JqStrUtil.showToast(this,"图片"); + * }else if(util.isVideoFile(type)){ + * JqStrUtil.showToast(this,"视频"); + * } + * + * Created by dl on 2017/5/8. + */ +public class JudgeMultiMediaTypeUtil { + + Class mMediaFile, mMediaFileType; + Method getFileTypeMethod, isAudioFileTypeMethod, isVideoFileTypeMethod, isImageFileTypeMethod; + String methodName = "getBoolean"; + String getFileType = "getFileType"; + + String isAudioFileType = "isAudioFileType"; + String isVideoFileType = "isVideoFileType"; + String isImageFileType = "isImageFileType"; + + Field fileType; + + public void initReflect() { + try { + mMediaFile = Class.forName("android.media.MediaFile"); + mMediaFileType = Class.forName("android.media.MediaFile$MediaFileType"); + + fileType = mMediaFileType.getField("fileType"); + + getFileTypeMethod = mMediaFile.getMethod(getFileType, String.class); + + isAudioFileTypeMethod = mMediaFile.getMethod(isAudioFileType, int.class); + isVideoFileTypeMethod = mMediaFile.getMethod(isVideoFileType, int.class); + isImageFileTypeMethod = mMediaFile.getMethod(isImageFileType, int.class); + + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (NoSuchFieldException e) { + e.printStackTrace(); + } + + } + + public int getMediaFileType(String path) { + + int type = 0; + + try { + Object obj = getFileTypeMethod.invoke(mMediaFile, path); + if (obj == null) { + type = -1; + } else { + type = fileType.getInt(obj); + } + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + + return type; + } + + public boolean isAudioFile(int fileType) { + boolean isAudioFile = false; + try { + isAudioFile = (Boolean) isAudioFileTypeMethod.invoke(mMediaFile, fileType); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + return isAudioFile; + } + + public boolean isVideoFile(int fileType) { + boolean isVideoFile = false; + try { + isVideoFile = (Boolean) isVideoFileTypeMethod.invoke(mMediaFile, fileType); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + return isVideoFile; + } + + public boolean isImageFile(int fileType) { + boolean isImageFile = false; + try { + isImageFile = (Boolean) isImageFileTypeMethod.invoke(mMediaFile, fileType); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + return isImageFile; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/MyLayoutManager.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/MyLayoutManager.java new file mode 100644 index 0000000000000000000000000000000000000000..0129d246935b60c9898a0de94099adf117d9b87c --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/MyLayoutManager.java @@ -0,0 +1,87 @@ +package com.jiuqi.elove.util; + +import android.content.Context; +import android.util.DisplayMetrics; +import android.view.View; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; + +/** + * Created by jq on 2017/10/16. + */ + +public class MyLayoutManager { + + public static void setImageLayout(Context context, ImageView view, int dimen, int layoutType, int count) { + DisplayMetrics dm = context.getResources().getDisplayMetrics(); + int width = dm.widthPixels - dimen; + if(1==layoutType){ + view.setLayoutParams(new LinearLayout.LayoutParams(width/count,width/count)); + }else if(2==layoutType){ + view.setLayoutParams(new RelativeLayout.LayoutParams(width/count,width/count)); + }else if(3==layoutType){ + view.setLayoutParams(new FrameLayout.LayoutParams(width/count,width/count)); + } + } + + public static void setImageLayout(Context context, ImageView view, int dimen,int count,int left,int top,int right,int bottom) { + DisplayMetrics dm = context.getResources().getDisplayMetrics(); + int width = dm.widthPixels - dimen; + LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(width/count,width/count); + lp.setMargins(left,top,right,bottom); + view.setLayoutParams(lp); + + } + + public static void setImageLayout(Context context,ImageView view, int dimen,int layoutType,int wcount,int hcount) { + DisplayMetrics dm = context.getResources().getDisplayMetrics(); + int width = dm.widthPixels - dimen; + if(1==layoutType){ + view.setLayoutParams(new LinearLayout.LayoutParams(width/wcount,width/hcount)); + }else if(2==layoutType){ + view.setLayoutParams(new RelativeLayout.LayoutParams(width/wcount,width/hcount)); + }else if(3==layoutType){ + view.setLayoutParams(new FrameLayout.LayoutParams(width/wcount,width/hcount)); + } + } + + public static void setImageLayout(Context context,ImageView view, int dimen,int layoutType,int wcount,int hbigCount,int hsmallCount) { + DisplayMetrics dm = context.getResources().getDisplayMetrics(); + int width = dm.widthPixels - dimen; + if(1==layoutType){ + view.setLayoutParams(new LinearLayout.LayoutParams(width/wcount,hsmallCount*width/hbigCount)); + }else if(2==layoutType){ + view.setLayoutParams(new RelativeLayout.LayoutParams(width/wcount,hsmallCount*width/hbigCount)); + }else if(3==layoutType){ + view.setLayoutParams(new FrameLayout.LayoutParams(width/wcount,hsmallCount*width/hbigCount)); + } + } + + public static void setViewLayout(Context context, View view, int dimen, int layoutType, int wcount, int hbigCount, int hsmallCount) { + DisplayMetrics dm = context.getResources().getDisplayMetrics(); + int width = dm.widthPixels - dimen; + if(1==layoutType){ + view.setLayoutParams(new LinearLayout.LayoutParams(width/wcount,hsmallCount*width/hbigCount)); + }else if(2==layoutType){ + view.setLayoutParams(new RelativeLayout.LayoutParams(width/wcount,hsmallCount*width/hbigCount)); + }else if(3==layoutType){ + view.setLayoutParams(new FrameLayout.LayoutParams(width/wcount,hsmallCount*width/hbigCount)); + } + } + + public static int returnDisplayWidth(Context context){ + return context.getResources().getDisplayMetrics().widthPixels; + } + + public static void setImageLayout(ImageView view, int layoutType, int width,int height) { + if(1==layoutType){ + view.setLayoutParams(new LinearLayout.LayoutParams(width,height)); + }else if(2==layoutType){ + view.setLayoutParams(new RelativeLayout.LayoutParams(width,height)); + }else if(3==layoutType){ + view.setLayoutParams(new FrameLayout.LayoutParams(width,height)); + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/MyTextWatcher.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/MyTextWatcher.java new file mode 100644 index 0000000000000000000000000000000000000000..1944ea22855957615653282800f03877af91dba0 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/MyTextWatcher.java @@ -0,0 +1,54 @@ +package com.jiuqi.elove.util; + +import android.support.v4.content.ContextCompat; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.widget.EditText; +import android.widget.TextView; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.application.EloveApplication; + +import java.util.List; + +/** + * Created by jq on 2018/1/29. + */ + +public class MyTextWatcher implements TextWatcher { + + private List list; + private TextView tv; + + public MyTextWatcher(List mList,TextView tv){ + this.list = mList; + this.tv = tv; + } + + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + tv.setBackground(ContextCompat.getDrawable(EloveApplication.getAppContext(), R.drawable.text_login_register_bg)); + for(int i=0;i params,final OnGetJsonObject callback){ + FormBody.Builder formBuilder = new FormBody.Builder();//表单对象 + if(params!=null&&!params.isEmpty()){ + for(Map.Entry entry:params.entrySet()){ + formBuilder.add(entry.getKey(),entry.getValue()); + } + RequestBody requestBody = formBuilder.build(); + Request request = new Request.Builder().url(url).post(requestBody).build();//采用post方式 + client.newCall(request).enqueue(new Callback() { + @Override + public void onFailure(Call call, IOException e) { + e.printStackTrace(); + } + + @Override + public void onResponse(Call call, Response response) throws IOException { + if(response!=null&&response.isSuccessful()){ + onSuccessJsonObjectMethod(response.body().string(),callback); + } + } + }); + } + } + + public void sendJsonStrByPostAsync(final Context mContext, final boolean isShowProgress, String url, String jsonParams, final OnGetJsonObject callback, final OnUnGetJsonObject callback2){ + RequestBody requestBody = RequestBody.create(JSON,jsonParams); + Request request = new Request.Builder().tag(mContext).addHeader("Connection", "close").url(url).post(requestBody).build();//addheader来添加关闭长链接 + if (isShowProgress) { + if (dialog == null&&mContext!=null) { + dialog = LoadingDialog.createLoadingDialog(mContext, ""); + if(dialog!=null){ + try{ + dialog.show(); + }catch (Exception e){//捕获页面已经关闭产生的异常 + e.printStackTrace(); + } + + } + } + } + client.newCall(request).enqueue(new Callback() { + @Override + public void onFailure(Call call, final IOException e) { + if (isShowProgress) { +// mDialogFragment.dismiss(); +// progressBar.dismiss(); + if (dialog != null) { + dialog.dismiss(); + dialog = null; + } + } + /** + * 网络访问出错的原因判断,添加了获取网络超时的异常捕获,同时对访问服务器失败提供了共通的提示 + * 具体的根据各自特点的操作在回调函数onFailConnectServer中进行 + */ + e.printStackTrace(); + handler.post(new Runnable() { + @Override + public void run() { + if(!CommonUtil.isNetworkAvailable(mContext)){ + JqStrUtil.showToast(mContext,"访问服务器失败,请检查您的网络"); + } + } + }); + onFailConnectServer(callback2); + } + + @Override + public void onResponse(Call call, final Response response) throws IOException { + if(response!=null){//如果不是200则response.isSuccessful()是false + if (isShowProgress) { +// mDialogFragment.dismiss(); +// progressBar.dismiss(); + if (dialog != null) { + dialog.dismiss(); + dialog = null; + } + } + if(response.code()==200){ + String result = response.body().string();//调用一次只有就response.body()内容就不存在了,不能再两个地方重复使用 + if(!JqStrUtil.isEmpty(result)){ + onSuccessJsonObjectMethod(result,callback); + }else{ + handler.post(new Runnable() { + @Override + public void run() { + JqStrUtil.showToast(mContext,"服务器返回数据null"); + } + }); + } + }else if(response.code()>=500){ + handler.post(new Runnable() { + @Override + public void run() { + JqStrUtil.showToast(mContext,response.code()+":服务器错误"); + } + }); + }else if(response.code()==404){ + handler.post(new Runnable() { + @Override + public void run() { + JqStrUtil.showToast(mContext,response.code()+":访问地址不存在"); + } + }); + }else{ + handler.post(new Runnable() { + @Override + public void run() { + JqStrUtil.showToast(mContext,"error:"+response.code()); + } + }); + } + } + } + }); + } + /** + * 请求返回的结果是json字符串 + * @param jsonValue + * @param callback + */ + private void onSuccessJsonStringMethod(final String jsonValue,final OnGetString callback){ + handler.post(new Runnable() { + @Override + public void run() { + if(callback!=null){ + try { + Log.d(TAG, "run: "+jsonValue); + callback.onResponse(jsonValue); + }catch (Exception e){ + e.printStackTrace(); + } + } + } + }); + } + + /** + * 返回的结果是byte[]数组 + * @param data + * @param callback + */ + private void onSuccessByteMethod(final byte[] data,final OnGetByte callback){ + handler.post(new Runnable() { + @Override + public void run() { + if(callback!=null){ + callback.onResponse(data); + } + } + }); + } + /** + * 返回的响应结果是json对象 + * @param jsonValue + * @param callback + */ + private void onSuccessJsonObjectMethod(final String jsonValue,final OnGetJsonObject callback){ + handler.post(new Runnable() { + @Override + public void run() { + if(callback!=null){ + callback.onResponse(com.alibaba.fastjson.JSON.parseObject(jsonValue)); + } + } + }); + } + + private void onFailConnectServer(final OnUnGetJsonObject callback){ + handler.post(new Runnable() { + @Override + public void run() { + if(callback!=null){ + callback.onResponse(); + } + } + }); + } + + /** + * 取消tag标记的请求 + * @param tag + */ + public void cancelTag(Object tag) + { + for (Call call : client.dispatcher().queuedCalls()) + { + if (tag.equals(call.request().tag())) + { + call.cancel(); + } + } + for (Call call : client.dispatcher().runningCalls()) + { + if (tag.equals(call.request().tag())) + { + call.cancel(); + } + } + } + + public interface OnGetString{ + void onResponse(String result); + } + public interface OnGetByte{ + void onResponse(byte[] result); + } + public interface OnGetBitmap{ + void onResponse(Bitmap bitmap); + } + public interface OnGetJsonObject{ + void onResponse(JSONObject jsonObject); + } + + public interface OnUnGetJsonObject{ + void onResponse(); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/PickerUtil.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/PickerUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..aec49323b14b15ea3d52569c9e18ccbd2f258cff --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/PickerUtil.java @@ -0,0 +1,80 @@ +package com.jiuqi.elove.util; + + +import android.app.Activity; +import android.content.Context; +import android.graphics.Color; +import android.view.ViewGroup; +import android.widget.TextView; + +import com.bigkoo.pickerview.OptionsPickerView; +import com.bigkoo.pickerview.TimePickerView; + +import java.util.Calendar; +import java.util.List; + +/** + * Created by dl on 2017/12/3. + */ +public class PickerUtil{ + + private static OptionsPickerView pvOptions; + private static TimePickerView timePicker; + + private Context context; + + public PickerUtil(Context context){ + this.context = context; + } + + public PickerUtil setCreateOptionPicker(String title, OptionsPickerView.OnOptionsSelectListener listener){ + pvOptions = new OptionsPickerView.Builder(context, listener) + .setTitleText(title) + .setDividerColor(Color.BLACK) + .setTextColorCenter(Color.BLACK) //设置选中项文字颜色 + .setContentTextSize(20) + .setOutSideCancelable(true)// default is true + .setDecorView(null) + .build(); + return this; + } + + public PickerUtil createTimePikcer(Calendar select,Calendar start,Calendar end,TimePickerView.OnTimeSelectListener listener){ + timePicker = new TimePickerView.Builder(context, listener) + //年月日时分秒 的显示与否,不设置则默认全部显示 + .setType(new boolean[]{true, true, true, false, false, false}) + .setLabel("年", "月", "日", "", "", "") + .isCenterLabel(false) + .setDividerColor(Color.DKGRAY) + .setContentSize(21) + .setDate(select) + .setRangDate(start, end) + .setBackgroundId(0x00ffffff) //设置外部遮罩颜色 + .isCyclic(false) + .setDecorView((ViewGroup) ((Activity)context).getWindow().getDecorView()) + .build(); + return this; + } + + public void showTime(){ + timePicker.show(); + } + + public void showTime(TextView tv){ + timePicker.show(tv); + } + + public PickerUtil setData(List data){ + pvOptions.setPicker(data); + return this; + } + + public PickerUtil setSecondaryAddress(List data,List mList){ + pvOptions.setPicker(data,mList); + return this; + } + + public void show(){ + pvOptions.show(); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/PickerViewDataUtil.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/PickerViewDataUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..64e64d991d8493bfcc2dc79fde511fd668d6c071 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/PickerViewDataUtil.java @@ -0,0 +1,182 @@ +package com.jiuqi.elove.util; + +import android.text.TextUtils; + +import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.google.gson.reflect.TypeToken; +import com.jiuqi.elove.application.EloveApplication; +import com.jiuqi.elove.entity.ProvinceBean; +import com.jiuqi.elove.entity.SchoolBean; +import com.jiuqi.elove.entity.ThridAreaBean; + +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.List; + +/** + * 获取城市省份 + * Created by dl on 2017/7/18 + */ +public class PickerViewDataUtil { + + /** + * 获取所有省份 + */ + public static JsonArray getProvinces(){ + String provinceStr = JsonUtil.getJson(EloveApplication.getAppContext(),"province.json"); + return new JsonParser().parse(provinceStr).getAsJsonArray(); + } + + /** + * 获取所有的城市 + */ + public static JsonArray getCitys(){ + String cityStr = JsonUtil.getJson(EloveApplication.getAppContext(),"city.json"); + return new JsonParser().parse(cityStr).getAsJsonArray(); + } + + /** + * 获取所有的学校 + */ + public static List getSchoolList(){ + String provinceStr = JsonUtil.getJson(EloveApplication.getAppContext(),"school.json"); + JsonArray schoolArray = new JsonParser().parse(provinceStr).getAsJsonArray(); + Gson gson = new Gson(); + Type type = new TypeToken>() {}.getType(); + return gson.fromJson(schoolArray,type); + } + + /** + * 获取所有的第三级地址数据 + */ + public static JsonArray getArea(){ + String areaStr = JsonUtil.getJson(EloveApplication.getAppContext(),"area.json"); + return new JsonParser().parse(areaStr).getAsJsonArray(); + } + + /** + * 根据省id获取省份 + */ + public static String getProvince(int proId){ + for (int i= 0;i getProvinceList(){ + JsonArray provinceArray = getProvinces(); + Gson gson = new Gson(); + Type type = new TypeToken>() {}.getType(); + ArrayList data = gson.fromJson(provinceArray,type); + for(int i=0;i>(){}.getType(); + ArrayList cityData = gson.fromJson(cityArray,stype); + data.get(i).setCityList(cityData); + } + return data; + } + + /** + * 获取省份单独 + */ + public static List getProvinceOnlyList(){ + JsonArray provinceArray = getProvinces(); + Gson gson = new Gson(); + Type type = new TypeToken>() {}.getType(); + return gson.fromJson(provinceArray,type); + } + + /** + * 获取城市单独 + */ + public static List getCityOnlyList(){ + JsonArray cityArray = getCitys(); + Gson gson = new Gson(); + Type type = new TypeToken>() {}.getType(); + return gson.fromJson(cityArray,type); + } + + /** + * 获取地区单独 + */ + public static List getAreaOnlyList(){ + JsonArray areaArray = getArea(); + Gson gson = new Gson(); + Type type = new TypeToken>(){}.getType(); + return gson.fromJson(areaArray,type); + } + +// /** +// * 获取省份城市二级列表 +// */ +// public static List> getProvinceAndCityList(){ +// List> result = new ArrayList<>(); +// List proList = getProvinceOnlyList(); +// for(int i=0;i> getChildCityList(){ + List> province_city_list = new ArrayList<>(); + List mList = getProvinceList(); + for(int i=0;i cityList = mList.get(i).getCityList(); + province_city_list.add(cityList); + } + return province_city_list; + } + + /** + * 获取各个身份下城市名称list + */ + public static List> getCityNameList(){ + List> province_city_list = new ArrayList<>(); + List mList = getProvinceList(); + for(int i=0;i cityList = mList.get(i).getCityList(); + List nameList = new ArrayList<>(); + for(int j=0;j clazz = Class.forName("com.android.internal.R$dimen"); + Object object = clazz.newInstance(); + int height = Integer.parseInt(clazz.getField("status_bar_height") + .get(object).toString()); + statusBarHeight = EloveApplication.getAppContext().getResources().getDimensionPixelSize(height); + } catch (Exception e) { + e.printStackTrace(); + } + return statusBarHeight; + } + + /** + * 设置状态栏高度 + */ + public static void setStatusView(View view, boolean isshow){ + if(null!=view){ + if(isshow){ + ViewGroup.LayoutParams lp = view.getLayoutParams(); + lp.height = intStatusView(); + lp.width = ViewGroup.LayoutParams.MATCH_PARENT; + view.requestLayout(); + view.setVisibility(View.VISIBLE); + }else{ + view.setVisibility(View.GONE); + } + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/StatusBarUtils.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/StatusBarUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..062e0be07467111839e0c1676fccc9403a988354 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/StatusBarUtils.java @@ -0,0 +1,156 @@ +package com.jiuqi.elove.util; + +import android.app.Activity; +import android.content.Context; +import android.graphics.Color; +import android.os.Build; +import android.support.annotation.ColorInt; +import android.support.v4.view.ViewCompat; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; +import android.widget.LinearLayout; + +/** + * Created by dl on 2017/6/7. + */ +public class StatusBarUtils { + + + public static void setColor(Activity activity, @ColorInt int color, int statusBarAlpha){ + //先设置的全屏模式 + setFullScreen(activity); + //在透明状态栏的垂直下方放置一个和状态栏同样高宽的view + addStatusBarBehind(activity,color,statusBarAlpha); + } + /** + * 添加了一个状态栏(实际上是个view),放在了状态栏的垂直下方 + */ + public static void addStatusBarBehind(Activity activity, @ColorInt int color, int statusBarAlpha) { + //获取windowphone下的decorView + ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView(); + int count = decorView.getChildCount(); + //判断是否已经添加了statusBarView + if (count > 0 && decorView.getChildAt(count - 1) instanceof StatusBarView) { + decorView.getChildAt(count - 1).setBackgroundColor(calculateStatusColor(color, statusBarAlpha)); + } else { + //新建一个和状态栏高宽的view + StatusBarView statusView = createStatusBarView(activity, color, statusBarAlpha); + decorView.addView(statusView); + } + setRootView(activity); + } + + public static void setTranslucentImageHeader(Activity activity, int alpha, View needOffsetView){ + setFullScreen(activity); + //获取windowphone下的decorView + ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView(); + int count = decorView.getChildCount(); + //判断是否已经添加了statusBarView + if (count > 0 && decorView.getChildAt(count - 1) instanceof StatusBarView) { + decorView.getChildAt(count - 1).setBackgroundColor(Color.argb(alpha, 0, 0, 0)); + } else { + //新建一个和状态栏高宽的view + StatusBarView statusView = createTranslucentStatusBarView(activity, alpha); + decorView.addView(statusView); + } + + if (needOffsetView != null) { + ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) needOffsetView.getLayoutParams(); + layoutParams.setMargins(0, getStatusBarHeight(activity), 0, 0); + } + + } + + + + private static StatusBarView createTranslucentStatusBarView(Activity activity, int alpha) { + // 绘制一个和状态栏一样高的矩形 + StatusBarView statusBarView = new StatusBarView(activity); + LinearLayout.LayoutParams params = + new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity)); + statusBarView.setLayoutParams(params); + statusBarView.setBackgroundColor(Color.argb(alpha, 0, 0, 0)); + return statusBarView; + } + + /** + * 设置根布局参数 + */ + private static void setRootView(Activity activity) { + ViewGroup rootView = (ViewGroup) ((ViewGroup) activity.findViewById(android.R.id.content)).getChildAt(0); + //rootview不会为状态栏流出状态栏空间 + ViewCompat.setFitsSystemWindows(rootView,true); + rootView.setClipToPadding(true); + } + private static StatusBarView createStatusBarView(Activity activity, int color, int alpha) { + // 绘制一个和状态栏一样高的矩形 + StatusBarView statusBarView = new StatusBarView(activity); + LinearLayout.LayoutParams params = + new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity)); + statusBarView.setLayoutParams(params); + statusBarView.setBackgroundColor(calculateStatusColor(color, alpha)); + return statusBarView; + } + + /** + * 获取状态栏高度 + * + * @param context context + * @return 状态栏高度 + */ + private static int getStatusBarHeight(Context context) { + // 获得状态栏高度 + int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android"); + return context.getResources().getDimensionPixelSize(resourceId); + } + /** + * 计算状态栏颜色 + * + * @param color color值 + * @param alpha alpha值 + * @return 最终的状态栏颜色 + */ + private static int calculateStatusColor(int color, int alpha) { + float a = 1 - alpha / 255f; + int red = color >> 16 & 0xff; + int green = color >> 8 & 0xff; + int blue = color & 0xff; + red = (int) (red * a + 0.5); + green = (int) (green * a + 0.5); + blue = (int) (blue * a + 0.5); + return 0xff << 24 | red << 16 | green << 8 | blue; + } + + public static void setFullScreen(Activity activity){ + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + Window window = activity.getWindow(); + window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS + | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); + window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN| View.SYSTEM_UI_FLAG_LAYOUT_STABLE); + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + window.setStatusBarColor(Color.TRANSPARENT); + }else + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + // 设置透明状态栏,这样才能让 ContentView 向上 + activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + } + } + + public static class StatusBarView extends View { + + public StatusBarView(Context context) { + super(context); + } + + public StatusBarView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public StatusBarView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/StrUtil.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/StrUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..3869a1b1edafad7059d7017df4c88093e7a95111 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/StrUtil.java @@ -0,0 +1,159 @@ +package com.jiuqi.elove.util; + +import android.text.TextUtils; +import android.view.View; +import android.widget.TextView; + +/** + * 字符串工具类 + * 日常开发小助手 + * Created by dl on 2017/10/13. + */ + +public class StrUtil { + + /** + * 字符串为空,可以不显示内容时,直接给textview设置空 + */ + public static void setContent(TextView view,String s){ + if(TextUtils.isEmpty(s)){ + view.setText(""); + }else{ + view.setText(s); + } + } + /** + * 字符串为空,需要显示提示内容,并且需要指明是哪一项 + */ + public static void setContent(TextView view,String s,String title){ + if(TextUtils.isEmpty(s)){ + view.setText(title+"未知"); + }else{ + view.setText(s); + } + } + /** + * 字符串为空,需要显示提示内容,但是不需要指明是哪一项 + */ + public static void setContentUn(TextView view,String s){ + if(TextUtils.isEmpty(s)){ + view.setText("未知"); + }else{ + view.setText(s); + } + } + /** + * 字符串为空,需要显示提示内容,但是不需要指明是哪一项 + */ + public static void setContentNoLimit(TextView view,String s){ + if(TextUtils.isEmpty(s)){ + view.setText("不限"); + }else{ + view.setText(s); + } + } + /** + * 字符串为空,需要显示提示内容,但是不需要指明是哪一项 + */ + public static void setContentUnInput(TextView view,String s){ + if(TextUtils.isEmpty(s)){ + view.setText("未填"); + }else{ + view.setText(s); + } + } + /** + * 字符串为空,返回未知 + */ + public static String returnStr(String s){ + return TextUtils.isEmpty(s)?"未知":s; + } + /** + * 字符串为空,返回title+未知 + */ + public static String returnStr(String s,String title){ + return TextUtils.isEmpty(s)?title+"未知":s; + } + /** + * 字符串为空,返回空或者单位 + */ + public static String returnEmptyOrUnit(String s,String unit){ + return TextUtils.isEmpty(s)?"":s+unit; + } + + /** + * 字符串连接并且带空格 + */ + public static String returnLinkStr(String flag,String...strings){ + StringBuilder builder = new StringBuilder(); + for(int i=0;i 0) { + layoutParams.width = getScaleValue(layoutParams.width); + } + if (layoutParams.height > 0) { + layoutParams.height = getScaleValue(layoutParams.height); + } + if (layoutParams instanceof ViewGroup.MarginLayoutParams) { + ViewGroup.MarginLayoutParams marginLayoutParams = (ViewGroup.MarginLayoutParams) layoutParams; + int topMargin = getScaleValue(marginLayoutParams.topMargin); + int leftMargin = getScaleValue(marginLayoutParams.leftMargin); + int bottomMargin = getScaleValue(marginLayoutParams.bottomMargin); + int rightMargin = getScaleValue(marginLayoutParams.rightMargin); + marginLayoutParams.topMargin = topMargin; + marginLayoutParams.leftMargin = leftMargin; + marginLayoutParams.bottomMargin = bottomMargin; + marginLayoutParams.rightMargin = rightMargin; + } + } + view.setLayoutParams(layoutParams); + } + } + + private static void setTextViewCompoundDrawables(TextView textView, Drawable leftDrawable, Drawable topDrawable, Drawable rightDrawable, Drawable bottomDrawable) { + if(null != leftDrawable) { + scaleDrawableBounds(leftDrawable); + } + if(null != rightDrawable) { + scaleDrawableBounds(rightDrawable); + } + if(null != topDrawable) { + scaleDrawableBounds(topDrawable); + } + if(null != bottomDrawable) { + scaleDrawableBounds(bottomDrawable); + } + textView.setCompoundDrawables(leftDrawable, topDrawable, rightDrawable, bottomDrawable); + } + + public static Drawable scaleDrawableBounds(Drawable drawable) { + int right=getScaleValue(drawable.getIntrinsicWidth()); + int bottom=getScaleValue(drawable.getIntrinsicHeight()); + drawable.setBounds(0, 0, right, bottom); + return drawable; + } + + public static void scaleTextView(TextView textView) { + if (null != textView) { + scaleViewSize(textView); + Object isScale = textView.getTag(R.id.is_scale_font_tag); + if (!(isScale instanceof Boolean) || !((Boolean) isScale).booleanValue()) { + float size = textView.getTextSize(); + size *= scale; + textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, size); + } + Drawable[] drawables = textView.getCompoundDrawables(); + Drawable leftDrawable = drawables[0]; + Drawable topDrawable = drawables[1]; + Drawable rightDrawable = drawables[2]; + Drawable bottomDrawable = drawables[3]; + setTextViewCompoundDrawables(textView, leftDrawable, topDrawable, rightDrawable, bottomDrawable); + int compoundDrawablePadding = getScaleValue(textView.getCompoundDrawablePadding()); + textView.setCompoundDrawablePadding(compoundDrawablePadding); + } + } + + public static int getScaleValue(int value) { + return value <= 4?value:(int) Math.ceil((double)(scale * (float)value)); + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/UploadAliUtil.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/UploadAliUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..4b8d1dfb3cde7cb3f91f6c677053d37b3f6f1c20 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/UploadAliUtil.java @@ -0,0 +1,161 @@ +package com.jiuqi.elove.util; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; + +import com.alibaba.fastjson.JSONObject; +import com.alibaba.sdk.android.oss.common.utils.BinaryUtil; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.concurrent.TimeUnit; + +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.MediaType; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; + +/** + * 上传阿里云工具类 + * Created by dl on 2017/5/9. + */ +public class UploadAliUtil { + + private static final String ALI_URL = Constant.COMMON_URL + Interface.GET_ALIYUN; + private OkHttpUtil okHttpUtil = OkHttpUtil.getInstance(); + private OnUpLoadAli onUpLoadAli; + private OnCompletePutAli onCompletePutAli; + private Context context; + + public UploadAliUtil(Context context){ + this.context = context; + } + + /** + * 获取要上传的阿里云的地址 + * @param dirPath 文件路劲 + * @param flag 文件类型 + */ + public void uploadFile2Ali(String dirPath,int flag){ + String md5 = ""; + Bitmap photo; + int size = 0; + byte[] bytes = null; + try { + if (Constant.PUT_VIDEO_ACTION == flag) {//视频 + md5 = BinaryUtil.calculateBase64Md5(dirPath); + bytes = inputStreamToBytes(dirPath); + size = bytes.length; + } else {//图片 + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + md5 = BinaryUtil.calculateBase64Md5(dirPath); + photo = BitmapFactory.decodeFile(dirPath); + photo.compress(Bitmap.CompressFormat.JPEG, 30, bos); + bytes = bos.toByteArray(); + size = bytes.length; + bos.flush(); + bos.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + final byte[] finalBytes = bytes; + JSONObject obj = new JSONObject(); + obj.put("md5",md5); + obj.put("size",size); + obj.put("version", Constant.VERSION); + if(Constant.PUT_VIDEO_ACTION==flag){ + obj.put("action",Constant.PUT_VIDEO_ACTION); + } + final String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(context,false,ALI_URL, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + if(onUpLoadAli!=null){ + onUpLoadAli.upLoadHandle(jsonObject,finalBytes,param); + } + } + },null); + } + + /** + * 获取阿里云上传地址之后的接口回调 + */ + public interface OnUpLoadAli{ + void upLoadHandle(JSONObject obj,byte[] bytes,String param); + } + + /** + * 提供给外部的设置回调接口具体实现的方法(由具体类实现具体操作) + * 获取阿里云上传路径成功之后的回调函数设置 + * @param onUpLoadAli + */ + public void setAliInterface(OnUpLoadAli onUpLoadAli){ + this.onUpLoadAli = onUpLoadAli; + } + + /** + * put请求上传文件到阿里云相应地址下,final String md5,final String size,final String key + */ + public void put(MediaType mediaType, String uploadUrl, byte[] bytes) throws IOException { + OkHttpClient client = new OkHttpClient.Builder().readTimeout(60, TimeUnit.SECONDS)//设置读取超时时间 + .writeTimeout(60,TimeUnit.SECONDS)//设置写的超时时间 + .connectTimeout(60,TimeUnit.SECONDS).build();//设置连接超时时间 ;; + RequestBody body = RequestBody.create(mediaType, bytes); + Request request = new Request.Builder().url(uploadUrl).put(body).build(); + client.newCall(request).enqueue(new Callback() { + @Override + public void onFailure(Call call, IOException e) { + if(onCompletePutAli!=null){ + onCompletePutAli.onFailure(); + } + } + @Override + public void onResponse(Call call, Response response) throws IOException { + if(onCompletePutAli!=null){ + onCompletePutAli.onSuccess(); + } + } + }); + } + + /** + * 上传阿里云结果回调接口 + */ + public interface OnCompletePutAli{ + void onFailure(); + void onSuccess(); + } + + /** + * 设置上传阿里云文件之后的回调接口函数 + */ + public void setCompletePutAli(OnCompletePutAli onCompletePutAli){ + this.onCompletePutAli = onCompletePutAli; + } + + /** + * 根据文件url转换为byte + */ + public byte[] inputStreamToBytes(String dirPath) throws IOException { + File file = new File(dirPath); + FileInputStream fileInputStream = new FileInputStream(file); + byte[] temp = new byte[2048]; + ByteArrayOutputStream swapStream = new ByteArrayOutputStream(); + int rc; + while((rc = fileInputStream.read(temp,0,2048))>0){ + swapStream.write(temp,0,rc); + } + fileInputStream.close(); + + return swapStream.toByteArray(); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/VideoUtil.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/VideoUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..e6de0efe400313f7b07fca95c2f9fe3c025f4555 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/util/VideoUtil.java @@ -0,0 +1,96 @@ +package com.jiuqi.elove.util; + +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.drawable.BitmapDrawable; +import android.media.MediaMetadataRetriever; +import android.os.Build; +import android.provider.MediaStore; +import android.util.Log; +import android.view.View; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; + +/** + * Created by FanWenXia on 2016/9/18. + */ +public class VideoUtil { + + public static Bitmap createVideoThumbnail(String filePath) { + // MediaMetadataRetriever is available on API Level 8 + // but is hidden until API Level 10 + Class clazz = null; + Object instance = null; + try { + clazz = Class.forName("android.media.MediaMetadataRetriever"); + instance = clazz.newInstance(); + + Method method = clazz.getMethod("setDataSource", String.class); + method.invoke(instance, filePath); + + // The method name changes between API Level 9 and 10. + if (Build.VERSION.SDK_INT <= 9) { + return (Bitmap) clazz.getMethod("captureFrame").invoke(instance); + } else { + byte[] data = (byte[]) clazz.getMethod("getEmbeddedPicture").invoke(instance); + if (data != null) { + Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); + if (bitmap != null) return bitmap; + } + return (Bitmap) clazz.getMethod("getFrameAtTime").invoke(instance); + } + } catch (IllegalArgumentException ex) { + // Assume this is a corrupt video file + } catch (RuntimeException ex) { + // Assume this is a corrupt video file. + } catch (InstantiationException e) { + Log.e("TAG", "createVideoThumbnail", e); + } catch (InvocationTargetException e) { + Log.e("TAG", "createVideoThumbnail", e); + } catch (ClassNotFoundException e) { + Log.e("TAG", "createVideoThumbnail", e); + } catch (NoSuchMethodException e) { + Log.e("TAG", "createVideoThumbnail", e); + } catch (IllegalAccessException e) { + Log.e("TAG", "createVideoThumbnail", e); + } finally { + try { + if (instance != null) { + clazz.getMethod("release").invoke(instance); + } + } catch (Exception ignored) { + } + } + return null; + } + /** + * 获取网络视频第一帧 + */ + public static Bitmap createOnlineVideoThumbnail(String url) { + Bitmap bitmap = null; + MediaMetadataRetriever retriever = new MediaMetadataRetriever(); + int kind = MediaStore.Video.Thumbnails.MINI_KIND; + try { + if (Build.VERSION.SDK_INT >= 14) { + retriever.setDataSource(url, new HashMap()); + } else { + retriever.setDataSource(url); + } + bitmap = retriever.getFrameAtTime(); + } catch (IllegalArgumentException ex) { + // Assume this is a corrupt video file + } catch (RuntimeException ex) { + // Assume this is a corrupt video file. + } finally { + try { + retriever.release(); + } catch (RuntimeException ex) { + // Ignore failures while cleaning up. + } + } + return bitmap; + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/AgerqPickerLayout.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/AgerqPickerLayout.java new file mode 100644 index 0000000000000000000000000000000000000000..b2b3cd9b1925a23666206e3f04c1c1a2d8476a84 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/AgerqPickerLayout.java @@ -0,0 +1,131 @@ +package com.jiuqi.elove.widget; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.widget.LinearLayout; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.CommonDataUtil; +import com.jiuqi.elove.util.JqStrUtil; + +import java.util.ArrayList; + +/** + * 2.53仅年龄要求选择用 + * Created by dl on 2016/12/26. + */ +public class AgerqPickerLayout extends LinearLayout { + private WheelView prePicker; + private WheelView nextPicker; + + + private int mCurrPreIndex = -1; + private int mCurrNextIndex = -1; + + private ArrayList preDataList = new ArrayList<>(); + private ArrayList nextDataList = new ArrayList<>(); + + public AgerqPickerLayout(Context context, AttributeSet attrs) { + super(context, attrs); + getDataInfo(); + } + + public AgerqPickerLayout(Context context) { + this(context, null); + } + + + + private void getDataInfo() { + preDataList = CommonDataUtil.setAgeListRq(); + nextDataList = CommonDataUtil.setAgeListRq(); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + LayoutInflater.from(getContext()).inflate(R.layout.layout_city_picker, this); + + prePicker = (WheelView) findViewById(R.id.province_wv); + nextPicker = (WheelView) findViewById(R.id.city_wv); + + prePicker.setData(preDataList); + prePicker.setDefault(0); + + nextPicker.setData(nextDataList); + nextPicker.setDefault(0); + + prePicker.setOnSelectListener(new WheelView.OnSelectListener(){ + @Override + public void endSelect(int id, String text) { + if(JqStrUtil.isEmpty(text)){ + return; + } + if (mCurrPreIndex != id) { + mCurrPreIndex = id; + String selectPre = prePicker.getSelectedText(); + if (JqStrUtil.isEmpty(selectPre)) + return; + + if(id!=0){ + if (mCurrNextIndex!=-1&&mCurrNextIndex!=0&&mCurrNextIndexmCurrNextIndex) { + prePicker.setDefault(id); + } + } + } + } + + @Override + public void selecting(int id, String text) { + + } + }); + } + + public String getPre() { + if (prePicker == null) { + return null; + } + return prePicker.getSelectedText(); + } + + public String getNext() { + if (nextPicker == null) { + return null; + } + return nextPicker.getSelectedText(); + } + + public void setWheelViewItemNumber(int number){ + prePicker.setItemNumber(number); + nextPicker.setItemNumber(number); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/BasePopupWindowForListView.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/BasePopupWindowForListView.java new file mode 100644 index 0000000000000000000000000000000000000000..c94a482a7a059da1b126c3250b09caf90295c12a --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/BasePopupWindowForListView.java @@ -0,0 +1,94 @@ +package com.jiuqi.elove.widget; + +import java.util.List; + +import android.content.Context; +import android.graphics.drawable.BitmapDrawable; +import android.view.MotionEvent; +import android.view.View; +import android.view.View.OnTouchListener; +import android.widget.PopupWindow; + +/** + * 自定义选择照片时的popupwindow基类 + * @author dl + */ +public abstract class BasePopupWindowForListView extends PopupWindow +{ + /** + * 布局文件的最外层View + */ + protected View mContentView; + protected Context context; + /** + * ListView的数据集 + */ + protected List mDatas; + + public BasePopupWindowForListView(View contentView, int width, int height, + boolean focusable) + { + this(contentView, width, height, focusable, null); + } + + public BasePopupWindowForListView(View contentView, int width, int height, + boolean focusable, List mDatas) + { + this(contentView, width, height, focusable, mDatas, new Object[0]); + + } + + public BasePopupWindowForListView(View contentView, int width, int height, + boolean focusable, List mDatas, Object... params) + { + super(contentView, width, height, focusable); + this.mContentView = contentView; + context = contentView.getContext(); + if (mDatas != null) + this.mDatas = mDatas; + + if (params != null && params.length > 0) + { + beforeInitWeNeedSomeParams(params); + } + + setBackgroundDrawable(new BitmapDrawable()); + setTouchable(true); + setOutsideTouchable(true); + setTouchInterceptor(new OnTouchListener() + { + @Override + public boolean onTouch(View v, MotionEvent event) + { + if (event.getAction() == MotionEvent.ACTION_OUTSIDE) + { + dismiss(); + return true; + } + return false; + } + }); + initViews(); + initEvents(); + init(); + } + + protected abstract void beforeInitWeNeedSomeParams(Object... params); + + public abstract void initViews(); + + public abstract void initEvents(); + + public abstract void init(); + + public View findViewById(int id) + { + return mContentView.findViewById(id); + } + + protected static int dpToPx(Context context, int dp) + { + return (int) (context.getResources().getDisplayMetrics().density * dp + 0.5f); + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/BottomScrollView.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/BottomScrollView.java new file mode 100644 index 0000000000000000000000000000000000000000..49402806a75487d8297d96cc0163762af700b74c --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/BottomScrollView.java @@ -0,0 +1,39 @@ +package com.jiuqi.elove.widget; + +import android.content.Context; +import android.util.AttributeSet; +import android.widget.ScrollView; + +/** + * 自定义具备滑动到头部和底部监听功能的scrollview(精选和问答评论列表需要) + * @author dl + */ +public class BottomScrollView extends ScrollView { + + private OnScrollToBottomListener onScrollToBottom; + + public BottomScrollView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public BottomScrollView(Context context) { + super(context); + } + + @Override + protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, + boolean clampedY) { + super.onOverScrolled(scrollX, scrollY, clampedX, clampedY); + if(scrollY != 0 && null != onScrollToBottom){ + onScrollToBottom.onScrollBottomListener(clampedY); + } + } + + public void setOnScrollToBottomLintener(OnScrollToBottomListener listener){ + onScrollToBottom = listener; + } + + public interface OnScrollToBottomListener{ + public void onScrollBottomListener(boolean isBottom); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/CityPickerLayout.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/CityPickerLayout.java new file mode 100644 index 0000000000000000000000000000000000000000..ab88c1dbe954595dff723e4ea81e1e92d1b29367 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/CityPickerLayout.java @@ -0,0 +1,137 @@ +package com.jiuqi.elove.widget; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.widget.LinearLayout; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.adapter.AreaDataUtil; + +import java.util.ArrayList; + +/** + * 资料中城市选择需要2.53版本后没有用到,做保留 + * @author dl + */ +public class CityPickerLayout extends LinearLayout { + + private WheelView mProvincePicker; + private WheelView mCityPicker; + + private int mCurrProvinceIndex = -1; + private int mCurrCityIndex = -1; + private String flag = "adr"; + + private AreaDataUtil mAreaDataUtil; + private ArrayList mProvinceList = new ArrayList<>(); + + public CityPickerLayout(Context context, AttributeSet attrs) { + super(context, attrs); + getAreaInfo(); + } + + public CityPickerLayout(Context context) { + this(context, null); + } + + private void getAreaInfo() { + mAreaDataUtil = new AreaDataUtil(getContext(),flag); + mProvinceList = mAreaDataUtil.getProvinces(); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + LayoutInflater.from(getContext()).inflate(R.layout.layout_city_picker, this); + + mProvincePicker = (WheelView) findViewById(R.id.province_wv); + mCityPicker = (WheelView) findViewById(R.id.city_wv); + + mProvincePicker.setData(mProvinceList); + mProvincePicker.setDefault(0); + + String defaultProvince = mProvinceList.get(0); + mCityPicker.setData(mAreaDataUtil.getCityByProvince(defaultProvince)); + mCityPicker.setDefault(1); + + mProvincePicker.setOnSelectListener(new WheelView.OnSelectListener() { + @Override + public void endSelect(int id, String text) { + if (text.equals("") || text == null) + return; + if (mCurrProvinceIndex != id) { + mCurrProvinceIndex = id; + String selectProvince = mProvincePicker.getSelectedText(); + if (selectProvince == null || selectProvince.equals("")) + return; + + // get city names by province + ArrayList city = mAreaDataUtil.getCityByProvince(mProvinceList.get(id)); + if (city.size() == 0) { + return; + } + + mCityPicker.setData(city); + + if (city.size() > 1) { + //if city is more than one,show start index == 1 + mCityPicker.setDefault(1); + } else { + mCityPicker.setDefault(0); + } + } + + } + + @Override + public void selecting(int id, String text) { + } + }); + + mCityPicker.setOnSelectListener(new WheelView.OnSelectListener() { + + @Override + public void endSelect(int id, String text) { + if (text.equals("") || text == null) + return; + if (mCurrCityIndex != id) { + mCurrCityIndex = id; + String selectCity = mCityPicker.getSelectedText(); + if (selectCity == null || selectCity.equals("")) + return; + int lastIndex = Integer.valueOf(mCityPicker.getListSize()); + if (id > lastIndex) { + mCityPicker.setDefault(lastIndex - 1); + } + } + } + + @Override + public void selecting(int id, String text) { + + } + }); + } + + public String getProvince() { + if (mProvincePicker == null) { + return null; + } + return mProvincePicker.getSelectedText(); + } + + public String getCity() { + if (mCityPicker == null) { + return null; + } + return mCityPicker.getSelectedText(); + } + + public void setWheelViewItemNumber(int number){ + mProvincePicker .setItemNumber(number); + mCityPicker.setItemNumber(number); + } + + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/CityRequestPickerLayout.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/CityRequestPickerLayout.java new file mode 100644 index 0000000000000000000000000000000000000000..72208a6c18960c04e8fc9107ae1a3b50c6d8cc7e --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/CityRequestPickerLayout.java @@ -0,0 +1,140 @@ +package com.jiuqi.elove.widget; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.widget.LinearLayout; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.adapter.AreaDataUtil; + +import java.util.ArrayList; + +/** + * 资料中城市要求需要 + * Created by dl on 2016/9/10. + */ +public class CityRequestPickerLayout extends LinearLayout { + private WheelView mProvincePicker; + private WheelView mCityPicker; + + private int mCurrProvinceIndex = -1; + private int mCurrCityIndex = -1; + private String flag = "arq"; + + private AreaDataUtil mAreaDataUtil; + private ArrayList mProvinceList = new ArrayList<>(); + + public CityRequestPickerLayout(Context context, AttributeSet attrs) { + super(context, attrs); + getAreaInfo(); + } + + public CityRequestPickerLayout(Context context) { + this(context, null); + } + + private void getAreaInfo() { + mAreaDataUtil = new AreaDataUtil(getContext(),flag); + mProvinceList = mAreaDataUtil.getProvinces(); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + LayoutInflater.from(getContext()).inflate(R.layout.layout_city_picker, this); + + mProvincePicker = (WheelView) findViewById(R.id.province_wv); + mCityPicker = (WheelView) findViewById(R.id.city_wv); + + mProvincePicker.setData(mProvinceList); + mProvincePicker.setDefault(0); + + String defaultProvince = mProvinceList.get(0); + mCityPicker.setData(mAreaDataUtil.getCityByProvince(defaultProvince)); + if(mAreaDataUtil.getCityByProvince(defaultProvince).size()>1){ + mCityPicker.setDefault(1); + }else{ + mCityPicker.setDefault(0); + } + + mProvincePicker.setOnSelectListener(new WheelView.OnSelectListener() { + @Override + public void endSelect(int id, String text) { + if (text.equals("") || text == null) + return; + if (mCurrProvinceIndex != id) { + mCurrProvinceIndex = id; + String selectProvince = mProvincePicker.getSelectedText(); + if (selectProvince == null || selectProvince.equals("")) + return; + + // get city names by province + ArrayList city = mAreaDataUtil.getCityByProvince(mProvinceList.get(id)); + if (city.size() == 0) { + mCityPicker.setData(city);//这行自己加的,并不能解决次级为空城市显示的是上次显示的内容的问题 + return; + } + + mCityPicker.setData(city); + + if (city.size() > 1) { + //if city is more than one,show start index == 1 + mCityPicker.setDefault(1); + } else { + mCityPicker.setDefault(0); + } + } + + } + + @Override + public void selecting(int id, String text) { + } + }); + + mCityPicker.setOnSelectListener(new WheelView.OnSelectListener() { + + @Override + public void endSelect(int id, String text) { + if (text.equals("") || text == null) + return; + if (mCurrCityIndex != id) { + mCurrCityIndex = id; + String selectCity = mCityPicker.getSelectedText(); + if (selectCity == null || selectCity.equals("")) + return; + int lastIndex = Integer.valueOf(mCityPicker.getListSize()); + if (id > lastIndex) { + mCityPicker.setDefault(lastIndex - 1); + } + } + } + + @Override + public void selecting(int id, String text) { + + } + }); + } + + public String getProvince() { + if (mProvincePicker == null) { + return null; + } + return mProvincePicker.getSelectedText(); + } + + public String getCity() { + if (mCityPicker == null) { + return null; + } + return mCityPicker.getSelectedText(); + } + + public void setWheelViewItemNumber(int number){ + mProvincePicker.setItemNumber(number); + mCityPicker.setItemNumber(number); + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/ClearEditText.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/ClearEditText.java new file mode 100644 index 0000000000000000000000000000000000000000..ff896f77d5a144aea73c035abf841ade7f834206 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/ClearEditText.java @@ -0,0 +1,123 @@ +package com.jiuqi.elove.widget; + +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.text.Editable; +import android.text.TextWatcher; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.View; + +import com.jiuqi.elove.R; + +/** + * 输入文本框 右边有自带的删除按钮 当有输入时,显示删除按钮,当无输入时,不显示删除按钮。 + * + * + */ +public class ClearEditText extends android.support.v7.widget.AppCompatEditText implements View.OnFocusChangeListener, TextWatcher { + /** + * 删除按钮的引用 + */ + private Drawable mClearDrawable; + /** + * 控件是否有焦点 + */ + private boolean hasFoucs; + + public ClearEditText(Context context) { + this(context, null); + } + + public ClearEditText(Context context, AttributeSet attrs) { + // 这里构造方法也很重要,不加这个很多属性不能再XML里面定义 + this(context, attrs, android.R.attr.editTextStyle); + } + + public ClearEditText(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + init(); + } + + private void init() { + // 获取EditText的DrawableRight,假如没有设置我们就使用默认的图片 + mClearDrawable = getCompoundDrawables()[2]; + if (mClearDrawable == null) { + // throw new + // NullPointerException("You can add drawableRight attribute in XML"); + mClearDrawable = getResources().getDrawable(R.drawable.icon_close); + } + + mClearDrawable.setBounds(0, 0, mClearDrawable.getIntrinsicWidth(), mClearDrawable.getIntrinsicHeight()); + // 默认设置隐藏图标 + setClearIconVisible(false); + // 设置焦点改变的监听 + setOnFocusChangeListener(this); + // 设置输入框里面内容发生改变的监听 + addTextChangedListener(this); + } + + /** + * 因为我们不能直接给EditText设置点击事件,所以我们用记住我们按下的位置来模拟点击事件 当我们按下的位置 在 EditText的宽度 - + * 图标到控件右边的间距 - 图标的宽度 和 EditText的宽度 - 图标到控件右边的间距之间我们就算点击了图标,竖直方向就没有考虑 + */ + @Override + public boolean onTouchEvent(MotionEvent event) { + if (event.getAction() == MotionEvent.ACTION_UP) { + if (getCompoundDrawables()[2] != null) { + + boolean touchable = event.getX() > (getWidth() - getTotalPaddingRight()) && (event.getX() < ((getWidth() - getPaddingRight()))); + + if (touchable) { + this.setText(""); + } + } + } + + return super.onTouchEvent(event); + } + + /** + * 当ClearEditText焦点发生变化的时候,判断里面字符串长度设置清除图标的显示与隐藏 + */ + @Override + public void onFocusChange(View v, boolean hasFocus) { + this.hasFoucs = hasFocus; + if (hasFocus) { + setClearIconVisible(getText().length() > 0); + } else { + setClearIconVisible(false); + } + } + + /** + * 设置清除图标的显示与隐藏,调用setCompoundDrawables为EditText绘制上去 + * + * @param visible + */ + protected void setClearIconVisible(boolean visible) { + Drawable right = visible ? mClearDrawable : null; + setCompoundDrawables(getCompoundDrawables()[0], getCompoundDrawables()[1], right, getCompoundDrawables()[3]); + } + + /** + * 当输入框里面内容发生变化的时候回调的方法 + */ + @Override + public void onTextChanged(CharSequence s, int start, int count, int after) { + if (hasFoucs) { + setClearIconVisible(s.length() > 0); + } + } + + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void afterTextChanged(Editable s) { + + } + +} \ No newline at end of file diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/ConditionPickerLayout.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/ConditionPickerLayout.java new file mode 100644 index 0000000000000000000000000000000000000000..45a7b119fb1e3fe043629003d26d9fa66950be98 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/ConditionPickerLayout.java @@ -0,0 +1,134 @@ +package com.jiuqi.elove.widget; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.widget.LinearLayout; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.CommonDataUtil; +import com.jiuqi.elove.util.JqStrUtil; + +import java.util.ArrayList; + +/** + * 2.53仅身高要求用 + * Created by dl on 2016/12/26. + */ +public class ConditionPickerLayout extends LinearLayout { + + + private WheelView prePicker; + private WheelView nextPicker; + + + private int mCurrPreIndex = -1; + private int mCurrNextIndex = -1; + + private ArrayList preDataList = new ArrayList<>(); + private ArrayList nextDataList = new ArrayList<>(); + + public ConditionPickerLayout(Context context, AttributeSet attrs) { + super(context, attrs); + getDataInfo(); + } + + public ConditionPickerLayout(Context context) { + this(context, null); + } + + + + private void getDataInfo() { + preDataList = CommonDataUtil.setHeightListrq(); + nextDataList = CommonDataUtil.setHeightListrq(); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + LayoutInflater.from(getContext()).inflate(R.layout.layout_city_picker, this); + + prePicker = (WheelView) findViewById(R.id.province_wv); + nextPicker = (WheelView) findViewById(R.id.city_wv); + + prePicker.setData(preDataList); + prePicker.setDefault(0); + + nextPicker.setData(nextDataList); + nextPicker.setDefault(0); + + prePicker.setOnSelectListener(new WheelView.OnSelectListener(){ + @Override + public void endSelect(int id, String text) { + if(JqStrUtil.isEmpty(text)){ + return; + } + if (mCurrPreIndex != id) { + mCurrPreIndex = id; + String selectPre = prePicker.getSelectedText(); + if (JqStrUtil.isEmpty(selectPre)) + return; + + if(id!=0){ + if (mCurrNextIndex!=-1&&mCurrNextIndex!=0&&mCurrNextIndexmCurrNextIndex) { + prePicker.setDefault(id); + } + } + } + } + + @Override + public void selecting(int id, String text) { + + } + }); + } + + public String getPre() { + if (prePicker == null) { + return null; + } + return prePicker.getSelectedText(); + } + + public String getNext() { + if (nextPicker == null) { + return null; + } + return nextPicker.getSelectedText(); + } + + public void setWheelViewItemNumber(int number){ + prePicker.setItemNumber(number); + nextPicker.setItemNumber(number); + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/CutView.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/CutView.java new file mode 100644 index 0000000000000000000000000000000000000000..c0f85e6cea3397117e113c996609c8882c4cd799 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/CutView.java @@ -0,0 +1,160 @@ +package com.jiuqi.elove.widget; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Paint.Style; +import android.util.AttributeSet; +import android.view.View; + +/** + * 自定义 裁剪框 + * 头像上传页面用 + */ +public class CutView extends View { + private Paint paint = new Paint(); + private Paint borderPaint = new Paint(); + + /** 自定义顶部栏高度,如不是自定义,则默认为0即可 */ + private int customTopBarHeight = 0; + /** 裁剪框长宽比,默认4:3 */ + private double clipRatio = 1; + /** 裁剪框宽度 */ + private int clipWidth = -1; + /** 裁剪框高度 */ + private int clipHeight = -1; + /** 裁剪框左边空留宽度 */ + private int clipLeftMargin = 0; + /** 裁剪框上边空留宽度 */ + private int clipTopMargin = 0; + /** 裁剪框边框宽度 */ + private int clipBorderWidth = 1; + private boolean isSetMargin = false; + private OnDrawListenerComplete listenerComplete; + + public CutView(Context context) { + super(context); + } + + public CutView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public CutView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + + int width = this.getWidth(); + int height = this.getHeight(); + // 如没有显示设置裁剪框高度和宽度,取默认值 + if (clipWidth == -1 || clipHeight == -1) { + clipWidth = width - 50; + clipHeight = (int) (clipWidth * clipRatio); + // 横屏 + if (width > height) { + clipHeight = height - 50; + clipWidth = (int) (clipHeight / clipRatio); + } + } + // 如没有显示设置裁剪框左和上预留宽度,取默认值 + if (!isSetMargin) { + clipLeftMargin = (width - clipWidth) / 2; + clipTopMargin = (height - clipHeight) / 2; + } + // 画阴影 + paint.setAlpha(100); + // top + canvas.drawRect(0, customTopBarHeight, width, clipTopMargin, paint); + // left + canvas.drawRect(0, clipTopMargin, clipLeftMargin, clipTopMargin + + clipHeight, paint); + // right + canvas.drawRect(clipLeftMargin + clipWidth, clipTopMargin, width, + clipTopMargin + clipHeight, paint); + // bottom + canvas.drawRect(0, clipTopMargin + clipHeight, width, height, paint); + + // 画边框 + borderPaint.setStyle(Style.STROKE); + borderPaint.setColor(Color.WHITE); + borderPaint.setStrokeWidth(clipBorderWidth); + canvas.drawRect(clipLeftMargin, clipTopMargin, clipLeftMargin + + clipWidth, clipTopMargin + clipHeight, borderPaint); + + if (listenerComplete != null) { + listenerComplete.onDrawCompelete(); + } + } + + public int getCustomTopBarHeight() { + return customTopBarHeight; + } + + public void setCustomTopBarHeight(int customTopBarHeight) { + this.customTopBarHeight = customTopBarHeight; + } + + public double getClipRatio() { + return clipRatio; + } + + public void setClipRatio(double clipRatio) { + this.clipRatio = clipRatio; + } + + public int getClipWidth() { + // 减clipBorderWidth原因:截图时去除边框白线 + return clipWidth - clipBorderWidth; + } + + public void setClipWidth(int clipWidth) { + this.clipWidth = clipWidth; + } + + public int getClipHeight() { + return clipHeight - clipBorderWidth; + } + + public void setClipHeight(int clipHeight) { + this.clipHeight = clipHeight; + } + + public int getClipLeftMargin() { + return clipLeftMargin + clipBorderWidth; + } + + public void setClipLeftMargin(int clipLeftMargin) { + this.clipLeftMargin = clipLeftMargin; + isSetMargin = true; + } + + public int getClipTopMargin() { + return clipTopMargin + clipBorderWidth; + } + + public void setClipTopMargin(int clipTopMargin) { + this.clipTopMargin = clipTopMargin; + isSetMargin = true; + } + + public void addOnDrawCompleteListener(OnDrawListenerComplete listener) { + this.listenerComplete = listener; + } + + public void removeOnDrawCompleteListener() { + this.listenerComplete = null; + } + + /** + * 裁剪区域画完时调用接口 + */ + public interface OnDrawListenerComplete { + public void onDrawCompelete(); + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/DropZoomScrollView.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/DropZoomScrollView.java new file mode 100644 index 0000000000000000000000000000000000000000..352951919fdecb2b4901cbe93d7c4c9a81338c67 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/DropZoomScrollView.java @@ -0,0 +1,140 @@ +package com.jiuqi.elove.widget; + +import android.animation.ObjectAnimator; +import android.animation.ValueAnimator; +import android.content.Context; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ScrollView; + +/** + * 下拉放大scrollView + */ +public class DropZoomScrollView extends ScrollView implements View.OnTouchListener { + + // 记录首次按下位置 + private float mFirstPosition = 0; + // 是否正在放大 + private Boolean mScaling = false; + + private View dropZoomView; + private int dropZoomViewWidth; + private int dropZoomViewHeight; + + public DropZoomScrollView(Context context) { + super(context); + } + + public DropZoomScrollView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public DropZoomScrollView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + init(); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + + private void init() { + setOverScrollMode(OVER_SCROLL_NEVER); +// if (getChildAt(0) != null) { +// ViewGroup vg = (ViewGroup) getChildAt(0); +// if (vg.getChildAt(0) != null) { +// dropZoomView = vg.getChildAt(0); +// setOnTouchListener(this); +// +// } +// } + if (getChildAt(0) != null) { + ViewGroup vg = (ViewGroup) getChildAt(0);//第一层一般为LinearLayout + if(vg.getChildAt(0) instanceof ViewGroup){ + ViewGroup temp = (ViewGroup) vg.getChildAt(0);//一般是头部了,但是有的时候上层会有文字之类的不希望移动,所以在下一层 + if (temp != null) { + View vgMaybe = temp.getChildAt(0); + if(vgMaybe instanceof ViewGroup){//如果LinearLayout下面的一层的下面还是容器的话则对此容器操作 + dropZoomView = vgMaybe; + }else{//如果LinearLayout下面的一层的下面不是容器的话则对上一层容器操作 + dropZoomView = temp; + } + } + }else{ + dropZoomView = vg.getChildAt(0); + } + setOnTouchListener(this); + } + } + + @Override + public boolean onTouch(View v, MotionEvent event) { + if (dropZoomViewWidth <= 0 || dropZoomViewHeight <= 0) { + dropZoomViewWidth = dropZoomView.getMeasuredWidth(); + dropZoomViewHeight = dropZoomView.getMeasuredHeight(); + } + switch (event.getAction()) { + case MotionEvent.ACTION_UP: + //手指离开后恢复图片 + mScaling = false; + replyImage(); + break; + case MotionEvent.ACTION_MOVE: + if (!mScaling) { + if (getScrollY() == 0) { + mFirstPosition = event.getY();// 滚动到顶部时记录位置,否则正常返回 + } else { + break; + } + } + int distance = (int) ((event.getY() - mFirstPosition) * 0.6); // 滚动距离乘以一个系数 + if (distance < 0) { // 当前位置比记录位置要小,正常返回 + break; + } + + // 处理放大 + mScaling = true; + setZoom(1 + distance); + return true; // 返回true表示已经完成触摸事件,不再处理 + } + return false; + } + + // 回弹动画 (使用了属性动画) + public void replyImage() { + final float distance = dropZoomView.getMeasuredWidth() - dropZoomViewWidth; + + // 设置动画 + ValueAnimator anim = ObjectAnimator.ofFloat(0.0F, 1.0F).setDuration((long) (distance * 0.7)); + + anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { + @Override + public void onAnimationUpdate(ValueAnimator animation) { + float cVal = (Float) animation.getAnimatedValue(); + setZoom(distance - ((distance) * cVal)); + } + }); + anim.start(); + + } + + //缩放 + public void setZoom(float s) { + if (dropZoomViewHeight <= 0 || dropZoomViewWidth <= 0) { + return; + } + ViewGroup.LayoutParams lp = dropZoomView.getLayoutParams(); + lp.width = (int) (dropZoomViewWidth + s); + lp.height = (int) (dropZoomViewHeight * ((dropZoomViewWidth + s) / dropZoomViewWidth)); + dropZoomView.setLayoutParams(lp); + } +} + diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/ExpandableTextView.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/ExpandableTextView.java new file mode 100644 index 0000000000000000000000000000000000000000..20a46283901c455befab2c2cc35c77780a45b4da --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/ExpandableTextView.java @@ -0,0 +1,225 @@ +package com.jiuqi.elove.widget; + + +import android.content.Context; +import android.content.res.TypedArray; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.Animation; +import android.view.animation.Transformation; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.jiuqi.elove.R; + +/** + * Created by Clevo on 2016/9/12. + */ +public class ExpandableTextView extends LinearLayout { + + TextView id_source_textview; + TextView id_expand_textview; + + //允许显示最大行数 + int maxExpandLines=0; + //动画执行时间 + int duration=0; + + //是否发生过文字变动 + boolean isChange=false; + //文本框真实高度 + int realTextViewHeigt=0; + //默认处于收起状态 + boolean isCollapsed=true; + //收起时候的整体高度 + int collapsedHeight=0; + //剩余点击按钮的高度 + int lastHeight=0; + //是否正在执行动画 + boolean isAnimate=false; + + OnExpandStateChangeListener listener; + + public ExpandableTextView(Context context) { + this(context, null); + } + + public ExpandableTextView(Context context, AttributeSet attrs) { + super(context, attrs); + + init(context, attrs); + } + + private void init(Context context, AttributeSet attrs) { + setOrientation(VERTICAL); + + TypedArray array=context.obtainStyledAttributes(attrs, R.styleable.ExpandableTextViewAttr); + maxExpandLines=array.getInteger(R.styleable.ExpandableTextViewAttr_maxExpandLines, 10); + duration=array.getInteger(R.styleable.ExpandableTextViewAttr_duration, 500); + array.recycle(); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + + id_source_textview= (TextView) findViewById(R.id.id_source_textview); + id_expand_textview= (TextView) findViewById(R.id.id_expand_textview); + id_expand_textview.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + ExpandCollapseAnimation animation; + + isCollapsed=!isCollapsed; + if (isCollapsed) { + id_expand_textview.setText("展开"); + if (listener!=null) { + listener.onExpandStateChanged(true); + } + animation=new ExpandCollapseAnimation(getHeight(), collapsedHeight); + } + else { + id_expand_textview.setText("收起"); + if (listener!=null) { + listener.onExpandStateChanged(false); + } + animation=new ExpandCollapseAnimation(getHeight(), realTextViewHeigt+lastHeight); + } + animation.setFillAfter(true); + animation.setAnimationListener(new Animation.AnimationListener() { + @Override + public void onAnimationStart(Animation animation) { + isAnimate=true; + } + + @Override + public void onAnimationEnd(Animation animation) { + clearAnimation(); + isAnimate=false; + } + + @Override + public void onAnimationRepeat(Animation animation) { + + } + }); + clearAnimation(); + startAnimation(animation); + //不带动画的处理方式 +// isChange=true; +// requestLayout(); + } + }); + } + + @Override + public boolean onInterceptTouchEvent(MotionEvent ev) { + //执行动画的过程中屏蔽事件 + return isAnimate; + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + //如果隐藏控件或者textview的值没有发生改变,那么不进行测量 + if (getVisibility()==GONE || !isChange) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + return; + } + isChange=false; + + //初始化默认状态,即正常显示文本 + id_expand_textview.setVisibility(GONE); + id_source_textview.setMaxLines(Integer.MAX_VALUE); + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + + //如果本身没有达到收起展开的限定要求,则不进行处理 + if (id_source_textview.getLineCount()<=maxExpandLines) { + return; + } + + //初始化高度赋值,为后续动画事件准备数据 + realTextViewHeigt=getRealTextViewHeight(id_source_textview); + + //如果处于收缩状态,则设置最多显示行数 + if (isCollapsed) { + id_source_textview.setMaxLines(maxExpandLines); + } + id_expand_textview.setVisibility(VISIBLE); + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + + if (isCollapsed) { + id_source_textview.post(new Runnable() { + @Override + public void run() { + lastHeight=getHeight()-id_source_textview.getHeight(); + collapsedHeight=getMeasuredHeight(); + } + }); + } + } + + /** + * 获取textview的真实高度 + * @param textView + * @return + */ + private int getRealTextViewHeight(TextView textView) { + //getLineTop返回值是一个根据行数而形成等差序列,如果参数为行数,则值即为文本的高度 + int textHeight=textView.getLayout().getLineTop(textView.getLineCount()); + return textHeight+textView.getCompoundPaddingBottom()+textView.getCompoundPaddingTop(); + } + + public void setText(String text) { + isChange=true; + id_source_textview.setText(text); + } + + public void setText(String text, boolean isCollapsed) { + this.isCollapsed=isCollapsed; + if (isCollapsed) { + id_expand_textview.setText("展开"); + } + else { + id_expand_textview.setText("收起"); + } + clearAnimation(); + setText(text); + getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT; + } + + public void setListener(OnExpandStateChangeListener listener) { + this.listener = listener; + } + + private class ExpandCollapseAnimation extends Animation { + int startValue=0; + int endValue=0; + + public ExpandCollapseAnimation(int startValue, int endValue) { + setDuration(duration); + this.startValue=startValue; + this.endValue=endValue; + } + + @Override + protected void applyTransformation(float interpolatedTime, Transformation t) { + super.applyTransformation(interpolatedTime, t); + int height=(int) ((endValue-startValue)*interpolatedTime+startValue); + id_source_textview.setMaxHeight(height-lastHeight); + ExpandableTextView.this.getLayoutParams().height=height; + ExpandableTextView.this.requestLayout(); + } + + @Override + public boolean willChangeBounds() { + return true; + } + } + + public interface OnExpandStateChangeListener { + void onExpandStateChanged(boolean isExpanded); + } +} \ No newline at end of file diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/GridSpacingItemDecoration.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/GridSpacingItemDecoration.java new file mode 100644 index 0000000000000000000000000000000000000000..e53b0af8ccadfb0ed8a60c40eddc683434cc91b9 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/GridSpacingItemDecoration.java @@ -0,0 +1,50 @@ +package com.jiuqi.elove.widget; + +import android.graphics.Rect; +import android.support.v7.widget.RecyclerView; +import android.view.View; + +/** + * recyclerview设置grid的布局的列数和间距用 + *

    + * GridSpacingItemDecoration + *

    + * int spanCount = 3; // 3 columns + * int spacing = 50; // 50px + * boolean includeEdge = false; + * recyclerView.addItemDecoration(new GridSpacingItemDecoration(spanCount, spacing, includeEdge)); + */ +public class GridSpacingItemDecoration extends RecyclerView.ItemDecoration { + + private int spanCount; + private int spacing; + private boolean includeEdge; + + public GridSpacingItemDecoration(int spanCount, int spacing, boolean includeEdge) { + this.spanCount = spanCount; + this.spacing = spacing; + this.includeEdge = includeEdge; + } + + @Override + public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { + int position = parent.getChildAdapterPosition(view); // item position + int column = position % spanCount; // item column + + if (includeEdge) { + outRect.left = spacing - column * spacing / spanCount; // spacing - column * ((1f / spanCount) * spacing) + outRect.right = (column + 1) * spacing / spanCount; // (column + 1) * ((1f / spanCount) * spacing) + + if (position < spanCount) { // top edge + outRect.top = spacing; + } + outRect.bottom = spacing; // item bottom + } else { + outRect.left = column * spacing / spanCount; // column * ((1f / spanCount) * spacing) + outRect.right = spacing - (column + 1) * spacing / spanCount; // spacing - (column + 1) * ((1f / spanCount) * spacing) + if (position >= spanCount) { + outRect.top = spacing; // item top + } + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/HorizontalListView.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/HorizontalListView.java new file mode 100644 index 0000000000000000000000000000000000000000..67e34400db3a6e962562b57f9895871d5a124277 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/HorizontalListView.java @@ -0,0 +1,365 @@ +package com.jiuqi.elove.widget; + +import android.widget.AdapterView; +import android.widget.ListAdapter; +import java.util.LinkedList; +import java.util.Queue; + +import android.content.Context; +import android.database.DataSetObserver; +import android.graphics.Rect; +import android.util.AttributeSet; +import android.view.GestureDetector; +import android.view.GestureDetector.OnGestureListener; +import android.view.MotionEvent; +import android.view.View; +import android.widget.Scroller; +/** + * 个人中心和他人中心照片展示和个人头像上传不规范照片展示用 + * Created by dl on 2016/8/10. + */ +public class HorizontalListView extends AdapterView{ + + public boolean mAlwaysOverrideTouch = true; + protected ListAdapter mAdapter; + private int mLeftViewIndex = -1; + private int mRightViewIndex = 0; + protected int mCurrentX; + protected int mNextX; + private int mMaxX = Integer.MAX_VALUE; + private int mDisplayOffset = 0; + protected Scroller mScroller; + private GestureDetector mGesture; + private Queue mRemovedViewQueue = new LinkedList(); + private OnItemSelectedListener mOnItemSelected; + private OnItemClickListener mOnItemClicked; + private OnItemLongClickListener mOnItemLongClicked; + private boolean mDataChanged = false; + + + public HorizontalListView(Context context, AttributeSet attrs) { + super(context, attrs); + initView(); + } + + private synchronized void initView() { + mLeftViewIndex = -1; + mRightViewIndex = 0; + mDisplayOffset = 0; + mCurrentX = 0; + mNextX = 0; + mMaxX = Integer.MAX_VALUE; + mScroller = new Scroller(getContext()); + mGesture = new GestureDetector(getContext(), mOnGesture); + } + + @Override + public void setOnItemSelectedListener(AdapterView.OnItemSelectedListener listener) { + mOnItemSelected = listener; + } + + @Override + public void setOnItemClickListener(AdapterView.OnItemClickListener listener){ + mOnItemClicked = listener; + } + + @Override + public void setOnItemLongClickListener(AdapterView.OnItemLongClickListener listener) { + mOnItemLongClicked = listener; + } + + private DataSetObserver mDataObserver = new DataSetObserver() { + + @Override + public void onChanged() { + synchronized(HorizontalListView.this){ + mDataChanged = true; + } + invalidate(); + requestLayout(); + } + + @Override + public void onInvalidated() { + reset(); + invalidate(); + requestLayout(); + } + + }; + + @Override + public ListAdapter getAdapter() { + return mAdapter; + } + + @Override + public View getSelectedView() { + //TODO: implement + return null; + } + + @Override + public void setAdapter(ListAdapter adapter) { + if(mAdapter != null) { + mAdapter.unregisterDataSetObserver(mDataObserver); + } + mAdapter = adapter; + mAdapter.registerDataSetObserver(mDataObserver); + reset(); + } + + private synchronized void reset(){ + initView(); + removeAllViewsInLayout(); + requestLayout(); + } + + @Override + public void setSelection(int position) { + //TODO: implement + } + + private void addAndMeasureChild(final View child, int viewPos) { + LayoutParams params = child.getLayoutParams(); + if(params == null) { + params = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); + } + + addViewInLayout(child, viewPos, params, true); + child.measure(MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.AT_MOST), + MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.AT_MOST)); + } + + + + @Override + protected synchronized void onLayout(boolean changed, int left, int top, int right, int bottom) { + super.onLayout(changed, left, top, right, bottom); + + if(mAdapter == null){ + return; + } + + if(mDataChanged){ + int oldCurrentX = mCurrentX; + initView(); + removeAllViewsInLayout(); + mNextX = oldCurrentX; + mDataChanged = false; + } + + if(mScroller.computeScrollOffset()){ + int scrollx = mScroller.getCurrX(); + mNextX = scrollx; + } + + if(mNextX <= 0){ + mNextX = 0; + mScroller.forceFinished(true); + } + if(mNextX >= mMaxX) { + mNextX = mMaxX; + mScroller.forceFinished(true); + } + + int dx = mCurrentX - mNextX; + + removeNonVisibleItems(dx); + fillList(dx); + positionItems(dx); + + mCurrentX = mNextX; + + if(!mScroller.isFinished()){ + post(new Runnable(){ + @Override + public void run() { + requestLayout(); + } + }); + + } + } + + private void fillList(final int dx) { + int edge = 0; + View child = getChildAt(getChildCount()-1); + if(child != null) { + edge = child.getRight(); + } + fillListRight(edge, dx); + + edge = 0; + child = getChildAt(0); + if(child != null) { + edge = child.getLeft(); + } + fillListLeft(edge, dx); + + + } + + private void fillListRight(int rightEdge, final int dx) { + while(rightEdge + dx < getWidth() && mRightViewIndex < mAdapter.getCount()) { + + View child = mAdapter.getView(mRightViewIndex, mRemovedViewQueue.poll(), this); + addAndMeasureChild(child, -1); + rightEdge += child.getMeasuredWidth(); + + if(mRightViewIndex == mAdapter.getCount()-1) { + mMaxX = mCurrentX + rightEdge - getWidth(); + } + + if (mMaxX < 0) { + mMaxX = 0; + } + mRightViewIndex++; + } + + } + + private void fillListLeft(int leftEdge, final int dx) { + while(leftEdge + dx > 0 && mLeftViewIndex >= 0) { + View child = mAdapter.getView(mLeftViewIndex, mRemovedViewQueue.poll(), this); + addAndMeasureChild(child, 0); + leftEdge -= child.getMeasuredWidth(); + mLeftViewIndex--; + mDisplayOffset -= child.getMeasuredWidth(); + } + } + + private void removeNonVisibleItems(final int dx) { + View child = getChildAt(0); + while(child != null && child.getRight() + dx <= 0) { + mDisplayOffset += child.getMeasuredWidth(); + mRemovedViewQueue.offer(child); + removeViewInLayout(child); + mLeftViewIndex++; + child = getChildAt(0); + + } + + child = getChildAt(getChildCount()-1); + while(child != null && child.getLeft() + dx >= getWidth()) { + mRemovedViewQueue.offer(child); + removeViewInLayout(child); + mRightViewIndex--; + child = getChildAt(getChildCount()-1); + } + } + + private void positionItems(final int dx) { + if(getChildCount() > 0){ + mDisplayOffset += dx; + int left = mDisplayOffset; + for(int i=0;i +{ + private ListView mListDir; + + public ListImageDirPopupWindow(int width, int height, + List datas, View convertView) + { + super(convertView, width, height, true, datas); + } + + @Override + public void initViews() + { + mListDir = (ListView) findViewById(R.id.id_list_dir); + mListDir.setAdapter(new CommonPhotoAdapter(context, mDatas, + R.layout.list_dir_item) + { + @Override + public void convert(ImageViewHolder helper, ImageFloderModel item) + { + helper.setText(R.id.id_dir_item_name, item.getName()); + helper.setImageByUrl(R.id.id_dir_item_image, + item.getFirstImagePath()); + helper.setText(R.id.id_dir_item_count, item.getCount() + "张"); + } + }); + } + + public interface OnImageDirSelected + { + void selected(ImageFloderModel floder); + } + + private OnImageDirSelected mImageDirSelected; + + public void setOnImageDirSelected(OnImageDirSelected mImageDirSelected) + { + this.mImageDirSelected = mImageDirSelected; + } + + @Override + public void initEvents() + { + mListDir.setOnItemClickListener(new OnItemClickListener() + { + @Override + public void onItemClick(AdapterView parent, View view, + int position, long id) + { + + if (mImageDirSelected != null) + { + mImageDirSelected.selected(mDatas.get(position)); + } + } + }); + } + + @Override + public void init() + { + // TODO Auto-generated method stub + + } + + @Override + protected void beforeInitWeNeedSomeParams(Object... params) + { + // TODO Auto-generated method stub + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/ListViewForScrollView.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/ListViewForScrollView.java new file mode 100644 index 0000000000000000000000000000000000000000..63746447c38b8f28659c6d344ba6bbe9e71537ee --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/ListViewForScrollView.java @@ -0,0 +1,31 @@ +package com.jiuqi.elove.widget; + +/** + * scrollview中使用的listview,文章问答中的评论列表,活动中的评论列表等都在用 + * Created by dl on 2016/7/27. + */ +import android.content.Context; +import android.util.AttributeSet; +import android.widget.ListView; + +public class ListViewForScrollView extends ListView { + public ListViewForScrollView(Context context) { + super(context); + } + public ListViewForScrollView(Context context, AttributeSet attrs) { + super(context, attrs); + } + public ListViewForScrollView(Context context, AttributeSet attrs, + int defStyle) { + super(context, attrs, defStyle); + } + @Override + /** + * 重写该方法,达到使ListView适应ScrollView的效果 + */ + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, + MeasureSpec.AT_MOST); + super.onMeasure(widthMeasureSpec, expandSpec); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/MetaballView.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/MetaballView.java new file mode 100644 index 0000000000000000000000000000000000000000..ad26d83dfde62d39755f5a0288f741df75d7ab60 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/MetaballView.java @@ -0,0 +1,305 @@ +package com.jiuqi.elove.widget; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.RectF; +import android.util.AttributeSet; +import android.util.Log; +import android.view.View; +import android.view.animation.AccelerateDecelerateInterpolator; +import android.view.animation.Animation; +import android.view.animation.Transformation; + +import java.util.ArrayList; +import java.util.Arrays; + +/** + * 播放视频控件 + * Created by fwx on 15/7/27. + */ +public class MetaballView extends View { + + private Paint paint = new Paint(); + private float handle_len_rate = 2f; + private float radius = 30; + private final int ITEM_COUNT = 6; + private final int ITEM_DIVIDER = 60; + private final float SCALE_RATE = 0.3f; + private float maxLength; + private ArrayList circlePaths = new ArrayList<>(); + private float mInterpolatedTime; + private MoveAnimation wa; + private Circle circle; + + public MetaballView(Context context) { + super(context); + init(); + } + + public MetaballView(Context context, AttributeSet attrs) { + super(context, attrs); + init(); + } + + public MetaballView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(); + + } + + private class Circle { + float[] center; + float radius; + } + + public void setPaintMode(int mode) { + paint.setStyle(mode == 0 ? Paint.Style.STROKE : Paint.Style.FILL); + } + + private void init() { + paint.setColor(0xff4db9ff); + paint.setStyle(Paint.Style.FILL); + paint.setAntiAlias(true); + Circle circlePath = new Circle(); + circlePath.center = new float[]{(radius + ITEM_DIVIDER), radius * 1.4f}; + circlePath.radius = radius / 4 * 3; + circlePaths.add(circlePath); + + for (int i = 1; i < ITEM_COUNT; i++) { + circlePath = new Circle(); + circlePath.center = new float[]{(radius * 2 + ITEM_DIVIDER) * i, radius * 1.4f}; + circlePath.radius = radius; + circlePaths.add(circlePath); + } + maxLength = (radius * 2 + ITEM_DIVIDER) * ITEM_COUNT; + } + + private float[] getVector(float radians, float length) { + float x = (float) (Math.cos(radians) * length); + float y = (float) (Math.sin(radians) * length); + return new float[]{ + x, y + }; + } + + private class MoveAnimation extends Animation { + + @Override + protected void applyTransformation(float interpolatedTime, Transformation t) { + super.applyTransformation(interpolatedTime, t); + mInterpolatedTime = interpolatedTime; + invalidate(); + } + } + + /** + * @param canvas 画布 + * @param j + * @param i + * @param v 控制两个圆连接时候长度,间接控制连接线的粗细,该值为1的时候连接线为直线 + * @param handle_len_rate + * @param maxDistance + */ + private void metaball(Canvas canvas, int j, int i, float v, float handle_len_rate, float maxDistance) { + final Circle circle1 = circlePaths.get(i); + final Circle circle2 = circlePaths.get(j); + + RectF ball1 = new RectF(); + ball1.left = circle1.center[0] - circle1.radius; + ball1.top = circle1.center[1] - circle1.radius; + ball1.right = ball1.left + circle1.radius * 2; + ball1.bottom = ball1.top + circle1.radius * 2; + + RectF ball2 = new RectF(); + ball2.left = circle2.center[0] - circle2.radius; + ball2.top = circle2.center[1] - circle2.radius; + ball2.right = ball2.left + circle2.radius * 2; + ball2.bottom = ball2.top + circle2.radius * 2; + + float[] center1 = new float[]{ + ball1.centerX(), + ball1.centerY() + }; + float[] center2 = new float[]{ + ball2.centerX(), + ball2.centerY() + }; + float d = getDistance(center1, center2); + + float radius1 = ball1.width() / 2; + float radius2 = ball2.width() / 2; + float pi2 = (float) (Math.PI / 2); + float u1, u2; + + + if (d > maxDistance) { + canvas.drawCircle(ball1.centerX(), ball1.centerY(), circle1.radius, paint); + canvas.drawCircle(ball2.centerX(), ball2.centerY(), circle2.radius, paint); + } else { + float scale2 = 1 + SCALE_RATE * (1 - d / maxDistance); + float scale1 = 1 - SCALE_RATE * (1 - d / maxDistance); + radius2 *= scale2; +// radius1 *= scale1; + canvas.drawCircle(ball1.centerX(), ball1.centerY(), radius1, paint); + canvas.drawCircle(ball2.centerX(), ball2.centerY(), radius2, paint); + + } + + Log.d("Metaball_radius", "radius1:" + radius1 + ",radius2:" + radius2); + if (radius1 == 0 || radius2 == 0) { + return; + } + + if (d > maxDistance || d <= Math.abs(radius1 - radius2)) { + return; + } else if (d < radius1 + radius2) { + u1 = (float) Math.acos((radius1 * radius1 + d * d - radius2 * radius2) / + (2 * radius1 * d)); + u2 = (float) Math.acos((radius2 * radius2 + d * d - radius1 * radius1) / + (2 * radius2 * d)); + } else { + u1 = 0; + u2 = 0; + } + Log.d("Metaball", "center2:" + Arrays.toString(center2) + ",center1:" + Arrays.toString(center1)); + float[] centermin = new float[]{center2[0] - center1[0], center2[1] - center1[1]}; + + float angle1 = (float) Math.atan2(centermin[1], centermin[0]); + float angle2 = (float) Math.acos((radius1 - radius2) / d); + float angle1a = angle1 + u1 + (angle2 - u1) * v; + float angle1b = angle1 - u1 - (angle2 - u1) * v; + float angle2a = (float) (angle1 + Math.PI - u2 - (Math.PI - u2 - angle2) * v); + float angle2b = (float) (angle1 - Math.PI + u2 + (Math.PI - u2 - angle2) * v); + + Log.d("Metaball", "angle1:" + angle1 + ",angle2:" + angle2 + ",angle1a:" + angle1a + ",angle1b:" + angle1b + ",angle2a:" + angle2a + ",angle2b:" + angle2b); + + + float[] p1a1 = getVector(angle1a, radius1); + float[] p1b1 = getVector(angle1b, radius1); + float[] p2a1 = getVector(angle2a, radius2); + float[] p2b1 = getVector(angle2b, radius2); + + float[] p1a = new float[]{p1a1[0] + center1[0], p1a1[1] + center1[1]}; + float[] p1b = new float[]{p1b1[0] + center1[0], p1b1[1] + center1[1]}; + float[] p2a = new float[]{p2a1[0] + center2[0], p2a1[1] + center2[1]}; + float[] p2b = new float[]{p2b1[0] + center2[0], p2b1[1] + center2[1]}; + + + Log.d("Metaball", "p1a:" + Arrays.toString(p1a) + ",p1b:" + Arrays.toString(p1b) + ",p2a:" + Arrays.toString(p2a) + ",p2b:" + Arrays.toString(p2b)); + + float[] p1_p2 = new float[]{p1a[0] - p2a[0], p1a[1] - p2a[1]}; + + float totalRadius = (radius1 + radius2); + float d2 = Math.min(v * handle_len_rate, getLength(p1_p2) / totalRadius); + d2 *= Math.min(1, d * 2 / (radius1 + radius2)); + Log.d("Metaball", "d2:" + d2); + radius1 *= d2; + radius2 *= d2; + + float[] sp1 = getVector(angle1a - pi2, radius1); + float[] sp2 = getVector(angle2a + pi2, radius2); + float[] sp3 = getVector(angle2b - pi2, radius2); + float[] sp4 = getVector(angle1b + pi2, radius1); + Log.d("Metaball", "sp1:" + Arrays.toString(sp1) + ",sp2:" + Arrays.toString(sp2) + ",sp3:" + Arrays.toString(sp3) + ",sp4:" + Arrays.toString(sp4)); + + + Path path1 = new Path(); + path1.moveTo(p1a[0], p1a[1]); + path1.cubicTo(p1a[0] + sp1[0], p1a[1] + sp1[1], p2a[0] + sp2[0], p2a[1] + sp2[1], p2a[0], p2a[1]); + path1.lineTo(p2b[0], p2b[1]); + path1.cubicTo(p2b[0] + sp3[0], p2b[1] + sp3[1], p1b[0] + sp4[0], p1b[1] + sp4[1], p1b[0], p1b[1]); + path1.lineTo(p1a[0], p1a[1]); + path1.close(); + canvas.drawPath(path1, paint); + + } + + private float getLength(float[] b) { + return (float) Math.sqrt(b[0] * b[0] + b[1] * b[1]); + } + + private float getDistance(float[] b1, float[] b2) { + float x = b1[0] - b2[0]; + float y = b1[1] - b2[1]; + float d = x * x + y * y; + return (float) Math.sqrt(d); + } + + + //测试用 +// @Override +// public boolean onTouchEvent(MotionEvent event) { +// switch (event.getAction()) { +// case MotionEvent.ACTION_DOWN: +// break; +// case MotionEvent.ACTION_MOVE: +// Circle circle = circlePaths.get(0); +// circle.center[0] = event.getX(); +// circle.center[1] = event.getY(); +// invalidate(); +// break; +// case MotionEvent.ACTION_UP: +// break; +// } +// +// return true; +// } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + circle = circlePaths.get(0); + circle.center[0] = maxLength * mInterpolatedTime; + for (int i = 1, l = circlePaths.size(); i < l; i++) { + metaball(canvas, i, 0, 0.6f, handle_len_rate, radius * 4f); + } + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + widthMeasureSpec = MeasureSpec.makeMeasureSpec((int) (ITEM_COUNT * (radius * 2 + ITEM_DIVIDER)), MeasureSpec.EXACTLY); + heightMeasureSpec = MeasureSpec.makeMeasureSpec((int) (2 * radius * 1.4f), MeasureSpec.EXACTLY); + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + + + private void stopAnimation() { + this.clearAnimation(); + postInvalidate(); + } + + private void startAnimation() { + wa = new MoveAnimation(); + wa.setDuration(2500); + wa.setInterpolator(new AccelerateDecelerateInterpolator()); + wa.setRepeatCount(Animation.INFINITE); + wa.setRepeatMode(Animation.REVERSE); + startAnimation(wa); + } + + @Override + protected void onVisibilityChanged(View changedView, int visibility) { + super.onVisibilityChanged(changedView, visibility); + + if (visibility == GONE || visibility == INVISIBLE) { + stopAnimation(); + } else { + startAnimation(); + } + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + startAnimation(); + } + + @Override + protected void onDetachedFromWindow() { + stopAnimation(); + super.onDetachedFromWindow(); + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/MyRelativeLayout.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/MyRelativeLayout.java new file mode 100644 index 0000000000000000000000000000000000000000..a83b30d88bf56ae2ac5f0b0d0442416c190e783a --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/MyRelativeLayout.java @@ -0,0 +1,67 @@ +package com.jiuqi.elove.widget; + +import android.annotation.TargetApi; +import android.content.Context; +import android.graphics.Rect; +import android.os.Build; +import android.util.AttributeSet; +import android.view.WindowInsets; +import android.widget.RelativeLayout; + +/** + * Created by jq on 2017/11/7. + */ + +public class MyRelativeLayout extends RelativeLayout { + + private int[] mInsets = new int[4]; + + public MyRelativeLayout(Context context) { + super(context); + } + + public MyRelativeLayout(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public MyRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + public MyRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + } + + @Override + protected final boolean fitSystemWindows(Rect insets) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + // Intentionally do not modify the bottom inset. For some reason, + // if the bottom inset is modified, window resizing stops working. + // TODO: Figure out why. + + mInsets[0] = insets.left; + mInsets[1] = insets.top; + mInsets[2] = insets.right; + + insets.left = 0; + insets.top = 0; + insets.right = 0; + } + + return super.fitSystemWindows(insets); + } + + @Override + public final WindowInsets onApplyWindowInsets(WindowInsets insets) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) { + mInsets[0] = insets.getSystemWindowInsetLeft(); + mInsets[1] = insets.getSystemWindowInsetTop(); + mInsets[2] = insets.getSystemWindowInsetRight(); + return super.onApplyWindowInsets(insets.replaceSystemWindowInsets(0, 0, 0, + insets.getSystemWindowInsetBottom())); + } else { + return insets; + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/NineGridImageView.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/NineGridImageView.java new file mode 100644 index 0000000000000000000000000000000000000000..bad9f7dcc55d77a5ac140a816b75215194496ccd --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/NineGridImageView.java @@ -0,0 +1,297 @@ +package com.jiuqi.elove.widget; + +import android.content.Context; +import android.content.res.TypedArray; +import android.util.AttributeSet; +import android.util.Log; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.adapter.NineGridImageViewAdapter; + +import java.util.ArrayList; +import java.util.List; + +/** + * 宫格头像用,根据设置来决定几宫格 + * Created by dl on 2016/12/23. + */ + +public class NineGridImageView extends ViewGroup { + + private int mRowCount; //行数 + private int mColumnCount; //列数 + + private int mMaxSize = 9; //最大图片数 + private int mGap; //宫格间距 + + private int parentWidth;//父组件宽 + private int parentHeight;//父组件高 + + private List mImageViewList = new ArrayList<>(); + private List mImgDataList; + + private NineGridImageViewAdapter mAdapter; + + public NineGridImageView(Context context) { + this(context, null); + } + + public NineGridImageView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public NineGridImageView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.NineGridImageView); + this.mGap = (int) typedArray.getDimension(R.styleable.NineGridImageView_imgGap, 8); + typedArray.recycle(); + } + + /** + * 设定宽高 + */ + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + parentWidth = measureWidth(widthMeasureSpec); + parentHeight = measureHeight(heightMeasureSpec); + + setMeasuredDimension(parentWidth, parentHeight); + } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + layoutChildrenView(); + } + + /** + * 为子ImageView布局 + */ + private void layoutChildrenView() { + if (mImgDataList == null) { + return; + } + int childrenCount = mImgDataList.size(); + for (int i = 0; i < childrenCount; i++) { + ImageView childrenView = (ImageView) getChildAt(i); + if (mAdapter != null) { + mAdapter.onDisplayImage(getContext(), childrenView, mImgDataList.get(i)); + } + int rowNum = i / mColumnCount;//当前行数 + int columnNum = i % mColumnCount;//当前列数 + + int mImageSize = (parentWidth - (mColumnCount + 1) * mGap) / mColumnCount;//图片尺寸 + + int t_center = (parentHeight + mGap) / 2;//中间位置以下的顶点(有宫格间距) + int b_center = (parentHeight - mGap) / 2;//中间位置以上的底部(有宫格间距) + int l_center = (parentWidth + mGap) / 2;//中间位置以右的左部(有宫格间距) + int r_center = (parentWidth - mGap) / 2;//中间位置以左的右部(有宫格间距) + int center = (parentHeight - mImageSize) / 2;//中间位置以上顶部(无宫格间距) + + int left = mImageSize * columnNum + mGap * (columnNum + 1); + int top = mImageSize * rowNum + mGap * (rowNum + 1); + int right = left + mImageSize; + int bottom = top + mImageSize; + + /** + * 不同子view情况下的不同显示 + */ + if (childrenCount == 1) { + childrenView.layout(left, top, right, bottom); + } else if (childrenCount == 2) { + childrenView.layout(left, center, right, center + mImageSize); + } else if (childrenCount == 3) { + if (i == 0) { + childrenView.layout(center, top, center + mImageSize, bottom); + } else { + childrenView.layout(mGap * i + mImageSize * (i - 1), t_center, mGap * i + mImageSize * i, t_center + mImageSize); + } + } else if (childrenCount == 4) { + childrenView.layout(left, top, right, bottom); + } else if (childrenCount == 5) { + if (i == 0) { + childrenView.layout(r_center - mImageSize, r_center - mImageSize, r_center, r_center); + } else if (i == 1) { + childrenView.layout(l_center, r_center - mImageSize, l_center + mImageSize, r_center); + } else { + childrenView.layout(mGap * (i - 1) + mImageSize * (i - 2), t_center, mGap * (i - 1) + mImageSize * (i - 1), t_center + mImageSize); + } + } else if (childrenCount == 6) { + if (i < 3) { + childrenView.layout(mGap * (i + 1) + mImageSize * i, b_center - mImageSize, mGap * (i + 1) + mImageSize * (i + 1), b_center); + } else { + childrenView.layout(mGap * (i - 2) + mImageSize * (i - 3), t_center, mGap * (i - 2) + mImageSize * (i - 2), t_center + mImageSize); + } + } else if (childrenCount == 7) { + if (i == 0) { + childrenView.layout(center, mGap, center + mImageSize, mGap + mImageSize); + } else if (i > 0 && i < 4) { + childrenView.layout(mGap * i + mImageSize * (i - 1), center, mGap * i + mImageSize * i, center + mImageSize); + } else { + childrenView.layout(mGap * (i - 3) + mImageSize * (i - 4), t_center + mImageSize / 2, mGap * (i - 3) + mImageSize * (i - 3), t_center + mImageSize / 2 + mImageSize); + } + } else if (childrenCount == 8) { + if (i == 0) { + childrenView.layout(r_center - mImageSize, mGap, r_center, mGap + mImageSize); + } else if (i == 1) { + childrenView.layout(l_center, mGap, l_center + mImageSize, mGap + mImageSize); + } else if (i > 1 && i < 5) { + childrenView.layout(mGap * (i - 1) + mImageSize * (i - 2), center, mGap * (i - 1) + mImageSize * (i - 1), center + mImageSize); + } else { + childrenView.layout(mGap * (i - 4) + mImageSize * (i - 5), t_center + mImageSize / 2, mGap * (i - 4) + mImageSize * (i - 4), t_center + mImageSize / 2 + mImageSize); + } + } else if (childrenCount == 9) { + childrenView.layout(left, top, right, bottom); + } + } + } + + /** + * 设置图片数据 + * + * @param lists 图片数据集合 + */ + public void setImagesData(List lists) { + if (lists == null || lists.isEmpty()) { + this.setVisibility(GONE); + return; + } else { + this.setVisibility(VISIBLE); + } + + if (mMaxSize > 0 && lists.size() > mMaxSize) { + lists = lists.subList(0, mMaxSize); + } + + int[] gridParam = calculateGridParam(lists.size()); + mRowCount = gridParam[0]; + mColumnCount = gridParam[1]; + if (mImgDataList == null) { + int i = 0; + while (i < lists.size()) { + ImageView iv = getImageView(i); + if (iv == null) { + return; + } + addView(iv, generateDefaultLayoutParams()); + i++; + } + } else { + int oldViewCount = mImgDataList.size(); + int newViewCount = lists.size(); + if (oldViewCount > newViewCount) { + removeViews(newViewCount, oldViewCount - newViewCount); + } else if (oldViewCount < newViewCount) { + for (int i = oldViewCount; i < newViewCount; i++) { + ImageView iv = getImageView(i); + if (iv == null) { + return; + } + addView(iv, generateDefaultLayoutParams()); + } + } + } + mImgDataList = lists; + requestLayout(); + } + + /** + * 获得 ImageView + * 保证了 ImageView的重用 + * + * @param position 位置 + */ + private ImageView getImageView(final int position) { + if (position < mImageViewList.size()) { + return mImageViewList.get(position); + } else { + if (mAdapter != null) { + ImageView imageView = mAdapter.generateImageView(getContext()); + mImageViewList.add(imageView); + return imageView; + } else { + Log.e("NineGirdImageView", "Your must set a NineGridImageViewAdapter for NineGirdImageView"); + return null; + } + } + } + + /** + * 设置宫格参数 + * + * @param imagesSize 图片数量 + * @return 宫格参数 gridParam[0] 宫格行数 gridParam[1] 宫格列数 + */ + protected static int[] calculateGridParam(int imagesSize) { + int[] gridParam = new int[2]; + if (imagesSize < 3) { + gridParam[0] = 1; + gridParam[1] = imagesSize; + } else if (imagesSize <= 4) { + gridParam[0] = 2; + gridParam[1] = 2; + } else { + gridParam[0] = imagesSize / 3 + (imagesSize % 3 == 0 ? 0 : 1); + gridParam[1] = 3; + } + return gridParam; + } + + /** + * 设置适配器 + * + * @param adapter 适配器 + */ + public void setAdapter(NineGridImageViewAdapter adapter) { + mAdapter = adapter; + } + + /** + * 设置宫格间距 + * + * @param gap 宫格间距 px + */ + public void setGap(int gap) { + mGap = gap; + } + + /** + * 对宫格的宽高进行重新定义 + */ + private int measureWidth(int measureSpec) { + int result = 0; + int specMode = View.MeasureSpec.getMode(measureSpec); + int specSize = View.MeasureSpec.getSize(measureSpec); + + if (specMode == View.MeasureSpec.EXACTLY) { + result = specSize; + } else { + result = 200; + if (specMode == View.MeasureSpec.AT_MOST) { + result = Math.min(result, specSize); + } + } + return result; + } + + private int measureHeight(int measureSpec) { + int result = 0; + + int specMode = View.MeasureSpec.getMode(measureSpec); + int specSize = View.MeasureSpec.getSize(measureSpec); + + if (specMode == View.MeasureSpec.EXACTLY) { + result = specSize; + } else { + result = 200; + if (specMode == View.MeasureSpec.AT_MOST) { + result = Math.min(result, specSize); + } + } + return result; + } +} + diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/NoScrollViewPager.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/NoScrollViewPager.java new file mode 100644 index 0000000000000000000000000000000000000000..b2134b3144f7744de7513c5fa47084405d7c7e89 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/NoScrollViewPager.java @@ -0,0 +1,59 @@ +package com.jiuqi.elove.widget; + +import android.content.Context; +import android.support.v4.view.ViewPager; +import android.util.AttributeSet; +import android.view.MotionEvent; + +/** + * 性格测试题用,可通过参数设置viewpager是否可以滑动 + * Created by dl on 2016/12/1. + */ +public class NoScrollViewPager extends ViewPager { + private boolean noScroll = false; + + public NoScrollViewPager(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public NoScrollViewPager(Context context) { + super(context); + } + + public void setNoScroll(boolean noScroll) { + this.noScroll = noScroll; + } + + @Override + public void scrollTo(int x, int y) { + super.scrollTo(x, y); + } + + @Override + public boolean onTouchEvent(MotionEvent arg0) { + /* return false;//super.onTouchEvent(arg0); */ + if (noScroll) + return false; + else + return super.onTouchEvent(arg0); + } + + @Override + public boolean onInterceptTouchEvent(MotionEvent arg0) { + if (noScroll) + return false; + else + return super.onInterceptTouchEvent(arg0); + } + + @Override + public void setCurrentItem(int item, boolean smoothScroll) { + super.setCurrentItem(item, smoothScroll); + } + + @Override + public void setCurrentItem(int item) { + super.setCurrentItem(item); + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/OrigoPickerLayout.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/OrigoPickerLayout.java new file mode 100644 index 0000000000000000000000000000000000000000..ded17dabd9eff10d7dfe2917cd641916c545a422 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/OrigoPickerLayout.java @@ -0,0 +1,139 @@ +package com.jiuqi.elove.widget; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.widget.LinearLayout; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.adapter.AreaDataUtil; + +import java.util.ArrayList; + +/** + * 籍贯选择器 + * Created by dl on 2016/11/29. + */ +public class OrigoPickerLayout extends LinearLayout { + private WheelView mProvincePicker; + private WheelView mCityPicker; + + private int mCurrProvinceIndex = -1; + private int mCurrCityIndex = -1; + private String flag = "origo"; + + private AreaDataUtil mAreaDataUtil; + private ArrayList mProvinceList = new ArrayList<>(); + + public OrigoPickerLayout(Context context, AttributeSet attrs) { + super(context, attrs); + getAreaInfo(); + } + + public OrigoPickerLayout(Context context) { + this(context, null); + } + + private void getAreaInfo() { + mAreaDataUtil = new AreaDataUtil(getContext(),flag); + mProvinceList = mAreaDataUtil.getProvinces(); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + LayoutInflater.from(getContext()).inflate(R.layout.layout_city_picker, this); + + mProvincePicker = (WheelView) findViewById(R.id.province_wv); + mCityPicker = (WheelView) findViewById(R.id.city_wv); + + mProvincePicker.setData(mProvinceList); + mProvincePicker.setDefault(0); + + String defaultProvince = mProvinceList.get(0); + mCityPicker.setData(mAreaDataUtil.getCityByProvince(defaultProvince)); + if(mAreaDataUtil.getCityByProvince(defaultProvince).size()>1){ + mCityPicker.setDefault(1); + }else{ + mCityPicker.setDefault(0); + } + + mProvincePicker.setOnSelectListener(new WheelView.OnSelectListener() { + @Override + public void endSelect(int id, String text) { + if (text.equals("") || text == null) + return; + if (mCurrProvinceIndex != id) { + mCurrProvinceIndex = id; + String selectProvince = mProvincePicker.getSelectedText(); + if (selectProvince == null || selectProvince.equals("")) + return; + + // get city names by province + ArrayList city = mAreaDataUtil.getCityByProvince(mProvinceList.get(id)); + if (city.size() == 0) { + mCityPicker.setData(city);//这行自己加的,并不能解决次级为空城市显示的是上次显示的内容的问题 + return; + } + + mCityPicker.setData(city); + + if (city.size() > 1) { + //if city is more than one,show start index == 1 + mCityPicker.setDefault(1); + } else { + mCityPicker.setDefault(0); + } + } + + } + + @Override + public void selecting(int id, String text) { + } + }); + + mCityPicker.setOnSelectListener(new WheelView.OnSelectListener() { + + @Override + public void endSelect(int id, String text) { + if (text.equals("") || text == null) + return; + if (mCurrCityIndex != id) { + mCurrCityIndex = id; + String selectCity = mCityPicker.getSelectedText(); + if (selectCity == null || selectCity.equals("")) + return; + int lastIndex = Integer.valueOf(mCityPicker.getListSize()); + if (id > lastIndex) { + mCityPicker.setDefault(lastIndex - 1); + } + } + } + + @Override + public void selecting(int id, String text) { + + } + }); + } + + public String getProvince() { + if (mProvincePicker == null) { + return null; + } + return mProvincePicker.getSelectedText(); + } + + public String getCity() { + if (mCityPicker == null) { + return null; + } + return mCityPicker.getSelectedText(); + } + + public void setWheelViewItemNumber(int number){ + mProvincePicker.setItemNumber(number); + mCityPicker.setItemNumber(number); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/PoiSingleChoiceView.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/PoiSingleChoiceView.java new file mode 100644 index 0000000000000000000000000000000000000000..8c32303c8825e75568cfcdbcc7bf1bddc08e2cce --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/PoiSingleChoiceView.java @@ -0,0 +1,49 @@ +package com.jiuqi.elove.widget; + +import android.content.Context; +import android.view.View; +import android.widget.Checkable; +import android.widget.FrameLayout; +import android.widget.RadioButton; +import android.widget.TextView; + +import com.jiuqi.elove.R; + +/** + * 活动选择地区用,暂时没用了 + * Created by dl on 2016/8/9. + */ +public class PoiSingleChoiceView extends FrameLayout implements Checkable{ + + private TextView simpleadd; + private TextView detailadd; + private RadioButton radio_btn; + + public PoiSingleChoiceView(Context context){ + super(context); + View.inflate(context, R.layout.item_poi_layout, this); + simpleadd = (TextView) findViewById(R.id.simpleadd); + detailadd = (TextView) findViewById(R.id.detailadd); +// radio_btn = (RadioButton) findViewById(R.id.radio_btn); + } + + public void setText(String simple,String detail){ + simpleadd.setText(simple); + detailadd.setText(detail); + } + @Override + public void setChecked(boolean b) { + radio_btn.setChecked(b); + } +// + @Override + public boolean isChecked() { +// return radio_btn.isChecked(); + return false; + } +// + @Override + public void toggle() { +// radio_btn.toggle(); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/PriceSingleChoiceView.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/PriceSingleChoiceView.java new file mode 100644 index 0000000000000000000000000000000000000000..001e8d02a34f430d5b9c9217c9b8c8a21aadf9fb --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/PriceSingleChoiceView.java @@ -0,0 +1,58 @@ +package com.jiuqi.elove.widget; + +import android.content.Context; +import android.view.View; +import android.widget.Checkable; +import android.widget.FrameLayout; +import android.widget.RadioButton; +import android.widget.TextView; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.Constant; + +/** + * 价格单选控件,报名活动选择票价时用 + * Created by dl on 2016/11/10. + */ +public class PriceSingleChoiceView extends FrameLayout implements Checkable { + + private TextView simpleadd; + private TextView detailadd; + private RadioButton radio_btn; + private TextView tv_item_price; + + public PriceSingleChoiceView(Context context,String flag){ + super(context); + View.inflate(context, R.layout.item_priceselect_layout, this); + simpleadd = (TextView) findViewById(R.id.simpleadd); + detailadd = (TextView) findViewById(R.id.detailadd); + radio_btn = (RadioButton) findViewById(R.id.radio_btn); + tv_item_price = (TextView) findViewById(R.id.tv_item_price); + if(Constant.RADIO_FLAG_INPRICELIST_NO.equals(flag)){ + radio_btn.setVisibility(GONE); + }else{ + radio_btn.setVisibility(VISIBLE); + } + } + + public void setText(String simple,String detail,String price){ + simpleadd.setText(simple); + detailadd.setText(detail); + tv_item_price.setText(price); + } + + @Override + public void setChecked(boolean b) { + radio_btn.setChecked(b); + } + + @Override + public boolean isChecked() { + return radio_btn.isChecked(); + } + + @Override + public void toggle() { + radio_btn.toggle(); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/RangeSeekBar.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/RangeSeekBar.java new file mode 100644 index 0000000000000000000000000000000000000000..510407134447d718f4444156752dcbe882c2e4d0 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/RangeSeekBar.java @@ -0,0 +1,757 @@ +/* +Copyright 2014 Stephan Tittel and Yahoo Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package com.jiuqi.elove.widget; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.*; +import android.graphics.Paint.Style; +import android.os.Bundle; +import android.os.Parcelable; +import android.util.AttributeSet; +import android.util.TypedValue; +import android.view.MotionEvent; +import android.view.ViewConfiguration; +import android.widget.ImageView; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.util.CommonUtil; + +import java.math.BigDecimal; + +/** + * 滑块选择年龄范围 + */ +public class RangeSeekBar extends ImageView { + + public static final Integer DEFAULT_MINIMUM = 0; + public static final Integer DEFAULT_MAXIMUM = 100; + public static final int HEIGHT_IN_DP = 30; + public static final int TEXT_LATERAL_PADDING_IN_DP = 3; + private static final int INITIAL_PADDING_IN_DP = 8; + private final int LINE_HEIGHT_IN_DP = 1; + private final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); + private final Bitmap thumbImage = BitmapFactory.decodeResource(getResources(), R.drawable.icon_age_select); + private final Bitmap thumbPressedImage = BitmapFactory.decodeResource(getResources(), + R.drawable.icon_age_select); + private final Bitmap thumbDisabledImage = BitmapFactory.decodeResource(getResources(), + R.drawable.icon_age_select); + private final float thumbWidth = thumbImage.getWidth(); + private final float thumbHalfWidth = 0.5f * thumbWidth; + private final float thumbHalfHeight = 0.5f * thumbImage.getHeight(); + private float INITIAL_PADDING; + private float padding; + private T absoluteMinValue, absoluteMaxValue; + private NumberType numberType; + private double absoluteMinValuePrim, absoluteMaxValuePrim; + private double normalizedMinValue = 0d; + private double normalizedMaxValue = 1d; + private Thumb pressedThumb = null; + private boolean notifyWhileDragging = false; + private OnRangeSeekBarChangeListener listener; + /** + * Default color of a {@link RangeSeekBar}, #FF33B5E5. This is also known as "Ice Cream Sandwich" blue. + */ +// public static final int DEFAULT_COLOR = Color.argb(0xFF, 0x33, 0xB5, 0xE5); + public static final int DEFAULT_COLOR = R.color.colorPrimary; + /** + * An invalid pointer id. + */ + public static final int INVALID_POINTER_ID = 255; + + // Localized constants from MotionEvent for compatibility + // with API < 8 "Froyo". + public static final int ACTION_POINTER_UP = 0x6, ACTION_POINTER_INDEX_MASK = 0x0000ff00, ACTION_POINTER_INDEX_SHIFT = 8; + + private float mDownMotionX; + + private int mActivePointerId = INVALID_POINTER_ID; + + private int mScaledTouchSlop; + + private boolean mIsDragging; + + private int mTextOffset; + private int mTextSize; + private int mDistanceToTop; + private RectF mRect; + + private static final int DEFAULT_TEXT_SIZE_IN_DP = 12; + private static final int DEFAULT_TEXT_DISTANCE_TO_BUTTON_IN_DP = 8; + private static final int DEFAULT_TEXT_DISTANCE_TO_TOP_IN_DP = 8; + private boolean mSingleThumb; + + public RangeSeekBar(Context context) { + super(context); + init(context, null); + } + + public RangeSeekBar(Context context, AttributeSet attrs) { + super(context, attrs); + init(context, attrs); + } + + public RangeSeekBar(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + init(context, attrs); + } + + private T extractNumericValueFromAttributes(TypedArray a, int attribute, int defaultValue) { + TypedValue tv = a.peekValue(attribute); + if (tv == null) { + return (T) Integer.valueOf(defaultValue); + } + + int type = tv.type; + if (type == TypedValue.TYPE_FLOAT) { + return (T) Float.valueOf(a.getFloat(attribute, defaultValue)); + } else { + return (T) Integer.valueOf(a.getInteger(attribute, defaultValue)); + } + } + + private void init(Context context, AttributeSet attrs) { + if (attrs == null) { + setRangeToDefaultValues(); + } else { + TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.RangeSeekBar, 0, 0); + setRangeValues( + extractNumericValueFromAttributes(a, R.styleable.RangeSeekBar_absoluteMinValue, DEFAULT_MINIMUM), + extractNumericValueFromAttributes(a, R.styleable.RangeSeekBar_absoluteMaxValue, DEFAULT_MAXIMUM)); + mSingleThumb = a.getBoolean(R.styleable.RangeSeekBar_singleThumb, false); + a.recycle(); + } + + setValuePrimAndNumberType(); + + INITIAL_PADDING = CommonUtil.dip2px(context, INITIAL_PADDING_IN_DP); + + mTextSize = CommonUtil.dip2px(context, DEFAULT_TEXT_SIZE_IN_DP); + mDistanceToTop = CommonUtil.dip2px(context, DEFAULT_TEXT_DISTANCE_TO_TOP_IN_DP); + mTextOffset = this.mTextSize + CommonUtil.dip2px(context, + DEFAULT_TEXT_DISTANCE_TO_BUTTON_IN_DP) + this.mDistanceToTop; + + float lineHeight = CommonUtil.dip2px(context, LINE_HEIGHT_IN_DP); +// mRect = new RectF(padding, +// mTextOffset + thumbHalfHeight - lineHeight / 2, +// getWidth() - padding, +// mTextOffset + thumbHalfHeight + lineHeight / 2); + mRect = new RectF(padding, + mTextOffset + 2*thumbHalfHeight - lineHeight / 2, + getWidth() - padding, + mTextOffset + 2*thumbHalfHeight + lineHeight / 2); + + // make RangeSeekBar focusable. This solves focus handling issues in case EditText widgets are being used along with the RangeSeekBar within ScollViews. + setFocusable(true); + setFocusableInTouchMode(true); + mScaledTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop(); + } + + public void setRangeValues(T minValue, T maxValue) { + this.absoluteMinValue = minValue; + this.absoluteMaxValue = maxValue; + setValuePrimAndNumberType(); + } + + @SuppressWarnings("unchecked") + // only used to set default values when initialised from XML without any values specified + private void setRangeToDefaultValues() { + this.absoluteMinValue = (T) DEFAULT_MINIMUM; + this.absoluteMaxValue = (T) DEFAULT_MAXIMUM; + setValuePrimAndNumberType(); + } + + private void setValuePrimAndNumberType() { + absoluteMinValuePrim = absoluteMinValue.doubleValue(); + absoluteMaxValuePrim = absoluteMaxValue.doubleValue(); + numberType = NumberType.fromNumber(absoluteMinValue); + } + + public void resetSelectedValues() { + setSelectedMinValue(absoluteMinValue); + setSelectedMaxValue(absoluteMaxValue); + } + + public boolean isNotifyWhileDragging() { + return notifyWhileDragging; + } + + /** + * Should the widget notify the listener callback while the user is still dragging a thumb? Default is false. + * + * @param flag + */ + public void setNotifyWhileDragging(boolean flag) { + this.notifyWhileDragging = flag; + } + + /** + * Returns the absolute minimum value of the range that has been set at construction time. + * + * @return The absolute minimum value of the range. + */ + public T getAbsoluteMinValue() { + return absoluteMinValue; + } + + /** + * Returns the absolute maximum value of the range that has been set at construction time. + * + * @return The absolute maximum value of the range. + */ + public T getAbsoluteMaxValue() { + return absoluteMaxValue; + } + + /** + * Returns the currently selected min value. + * + * @return The currently selected min value. + */ + public T getSelectedMinValue() { + return normalizedToValue(normalizedMinValue); + } + + /** + * Sets the currently selected minimum value. The widget will be invalidated and redrawn. + * + * @param value The Number value to set the minimum value to. Will be clamped to given absolute minimum/maximum range. + */ + public void setSelectedMinValue(T value) { + // in case absoluteMinValue == absoluteMaxValue, avoid division by zero when normalizing. + if (0 == (absoluteMaxValuePrim - absoluteMinValuePrim)) { + setNormalizedMinValue(0d); + } else { + setNormalizedMinValue(valueToNormalized(value)); + } + } + + /** + * Returns the currently selected max value. + * + * @return The currently selected max value. + */ + public T getSelectedMaxValue() { + return normalizedToValue(normalizedMaxValue); + } + + /** + * Sets the currently selected maximum value. The widget will be invalidated and redrawn. + * + * @param value The Number value to set the maximum value to. Will be clamped to given absolute minimum/maximum range. + */ + public void setSelectedMaxValue(T value) { + // in case absoluteMinValue == absoluteMaxValue, avoid division by zero when normalizing. + if (0 == (absoluteMaxValuePrim - absoluteMinValuePrim)) { + setNormalizedMaxValue(1d); + } else { + setNormalizedMaxValue(valueToNormalized(value)); + } + } + + /** + * Registers given listener callback to notify about changed selected values. + * + * @param listener The listener to notify about changed selected values. + */ + public void setOnRangeSeekBarChangeListener(OnRangeSeekBarChangeListener listener) { + this.listener = listener; + } + + /** + * Handles thumb selection and movement. Notifies listener callback on certain events. + */ + @Override + public boolean onTouchEvent(MotionEvent event) { + + if (!isEnabled()) { + return false; + } + + int pointerIndex; + + final int action = event.getAction(); + switch (action & MotionEvent.ACTION_MASK) { + + case MotionEvent.ACTION_DOWN: + + // Remember where the motion event started + mActivePointerId = event.getPointerId(event.getPointerCount() - 1); + pointerIndex = event.findPointerIndex(mActivePointerId); + mDownMotionX = event.getX(pointerIndex);//得到手指摁下去的x坐标 + + pressedThumb = evalPressedThumb(mDownMotionX); + + // Only handle thumb presses. + if (pressedThumb == null) { + return super.onTouchEvent(event); + } + + setPressed(true); + invalidate(); + onStartTrackingTouch();//会将mIsDragging设置为true + trackTouchEvent(event); + attemptClaimDrag(); + + + break; + case MotionEvent.ACTION_MOVE: + if (pressedThumb != null) { + + if (mIsDragging) { + trackTouchEvent(event); + } else { + // Scroll to follow the motion event + pointerIndex = event.findPointerIndex(mActivePointerId); + final float x = event.getX(pointerIndex); + + if (Math.abs(x - mDownMotionX) > mScaledTouchSlop) { + setPressed(true); + invalidate(); + onStartTrackingTouch(); + trackTouchEvent(event); + attemptClaimDrag(); + } + } + + if (notifyWhileDragging && listener != null) { + listener.onRangeSeekBarValuesChanged(this, getSelectedMinValue(), getSelectedMaxValue()); + } + } + break; + case MotionEvent.ACTION_UP: + if (mIsDragging) { + trackTouchEvent(event); + onStopTrackingTouch(); + setPressed(false); + } else { + // Touch up when we never crossed the touch slop threshold + // should be interpreted as a tap-seek to that location. + onStartTrackingTouch(); + trackTouchEvent(event); + onStopTrackingTouch(); + } + + pressedThumb = null; + invalidate(); + if (listener != null) { + listener.onRangeSeekBarValuesChanged(this, getSelectedMinValue(), getSelectedMaxValue()); + } + break; + case MotionEvent.ACTION_POINTER_DOWN: { + final int index = event.getPointerCount() - 1; + // final int index = ev.getActionIndex(); + mDownMotionX = event.getX(index); + mActivePointerId = event.getPointerId(index); + invalidate(); + break; + } + case MotionEvent.ACTION_POINTER_UP: + onSecondaryPointerUp(event); + invalidate(); + break; + case MotionEvent.ACTION_CANCEL: + if (mIsDragging) { + onStopTrackingTouch(); + setPressed(false); + } + invalidate(); // see above explanation + break; + } + return true; + } + + private final void onSecondaryPointerUp(MotionEvent ev) { + final int pointerIndex = (ev.getAction() & ACTION_POINTER_INDEX_MASK) >> ACTION_POINTER_INDEX_SHIFT; + + final int pointerId = ev.getPointerId(pointerIndex); + if (pointerId == mActivePointerId) { + // This was our active pointer going up. Choose + // a new active pointer and adjust accordingly. + // TODO: Make this decision more intelligent. + final int newPointerIndex = pointerIndex == 0 ? 1 : 0; + mDownMotionX = ev.getX(newPointerIndex); + mActivePointerId = ev.getPointerId(newPointerIndex); + } + } + + /** + * 将两个按钮最终所代表的最大值和最小值转化出来并设置上 + * @param event + */ + private final void trackTouchEvent(MotionEvent event) { + final int pointerIndex = event.findPointerIndex(mActivePointerId); + final float x = event.getX(pointerIndex); + + if (Thumb.MIN.equals(pressedThumb) && !mSingleThumb) { + setNormalizedMinValue(screenToNormalized(x)); + } else if (Thumb.MAX.equals(pressedThumb)) { + setNormalizedMaxValue(screenToNormalized(x)); + } + } + + /** + * Tries to claim the user's drag motion, and requests disallowing any ancestors from stealing events in the drag. + */ + private void attemptClaimDrag() { + if (getParent() != null) { + getParent().requestDisallowInterceptTouchEvent(true); + } + } + + /** + * This is called when the user has started touching this widget. + */ + void onStartTrackingTouch() { + mIsDragging = true; + } + + /** + * This is called when the user either releases his touch or the touch is canceled. + */ + void onStopTrackingTouch() { + mIsDragging = false; + } + + /** + * Ensures correct size of the widget. + */ + @Override + protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int width = 200; + if (MeasureSpec.UNSPECIFIED != MeasureSpec.getMode(widthMeasureSpec)) { + width = MeasureSpec.getSize(widthMeasureSpec); + } + + int height = thumbImage.getHeight() + CommonUtil.dip2px(getContext(), HEIGHT_IN_DP); + if (MeasureSpec.UNSPECIFIED != MeasureSpec.getMode(heightMeasureSpec)) { + height = Math.min(height, MeasureSpec.getSize(heightMeasureSpec)); + } + setMeasuredDimension(width, height); + } + + /** + * Draws the widget on the given canvas. + */ + @Override + protected synchronized void onDraw(Canvas canvas) { + super.onDraw(canvas); + + paint.setTextSize(mTextSize); + paint.setStyle(Style.FILL); +// paint.setColor(getResources().getColor(R.color.colorPrimary)); + paint.setColor(Color.GRAY); + paint.setAntiAlias(true); + // draw min and max labels +// String minLabel = getContext().getString(R.string.demo_min_label); +// String maxLabel = getContext().getString(R.string.demo_max_label); +// float minMaxLabelSize = Math.max(paint.measureText(minLabel), paint.measureText(maxLabel)); +// float minMaxHeight = mTextOffset + thumbHalfHeight + mTextSize / 3; +// canvas.drawText(minLabel, 0, minMaxHeight, paint); +// canvas.drawText(maxLabel, getWidth() - minMaxLabelSize, minMaxHeight, paint); +// padding = INITIAL_PADDING + minMaxLabelSize + thumbHalfWidth; + padding = INITIAL_PADDING + thumbHalfWidth; + + // draw seek bar background line + mRect.left = padding; + mRect.right = getWidth() - padding; + canvas.drawRect(mRect, paint); + + boolean selectedValuesAreDefault = (getSelectedMinValue().equals(getAbsoluteMinValue()) && + getSelectedMaxValue().equals(getAbsoluteMaxValue())); + + int colorToUseForButtonsAndHighlightedLine = selectedValuesAreDefault ? + DEFAULT_COLOR : // default values + DEFAULT_COLOR; //non default, filter is active + + // draw seek bar active range line + mRect.left = normalizedToScreen(normalizedMinValue); + mRect.right = normalizedToScreen(normalizedMaxValue); + + paint.setColor(getResources().getColor(colorToUseForButtonsAndHighlightedLine)); + canvas.drawRect(mRect, paint); + + // draw minimum thumb if not a single thumb control + if (!mSingleThumb) { + drawThumb(normalizedToScreen(normalizedMinValue), Thumb.MIN.equals(pressedThumb), canvas, + selectedValuesAreDefault); + } + + // draw maximum thumb + drawThumb(normalizedToScreen(normalizedMaxValue), Thumb.MAX.equals(pressedThumb), canvas, + selectedValuesAreDefault); + + // draw the text if sliders have moved from default edges +// if (!selectedValuesAreDefault) {自己改的是否为最大范围 + paint.setTextSize(mTextSize); +// paint.setColor(Color.WHITE); + paint.setColor(getResources().getColor(R.color.blackFont)); + // give text a bit more space here so it doesn't get cut off + int offset = CommonUtil.dip2px(getContext(), TEXT_LATERAL_PADDING_IN_DP); + + String minText = String.valueOf(getSelectedMinValue()); + String maxText = String.valueOf(getSelectedMaxValue()); + float minTextWidth = paint.measureText(minText) + offset; + float maxTextWidth = paint.measureText(maxText) + offset; + + if (!mSingleThumb) { + canvas.drawText(minText, + normalizedToScreen(normalizedMinValue) - minTextWidth * 0.5f, + mDistanceToTop + mTextSize, + paint); + } + + canvas.drawText(maxText, + normalizedToScreen(normalizedMaxValue) - maxTextWidth * 0.5f, + mDistanceToTop + mTextSize, + paint); +// } + + } + + + /** + * Overridden to save instance state when device orientation changes. This method is called automatically if you assign an id to the RangeSeekBar widget using the {@link #setId(int)} method. Other members of this class than the normalized min and max values don't need to be saved. + */ + @Override + protected Parcelable onSaveInstanceState() { + final Bundle bundle = new Bundle(); + bundle.putParcelable("SUPER", super.onSaveInstanceState()); + bundle.putDouble("MIN", normalizedMinValue); + bundle.putDouble("MAX", normalizedMaxValue); + return bundle; + } + + /** + * Overridden to restore instance state when device orientation changes. This method is called automatically if you assign an id to the RangeSeekBar widget using the {@link #setId(int)} method. + */ + @Override + protected void onRestoreInstanceState(Parcelable parcel) { + final Bundle bundle = (Bundle) parcel; + super.onRestoreInstanceState(bundle.getParcelable("SUPER")); + normalizedMinValue = bundle.getDouble("MIN"); + normalizedMaxValue = bundle.getDouble("MAX"); + } + + /** + * Draws the "normal" resp. "pressed" thumb image on specified x-coordinate. + * + * @param screenCoord The x-coordinate in screen space where to draw the image. + * @param pressed Is the thumb currently in "pressed" state? + * @param canvas The canvas to draw upon. + * 将按钮画在屏幕上,最后一个参数根据是否为最大值和是否摁压采用不同的图片,drawbitmap第二个和第三个参数为靠左和靠上的距离,最后一个为画笔 + */ + private void drawThumb(float screenCoord, boolean pressed, Canvas canvas, boolean areSelectedValuesDefault) { + Bitmap buttonToDraw; + if (areSelectedValuesDefault) { + buttonToDraw = thumbDisabledImage; + } else { + buttonToDraw = pressed ? thumbPressedImage : thumbImage; + } + + canvas.drawBitmap(buttonToDraw, screenCoord - thumbHalfWidth, + mTextOffset, + paint); + } + + /** + * Decides which (if any) thumb is touched by the given x-coordinate. + * + * @param touchX The x-coordinate of a touch event in screen space. + * @return The pressed thumb or null if none has been touched. + * 判断当前摁的是代表小值的按钮还是大值的按钮 + */ + private Thumb evalPressedThumb(float touchX) { + Thumb result = null; + boolean minThumbPressed = isInThumbRange(touchX, normalizedMinValue); + boolean maxThumbPressed = isInThumbRange(touchX, normalizedMaxValue); + if (minThumbPressed && maxThumbPressed) { + // if both thumbs are pressed (they lie on top of each other), choose the one with more room to drag. this avoids "stalling" the thumbs in a corner, not being able to drag them apart anymore. + result = (touchX / getWidth() > 0.5f) ? Thumb.MIN : Thumb.MAX; + } else if (minThumbPressed) { + result = Thumb.MIN; + } else if (maxThumbPressed) { + result = Thumb.MAX; + } + return result; + } + + /** + * Decides if given x-coordinate in screen space needs to be interpreted as "within" the normalized thumb x-coordinate. + * + * @param touchX The x-coordinate in screen space to check. + * @param normalizedThumbValue The normalized x-coordinate of the thumb to check. + * @return true if x-coordinate is in thumb range, false otherwise. + * 是否在可滑动范围内 touchx为当前滑动位置 normalizedThumbValue为范围按钮的两端值中的一个所代表的实际数值,二者差值不多于按钮的半个宽度就可以滑动 + */ + private boolean isInThumbRange(float touchX, double normalizedThumbValue) { + return Math.abs(touchX - normalizedToScreen(normalizedThumbValue)) <= 2*thumbHalfWidth; + } + + /** + * Sets normalized min value to value so that 0 <= value <= normalized max value <= 1. The View will get invalidated when calling this method. + * + * @param value The new normalized min value to set. + */ + private void setNormalizedMinValue(double value) { + normalizedMinValue = Math.max(0d, Math.min(1d, Math.min(value, normalizedMaxValue))); + invalidate(); + } + + /** + * Sets normalized max value to value so that 0 <= normalized min value <= value <= 1. The View will get invalidated when calling this method. + * + * @param value The new normalized max value to set. + */ + private void setNormalizedMaxValue(double value) { + normalizedMaxValue = Math.max(0d, Math.min(1d, Math.max(value, normalizedMinValue))); + invalidate(); + } + + /** + * Converts a normalized value to a Number object in the value space between absolute minimum and maximum. + * + * @param normalized + * @return + */ + @SuppressWarnings("unchecked") + private T normalizedToValue(double normalized) { + double v = absoluteMinValuePrim + normalized * (absoluteMaxValuePrim - absoluteMinValuePrim); + // TODO parameterize this rounding to allow variable decimal points + return (T) numberType.toNumber(Math.round(v * 100) / 100d); + } + + /** + * Converts the given Number value to a normalized double. + * + * @param value The Number value to normalize. + * @return The normalized double. + */ + private double valueToNormalized(T value) { + if (0 == absoluteMaxValuePrim - absoluteMinValuePrim) { + // prevent division by zero, simply return 0. + return 0d; + } + return (value.doubleValue() - absoluteMinValuePrim) / (absoluteMaxValuePrim - absoluteMinValuePrim); + } + + /** + * Converts a normalized value into screen space. + * + * @param normalizedCoord The normalized value to convert. + * @return The converted value in screen space. + * 将正常值转换为屏幕距离 + * getWidth() - 2 * padding为线和两个半个(凑起来即为一个按钮)的宽度 + * normalizedCoord为线条所占比例0和1 + */ + private float normalizedToScreen(double normalizedCoord) { + return (float) (padding + normalizedCoord * (getWidth() - 2 * padding)); + } + + /** + * Converts screen space x-coordinates into normalized values. + * + * @param screenCoord The x-coordinate in screen space to convert. + * @return The normalized value. + * 将屏幕距离转换为实际值 + */ + private double screenToNormalized(float screenCoord) { + int width = getWidth(); + if (width <= 2 * padding) { + // prevent division by zero, simply return 0. + return 0d; + } else { + double result = (screenCoord - padding) / (width - 2 * padding); + return Math.min(1d, Math.max(0d, result)); + } + } + + /** + * Callback listener interface to notify about changed range values. + * + * @param The Number type the RangeSeekBar has been declared with. + * @author Stephan Tittel (stephan.tittel@kom.tu-darmstadt.de) + */ + public interface OnRangeSeekBarChangeListener { + + public void onRangeSeekBarValuesChanged(RangeSeekBar bar, T minValue, T maxValue); + } + + /** + * Thumb constants (min and max). + */ + private static enum Thumb { + MIN, MAX + } + + ; + + /** + * Utility enumeration used to convert between Numbers and doubles. + * + * @author Stephan Tittel (stephan.tittel@kom.tu-darmstadt.de) + */ + private static enum NumberType { + LONG, DOUBLE, INTEGER, FLOAT, SHORT, BYTE, BIG_DECIMAL; + + public static NumberType fromNumber(E value) throws IllegalArgumentException { + if (value instanceof Long) { + return LONG; + } + if (value instanceof Double) { + return DOUBLE; + } + if (value instanceof Integer) { + return INTEGER; + } + if (value instanceof Float) { + return FLOAT; + } + if (value instanceof Short) { + return SHORT; + } + if (value instanceof Byte) { + return BYTE; + } + if (value instanceof BigDecimal) { + return BIG_DECIMAL; + } + throw new IllegalArgumentException("Number class '" + value.getClass().getName() + "' is not supported"); + } + + public Number toNumber(double value) { + switch (this) { + case LONG: + return Long.valueOf((long) value); + case DOUBLE: + return value; + case INTEGER: + return Integer.valueOf((int) value); + case FLOAT: + return Float.valueOf((float)value); + case SHORT: + return Short.valueOf((short) value); + case BYTE: + return Byte.valueOf((byte) value); + case BIG_DECIMAL: + return BigDecimal.valueOf(value); + } + throw new InstantiationError("can't convert " + this + " to a Number object"); + } + } + +} \ No newline at end of file diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/ReboundScrollView.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/ReboundScrollView.java new file mode 100644 index 0000000000000000000000000000000000000000..985e8c11715dc4a55a5571a1a122445ae73a6b90 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/ReboundScrollView.java @@ -0,0 +1,173 @@ +package com.jiuqi.elove.widget; +import android.content.Context; +import android.graphics.Rect; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.View; +import android.view.animation.TranslateAnimation; +import android.widget.ScrollView; + +/** + * 有弹性的ScrollView + * 实现下拉弹回和上拉弹回 + * @author dl + * + */ +public class ReboundScrollView extends ScrollView { + + private static final String TAG = "ElasticScrollView"; + + //移动因子, 是一个百分比, 比如手指移动了100px, 那么View就只移动50px + //目的是达到一个延迟的效果 + private static final float MOVE_FACTOR = 0.5f; + + //松开手指后, 界面回到正常位置需要的动画时间 + private static final int ANIM_TIME = 300; + + //ScrollView的子View, 也是ScrollView的唯一一个子View + private View contentView; + + //手指按下时的Y值, 用于在移动时计算移动距离 + //如果按下时不能上拉和下拉, 会在手指移动时更新为当前手指的Y值 + private float startY; + + //用于记录正常的布局位置 + private Rect originalRect = new Rect(); + + //手指按下时记录是否可以继续下拉 + private boolean canPullDown = false; + + //手指按下时记录是否可以继续上拉 + private boolean canPullUp = false; + + //在手指滑动的过程中记录是否移动了布局 + private boolean isMoved = false; + + public ReboundScrollView(Context context) { + super(context); + } + + public ReboundScrollView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + if (getChildCount() > 0) { + contentView = getChildAt(0); + } + } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + super.onLayout(changed, l, t, r, b); + + if(contentView == null) return; + + //ScrollView中的唯一子控件的位置信息, 这个位置信息在整个控件的生命周期中保持不变 + originalRect.set(contentView.getLeft(), contentView.getTop(), contentView + .getRight(), contentView.getBottom()); + } + + /** + * 在触摸事件中, 处理上拉和下拉的逻辑 + */ + @Override + public boolean dispatchTouchEvent(MotionEvent ev) { + + if (contentView == null) { + return super.dispatchTouchEvent(ev); + } + + int action = ev.getAction(); + + switch (action) { + case MotionEvent.ACTION_DOWN: + + //判断是否可以上拉和下拉 + canPullDown = isCanPullDown(); + canPullUp = isCanPullUp(); + + //记录按下时的Y值 + startY = ev.getY(); + break; + + case MotionEvent.ACTION_UP: + + if(!isMoved) break; //如果没有移动布局, 则跳过执行 + + // 开启动画 + TranslateAnimation anim = new TranslateAnimation(0, 0, contentView.getTop(), + originalRect.top); + anim.setDuration(ANIM_TIME); + + contentView.startAnimation(anim); + + // 设置回到正常的布局位置 + contentView.layout(originalRect.left, originalRect.top, + originalRect.right, originalRect.bottom); + + //将标志位设回false + canPullDown = false; + canPullUp = false; + isMoved = false; + + break; + case MotionEvent.ACTION_MOVE: + + //在移动的过程中, 既没有滚动到可以上拉的程度, 也没有滚动到可以下拉的程度 + if(!canPullDown && !canPullUp) { + startY = ev.getY(); + canPullDown = isCanPullDown(); + canPullUp = isCanPullUp(); + + break; + } + + //计算手指移动的距离 + float nowY = ev.getY(); + int deltaY = (int) (nowY - startY); + + //是否应该移动布局 + boolean shouldMove = + (canPullDown && deltaY > 0) //可以下拉, 并且手指向下移动 + || (canPullUp && deltaY< 0) //可以上拉, 并且手指向上移动 + || (canPullUp && canPullDown); //既可以上拉也可以下拉(这种情况出现在ScrollView包裹的控件比ScrollView还小) + + if(shouldMove){ + //计算偏移量 + int offset = (int)(deltaY * MOVE_FACTOR); + + //随着手指的移动而移动布局 + contentView.layout(originalRect.left, originalRect.top + offset, + originalRect.right, originalRect.bottom + offset); + + isMoved = true; //记录移动了布局 + } + + break; + default: + break; + } + + return super.dispatchTouchEvent(ev); + } + + + /** + * 判断是否滚动到顶部 + */ + private boolean isCanPullDown() { + return getScrollY() == 0 || + contentView.getHeight() < getHeight() + getScrollY(); + } + + /** + * 判断是否滚动到底部 + */ + private boolean isCanPullUp() { + return contentView.getHeight() <= getHeight() + getScrollY(); + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/ScanScrollView.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/ScanScrollView.java new file mode 100644 index 0000000000000000000000000000000000000000..b63fd78bb534ab5b6219154b0d021805baed2e0f --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/ScanScrollView.java @@ -0,0 +1,94 @@ +package com.jiuqi.elove.widget; + +import android.content.Context; +import android.util.AttributeSet; +import android.widget.ScrollView; + +/** + mport android.content.Context; + import android.util.AttributeSet; + import android.widget.ScrollView; + + /** + * 监听ScrollView滚动到顶部或者底部做相关事件拦截 + */ +public class ScanScrollView extends ScrollView { + + private boolean isScrolledToTop = true;// 初始化的时候设置一下值 + private boolean isScrolledToBottom = false; + private ISmartScrollChangedListener mSmartScrollChangedListener; + + public ScanScrollView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public void setScanScrollChangedListener(ISmartScrollChangedListener smartScrollChangedListener) { + mSmartScrollChangedListener = smartScrollChangedListener; + } + + @Override + protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) { + super.onOverScrolled(scrollX, scrollY, clampedX, clampedY); + if (scrollY == 0) { + isScrolledToTop = clampedY; + isScrolledToBottom = false; + } else { + isScrolledToTop = false; + isScrolledToBottom = clampedY; + } + notifyScrollChangedListeners(); + } + + @Override + protected void onScrollChanged(int l, int t, int oldl, int oldt) { + super.onScrollChanged(l, t, oldl, oldt); + if (android.os.Build.VERSION.SDK_INT < 9) { // API 9及之后走onOverScrolled方法监听 + if (getScrollY() == 0) { // 小心踩坑1: 这里不能是getScrollY() <= 0 + isScrolledToTop = true; + isScrolledToBottom = false; + } else if (getScrollY() + getHeight() - getPaddingTop()-getPaddingBottom() == getChildAt(0).getHeight()) { + /** + * 小心踩坑2: 这里不能是 >= +          小心踩坑3(可能忽视的细节2):这里最容易忽视的就是ScrollView上下的padding + */ + isScrolledToBottom = true; + isScrolledToTop = false; + } else { + isScrolledToTop = false; + isScrolledToBottom = false; + } + notifyScrollChangedListeners(); + } + // 有时候写代码习惯了,为了兼容一些边界奇葩情况,上面的代码就会写成<=,>=的情况,结果就出bug了 + // 我写的时候写成这样:getScrollY() + getHeight() >= getChildAt(0).getHeight() + // 结果发现快滑动到底部但是还没到时,会发现上面的条件成立了,导致判断错误 + // 原因:getScrollY()值不是绝对靠谱的,它会超过边界值,但是它自己会恢复正确,导致上面的计算条件不成立 + // 仔细想想也感觉想得通,系统的ScrollView在处理滚动的时候动态计算那个scrollY的时候也会出现超过边界再修正的情况 + } + + private void notifyScrollChangedListeners() { + if (isScrolledToTop) { + if (mSmartScrollChangedListener != null) { + mSmartScrollChangedListener.onScrolledToTop(); + } + } else if (isScrolledToBottom) { + if (mSmartScrollChangedListener != null) { + mSmartScrollChangedListener.onScrolledToBottom(); + } + } + } + + public boolean isScrolledToTop() { + return isScrolledToTop; + } + + public boolean isScrolledToBottom() { + return isScrolledToBottom; + } + + /** 定义监听接口 */ + public interface ISmartScrollChangedListener { + void onScrolledToBottom(); + void onScrolledToTop(); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/SegmentedGroup.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/SegmentedGroup.java new file mode 100644 index 0000000000000000000000000000000000000000..20d6b10a78f6e5ffe38380c54f97b4e0b8f9d652 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/SegmentedGroup.java @@ -0,0 +1,303 @@ +package com.jiuqi.elove.widget; + +import android.content.Context; +import android.content.res.ColorStateList; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.graphics.Color; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.GradientDrawable; +import android.graphics.drawable.LayerDrawable; +import android.graphics.drawable.StateListDrawable; +import android.graphics.drawable.TransitionDrawable; +import android.os.Build; +import android.util.AttributeSet; +import android.util.StateSet; +import android.util.TypedValue; +import android.view.View; +import android.widget.Button; +import android.widget.LinearLayout; +import android.widget.RadioButton; +import android.widget.RadioGroup; + +import com.jiuqi.elove.R; + +import java.util.HashMap; + +/** + * 顶部选择按钮 + */ +public class SegmentedGroup extends RadioGroup { + + private int mMarginDp; + private Resources resources; + private int mTintColor; + private int mUnCheckedTintColor; + private int mCheckedTextColor = Color.WHITE; + private LayoutSelector mLayoutSelector; + private Float mCornerRadius; + private OnCheckedChangeListener mCheckedChangeListener; + private HashMap mDrawableMap; + private int mLastCheckId; + + public SegmentedGroup(Context context) { + super(context); + resources = getResources(); + mTintColor = resources.getColor(R.color.radio_button_selected_color); + mUnCheckedTintColor = resources.getColor(R.color.radio_button_unselected_color); + mMarginDp = (int) getResources().getDimension(R.dimen.radio_button_stroke_border); + mCornerRadius = getResources().getDimension(R.dimen.radio_button_conner_radius); + mLayoutSelector = new LayoutSelector(mCornerRadius); + } + + public SegmentedGroup(Context context, AttributeSet attrs) { + super(context, attrs); + resources = getResources(); + mTintColor = resources.getColor(R.color.radio_button_selected_color); + mUnCheckedTintColor = resources.getColor(R.color.radio_button_unselected_color); + mMarginDp = (int) getResources().getDimension(R.dimen.radio_button_stroke_border); + mCornerRadius = getResources().getDimension(R.dimen.radio_button_conner_radius); + initAttrs(attrs); + mLayoutSelector = new LayoutSelector(mCornerRadius); + } + + /* Reads the attributes from the layout */ + private void initAttrs(AttributeSet attrs) { + TypedArray typedArray = getContext().getTheme().obtainStyledAttributes( + attrs, + R.styleable.SegmentedGroup, + 0, 0); + + try { + mMarginDp = (int) typedArray.getDimension( + R.styleable.SegmentedGroup_sc_border_width, + getResources().getDimension(R.dimen.radio_button_stroke_border)); + + mCornerRadius = typedArray.getDimension( + R.styleable.SegmentedGroup_sc_corner_radius, + getResources().getDimension(R.dimen.radio_button_conner_radius)); + + mTintColor = typedArray.getColor( + R.styleable.SegmentedGroup_sc_tint_color, + getResources().getColor(R.color.radio_button_selected_color)); + + mCheckedTextColor = typedArray.getColor( + R.styleable.SegmentedGroup_sc_checked_text_color, + getResources().getColor(android.R.color.white)); + + mUnCheckedTintColor = typedArray.getColor( + R.styleable.SegmentedGroup_sc_unchecked_tint_color, + getResources().getColor(R.color.radio_button_unselected_color)); + } finally { + typedArray.recycle(); + } + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + //Use holo light for default + updateBackground(); + } + + public void setTintColor(int tintColor) { + mTintColor = tintColor; + updateBackground(); + } + + public void setTintColor(int tintColor, int checkedTextColor) { + mTintColor = tintColor; + mCheckedTextColor = checkedTextColor; + updateBackground(); + } + + public void setUnCheckedTintColor(int unCheckedTintColor, int unCheckedTextColor) { + mUnCheckedTintColor = unCheckedTintColor; + updateBackground(); + } + + public void updateBackground() { + mDrawableMap = new HashMap<>(); + int count = super.getChildCount(); + for (int i = 0; i < count; i++) { + View child = getChildAt(i); + updateBackground(child); + + // If this is the last view, don't set LayoutParams + if (i == count - 1) break; + + LayoutParams initParams = (LayoutParams) child.getLayoutParams(); + LayoutParams params = new LayoutParams(initParams.width, initParams.height, initParams.weight); + // Check orientation for proper margins + if (getOrientation() == LinearLayout.HORIZONTAL) { + params.setMargins(0, 0, -mMarginDp, 0); + } else { + params.setMargins(0, 0, 0, -mMarginDp); + } + child.setLayoutParams(params); + } + } + + private void updateBackground(View view) { + int checked = mLayoutSelector.getSelected(); + int unchecked = mLayoutSelector.getUnselected(); + //Set text color + ColorStateList colorStateList = new ColorStateList(new int[][]{ + {-android.R.attr.state_checked}, + {android.R.attr.state_checked}}, + new int[]{mTintColor, mCheckedTextColor}); + ((Button) view).setTextColor(colorStateList); + + //Redraw with tint color + Drawable checkedDrawable = resources.getDrawable(checked).mutate(); + Drawable uncheckedDrawable = resources.getDrawable(unchecked).mutate(); + ((GradientDrawable) checkedDrawable).setColor(mTintColor); + ((GradientDrawable) checkedDrawable).setStroke(mMarginDp, mTintColor); + ((GradientDrawable) uncheckedDrawable).setStroke(mMarginDp, mTintColor); + ((GradientDrawable) uncheckedDrawable).setColor(mUnCheckedTintColor); + //Set proper radius + ((GradientDrawable) checkedDrawable).setCornerRadii(mLayoutSelector.getChildRadii(view)); + ((GradientDrawable) uncheckedDrawable).setCornerRadii(mLayoutSelector.getChildRadii(view)); + + GradientDrawable maskDrawable = (GradientDrawable) resources.getDrawable(unchecked).mutate(); + maskDrawable.setStroke(mMarginDp, mTintColor); + maskDrawable.setColor(mUnCheckedTintColor); + maskDrawable.setCornerRadii(mLayoutSelector.getChildRadii(view)); + int maskColor = Color.argb(50, Color.red(mTintColor), Color.green(mTintColor), Color.blue(mTintColor)); + maskDrawable.setColor(maskColor); + LayerDrawable pressedDrawable = new LayerDrawable(new Drawable[] {uncheckedDrawable, maskDrawable}); + + Drawable[] drawables = {uncheckedDrawable, checkedDrawable}; + TransitionDrawable transitionDrawable = new TransitionDrawable(drawables); + if (((RadioButton) view).isChecked()) { + transitionDrawable.reverseTransition(0); + } + + StateListDrawable stateListDrawable = new StateListDrawable(); + stateListDrawable.addState(new int[] {-android.R.attr.state_checked, android.R.attr.state_pressed}, pressedDrawable); + stateListDrawable.addState(StateSet.WILD_CARD, transitionDrawable); + + mDrawableMap.put(view.getId(), transitionDrawable); + + //Set button background + if (Build.VERSION.SDK_INT >= 16) { + view.setBackground(stateListDrawable); + } else { + view.setBackgroundDrawable(stateListDrawable); + } + + super.setOnCheckedChangeListener(new OnCheckedChangeListener() { + @Override + public void onCheckedChanged(RadioGroup group, int checkedId) { + TransitionDrawable current = mDrawableMap.get(checkedId); + current.reverseTransition(200); + if (mLastCheckId != 0) { + TransitionDrawable last = mDrawableMap.get(mLastCheckId); + if (last != null) last.reverseTransition(200); + } + mLastCheckId = checkedId; + + if (mCheckedChangeListener != null) { + mCheckedChangeListener.onCheckedChanged(group, checkedId); + } + } + }); + } + +// @Override +// public void onViewRemoved(View child) { +// super.onViewRemoved(child); +// mDrawableMap.remove(child.getId()); +// } + + @Override + public void setOnCheckedChangeListener(OnCheckedChangeListener listener) { + mCheckedChangeListener = listener; + } + + /* + * This class is used to provide the proper layout based on the view. + * Also provides the proper radius for corners. + * The layout is the same for each selected left/top middle or right/bottom button. + * float tables for setting the radius via Gradient.setCornerRadii are used instead + * of multiple xml drawables. + */ + private class LayoutSelector { + + private int children; + private int child; + private final int SELECTED_LAYOUT = R.drawable.radio_checked; + private final int UNSELECTED_LAYOUT = R.drawable.radio_unchecked; + + private float r; //this is the radios read by attributes or xml dimens + private final float r1 = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP + , 0.1f, getResources().getDisplayMetrics()); //0.1 dp to px + private final float[] rLeft; // left radio button + private final float[] rRight; // right radio button + private final float[] rMiddle; // middle radio button + private final float[] rDefault; // default radio button + private final float[] rTop; // top radio button + private final float[] rBot; // bot radio button + private float[] radii; // result radii float table + + public LayoutSelector(float cornerRadius) { + children = -1; // Init this to force setChildRadii() to enter for the first time. + child = -1; // Init this to force setChildRadii() to enter for the first time + r = cornerRadius; + rLeft = new float[]{r, r, r1, r1, r1, r1, r, r}; + rRight = new float[]{r1, r1, r, r, r, r, r1, r1}; + rMiddle = new float[]{r1, r1, r1, r1, r1, r1, r1, r1}; + rDefault = new float[]{r, r, r, r, r, r, r, r}; + rTop = new float[]{r, r, r, r, r1, r1, r1, r1}; + rBot = new float[]{r1, r1, r1, r1, r, r, r, r}; + } + + private int getChildren() { + return SegmentedGroup.this.getChildCount(); + } + + private int getChildIndex(View view) { + return SegmentedGroup.this.indexOfChild(view); + } + + private void setChildRadii(int newChildren, int newChild) { + + // If same values are passed, just return. No need to update anything + if (children == newChildren && child == newChild) + return; + + // Set the new values + children = newChildren; + child = newChild; + + // if there is only one child provide the default radio button + if (children == 1) { + radii = rDefault; + } else if (child == 0) { //left or top + radii = (getOrientation() == LinearLayout.HORIZONTAL) ? rLeft : rTop; + } else if (child == children - 1) { //right or bottom + radii = (getOrientation() == LinearLayout.HORIZONTAL) ? rRight : rBot; + } else { //middle + radii = rMiddle; + } + } + + /* Returns the selected layout id based on view */ + public int getSelected() { + return SELECTED_LAYOUT; + } + + /* Returns the unselected layout id based on view */ + public int getUnselected() { + return UNSELECTED_LAYOUT; + } + + /* Returns the radii float table based on view for Gradient.setRadii()*/ + public float[] getChildRadii(View view) { + int newChildren = getChildren(); + int newChild = getChildIndex(view); + setChildRadii(newChildren, newChild); + return radii; + } + } +} \ No newline at end of file diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/SlowScrollView.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/SlowScrollView.java new file mode 100644 index 0000000000000000000000000000000000000000..8b1a2d79522632644f0244f492c0db89f9b7a56e --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/SlowScrollView.java @@ -0,0 +1,116 @@ +package com.jiuqi.elove.widget; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.View; +import android.widget.ScrollView; +import android.widget.Scroller; + +/** + * Created by FanWenXia on 2016/9/22. + */ +public class SlowScrollView extends ScrollView { + private Scroller mScroller; + private OnBorderListener onBorderListener; + private View contentView; + public SlowScrollView(Context context) { + super(context); + mScroller = new Scroller(context); + } + + public SlowScrollView(Context context, AttributeSet attrs) { + super(context, attrs); + mScroller = new Scroller(context); + } + + public SlowScrollView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + mScroller = new Scroller(context); + } + + //调用此方法滚动到目标位置 duration滚动时间 + public void smoothScrollToSlow(int fx, int fy, int duration) { + int dx = fx - getScrollX();//mScroller.getFinalX(); 普通view使用这种方法 + int dy = fy - getScrollY(); //mScroller.getFinalY(); + smoothScrollBySlow(dx, dy, duration); + } + + //调用此方法设置滚动的相对偏移 + public void smoothScrollBySlow(int dx, int dy,int duration) { + + //设置mScroller的滚动偏移量 + mScroller.startScroll(getScrollX(), getScrollY(), dx, dy,duration);//scrollView使用的方法(因为可以触摸拖动) +// mScroller.startScroll(mScroller.getFinalX(), mScroller.getFinalY(), dx, dy, duration); //普通view使用的方法 + invalidate();//这里必须调用invalidate()才能保证computeScroll()会被调用,否则不一定会刷新界面,看不到滚动效果 + } + + @Override + public void computeScroll() { + + //先判断mScroller滚动是否完成 + if (mScroller.computeScrollOffset()) { + + //这里调用View的scrollTo()完成实际的滚动 + scrollTo(mScroller.getCurrX(), mScroller.getCurrY()); + + //必须调用该方法,否则不一定能看到滚动效果 + postInvalidate(); + } + super.computeScroll(); + } + + @Override + protected void onScrollChanged(int x, int y, int oldx, int oldy) { + super.onScrollChanged(x, y, oldx, oldy); + doOnBorderListener(); + } + + public void setOnBorderListener(final OnBorderListener onBorderListener) { + this.onBorderListener = onBorderListener; + if (onBorderListener == null) { + return; + } + + if (contentView == null) { + contentView = getChildAt(0); + } + } + + /** + * OnBorderListener, Called when scroll to top or bottom + * + * @author Trinea 2013-5-22 + */ + public static interface OnBorderListener { + + /** + * Called when scroll to bottom + */ + public void onBottom(); + + /** + * Called when scroll to top + */ + public void onTop(); + } + + private void doOnBorderListener() { + if (contentView != null && contentView.getMeasuredHeight() <= getScrollY() + getHeight()) { + if (onBorderListener != null) { + onBorderListener.onBottom(); + } + } else if (getScrollY() == 0) { + if (onBorderListener != null) { + onBorderListener.onTop(); + } + } + } + + /** + * 滑动事件,这是控制手指滑动的惯性速度 + */ +// @Override +// public void fling(int velocityY) { +// super.fling(velocityY / 4); +// } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/TimePickerLayout.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/TimePickerLayout.java new file mode 100644 index 0000000000000000000000000000000000000000..403719b5e21ed61a41193c624556d628e8d5c6fb --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/TimePickerLayout.java @@ -0,0 +1,91 @@ +package com.jiuqi.elove.widget; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.widget.LinearLayout; + + +import com.jiuqi.elove.R; + +import java.util.ArrayList; + +/** + * 日期选择器 + * Created by dl on 2016/6/17. + */ +public class TimePickerLayout extends LinearLayout { + private WheelView mWheelYear; + private WheelView mWheelMonth; + private WheelView mWheelDay; + + public TimePickerLayout(Context context) { + this(context, null); + } + + public TimePickerLayout(Context context, AttributeSet attrs) { + super(context, attrs); + } + + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + LayoutInflater.from(getContext()).inflate(R.layout.layout_time_picker, this); + mWheelYear = (WheelView) findViewById(R.id.year); + mWheelMonth = (WheelView) findViewById(R.id.month); + mWheelDay = (WheelView) findViewById(R.id.day); + + mWheelYear.setData(getYearData()); + mWheelMonth.setData(getMonthData()); + mWheelDay.setData(getDayData()); + + } + + + private ArrayList getYearData() { + ArrayList list = new ArrayList<>(); + for (int i = 2015; i > 1990; i--) { + list.add(String.valueOf(i)); + } + return list; + } + + private ArrayList getMonthData() { + ArrayList list = new ArrayList<>(); + for (int i = 1; i <= 12; i++) { + list.add(String.valueOf(i)); + } + return list; + } + + private ArrayList getDayData() { + //ignore condition + ArrayList list = new ArrayList<>(); + for (int i = 1; i < 31; i++) { + list.add(String.valueOf(i)); + } + return list; + } + + public String getYear() { + if (mWheelDay == null) { + return null; + } + return mWheelYear.getSelectedText(); + } + + public String getMonth() { + if (mWheelMonth == null) { + return null; + } + return mWheelMonth.getSelectedText(); + } + + public String getDay() { + if (mWheelDay == null) { + return null; + } + return mWheelDay.getSelectedText(); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/WheelView.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/WheelView.java new file mode 100644 index 0000000000000000000000000000000000000000..c7051048ca86bf705e2d86b1d27abfb4466360a5 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/WheelView.java @@ -0,0 +1,1095 @@ +package com.jiuqi.elove.widget; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.LinearGradient; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.Shader.TileMode; +import android.os.Handler; +import android.os.HandlerThread; +import android.os.Looper; +import android.os.Message; +import android.text.TextPaint; +import android.text.TextUtils; +import android.util.AttributeSet; +import android.util.Log; +import android.view.MotionEvent; +import android.view.View; +import android.view.animation.DecelerateInterpolator; +import android.view.animation.Interpolator; + + +import com.jiuqi.elove.R; + +import java.util.ArrayList; + +/** + * 滚轮控件 + * 除时间外都用的这个 + */ +public class WheelView extends View { + private static final String TAG="WheelView"; + /** + * 刷新界面 + */ + private static final int REFRESH_VIEW = 0x001; + /** + * 持续滑动刷新界面 + */ + private static final int GO_ON_MOVE_REFRESH=10010; + /** + * 持续滑动刷新界面结束 + */ + private static final int GO_ON_MOVE_END=10011; + /** + * 打断持续滑动 + */ + private static final int GO_ON_MOVE_INTERRUPTED=10012; + /** + * 控件宽度 + */ + private float controlWidth;//px + /** + * 控件高度 + */ + private float controlHeight;//px + /** + * measure的高度,用于校正尺寸变化引起的文字错乱 + */ + private float lastMeasuredHeight; + /** + * 是否滑动中 + */ + private boolean isScrolling = false; + /** + * 选择的内容 + */ + private ArrayList itemList = new ArrayList<>(); + /** + * 设置数据 + */ + private ArrayList dataList = new ArrayList<>(); + /** + * 按下的坐标 + */ + private int downY; + /** + * 按下的时间 + */ + private long downTime = 0;//ms + /** + * 快速移动的时间 + */ +// private long goonTime = 200;//ms + /** + * 当前设备的density + */ + private float density=1; + /** + * 快速移动的距离 + */ + private static final int GOON_MIN_DISTANCE =50;//dp + private int goOnMinDistance;//px + /** + * 缓慢滚动的时候的速度 + */ + private static final int SLOW_MOVE_SPEED = 1; //dp + private int slowMoveSpeed=SLOW_MOVE_SPEED; + /** + * 判断为点击的移动距离 + */ + private static final int CLICK_DISTANCE = 3; //dp + private int clickDistance=CLICK_DISTANCE; + /** + * 画线画笔 + */ + private Paint linePaint; + /** + * 线的默认颜色 + */ + private int lineColor = 0xff000000; + /** + * 线的默认宽度 + */ + private float lineHeight = 2f;//px + /** + * 默认字体 + */ + private float normalFont = 14.0f;//px + /** + * 选中的时候字体 + */ + private float selectedFont = 22.0f;//px + /** + * 单元格高度 + */ + private float unitHeight = 50;//px + /** + * 显示多少个内容 + */ + private int itemNumber = 7; + /** + * 默认字体颜色 + */ + private int normalColor = 0xff000000; + /** + * 选中时候的字体颜色 + */ + private int selectedColor = 0xffff0000; + /** + * 选择监听 + */ + private OnSelectListener onSelectListener; + /** + * 是否可用 + */ + private boolean isEnable = true; + /** + * 快速滑动时,移动的基础个数 + */ + private static final int MOVE_NUMBER = 1; + /** + * 是否允许选空 + */ + private boolean noEmpty = true; + + /** + * 正在修改数据,避免ConcurrentModificationException异常 + */ + private boolean isClearing = false; + /** + * 连续滑动使用的插值器 + */ + Interpolator goonInterpolator =new DecelerateInterpolator(2); + /** + * 连续滑动的距离,为unitHeight的整数倍 + */ + int goOnLimit; + /** + * 连续滑动动画的绘制间隔 + */ + private static final int GO_ON_REFRESH_INTERVAL_MILLIS = 10; + /** + * 连续滑动动画的最大绘制次数 + */ + private static final int SHOWTIME=200; + /** + * 连续滑动动画的绘制计数 + */ + private int showTime=0; + /** + * 保存最近一次连续滑动的距离的原始值 + */ + private int goOnMove; + /** + * 当前连续滑动中已经滑动的距离 + */ + private int goOnDistance; + /** + * 是否正在连续滑动状态中 + */ + private boolean isGoOnMove=false; + /** + * 滑动动画的HandlerThread + */ + private HandlerThread moveHandlerThread; + /** + * 用于计算滑动动画位置的Handler,保证同一时刻只有一个滑动 + */ + private Handler moveHandler; + + public WheelView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + init(context, attrs); + initData(); + } + + public WheelView(Context context, AttributeSet attrs) { + super(context, attrs); + init(context, attrs); + initData(); + } + + public WheelView(Context context) { + super(context); + initData(); + } + + /** + * 初始化,获取设置的属性 + * + * @param context + * @param attrs + */ + private void init(Context context, AttributeSet attrs) { + + TypedArray attribute = context.obtainStyledAttributes(attrs, R.styleable.WheelView); + unitHeight = (int) attribute.getDimension(R.styleable.WheelView_unitHeight, unitHeight); + //按理说应该是奇数,但是此次不做判断,使用者有义务设置正确 + itemNumber = attribute.getInt(R.styleable.WheelView_itemNumber, itemNumber); + + normalFont = attribute.getDimension(R.styleable.WheelView_normalTextSize, normalFont); + selectedFont = attribute.getDimension(R.styleable.WheelView_selectedTextSize, selectedFont); + normalColor = attribute.getColor(R.styleable.WheelView_normalTextColor, normalColor); + selectedColor = attribute.getColor(R.styleable.WheelView_selectedTextColor, selectedColor); + + lineColor = attribute.getColor(R.styleable.WheelView_lineColor, lineColor); + lineHeight = attribute.getDimension(R.styleable.WheelView_lineHeight, lineHeight); + + noEmpty = attribute.getBoolean(R.styleable.WheelView_noEmpty, true); + isEnable = attribute.getBoolean(R.styleable.WheelView_isEnable, true); + + attribute.recycle(); + + density=context.getResources().getDisplayMetrics().density; + goOnMinDistance = (int) (density* GOON_MIN_DISTANCE); + slowMoveSpeed = (int) (density* SLOW_MOVE_SPEED); + clickDistance = (int) (density* CLICK_DISTANCE); + + controlHeight = itemNumber * unitHeight; + lastMeasuredHeight=controlHeight; + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + moveHandlerThread =new HandlerThread("goOnHandlerThread"); + moveHandlerThread.setPriority(Thread.MIN_PRIORITY); + moveHandlerThread.start(); + moveHandler =new GoOnHandler(moveHandlerThread.getLooper()); + } + + @Override + protected void onDetachedFromWindow() { + //销毁线程和handler + if (moveHandlerThread !=null&& moveHandlerThread.isAlive()){ + moveHandlerThread.quit(); + moveHandler =null; + } + super.onDetachedFromWindow(); + } + + private class GoOnHandler extends Handler { + GoOnHandler(Looper looper){ + super(looper); + } + + @Override + public void handleMessage(Message msg) { + switch (msg.what){ + case GO_ON_MOVE_REFRESH: + Log.d(TAG,"GO_ON_MOVE_REFRESH,showTime="+showTime); + if ((getSelected()==0&&goOnMove>0)||(getSelected()==dataList.size()-1&&goOnMove<0)||getSelected()==-1){ + //如果滑动到边缘选项,且超过,则加速滑动回来 + showTime+=8; + } + showTime++; + int lastDistance= goOnDistance; + goOnDistance = (int)(goonInterpolator.getInterpolation((float) showTime/(float)SHOWTIME)*goOnLimit); + actionThreadMove(goOnMove > 0 ? goOnDistance : goOnDistance * (-1)); + if (showTime=slowMoveSpeed)){ + // Math.abs(lastDistance-goOnDistance)>SLOW_MOVE_SPEED是为了让滚动更加连贯,showTime 0 ?goOnDistance:goOnDistance*(-1)); + for (ItemObject item : itemList) { + item.newY(goOnMove > 0 ?goOnDistance:goOnDistance*(-1)); + } + isScrolling = false; + isGoOnMove=false; + break; + } + } + } + + + + /** + * 继续快速移动一段距离,连续滚动动画,滚动速度递减,速度减到SLOW_MOVE_SPEED之下后调用slowMove + * @param time 滑动的时间间隔 + * @param move 滑动的距离 + */ + private synchronized void goonMove(long time, final long move) { + showTime=0; + if (time<=0){ + time=1; + } + int n=2; + //当时间特别短的时候<50ms,move也不会长,但是用户这时候可能希望滑动的更快一些,此时提高倍数来达到此目的 + if (time<50 && Math.abs(move)0){ + goOnLimit+=newGoonMove; + }else { + goOnLimit=newGoonMove; + } + goOnMove= (int) move; + isGoOnMove=true; + //将MotionEvent.ACTION_MOVE引起的滑动的距离设置为新的起点,然后再开始新的滑动 + //防止重复滑动同一次Action_Down中滑动的部分 + for (ItemObject item : itemList) { + item.newY((int) (unitHeight* Math.floor(item.move/unitHeight))); + } + moveHandler.sendEmptyMessage(GO_ON_MOVE_REFRESH); + Log.d(TAG,"goonMove : newGoonMove="+newGoonMove); + Log.d(TAG,"goonMove : goOnLimit="+goOnLimit); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + if (!isEnable) + return true; + int y = (int) event.getY(); + int move = Math.abs(y - downY); + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + //防止被其他可滑动View抢占焦点,比如嵌套到ListView中使用时 + getParent().requestDisallowInterceptTouchEvent(true); + if (isScrolling){ + isGoOnMove=false; + if (moveHandler !=null) { + //清除当前快速滑动的动画,进入下一次滑动动作 + moveHandler.removeMessages(GO_ON_MOVE_REFRESH); + moveHandler.sendEmptyMessage(GO_ON_MOVE_INTERRUPTED); + } + } + isScrolling = true; + downY = (int) event.getY(); + downTime = System.currentTimeMillis(); + break; + case MotionEvent.ACTION_MOVE: + isGoOnMove=false; + isScrolling = true; + actionMove(y - downY); + onSelectListener(); + break; + case MotionEvent.ACTION_UP: + long time= System.currentTimeMillis()-downTime; + // 判断这段时间移动的距离 + Log.d(TAG,"time="+time+",move="+move+",y - downY="+(y - downY)); +// if (time < goonTime && move > goOnMinDistance) { + if ((double)move/(double)time>0.25) {//用比值来判断更精准,有些超快超短的滑动也能识别 + goonMove(time,y - downY); + } else { + //如果移动距离较小,则认为是点击事件,否则认为是小距离滑动 + if (move0){ + //如果不先move再up,而是直接up,则无法产生点击时的滑动效果 + //通过调整move和up的距离,可以调整点击的效果 + actionMove((int) (unitHeight/2)); + slowMove((int) unitHeight/4); + }else if (downY>controlHeight-unitHeight*(itemNumber/2)&&downY0.1){ + int index=getSelected(); + initData(); + if(index!=-1) { + setDefault(index); + }else { + setDefault(defaultIndex); + } + lastMeasuredHeight=controlHeight; + } +// controlWidth = getWidth(); +// if (controlWidth != 0) { +// setMeasuredDimension(getWidth(), (int) controlHeight); +// } + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + //因为在recycler中添加的时候会导致文字不居中 + controlWidth = getWidth(); + drawLine(canvas); + drawList(canvas); + drawMask(canvas); + } + + /** + * 绘制分隔线条 + * + * @param canvas + */ + private void drawLine(Canvas canvas) { + + if (linePaint == null) { + linePaint = new Paint(); + linePaint.setColor(lineColor); + linePaint.setAntiAlias(true); + linePaint.setStrokeWidth(lineHeight); + } + + canvas.drawLine(0, controlHeight / 2 - unitHeight / 2 + lineHeight, + controlWidth, controlHeight / 2 - unitHeight / 2 + lineHeight, linePaint); + canvas.drawLine(0, controlHeight / 2 + unitHeight / 2 - lineHeight, + controlWidth, controlHeight / 2 + unitHeight / 2 - lineHeight, linePaint); + } + /** + * 绘制待选项目 + * + * @param canvas + */ + private synchronized void drawList(Canvas canvas) { + if (isClearing) + return; + try { + for (ItemObject itemObject : itemList) { + itemObject.drawSelf(canvas, getMeasuredWidth()); + } + } catch (Exception e) { + } + } + + /** + * 绘制上下的遮盖板 + * + * @param canvas + */ + private void drawMask(Canvas canvas) { + LinearGradient lg = new LinearGradient(0, 0, 0, unitHeight, 0xD8ffffff, + 0xc0ffffff, TileMode.MIRROR); + Paint paint = new Paint(); + paint.setShader(lg); + canvas.drawRect(0, 0, controlWidth, itemNumber/2*unitHeight, paint); + + LinearGradient lg2 = new LinearGradient(0, controlHeight - unitHeight, + 0, controlHeight, 0xc0ffffff, 0xD8ffffff, TileMode.MIRROR); + Paint paint2 = new Paint(); + paint2.setShader(lg2); + canvas.drawRect(0, controlHeight - itemNumber/2*unitHeight, controlWidth, + controlHeight, paint2); + } + + + + /** + * 不能为空,必须有选项,滑动动画结束时调用 + * 判断当前应该被选中的项目,如果其不在屏幕中间,则将其移动到屏幕中间 + * @param moveSymbol 移动的距离,实际上只需要其符号,用于判断当前滑动方向 + */ + private void noEmpty(int moveSymbol) { + if (!noEmpty) + return; + // 将当前选择项目移动到正中间,防止出现偏差 + + Log.d(TAG,"noEmpty start"); + for (ItemObject item : itemList) { + if (item.selected()){ + int move = (int) item.moveToSelected(); + defaultMove(move); + if (onSelectListener != null) + onSelectListener.endSelect(item.id, item.getItemText()); + Log.d(TAG,"noEmpty selected="+item.id); + return; + } + } + // 如果当前没有项目选中,则将根据滑动的方向,将最近的一项设为选中项目,并移动到正中间 + if (moveSymbol > 0) { + for (int i = 0; i < itemList.size(); i++) { + if (itemList.get(i).couldSelected()) { + int move = (int) itemList.get(i).moveToSelected(); + defaultMove(move); + if (onSelectListener != null) { + onSelectListener.endSelect(itemList.get(i).id, itemList.get(i).getItemText()); + } + Log.d(TAG,"noEmpty couldSelected="+itemList.get(i).id); + return; + } + } + } else { + for (int i = itemList.size() - 1; i >= 0; i--) { + if (itemList.get(i).couldSelected()) { + int move = (int) itemList.get(i).moveToSelected(); + defaultMove(move); + if (onSelectListener != null) { + onSelectListener.endSelect(itemList.get(i).id, itemList.get(i).getItemText()); + } + Log.d(TAG,"noEmpty couldSelected="+itemList.get(i).id); + return; + } + } + } + //如果没有项目可被选中,则说明所有项目都在视图外,选择第一个或者最后一个为当前选中项 + int move = (int) itemList.get(0).moveToSelected(); + if (move < 0) { + Log.d(TAG,"noEmpty moveToSelected="+0); +// defaultMove(move); + slowMove((int) (move+unitHeight*2/3)); + } else { + Log.d(TAG,"noEmpty moveToSelected="+(itemList.size() - 1)); +// defaultMove((int) (itemList.get(itemList.size() - 1).moveToSelected())); + slowMove((int) (itemList.get(itemList.size() - 1).moveToSelected()-unitHeight*2/3)); + } + for (ItemObject item : itemList) { + if (item.selected()) { + if (onSelectListener != null) + onSelectListener.endSelect(item.id, item.getItemText()); + break; + } + } + } + + + /** + * 处理MotionEvent.ACTION_MOVE中的移动 + * + * @param move 移动的距离 + */ + private void actionMove(int move) { + for (ItemObject item : itemList) { + item.move(move); + } + invalidate(); + } + + /** + * 移动,线程中调用 + * + * @param move 移动的距离 + */ + private void actionThreadMove(int move) { + for (ItemObject item : itemList) { + item.move(move); + } +// handler.sendEmptyMessage(REFRESH_VIEW); + + postInvalidate(); + } + + /** + * 缓慢移动一段距离,移动速度为SLOW_MOVE_SPEED, + * 注意这个距离不是move参数,而是先将选项坐标移动move的距离以后,再判断当前应该选中的项目,然后将改项目移动到中间 + * 移动完成后调用noEmpty + * @param move 立即设置的新坐标移动距离,不是缓慢移动的距离 + */ + private synchronized void slowMove(final int move) { + + if (moveHandler ==null) { + return; + } +// Log.d(TAG,"slowMove start"); + moveHandler.post(new Runnable() { + @Override + public void run() { + Log.d(TAG,"slowMove run start"); + int newMove = 0; + //根据当前滑动方向,选择选中项来移到中心显示 + int selected=getSelected(); + if (selected!=-1){ + newMove= (int) itemList.get(selected).moveToSelected(); + }else { + if (move > 0) { + for (int i = 0; i < itemList.size(); i++) { + if (itemList.get(i).couldSelected()) { + newMove = (int) itemList.get(i).moveToSelected(); + break; + } + } + } else { + for (int i = itemList.size() - 1; i >= 0; i--) { + if (itemList.get(i).couldSelected()) { + newMove = (int) itemList.get(i).moveToSelected(); + break; + } + } + } + } + for (ItemObject item : itemList) { + item.newY(move + 0); + } + + // 判断正负 + int m = newMove > 0 ? newMove : newMove * (-1); + int symbol = newMove > 0 ? 1 : (-1); + // 移动速度 + int speed = slowMoveSpeed; + while (true && m!=0 ) { + m = m - speed; + if (m < 0) { + for (ItemObject item : itemList) { + item.newY(m * symbol); + } +// handler.sendEmptyMessage(REFRESH_VIEW); + postInvalidate(); + try { + Thread.sleep(10); + } catch (InterruptedException e) { + e.printStackTrace(); + } + break; + } + for (ItemObject item : itemList) { + item.newY(speed * symbol); + } +// handler.sendEmptyMessage(REFRESH_VIEW); + postInvalidate(); + try { + Thread.sleep(10); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + Log.d(TAG,"slowMove run end"); + noEmpty(move); + } + }); + Log.d(TAG,"slowMove end move="+move); + } + + /** + * 移动到默认位置 + * + * @param move 移动的距离 + */ + private void defaultMove(int move) { + for (ItemObject item : itemList) { + item.newY(move); + } +// handler.sendEmptyMessage(REFRESH_VIEW); + postInvalidate(); + } + + /** + * 滑动监听 + */ + private void onSelectListener() { + if (onSelectListener == null) + return; + for (ItemObject item : itemList) { + if (item.couldSelected()) { + onSelectListener.selecting(item.id, item.getItemText()); + } + } + } + + /** + * 设置数据 (第一次) + * + * @param data 数据集 + */ + public void setData(ArrayList data) { + this.dataList = data; + initData(); + } + + /** + * 重置数据 + * + * @param data 数据集 + */ + public void refreshData(ArrayList data) { + setData(data); + invalidate(); + } + + /** + * 获取返回项 id + * + * @return + */ + public int getSelected() { + for (ItemObject item : itemList) { + if (item.selected()) + return item.id; + } + return -1; + } + + /** + * 获取返回的内容 + * + * @return + */ + public String getSelectedText() { + for (ItemObject item : itemList) { + if (item.selected()) + return item.getItemText(); + } + return ""; + } + + /** + * 是否正在滑动 + * + * @return + */ + public boolean isScrolling() { + return isScrolling; + } + + /** + * 是否可用 + * + * @return + */ + public boolean isEnable() { + return isEnable; + } + + /** + * 设置是否可用 + * + * @param isEnable + */ + public void setEnable(boolean isEnable) { + this.isEnable = isEnable; + } + + /** + * 设置默认选项 + * + * @param index + */ + public void setDefault(int index) { + defaultIndex=index; + if (index > itemList.size() - 1) + return; + float move = itemList.get(index).moveToSelected(); + defaultMove((int) move); + } + private int defaultIndex;//用于恢复 + + /** + * 获取列表大小 + * + * @return + */ + public int getListSize() { + if (itemList == null) + return 0; + return itemList.size(); + } + + /** + * 获取某项的内容 + * + * @param index + * @return + */ + public String getItemText(int index) { + if (itemList == null) + return ""; + return itemList.get(index).getItemText(); + } + + /** + * 对WheelView设置监听,在滑动过程或者滑动停止返回数据信息。 + * @param onSelectListener + */ + public void setOnSelectListener(OnSelectListener onSelectListener) { + this.onSelectListener = onSelectListener; + } + +// @SuppressLint("HandlerLeak") +// private Handler handler = new Handler() { +// @Override +// public void handleMessage(Message msg) { +// super.handleMessage(msg); +// switch (msg.what) { +// case REFRESH_VIEW: +// invalidate(); +// break; +// default: +// break; +// } +// } +// +// }; + + /** + * 获取当前展示的项目数量 + * @return + */ + public int getItemNumber() { + return itemNumber; + } + + /** + * 设置展示的项目数量 + * @param itemNumber + */ + public void setItemNumber(int itemNumber) { + this.itemNumber = itemNumber; + controlHeight = itemNumber * unitHeight; + requestLayout(); + } + + private class ItemObject { + /** + * id + */ + int id = 0; + /** + * 内容 + */ + private String itemText = ""; + /** + * x坐标 + */ + int x = 0; + /** + * y坐标,代表静止时的位置 + */ + int y = 0; + /** + * 移动距离,代表滑动的位置,滑动结束后应该置0 + */ + int move = 0; + /** + * 字体画笔 + */ + private TextPaint textPaint; + /** + * 字体范围矩形 + */ + private Rect textRect; + + private boolean shouldRefreshTextPaint=true; + + /** + * 绘制自身 + * + * @param canvas 画板 + * @param containerWidth 容器宽度 + */ + public void drawSelf(Canvas canvas, int containerWidth) { + + + // 判断是否可视 + // 通过将判断移到绘制的函数开始的位置,同时放宽判断的条件,可以减少计算量,提高性能 + if (!isInView()) { + return; + } + + // 返回包围整个字符串的最小的一个Rect区域 + if (textPaint==null) { + textPaint = new TextPaint(); + textPaint.setAntiAlias(true); + } + if (textRect == null) { + textRect = new Rect(); + } + + // 判断是否可被选择 + if (couldSelected()) { + textPaint.setColor(selectedColor); + // 获取距离标准位置的距离 + float moveToSelect = moveToSelected(); + moveToSelect = moveToSelect > 0 ? moveToSelect : moveToSelect * (-1); + // 计算当前字体大小 + float textSize = normalFont + + ((selectedFont - normalFont) * (1.0f - moveToSelect / (float) unitHeight)); + textPaint.setTextSize(textSize); + } else { + textPaint.setColor(normalColor); + textPaint.setTextSize(normalFont); + } + + if (unitHeight< Math.max(selectedFont,normalFont)){ + //如果高度太小了,则调整字体大小,以匹配高度 + float textSize=unitHeight-lineHeight*2; + textPaint.setTextSize(textSize); + } + + if (shouldRefreshTextPaint) { + //有可能导致文字消失,itemText变成空字符串, + // 是因为文字设置过大,而containweWidth太小, + // 本来会将无法显示的文字用"..."表示,但是连"..."本身也无法显示的时候,就会变成空字符串 + itemText = (String) TextUtils.ellipsize(itemText, textPaint, containerWidth, TextUtils.TruncateAt.END); + textPaint.getTextBounds(itemText, 0, itemText.length(), textRect); + if (selectedFont==normalFont) { + shouldRefreshTextPaint = false; + } + } + +// // 判断是否可视 +// if (!isInView()) { +// return; +// } + + // 绘制内容 + canvas.drawText(itemText, ((float)x + (float)controlWidth / 2f - (float)textRect.width() / 2f), + ((float)(y + move) + unitHeight / 2 + (float)textRect.height() / 2f), textPaint); + + } + + /** + * 是否在可视界面内 + * + * @return + */ + public synchronized boolean isInView() { + +// if (y + move > controlHeight || ((float)y + (float)move + (float)unitHeight / 2 + (float)textRect.height() / 2f) < 0) + if (y + move > controlHeight || ((float)y + (float)move + (float)unitHeight ) < 0)//放宽判断的条件,否则就不能再onDraw的开头执行,而要到textRect测量完成才能执行 + return false; + return true; + } + + /** + * 移动一段距离 + * + * @param _move 移动的距离 + */ + public synchronized void move(int _move) { + this.move = _move; + } + + /** + * 设置新的坐标 + * + * @param _move 移动的距离,叠加到当前坐标上 + */ + public synchronized void newY(int _move) { + this.move = 0; + this.y = y + _move; + } + + /** + * 判断是否在可以选择区域内,用于在没有刚好被选中项的时候判断备选项 + * 考虑到文字的baseLine是其底部,而y+m的高度是文字的顶部的高度 + * 因此判断为可选区域的标准是需要减去文字的部分的 + * 也就是y+m在正中间和正中间上面一格的范围内,则判断为可选 + * + * @return + */ + public synchronized boolean couldSelected() { + boolean isSelect=true; + if (y+move<=itemNumber/2*unitHeight-unitHeight||y+move>=itemNumber/2*unitHeight+unitHeight){ + isSelect=false; + } + return isSelect; + } + + /** + * 判断是否刚好在正中间的选择区域内 + * + * @return + */ + public synchronized boolean selected() { + boolean isSelect=false; + if (textRect==null){ + return false; + } + if ((y+move>=itemNumber/2*unitHeight-unitHeight/2+(float) textRect.height()/2)&& + (y+move<=itemNumber/2*unitHeight+unitHeight/2-(float)textRect.height()/2)) + isSelect=true; + return isSelect; + } + + public String getItemText() { + return itemText; + } + + public void setItemText(String itemText) { + shouldRefreshTextPaint=true; + this.itemText = itemText; + } + + /** + * 获取移动到选中位置需要的距离 + */ + public synchronized float moveToSelected() { + return (controlHeight / 2 - unitHeight / 2) - (y + move); + } + } + + public interface OnSelectListener { + /** + * 结束选择,滑动停止时回调 + * + * @param id + * @param text + */ + void endSelect(int id, String text); + + /** + * 选中的内容,滑动的过程中会不断回调 + * + * @param id + * @param text + */ + void selecting(int id, String text); + + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/WordWrapView.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/WordWrapView.java new file mode 100644 index 0000000000000000000000000000000000000000..eb5bf7dcdad665c2d1492be8d7c3ed5b818a0fad --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/WordWrapView.java @@ -0,0 +1,94 @@ +package com.jiuqi.elove.widget; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; + +/** + * 流式布局(标签和兴趣爱好) + * Created by FanWenXia on 2016/7/29. + */ +public class WordWrapView extends ViewGroup { + private static final int PADDING_HOR = 10;//水平方向padding + private static final int PADDING_VERTICAL = 5;//垂直方向padding + private static final int SIDE_MARGIN = 10;//左右间距 + private static final int TEXT_MARGIN = 10; + /** + * @param context + */ + public WordWrapView(Context context) { + super(context); + } + + /** + * @param context + * @param attrs + * @param defStyle + */ + public WordWrapView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + + + /** + * @param context + * @param attrs + */ + public WordWrapView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + int childCount = getChildCount(); + int autualWidth = r - l; + int x = SIDE_MARGIN;// 横坐标开始 + int y = 0;//纵坐标开始 + int rows = 1; + for(int i=0;iautualWidth){ + x = width+SIDE_MARGIN; + rows++; + } + y = rows*(height+TEXT_MARGIN); + if(i==0){ + view.layout(x-width-TEXT_MARGIN, y-height, x-TEXT_MARGIN, y); + }else{ + view.layout(x-width, y-height, x, y); + } + } + }; + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int x = 0;//横坐标 + int y = 0;//纵坐标 + int rows = 1;//总行数 + int specWidth = MeasureSpec.getSize(widthMeasureSpec); + int actualWidth = specWidth - SIDE_MARGIN * 2;//实际宽度 + int childCount = getChildCount(); + for(int index = 0;indexactualWidth){//换行 + x = width+SIDE_MARGIN; + rows++; + } + y = rows*(height+TEXT_MARGIN); + } + setMeasuredDimension(actualWidth, y); + } + +} \ No newline at end of file diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/autotextview/AutofitHelper.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/autotextview/AutofitHelper.java new file mode 100644 index 0000000000000000000000000000000000000000..5e890f54c00aa25f68270cdd46e4443ce7fb6fee --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/autotextview/AutofitHelper.java @@ -0,0 +1,554 @@ +package com.jiuqi.elove.widget.autotextview; + +import android.content.Context; +import android.content.res.Resources; +import android.text.Editable; +import android.text.TextWatcher; +import android.util.TypedValue; +import android.view.View; +import android.annotation.SuppressLint; +import android.annotation.TargetApi; +import android.content.res.TypedArray; +import android.os.Build; +import android.text.Layout; +import android.text.StaticLayout; +import android.text.TextPaint; +import android.text.method.SingleLineTransformationMethod; +import android.text.method.TransformationMethod; +import android.util.AttributeSet; +import android.util.DisplayMetrics; +import android.util.Log; + +import android.widget.TextView; + +import com.jiuqi.elove.R; + +import java.util.ArrayList; + +/** + * A helper class to enable automatically resizing {@link TextView}`s {@code textSize} to fit + * within its bounds. + * + * @attr ref R.styleable.AutofitTextView_sizeToFit + * @attr ref R.styleable.AutofitTextView_minTextSize + * @attr ref R.styleable.AutofitTextView_precision + */ +@TargetApi(Build.VERSION_CODES.HONEYCOMB) +public class AutofitHelper { + + private static final String TAG = "AutoFitTextHelper"; + private static final boolean SPEW = false; + + // Minimum size of the text in pixels + private static final int DEFAULT_MIN_TEXT_SIZE = 8; //sp + // How precise we want to be when reaching the target textWidth size + private static final float DEFAULT_PRECISION = 0.5f; + + /** + * Creates a new instance of {@code AutofitHelper} that wraps a {@link TextView} and enables + * automatically sizing the text to fit. + */ + public static AutofitHelper create(TextView view) { + return create(view, null, 0); + } + + /** + * Creates a new instance of {@code AutofitHelper} that wraps a {@link TextView} and enables + * automatically sizing the text to fit. + */ + public static AutofitHelper create(TextView view, AttributeSet attrs) { + return create(view, attrs, 0); + } + + /** + * Creates a new instance of {@code AutofitHelper} that wraps a {@link TextView} and enables + * automatically sizing the text to fit. + */ + public static AutofitHelper create(TextView view, AttributeSet attrs, int defStyle) { + AutofitHelper helper = new AutofitHelper(view); + boolean sizeToFit = true; + if (attrs != null) { + Context context = view.getContext(); + int minTextSize = (int) helper.getMinTextSize(); + float precision = helper.getPrecision(); + + TypedArray ta = context.obtainStyledAttributes( + attrs, + R.styleable.AutofitTextView, + defStyle, + 0); + sizeToFit = ta.getBoolean(R.styleable.AutofitTextView_sizeToFit, sizeToFit); + minTextSize = ta.getDimensionPixelSize(R.styleable.AutofitTextView_minTextSize, + minTextSize); + precision = ta.getFloat(R.styleable.AutofitTextView_precision, precision); + ta.recycle(); + + helper.setMinTextSize(TypedValue.COMPLEX_UNIT_PX, minTextSize) + .setPrecision(precision); + } + helper.setEnabled(sizeToFit); + + return helper; + } + + /** + * Re-sizes the textSize of the TextView so that the text fits within the bounds of the View. + */ + private static void autofit(TextView view, TextPaint paint, float minTextSize, float maxTextSize, + int maxLines, float precision) { + if (maxLines <= 0 || maxLines == Integer.MAX_VALUE) { + // Don't auto-size since there's no limit on lines. + return; + } + + int targetWidth = view.getWidth() - view.getPaddingLeft() - view.getPaddingRight(); + if (targetWidth <= 0) { + return; + } + + CharSequence text = view.getText(); + TransformationMethod method = view.getTransformationMethod(); + if (method != null) { + text = method.getTransformation(text, view); + } + + Context context = view.getContext(); + Resources r = Resources.getSystem(); + DisplayMetrics displayMetrics; + + float size = maxTextSize; + float high = size; + float low = 0; + + if (context != null) { + r = context.getResources(); + } + displayMetrics = r.getDisplayMetrics(); + + paint.set(view.getPaint()); + paint.setTextSize(size); + + if ((maxLines == 1 && paint.measureText(text, 0, text.length()) > targetWidth) + || getLineCount(text, paint, size, targetWidth, displayMetrics) > maxLines) { + size = getAutofitTextSize(text, paint, targetWidth, maxLines, low, high, precision, + displayMetrics); + } + + if (size < minTextSize) { + size = minTextSize; + } + + view.setTextSize(TypedValue.COMPLEX_UNIT_PX, size); + } + + /** + * Recursive binary search to find the best size for the text. + */ + private static float getAutofitTextSize(CharSequence text, TextPaint paint, + float targetWidth, int maxLines, float low, float high, float precision, + DisplayMetrics displayMetrics) { + float mid = (low + high) / 2.0f; + int lineCount = 1; + StaticLayout layout = null; + + paint.setTextSize(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, mid, + displayMetrics)); + + if (maxLines != 1) { + layout = new StaticLayout(text, paint, (int) targetWidth, Layout.Alignment.ALIGN_NORMAL, + 1.0f, 0.0f, true); + lineCount = layout.getLineCount(); + } + + if (SPEW) Log.d(TAG, "low=" + low + " high=" + high + " mid=" + mid + + " target=" + targetWidth + " maxLines=" + maxLines + " lineCount=" + lineCount); + + if (lineCount > maxLines) { + // For the case that `text` has more newline characters than `maxLines`. + if ((high - low) < precision) { + return low; + } + return getAutofitTextSize(text, paint, targetWidth, maxLines, low, mid, precision, + displayMetrics); + } else if (lineCount < maxLines) { + return getAutofitTextSize(text, paint, targetWidth, maxLines, mid, high, precision, + displayMetrics); + } else { + float maxLineWidth = 0; + if (maxLines == 1) { + maxLineWidth = paint.measureText(text, 0, text.length()); + } else { + for (int i = 0; i < lineCount; i++) { + if (layout.getLineWidth(i) > maxLineWidth) { + maxLineWidth = layout.getLineWidth(i); + } + } + } + + if ((high - low) < precision) { + return low; + } else if (maxLineWidth > targetWidth) { + return getAutofitTextSize(text, paint, targetWidth, maxLines, low, mid, precision, + displayMetrics); + } else if (maxLineWidth < targetWidth) { + return getAutofitTextSize(text, paint, targetWidth, maxLines, mid, high, precision, + displayMetrics); + } else { + return mid; + } + } + } + + private static int getLineCount(CharSequence text, TextPaint paint, float size, float width, + DisplayMetrics displayMetrics) { + paint.setTextSize(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, size, + displayMetrics)); + StaticLayout layout = new StaticLayout(text, paint, (int) width, + Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, true); + return layout.getLineCount(); + } + + private static int getMaxLines(TextView view) { + int maxLines = -1; // No limit (Integer.MAX_VALUE also means no limit) + + TransformationMethod method = view.getTransformationMethod(); + if (method != null && method instanceof SingleLineTransformationMethod) { + maxLines = 1; + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + // setMaxLines() and getMaxLines() are only available on android-16+ + maxLines = view.getMaxLines(); + } + + return maxLines; + } + + // Attributes + private TextView mTextView; + private TextPaint mPaint; + /** + * Original textSize of the TextView. + */ + private float mTextSize; + + private int mMaxLines; + private float mMinTextSize; + private float mMaxTextSize; + private float mPrecision; + + private boolean mEnabled; + private boolean mIsAutofitting; + + private ArrayList mListeners; + + private TextWatcher mTextWatcher = new AutofitTextWatcher(); + + private View.OnLayoutChangeListener mOnLayoutChangeListener = + new AutofitOnLayoutChangeListener(); + + private AutofitHelper(TextView view) { + final Context context = view.getContext(); + float scaledDensity = context.getResources().getDisplayMetrics().scaledDensity; + + mTextView = view; + mPaint = new TextPaint(); + setRawTextSize(view.getTextSize()); + + mMaxLines = getMaxLines(view); + mMinTextSize = scaledDensity * DEFAULT_MIN_TEXT_SIZE; + mMaxTextSize = mTextSize; + mPrecision = DEFAULT_PRECISION; + } + + /** + * Adds an {@link OnTextSizeChangeListener} to the list of those whose methods are called + * whenever the {@link TextView}'s {@code textSize} changes. + */ + public AutofitHelper addOnTextSizeChangeListener(OnTextSizeChangeListener listener) { + if (mListeners == null) { + mListeners = new ArrayList(); + } + mListeners.add(listener); + return this; + } + + /** + * Removes the specified {@link OnTextSizeChangeListener} from the list of those whose methods + * are called whenever the {@link TextView}'s {@code textSize} changes. + */ + public AutofitHelper removeOnTextSizeChangeListener(OnTextSizeChangeListener listener) { + if (mListeners != null) { + mListeners.remove(listener); + } + return this; + } + + /** + * Returns the amount of precision used to calculate the correct text size to fit within its + * bounds. + */ + public float getPrecision() { + return mPrecision; + } + + /** + * Set the amount of precision used to calculate the correct text size to fit within its + * bounds. Lower precision is more precise and takes more time. + * + * @param precision The amount of precision. + */ + public AutofitHelper setPrecision(float precision) { + if (mPrecision != precision) { + mPrecision = precision; + + autofit(); + } + return this; + } + + /** + * Returns the minimum size (in pixels) of the text. + */ + public float getMinTextSize() { + return mMinTextSize; + } + + /** + * Set the minimum text size to the given value, interpreted as "scaled pixel" units. This size + * is adjusted based on the current density and user font size preference. + * + * @param size The scaled pixel size. + * @attr ref me.grantland.R.styleable#AutofitTextView_minTextSize + */ + public AutofitHelper setMinTextSize(float size) { + return setMinTextSize(TypedValue.COMPLEX_UNIT_SP, size); + } + + /** + * Set the minimum text size to a given unit and value. See TypedValue for the possible + * dimension units. + * + * @param unit The desired dimension unit. + * @param size The desired size in the given units. + * @attr ref me.grantland.R.styleable#AutofitTextView_minTextSize + */ + public AutofitHelper setMinTextSize(int unit, float size) { + Context context = mTextView.getContext(); + Resources r = Resources.getSystem(); + + if (context != null) { + r = context.getResources(); + } + + setRawMinTextSize(TypedValue.applyDimension(unit, size, r.getDisplayMetrics())); + return this; + } + + private void setRawMinTextSize(float size) { + if (size != mMinTextSize) { + mMinTextSize = size; + + autofit(); + } + } + + /** + * Returns the maximum size (in pixels) of the text. + */ + public float getMaxTextSize() { + return mMaxTextSize; + } + + /** + * Set the maximum text size to the given value, interpreted as "scaled pixel" units. This size + * is adjusted based on the current density and user font size preference. + * + * @param size The scaled pixel size. + * @attr ref android.R.styleable#TextView_textSize + */ + public AutofitHelper setMaxTextSize(float size) { + return setMaxTextSize(TypedValue.COMPLEX_UNIT_SP, size); + } + + /** + * Set the maximum text size to a given unit and value. See TypedValue for the possible + * dimension units. + * + * @param unit The desired dimension unit. + * @param size The desired size in the given units. + * @attr ref android.R.styleable#TextView_textSize + */ + public AutofitHelper setMaxTextSize(int unit, float size) { + Context context = mTextView.getContext(); + Resources r = Resources.getSystem(); + + if (context != null) { + r = context.getResources(); + } + + setRawMaxTextSize(TypedValue.applyDimension(unit, size, r.getDisplayMetrics())); + return this; + } + + private void setRawMaxTextSize(float size) { + if (size != mMaxTextSize) { + mMaxTextSize = size; + + autofit(); + } + } + + /** + * @see + */ + public int getMaxLines() { + return mMaxLines; + } + + /** + * @see + */ + public AutofitHelper setMaxLines(int lines) { + if (mMaxLines != lines) { + mMaxLines = lines; + + autofit(); + } + return this; + } + + /** + * Returns whether or not automatically resizing text is enabled. + */ + public boolean isEnabled() { + return mEnabled; + } + + /** + * Set the enabled state of automatically resizing text. + */ + @SuppressLint("NewApi") + public AutofitHelper setEnabled(boolean enabled) { + if (mEnabled != enabled) { + mEnabled = enabled; + + if (enabled) { + mTextView.addTextChangedListener(mTextWatcher); + mTextView.addOnLayoutChangeListener(mOnLayoutChangeListener); + + autofit(); + } else { + mTextView.removeTextChangedListener(mTextWatcher); + mTextView.removeOnLayoutChangeListener(mOnLayoutChangeListener); + + mTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, mTextSize); + } + } + return this; + } + + /** + * Returns the original text size of the View. + * + * @see TextView#getTextSize() + */ + public float getTextSize() { + return mTextSize; + } + + /** + * Set the original text size of the View. + * + * @see TextView#setTextSize(float) + */ + public void setTextSize(float size) { + setTextSize(TypedValue.COMPLEX_UNIT_SP, size); + } + + /** + * Set the original text size of the View. + * + * @see TextView#setTextSize(int, float) + */ + public void setTextSize(int unit, float size) { + if (mIsAutofitting) { + // We don't want to update the TextView's actual textSize while we're autofitting + // since it'd get set to the autofitTextSize + return; + } + Context context = mTextView.getContext(); + Resources r = Resources.getSystem(); + + if (context != null) { + r = context.getResources(); + } + + setRawTextSize(TypedValue.applyDimension(unit, size, r.getDisplayMetrics())); + } + + private void setRawTextSize(float size) { + if (mTextSize != size) { + mTextSize = size; + } + } + + private void autofit() { + float oldTextSize = mTextView.getTextSize(); + float textSize; + + mIsAutofitting = true; + autofit(mTextView, mPaint, mMinTextSize, mMaxTextSize, mMaxLines, mPrecision); + mIsAutofitting = false; + + textSize = mTextView.getTextSize(); + if (textSize != oldTextSize) { + sendTextSizeChange(textSize, oldTextSize); + } + } + + private void sendTextSizeChange(float textSize, float oldTextSize) { + if (mListeners == null) { + return; + } + + for (OnTextSizeChangeListener listener : mListeners) { + listener.onTextSizeChange(textSize, oldTextSize); + } + } + + private class AutofitTextWatcher implements TextWatcher { + @Override + public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) { + // do nothing + } + + @Override + public void onTextChanged(CharSequence charSequence, int start, int before, int count) { + autofit(); + } + + @Override + public void afterTextChanged(Editable editable) { + // do nothing + } + } + + private class AutofitOnLayoutChangeListener implements View.OnLayoutChangeListener { + @Override + public void onLayoutChange(View view, int left, int top, int right, int bottom, + int oldLeft, int oldTop, int oldRight, int oldBottom) { + autofit(); + } + } + + /** + * When an object of a type is attached to an {@code AutofitHelper}, its methods will be called + * when the {@code textSize} is changed. + */ + public interface OnTextSizeChangeListener { + /** + * This method is called to notify you that the size of the text has changed to + * {@code textSize} from {@code oldTextSize}. + */ + public void onTextSizeChange(float textSize, float oldTextSize); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/autotextview/AutofitTextView.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/autotextview/AutofitTextView.java new file mode 100644 index 0000000000000000000000000000000000000000..5b48bab5e5d46e25cd4634eea008956d680fac9e --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/autotextview/AutofitTextView.java @@ -0,0 +1,192 @@ +package com.jiuqi.elove.widget.autotextview; + +import android.content.Context; +import android.util.AttributeSet; +import android.util.TypedValue; +import android.widget.TextView; + +/** + * A {@link TextView} that re-sizes its text to be no larger than the width of the view. + * + * @attr ref R.styleable.AutofitTextView_sizeToFit + * @attr ref R.styleable.AutofitTextView_minTextSize + * @attr ref R.styleable.AutofitTextView_precision + */ +public class AutofitTextView extends TextView implements AutofitHelper.OnTextSizeChangeListener { + + private AutofitHelper mHelper; + + public AutofitTextView(Context context) { + super(context); + init(context, null, 0); + } + + public AutofitTextView(Context context, AttributeSet attrs) { + super(context, attrs); + init(context, attrs, 0); + } + + public AutofitTextView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + init(context, attrs, defStyle); + } + + private void init(Context context, AttributeSet attrs, int defStyle) { + mHelper = AutofitHelper.create(this, attrs, defStyle) + .addOnTextSizeChangeListener(this); + } + + // Getters and Setters + + /** + * {@inheritDoc} + */ + @Override + public void setTextSize(int unit, float size) { + super.setTextSize(unit, size); + if (mHelper != null) { + mHelper.setTextSize(unit, size); + } + } + + /** + * {@inheritDoc} + */ + @Override + public void setLines(int lines) { + super.setLines(lines); + if (mHelper != null) { + mHelper.setMaxLines(lines); + } + } + + /** + * {@inheritDoc} + */ + @Override + public void setMaxLines(int maxLines) { + super.setMaxLines(maxLines); + if (mHelper != null) { + mHelper.setMaxLines(maxLines); + } + } + + /** + * Returns the {@link AutofitHelper} for this View. + */ + public AutofitHelper getAutofitHelper() { + return mHelper; + } + + /** + * Returns whether or not the text will be automatically re-sized to fit its constraints. + */ + public boolean isSizeToFit() { + return mHelper.isEnabled(); + } + + /** + * Sets the property of this field (sizeToFit), to automatically resize the text to fit its + * constraints. + */ + public void setSizeToFit() { + setSizeToFit(true); + } + + /** + * If true, the text will automatically be re-sized to fit its constraints; if false, it will + * act like a normal TextView. + * + * @param sizeToFit + */ + public void setSizeToFit(boolean sizeToFit) { + mHelper.setEnabled(sizeToFit); + } + + /** + * Returns the maximum size (in pixels) of the text in this View. + */ + public float getMaxTextSize() { + return mHelper.getMaxTextSize(); + } + + /** + * Set the maximum text size to the given value, interpreted as "scaled pixel" units. This size + * is adjusted based on the current density and user font size preference. + * + * @param size The scaled pixel size. + * + * @attr ref android.R.styleable#TextView_textSize + */ + public void setMaxTextSize(float size) { + mHelper.setMaxTextSize(size); + } + + /** + * Set the maximum text size to a given unit and value. See TypedValue for the possible + * dimension units. + * + * @param unit The desired dimension unit. + * @param size The desired size in the given units. + * + * @attr ref android.R.styleable#TextView_textSize + */ + public void setMaxTextSize(int unit, float size) { + mHelper.setMaxTextSize(unit, size); + } + + /** + * Returns the minimum size (in pixels) of the text in this View. + */ + public float getMinTextSize() { + return mHelper.getMinTextSize(); + } + + /** + * Set the minimum text size to the given value, interpreted as "scaled pixel" units. This size + * is adjusted based on the current density and user font size preference. + * + * @param minSize The scaled pixel size. + * + * @attr ref me.grantland.R.styleable#AutofitTextView_minTextSize + */ + public void setMinTextSize(int minSize) { + mHelper.setMinTextSize(TypedValue.COMPLEX_UNIT_SP, minSize); + } + + /** + * Set the minimum text size to a given unit and value. See TypedValue for the possible + * dimension units. + * + * @param unit The desired dimension unit. + * @param minSize The desired size in the given units. + * + * @attr ref me.grantland.R.styleable#AutofitTextView_minTextSize + */ + public void setMinTextSize(int unit, float minSize) { + mHelper.setMinTextSize(unit, minSize); + } + + /** + * Returns the amount of precision used to calculate the correct text size to fit within its + * bounds. + */ + public float getPrecision() { + return mHelper.getPrecision(); + } + + /** + * Set the amount of precision used to calculate the correct text size to fit within its + * bounds. Lower precision is more precise and takes more time. + * + * @param precision The amount of precision. + */ + public void setPrecision(float precision) { + mHelper.setPrecision(precision); + } + + @Override + public void onTextSizeChange(float textSize, float oldTextSize) { + // do nothing + } +} \ No newline at end of file diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/cityPicker/City.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/cityPicker/City.java new file mode 100644 index 0000000000000000000000000000000000000000..219f07f52947b2d0d4ff53d04f5fed7bbccd63ec --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/cityPicker/City.java @@ -0,0 +1,42 @@ +package com.jiuqi.elove.widget.cityPicker; + +/** + * author zaaach on 2016/1/26. + */ +public class City { + private String name; + private String pinyin; + private String id; + + public City() {} + + public City(String name, String pinyin,String id) { + this.name = name; + this.pinyin = pinyin; + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getPinyin() { + return pinyin; + } + + public void setPinyin(String pinyin) { + this.pinyin = pinyin; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/cityPicker/CityListAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/cityPicker/CityListAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..1495777532dc9f8fdbf5b79c55c032d77e1a0a71 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/cityPicker/CityListAdapter.java @@ -0,0 +1,139 @@ +package com.jiuqi.elove.widget.cityPicker; + +import android.content.Context; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.TextView; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.util.SupportMultiScreenUtil; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +/** + * author dl on 2016/7/14. + */ +public class CityListAdapter extends BaseAdapter { + private static final int VIEW_TYPE_COUNT = 4; + + private LayoutInflater inflater; + private List mCities; + private HashMap letterIndexes; + private String[] sections; + private OnCityClickListener onCityClickListener; + + public CityListAdapter(Context mContext, List mCities) { + this.mCities = mCities; + this.inflater = LayoutInflater.from(mContext); + if (mCities == null){ + mCities = new ArrayList<>(); + } + int size = mCities.size(); + letterIndexes = new HashMap<>(); + sections = new String[size]; + for (int index = 0; index < size; index++){ + //当前城市拼音首字母 + String currentLetter = PinyinUtils.getFirstLetter(mCities.get(index).getPinyin()); + //上个首字母,如果不存在设为"" + String previousLetter = index >= 1 ? PinyinUtils.getFirstLetter(mCities.get(index - 1).getPinyin()) : ""; + if (!TextUtils.equals(currentLetter, previousLetter)){ + letterIndexes.put(currentLetter, index); + sections[index] = currentLetter; + } + } + } + + /** + * 获取字母索引的位置 + * @param letter + * @return + */ + public int getLetterPosition(String letter){ + Integer integer = letterIndexes.get(letter); + return integer == null ? -1 : integer; + } + +// @Override +// public int getViewTypeCount() { +// return VIEW_TYPE_COUNT; +// } +// +// @Override +// public int getItemViewType(int position) { +// return position < VIEW_TYPE_COUNT - 1 ? position : VIEW_TYPE_COUNT - 1; +// } + + @Override + public int getCount() { + return mCities == null ? 0: mCities.size(); + } + + @Override + public City getItem(int position) { + return mCities == null ? null : mCities.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(final int position, View view, ViewGroup parent) { + CityViewHolder holder; +// int viewType = getItemViewType(position); +// switch (viewType){ +// case 3: //所有 + if (view == null){ + view = inflater.inflate(R.layout.item_city_listview, parent, false); + SupportMultiScreenUtil.scale(view); + holder = new CityViewHolder(); + holder.letter = (TextView) view.findViewById(R.id.tv_item_city_listview_letter); + holder.name = (TextView) view.findViewById(R.id.tv_item_city_listview_name); + view.setTag(holder); + }else{ + holder = (CityViewHolder) view.getTag(); + } +// if (position >= 1){ + final City city = mCities.get(position); + holder.name.setText(city.getName()); + String currentLetter = PinyinUtils.getFirstLetter(mCities.get(position).getPinyin()); + String previousLetter = position >= 1 ? PinyinUtils.getFirstLetter(mCities.get(position - 1).getPinyin()) : ""; + if (!TextUtils.equals(currentLetter, previousLetter)){ + holder.letter.setVisibility(View.VISIBLE); + holder.letter.setText(currentLetter); + }else{ + holder.letter.setVisibility(View.GONE); + } + holder.name.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (onCityClickListener != null){ + onCityClickListener.onCityClick(city.getId()); + } + } + }); +// } +// break; +// } + return view; + } + + public void setOnCityClickListener(OnCityClickListener listener){ + this.onCityClickListener = listener; + } + + public interface OnCityClickListener{ + void onCityClick(String id); + } + + public static class CityViewHolder{ + TextView letter; + TextView name; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/cityPicker/PinyinUtils.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/cityPicker/PinyinUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..ebf528ba75c94bcd427c92997a503ad0392ebb5d --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/cityPicker/PinyinUtils.java @@ -0,0 +1,25 @@ +package com.jiuqi.elove.widget.cityPicker; + +import android.text.TextUtils; + +import java.util.regex.Pattern; + +/** + * author zaaach on 2016/1/28. + */ +public class PinyinUtils { + /** + * 获取拼音的首字母(大写) + * @param pinyin + * @return + */ + public static String getFirstLetter(final String pinyin){ + if (TextUtils.isEmpty(pinyin)) return "定位"; + String c = pinyin.substring(0, 1); + Pattern pattern = Pattern.compile("^[A-Za-z]+$"); + if (pattern.matcher(c).matches()){ + return c.toUpperCase(); + } + return "其他"; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/cityPicker/ResultListAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/cityPicker/ResultListAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..eac17db8cacf5ceb587e550fde8fb747ce0331aa --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/cityPicker/ResultListAdapter.java @@ -0,0 +1,69 @@ +package com.jiuqi.elove.widget.cityPicker; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.TextView; + +import com.jiuqi.elove.R; + +import java.util.List; + +/** + * author zaaach on 2016/1/26. + */ +public class ResultListAdapter extends BaseAdapter { + private Context mContext; + private List mCities; + + public ResultListAdapter(Context mContext, List mCities) { + this.mCities = mCities; + this.mContext = mContext; + } + + public void changeData(List list){ + if (mCities == null){ + mCities = list; + }else{ + mCities.clear(); + mCities.addAll(list); + } + notifyDataSetChanged(); + } + + @Override + public int getCount() { + return mCities == null ? 0 : mCities.size(); + } + + @Override + public City getItem(int position) { + return mCities == null ? null : mCities.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View view, ViewGroup parent) { + ResultViewHolder holder; + if (view == null){ + view = LayoutInflater.from(mContext).inflate(R.layout.item_search_result_listview, parent, false); + holder = new ResultViewHolder(); + holder.name = (TextView) view.findViewById(R.id.tv_item_result_listview_name); + view.setTag(holder); + }else{ + holder = (ResultViewHolder) view.getTag(); + } + holder.name.setText(mCities.get(position).getName()); + return view; + } + + public static class ResultViewHolder{ + TextView name; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/cityPicker/SideLetterBar.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/cityPicker/SideLetterBar.java new file mode 100644 index 0000000000000000000000000000000000000000..26758bdbd2de65b4f4ee4cc959be3f3b87180a30 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/cityPicker/SideLetterBar.java @@ -0,0 +1,132 @@ +package com.jiuqi.elove.widget.cityPicker; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.View; +import android.widget.TextView; + +import com.jiuqi.elove.R; + + +public class SideLetterBar extends View { + private static final String[] b = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"}; + private int choose = -1; + private Paint paint = new Paint(); + private boolean showBg = false; + private OnLetterChangedListener onLetterChangedListener; + private TextView overlay; + + public SideLetterBar(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + public SideLetterBar(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public SideLetterBar(Context context) { + super(context); + } + + /** + * 设置悬浮的textview + * @param overlay + */ + public void setOverlay(TextView overlay){ + this.overlay = overlay; + } + + @SuppressWarnings("deprecation") + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + if (showBg) { + canvas.drawColor(Color.TRANSPARENT); + } + + int height = getHeight(); + int width = getWidth(); + int singleHeight = height / b.length; + for (int i = 0; i < b.length; i++) { + paint.setTextSize(getResources().getDimension(R.dimen.side_letter_bar_letter_size)); + paint.setColor(getResources().getColor(R.color.gray)); + paint.setAntiAlias(true); + if (i == choose) { + paint.setColor(getResources().getColor(R.color.gray_deep)); +// paint.setFakeBoldText(true); //加粗 + } + float xPos = width / 2 - paint.measureText(b[i]) / 2; + float yPos = singleHeight * i + singleHeight; + canvas.drawText(b[i], xPos, yPos, paint); + paint.reset(); + } + + } + + @Override + public boolean dispatchTouchEvent(MotionEvent event) { + final int action = event.getAction(); + final float y = event.getY(); + final int oldChoose = choose; + final OnLetterChangedListener listener = onLetterChangedListener; + final int c = (int) (y / getHeight() * b.length); + + switch (action) { + case MotionEvent.ACTION_DOWN: + showBg = true; + if (oldChoose != c && listener != null) { + if (c >= 0 && c < b.length) { + listener.onLetterChanged(b[c]); + choose = c; + invalidate(); + if (overlay != null){ + overlay.setVisibility(VISIBLE); + overlay.setText(b[c]); + } + } + } + + break; + case MotionEvent.ACTION_MOVE: + if (oldChoose != c && listener != null) { + if (c >= 0 && c < b.length) { + listener.onLetterChanged(b[c]); + choose = c; + invalidate(); + if (overlay != null){ + overlay.setVisibility(VISIBLE); + overlay.setText(b[c]); + } + } + } + break; + case MotionEvent.ACTION_UP: + showBg = false; + choose = -1; + invalidate(); + if (overlay != null){ + overlay.setVisibility(GONE); + } + break; + } + return true; + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + return super.onTouchEvent(event); + } + + public void setOnLetterChangedListener(OnLetterChangedListener onLetterChangedListener) { + this.onLetterChangedListener = onLetterChangedListener; + } + + public interface OnLetterChangedListener { + void onLetterChanged(String letter); + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/cityPicker/StringUtils.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/cityPicker/StringUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..1da24fc7db217f96d69d6afb55098c88a84159c2 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/cityPicker/StringUtils.java @@ -0,0 +1,16 @@ +package com.jiuqi.elove.widget.cityPicker; + +/** + * author liulin on 2016/7/14. + */ +public class StringUtils { + /** + * 提取出城市或者县 + * @param city + * @param district + * @return + */ + public static String extractLocation(final String city, final String district){ + return district.contains("县") ? district.substring(0, district.length() - 1) : city.substring(0, city.length() - 1); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/dialog/AudioDialogManager.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/dialog/AudioDialogManager.java new file mode 100644 index 0000000000000000000000000000000000000000..4b53093812ba117b1a1ef3b92aaa3b3b0e08402c --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/dialog/AudioDialogManager.java @@ -0,0 +1,91 @@ +package com.jiuqi.elove.widget.dialog; + +import android.app.Dialog; +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import com.jiuqi.elove.R; + +/** + * Created by kirito on 2016.11.07. + */ + +public class AudioDialogManager { + private LayoutInflater mLayoutInflater; + private Dialog mDialog; + private Context mContext; + private ImageView iv_icon,iv_voice; + private TextView tv_label; + + private static final String TAG = "AudioDialogManager"; + + public AudioDialogManager(Context context) { + mLayoutInflater = LayoutInflater.from(context); + mContext = context; + } + + public void showDialog(){ + mDialog = new Dialog(mContext, R.style.voice_dialog); + View view = mLayoutInflater.inflate(R.layout.dialog_voice,null,false); + mDialog.setContentView(view); + mDialog.setCanceledOnTouchOutside(false); + iv_icon = (ImageView) mDialog.findViewById(R.id.iv_icon); + iv_voice = (ImageView) mDialog.findViewById(R.id.iv_voice); + tv_label = (TextView) mDialog.findViewById(R.id.tv_label); + + mDialog.show(); + } + + public void showRecording(){ + if (mDialog != null && mDialog.isShowing()){ + iv_icon.setVisibility(View.VISIBLE); + iv_voice.setVisibility(View.VISIBLE); + iv_icon.setImageResource(R.drawable.recorder); + iv_voice.setImageResource(R.drawable.v1); + + tv_label.setText(R.string.dialog_recording); + } + } + +// public void wantToCancel(){ +// if (mDialog != null && mDialog.isShowing()){ +// iv_icon.setVisibility(View.VISIBLE); +// iv_voice.setVisibility(View.GONE); +// iv_icon.setImageResource(R.drawable.cancel); +// +// tv_label.setText(R.string.dialog_cancel); +// } +// } + + public void tooShort(){ + if (mDialog != null && mDialog.isShowing()){ + iv_icon.setVisibility(View.VISIBLE); + iv_voice.setVisibility(View.GONE); + iv_icon.setImageResource(R.drawable.voice_to_short); + + tv_label.setText(R.string.dialog_too_short); + } + } + + public void dismissDialog(){ + if (mDialog != null && mDialog.isShowing()){ + mDialog.dismiss(); + mDialog = null; + } + } + + public void setVoiceLevel(int level){ + if (mDialog != null && mDialog.isShowing()){ + iv_icon.setVisibility(View.VISIBLE); + iv_voice.setVisibility(View.VISIBLE); + iv_icon.setImageResource(R.drawable.recorder); + + int res_id = mContext.getResources().getIdentifier("v" + level,"drawable",mContext.getPackageName()); + iv_voice.setImageResource(res_id); + tv_label.setText(R.string.dialog_recording); + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/dialog/CustomDialog.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/dialog/CustomDialog.java new file mode 100644 index 0000000000000000000000000000000000000000..9502984e1bc421b872b767153de3b56d6ffbcf37 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/dialog/CustomDialog.java @@ -0,0 +1,302 @@ +package com.jiuqi.elove.widget.dialog; + +import android.app.Dialog; +import android.content.Context; +import android.content.DialogInterface; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup.LayoutParams; +import android.widget.Button; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.jiuqi.elove.R; + +/** + * 带有确定和取消按钮的通用dialog + * Created by dl on 2016/8/1. + */ +public class CustomDialog extends Dialog { + + public CustomDialog(Context context) { + super(context); + } + + public CustomDialog(Context context, int theme) { + super(context, theme); + } + + public static class Builder { + private Context context; //上下文对象 + private String title; //对话框标题 + private String message; //对话框内容 + private String confirm_btnText; //按钮名称“确定” + private String neutral_btnText; //按钮名称“隐藏” + private String cancel_btnText; //按钮名称“取消” + private View titleView; //对话框标题位置加载的其他布局界面 + private View contentView; //对话框中间加载的其他布局界面 + private boolean isSupportCancle = false;//是否支持点击外面消失 + /*按钮坚挺事件*/ + private DialogInterface.OnClickListener confirm_btnClickListener; + private DialogInterface.OnClickListener neutral_btnClickListener; + private DialogInterface.OnClickListener cancel_btnClickListener; + + public Builder(Context context) { + this.context = context; + } + + /*设置对话框信息*/ + public Builder setMessage(String message) { + this.message = message; + return this; + } + + /** + * Set the Dialog message from resource + * + * @param message + * @return + */ + public Builder setMessage(int message) { + this.message = (String) context.getText(message); + return this; + } + + /** + * Set the Dialog title from resource + * + * @param title + * @return + */ + public Builder setTitle(int title) { + this.title = (String) context.getText(title); + return this; + } + + /** + * Set the Dialog title from String + * + * @param title + * @return + */ + public Builder setTitle(String title) { + this.title = title; + return this; + } + + /** + * 设置对话框界面 + * @param v View + * @return + */ + public Builder setContentView(View v) { + this.contentView = v; + return this; + } + /** + * 设置对话框界面 + * @param v View + * @return + */ + public Builder setTitleView(View v) { + this.titleView = v; + return this; + } + + /** + * Set the positive button resource and it's listener + * + * @param confirm_btnText + * @return + */ + public Builder setPositiveButton(int confirm_btnText, + DialogInterface.OnClickListener listener) { + this.confirm_btnText = (String) context + .getText(confirm_btnText); + this.confirm_btnClickListener = listener; + return this; + } + + /** + * Set the positive button and it's listener + * + * @param confirm_btnText + * @return + */ + public Builder setPositiveButton(String confirm_btnText, + DialogInterface.OnClickListener listener) { + this.confirm_btnText = confirm_btnText; + this.confirm_btnClickListener = listener; + return this; + } + + + /** + * Set the negative button resource and it's listener + * + * @param cancel_btnText + * @return + */ + public Builder setNegativeButton(int cancel_btnText, + DialogInterface.OnClickListener listener) { + this.cancel_btnText = (String) context + .getText(cancel_btnText); + this.cancel_btnClickListener = listener; + return this; + } + + /** + * Set the negative button and it's listener + * + * @param cancel_btnText + * @return + */ + public Builder setNegativeButton(String cancel_btnText, + DialogInterface.OnClickListener listener) { + this.cancel_btnText = cancel_btnText; + this.cancel_btnClickListener = listener; + return this; + } + + + /** + * Set the negative button resource and it's listener + * + * @param neutral_btnText + * @return + */ + public Builder setNeutralButton(int neutral_btnText, + DialogInterface.OnClickListener listener) { + this.neutral_btnText = (String) context + .getText(neutral_btnText); + this.neutral_btnClickListener = listener; + return this; + } + + /** + * Set the neutral button and it's listener + * + * @param neutral_btnText + * @return + */ + public Builder setNeutralButton(String neutral_btnText, + DialogInterface.OnClickListener listener) { + this.neutral_btnText = neutral_btnText; + this.neutral_btnClickListener = listener; + return this; + } + + public Builder setCancelable(boolean flag){ + this.isSupportCancle = flag; + return this; + } + public CustomDialog create() { + LayoutInflater inflater = (LayoutInflater) context + .getSystemService(Context.LAYOUT_INFLATER_SERVICE); + // instantiate the dialog with the custom Theme + final CustomDialog dialog = new CustomDialog(context, R.style.mystyle); + View layout = inflater.inflate(R.layout.customdialog, null); + dialog.addContentView(layout, new LayoutParams( + LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); + // set the dialog title + // set the content message + if (title != null) { + ((TextView) layout.findViewById(R.id.title)).setText(title); + ((TextView) layout.findViewById(R.id.title)).getPaint().setFakeBoldText(true); + } else{ + // if no title set + // add the titleView to the dialog title area + ((RelativeLayout) layout.findViewById(R.id.rl_title)).removeAllViews(); + ((RelativeLayout) layout.findViewById(R.id.rl_title)).addView( + titleView, new LayoutParams( + LayoutParams.WRAP_CONTENT, + LayoutParams.WRAP_CONTENT)); + } + // set the confirm button + if (confirm_btnText != null) { + ((Button) layout.findViewById(R.id.confirm_btn)) + .setText(confirm_btnText); + if (confirm_btnClickListener != null) { + (layout.findViewById(R.id.confirm_btn)) + .setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + confirm_btnClickListener.onClick(dialog, + DialogInterface.BUTTON_POSITIVE); + } + }); + } + } else { + layout.findViewById(R.id.second_line).setVisibility( + View.GONE); + // if no confirm button just set the visibility to GONE + layout.findViewById(R.id.confirm_btn).setVisibility( + View.GONE); + } + // set the neutral button + if (neutral_btnText != null) { + layout.findViewById(R.id.neutral_btn).setVisibility( + View.VISIBLE); + layout.findViewById(R.id.first_line).setVisibility( + View.VISIBLE); + ((Button) layout.findViewById(R.id.neutral_btn)) + .setText(neutral_btnText); + if (neutral_btnClickListener != null) { + ((Button) layout.findViewById(R.id.neutral_btn)) + .setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + neutral_btnClickListener.onClick(dialog, + DialogInterface.BUTTON_NEGATIVE); + } + }); + } + } else { + // if no confirm button just set the visibility to GONE + layout.findViewById(R.id.neutral_btn).setVisibility( + View.GONE); + layout.findViewById(R.id.first_line).setVisibility( + View.GONE); + } + // set the cancel button + if (cancel_btnText != null) { + if(confirm_btnText == null && neutral_btnText == null){ + layout.findViewById(R.id.cancel_btn).setBackground(context.getResources().getDrawable(R.drawable.customdialog_one_btn_select)); + } + ((Button) layout.findViewById(R.id.cancel_btn)) + .setText(cancel_btnText); + if (cancel_btnClickListener != null) { + ((Button) layout.findViewById(R.id.cancel_btn)) + .setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + cancel_btnClickListener.onClick(dialog, + DialogInterface.BUTTON_NEGATIVE); + } + }); + } + } else { + // if no confirm button just set the visibility to GONE + layout.findViewById(R.id.cancel_btn).setVisibility( + View.GONE); + } + // set the content message + if (message != null) { + ((TextView) layout.findViewById(R.id.message)).setText(message); + } else if (contentView != null) { + // if no message set + // add the contentView to the dialog body + ((RelativeLayout) layout.findViewById(R.id.rl_message)).removeAllViews(); + ((RelativeLayout) layout.findViewById(R.id.rl_message)).addView( + contentView, new LayoutParams( + LayoutParams.WRAP_CONTENT, + LayoutParams.WRAP_CONTENT)); + } + if(!isSupportCancle){ + dialog.setCanceledOnTouchOutside(isSupportCancle); + }else{ + dialog.setCanceledOnTouchOutside(isSupportCancle); + } + dialog.setContentView(layout); + return dialog; + } + + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/dialog/InputDailog.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/dialog/InputDailog.java new file mode 100644 index 0000000000000000000000000000000000000000..603ce80a7dc5d39502f1db9b6b498b8bdfa2d6de --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/dialog/InputDailog.java @@ -0,0 +1,147 @@ +package com.jiuqi.elove.widget.dialog; + +import android.annotation.SuppressLint; +import android.app.Dialog; +import android.app.ProgressDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.graphics.Color; +import android.os.Bundle; +import android.os.Handler; +import android.support.v4.app.DialogFragment; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.view.Gravity; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.view.inputmethod.InputMethodManager; +import android.widget.EditText; +import android.widget.TextView; +import android.widget.Toast; + +import com.jiuqi.elove.R; + + +public class InputDailog extends DialogFragment { + + private String texthint; + + private Dialog dialog; + private EditText inputDlg; + private TextView tv_number; + private int numconut=1000; + //点击发表,内容不为空时的回调 + public SendBackListener sendBackListener; + + public InputDailog() { + } + + + @SuppressLint("ValidFragment") + public InputDailog(String texthint, SendBackListener sendBackListener){//提示文字 + this.texthint=texthint; + this.sendBackListener=sendBackListener; + + } + + public Dialog onCreateDialog(Bundle savedInstanceState) { + // 使用不带Theme的构造器, 获得的dialog边框距离屏幕仍有几毫米的缝隙。 + dialog = new Dialog(getActivity(), R.style.BottomDialog); + dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); // 设置Content前设定 +// getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN); + View contentview = View.inflate(getActivity(), R.layout.comment_dialog_layout, null); + dialog.setContentView(contentview); + dialog.setCanceledOnTouchOutside(true); // 外部点击取消 + // 设置宽度为屏宽, 靠近屏幕底部。 + Window window = dialog.getWindow(); + WindowManager.LayoutParams lp = window.getAttributes(); + lp.gravity = Gravity.BOTTOM; // 紧贴底部 + lp.alpha = 1; + lp.dimAmount = 0.5f; + lp.width = WindowManager.LayoutParams.MATCH_PARENT; // 宽度持平 + window.setAttributes(lp); + window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); + inputDlg = (EditText) contentview.findViewById(R.id.dialog_comment_content); + inputDlg.setHint(texthint); + TextView tv_hideinput = (TextView)contentview.findViewById(com.stonesun.newssdk.R.id.tv_hideinput); + tv_number = (TextView)contentview.findViewById(com.stonesun.newssdk.R.id.tv_number); + tv_number.setText(numconut+""); + final TextView tv_send = (TextView) contentview.findViewById(R.id.dialog_comment_send); + this.inputDlg.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + int number = numconut - s.length(); + tv_number.setText("" + number); + if (s.length() > 0) { + tv_send.setTextColor(Color.parseColor("#000000")); + } else { + tv_send.setTextColor(Color.parseColor("#e6e6e6")); + } + + } + }); +// inputDlg.setFocusable(true); +// inputDlg.setFocusableInTouchMode(true); +// inputDlg.requestFocus(); + tv_hideinput.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + hideSoftkeyboard(); +// inputDlg.clearFocus(); + dialog.dismiss(); + } + }); + tv_send.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (TextUtils.isEmpty(inputDlg.getText().toString())) { + Toast.makeText(getActivity(),"输入内容为空",Toast.LENGTH_LONG).show(); + } else { + sendBackListener.sendBack(inputDlg.getText().toString()); + } + } + }); + final Handler hanler = new Handler(); + dialog.setOnDismissListener(new DialogInterface.OnDismissListener() { + @Override + public void onDismiss(DialogInterface dialog) { + hideSoftkeyboard(); +// hanler.postDelayed(new Runnable() { +// @Override +// public void run() { +// hideSoftkeyboard(); +// } +// }, 500); + + } + }); + return dialog; + } + + public void hideSoftkeyboard() { + try { + InputMethodManager manager = ((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)); + manager.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), + InputMethodManager.HIDE_NOT_ALWAYS); + } catch (NullPointerException e) { + + } + } + + public interface SendBackListener{ + void sendBack(String inputText); + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/dialog/LoadingDialog.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/dialog/LoadingDialog.java new file mode 100644 index 0000000000000000000000000000000000000000..86905f26cdc71a161d357ede7b9ab239195cb59b --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/dialog/LoadingDialog.java @@ -0,0 +1,61 @@ +package com.jiuqi.elove.widget.dialog; + +import android.app.Dialog; +import android.content.Context; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.animation.Animation; +import android.view.animation.AnimationUtils; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.jiuqi.elove.R; + +/** + * 加载等待框 + * Created by dl on 2016/10/13 + */ +public class LoadingDialog { + + private static Dialog loadingDialog; + + /** + * 得到自定义的Dialog + */ + public static Dialog createLoadingDialog(Context context, String msg) { + // 首先得到整个View + View view = LayoutInflater.from(context).inflate(R.layout.loading_dialog_layout, null); + // 页面中的Img + ImageView img = (ImageView) view.findViewById(R.id.img); + // 页面中显示文本 + TextView tipText = (TextView) view.findViewById(R.id.tipTextView); + // 加载动画,动画用户使img图片不停的旋转 + Animation animation = AnimationUtils.loadAnimation(context, R.anim.rotating); + // 显示动画 + img.startAnimation(animation); + // 显示文本 + if(!TextUtils.isEmpty(msg)){ + tipText.setText(msg); + }else{ + tipText.setVisibility(View.GONE); + } + // 创建自定义样式的Dialog + loadingDialog = new Dialog(context, R.style.loading_dialog); + // 设置返回键返回 + loadingDialog.setCancelable(true); + //点击空白取消 + loadingDialog.setCanceledOnTouchOutside(true); + loadingDialog.setContentView(view, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT)); +// loadingDialog.show(); + return loadingDialog; + } + + public static void cancelDialog() { + if (loadingDialog != null) { + //cancel内部调用了dismiss()方法,多了一个对cancel事件的监听判断,如果监听不为空则与dismiss则会插入特有的处理 + loadingDialog.cancel(); + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/dialog/PopoverDialog.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/dialog/PopoverDialog.java new file mode 100644 index 0000000000000000000000000000000000000000..4590c2c91ed98c70b9eba592828d556c443e0f57 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/dialog/PopoverDialog.java @@ -0,0 +1,195 @@ +package com.jiuqi.elove.widget.dialog; + +import android.app.Dialog; +import android.content.Context; +import android.content.DialogInterface; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup.LayoutParams; +import android.widget.Button; + +import com.jiuqi.elove.R; + +/** + * 活动评论回复用 + * Created by FanWenXia on 2016/8/1. + */ +public class PopoverDialog extends Dialog { + + public PopoverDialog(Context context) { + super(context); + } + + public PopoverDialog(Context context, int theme) { + super(context, theme); + } + + public static class Builder { + private Context context; //上下文对象 + private String first_btnText; //第一个按钮名称 + private String second_btnText; //第二个按钮名称 + private String third_btnText; //第三个按钮名称 + /*按钮坚挺事件*/ + private OnClickListener first_btnClickListener; + private OnClickListener second_btnClickListener; + private OnClickListener third_btnClickListener; + + public Builder(Context context) { + this.context = context; + } + + + /** + * Set the first button resource and it's listener + * + * @param first_btnText + * @return + */ + public Builder setFirstButton(int first_btnText, + OnClickListener listener) { + this.first_btnText = (String) context + .getText(first_btnText); + this.first_btnClickListener = listener; + return this; + } + /** + * Set the first button resource and it's listener + * + * @param first_btnText + * @return + */ + public Builder setFirstButton(String first_btnText, + OnClickListener listener) { + this.first_btnText = first_btnText; + this.first_btnClickListener = listener; + return this; + } + + /** + * Set the first button resource and it's listener + * + * @param second_btnText + * @return + */ + public Builder setSecondButton(int second_btnText, + OnClickListener listener) { + this.second_btnText = (String) context + .getText(second_btnText); + this.second_btnClickListener = listener; + return this; + } + /** + * Set the positive button and it's listener + * + * @param second_btnText + * @return + */ + public Builder setSecondButton(String second_btnText, + OnClickListener listener) { + this.second_btnText = second_btnText; + this.second_btnClickListener = listener; + return this; + } + + /** + * Set the negative button resource and it's listener + * + * @param third_btnText + * @return + */ + public Builder setThirdButton(int third_btnText, + OnClickListener listener) { + this.third_btnText = (String) context + .getText(third_btnText); + this.third_btnClickListener = listener; + return this; + } + /** + * Set the positive button and it's listener + * + * @param third_btnText + * @return + */ + public Builder setThirdButton(String third_btnText, + OnClickListener listener) { + this.third_btnText = third_btnText; + this.third_btnClickListener = listener; + return this; + } + + + public PopoverDialog create() { + LayoutInflater inflater = (LayoutInflater) context + .getSystemService(Context.LAYOUT_INFLATER_SERVICE); + // instantiate the dialog with the custom Theme + final PopoverDialog dialog = new PopoverDialog(context, R.style.mystyle); + View layout = inflater.inflate(R.layout.dialog_popover, null); + dialog.addContentView(layout, new LayoutParams( + LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); + // set the first button + if (first_btnText != null) { + layout.findViewById(R.id.first_btn).setVisibility( + View.VISIBLE); + ((Button) layout.findViewById(R.id.first_btn)) + .setText(first_btnText); + if (first_btnClickListener != null) { + (layout.findViewById(R.id.first_btn)) + .setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + first_btnClickListener.onClick(dialog, + DialogInterface.BUTTON_POSITIVE); + } + }); + } + } else { + // if no confirm button just set the visibility to GONE + layout.findViewById(R.id.first_btn).setVisibility( + View.GONE); + } + // set the second button + if (second_btnText != null) { + ((Button) layout.findViewById(R.id.second_btn)) + .setText(second_btnText); + if (second_btnClickListener != null) { + (layout.findViewById(R.id.second_btn)) + .setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + second_btnClickListener.onClick(dialog, + DialogInterface.BUTTON_POSITIVE); + } + }); + } + } else { + // if no confirm button just set the visibility to GONE + layout.findViewById(R.id.second_btn).setVisibility( + View.GONE); + layout.findViewById(R.id.second_btn_line).setVisibility( + View.GONE); + layout.findViewById(R.id.first_btn).setBackground(context.getResources().getDrawable(R.drawable.single_btn_select)); + } + // set the third button + if (third_btnText != null) { + ((Button) layout.findViewById(R.id.third_btn)) + .setText(third_btnText); + if (third_btnClickListener != null) { + (layout.findViewById(R.id.third_btn)) + .setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + third_btnClickListener.onClick(dialog, + DialogInterface.BUTTON_POSITIVE); + } + }); + } + } else { + // if no confirm button just set the visibility to GONE + layout.findViewById(R.id.third_btn).setVisibility( + View.GONE); + layout.findViewById(R.id.third_btn_line).setVisibility( + View.GONE); + layout.findViewById(R.id.second_btn).setBackground(context.getResources().getDrawable(R.drawable.popoverdialog_end_btn_select)); + } + dialog.setContentView(layout); + return dialog; + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/adpater/TreeRecyclerAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/adpater/TreeRecyclerAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..c2ee0e25cbaabe01aff716d60b8dfd4dbfdbc720 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/adpater/TreeRecyclerAdapter.java @@ -0,0 +1,310 @@ +package com.jiuqi.elove.widget.grouplist.adpater; + +import android.support.v7.widget.GridLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.View; + +import com.jiuqi.elove.widget.grouplist.base.BaseRecyclerAdapter; +import com.jiuqi.elove.widget.grouplist.base.ViewHolder; +import com.jiuqi.elove.widget.grouplist.factory.ItemHelperFactory; +import com.jiuqi.elove.widget.grouplist.item.TreeItem; +import com.jiuqi.elove.widget.grouplist.item.TreeItemGroup; +import com.jiuqi.elove.widget.grouplist.manager.ItemManager; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by baozi on 2017/4/20. + * 树级结构recycleradapter. + * item之间有子父级关系, + */ + +public class TreeRecyclerAdapter extends BaseRecyclerAdapter { + + private TreeRecyclerType type = TreeRecyclerType.SHOW_DEFUTAL; + + private ItemManager mItemManager; + + @Override + public void onBindViewHolderClick(final ViewHolder holder, View view) { + if (!view.hasOnClickListeners()) { + view.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + int layoutPosition = holder.getLayoutPosition(); + //检查item的position,这个item是否可以点击 + if (getCheckItem().checkPosition(layoutPosition)) { + //获得处理后的position + int itemPosition = getCheckItem().getAfterCheckingPosition(layoutPosition); + //拿到BaseItem + TreeItem item = getDatas().get(itemPosition); + //展开,折叠和item点击不应该同时响应事件. + //必须是TreeItemGroup才能展开折叠,并且type不能为 TreeRecyclerType.SHOW_ALL + if (type != TreeRecyclerType.SHOW_ALL && item instanceof TreeItemGroup) { + //展开,折叠 + expandOrCollapse(((TreeItemGroup) item)); + } else { + TreeItemGroup itemParentItem = item.getParentItem(); + //判断上一级是否需要拦截这次事件,只处理当前item的上级,不关心上上级如何处理. + if (itemParentItem != null && itemParentItem.onInterceptClick(item)) { + return; + } + if (mOnItemClickListener != null) { + mOnItemClickListener.onItemClick(holder, itemPosition); + } else { + //拿到对应item,回调. + getDatas().get(itemPosition).onClick(); + } + } + } + } + }); + } + view.setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + //获得holder的position + int layoutPosition = holder.getLayoutPosition(); + //检查position是否可以点击 + if (getCheckItem().checkPosition(layoutPosition)) { + //检查并得到真实的position + int itemPosition = getCheckItem().getAfterCheckingPosition(layoutPosition); + if (mOnItemLongClickListener != null) { + return mOnItemLongClickListener.onItemLongClick(holder, itemPosition); + } + } + return false; + } + }); + } + + @Override + public List getDatas() { + return super.getDatas(); + } + + public void setDatas(TreeItemGroup treeItemGroup) { + if (null == treeItemGroup) { + return; + } + ArrayList arrayList = new ArrayList<>(); + arrayList.add(treeItemGroup); + setDatas(arrayList); + } + + @Override + public void setDatas(List items) { + if (null == items) { + return; + } + getDatas().clear(); + assembleItems(items); + } + + /** + * 对初始的一级items进行遍历,将每个item的childs拿出来,进行組合。 + * + * @param items + */ + private void assembleItems(List items) { + if (type != null) { + List datas = getDatas(); + datas.addAll(ItemHelperFactory.getChildItemsWithType(items, type)); + } else { + super.setDatas(items); + } + } + + public ItemManager getItemManager() { + if (mItemManager == null) { + mItemManager = new TreeItemManageImpl(this); + } + return mItemManager; + } + + public void setItemManager(ItemManager itemManage) { + this.mItemManager = itemManage; + } + + @Override + public int getLayoutId(int position) { + return getDatas().get(position).getLayoutId(); + } + + @Override + public void onBindViewHolder(ViewHolder holder, int position) { + TreeItem t = getDatas().get(position); + checkItemManage(t); + t.onBindViewHolder(holder); + } + + private void checkItemManage(TreeItem item) { + if (item.getItemManager() == null) { + item.setItemManager(getItemManager()); + } + } + + @Override + public final void onBindViewHolder(ViewHolder holder, TreeItem item, int position) { + + } + + @Override + public void onAttachedToRecyclerView(RecyclerView recyclerView) { + super.onAttachedToRecyclerView(recyclerView); + RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager(); + if (layoutManager instanceof GridLayoutManager) { + final GridLayoutManager gridLayoutManager = (GridLayoutManager) layoutManager; + gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { + @Override + public int getSpanSize(int position) { + TreeItem baseItem = getDatas().get(position); + if (baseItem.getSpanSize() == 0) { + return gridLayoutManager.getSpanCount(); + } + return baseItem.getSpanSize(); + } + }); + } + } + + /** + * 相应RecyclerView的点击事件 展开或关闭某节点 + */ + private void expandOrCollapse(TreeItemGroup treeItemGroup) { + boolean expand = treeItemGroup.isExpand(); + treeItemGroup.setExpand(!expand); + treeItemGroup.notifyExpand(); + } + + /** + * 需要设置在setdata之前,否则type不会生效 + * + * @param type + */ + public void setType(TreeRecyclerType type) { + this.type = type; + } + + private class TreeItemManageImpl extends ItemManager { + + TreeItemManageImpl(BaseRecyclerAdapter adapter) { + super(adapter); + } + + @Override + public void addItem(TreeItem item) { + if (null == item) { + return; + } + if (item instanceof TreeItemGroup) { + getDatas().add(item); + } else { + TreeItemGroup itemParentItem = item.getParentItem(); + if (itemParentItem != null) { + List childs = itemParentItem.getChilds(); + if (childs != null) { + int i = getDatas().indexOf(itemParentItem); + getDatas().add(i + itemParentItem.getChilds().size(), item); + } else { + childs = new ArrayList(); + itemParentItem.setChilds(childs); + } + childs.add(item); + } + } + notifyDataChanged(); + } + + @Override + public void addItem(int position, TreeItem item) { + getDatas().add(position, item); + if (item != null && item.getParentItem() != null) { + item.getParentItem().getChilds().add(item); + } + notifyDataChanged(); + } + + @Override + public void addItems(List items) { + getDatas().addAll(items); + notifyDataChanged(); + } + + @Override + public void addItems(int position, List items) { + getDatas().addAll(position, items); + notifyDataChanged(); + } + + @Override + public void removeItem(TreeItem item) { + if (null == item) { + return; + } + getDatas().remove(item); + TreeItemGroup itemParentItem = item.getParentItem(); + if (itemParentItem != null) { + List childs = itemParentItem.getChilds(); + if (childs != null) { + childs.remove(item); + } + } + notifyDataChanged(); + } + + @Override + public void removeItem(int position) { + TreeItem t = getDatas().get(position); + TreeItemGroup parentItem = t.getParentItem(); + if (parentItem != null && parentItem.getChilds() != null) { + parentItem.getChilds().remove(t); + } + getDatas().remove(position); + notifyDataChanged(); + } + + @Override + public void removeItems(List items) { + getDatas().removeAll(items); + notifyDataChanged(); + } + + @Override + public void replaceItem(int position, TreeItem item) { + TreeItem t = getDatas().get(position); + if (t instanceof TreeItemGroup) { + getDatas().set(position, item); + } else { + TreeItemGroup parentItem = t.getParentItem(); + if (parentItem != null && parentItem.getChilds() != null) { + List childs = parentItem.getChilds(); + int i = childs.indexOf(t); + childs.set(i, item); + } + getDatas().set(position, item); + } + notifyDataChanged(); + } + + @Override + public void replaceAllItem(List items) { + if (items != null) { + setDatas(items); + notifyDataChanged(); + } + } + + @Override + public TreeItem getItem(int position) { + return getDatas().get(position); + } + + @Override + public int getItemPosition(TreeItem item) { + return getDatas().indexOf(item); + } + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/adpater/TreeRecyclerType.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/adpater/TreeRecyclerType.java new file mode 100644 index 0000000000000000000000000000000000000000..d04d79ef3a7c87b2b6cf0b6f92ea1aadcdf03953 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/adpater/TreeRecyclerType.java @@ -0,0 +1,20 @@ +package com.jiuqi.elove.widget.grouplist.adpater; + +public enum TreeRecyclerType { + /** + * 显示所有,不可展开折叠 + * 适用场景,多级的data数据展示,多type布局. + */ + SHOW_ALL, + /** + * 根据isExpand的状态显示展开与折叠, + * 适用场景,多级的data数据展示,多type布局. + */ + SHOW_EXPAND, + + /** + * 默认显示,显示一级,点击展开,折叠不会影响子级展开折叠 + * 适用场景,多级列表,保存展开状态 + */ + SHOW_DEFUTAL; +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/adpater/wrapper/BaseWrapper.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/adpater/wrapper/BaseWrapper.java new file mode 100644 index 0000000000000000000000000000000000000000..f497db5f5fef41f2b24cd43855e44a24543eb3c3 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/adpater/wrapper/BaseWrapper.java @@ -0,0 +1,124 @@ +package com.jiuqi.elove.widget.grouplist.adpater.wrapper; + +import android.support.v7.widget.RecyclerView; +import android.view.View; +import android.view.ViewGroup; + +import com.jiuqi.elove.widget.grouplist.base.BaseRecyclerAdapter; +import com.jiuqi.elove.widget.grouplist.base.ViewHolder; +import com.jiuqi.elove.widget.grouplist.manager.ItemManager; + +import java.util.List; + +/** + * Created by baozi on 2017/5/16. + */ + +public class BaseWrapper extends BaseRecyclerAdapter { + + protected BaseRecyclerAdapter mAdapter; + + public BaseWrapper(BaseRecyclerAdapter adapter) { + mAdapter = adapter; + mAdapter.getItemManager().setAdapter(this); + } + +// @Override +// public OnItemClickLitener getmOnItemClickListener() { +// return mAdapter.getmOnItemClickListener(); +// } + + @Override + public void onBindViewHolderClick(ViewHolder holder, View view) { + mAdapter.onBindViewHolderClick(holder, view); + } + + @Override + public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + return mAdapter.onCreateViewHolder(parent, viewType); + } + + @Override + public void onAttachedToRecyclerView(RecyclerView recyclerView) { + mAdapter.onAttachedToRecyclerView(recyclerView); + } + + @Override + public void onViewAttachedToWindow(ViewHolder holder) { + mAdapter.onViewAttachedToWindow(holder); + } + + @Override + public int getItemViewType(int position) { + return mAdapter.getItemViewType(position); + } + + @Override + public void onBindViewHolder(ViewHolder holder, int position) { + mAdapter.onBindViewHolder(holder, position); + } + + @Override + public int getItemCount() { + return mAdapter.getItemCount(); + } + + @Override + public int getLayoutId(int position) { + return mAdapter.getLayoutId(position); + } + + @Override + public T getData(int position) { + return mAdapter.getData(position); + } + + @Override + public List getDatas() { + return mAdapter.getDatas(); + } + + @Override + public void setDatas(List datas) { + mAdapter.setDatas(datas); + } + + @Override + public void onBindViewHolder(ViewHolder holder, T t, int position) { + mAdapter.onBindViewHolder(holder, t, position); + } + + public int getCheckPosition(int position) { + return getCheckItem().getAfterCheckingPosition(position); + } + + @Override + public CheckItem getCheckItem() { + return mAdapter.getCheckItem(); + } + + @Override + public void setCheckItem(CheckItem checkItem) { + mAdapter.setCheckItem(checkItem); + } + + @Override + public void setOnItemClickListener(OnItemClickLitener onItemClickListener) { + mAdapter.setOnItemClickListener(onItemClickListener); + } + + @Override + public void setOnItemLongClickListener(OnItemLongClickListener onItemLongClickListener) { + mAdapter.setOnItemLongClickListener(onItemLongClickListener); + } + + @Override + public ItemManager getItemManager() { + return mAdapter.getItemManager(); + } + + @Override + public void setItemManager(ItemManager itemManager) { + mAdapter.setItemManager(itemManager); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/adpater/wrapper/HeaderAndFootWrapper.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/adpater/wrapper/HeaderAndFootWrapper.java new file mode 100644 index 0000000000000000000000000000000000000000..88fe6a5e98ee97045b75cebaac7cf477249d4407 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/adpater/wrapper/HeaderAndFootWrapper.java @@ -0,0 +1,99 @@ +package com.jiuqi.elove.widget.grouplist.adpater.wrapper; + +import android.util.SparseArray; +import android.view.View; +import android.view.ViewGroup; + +import com.jiuqi.elove.widget.grouplist.base.BaseRecyclerAdapter; +import com.jiuqi.elove.widget.grouplist.base.ViewHolder; + +/** + * Created by baozi on 2017/4/30. + */ + +public class HeaderAndFootWrapper extends BaseWrapper { + private static final int HEAD_ITEM = 1000; + private static final int FOOT_ITEM = 2000; + private SparseArray mHeaderViews = new SparseArray<>(); + private SparseArray mFootViews = new SparseArray<>(); + + public HeaderAndFootWrapper(BaseRecyclerAdapter adapter) { + super(adapter); + mAdapter.setCheckItem(new BaseRecyclerAdapter.CheckItem() { + @Override + public boolean checkPosition(int position) { + return !(isHeaderViewPos(position) || isFooterViewPos(position)); + } + + @Override + public int getAfterCheckingPosition(int position) { + return position - getHeadersCount(); + } + }); + } + + @Override + public T getData(int position) { + return mAdapter.getData(position); + } + + @Override + public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + if (mHeaderViews.get(viewType) != null) { + return ViewHolder.createViewHolder(mHeaderViews.get(viewType)); + } else if (mFootViews.get(viewType) != null) { + return ViewHolder.createViewHolder(mFootViews.get(viewType)); + } + return mAdapter.onCreateViewHolder(parent, viewType); + } + + @Override + public void onBindViewHolder(ViewHolder holder, int position) { + if (isHeaderViewPos(position) || isFooterViewPos(position)) { + return; + } + super.onBindViewHolder(holder, position - getHeadersCount()); + } + + @Override + public int getItemCount() { + return getHeadersCount() + getFootersCount() + mAdapter.getItemCount(); + } + + @Override + public int getItemViewType(int position) { + if (isHeaderViewPos(position)) { + return mHeaderViews.keyAt(position); + } else if (isFooterViewPos(position)) { + return mFootViews.keyAt(position - getHeadersCount() - mAdapter.getItemCount()); + } + return super.getItemViewType(position - getHeadersCount()); + } + + + public void addHeaderView(View view) { + mHeaderViews.put(HEAD_ITEM + mHeaderViews.size(), view); + } + + public void addFootView(View view) { + mFootViews.put(FOOT_ITEM + mFootViews.size(), view); + } + + private boolean isHeaderViewPos(int position) { + return position < getHeadersCount(); + } + + private boolean isFooterViewPos(int position) { + return position >= getHeadersCount() + mAdapter.getItemCount(); + } + + public int getHeadersCount() { + return mHeaderViews.size(); + } + + public int getFootersCount() { + return mFootViews.size(); + } + + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/adpater/wrapper/LoadingWrapper.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/adpater/wrapper/LoadingWrapper.java new file mode 100644 index 0000000000000000000000000000000000000000..07d66d36ce5266b3dc2e49cebf13bb548eb3aa2b --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/adpater/wrapper/LoadingWrapper.java @@ -0,0 +1,121 @@ +package com.jiuqi.elove.widget.grouplist.adpater.wrapper; + +import android.view.View; +import android.view.ViewGroup; + +import com.jiuqi.elove.widget.grouplist.base.BaseRecyclerAdapter; +import com.jiuqi.elove.widget.grouplist.base.ViewHolder; + +/** + * Created by baozi on 2017/4/30. + * 待开发 + */ + +public class LoadingWrapper extends BaseWrapper { + private static final int ITEM_TYPE_EMPTY = 3000; + private static final int ITEM_TYPE_LOADING = 4000; + private static final int ITEM_LOAD_MORE = 5000; + private View mEmptyView; + private int mEmptyLayoutId; + + private View mLoadMoreView; + private int mLoadMoreLayoutId; + + private View mLoadMoreOverView; + private int mLoadMoreOverLayoutId; + + private View mLoadingView; + private int mLoadingLayoutId; + private boolean isLoading; + + + public LoadingWrapper(BaseRecyclerAdapter adapter) { + super(adapter); + } + + private boolean isEmpty() { + return (mEmptyView != null || mEmptyLayoutId != 0) && mAdapter.getItemCount() == 0; + } + + private boolean isLoading() { + return (mLoadingView != null || mLoadingLayoutId != 0) && isLoading; + } + + public void setLoading(boolean loading) { + isLoading = loading; + if (loading) { + + } else { + + } + } + + + @Override + public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + if (viewType == ITEM_TYPE_LOADING) { + if (mLoadingView != null) { + return ViewHolder.createViewHolder(mLoadingView); + } else { + return ViewHolder.createViewHolder(parent, mLoadingLayoutId); + } + } + if (viewType == ITEM_TYPE_EMPTY) { + if (mEmptyView != null) { + return ViewHolder.createViewHolder(mEmptyView); + } else { + return ViewHolder.createViewHolder(parent, mEmptyLayoutId); + } + } + if (viewType == ITEM_LOAD_MORE) { + if (mEmptyView != null) { + return ViewHolder.createViewHolder(mLoadMoreView); + } else { + return ViewHolder.createViewHolder(parent, mLoadingLayoutId); + } + } + return super.onCreateViewHolder(parent, viewType); + } + + private boolean isLoadMoreViewPos(int position) { + return position >= mAdapter.getItemCount(); + } + + @Override + public int getItemViewType(int position) { + if (isLoading()) { + return ITEM_TYPE_LOADING; + } + if (isEmpty()) { + return ITEM_TYPE_EMPTY; + } + if (isLoadMoreViewPos(position)) { + return ITEM_LOAD_MORE; + } + return super.getItemViewType(position); + } + + @Override + public void onBindViewHolder(ViewHolder holder, int position) { + if (isEmpty() || isLoading() || isLoadMoreViewPos(position)) { + return; + } + super.onBindViewHolder(holder, position); + } + + @Override + public int getItemCount() { + if (isEmpty() || isLoading()) return 1; + return mAdapter.getItemCount(); + } + + + public void setEmptyView(View emptyView) { + mEmptyView = emptyView; + } + + public void setEmptyView(int layoutId) { + mEmptyLayoutId = layoutId; + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/adpater/wrapper/SwipeWrapper.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/adpater/wrapper/SwipeWrapper.java new file mode 100644 index 0000000000000000000000000000000000000000..ba6dbedd49b37099f422e4edc362c922d82f7c09 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/adpater/wrapper/SwipeWrapper.java @@ -0,0 +1,350 @@ +package com.jiuqi.elove.widget.grouplist.adpater.wrapper; + +import android.support.v7.widget.RecyclerView; +import android.util.SparseIntArray; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.jiuqi.elove.widget.grouplist.base.BaseRecyclerAdapter; +import com.jiuqi.elove.widget.grouplist.base.ViewHolder; +import com.jiuqi.elove.widget.grouplist.item.SwipeItem; +import com.jiuqi.elove.widget.grouplist.widget.swipe.SwipeItemMangerInterface; +import com.jiuqi.elove.widget.grouplist.widget.swipe.SwipeLayout; +import com.jiuqi.elove.widget.grouplist.widget.swipe.SwipeMode; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * Created by Administrator on 2017/8/18 0018. + */ + +public class SwipeWrapper extends BaseWrapper { + private static final int SWIPE_ITEM = 6666; + private SwipeItemMangerInterface mSwipeManger; + private HashMap swipeLayoutHashMap = new HashMap<>(); + private SparseIntArray swipeItemSparseArray = new SparseIntArray(); + + public SwipeWrapper(BaseRecyclerAdapter adapter) { + super(adapter); + } + + public void RegiestSwipeItem(SwipeItem swipeItem) { + + } + + public SwipeItemMangerInterface getSwipeManger() { + if (mSwipeManger == null) { + mSwipeManger = new SwipeItemMangerImpl(); + } + return mSwipeManger; + } + + public void setmSwipeManger(SwipeItemMangerInterface mSwipeManger) { + this.mSwipeManger = mSwipeManger; + } + + @Override + public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + int i = swipeItemSparseArray.get(viewType, -1); + if (i != -1) { +// ViewHolder viewHolder = super.onCreateViewHolder(parent, viewType); +// viewHolder.itemView.setOnClickListener(null); + +// LinearLayout linearLayout = new LinearLayout(parent.getContext()); +// linearLayout.setClickable(true); + SwipeLayout swipeLayout = new SwipeLayout(parent.getContext()); + View inflate = LayoutInflater.from(parent.getContext()).inflate(viewType, parent, false); +// viewHolder.itemView.setOnClickListener(new View.OnClickListener() { +// @Override +// public void onClick(View v) { +// Toast.makeText(v.getContext(), "123", Toast.LENGTH_SHORT).show(); +// } +// }); + swipeLayout.setLayoutParams(inflate.getLayoutParams()); + swipeLayout.addView(inflate); +// linearLayout.addView(swipeLayout); + ViewHolder swipeViewHolder = ViewHolder.createViewHolder(swipeLayout); + swipeLayoutHashMap.put(swipeViewHolder, swipeLayout); + super.onBindViewHolderClick(swipeViewHolder, inflate); + return swipeViewHolder; + } + return super.onCreateViewHolder(parent, viewType); + } + +// @Override +// public void onBindViewHolderClick(final ViewHolder holder, View view) { +// if (holder.itemView instanceof SwipeLayout) { +// if (mAdapter.getmOnItemClickListener() != null) { +// ((SwipeLayout) holder.itemView).getChildAt(0).setOnClickListener(new View.OnClickListener() { +// @Override +// public void onClick(View v) { +// mAdapter.getmOnItemClickListener().onItemClick(holder, getCheckItem().getAfterCheckingPosition(holder.getLayoutPosition())); +// } +// }); +// } +// } +// super.onBindViewHolderClick(holder, holder.itemView); +// } + + @Override + public int getItemViewType(int position) { + int itemViewType = super.getItemViewType(position); + int i = swipeItemSparseArray.get(itemViewType, -1); + if (i == -1) {//说明该type不存在; + Object o = getData(getCheckItem().getAfterCheckingPosition(position)); + if (o instanceof SwipeItem) { + swipeItemSparseArray.put(itemViewType, SWIPE_ITEM + swipeItemSparseArray.size()); + } + } + return super.getItemViewType(position); + } + + + @Override + public void onBindViewHolder(ViewHolder holder, int position) { + int checkPosition = getCheckPosition(position); + Object data = getData(checkPosition); + if (data instanceof SwipeItem) { + SwipeLayout swipeLayout = (SwipeLayout) holder.itemView; + checkSwipeLayout(holder, (SwipeItem) data); + getSwipeManger().bind(swipeLayout, ((SwipeItem) data).getSwipeLayoutId(), checkPosition); + ((SwipeItem) data).onBindSwipeView(holder, position); + } + super.onBindViewHolder(holder, position); + } + + private void checkSwipeLayout(ViewHolder holder, SwipeItem data) { + SwipeLayout view = swipeLayoutHashMap.get(holder); + Map dragEdgeMap = view.getDragEdgeMap(); + if (dragEdgeMap.get(data.getDragEdge()) == null) { + View inflate = LayoutInflater.from(view.getContext()).inflate(data.getSwipeLayoutId(), null); + view.addDrag(data.getDragEdge(), inflate, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); + } + } + + @Override + public void onAttachedToRecyclerView(RecyclerView recyclerView) { + super.onAttachedToRecyclerView(recyclerView); + recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { + @Override + public void onScrolled(RecyclerView recyclerView, int dx, int dy) { + super.onScrolled(recyclerView, dx, dy); + if (!getSwipeManger().isOpen(SwipeItemMangerImpl.INVALID_POSITION)) { + getSwipeManger().closeAllItems(); + } + } + }); + } + + + /** + * Swipe ItemMangerImpl is a helper class to help all the adapters to maintain open status. + */ + private class SwipeItemMangerImpl implements SwipeItemMangerInterface { + public static final int INVALID_POSITION = -1; + protected int mOpenPosition = INVALID_POSITION; + protected Set mOpenPositions = new HashSet(); + protected Set mShownLayouts = new HashSet(); + private SwipeMode mode = SwipeMode.Single; + + public SwipeItemMangerImpl() { + } + + public SwipeMode getMode() { + return mode; + } + + public void setMode(SwipeMode mode) { + this.mode = mode; + mOpenPositions.clear(); + mShownLayouts.clear(); + mOpenPosition = INVALID_POSITION; + } + + public void bind(SwipeLayout swipeLayout, int resId, int position) { + if (swipeLayout.getTag(resId) == null) { + OnLayoutListener onLayoutListener = new OnLayoutListener(position); + SwipeMemory swipeMemory = new SwipeMemory(position); + swipeLayout.addSwipeListener(swipeMemory); + swipeLayout.addOnLayoutListener(onLayoutListener); + swipeLayout.setTag(resId, new ValueBox(position, swipeMemory, onLayoutListener)); + mShownLayouts.add(swipeLayout); + } else { + ValueBox valueBox = (ValueBox) swipeLayout.getTag(resId); + valueBox.swipeMemory.setPosition(position); + valueBox.onLayoutListener.setPosition(position); + valueBox.position = position; + } + } + + @Override + public void openItem(int position) { + if (mode == SwipeMode.Multiple) { + if (!mOpenPositions.contains(position)) + mOpenPositions.add(position); + } else { + mOpenPosition = position; + } + getItemManager().notifyDataChanged(); + } + + @Override + public void closeItem(int position) { + if (mode == SwipeMode.Multiple) { + mOpenPositions.remove(position); + } else { + if (mOpenPosition == position) + mOpenPosition = INVALID_POSITION; + } + getItemManager().notifyDataChanged(); + } + + @Override + public void closeAllExcept(SwipeLayout layout) { + for (SwipeLayout s : mShownLayouts) { + if (s != layout) + s.close(); + } + } + + @Override + public void closeAllItems() { + if (mode == SwipeMode.Multiple) { + mOpenPositions.clear(); + } else { + mOpenPosition = INVALID_POSITION; + } + for (SwipeLayout s : mShownLayouts) { + s.close(); + } + } + + @Override + public void removeShownLayouts(SwipeLayout layout) { + mShownLayouts.remove(layout); + } + + @Override + public List getOpenItems() { + if (mode == SwipeMode.Multiple) { + return new ArrayList(mOpenPositions); + } else { + return Collections.singletonList(mOpenPosition); + } + } + + @Override + public List getOpenLayouts() { + return new ArrayList(mShownLayouts); + } + + @Override + public boolean isOpen(int position) { + if (mode == SwipeMode.Multiple) { + return mOpenPositions.contains(position); + } else { + return mOpenPosition == position; + } + } + + private class ValueBox { + OnLayoutListener onLayoutListener; + SwipeMemory swipeMemory; + int position; + + ValueBox(int position, SwipeMemory swipeMemory, OnLayoutListener onLayoutListener) { + this.swipeMemory = swipeMemory; + this.onLayoutListener = onLayoutListener; + this.position = position; + } + } + + private class OnLayoutListener implements SwipeLayout.OnLayout { + + private int position; + + OnLayoutListener(int position) { + this.position = position; + } + + public void setPosition(int position) { + this.position = position; + } + + @Override + public void onLayout(SwipeLayout v) { +// if (isOpen(position)) { +// v.open(false,false); +// } else { +// v.close(false,false); +// } + } + + } + + private class SwipeMemory implements SwipeLayout.SwipeListener { + + private int position; + + SwipeMemory(int position) { + this.position = position; + } + + @Override + public void onClose(SwipeLayout layout) { + if (mode == SwipeMode.Multiple) { + mOpenPositions.remove(position); + } else { + if (mOpenPosition == position) { + mOpenPosition = INVALID_POSITION; + } + } + } + + @Override + public void onUpdate(SwipeLayout layout, int leftOffset, int topOffset) { + + } + + @Override + public void onHandRelease(SwipeLayout layout, float xvel, float yvel) { + + } + + @Override + public void onStartOpen(SwipeLayout layout) { + if (mode == SwipeMode.Single) { + closeAllExcept(layout); + } + } + + @Override + public void onOpen(SwipeLayout layout) { + if (mode == SwipeMode.Multiple) + mOpenPositions.add(position); + else { + closeAllExcept(layout); + mOpenPosition = position; + } + } + + @Override + public void onStartClose(SwipeLayout layout) { + + } + + public void setPosition(int position) { + this.position = position; + } + } + + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/base/BaseItemData.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/base/BaseItemData.java new file mode 100644 index 0000000000000000000000000000000000000000..e715653d6d00c7d8003a18616d40072e8de24545 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/base/BaseItemData.java @@ -0,0 +1,21 @@ +package com.jiuqi.elove.widget.grouplist.base; + +/** + * Created by baozi on 2017/4/14. + */ + +/** + * javabean继承该类,后台返回的json中可以包含viewItemType,通过解析返回的viewItemType确定item样式 + */ +public abstract class BaseItemData { + + private int viewItemType; + + public int getViewItemType() { + return viewItemType; + } + + public void setViewItemType(int viewItemType) { + this.viewItemType = viewItemType; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/base/BaseRecyclerAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/base/BaseRecyclerAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..93f70b22cd0269923e010531d1e77b419cf72d89 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/base/BaseRecyclerAdapter.java @@ -0,0 +1,189 @@ +package com.jiuqi.elove.widget.grouplist.base; + +import android.support.v7.widget.RecyclerView; +import android.view.View; +import android.view.ViewGroup; + +import com.jiuqi.elove.widget.grouplist.manager.ItemManageImpl; +import com.jiuqi.elove.widget.grouplist.manager.ItemManager; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by zhy on 16/4/9. + */ +public abstract class BaseRecyclerAdapter extends RecyclerView.Adapter { + protected ItemManager mItemManager; + protected OnItemClickLitener mOnItemClickListener; + protected OnItemLongClickListener mOnItemLongClickListener; + private List mDatas; + private CheckItem mCheckItem; + +// public OnItemClickLitener getmOnItemClickListener() { +// return mOnItemClickListener; +// } + + public void setmOnItemClickListener(OnItemClickLitener mOnItemClickListener) { + this.mOnItemClickListener = mOnItemClickListener; + } + + + @Override + public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + ViewHolder holder = ViewHolder.createViewHolder(parent, viewType); + onBindViewHolderClick(holder, holder.itemView); + return holder; + } + + @Override + public void onBindViewHolder(ViewHolder holder, int position) { + onBindViewHolder(holder, getDatas().get(position), position); + } + + /** + * 实现item的点击事件 + */ + public void onBindViewHolderClick(final ViewHolder viewHolder, View view) { + //判断当前holder是否已经设置了点击事件 + if (!view.hasOnClickListeners()) { + view.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + //获得holder的position + int layoutPosition = viewHolder.getLayoutPosition(); + //检查item的position,是否可以点击. + if (getCheckItem().checkPosition(layoutPosition)) { + //检查并得到真实的position + int itemPosition = getCheckItem().getAfterCheckingPosition(layoutPosition); + if (mOnItemClickListener != null) { + mOnItemClickListener.onItemClick(viewHolder, itemPosition); + } + } + } + }); + } + view.setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + //获得holder的position + int layoutPosition = viewHolder.getLayoutPosition(); + //检查position是否可以点击 + if (getCheckItem().checkPosition(layoutPosition)) { + //检查并得到真实的position + int itemPosition = getCheckItem().getAfterCheckingPosition(layoutPosition); + if (mOnItemLongClickListener != null) { + return mOnItemLongClickListener.onItemLongClick(viewHolder, itemPosition); + } + } + return false; + } + }); + } + + @Override + public int getItemViewType(int position) { + return getLayoutId(position); + } + + @Override + public int getItemCount() { + return getDatas().size(); + } + + /** + * 默认实现的CheckItem接口 + * + * @return + */ + public CheckItem getCheckItem() { + if (mCheckItem == null) { + mCheckItem = new CheckItem() { + @Override + public boolean checkPosition(int position) { + return true; + } + + @Override + public int getAfterCheckingPosition(int position) { + return position; + } + }; + } + return mCheckItem; + } + + public void setCheckItem(CheckItem checkItem) { + this.mCheckItem = checkItem; + } + + public List getDatas() { + if (mDatas == null) { + mDatas = new ArrayList<>(); + } + return mDatas; + } + + public void setDatas(List datas) { + if (datas != null) { + getDatas().clear(); + getDatas().addAll(datas); + } + } + + public T getData(int position) { + if (position >= 0) { + return getDatas().get(position); + } + return null; + } + + /** + * 操作adapter + * + * @return + */ + public ItemManager getItemManager() { + if (mItemManager == null) { + mItemManager = new ItemManageImpl(this); + } + return mItemManager; + } + + public void setItemManager(ItemManager itemManager) { + mItemManager = itemManager; + } + + public void setOnItemClickListener(OnItemClickLitener onItemClickListener) { + mOnItemClickListener = onItemClickListener; + } + + public void setOnItemLongClickListener(OnItemLongClickListener onItemLongClickListener) { + mOnItemLongClickListener = onItemLongClickListener; + } + + public abstract int getLayoutId(int position); + + public abstract void onBindViewHolder(ViewHolder holder, T t, int position); + + public interface OnItemClickLitener { + void onItemClick(ViewHolder viewHolder, int position); + } + + public interface OnItemLongClickListener { + boolean onItemLongClick(ViewHolder viewHolder, int position); + } + + /** + * 检查item的position,主要viewholder的getLayoutPosition不一定是需要的. + * 比如添加了headview和footview. + */ + public interface CheckItem { + + boolean checkPosition(int position); + + int getAfterCheckingPosition(int position); + + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/base/ViewHolder.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/base/ViewHolder.java new file mode 100644 index 0000000000000000000000000000000000000000..e3a9cda3b92372911020b437d6e61eb1c1ff7bd6 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/base/ViewHolder.java @@ -0,0 +1,256 @@ +package com.jiuqi.elove.widget.grouplist.base; + +import android.annotation.SuppressLint; +import android.graphics.Bitmap; +import android.graphics.Paint; +import android.graphics.Typeface; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.support.v4.graphics.drawable.RoundedBitmapDrawable; +import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory; +import android.support.v7.widget.RecyclerView; +import android.text.TextUtils; +import android.text.util.Linkify; +import android.util.SparseArray; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.AlphaAnimation; +import android.widget.Checkable; +import android.widget.ImageView; +import android.widget.ProgressBar; +import android.widget.RatingBar; +import android.widget.TextView; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.target.BitmapImageViewTarget; +import com.jiuqi.elove.R; +import com.jiuqi.elove.application.EloveApplication; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.util.EasyGlide; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.SupportMultiScreenUtil; + +public class ViewHolder extends RecyclerView.ViewHolder { + private SparseArray mViews; + + public ViewHolder(View itemView) { + super(itemView); + mViews = new SparseArray<>(); + } + + public static ViewHolder createViewHolder(View itemView) { + return new ViewHolder(itemView); + } + + public static ViewHolder createViewHolder(ViewGroup parent, int layoutId) { + View itemView = LayoutInflater.from(parent.getContext()).inflate(layoutId, parent, + false); + SupportMultiScreenUtil.scale(itemView);//适配屏幕 + return createViewHolder(itemView); + } + + /** + * 通过viewId获取控件 + * + * @param viewId + * @return + */ + public T getView(int viewId) { + View view = mViews.get(viewId); + if (view == null) { + view = itemView.findViewById(viewId); + mViews.put(viewId, view); + } + return (T) view; + } + + + /****以下为辅助方法*****/ + + /** + * 设置TextView的值 + * + * @param viewId + * @param text + * @return + */ + public ViewHolder setText(int viewId, String text) { + TextView tv = getView(viewId); + tv.setText(text); + return this; + } + + public ViewHolder setImageResource(int viewId, int resId) { + ImageView view = getView(viewId); + view.setImageResource(resId); + return this; + } + + public ViewHolder setImageResourceCircle(int viewId, String resId){ + ImageView view = getView(viewId); + Glide.with(EloveApplication.getAppContext()).load(resId).asBitmap().centerCrop().dontAnimate().placeholder(R.drawable.img_yuanqueshengtouxiang).into(new BitmapImageViewTarget(view) { + @Override + protected void setResource(Bitmap resource) { + RoundedBitmapDrawable circularBitmapDrawable = + RoundedBitmapDrawableFactory.create(EloveApplication.getAppContext().getResources(), resource); + circularBitmapDrawable.setCircular(true); + view.setImageDrawable(circularBitmapDrawable); + } + }); + return this; + } + + public ViewHolder setImageTextCircle(int viewId, String namepre, String name){ + TextView view = getView(viewId); + EasyGlide.getInstance().showTextCircleAvatar(view,namepre,name); + return this; + } + + public ViewHolder setImageBitmap(int viewId, Bitmap bitmap) { + ImageView view = getView(viewId); + view.setImageBitmap(bitmap); + return this; + } + + public ViewHolder setImageDrawable(int viewId, Drawable drawable) { + ImageView view = getView(viewId); + view.setImageDrawable(drawable); + return this; + } + + public ViewHolder setBackgroundColor(int viewId, int color) { + View view = getView(viewId); + view.setBackgroundColor(color); + return this; + } + + public ViewHolder setBackgroundRes(int viewId, int backgroundRes) { + View view = getView(viewId); + view.setBackgroundResource(backgroundRes); + return this; + } + + public ViewHolder setTextColor(int viewId, int textColor) { + TextView view = getView(viewId); + view.setTextColor(textColor); + return this; + } + + public ViewHolder setTextColorRes(int viewId, int textColorRes) { + TextView view = getView(viewId); + view.setTextColor(view.getContext().getResources().getColor(textColorRes)); + return this; + } + + @SuppressLint("NewApi") + public ViewHolder setAlpha(int viewId, float value) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + getView(viewId).setAlpha(value); + } else { + // Pre-honeycomb hack to set Alpha value + AlphaAnimation alpha = new AlphaAnimation(value, value); + alpha.setDuration(0); + alpha.setFillAfter(true); + getView(viewId).startAnimation(alpha); + } + return this; + } + + public ViewHolder setVisible(int viewId, boolean visible) { + View view = getView(viewId); + view.setVisibility(visible ? View.VISIBLE : View.GONE); + return this; + } + + public ViewHolder linkify(int viewId) { + TextView view = getView(viewId); + Linkify.addLinks(view, Linkify.ALL); + return this; + } + + public ViewHolder setTypeface(Typeface typeface, int... viewIds) { + for (int viewId : viewIds) { + TextView view = getView(viewId); + view.setTypeface(typeface); + view.setPaintFlags(view.getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG); + } + return this; + } + + public ViewHolder setProgress(int viewId, int progress) { + ProgressBar view = getView(viewId); + view.setProgress(progress); + return this; + } + + public ViewHolder setProgress(int viewId, int progress, int max) { + ProgressBar view = getView(viewId); + view.setMax(max); + view.setProgress(progress); + return this; + } + + public ViewHolder setMax(int viewId, int max) { + ProgressBar view = getView(viewId); + view.setMax(max); + return this; + } + + public ViewHolder setRating(int viewId, float rating) { + RatingBar view = getView(viewId); + view.setRating(rating); + return this; + } + + public ViewHolder setRating(int viewId, float rating, int max) { + RatingBar view = getView(viewId); + view.setMax(max); + view.setRating(rating); + return this; + } + + public ViewHolder setTag(int viewId, Object tag) { + View view = getView(viewId); + view.setTag(tag); + return this; + } + + public ViewHolder setTag(int viewId, int key, Object tag) { + View view = getView(viewId); + view.setTag(key, tag); + return this; + } + + public ViewHolder setChecked(int viewId, boolean checked) { + Checkable view = getView(viewId); + view.setChecked(checked); + return this; + } + + /** + * 关于事件的 + */ + public ViewHolder setOnClickListener(int viewId, + View.OnClickListener listener) { + View view = getView(viewId); + view.setOnClickListener(listener); + return this; + } + + public ViewHolder setOnTouchListener(int viewId, + View.OnTouchListener listener) { + View view = getView(viewId); + view.setOnTouchListener(listener); + return this; + } + + public ViewHolder setOnLongClickListener(int viewId, + View.OnLongClickListener listener) { + View view = getView(viewId); + view.setOnLongClickListener(listener); + return this; + } + + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/factory/ItemConfig.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/factory/ItemConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..0a368cbecdd5b4010181cc7ed7afa0a3cb77f1b8 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/factory/ItemConfig.java @@ -0,0 +1,25 @@ +package com.jiuqi.elove.widget.grouplist.factory; + +import android.util.SparseArray; + +import com.jiuqi.elove.widget.grouplist.item.TreeItem; + +public class ItemConfig { + + private static SparseArray> treeviewHolderTypes; + + static { + treeviewHolderTypes = new SparseArray<>(); + } + + public static Class getTreeViewHolderType(int type) { + return treeviewHolderTypes.get(type); + } + + public static void addTreeHolderType(int type, Class clazz) { + if (null == clazz) { + return; + } + treeviewHolderTypes.put(type, clazz); + } +} \ No newline at end of file diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/factory/ItemHelperFactory.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/factory/ItemHelperFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..118be59e555942a58936d37d10d2e339746704b9 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/factory/ItemHelperFactory.java @@ -0,0 +1,184 @@ +package com.jiuqi.elove.widget.grouplist.factory; + +import android.support.annotation.NonNull; + +import com.jiuqi.elove.widget.grouplist.adpater.TreeRecyclerType; +import com.jiuqi.elove.widget.grouplist.base.BaseItemData; +import com.jiuqi.elove.widget.grouplist.item.TreeItem; +import com.jiuqi.elove.widget.grouplist.item.TreeItemGroup; +import com.jiuqi.elove.widget.grouplist.item.TreeSortItem; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by baozi on 2017/4/29. + */ + +public class ItemHelperFactory { + + + public static List createTreeItemList(List list, TreeItemGroup treeParentItem) { + if (null == list) { + return null; + } + ArrayList treeItemList = new ArrayList<>(); + int size = list.size(); + + for (int i = 0; i < size; i++) { + try { + BaseItemData itemData = list.get(i); + int viewItemType = itemData.getViewItemType(); + TreeItem treeItem; + //判断是否是TreeItem的子类 + if (ItemConfig.getTreeViewHolderType(viewItemType) != null) { + Class treeItemClass = ItemConfig.getTreeViewHolderType(viewItemType); + treeItem = treeItemClass.newInstance(); + treeItem.setData(itemData); + treeItem.setParentItem(treeParentItem); + treeItemList.add(treeItem); + } +// } else { + + } catch (Exception e) { + e.printStackTrace(); + } + } + return treeItemList; + } + + public static List createTreeItemList(List list, Class iClass, TreeItemGroup treeParentItem) { + if (null == list) { + return null; + } + int size = list.size(); + ArrayList treeItemList = new ArrayList<>(); + for (int i = 0; i < size; i++) { + try { + Object itemData = list.get(i); + if (iClass != null) { + TreeItem treeItem = iClass.newInstance(); + treeItem.setData(itemData); + treeItem.setParentItem(treeParentItem); + treeItemList.add(treeItem); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + return treeItemList; + } + + /** + * 创建排序List + * + * @param list + * @param iClass + * @param sortKey + * @param treeParentItem + * @return + */ + public static List createTreeSortList(List list, Class iClass, Object sortKey, TreeItemGroup treeParentItem) { + if (null == list) { + return null; + } + int size = list.size(); + ArrayList treeItemList = new ArrayList<>(); + for (int i = 0; i < size; i++) { + try { + Object itemData = list.get(i); + if (iClass != null) { + TreeSortItem sortItem = iClass.newInstance(); + sortItem.setData(itemData); + sortItem.setSortKey(sortKey); + sortItem.setParentItem(treeParentItem); + treeItemList.add(sortItem); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + return treeItemList; + } + + + /** + * 确定item的class类型,并且添加到了itemConfig,用该方法创建TreeItem + * + * @return + */ + public static TreeItem createTreeItem(D d) { + TreeItem treeItem = null; + try { + Class itemClass = ItemConfig.getTreeViewHolderType(d.getViewItemType()); + if (itemClass != null) { + treeItem = itemClass.newInstance(); + treeItem.setData(d); + } + } catch (Exception e) { + e.printStackTrace(); + } + return treeItem; + } + + /** + * 根据TreeRecyclerType获取子item集合,不包含TreeItemGroup自身 + * + * @param itemGroup + * @param type + * @return + */ + @NonNull + public static ArrayList getChildItemsWithType(TreeItemGroup itemGroup, TreeRecyclerType type) { + ArrayList baseItems = new ArrayList<>(); + List allChild = itemGroup.getChilds(); + int childCount = itemGroup.getChildCount(); + for (int i = 0; i < childCount; i++) { + //下级 + TreeItem baseItem = (TreeItem) allChild.get(i); + baseItems.add(baseItem); + //判断下级是否为TreeItemGroup + if (baseItem instanceof TreeItemGroup) { + List list = null; + switch (type) { + case SHOW_ALL: + //调用下级的getAllChilds遍历,相当于递归遍历 + list = ((TreeItemGroup) baseItem).getAllChilds(); + break; + case SHOW_EXPAND: + //根据isExpand,来决定是否展示 + if (((TreeItemGroup) baseItem).isExpand()) { + list = ((TreeItemGroup) baseItem).getExpandChilds(); + } + break; + case SHOW_DEFUTAL: + break; + } + if (list != null && list.size() > 0) { + baseItems.addAll(list); + } + } + } + return baseItems; + } + + @NonNull + public static ArrayList getChildItemsWithType(List treeItems, TreeRecyclerType type) { + if (type == TreeRecyclerType.SHOW_DEFUTAL) { + return (ArrayList) treeItems; + } + ArrayList baseItems = new ArrayList<>(); + int childCount = treeItems.size(); + for (int i = 0; i < childCount; i++) { + TreeItem treeItem = treeItems.get(i); + baseItems.add(treeItem); + if (treeItem instanceof TreeItemGroup) { + ArrayList childItems = getChildItemsWithType((TreeItemGroup) treeItem, type); + if (!childItems.isEmpty()) { + baseItems.addAll(childItems); + } + } + } + return baseItems; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/item/SwipeItem.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/item/SwipeItem.java new file mode 100644 index 0000000000000000000000000000000000000000..c9c3ad47bfc1822cef9b721bf71154242121e0fb --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/item/SwipeItem.java @@ -0,0 +1,17 @@ +package com.jiuqi.elove.widget.grouplist.item; + +import com.jiuqi.elove.widget.grouplist.base.ViewHolder; +import com.jiuqi.elove.widget.grouplist.widget.swipe.SwipeLayout; + +/** + * Created by Administrator on 2017/8/18 0018. + */ + +public interface SwipeItem { + + int getSwipeLayoutId(); + + SwipeLayout.DragEdge getDragEdge(); + + void onBindSwipeView(ViewHolder viewHolder, int position); +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/item/TreeItem.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/item/TreeItem.java new file mode 100644 index 0000000000000000000000000000000000000000..ff8ed5ba26fa4e4f3bf3914d699582f7dfbf2bc2 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/item/TreeItem.java @@ -0,0 +1,103 @@ +package com.jiuqi.elove.widget.grouplist.item; + +import android.content.res.Resources; +import android.support.annotation.Nullable; + +import com.jiuqi.elove.widget.grouplist.base.ViewHolder; +import com.jiuqi.elove.widget.grouplist.manager.ItemManager; + +/** + * TreeRecyclerAdapter的item + */ +public abstract class TreeItem { + /** + * 当前item的数据 + */ + protected D data; + private TreeItemGroup parentItem; + /** + * item在每行中的spansize + * 默认为0,如果为0则占满一行 + * + * @return 所占值, 比如recyclerview的列数为6, item需要占一半宽度, 就设置3 + */ + private int spanSize; + private ItemManager mItemManager; + + /** + * 获取当前item的父级 + * + * @return + */ + @Nullable + public TreeItemGroup getParentItem() { + return parentItem; + } + + public void setParentItem(TreeItemGroup parentItem) { + this.parentItem = parentItem; + } + + /** + * 应该在void onBindViewHolder(ViewHolder viewHolder)的地方使用. + * 如果要使用,可能为null,请加判断. + * + * @return + */ + public ItemManager getItemManager() { + return mItemManager; + } + + public void setItemManager(ItemManager itemManager) { + mItemManager = itemManager; + } + + public int getLayoutId() { + if (initLayoutId() <= 0) { + throw new Resources.NotFoundException("请设置布局Id"); + } + return initLayoutId(); + } + + + /** + * 该条目的布局id + * + * @return 布局id + */ + protected abstract int initLayoutId(); + + /** + * 觉得item的所占比例 + * + * @return , 如果设置的列数为6, 返回3, 则代表item占1半宽度 + */ + public int getSpanSize() { + return spanSize; + } + + public void setSpanSize(int spanSize) { + this.spanSize = spanSize; + } + + public D getData() { + return data; + } + + public void setData(D data) { + this.data = data; + } + + /** + * 抽象holder的绑定 + */ + public abstract void onBindViewHolder(ViewHolder viewHolder); + + /** + * 当前条目的点击回调 + */ + public void onClick() { + + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/item/TreeItemGroup.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/item/TreeItemGroup.java new file mode 100644 index 0000000000000000000000000000000000000000..45f608b27141f065b881f05909f105744b15870a --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/item/TreeItemGroup.java @@ -0,0 +1,153 @@ +package com.jiuqi.elove.widget.grouplist.item; + +import android.support.annotation.Nullable; + +import com.jiuqi.elove.widget.grouplist.adpater.TreeRecyclerType; +import com.jiuqi.elove.widget.grouplist.factory.ItemHelperFactory; + +import java.util.List; + +/** + * Created by baozi on 2016/12/22. + * //拥有子集 + * //子集可以是parent,也可以是child + * //可展开折叠 + */ + +public abstract class TreeItemGroup extends TreeItem { + + /** + * 持有的子item + */ + private List childs; + + /** + * 是否展开 + */ + private boolean isExpand = true; + + public boolean isExpand() { + return isExpand; + } + + /** + * 设置为传入 + * + * @param expand 传入true则展开,传入false则折叠 + */ + public void setExpand(boolean expand) { + if (isCanExpand()) { + isExpand = expand; + } + } + + /** + * 刷新Item的展开状态 + */ + public void notifyExpand() { + if (isExpand()) { + onExpand(); + } else { + onCollapse(); + } + } + + /** + * 展开 + */ + public void onExpand() { + isExpand = true; + int itemPosition = getItemManager().getItemPosition(this); + getItemManager().addItems(itemPosition + 1, getExpandChilds()); + getItemManager().notifyDataChanged(); + } + + /** + * 折叠 + */ + public void onCollapse() { + isExpand = false; + getItemManager().removeItems(getExpandChilds()); + getItemManager().notifyDataChanged(); + } + + /** + * 能否展开折叠 + * + * @return + */ + public boolean isCanExpand() { + return true; + } + + + /** + * 获得所有childs,包括子item的childs + * + * @return + */ + @Nullable + public List getExpandChilds() { + if (getChilds() == null) { + return null; + } + return ItemHelperFactory.getChildItemsWithType(this, TreeRecyclerType.SHOW_EXPAND); + } + + + public void setData(D data) { + super.setData(data); + childs = initChildsList(data); + } + + /** + * 获得所有childs,包括下下....级item的childs + * + * @return + */ + @Nullable + public List getAllChilds() { + if (getChilds() == null) { + return null; + } + return ItemHelperFactory.getChildItemsWithType(this, TreeRecyclerType.SHOW_ALL); + } + + /** + * 获得自己的childs. + * + * @return + */ + @Nullable + public List getChilds() { + return childs; + } + + public void setChilds(List childs) { + this.childs = childs; + } + + public int getChildCount() { + return childs == null ? 0 : childs.size(); + } + + /** + * 初始化子集 + * + * @param data + * @return + */ + protected abstract List initChildsList(D data); + + /** + * 是否消费child的click事件 + * + * @param child 具体click的item + * @return 返回true代表消费此次事件,child不会走onclick(),返回false说明不消费此次事件,child依然会走onclick() + */ + public boolean onInterceptClick(TreeItem child) { + return false; + } + + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/item/TreeSelectItemGroup.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/item/TreeSelectItemGroup.java new file mode 100644 index 0000000000000000000000000000000000000000..44c2e705695b98094d37261630d2f295da790686 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/item/TreeSelectItemGroup.java @@ -0,0 +1,88 @@ +package com.jiuqi.elove.widget.grouplist.item; + + +import android.support.annotation.NonNull; + +import java.util.ArrayList; +import java.util.List; + + +/** + * Created by baozi on 2016/12/22. + * 可以选中子item的TreeItemGroup,点击的item会保存起来.可以通过 getSelectItems()获得选中item + */ +public abstract class TreeSelectItemGroup + extends TreeItemGroup { + /** + * 选中的子item.只支持下一级,不支持下下级 + */ + private List selectItems; + + public List getSelectItems() { + if (selectItems == null) { + selectItems = new ArrayList<>(); + } + return selectItems; + } + + /** + * 子级是否有选中 + * + * @return + */ + public boolean isChildCheck() { + return !getSelectItems().isEmpty(); + } + + @Override + public boolean onInterceptClick(TreeItem child) { + addSelectItem(child); + return super.onInterceptClick(child); + } + + /** + * 添加选中的Item;不建议直接调用该方法, + * 当不需要用onInterceptClick()的时候,可以主动调用添加Item. + * < + * 如果onInterceptClick()生效,还主动调用该方法添加item,将无法添加. + * + * @param child + */ + protected void addSelectItem(@NonNull TreeItem child) { + if (selectFlag() == SelectFlag.SINGLE_CHOICE) { + if (getSelectItems().size() != 0) { + getSelectItems().set(0, child); + } else { + getSelectItems().add(child); + } + } else { + int index = getSelectItems().indexOf(child); + if (index == -1) {//不存在则添加 + getSelectItems().add(child); + } else {//存在则添加 + getSelectItems().remove(index); + } + } + } + + /** + * 必须指定选中样式 + * + * @return + */ + public abstract SelectFlag selectFlag(); + + /** + * 决定TreeSelectItemGroup的选中样式 + */ + public enum SelectFlag { + /** + * 单选 + */ + SINGLE_CHOICE, + /** + * 多选 + */ + MULTIPLE_CHOICE + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/item/TreeSortItem.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/item/TreeSortItem.java new file mode 100644 index 0000000000000000000000000000000000000000..d4816e26ad4d3ece424f9379039bdb8d73ca13cf --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/item/TreeSortItem.java @@ -0,0 +1,18 @@ +package com.jiuqi.elove.widget.grouplist.item; + +/** + * Created by Administrator on 2017/8/8 0008. + */ + +public abstract class TreeSortItem extends TreeItemGroup { + protected Object sortKey; + + public Object getSortKey() { + return sortKey; + } + + public void setSortKey(Object sortKey) { + this.sortKey = sortKey; + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/item/_ItemParent.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/item/_ItemParent.java new file mode 100644 index 0000000000000000000000000000000000000000..bdbdc93bd63c95e2f3408c42367c20c2b5ddd42b --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/item/_ItemParent.java @@ -0,0 +1,36 @@ +package com.jiuqi.elove.widget.grouplist.item; + + +import java.util.List; + +/** + * @author jlanglang 2016/12/23 17:04 + * @版本 2.0 + * @Change + */ +interface _ItemParent { + /** + * 是否允许展开 + * + * @return + */ + boolean isCanExpand(); + + /** + * 展开后的回调 + */ + void onExpand(); + + /** + * 折叠后的回调 + */ + void onCollapse(); + + /** + * 获取子集 + * + * @return + */ + List getChilds(); + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/manager/ItemManageImpl.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/manager/ItemManageImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..dba7df5b078711129ba62acd45fc681817e428e8 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/manager/ItemManageImpl.java @@ -0,0 +1,90 @@ +package com.jiuqi.elove.widget.grouplist.manager; + +import com.jiuqi.elove.widget.grouplist.base.BaseRecyclerAdapter; + +import java.util.List; + +/** + * 默认使用 notifyDataChanged();刷新. + * 如果使用带动画效果的,条目过多可能会出现卡顿. + */ +public class ItemManageImpl extends ItemManager { + + public ItemManageImpl(BaseRecyclerAdapter adapter) { + super(adapter); + } + + @Override + public void addItem(T item) { + getDatas().add(item); + notifyDataChanged(); + } + + @Override + public void addItem(int position, T item) { + getDatas().add(position, item); + notifyDataChanged(); + } + + @Override + public void addItems(List items) { + getDatas().addAll(items); + notifyDataChanged(); + } + + @Override + public void addItems(int position, List items) { + getDatas().addAll(position, items); + notifyDataChanged(); + } + + @Override + public void removeItem(T item) { + getDatas().remove(item); + notifyDataChanged(); + } + + @Override + public void removeItem(int position) { + getDatas().remove(position); + notifyDataChanged(); + } + + @Override + public void removeItems(List items) { + getDatas().removeAll(items); + notifyDataChanged(); + } + + @Override + public void replaceItem(int position, T item) { + getDatas().set(position, item); + notifyDataChanged(); + } + + @Override + public void replaceAllItem(List items) { + if (items != null) { + setDatas(items); + notifyDataChanged(); + } + } + + protected List getDatas() { + return getAdapter().getDatas(); + } + + protected void setDatas(List items) { + getAdapter().setDatas(items); + } + + @Override + public T getItem(int position) { + return getDatas().get(position); + } + + @Override + public int getItemPosition(T item) { + return getDatas().indexOf(item); + } +} \ No newline at end of file diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/manager/ItemManager.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/manager/ItemManager.java new file mode 100644 index 0000000000000000000000000000000000000000..bb0a4766571cd93b2d0661b1d4625244b4707aa7 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/manager/ItemManager.java @@ -0,0 +1,54 @@ +package com.jiuqi.elove.widget.grouplist.manager; + +import com.jiuqi.elove.widget.grouplist.base.BaseRecyclerAdapter; + +import java.util.List; + +public abstract class ItemManager { + + private BaseRecyclerAdapter mAdapter; + + public ItemManager(BaseRecyclerAdapter adapter) { + mAdapter = adapter; + } + + public BaseRecyclerAdapter getAdapter() { + return mAdapter; + } + + public void setAdapter(BaseRecyclerAdapter adapter) { + mAdapter = adapter; + } + + //增 + public abstract void addItem(T item); + + public abstract void addItem(int position, T item); + + public abstract void addItems(List items); + + public abstract void addItems(int position, List items); + + //删 + public abstract void removeItem(T item); + + public abstract void removeItem(int position); + + public abstract void removeItems(List items); + + + //改 + public abstract void replaceItem(int position, T item); + + public abstract void replaceAllItem(List items); + + //查 + public abstract T getItem(int position); + + public abstract int getItemPosition(T item); + + //刷新 + public void notifyDataChanged() { + mAdapter.notifyDataSetChanged(); + } +} \ No newline at end of file diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/widget/DragSelectRecyclerAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/widget/DragSelectRecyclerAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..273fa505edc10744e3f6a76a728da6ca58530ab9 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/widget/DragSelectRecyclerAdapter.java @@ -0,0 +1,173 @@ +package com.jiuqi.elove.widget.grouplist.widget; + +import android.os.Bundle; +import android.view.View; + +import com.jiuqi.elove.widget.grouplist.base.BaseRecyclerAdapter; +import com.jiuqi.elove.widget.grouplist.base.ViewHolder; + +import java.util.ArrayList; + +/** + * @author Aidan Follestad (afollestad) + */ +public abstract class DragSelectRecyclerAdapter extends BaseRecyclerAdapter { + + private ArrayList mSelectedIndices; + private SelectionListener mSelectionListener; + private int mLastCount = -1; + private int mMaxSelectionCount = -1; + protected DragSelectRecyclerAdapter() { + mSelectedIndices = new ArrayList<>(); + } + + private void fireSelectionListener() { + if (mLastCount == mSelectedIndices.size()) + return; + mLastCount = mSelectedIndices.size(); + if (mSelectionListener != null) + mSelectionListener.onDragSelectionChanged(mLastCount); + } + + @Override + public void onBindViewHolderClick(ViewHolder holder, View view) { + super.onBindViewHolderClick(holder, view); + holder.itemView.setTag(holder); + } + + public void setMaxSelectionCount(int maxSelectionCount) { + this.mMaxSelectionCount = maxSelectionCount; + } + + public void setSelectionListener(SelectionListener selectionListener) { + this.mSelectionListener = selectionListener; + } + + public void saveInstanceState(Bundle out) { + saveInstanceState("selected_indices", out); + } + + public void saveInstanceState(String key, Bundle out) { + out.putSerializable(key, mSelectedIndices); + } + + public void restoreInstanceState(Bundle in) { + restoreInstanceState("selected_indices", in); + } + + public void restoreInstanceState(String key, Bundle in) { + if (in != null && in.containsKey(key)) { + //noinspection unchecked + mSelectedIndices = (ArrayList) in.getSerializable(key); + if (mSelectedIndices == null) mSelectedIndices = new ArrayList<>(); + else fireSelectionListener(); + } + } + + public final void setSelected(int index, boolean selected) { + if (!isIndexSelectable(index)) + selected = false; + if (selected) { + if (!mSelectedIndices.contains(index) && + (mMaxSelectionCount == -1 || + mSelectedIndices.size() < mMaxSelectionCount)) { + mSelectedIndices.add(index); + notifyDataSetChanged(); + } + } else if (mSelectedIndices.contains(index)) { + mSelectedIndices.remove((Integer) index); + notifyDataSetChanged(); + } + fireSelectionListener(); + } + + public final boolean toggleSelected(int index) { + boolean selectedNow = false; + if (isIndexSelectable(index)) { + if (mSelectedIndices.contains(index)) { + mSelectedIndices.remove((Integer) index); + } else if (mMaxSelectionCount == -1 || + mSelectedIndices.size() < mMaxSelectionCount) { + mSelectedIndices.add(index); + selectedNow = true; + } + notifyDataSetChanged(); + } + fireSelectionListener(); + return selectedNow; + } + + protected boolean isIndexSelectable(int index) { + return true; + } + + public final void selectRange(int from, int to, int min, int max) { + if (from == to) { + // Finger is back on the initial item, unselect everything else + for (int i = min; i <= max; i++) { + if (i == from) continue; + setSelected(i, false); + } + fireSelectionListener(); + return; + } + + if (to < from) { + // When selecting from one to previous items + for (int i = to; i <= from; i++) + setSelected(i, true); + if (min > -1 && min < to) { + // Unselect items that were selected during this drag but no longer are + for (int i = min; i < to; i++) { + if (i == from) continue; + setSelected(i, false); + } + } + if (max > -1) { + for (int i = from + 1; i <= max; i++) + setSelected(i, false); + } + } else { + // When selecting from one to next items + for (int i = from; i <= to; i++) + setSelected(i, true); + if (max > -1 && max > to) { + // Unselect items that were selected during this drag but no longer are + for (int i = to + 1; i <= max; i++) { + if (i == from) continue; + setSelected(i, false); + } + } + if (min > -1) { + for (int i = min; i < from; i++) + setSelected(i, false); + } + } + fireSelectionListener(); + } + + public final void clearSelected() { + mSelectedIndices.clear(); + notifyDataSetChanged(); + fireSelectionListener(); + } + + public final int getSelectedCount() { + return mSelectedIndices.size(); + } + + public final ArrayList getSelectedIndices() { + if (mSelectedIndices == null) { + mSelectedIndices = new ArrayList<>(); + } + return mSelectedIndices; + } + + public final boolean isIndexSelected(int index) { + return mSelectedIndices.contains(index); + } + + public interface SelectionListener { + void onDragSelectionChanged(int count); + } +} \ No newline at end of file diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/widget/DragSelectRecyclerView.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/widget/DragSelectRecyclerView.java new file mode 100644 index 0000000000000000000000000000000000000000..063dce9843e8a62b0aa50bba8f8d0e2a431e0286 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/widget/DragSelectRecyclerView.java @@ -0,0 +1,290 @@ +package com.jiuqi.elove.widget.grouplist.widget; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.RectF; +import android.os.Handler; +import android.support.annotation.Nullable; +import android.support.v7.widget.RecyclerView; +import android.util.AttributeSet; +import android.util.Log; +import android.view.MotionEvent; +import android.view.View; + +import com.jiuqi.elove.R; + + +/** + * @author Aidan Follestad (afollestad) + */ +public class DragSelectRecyclerView extends RecyclerView { + + private static final boolean LOGGING = false; + private static final int AUTO_SCROLL_DELAY = 25; + private int mLastDraggedIndex = -1; + private DragSelectRecyclerAdapter mAdapter; + private int mInitialSelection; + private boolean mDragSelectActive; + private int mMinReached; + private int mMaxReached; + private int mHotspotHeight; + private int mHotspotOffsetTop; + private int mHotspotOffsetBottom; + private int mHotspotTopBoundStart; + private int mHotspotTopBoundEnd; + private int mHotspotBottomBoundStart; + private int mHotspotBottomBoundEnd; + private int mAutoScrollVelocity; + private FingerListener mFingerListener; + private boolean mInTopHotspot; + private boolean mInBottomHotspot; + private Handler mAutoScrollHandler; + private Runnable mAutoScrollRunnable = new Runnable() { + @Override + public void run() { + if (mAutoScrollHandler == null) + return; + if (mInTopHotspot) { + scrollBy(0, -mAutoScrollVelocity); + mAutoScrollHandler.postDelayed(this, AUTO_SCROLL_DELAY); + } else if (mInBottomHotspot) { + scrollBy(0, mAutoScrollVelocity); + mAutoScrollHandler.postDelayed(this, AUTO_SCROLL_DELAY); + } + } + }; + private RectF mTopBoundRect; + private RectF mBottomBoundRect; + private Paint mDebugPaint; + private boolean mDebugEnabled = false; + + public DragSelectRecyclerView(Context context) { + super(context); + init(context, null); + } + + public DragSelectRecyclerView(Context context, AttributeSet attrs) { + super(context, attrs); + init(context, attrs); + } + + public DragSelectRecyclerView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + init(context, attrs); + } + + private static void LOG(String message, Object... args) { + //noinspection PointlessBooleanExpression + if (!LOGGING) return; + if (args != null) { + Log.d("DragSelectRecyclerView", String.format(message, args)); + } else { + Log.d("DragSelectRecyclerView", message); + } + } + + private void init(Context context, AttributeSet attrs) { + mAutoScrollHandler = new Handler(); + final int defaultHotspotHeight = context.getResources().getDimensionPixelSize(R.dimen.dsrv_defaultHotspotHeight); + + if (attrs != null) { + TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.DragSelectRecyclerView, 0, 0); + try { + boolean autoScrollEnabled = a.getBoolean(R.styleable.DragSelectRecyclerView_dsrv_autoScrollEnabled, true); + if (!autoScrollEnabled) { + mHotspotHeight = -1; + mHotspotOffsetTop = -1; + mHotspotOffsetBottom = -1; + LOG("Auto-scroll disabled"); + } else { + mHotspotHeight = a.getDimensionPixelSize( + R.styleable.DragSelectRecyclerView_dsrv_autoScrollHotspotHeight, defaultHotspotHeight); + mHotspotOffsetTop = a.getDimensionPixelSize( + R.styleable.DragSelectRecyclerView_dsrv_autoScrollHotspot_offsetTop, 0); + mHotspotOffsetBottom = a.getDimensionPixelSize( + R.styleable.DragSelectRecyclerView_dsrv_autoScrollHotspot_offsetBottom, 0); + LOG("Hotspot height = %d", mHotspotHeight); + } + } finally { + a.recycle(); + } + } else { + mHotspotHeight = defaultHotspotHeight; + LOG("Hotspot height = %d", mHotspotHeight); + } + } + + public void setFingerListener(@Nullable FingerListener listener) { + this.mFingerListener = listener; + } + + @Override + protected void onMeasure(int widthSpec, int heightSpec) { + super.onMeasure(widthSpec, heightSpec); + if (mHotspotHeight > -1) { + mHotspotTopBoundStart = mHotspotOffsetTop; + mHotspotTopBoundEnd = mHotspotOffsetTop + mHotspotHeight; + mHotspotBottomBoundStart = (getMeasuredHeight() - mHotspotHeight) - mHotspotOffsetBottom; + mHotspotBottomBoundEnd = getMeasuredHeight() - mHotspotOffsetBottom; + LOG("RecyclerView height = %d", getMeasuredHeight()); + LOG("Hotspot top bound = %d to %d", mHotspotTopBoundStart, mHotspotTopBoundStart); + LOG("Hotspot bottom bound = %d to %d", mHotspotBottomBoundStart, mHotspotBottomBoundEnd); + } + } + + public boolean setDragSelectActive(boolean active, int initialSelection) { + if (active && mDragSelectActive) { + LOG("Drag selection is already active."); + return false; + } + mLastDraggedIndex = -1; + mMinReached = -1; + mMaxReached = -1; + if (!mAdapter.isIndexSelectable(initialSelection)) { + mDragSelectActive = false; + mInitialSelection = -1; + mLastDraggedIndex = -1; + LOG("Index %d is not selectable.", initialSelection); + return false; + } + mAdapter.setSelected(initialSelection, true); + mDragSelectActive = active; + mInitialSelection = initialSelection; + mLastDraggedIndex = initialSelection; + if (mFingerListener != null) + mFingerListener.onDragSelectFingerAction(true); + LOG("Drag selection initialized, starting at index %d.", initialSelection); + return true; + } + + /** + * Use {@link #setAdapter(DragSelectRecyclerAdapter)} instead. + */ + @Override + @Deprecated + public void setAdapter(Adapter adapter) { + if (!(adapter instanceof DragSelectRecyclerAdapter)) + throw new IllegalArgumentException("Adapter must be a DragSelectRecyclerAdapter."); + setAdapter((DragSelectRecyclerAdapter) adapter); + } + + public void setAdapter(DragSelectRecyclerAdapter adapter) { + super.setAdapter(adapter); + mAdapter = adapter; + } + + private int getItemPosition(MotionEvent e) { + final View v = findChildViewUnder(e.getX(), e.getY()); + if (v == null) return -2; + if (v.getTag() == null || !(v.getTag() instanceof ViewHolder)) + throw new IllegalStateException("Make sure your adapter makes a call to super.onBindViewHolder(), and doesn't override itemView tags."); + final ViewHolder holder = (ViewHolder) v.getTag(); + return holder.getAdapterPosition(); + } + + public final void enableDebug() { + mDebugEnabled = true; + invalidate(); + } + + @Override + public void onDraw(Canvas c) { + super.onDraw(c); + + if (mDebugEnabled) { + if (mDebugPaint == null) { + mDebugPaint = new Paint(); + mDebugPaint.setColor(Color.BLACK); + mDebugPaint.setAntiAlias(true); + mDebugPaint.setStyle(Paint.Style.FILL); + mTopBoundRect = new RectF(0, mHotspotTopBoundStart, getMeasuredWidth(), mHotspotTopBoundEnd); + mBottomBoundRect = new RectF(0, mHotspotBottomBoundStart, getMeasuredWidth(), mHotspotBottomBoundEnd); + } + c.drawRect(mTopBoundRect, mDebugPaint); + c.drawRect(mBottomBoundRect, mDebugPaint); + } + } + + @Override + public boolean dispatchTouchEvent(MotionEvent e) { + if (mAdapter.getItemCount() == 0) + return super.dispatchTouchEvent(e); + + if (mDragSelectActive) { + final int itemPosition = getItemPosition(e); + if (e.getAction() == MotionEvent.ACTION_UP) { + mDragSelectActive = false; + mInTopHotspot = false; + mInBottomHotspot = false; + mAutoScrollHandler.removeCallbacks(mAutoScrollRunnable); + if (mFingerListener != null) + mFingerListener.onDragSelectFingerAction(false); + return true; + } else if (e.getAction() == MotionEvent.ACTION_MOVE) { + // Check for auto-scroll hotspot + if (mHotspotHeight > -1) { + if (e.getY() >= mHotspotTopBoundStart && e.getY() <= mHotspotTopBoundEnd) { + mInBottomHotspot = false; + if (!mInTopHotspot) { + mInTopHotspot = true; + LOG("Now in TOP hotspot"); + mAutoScrollHandler.removeCallbacks(mAutoScrollRunnable); + mAutoScrollHandler.postDelayed(mAutoScrollRunnable, AUTO_SCROLL_DELAY); + } + + final float simulatedFactor = mHotspotTopBoundEnd - mHotspotTopBoundStart; + final float simulatedY = e.getY() - mHotspotTopBoundStart; + mAutoScrollVelocity = (int) (simulatedFactor - simulatedY) / 2; + + LOG("Auto scroll velocity = %d", mAutoScrollVelocity); + } else if (e.getY() >= mHotspotBottomBoundStart && e.getY() <= mHotspotBottomBoundEnd) { + mInTopHotspot = false; + if (!mInBottomHotspot) { + mInBottomHotspot = true; + LOG("Now in BOTTOM hotspot"); + mAutoScrollHandler.removeCallbacks(mAutoScrollRunnable); + mAutoScrollHandler.postDelayed(mAutoScrollRunnable, AUTO_SCROLL_DELAY); + } + + final float simulatedY = e.getY() + mHotspotBottomBoundEnd; + final float simulatedFactor = mHotspotBottomBoundStart + mHotspotBottomBoundEnd; + mAutoScrollVelocity = (int) (simulatedY - simulatedFactor) / 2; + + LOG("Auto scroll velocity = %d", mAutoScrollVelocity); + } else if (mInTopHotspot || mInBottomHotspot) { + LOG("Left the hotspot"); + mAutoScrollHandler.removeCallbacks(mAutoScrollRunnable); + mInTopHotspot = false; + mInBottomHotspot = false; + } + } + + // Drag selection logic + if (itemPosition != -2 && mLastDraggedIndex != itemPosition) { + mLastDraggedIndex = itemPosition; + if (mMinReached == -1) mMinReached = mLastDraggedIndex; + if (mMaxReached == -1) mMaxReached = mLastDraggedIndex; + if (mLastDraggedIndex > mMaxReached) + mMaxReached = mLastDraggedIndex; + if (mLastDraggedIndex < mMinReached) + mMinReached = mLastDraggedIndex; + if (mAdapter != null) + mAdapter.selectRange(mInitialSelection, mLastDraggedIndex, mMinReached, mMaxReached); + if (mInitialSelection == mLastDraggedIndex) { + mMinReached = mLastDraggedIndex; + mMaxReached = mLastDraggedIndex; + } + } + return true; + } + } + return super.dispatchTouchEvent(e); + } + + public interface FingerListener { + void onDragSelectFingerAction(boolean fingerDown); + } +} \ No newline at end of file diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/widget/TreeSortAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/widget/TreeSortAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..4f00375016cccddea7c558a820d4182ab7732253 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/widget/TreeSortAdapter.java @@ -0,0 +1,156 @@ +package com.jiuqi.elove.widget.grouplist.widget; + +import com.jiuqi.elove.widget.grouplist.adpater.TreeRecyclerAdapter; +import com.jiuqi.elove.widget.grouplist.base.BaseRecyclerAdapter; +import com.jiuqi.elove.widget.grouplist.item.TreeItem; +import com.jiuqi.elove.widget.grouplist.item.TreeSortItem; +import com.jiuqi.elove.widget.grouplist.manager.ItemManager; + +import java.util.HashMap; +import java.util.List; + + +/** + * Created by Administrator on 2017/8/8 0008. + * 索引adapter + */ + +public class TreeSortAdapter extends TreeRecyclerAdapter { + private final HashMap sortMap = new HashMap<>(); + private TreeSortManageWapper manageWapper; + + @Override + public void setDatas(List datas) { + super.setDatas(datas); + getItemManager().updateSorts(getDatas()); + } + + + public int getSortIndex(Object o) { + Integer integer = sortMap.get(o); + return integer == null ? -1 : integer; + } + + @Override + public TreeSortManageWapper getItemManager() { + if (manageWapper == null) { + manageWapper = new TreeSortManageWapper(this, super.getItemManager()); + } + return manageWapper; + } + + public class TreeSortManageWapper extends ItemManager { + ItemManager manager; + + public TreeSortManageWapper(BaseRecyclerAdapter adapter, ItemManager manager) { + super(adapter); + this.manager = manager; + } + + @Override + public void addItem(TreeItem treeItem) { + manager.addItem(treeItem); + updataSort(manager.getItemPosition(treeItem), treeItem); + } + + + @Override + public void addItem(int i, TreeItem treeItem) { + manager.addItem(i, treeItem); + updataSort(i, treeItem); + } + + @Override + public void addItems(List list) { + manager.addItems(list); + updateSorts(list); + } + + @Override + public void addItems(int i, List list) { + manager.addItems(i, list); + updateSorts(list); + } + + @Override + public BaseRecyclerAdapter getAdapter() { + return manager.getAdapter(); + } + + @Override + public void setAdapter(BaseRecyclerAdapter adapter) { + manager.setAdapter(adapter); + } + + @Override + public void removeItem(TreeItem treeItem) { + manager.removeItem(treeItem); + updataSort(getItemPosition(treeItem), treeItem); + } + + @Override + public void removeItem(int i) { + TreeItem item = manager.getItem(i); + if (item instanceof TreeSortItem) { + sortMap.remove(((TreeSortItem) item).getSortKey()); + } + manager.removeItem(i); + } + + @Override + public void removeItems(List list) { + manager.removeItems(list); + int size = list.size(); + for (int i = 0; i < size; i++) { + TreeItem item = list.get(i); + if (item instanceof TreeSortItem) { + sortMap.remove(((TreeSortItem) item).getSortKey()); + } + } + } + + @Override + public void replaceItem(int i, TreeItem treeItem) { + manager.replaceItem(i, treeItem); + updataSort(i, treeItem); + } + + @Override + public void replaceAllItem(List list) { + manager.replaceAllItem(list); + updateSorts(list); + } + + @Override + public TreeItem getItem(int i) { + return manager.getItem(i); + } + + @Override + public int getItemPosition(TreeItem treeItem) { + return manager.getItemPosition(treeItem); + } + + public void updateSorts(List treeItems) { + int size = treeItems.size(); + for (int i = 0; i < size; i++) { + TreeItem treeItem = treeItems.get(i); + if (treeItem instanceof TreeSortItem) { + sortMap.put(((TreeSortItem) treeItem).getSortKey(), getItemPosition(treeItem)); + } + } + } + + public void updataSort(TreeItem treeItem) { + if (treeItem instanceof TreeSortItem) { + sortMap.put(((TreeSortItem) treeItem).getSortKey(), getItemPosition(treeItem)); + } + } + + public void updataSort(int position, TreeItem treeItem) { + if (treeItem instanceof TreeSortItem) { + sortMap.put(((TreeSortItem) treeItem).getSortKey(), position); + } + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/widget/swipe/SwipeItemMangerInterface.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/widget/swipe/SwipeItemMangerInterface.java new file mode 100644 index 0000000000000000000000000000000000000000..a74cd42dec679b354612f1852d83c127a5902392 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/widget/swipe/SwipeItemMangerInterface.java @@ -0,0 +1,27 @@ +package com.jiuqi.elove.widget.grouplist.widget.swipe; + +import java.util.List; + +public interface SwipeItemMangerInterface { + void bind(SwipeLayout swipeLayout, int res, int position); + + void openItem(int position); + + void closeItem(int position); + + void closeAllExcept(SwipeLayout layout); + + void closeAllItems(); + + List getOpenItems(); + + List getOpenLayouts(); + + void removeShownLayouts(SwipeLayout layout); + + boolean isOpen(int position); + + SwipeMode getMode(); + + void setMode(SwipeMode mode); +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/widget/swipe/SwipeLayout.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/widget/swipe/SwipeLayout.java new file mode 100644 index 0000000000000000000000000000000000000000..3367ba98d545f98b1882742aafceb8ce516de62a --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/widget/swipe/SwipeLayout.java @@ -0,0 +1,1670 @@ +package com.jiuqi.elove.widget.grouplist.widget.swipe; + +import android.content.Context; +import android.graphics.Rect; +import android.support.v4.view.GravityCompat; +import android.support.v4.view.ViewCompat; +import android.support.v4.widget.ViewDragHelper; +import android.util.AttributeSet; +import android.view.GestureDetector; +import android.view.Gravity; +import android.view.HapticFeedbackConstants; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewConfiguration; +import android.view.ViewGroup; +import android.view.ViewParent; +import android.widget.AbsListView; +import android.widget.AdapterView; +import android.widget.FrameLayout; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import static com.jiuqi.elove.widget.grouplist.widget.swipe.SwipeLayout.ShowMode.LayDown; +import static com.jiuqi.elove.widget.grouplist.widget.swipe.SwipeLayout.ShowMode.PullOut; + +public class SwipeLayout extends FrameLayout { + @Deprecated + public static final int EMPTY_LAYOUT = -1; + private static final int DRAG_LEFT = 1; + private static final int DRAG_RIGHT = 2; + private static final int DRAG_TOP = 4; + private static final int DRAG_BOTTOM = 8; + private static final DragEdge DefaultDragEdge = DragEdge.Right; + OnClickListener clickListener; + OnLongClickListener longClickListener; + private int mTouchSlop; + private DragEdge mCurrentDragEdge = DefaultDragEdge; + private ViewDragHelper mDragHelper; + private int mDragDistance = 0; + private LinkedHashMap mDragEdges = new LinkedHashMap<>(); + private ShowMode mShowMode = PullOut; + private float[] mEdgeSwipesOffset = new float[4]; + private List mSwipeListeners = new ArrayList<>(); + private List mSwipeDeniers = new ArrayList<>(); + private Map> mRevealListeners = new HashMap<>(); + private Map mShowEntirely = new HashMap<>(); + private Map mViewBoundCache = new HashMap<>();//save all children's bound, restore in onLayout + private DoubleClickListener mDoubleClickListener; + private boolean mSwipeEnabled = true; + private boolean[] mSwipesEnabled = new boolean[]{true, true, true, true}; + private boolean mClickToClose = false; + private float mWillOpenPercentAfterOpen = 0.75f; + private float mWillOpenPercentAfterClose = 0.25f; + private int mEventCounter = 0; + private ViewDragHelper.Callback mDragHelperCallback = new ViewDragHelper.Callback() { + + boolean isCloseBeforeDrag = true; + + @Override + public int clampViewPositionHorizontal(View child, int left, int dx) { + if (child == getSurfaceView()) { + switch (mCurrentDragEdge) { + case Top: + case Bottom: + return getPaddingLeft(); + case Left: + if (left < getPaddingLeft()) return getPaddingLeft(); + if (left > getPaddingLeft() + mDragDistance) + return getPaddingLeft() + mDragDistance; + break; + case Right: + if (left > getPaddingLeft()) return getPaddingLeft(); + if (left < getPaddingLeft() - mDragDistance) + return getPaddingLeft() - mDragDistance; + break; + } + } else if (getCurrentBottomView() == child) { + + switch (mCurrentDragEdge) { + case Top: + case Bottom: + return getPaddingLeft(); + case Left: + if (mShowMode == PullOut) { + if (left > getPaddingLeft()) return getPaddingLeft(); + } + break; + case Right: + if (mShowMode == PullOut) { + if (left < getMeasuredWidth() - mDragDistance) { + return getMeasuredWidth() - mDragDistance; + } + } + break; + } + } + return left; + } + + @Override + public int clampViewPositionVertical(View child, int top, int dy) { + if (child == getSurfaceView()) { + switch (mCurrentDragEdge) { + case Left: + case Right: + return getPaddingTop(); + case Top: + if (top < getPaddingTop()) return getPaddingTop(); + if (top > getPaddingTop() + mDragDistance) + return getPaddingTop() + mDragDistance; + break; + case Bottom: + if (top < getPaddingTop() - mDragDistance) { + return getPaddingTop() - mDragDistance; + } + if (top > getPaddingTop()) { + return getPaddingTop(); + } + } + } else { + View surfaceView = getSurfaceView(); + int surfaceViewTop = surfaceView == null ? 0 : surfaceView.getTop(); + switch (mCurrentDragEdge) { + case Left: + case Right: + return getPaddingTop(); + case Top: + if (mShowMode == PullOut) { + if (top > getPaddingTop()) return getPaddingTop(); + } else { + if (surfaceViewTop + dy < getPaddingTop()) + return getPaddingTop(); + if (surfaceViewTop + dy > getPaddingTop() + mDragDistance) + return getPaddingTop() + mDragDistance; + } + break; + case Bottom: + if (mShowMode == PullOut) { + if (top < getMeasuredHeight() - mDragDistance) + return getMeasuredHeight() - mDragDistance; + } else { + if (surfaceViewTop + dy >= getPaddingTop()) + return getPaddingTop(); + if (surfaceViewTop + dy <= getPaddingTop() - mDragDistance) + return getPaddingTop() - mDragDistance; + } + } + } + return top; + } + + @Override + public boolean tryCaptureView(View child, int pointerId) { + boolean result = child == getSurfaceView() || getBottomViews().contains(child); + if (result) { + isCloseBeforeDrag = getOpenStatus() == Status.Close; + } + return result; + } + + @Override + public int getViewHorizontalDragRange(View child) { + return mDragDistance; + } + + @Override + public int getViewVerticalDragRange(View child) { + return mDragDistance; + } + + @Override + public void onViewReleased(View releasedChild, float xvel, float yvel) { + super.onViewReleased(releasedChild, xvel, yvel); + processHandRelease(xvel, yvel, isCloseBeforeDrag); + for (SwipeListener l : mSwipeListeners) { + l.onHandRelease(SwipeLayout.this, xvel, yvel); + } + + invalidate(); + } + + @Override + public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) { + View surfaceView = getSurfaceView(); + if (surfaceView == null) return; + View currentBottomView = getCurrentBottomView(); + int evLeft = surfaceView.getLeft(), + evRight = surfaceView.getRight(), + evTop = surfaceView.getTop(), + evBottom = surfaceView.getBottom(); + if (changedView == surfaceView) { + + if (mShowMode == PullOut && currentBottomView != null) { + if (mCurrentDragEdge == DragEdge.Left || mCurrentDragEdge == DragEdge.Right) { + currentBottomView.offsetLeftAndRight(dx); + } else { + currentBottomView.offsetTopAndBottom(dy); + } + } + + } else if (getBottomViews().contains(changedView)) { + + if (mShowMode == PullOut) { + surfaceView.offsetLeftAndRight(dx); + surfaceView.offsetTopAndBottom(dy); + } else { + Rect rect = computeBottomLayDown(mCurrentDragEdge); + if (currentBottomView != null) { + currentBottomView.layout(rect.left, rect.top, rect.right, rect.bottom); + } + + int newLeft = surfaceView.getLeft() + dx, newTop = surfaceView.getTop() + dy; + + if (mCurrentDragEdge == DragEdge.Left && newLeft < getPaddingLeft()) + newLeft = getPaddingLeft(); + else if (mCurrentDragEdge == DragEdge.Right && newLeft > getPaddingLeft()) + newLeft = getPaddingLeft(); + else if (mCurrentDragEdge == DragEdge.Top && newTop < getPaddingTop()) + newTop = getPaddingTop(); + else if (mCurrentDragEdge == DragEdge.Bottom && newTop > getPaddingTop()) + newTop = getPaddingTop(); + + surfaceView.layout(newLeft, newTop, newLeft + getMeasuredWidth(), newTop + getMeasuredHeight()); + } + } + + dispatchRevealEvent(evLeft, evTop, evRight, evBottom); + + dispatchSwipeEvent(evLeft, evTop, dx, dy); + + invalidate(); + + captureChildrenBound(); + } + }; + private List mOnLayoutListeners; + private boolean mIsBeingDragged; + private float sX = -1, sY = -1; + private Rect hitSurfaceRect; + private GestureDetector gestureDetector = new GestureDetector(getContext(), new SwipeDetector()); + + public SwipeLayout(Context context) { + this(context, null); + } + + public SwipeLayout(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public SwipeLayout(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + mDragHelper = ViewDragHelper.create(this, mDragHelperCallback); + mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop(); + +// TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SwipeLayout); +// int dragEdgeChoices = a.getInt(R.styleable.SwipeLayout_drag_edge, DRAG_RIGHT); + int dragEdgeChoices = DRAG_RIGHT; +// mEdgeSwipesOffset[DragEdge.Left.ordinal()] = a.getDimension(R.styleable.SwipeLayout_leftEdgeSwipeOffset, 0); +// mEdgeSwipesOffset[DragEdge.Right.ordinal()] = a.getDimension(R.styleable.SwipeLayout_rightEdgeSwipeOffset, 0); +// mEdgeSwipesOffset[DragEdge.Top.ordinal()] = a.getDimension(R.styleable.SwipeLayout_topEdgeSwipeOffset, 0); +// mEdgeSwipesOffset[DragEdge.Bottom.ordinal()] = a.getDimension(R.styleable.SwipeLayout_bottomEdgeSwipeOffset, 0); +// setClickToClose(a.getBoolean(R.styleable.SwipeLayout_clickToClose, mClickToClose)); + + if ((dragEdgeChoices & DRAG_LEFT) == DRAG_LEFT) { + mDragEdges.put(DragEdge.Left, null); + } + if ((dragEdgeChoices & DRAG_TOP) == DRAG_TOP) { + mDragEdges.put(DragEdge.Top, null); + } + if ((dragEdgeChoices & DRAG_RIGHT) == DRAG_RIGHT) { + mDragEdges.put(DragEdge.Right, null); + } + if ((dragEdgeChoices & DRAG_BOTTOM) == DRAG_BOTTOM) { + mDragEdges.put(DragEdge.Bottom, null); + } +// int ordinal = a.getInt(R.styleable.SwipeLayout_show_mode, PullOut.ordinal()); + mShowMode = ShowMode.values()[PullOut.ordinal()]; +// a.recycle(); + + } + + public void addSwipeListener(SwipeListener l) { + mSwipeListeners.add(l); + } + + public void removeSwipeListener(SwipeListener l) { + mSwipeListeners.remove(l); + } + + public void removeAllSwipeListener() { + mSwipeListeners.clear(); + } + + public void addSwipeDenier(SwipeDenier denier) { + mSwipeDeniers.add(denier); + } + + public void removeSwipeDenier(SwipeDenier denier) { + mSwipeDeniers.remove(denier); + } + + public void removeAllSwipeDeniers() { + mSwipeDeniers.clear(); + } + + /** + * bind a view with a specific + * + * @param childId the view id. + * @param l the target + */ + public void addRevealListener(int childId, OnRevealListener l) { + View child = findViewById(childId); + if (child == null) { + throw new IllegalArgumentException("Child does not belong to SwipeListener."); + } + + if (!mShowEntirely.containsKey(child)) { + mShowEntirely.put(child, false); + } + if (mRevealListeners.get(child) == null) + mRevealListeners.put(child, new ArrayList()); + + mRevealListeners.get(child).add(l); + } + + /** + * bind multiple views with an + * + * @param childIds the view id. + */ + public void addRevealListener(int[] childIds, OnRevealListener l) { + for (int i : childIds) + addRevealListener(i, l); + } + + public void removeRevealListener(int childId, OnRevealListener l) { + View child = findViewById(childId); + + if (child == null) return; + + mShowEntirely.remove(child); + if (mRevealListeners.containsKey(child)) mRevealListeners.get(child).remove(l); + } + + public void removeAllRevealListeners(int childId) { + View child = findViewById(childId); + if (child != null) { + mRevealListeners.remove(child); + mShowEntirely.remove(child); + } + } + + /** + * save children's bounds, so they can restore the bound in {@link #onLayout(boolean, int, int, int, int)} + */ + private void captureChildrenBound() { + View currentBottomView = getCurrentBottomView(); + if (getOpenStatus() == Status.Close) { + mViewBoundCache.remove(currentBottomView); + return; + } + + View[] views = new View[]{ + getSurfaceView(), + currentBottomView}; + for (View child : views) { + Rect rect = mViewBoundCache.get(child); + if (rect == null) { + rect = new Rect(); + mViewBoundCache.put(child, rect); + } + rect.left = child.getLeft(); + rect.top = child.getTop(); + rect.right = child.getRight(); + rect.bottom = child.getBottom(); + } + } + + /** + * the dispatchRevealEvent method may not always get accurate position, it + * makes the view may not always get the event when the view is totally + * show( fraction = 1), so , we need to calculate every time. + */ + protected boolean isViewTotallyFirstShowed(View child, Rect relativePosition, DragEdge edge, int surfaceLeft, + int surfaceTop, int surfaceRight, int surfaceBottom) { + if (mShowEntirely.get(child)) return false; + int childLeft = relativePosition.left; + int childRight = relativePosition.right; + int childTop = relativePosition.top; + int childBottom = relativePosition.bottom; + boolean r = false; + if (getShowMode() == LayDown) { + if ((edge == DragEdge.Right && surfaceRight <= childLeft) + || (edge == DragEdge.Left && surfaceLeft >= childRight) + || (edge == DragEdge.Top && surfaceTop >= childBottom) + || (edge == DragEdge.Bottom && surfaceBottom <= childTop)) r = true; + } else if (getShowMode() == PullOut) { + if ((edge == DragEdge.Right && childRight <= getWidth()) + || (edge == DragEdge.Left && childLeft >= getPaddingLeft()) + || (edge == DragEdge.Top && childTop >= getPaddingTop()) + || (edge == DragEdge.Bottom && childBottom <= getHeight())) r = true; + } + return r; + } + + protected boolean isViewShowing(View child, Rect relativePosition, DragEdge availableEdge, int surfaceLeft, + int surfaceTop, int surfaceRight, int surfaceBottom) { + int childLeft = relativePosition.left; + int childRight = relativePosition.right; + int childTop = relativePosition.top; + int childBottom = relativePosition.bottom; + if (getShowMode() == LayDown) { + switch (availableEdge) { + case Right: + if (surfaceRight > childLeft && surfaceRight <= childRight) { + return true; + } + break; + case Left: + if (surfaceLeft < childRight && surfaceLeft >= childLeft) { + return true; + } + break; + case Top: + if (surfaceTop >= childTop && surfaceTop < childBottom) { + return true; + } + break; + case Bottom: + if (surfaceBottom > childTop && surfaceBottom <= childBottom) { + return true; + } + break; + } + } else if (getShowMode() == PullOut) { + switch (availableEdge) { + case Right: + if (childLeft <= getWidth() && childRight > getWidth()) return true; + break; + case Left: + if (childRight >= getPaddingLeft() && childLeft < getPaddingLeft()) return true; + break; + case Top: + if (childTop < getPaddingTop() && childBottom >= getPaddingTop()) return true; + break; + case Bottom: + if (childTop < getHeight() && childTop >= getPaddingTop()) return true; + break; + } + } + return false; + } + + protected Rect getRelativePosition(View child) { + View t = child; + Rect r = new Rect(t.getLeft(), t.getTop(), 0, 0); + while (t.getParent() != null && t != getRootView()) { + t = (View) t.getParent(); + if (t == this) break; + r.left += t.getLeft(); + r.top += t.getTop(); + } + r.right = r.left + child.getMeasuredWidth(); + r.bottom = r.top + child.getMeasuredHeight(); + return r; + } + + protected void dispatchSwipeEvent(int surfaceLeft, int surfaceTop, int dx, int dy) { + DragEdge edge = getDragEdge(); + boolean open = true; + if (edge == DragEdge.Left) { + if (dx < 0) open = false; + } else if (edge == DragEdge.Right) { + if (dx > 0) open = false; + } else if (edge == DragEdge.Top) { + if (dy < 0) open = false; + } else if (edge == DragEdge.Bottom) { + if (dy > 0) open = false; + } + + dispatchSwipeEvent(surfaceLeft, surfaceTop, open); + } + + protected void dispatchSwipeEvent(int surfaceLeft, int surfaceTop, boolean open) { + safeBottomView(); + Status status = getOpenStatus(); + + if (!mSwipeListeners.isEmpty()) { + mEventCounter++; + for (SwipeListener l : mSwipeListeners) { + if (mEventCounter == 1) { + if (open) { + l.onStartOpen(this); + } else { + l.onStartClose(this); + } + } + l.onUpdate(SwipeLayout.this, surfaceLeft - getPaddingLeft(), surfaceTop - getPaddingTop()); + } + + if (status == Status.Close) { + for (SwipeListener l : mSwipeListeners) { + l.onClose(SwipeLayout.this); + } + mEventCounter = 0; + } + + if (status == Status.Open) { + View currentBottomView = getCurrentBottomView(); + if (currentBottomView != null) { + currentBottomView.setEnabled(true); + } + for (SwipeListener l : mSwipeListeners) { + l.onOpen(SwipeLayout.this); + } + mEventCounter = 0; + } + } + } + + /** + * prevent bottom view get any touch event. Especially in LayDown mode. + */ + private void safeBottomView() { + Status status = getOpenStatus(); + List bottoms = getBottomViews(); + + if (status == Status.Close) { + for (View bottom : bottoms) { + if (bottom != null && bottom.getVisibility() != INVISIBLE) { + bottom.setVisibility(INVISIBLE); + } + } + } else { + View currentBottomView = getCurrentBottomView(); + if (currentBottomView != null && currentBottomView.getVisibility() != VISIBLE) { + currentBottomView.setVisibility(VISIBLE); + } + } + } + + protected void dispatchRevealEvent(final int surfaceLeft, final int surfaceTop, final int surfaceRight, + final int surfaceBottom) { + if (mRevealListeners.isEmpty()) return; + for (Map.Entry> entry : mRevealListeners.entrySet()) { + View child = entry.getKey(); + Rect rect = getRelativePosition(child); + if (isViewShowing(child, rect, mCurrentDragEdge, surfaceLeft, surfaceTop, + surfaceRight, surfaceBottom)) { + mShowEntirely.put(child, false); + int distance = 0; + float fraction = 0f; + if (getShowMode() == LayDown) { + switch (mCurrentDragEdge) { + case Left: + distance = rect.left - surfaceLeft; + fraction = distance / (float) child.getWidth(); + break; + case Right: + distance = rect.right - surfaceRight; + fraction = distance / (float) child.getWidth(); + break; + case Top: + distance = rect.top - surfaceTop; + fraction = distance / (float) child.getHeight(); + break; + case Bottom: + distance = rect.bottom - surfaceBottom; + fraction = distance / (float) child.getHeight(); + break; + } + } else if (getShowMode() == PullOut) { + switch (mCurrentDragEdge) { + case Left: + distance = rect.right - getPaddingLeft(); + fraction = distance / (float) child.getWidth(); + break; + case Right: + distance = rect.left - getWidth(); + fraction = distance / (float) child.getWidth(); + break; + case Top: + distance = rect.bottom - getPaddingTop(); + fraction = distance / (float) child.getHeight(); + break; + case Bottom: + distance = rect.top - getHeight(); + fraction = distance / (float) child.getHeight(); + break; + } + } + + for (OnRevealListener l : entry.getValue()) { + l.onReveal(child, mCurrentDragEdge, Math.abs(fraction), distance); + if (Math.abs(fraction) == 1) { + mShowEntirely.put(child, true); + } + } + } + + if (isViewTotallyFirstShowed(child, rect, mCurrentDragEdge, surfaceLeft, surfaceTop, + surfaceRight, surfaceBottom)) { + mShowEntirely.put(child, true); + for (OnRevealListener l : entry.getValue()) { + if (mCurrentDragEdge == DragEdge.Left + || mCurrentDragEdge == DragEdge.Right) + l.onReveal(child, mCurrentDragEdge, 1, child.getWidth()); + else + l.onReveal(child, mCurrentDragEdge, 1, child.getHeight()); + } + } + + } + } + + @Override + public void computeScroll() { + super.computeScroll(); + if (mDragHelper.continueSettling(true)) { + ViewCompat.postInvalidateOnAnimation(this); + } + } + + public void addOnLayoutListener(OnLayout l) { + if (mOnLayoutListeners == null) mOnLayoutListeners = new ArrayList(); + mOnLayoutListeners.add(l); + } + + public void removeOnLayoutListener(OnLayout l) { + if (mOnLayoutListeners != null) mOnLayoutListeners.remove(l); + } + + public void clearDragEdge() { + mDragEdges.clear(); + } + + public void setDrag(DragEdge dragEdge, int childId) { + clearDragEdge(); + addDrag(dragEdge, childId); + } + + public void setDrag(DragEdge dragEdge, View child) { + clearDragEdge(); + addDrag(dragEdge, child); + } + + public void addDrag(DragEdge dragEdge, int childId) { + addDrag(dragEdge, findViewById(childId), null); + } + + public void addDrag(DragEdge dragEdge, View child) { + addDrag(dragEdge, child, null); + } + + public void addDrag(DragEdge dragEdge, View child, ViewGroup.LayoutParams params) { + if (child == null) return; + + if (params == null) { + params = generateDefaultLayoutParams(); + } + if (!checkLayoutParams(params)) { + params = generateLayoutParams(params); + } + int gravity = -1; + switch (dragEdge) { + case Left: + gravity = Gravity.LEFT; + break; + case Right: + gravity = Gravity.RIGHT; + break; + case Top: + gravity = Gravity.TOP; + break; + case Bottom: + gravity = Gravity.BOTTOM; + break; + } + if (params instanceof LayoutParams) { + ((LayoutParams) params).gravity = gravity; + } + try { + gravity = (Integer) params.getClass().getField("gravity").get(params); + } catch (Exception e) { + e.printStackTrace(); + } + + if (gravity > 0) { + gravity = GravityCompat.getAbsoluteGravity(gravity, ViewCompat.getLayoutDirection(this)); + + if ((gravity & Gravity.LEFT) == Gravity.LEFT) { + mDragEdges.put(DragEdge.Left, child); + } + if ((gravity & Gravity.RIGHT) == Gravity.RIGHT) { + mDragEdges.put(DragEdge.Right, child); + } + if ((gravity & Gravity.TOP) == Gravity.TOP) { + mDragEdges.put(DragEdge.Top, child); + } + if ((gravity & Gravity.BOTTOM) == Gravity.BOTTOM) { + mDragEdges.put(DragEdge.Bottom, child); + } + } else { + for (Map.Entry entry : mDragEdges.entrySet()) { + if (entry.getValue() == null) { + //means used the drag_edge attr, the no gravity child should be use set + mDragEdges.put(entry.getKey(), child); + break; + } + } + } + if (child.getParent() == this) { + return; + } + addView(child, 0, params); + } + +// @Override +// public void addView(View child, int index, ViewGroup.LayoutParams params) { +// if (child == null) return; +// int gravity = Gravity.NO_GRAVITY; +// try { +// gravity = (Integer) params.getClass().getField("gravity").get(params); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// +// if (gravity > 0) { +// gravity = GravityCompat.getAbsoluteGravity(gravity, ViewCompat.getLayoutDirection(this)); +// +// if ((gravity & Gravity.LEFT) == Gravity.LEFT) { +// mDragEdges.put(DragEdge.Left, child); +// } +// if ((gravity & Gravity.RIGHT) == Gravity.RIGHT) { +// mDragEdges.put(DragEdge.Right, child); +// } +// if ((gravity & Gravity.TOP) == Gravity.TOP) { +// mDragEdges.put(DragEdge.Top, child); +// } +// if ((gravity & Gravity.BOTTOM) == Gravity.BOTTOM) { +// mDragEdges.put(DragEdge.Bottom, child); +// } +// } else { +// for (Map.Entry entry : mDragEdges.entrySet()) { +// if (entry.getValue() == null) { +// //means used the drag_edge attr, the no gravity child should be use set +// mDragEdges.put(entry.getKey(), child); +// break; +// } +// } +// } +// if (child.getParent() == this) { +// return; +// } +// super.addView(child, index, params); +// } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + updateBottomViews(); + +// if (mOnLayoutListeners != null) for (int i = 0; i < mOnLayoutListeners.size(); i++) { +// mOnLayoutListeners.get(i).onLayout(this); +// } + } + + void layoutPullOut() { + View surfaceView = getSurfaceView(); + Rect surfaceRect = mViewBoundCache.get(surfaceView); + if (surfaceRect == null) surfaceRect = computeSurfaceLayoutArea(false); + if (surfaceView != null) { + surfaceView.layout(surfaceRect.left, surfaceRect.top, surfaceRect.right, surfaceRect.bottom); + bringChildToFront(surfaceView); + } + View currentBottomView = getCurrentBottomView(); + Rect bottomViewRect = mViewBoundCache.get(currentBottomView); + if (bottomViewRect == null) + bottomViewRect = computeBottomLayoutAreaViaSurface(PullOut, surfaceRect); + if (currentBottomView != null) { + currentBottomView.layout(bottomViewRect.left, bottomViewRect.top, bottomViewRect.right, bottomViewRect.bottom); + } + } + + void layoutLayDown() { + View surfaceView = getSurfaceView(); + Rect surfaceRect = mViewBoundCache.get(surfaceView); + if (surfaceRect == null) surfaceRect = computeSurfaceLayoutArea(false); + if (surfaceView != null) { + surfaceView.layout(surfaceRect.left, surfaceRect.top, surfaceRect.right, surfaceRect.bottom); + bringChildToFront(surfaceView); + } + View currentBottomView = getCurrentBottomView(); + Rect bottomViewRect = mViewBoundCache.get(currentBottomView); + if (bottomViewRect == null) + bottomViewRect = computeBottomLayoutAreaViaSurface(LayDown, surfaceRect); + if (currentBottomView != null) { + currentBottomView.layout(bottomViewRect.left, bottomViewRect.top, bottomViewRect.right, bottomViewRect.bottom); + } + } + + private void checkCanDrag(MotionEvent ev) { + if (mIsBeingDragged) return; + if (getOpenStatus() == Status.Middle) { + mIsBeingDragged = true; + return; + } + Status status = getOpenStatus(); + float distanceX = ev.getRawX() - sX; + float distanceY = ev.getRawY() - sY; + float angle = Math.abs(distanceY / distanceX); + angle = (float) Math.toDegrees(Math.atan(angle)); + if (getOpenStatus() == Status.Close) { + DragEdge dragEdge; + if (angle < 45) { + if (distanceX > 0 && isLeftSwipeEnabled()) { + dragEdge = DragEdge.Left; + } else if (distanceX < 0 && isRightSwipeEnabled()) { + dragEdge = DragEdge.Right; + } else return; + + } else { + if (distanceY > 0 && isTopSwipeEnabled()) { + dragEdge = DragEdge.Top; + } else if (distanceY < 0 && isBottomSwipeEnabled()) { + dragEdge = DragEdge.Bottom; + } else return; + } + setCurrentDragEdge(dragEdge); + } + + boolean doNothing = false; + if (mCurrentDragEdge == DragEdge.Right) { + boolean suitable = (status == Status.Open && distanceX > mTouchSlop) + || (status == Status.Close && distanceX < -mTouchSlop); + suitable = suitable || (status == Status.Middle); + + if (angle > 30 || !suitable) { + doNothing = true; + } + } + + if (mCurrentDragEdge == DragEdge.Left) { + boolean suitable = (status == Status.Open && distanceX < -mTouchSlop) + || (status == Status.Close && distanceX > mTouchSlop); + suitable = suitable || status == Status.Middle; + + if (angle > 30 || !suitable) { + doNothing = true; + } + } + + if (mCurrentDragEdge == DragEdge.Top) { + boolean suitable = (status == Status.Open && distanceY < -mTouchSlop) + || (status == Status.Close && distanceY > mTouchSlop); + suitable = suitable || status == Status.Middle; + + if (angle < 60 || !suitable) { + doNothing = true; + } + } + + if (mCurrentDragEdge == DragEdge.Bottom) { + boolean suitable = (status == Status.Open && distanceY > mTouchSlop) + || (status == Status.Close && distanceY < -mTouchSlop); + suitable = suitable || status == Status.Middle; + + if (angle < 60 || !suitable) { + doNothing = true; + } + } + mIsBeingDragged = !doNothing; + } + + @Override + public boolean onInterceptTouchEvent(MotionEvent ev) { + if (!isSwipeEnabled()) { + return false; + } + if (mClickToClose && getOpenStatus() == Status.Open && isTouchOnSurface(ev)) { + return true; + } + for (SwipeDenier denier : mSwipeDeniers) { + if (denier != null && denier.shouldDenySwipe(ev)) { + return false; + } + } + + switch (ev.getAction()) { + case MotionEvent.ACTION_DOWN: + mDragHelper.processTouchEvent(ev); + mIsBeingDragged = false; + sX = ev.getRawX(); + sY = ev.getRawY(); + //if the swipe is in middle state(scrolling), should intercept the touch + if (getOpenStatus() == Status.Middle) { + mIsBeingDragged = true; + } + break; + case MotionEvent.ACTION_MOVE: + boolean beforeCheck = mIsBeingDragged; + checkCanDrag(ev); + if (mIsBeingDragged) { + ViewParent parent = getParent(); + if (parent != null) { + parent.requestDisallowInterceptTouchEvent(true); + } + } + if (!beforeCheck && mIsBeingDragged) { + //let children has one chance to catch the touch, and request the swipe not intercept + //useful when swipeLayout wrap a swipeLayout or other gestural layout + return false; + } + break; + + case MotionEvent.ACTION_CANCEL: + case MotionEvent.ACTION_UP: + mIsBeingDragged = false; + mDragHelper.processTouchEvent(ev); + break; + default://handle other action, such as ACTION_POINTER_DOWN/UP + mDragHelper.processTouchEvent(ev); + } + return mIsBeingDragged; + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + if (!isSwipeEnabled()) return super.onTouchEvent(event); + int action = event.getActionMasked(); + gestureDetector.onTouchEvent(event); + + switch (action) { + case MotionEvent.ACTION_DOWN: + mDragHelper.processTouchEvent(event); + sX = event.getRawX(); + sY = event.getRawY(); + return true; + + case MotionEvent.ACTION_MOVE: { + //the drag state and the direction are already judged at onInterceptTouchEvent + checkCanDrag(event); + if (mIsBeingDragged) { + getParent().requestDisallowInterceptTouchEvent(true); + mDragHelper.processTouchEvent(event); + } + break; + } + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_CANCEL: + mIsBeingDragged = false; + mDragHelper.processTouchEvent(event); + break; + + default://handle other action, such as ACTION_POINTER_DOWN/UP + mDragHelper.processTouchEvent(event); + } + + return super.onTouchEvent(event) || mIsBeingDragged || action == MotionEvent.ACTION_DOWN; + } + + public boolean isClickToClose() { + return mClickToClose; + } + + public void setClickToClose(boolean mClickToClose) { + this.mClickToClose = mClickToClose; + } + + public boolean isSwipeEnabled() { + return mSwipeEnabled; + } + + public void setSwipeEnabled(boolean enabled) { + mSwipeEnabled = enabled; + } + + public boolean isLeftSwipeEnabled() { + View bottomView = mDragEdges.get(DragEdge.Left); + return bottomView != null && bottomView.getParent() == this + && bottomView != getSurfaceView() && mSwipesEnabled[DragEdge.Left.ordinal()]; + } + + public void setLeftSwipeEnabled(boolean leftSwipeEnabled) { + this.mSwipesEnabled[DragEdge.Left.ordinal()] = leftSwipeEnabled; + } + + public boolean isRightSwipeEnabled() { + View bottomView = mDragEdges.get(DragEdge.Right); + return bottomView != null && bottomView.getParent() == this + && bottomView != getSurfaceView() && mSwipesEnabled[DragEdge.Right.ordinal()]; + } + + public void setRightSwipeEnabled(boolean rightSwipeEnabled) { + this.mSwipesEnabled[DragEdge.Right.ordinal()] = rightSwipeEnabled; + } + + public boolean isTopSwipeEnabled() { + View bottomView = mDragEdges.get(DragEdge.Top); + return bottomView != null && bottomView.getParent() == this + && bottomView != getSurfaceView() && mSwipesEnabled[DragEdge.Top.ordinal()]; + } + + public void setTopSwipeEnabled(boolean topSwipeEnabled) { + this.mSwipesEnabled[DragEdge.Top.ordinal()] = topSwipeEnabled; + } + + public boolean isBottomSwipeEnabled() { + View bottomView = mDragEdges.get(DragEdge.Bottom); + return bottomView != null && bottomView.getParent() == this + && bottomView != getSurfaceView() && mSwipesEnabled[DragEdge.Bottom.ordinal()]; + } + + public void setBottomSwipeEnabled(boolean bottomSwipeEnabled) { + this.mSwipesEnabled[DragEdge.Bottom.ordinal()] = bottomSwipeEnabled; + } + + /*** + * Returns the percentage of revealing at which the view below should the view finish opening + * if it was already open before dragging + * + * @returns The percentage of view revealed to trigger, default value is 0.25 + */ + public float getWillOpenPercentAfterOpen() { + return mWillOpenPercentAfterOpen; + } + + /*** + * Allows to stablish at what percentage of revealing the view below should the view finish opening + * if it was already open before dragging + * + * @param willOpenPercentAfterOpen The percentage of view revealed to trigger, default value is 0.25 + */ + public void setWillOpenPercentAfterOpen(float willOpenPercentAfterOpen) { + this.mWillOpenPercentAfterOpen = willOpenPercentAfterOpen; + } + + /*** + * Returns the percentage of revealing at which the view below should the view finish opening + * if it was already closed before dragging + * + * @returns The percentage of view revealed to trigger, default value is 0.25 + */ + public float getWillOpenPercentAfterClose() { + return mWillOpenPercentAfterClose; + } + + /*** + * Allows to stablish at what percentage of revealing the view below should the view finish opening + * if it was already closed before dragging + * + * @param willOpenPercentAfterClose The percentage of view revealed to trigger, default value is 0.75 + */ + public void setWillOpenPercentAfterClose(float willOpenPercentAfterClose) { + this.mWillOpenPercentAfterClose = willOpenPercentAfterClose; + } + + private boolean insideAdapterView() { + return getAdapterView() != null; + } + + private AdapterView getAdapterView() { + ViewParent t = getParent(); + if (t instanceof AdapterView) { + return (AdapterView) t; + } + return null; + } + + private void performAdapterViewItemClick() { + if (getOpenStatus() != Status.Close) return; + ViewParent t = getParent(); + if (t instanceof AdapterView) { + AdapterView view = (AdapterView) t; + int p = view.getPositionForView(SwipeLayout.this); + if (p != AdapterView.INVALID_POSITION) { + view.performItemClick(view.getChildAt(p - view.getFirstVisiblePosition()), p, view + .getAdapter().getItemId(p)); + } + } + } + + private boolean performAdapterViewItemLongClick() { + if (getOpenStatus() != Status.Close) return false; + ViewParent t = getParent(); + if (t instanceof AdapterView) { + AdapterView view = (AdapterView) t; + int p = view.getPositionForView(SwipeLayout.this); + if (p == AdapterView.INVALID_POSITION) return false; + long vId = view.getItemIdAtPosition(p); + boolean handled = false; + try { + Method m = AbsListView.class.getDeclaredMethod("performLongPress", View.class, int.class, long.class); + m.setAccessible(true); + handled = (boolean) m.invoke(view, SwipeLayout.this, p, vId); + + } catch (Exception e) { + e.printStackTrace(); + + if (view.getOnItemLongClickListener() != null) { + handled = view.getOnItemLongClickListener().onItemLongClick(view, SwipeLayout.this, p, vId); + } + if (handled) { + view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); + } + } + return handled; + } + return false; + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + if (insideAdapterView()) { + if (clickListener == null) { + setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + performAdapterViewItemClick(); + } + }); + } + if (longClickListener == null) { + setOnLongClickListener(new OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + performAdapterViewItemLongClick(); + return true; + } + }); + } + } + } + + @Override + public void setOnClickListener(OnClickListener l) { + super.setOnClickListener(l); + clickListener = l; + } + + @Override + public void setOnLongClickListener(OnLongClickListener l) { + super.setOnLongClickListener(l); + longClickListener = l; + } + + private boolean isTouchOnSurface(MotionEvent ev) { + View surfaceView = getSurfaceView(); + if (surfaceView == null) { + return false; + } + if (hitSurfaceRect == null) { + hitSurfaceRect = new Rect(); + } + surfaceView.getHitRect(hitSurfaceRect); + return hitSurfaceRect.contains((int) ev.getX(), (int) ev.getY()); + } + + public DragEdge getDragEdge() { + return mCurrentDragEdge; + } + + /** + * Deprecated, use {@link #setDrag(DragEdge, View)} + */ + @Deprecated + public void setDragEdge(DragEdge dragEdge) { + clearDragEdge(); + if (getChildCount() >= 2) { + mDragEdges.put(dragEdge, getChildAt(getChildCount() - 2)); + } + setCurrentDragEdge(dragEdge); + } + + public int getDragDistance() { + return mDragDistance; + } + + /** + * set the drag distance, it will force set the bottom view's width or + * height via this value. + * + * @param max max distance in dp unit + */ + public void setDragDistance(int max) { + if (max < 0) max = 0; + mDragDistance = dp2px(max); + requestLayout(); + } + + public ShowMode getShowMode() { + return mShowMode; + } + + /** + * There are 2 diffirent show mode. + * + * @param mode + */ + public void setShowMode(ShowMode mode) { + mShowMode = mode; + requestLayout(); + } + + /** + * return null if there is no surface view(no children) + */ + public View getSurfaceView() { + if (getChildCount() == 0) return null; + return getChildAt(getChildCount() - 1); + } + + /** + * return null if there is no bottom view + */ + public View getCurrentBottomView() { + List bottoms = getBottomViews(); + if (mCurrentDragEdge.ordinal() < bottoms.size()) { + return bottoms.get(mCurrentDragEdge.ordinal()); + } + return null; + } + + /** + * @return all bottomViews: left, top, right, bottom (may null if the edge is not set) + */ + public List getBottomViews() { + ArrayList bottoms = new ArrayList(); + for (DragEdge dragEdge : DragEdge.values()) { + bottoms.add(mDragEdges.get(dragEdge)); + } + return bottoms; + } + + /** + * get the open status. + *

    + * Middle. + */ + public Status getOpenStatus() { + View surfaceView = getSurfaceView(); + if (surfaceView == null) { + return Status.Close; + } + int surfaceLeft = surfaceView.getLeft(); + int surfaceTop = surfaceView.getTop(); + if (surfaceLeft == getPaddingLeft() && surfaceTop == getPaddingTop()) return Status.Close; + + if (surfaceLeft == (getPaddingLeft() - mDragDistance) || surfaceLeft == (getPaddingLeft() + mDragDistance) + || surfaceTop == (getPaddingTop() - mDragDistance) || surfaceTop == (getPaddingTop() + mDragDistance)) + return Status.Open; + + return Status.Middle; + } + + /** + * Process the surface release event. + * + * @param xvel xVelocity + * @param yvel yVelocity + * @param isCloseBeforeDragged the open state before drag + */ + protected void processHandRelease(float xvel, float yvel, boolean isCloseBeforeDragged) { + float minVelocity = mDragHelper.getMinVelocity(); + View surfaceView = getSurfaceView(); + DragEdge currentDragEdge = mCurrentDragEdge; + if (currentDragEdge == null || surfaceView == null) { + return; + } + float willOpenPercent = (isCloseBeforeDragged ? mWillOpenPercentAfterClose : mWillOpenPercentAfterOpen); + if (currentDragEdge == DragEdge.Left) { + if (xvel > minVelocity) open(); + else if (xvel < -minVelocity) close(); + else { + float openPercent = 1f * getSurfaceView().getLeft() / mDragDistance; + if (openPercent > willOpenPercent) open(); + else close(); + } + } else if (currentDragEdge == DragEdge.Right) { + if (xvel > minVelocity) close(); + else if (xvel < -minVelocity) open(); + else { + float openPercent = 1f * (-getSurfaceView().getLeft()) / mDragDistance; + if (openPercent > willOpenPercent) open(); + else close(); + } + } else if (currentDragEdge == DragEdge.Top) { + if (yvel > minVelocity) open(); + else if (yvel < -minVelocity) close(); + else { + float openPercent = 1f * getSurfaceView().getTop() / mDragDistance; + if (openPercent > willOpenPercent) open(); + else close(); + } + } else if (currentDragEdge == DragEdge.Bottom) { + if (yvel > minVelocity) close(); + else if (yvel < -minVelocity) open(); + else { + float openPercent = 1f * (-getSurfaceView().getTop()) / mDragDistance; + if (openPercent > willOpenPercent) open(); + else close(); + } + } + } + + /** + * smoothly open surface. + */ + public void open() { + open(true, true); + } + + public void open(boolean smooth) { + open(smooth, true); + } + + public void open(boolean smooth, boolean notify) { + View surface = getSurfaceView(), bottom = getCurrentBottomView(); + if (surface == null) { + return; + } + int dx, dy; + Rect rect = computeSurfaceLayoutArea(true); + if (smooth) { + mDragHelper.smoothSlideViewTo(surface, rect.left, rect.top); + } else { + dx = rect.left - surface.getLeft(); + dy = rect.top - surface.getTop(); + surface.layout(rect.left, rect.top, rect.right, rect.bottom); + if (getShowMode() == PullOut) { + Rect bRect = computeBottomLayoutAreaViaSurface(PullOut, rect); + if (bottom != null) { + bottom.layout(bRect.left, bRect.top, bRect.right, bRect.bottom); + } + } + if (notify) { + dispatchRevealEvent(rect.left, rect.top, rect.right, rect.bottom); + dispatchSwipeEvent(rect.left, rect.top, dx, dy); + } else { + safeBottomView(); + } + } + invalidate(); + } + + public void open(DragEdge edge) { + setCurrentDragEdge(edge); + open(true, true); + } + + public void open(boolean smooth, DragEdge edge) { + setCurrentDragEdge(edge); + open(smooth, true); + } + + public void open(boolean smooth, boolean notify, DragEdge edge) { + setCurrentDragEdge(edge); + open(smooth, notify); + } + + /** + * smoothly close surface. + */ + public void close() { + close(true, true); + } + + public void close(boolean smooth) { + close(smooth, true); + } + + /** + * close surface + * + * @param smooth smoothly or not. + * @param notify if notify all the listeners. + */ + public void close(boolean smooth, boolean notify) { + View surface = getSurfaceView(); + if (surface == null) { + return; + } + int dx, dy; + if (smooth) + mDragHelper.smoothSlideViewTo(getSurfaceView(), getPaddingLeft(), getPaddingTop()); + else { + Rect rect = computeSurfaceLayoutArea(false); + dx = rect.left - surface.getLeft(); + dy = rect.top - surface.getTop(); + surface.layout(rect.left, rect.top, rect.right, rect.bottom); + if (notify) { + dispatchRevealEvent(rect.left, rect.top, rect.right, rect.bottom); + dispatchSwipeEvent(rect.left, rect.top, dx, dy); + } else { + safeBottomView(); + } + } + invalidate(); + } + + public void toggle() { + toggle(true); + } + + public void toggle(boolean smooth) { + if (getOpenStatus() == Status.Open) + close(smooth); + else if (getOpenStatus() == Status.Close) open(smooth); + } + + /** + * a helper function to compute the Rect area that surface will hold in. + * + * @param open open status or close status. + */ + private Rect computeSurfaceLayoutArea(boolean open) { + int l = getPaddingLeft(), t = getPaddingTop(); + if (open) { + if (mCurrentDragEdge == DragEdge.Left) + l = getPaddingLeft() + mDragDistance; + else if (mCurrentDragEdge == DragEdge.Right) + l = getPaddingLeft() - mDragDistance; + else if (mCurrentDragEdge == DragEdge.Top) + t = getPaddingTop() + mDragDistance; + else t = getPaddingTop() - mDragDistance; + } + return new Rect(l, t, l + getMeasuredWidth(), t + getMeasuredHeight()); + } + + private Rect computeBottomLayoutAreaViaSurface(ShowMode mode, Rect surfaceArea) { + Rect rect = surfaceArea; + View bottomView = getCurrentBottomView(); + + int bl = rect.left, bt = rect.top, br = rect.right, bb = rect.bottom; + if (mode == PullOut) { + if (mCurrentDragEdge == DragEdge.Left) + bl = rect.left - mDragDistance; + else if (mCurrentDragEdge == DragEdge.Right) + bl = rect.right; + else if (mCurrentDragEdge == DragEdge.Top) + bt = rect.top - mDragDistance; + else bt = rect.bottom; + + if (mCurrentDragEdge == DragEdge.Left || mCurrentDragEdge == DragEdge.Right) { + bb = rect.bottom; + br = bl + (bottomView == null ? 0 : bottomView.getMeasuredWidth()); + } else { + bb = bt + (bottomView == null ? 0 : bottomView.getMeasuredHeight()); + br = rect.right; + } + } else if (mode == LayDown) { + if (mCurrentDragEdge == DragEdge.Left) + br = bl + mDragDistance; + else if (mCurrentDragEdge == DragEdge.Right) + bl = br - mDragDistance; + else if (mCurrentDragEdge == DragEdge.Top) + bb = bt + mDragDistance; + else bt = bb - mDragDistance; + + } + return new Rect(bl, bt, br, bb); + + } + + private Rect computeBottomLayDown(DragEdge dragEdge) { + int bl = getPaddingLeft(), bt = getPaddingTop(); + int br, bb; + if (dragEdge == DragEdge.Right) { + bl = getMeasuredWidth() - mDragDistance; + } else if (dragEdge == DragEdge.Bottom) { + bt = getMeasuredHeight() - mDragDistance; + } + if (dragEdge == DragEdge.Left || dragEdge == DragEdge.Right) { + br = bl + mDragDistance; + bb = bt + getMeasuredHeight(); + } else { + br = bl + getMeasuredWidth(); + bb = bt + mDragDistance; + } + return new Rect(bl, bt, br, bb); + } + + public void setOnDoubleClickListener(DoubleClickListener doubleClickListener) { + mDoubleClickListener = doubleClickListener; + } + + private int dp2px(float dp) { + return (int) (dp * getContext().getResources().getDisplayMetrics().density + 0.5f); + } + + public void onViewRemoved(View child) { + for (Map.Entry entry : new HashMap(mDragEdges).entrySet()) { + if (entry.getValue() == child) { + mDragEdges.remove(entry.getKey()); + } + } + } + + public Map getDragEdgeMap() { + return mDragEdges; + } + + /** + * Deprecated, use {@link #getDragEdgeMap()} + */ + @Deprecated + public List getDragEdges() { + return new ArrayList(mDragEdges.keySet()); + } + + /** + * Deprecated, use {@link #addDrag(DragEdge, View)} + */ + @Deprecated + public void setDragEdges(DragEdge... mDragEdges) { + clearDragEdge(); + setDragEdges(Arrays.asList(mDragEdges)); + } + + /** + * Deprecated, use {@link #setDrag(DragEdge, View)} + */ + @Deprecated + public void setDragEdges(List dragEdges) { + clearDragEdge(); + for (int i = 0, size = Math.min(dragEdges.size(), getChildCount() - 1); i < size; i++) { + DragEdge dragEdge = dragEdges.get(i); + mDragEdges.put(dragEdge, getChildAt(i)); + } + if (dragEdges.size() == 0 || dragEdges.contains(DefaultDragEdge)) { + setCurrentDragEdge(DefaultDragEdge); + } else { + setCurrentDragEdge(dragEdges.get(0)); + } + } + + /** + * Deprecated, use {@link #addDrag(DragEdge, View)} + * When using multiple drag edges it's a good idea to pass the ids of the views that + * you're using for the left, right, top bottom views (-1 if you're not using a particular view) + */ + @Deprecated + public void setBottomViewIds(int leftId, int rightId, int topId, int bottomId) { + addDrag(DragEdge.Left, findViewById(leftId)); + addDrag(DragEdge.Right, findViewById(rightId)); + addDrag(DragEdge.Top, findViewById(topId)); + addDrag(DragEdge.Bottom, findViewById(bottomId)); + } + + private float getCurrentOffset() { + if (mCurrentDragEdge == null) return 0; + return mEdgeSwipesOffset[mCurrentDragEdge.ordinal()]; + } + + private void setCurrentDragEdge(DragEdge dragEdge) { + mCurrentDragEdge = dragEdge; + updateBottomViews(); + } + + private void updateBottomViews() { + View currentBottomView = getCurrentBottomView(); + if (currentBottomView != null) { + if (mCurrentDragEdge == DragEdge.Left || mCurrentDragEdge == DragEdge.Right) { + mDragDistance = currentBottomView.getMeasuredWidth() - dp2px(getCurrentOffset()); + } else { + mDragDistance = currentBottomView.getMeasuredHeight() - dp2px(getCurrentOffset()); + } + } + if (mShowMode == PullOut) { + layoutPullOut(); + } else if (mShowMode == LayDown) { + layoutLayDown(); + } + + safeBottomView(); + } + + public enum DragEdge { + Left, + Top, + Right, + Bottom + } + + public enum ShowMode { + LayDown, + PullOut + } + + public enum Status { + Middle, + Open, + Close + } + + public interface SwipeListener { + void onStartOpen(SwipeLayout layout); + + void onOpen(SwipeLayout layout); + + void onStartClose(SwipeLayout layout); + + void onClose(SwipeLayout layout); + + void onUpdate(SwipeLayout layout, int leftOffset, int topOffset); + + void onHandRelease(SwipeLayout layout, float xvel, float yvel); + } + + public interface SwipeDenier { + /* + * Called in onInterceptTouchEvent Determines if this swipe event should + * be denied Implement this interface if you are using views with swipe + * gestures As a child of SwipeLayout + * + * @return true deny false allow + */ + boolean shouldDenySwipe(MotionEvent ev); + } + + public interface OnRevealListener { + void onReveal(View child, DragEdge edge, float fraction, int distance); + } + + /** + * {@link OnLayoutChangeListener} added in API 11. I need + * to support it from API 8. + */ + public interface OnLayout { + void onLayout(SwipeLayout v); + } + + public interface DoubleClickListener { + void onDoubleClick(SwipeLayout layout, boolean surface); + } + + class SwipeDetector extends GestureDetector.SimpleOnGestureListener { + @Override + public boolean onSingleTapUp(MotionEvent e) { + if (mClickToClose && isTouchOnSurface(e)) { + close(); + } + return super.onSingleTapUp(e); + } + + @Override + public boolean onDoubleTap(MotionEvent e) { + if (mDoubleClickListener != null) { + View target; + View bottom = getCurrentBottomView(); + View surface = getSurfaceView(); + if (bottom != null && e.getX() > bottom.getLeft() && e.getX() < bottom.getRight() + && e.getY() > bottom.getTop() && e.getY() < bottom.getBottom()) { + target = bottom; + } else { + target = surface; + } + mDoubleClickListener.onDoubleClick(SwipeLayout.this, target == surface); + } + return true; + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/widget/swipe/SwipeMode.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/widget/swipe/SwipeMode.java new file mode 100644 index 0000000000000000000000000000000000000000..3c44b9df8dab0f8aa91e178e62cb056be4a93259 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/grouplist/widget/swipe/SwipeMode.java @@ -0,0 +1,5 @@ +package com.jiuqi.elove.widget.grouplist.widget.swipe; + +public enum SwipeMode { + Single, Multiple +} \ No newline at end of file diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/hx_widget/EaseConversationAdapater.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/hx_widget/EaseConversationAdapater.java new file mode 100644 index 0000000000000000000000000000000000000000..f878f4bf239b2235f380a4f7b086ec9760479054 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/hx_widget/EaseConversationAdapater.java @@ -0,0 +1,394 @@ +package com.jiuqi.elove.widget.hx_widget; + +import android.content.Context; +import android.text.TextUtils; +import android.util.TypedValue; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.Filter; +import android.widget.ImageView; +import android.widget.RelativeLayout; +import android.widget.TextView; +import android.widget.TextView.BufferType; + +import com.bumptech.glide.Glide; +import com.hyphenate.chat.EMChatRoom; +import com.hyphenate.chat.EMClient; +import com.hyphenate.chat.EMConversation; +import com.hyphenate.chat.EMConversation.EMConversationType; +import com.hyphenate.chat.EMGroup; +import com.hyphenate.chat.EMMessage; +import com.hyphenate.easeui.R; +import com.hyphenate.easeui.adapter.NineGridImageViewAdapter; +import com.hyphenate.easeui.domain.EaseUser; +import com.hyphenate.easeui.model.EaseAtMessageHelper; +import com.hyphenate.easeui.utils.AbDateUtil; +import com.hyphenate.easeui.utils.EaseCommonUtils; +import com.hyphenate.easeui.utils.EaseSmileUtils; +import com.hyphenate.easeui.utils.EaseUserUtils; +import com.hyphenate.easeui.widget.NineGridImageView; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.util.EasyGlide; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * conversation list adapter + * + */ +public class EaseConversationAdapater extends ArrayAdapter { + private static final String TAG = "ChatAllHistoryAdapter"; + private List conversationList; + private List copyConversationList; + private ConversationFilter conversationFilter; + private boolean notiyfyByFilter; + protected List> mGroupAvatarList;//所有各个群组的头像 + protected List> copyGroupAvatarList;//所有各个群组的头像 + + protected int primaryColor; + protected int secondaryColor; + protected int timeColor; + protected int primarySize; + protected int secondarySize; + protected float timeSize; + protected String avatar; + protected String nikename; + + private int count = 0; + + public EaseConversationAdapater(Context context, int resource, + List objects, List> mGroupAvatarList) { + super(context, resource, objects); + this.mGroupAvatarList = mGroupAvatarList; + conversationList = objects; + copyGroupAvatarList = new ArrayList<>(); + copyConversationList = new ArrayList(); + copyGroupAvatarList.addAll(mGroupAvatarList); + copyConversationList.addAll(objects); + } + + @Override + public int getCount() { + return conversationList.size(); + } + + @Override + public EMConversation getItem(int arg0) { + if (arg0 < conversationList.size()) { + return conversationList.get(arg0); + } + return null; + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + if (convertView == null) { + convertView = LayoutInflater.from(getContext()).inflate(R.layout.ease_row_chat_history, parent, false); + } + ViewHolder holder = (ViewHolder) convertView.getTag(); + if (holder == null) { + holder = new ViewHolder(); + holder.name = (TextView) convertView.findViewById(R.id.name); + holder.unreadLabel = (TextView) convertView.findViewById(R.id.unread_msg_number); + holder.message = (TextView) convertView.findViewById(R.id.message); + holder.time = (TextView) convertView.findViewById(R.id.time); + holder.avatar = (ImageView) convertView.findViewById(R.id.avatar); + holder.msgState = convertView.findViewById(R.id.msg_state); + holder.list_itease_layout = (RelativeLayout) convertView.findViewById(R.id.list_itease_layout); + holder.motioned = (TextView) convertView.findViewById(R.id.mentioned); +// holder.nineView = (NineGridImageView)convertView.findViewById(R.id.groudIcon1); +// holder.nineView.setGap(5); + convertView.setTag(holder); + } +// holder.list_itease_layout.setBackgroundResource(R.drawable.ease_mm_listitem);去掉了点击变绿色的效果,更改效果到布局文件中 + + // get conversation + EMConversation conversation = getItem(position); + // get username or group id + String username = conversation.getUserName(); + if (conversation.getType() == EMConversationType.GroupChat) { + String groupId = conversation.getUserName(); +// holder.nineView.setVisibility(View.VISIBLE); +// holder.avatar.setVisibility(View.GONE); + if(EaseAtMessageHelper.get().hasAtMeMsg(groupId)){ + holder.motioned.setVisibility(View.VISIBLE); + }else{ + holder.motioned.setVisibility(View.GONE); + } + // group message, show group avatar +// holder.avatar.setImageResource(R.drawable.ease_group_icon); +// NineGridImageViewAdapter mAdapter = new NineGridImageViewAdapter() { +// @Override +// public void onDisplayImage(Context context, ImageView imageView, String s) { +// Glide.with(context).load(s).placeholder(R.drawable.img_hx_avatar).dontAnimate().into(imageView); +//// ++count;//次数加一,记录群组聊天的头像位置 +// } +// }; +// holder.nineView.setGap(5); +// holder.nineView.setAdapter(mAdapter); +// if(mGroupAvatarList!=null&&!mGroupAvatarList.isEmpty()){ +// if(position mAdapter = new NineGridImageViewAdapter() { +// @Override +// public void onDisplayImage(Context context, ImageView imageView, String s) { +// Glide.with(context).load(s).placeholder(R.drawable.img_hx_avatar).dontAnimate().into(imageView); +//// ++count;//次数加一,记录群组聊天的头像位置 +// } +// }; +// holder.nineView.setGap(0); +// holder.nineView.setAdapter(mAdapter); +// if(mGroupAvatarList!=null&&!mGroupAvatarList.isEmpty()){ +// if(position 0) { + // show unread message count + holder.unreadLabel.setText(String.valueOf(conversation.getUnreadMsgCount())); + holder.unreadLabel.setVisibility(View.VISIBLE); + } else { + holder.unreadLabel.setVisibility(View.INVISIBLE); + } + + if (conversation.getAllMsgCount() != 0) { + // show the content of latest message + EMMessage lastMessage = conversation.getLastMessage(); + String content = null; + if(cvsListHelper != null){ + content = cvsListHelper.onSetItemSecondaryText(lastMessage); + } + if("".equals(EaseSmileUtils.getSmiledText(getContext(), EaseCommonUtils.getMessageDigest(lastMessage, (this.getContext()))))){//2.4版本发现如果没有此群聊没有聊天内容会复用其他聊天的内容 + holder.message.setText(""); + }else{ + holder.message.setText(EaseSmileUtils.getSmiledText(getContext(), EaseCommonUtils.getMessageDigest(lastMessage, (this.getContext()))), + BufferType.SPANNABLE); + } + if(content != null){ + if(lastMessage.getType()== EMMessage.Type.LOCATION){ + holder.message.setText("[位置]"); + }else{ + holder.message.setText(content); + } + } +// holder.time.setText(DateUtils.getTimestampString(new Date(lastMessage.getMsgTime())));愿代码 + holder.time.setText(AbDateUtil.formatDateStr2Desc(AbDateUtil.timeStamp2String(lastMessage.getMsgTime()),"MM月dd日 HH:mm")); + if (lastMessage.direct() == EMMessage.Direct.SEND && lastMessage.status() == EMMessage.Status.FAIL) { + holder.msgState.setVisibility(View.VISIBLE); + } else { + holder.msgState.setVisibility(View.GONE); + } + } + + //set property + holder.name.setTextColor(primaryColor); + holder.message.setTextColor(secondaryColor); + holder.time.setTextColor(timeColor); + if(primarySize != 0) + holder.name.setTextSize(TypedValue.COMPLEX_UNIT_PX, primarySize); + if(secondarySize != 0) + holder.message.setTextSize(TypedValue.COMPLEX_UNIT_PX, secondarySize); + if(timeSize != 0) + holder.time.setTextSize(TypedValue.COMPLEX_UNIT_PX, timeSize); + return convertView; + } + + @Override + public void notifyDataSetChanged() { + super.notifyDataSetChanged(); + if(!notiyfyByFilter){ + copyConversationList.clear(); + copyConversationList.addAll(conversationList); + copyGroupAvatarList.clear(); + copyGroupAvatarList.addAll(mGroupAvatarList); + notiyfyByFilter = false; + } + } + + @Override + public Filter getFilter() { + if (conversationFilter == null) { + conversationFilter = new ConversationFilter(conversationList); + } + return conversationFilter; + } + + + public void setPrimaryColor(int primaryColor) { + this.primaryColor = primaryColor; + } + + public void setSecondaryColor(int secondaryColor) { + this.secondaryColor = secondaryColor; + } + + public void setTimeColor(int timeColor) { + this.timeColor = timeColor; + } + + public void setPrimarySize(int primarySize) { + this.primarySize = primarySize; + } + + public void setSecondarySize(int secondarySize) { + this.secondarySize = secondarySize; + } + + public void setTimeSize(float timeSize) { + this.timeSize = timeSize; + } + + + private class ConversationFilter extends Filter { + List mOriginalValues = null; + + public ConversationFilter(List mList) { + mOriginalValues = mList; + } + + @Override + protected FilterResults performFiltering(CharSequence prefix) { + FilterResults results = new FilterResults(); + + if (mOriginalValues == null) { + mOriginalValues = new ArrayList(); + } + if (prefix == null || prefix.length() == 0) { + results.values = copyConversationList; + results.count = copyConversationList.size(); + } else { + String prefixString = prefix.toString(); + final int count = mOriginalValues.size(); + final ArrayList newValues = new ArrayList(); + + for (int i = 0; i < count; i++) { + final EMConversation value = mOriginalValues.get(i); + String username = value.getUserName(); + + EMGroup group = EMClient.getInstance().groupManager().getGroup(username); + if(group != null){ + username = group.getGroupName(); + }else{ + EaseUser user = EaseUserUtils.getUserInfo(username); + // TODO: not support Nick anymore +// if(user != null && user.getNick() != null) +// username = user.getNick(); + } + + // First match against the whole ,non-splitted value + if (username.startsWith(prefixString)) { + newValues.add(value); + } else{ + final String[] words = username.split(" "); + final int wordCount = words.length; + + // Start at index 0, in case valueText starts with space(s) + for (int k = 0; k < wordCount; k++) { + if (words[k].startsWith(prefixString)) { + newValues.add(value); + break; + } + } + } + } + + results.values = newValues; + results.count = newValues.size(); + } + return results; + } + + @Override + protected void publishResults(CharSequence constraint, FilterResults results) { + conversationList.clear(); + if (results.values != null) { + conversationList.addAll((List) results.values); + } + if (results.count > 0) { + notiyfyByFilter = true; + notifyDataSetChanged(); + } else { + notifyDataSetInvalidated(); + } + } + } + + private EaseConversationList.EaseConversationListHelper cvsListHelper; + + public void setCvsListHelper(EaseConversationList.EaseConversationListHelper cvsListHelper){ + this.cvsListHelper = cvsListHelper; + } + + private static class ViewHolder { + /** who you chat with */ + TextView name; + /** unread message count */ + TextView unreadLabel; + /** content of last message */ + TextView message; + /** time of last message */ + TextView time; + /** avatar */ + ImageView avatar; + /** status of last message */ + View msgState; + /** layout */ + RelativeLayout list_itease_layout; + TextView motioned; + +// NineGridImageView nineView; + } +} + diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/hx_widget/EaseConversationList.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/hx_widget/EaseConversationList.java new file mode 100644 index 0000000000000000000000000000000000000000..e93b7e234216b356596d2e830d4ebedd0c363811 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/hx_widget/EaseConversationList.java @@ -0,0 +1,338 @@ +package com.jiuqi.elove.widget.hx_widget; + +import android.app.Dialog; +import android.content.Context; +import android.content.res.TypedArray; +import android.os.Handler; +import android.os.Message; +import android.util.AttributeSet; +import android.util.Pair; +import android.widget.ListView; + +import com.alibaba.fastjson.JSONObject; +import com.hyphenate.chat.EMClient; +import com.hyphenate.chat.EMConversation; +import com.hyphenate.chat.EMGroup; +import com.hyphenate.chat.EMMessage; +import com.hyphenate.easeui.R; + +import com.hyphenate.easeui.model.GroupMemModel; +import com.jiuqi.elove.widget.dialog.LoadingDialog; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.common.Interface; +import com.jiuqi.elove.util.OkHttpUtil; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Map; + + +public class EaseConversationList extends ListView { + + protected int primaryColor; + protected int secondaryColor; + protected int timeColor; + protected int primarySize; + protected int secondarySize; + protected float timeSize; + private int count = 0; + + protected final int MSG_REFRESH_ADAPTER_DATA = 0; + + protected Context context; + protected EaseConversationAdapater adapter; + protected List conversations = new ArrayList(); + protected List groupconversations = new ArrayList(); + protected List passedListRef = null; + protected EMConversation conversation; + protected List mItemList;//每个群组的成员列表 + protected List mItemAvatarList;//每个群组的头像列表 + protected List> mTotalList;//所有各个群组的头像 + protected List mGroupModelList;//群组成员list + private String avatar;//暂存对象 + + private final OkHttpUtil okHttpUtil = OkHttpUtil.getInstance(); + private String avatarUrl = Constant.COMMON_URL + Interface.RETURN_GROUP_AVATAR; + private Dialog dialog; + + public EaseConversationList(Context context, AttributeSet attrs) { + super(context, attrs); + init(context, attrs); + } + + public EaseConversationList(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + init(context, attrs); + } + + + private void init(Context context, AttributeSet attrs) { + this.context = context; + TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.EaseConversationList); + primaryColor = ta.getColor(R.styleable.EaseConversationList_cvsListPrimaryTextColor, getResources().getColor(R.color.list_itease_primary_color)); + secondaryColor = ta.getColor(R.styleable.EaseConversationList_cvsListSecondaryTextColor, getResources().getColor(R.color.list_itease_secondary_color)); + timeColor = ta.getColor(R.styleable.EaseConversationList_cvsListTimeTextColor, getResources().getColor(R.color.list_itease_secondary_color)); + primarySize = ta.getDimensionPixelSize(R.styleable.EaseConversationList_cvsListPrimaryTextSize, 0); + secondarySize = ta.getDimensionPixelSize(R.styleable.EaseConversationList_cvsListSecondaryTextSize, 0); + timeSize = ta.getDimension(R.styleable.EaseConversationList_cvsListTimeTextSize, 0); + + ta.recycle(); + + } + + public void init(List conversationList){ + this.init(conversationList, null); + } + + public void init(List conversationList, EaseConversationListHelper helper){ + conversations = conversationList; + if(helper != null){ + this.conversationListHelper = helper; + } + getAvatarList(); + } + + private void getAvatarList() { + if(conversations!=null&&!conversations.isEmpty()){ + for(EMConversation conversation : conversations){ + if(conversation.getType()== EMConversation.EMConversationType.GroupChat){ + groupconversations.add(conversation); + } + } + } + if(groupconversations!=null&&!groupconversations.isEmpty()) {//当聊天列表中存在群组聊天时 + if (dialog == null) { + dialog = LoadingDialog.createLoadingDialog(context, "正在加载中..."); + if (dialog != null) { + dialog.show(); + } + } + mTotalList = new ArrayList<>();//初始化总头像list +// for(EMConversation conversation : groupconversations){ + conversation = groupconversations.get(0); +// if(conversation.getType()==EMConversation.EMConversationType.GroupChat){ + EMGroup group = EMClient.getInstance().groupManager().getGroup(conversation.getUserName()); + mItemList = group.getMembers(); + if (!mItemList.isEmpty()) { + getAvatars();//查询第一组的头像,成功之后将头像url插入到总list中 + } + }else{//只有个人聊天时 + mTotalList = new ArrayList<>();//初始化总头像list + for(int i=0;i(); + if (lastMessage.direct() == EMMessage.Direct.SEND) { + avatar = lastMessage.getStringAttribute(Constant.RECEIVE_AVATAR, ""); + } else { + avatar = lastMessage.getStringAttribute(Constant.SEND_AVATAR, ""); + } + mItemAvatarList.add(avatar); + mTotalList.add(i,mItemAvatarList); + } + } + adapter = new EaseConversationAdapater(context, 0, conversations,mTotalList);//coversation是全部的 totallist是群组的 + adapter.setCvsListHelper(conversationListHelper); + adapter.setPrimaryColor(primaryColor); + adapter.setPrimarySize(primarySize); + adapter.setSecondaryColor(secondaryColor); + adapter.setSecondarySize(secondarySize); + adapter.setTimeColor(timeColor); + adapter.setTimeSize(timeSize); + setAdapter(adapter); + } + + } + + + private void getAvatars(){ + JSONObject obj = new JSONObject(); + obj.put("userids",mItemList); + obj.put("type","1"); + obj.put("version","2.4"); + String param = obj.toJSONString(); + okHttpUtil.sendJsonStrByPostAsync(context, false, avatarUrl, param, new OkHttpUtil.OnGetJsonObject() { + @Override + public void onResponse(JSONObject jsonObject) { + String rsCode = jsonObject.getString("retcode"); + if("1".equals(rsCode)){ + String result = jsonObject.getString("avatars"); + mGroupModelList = JSONObject.parseArray(result,GroupMemModel.class); + if(mGroupModelList!=null&&!mGroupModelList.isEmpty()){ + mItemAvatarList = new ArrayList(); + for(GroupMemModel model : mGroupModelList){ + mItemAvatarList.add(model.getAvatar());//每个必须添加,因为有的用户头像可能为空 + } + } + if(mItemAvatarList!=null&&!mItemAvatarList.isEmpty()){ + mTotalList.add(mItemAvatarList); + } + if(mTotalList.size()==groupconversations.size()){ + if(conversations.size()!=groupconversations.size()){ + for(int i=0;i(); + if (lastMessage.direct() == EMMessage.Direct.SEND) { + avatar = lastMessage.getStringAttribute(Constant.RECEIVE_AVATAR, ""); + } else { + avatar = lastMessage.getStringAttribute(Constant.SEND_AVATAR, ""); + } + mItemAvatarList.add(avatar); + mTotalList.add(i,mItemAvatarList); + } + } + } + + //show group list + if (dialog != null) { + dialog.dismiss(); + dialog = null; + } + adapter = new EaseConversationAdapater(context, 0, conversations,mTotalList);//coversation是全部的 totallist是群组的 + adapter.setCvsListHelper(conversationListHelper); + adapter.setPrimaryColor(primaryColor); + adapter.setPrimarySize(primarySize); + adapter.setSecondaryColor(secondaryColor); + adapter.setSecondarySize(secondarySize); + adapter.setTimeColor(timeColor); + adapter.setTimeSize(timeSize); + setAdapter(adapter); + }else{ + ++count; + handler.sendEmptyMessage(0x111); + } + } + } + },null); + } + Handler handler = new Handler() { + @Override + public void handleMessage(Message message) { + switch (message.what) { + case MSG_REFRESH_ADAPTER_DATA: + if (adapter != null) { + count=0; + groupconversations = new ArrayList(); + getAvatarList(); + adapter.notifyDataSetChanged(); + } + break; + case 0x111: +// for(int i=count;i loadConversationsWithRecentChat() { + Map conversations = EMClient.getInstance().chatManager().getAllConversations(); + List> sortList = new ArrayList>(); + /** + * lastMsgTime will change if there is new message during sorting + * so use synchronized to make sure timestamp of last message won't change. + */ + synchronized (conversations) { + for (EMConversation conversation : conversations.values()) { + if (conversation.getAllMessages().size() != 0) { + sortList.add(new Pair(conversation.getLastMessage().getMsgTime(), conversation)); + } + } + } + try { + // Internal is TimSort algorithm, has bug + sortConversationByLastChatTime(sortList); + } catch (Exception e) { + e.printStackTrace(); + } + List list = new ArrayList(); + for (Pair sortItem : sortList) { + list.add(sortItem.second); + } + return list; + } + + /** + * sorting according timestamp of last message + * + * @param + */ + private void sortConversationByLastChatTime(List> conversationList) { + Collections.sort(conversationList, new Comparator>() { + @Override + public int compare(final Pair con1, final Pair con2) { + + if (con1.first == con2.first) { + return 0; + } else if (con2.first > con1.first) { + return 1; + } else { + return -1; + } + } + + }); + } + + public EMConversation getItem(int position) { + return (EMConversation)adapter.getItem(position); + } + + public void refresh() { + if(!handler.hasMessages(MSG_REFRESH_ADAPTER_DATA)){ + handler.sendEmptyMessage(MSG_REFRESH_ADAPTER_DATA); + } + } + + public void filter(CharSequence str) { + adapter.getFilter().filter(str); + } + + + private EaseConversationListHelper conversationListHelper; + + public interface EaseConversationListHelper{ + /** + * set content of second line + * @param lastMessage + * @return + */ + String onSetItemSecondaryText(EMMessage lastMessage); + } + public void setConversationListHelper(EaseConversationListHelper helper){ + conversationListHelper = helper; + } + +// @Override +// protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { +// int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, +// MeasureSpec.AT_MOST); +// super.onMeasure(widthMeasureSpec, expandSpec); +// } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/hx_widget/EaseConversationListFragment.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/hx_widget/EaseConversationListFragment.java new file mode 100644 index 0000000000000000000000000000000000000000..714cf6c376c2ccf38848b7e78ea8de7567f057d7 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/hx_widget/EaseConversationListFragment.java @@ -0,0 +1,321 @@ +package com.jiuqi.elove.widget.hx_widget; + +import android.content.Context; +import android.os.Bundle; +import android.os.Handler; +import android.util.Pair; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.view.View.OnTouchListener; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.view.inputmethod.InputMethodManager; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemClickListener; +import android.widget.FrameLayout; + +import com.hyphenate.EMConnectionListener; +import com.hyphenate.EMConversationListener; +import com.hyphenate.EMError; +import com.hyphenate.chat.EMClient; +import com.hyphenate.chat.EMConversation; + +import com.hyphenate.chat.EMMessage; +import com.hyphenate.easeui.ui.EaseBaseFragment; +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.util.SpUtils; + + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Map; + +/** + * conversation fragment + * + */ +public class EaseConversationListFragment extends EaseBaseFragment{ + private final static int MSG_REFRESH = 2; +// protected EditText query; +// protected ImageButton clearSearch; + protected boolean hidden; + protected List conversationList = new ArrayList(); + protected EaseConversationList conversationListView; + protected FrameLayout errorItemContainer; + + protected boolean isConflict; + + protected EMConversationListener convListener = new EMConversationListener(){ + + @Override + public void onCoversationUpdate() { + refresh(); + } + + }; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + return inflater.inflate(R.layout.fragment_conversation_list_ease, container, false); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + if(savedInstanceState != null && savedInstanceState.getBoolean("isConflict", false)) + return; + super.onActivityCreated(savedInstanceState); + } + + @Override + protected void initView() { + inputMethodManager = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); + conversationListView = (EaseConversationList) getView().findViewById(R.id.list); +// query = (EditText) getView().findViewById(R.id.query); + // button to clear content in search bar +// clearSearch = (ImageButton) getView().findViewById(R.id.search_clear); + errorItemContainer = (FrameLayout) getView().findViewById(R.id.fl_error_item); + } + + @Override + protected void setUpView() { + conversationList.addAll(loadConversationList()); + conversationListView.init(conversationList); + + if(listItemClickListener != null){ + conversationListView.setOnItemClickListener(new OnItemClickListener() { + + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + EMConversation conversation = conversationListView.getItem(position); + listItemClickListener.onListItemClicked(conversation); + } + }); + } + + EMClient.getInstance().addConnectionListener(connectionListener); + EMClient.getInstance().chatManager().addConversationListener(convListener); +// query.addTextChangedListener(new TextWatcher() { +// public void onTextChanged(CharSequence s, int start, int before, int count) { +// conversationListView.filter(s); +// if (s.length() > 0) { +// clearSearch.setVisibility(View.VISIBLE); +// } else { +// clearSearch.setVisibility(View.INVISIBLE); +// } +// } +// +// public void beforeTextChanged(CharSequence s, int start, int count, int after) { +// } +// +// public void afterTextChanged(Editable s) { +// } +// }); +// clearSearch.setOnClickListener(new OnClickListener() { +// @Override +// public void onClick(View v) { +// query.getText().clear(); +// hideSoftKeyboard(); +// } +// }); + + conversationListView.setOnTouchListener(new OnTouchListener() { + + @Override + public boolean onTouch(View v, MotionEvent event) { + hideSoftKeyboard(); + return false; + } + }); + } + + + protected EMConnectionListener connectionListener = new EMConnectionListener() { + + @Override + public void onDisconnected(int error) { + if (error == EMError.USER_REMOVED || error == EMError.USER_LOGIN_ANOTHER_DEVICE) { + isConflict = true; + } else { + handler.sendEmptyMessage(0); + } + } + + @Override + public void onConnected() { + handler.sendEmptyMessage(1); + } + }; + private EaseConversationListItemClickListener listItemClickListener; + + protected Handler handler = new Handler(){ + public void handleMessage(android.os.Message msg) { + switch (msg.what) { + case 0: + onConnectionDisconnected(); + break; + case 1: + onConnectionConnected(); + break; + + case MSG_REFRESH: + { + conversationList.clear(); + conversationList.addAll(loadConversationList()); + conversationListView.refresh(); + break; + } + default: + break; + } + } + }; + + /** + * connected to server + */ + protected void onConnectionConnected(){ + errorItemContainer.setVisibility(View.GONE); + } + + /** + * disconnected with server + */ + protected void onConnectionDisconnected(){ + errorItemContainer.setVisibility(View.VISIBLE); + } + + + /** + * refresh ui + */ + public void refresh() { + if(!handler.hasMessages(MSG_REFRESH)){ + handler.sendEmptyMessage(MSG_REFRESH); + } + } + + /** + * load conversation list + * + * @return + + */ + protected List loadConversationList(){ + // get all conversations + Map conversations = EMClient.getInstance().chatManager().getAllConversations(); + if(conversations.isEmpty()){ + //创建一条文本消息,content为消息文字内容,toChatUsername为对方用户或者群聊的id,后文皆是如此 + EMMessage message = EMMessage.createTxtSendMessage("欢迎加入启缘大家庭", SpUtils.getString(Constant.USER_ID).toLowerCase()); + message.setFrom("admin"); + message.setAttribute("type","aaa");//type随意,有就代表通知 + EMClient.getInstance().chatManager().sendMessage(message); + conversations = EMClient.getInstance().chatManager().getAllConversations(); + } + List> sortList = new ArrayList>(); + /** + * lastMsgTime will change if there is new message during sorting + * so use synchronized to make sure timestamp of last message won't change. + */ + synchronized (conversations) { + for (EMConversation conversation : conversations.values()) { + if (conversation.getAllMessages().size() != 0) { + if(!Constant.SERVICE_PERSON.toLowerCase().equals(conversation.getUserName())){ + sortList.add(new Pair(conversation.getLastMessage().getMsgTime(), conversation)); + } + } + } + } + try { + // Internal is TimSort algorithm, has bug + sortConversationByLastChatTime(sortList); + } catch (Exception e) { + e.printStackTrace(); + } + List list = new ArrayList(); + for (Pair sortItem : sortList) { + list.add(sortItem.second); + } + return list; + } + + /** + * sort conversations according time stamp of last message + * + * @param conversationList + */ + private void sortConversationByLastChatTime(List> conversationList) { + Collections.sort(conversationList, new Comparator>() { + @Override + public int compare(final Pair con1, final Pair con2) { + + if (con1.first == con2.first) { + return 0; + } else if (con2.first > con1.first) { + return 1; + } else { + return -1; + } + } + + }); + } + + protected void hideSoftKeyboard() { + if (getActivity().getWindow().getAttributes().softInputMode != WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN) { + if (getActivity().getCurrentFocus() != null) + inputMethodManager.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), + InputMethodManager.HIDE_NOT_ALWAYS); + } + } + + @Override + public void onHiddenChanged(boolean hidden) { + super.onHiddenChanged(hidden); + this.hidden = hidden; + if (!hidden && !isConflict) { + refresh(); + } + } + + @Override + public void onResume() { + super.onResume(); + if (!hidden) { + refresh(); + } + } + + @Override + public void onDestroy() { + super.onDestroy(); + EMClient.getInstance().removeConnectionListener(connectionListener); + } + + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + if(isConflict){ + outState.putBoolean("isConflict", true); + } + } + + public interface EaseConversationListItemClickListener { + /** + * click event for conversation list + * @param conversation -- clicked item + */ + void onListItemClicked(EMConversation conversation); + } + + /** + * set conversation list item click listener + * @param listItemClickListener + */ + public void setConversationListItemClickListener(EaseConversationListItemClickListener listItemClickListener){ + this.listItemClickListener = listItemClickListener; + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/mediapicker/adapter/GalleryAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/mediapicker/adapter/GalleryAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..a0aefc08fdc2dd25eb77f432b94dbbaa036307dd --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/mediapicker/adapter/GalleryAdapter.java @@ -0,0 +1,166 @@ +package com.jiuqi.elove.widget.mediapicker.adapter; + +import android.app.Activity; +import android.content.Context; +import android.support.v7.widget.GridLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.Toast; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.Priority; +import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.jiuqi.elove.R; +import com.jiuqi.elove.widget.mediapicker.model.Photo; +import com.jiuqi.elove.widget.mediapicker.model.PhotoDirectory; +import com.jiuqi.elove.widget.mediapicker.util.MediaManager; +import com.jiuqi.elove.widget.mediapicker.viewholder.GalleryHolder; + +import java.text.DecimalFormat; +import java.util.List; + + +public class GalleryAdapter extends RecyclerView.Adapter { + private PhotoDirectory images; + private LayoutInflater layoutInflater; + private AdapterView.OnItemClickListener onItemClickListener; + private RecyclerView imageRecyclerView; + private int maxToal; + + public GalleryAdapter(Activity activity, PhotoDirectory images) { + maxToal = MediaManager.getInstance().getMaxMediaSum(); + this.images = images; + layoutInflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + } + + public void setImageRecyclerView(RecyclerView imageRecyclerView) { + this.imageRecyclerView = imageRecyclerView; + } + + public void setImages(PhotoDirectory images) { + this.images = images; + notifyDataSetChanged(); + } + + public PhotoDirectory getImages() { + return images; + } + + public void setOnItemClickListener(AdapterView.OnItemClickListener onItemClickListener) { + this.onItemClickListener = onItemClickListener; + } + + @Override + public int getItemViewType(int position) { + String mimeType = images.getPhotos().get(position).getMimetype(); + return mimeType.contains("video") ? 2 : 1; + } + + @Override + public GalleryHolder onCreateViewHolder(ViewGroup parent, int viewType) { + int layoutRes = viewType == 2 ? R.layout.gallery_video_item : R.layout.gallery_image_item; + View view = layoutInflater.inflate(layoutRes, parent, false); + return new GalleryHolder(view); + } + + @Override + public void onBindViewHolder(final GalleryHolder holder, final int position) { + if(1==maxToal){ + holder.appCompatCheckBox.setVisibility(View.GONE); + }else{ + holder.appCompatCheckBox.setVisibility(View.VISIBLE); + } + final Photo photo = images.getPhotos().get(position); + String url = "file:///" + photo.getPath(); + boolean check = MediaManager.getInstance().exsit(photo.getId()); + holder.thumbIv.justSetShowShade(check); + //ImageLoader.getInstance().displayImage(url, holder.thumbIv); + Glide.with(holder.thumbIv.getContext()).load(url) + .placeholder(android.R.color.black) + .priority(Priority.IMMEDIATE) + .fitCenter() + .diskCacheStrategy(DiskCacheStrategy.RESULT) + .into(holder.thumbIv); + holder.appCompatCheckBox.setChecked(check); + if (photo.getMimetype().contains("video")) { + holder.tvVideoDuration.setText(converDuration(photo.getDuration())); + } + holder.appCompatCheckBox.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + boolean isChecked = holder.appCompatCheckBox.isChecked(); + if (isChecked) { + boolean result = MediaManager.getInstance().addMedia(photo.getId(), photo, true);//表示Checkbox已经更新过了,不需要再次进行更新,主要用于区分再其他地方更新了选择状态,但是这边的UI,没更新的情况。 + if (result) { + holder.thumbIv.setShowShade(true); + } else { + holder.appCompatCheckBox.setChecked(false); + Toast.makeText(v.getContext(), String.format(v.getContext().getResources().getString(R.string.select_max_sum), MediaManager.getInstance().getMaxMediaSum()), Toast.LENGTH_SHORT).show(); + } + } else { + MediaManager.getInstance().removeMedia(photo.getId(), true); + holder.thumbIv.setShowShade(false); + } + } + }); + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (onItemClickListener != null){ + if(maxToal==1){ + MediaManager.getInstance().addMedia(photo.getId(),photo,true);//添加选择一个照片的情况 + } + onItemClickListener.onItemClick(null, v, position, 0); + } + } + }); + } + + /** + * 更新多媒体的选择 只更新在屏幕上显示的,更节约内存和功耗。 + * + * @param id + */ + public void updateCheckbox(int id) { + GridLayoutManager gridLayoutManager = (GridLayoutManager) imageRecyclerView.getLayoutManager(); + int firstVisibleItemPosition = gridLayoutManager.findFirstVisibleItemPosition(); + int lastVisibleItemPosition = gridLayoutManager.findLastVisibleItemPosition(); + List photoList = images.getPhotos(); + for (int i = firstVisibleItemPosition; i <= lastVisibleItemPosition; i++) { + if (id == photoList.get(i).getId()) { + GalleryHolder holder = (GalleryHolder) imageRecyclerView.findViewHolderForAdapterPosition(i); + boolean check = MediaManager.getInstance().exsit(id); + holder.appCompatCheckBox.setChecked(check); + holder.thumbIv.setShowShade(check); + break; + } + } + } + + @Override + public void onViewDetachedFromWindow(GalleryHolder holder) { + holder.appCompatCheckBox.setOnCheckedChangeListener(null); + super.onViewDetachedFromWindow(holder); + } + + String converDuration(long duration) { + StringBuilder durationString = new StringBuilder(); + int second = (int) (duration / 1000); + int min = second / 60; + int hour = min / 60; + if (hour > 0) + durationString.append(hour + ":"); + durationString.append(min + ":"); + durationString.append(new DecimalFormat("00").format(second)); + return durationString.toString(); + } + + @Override + public int getItemCount() { + return images.getPhotos().size(); + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/mediapicker/adapter/PopupDirectoryListAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/mediapicker/adapter/PopupDirectoryListAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..b7f3db54b17ce6afe667db70248c578dfc9f2ebe --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/mediapicker/adapter/PopupDirectoryListAdapter.java @@ -0,0 +1,103 @@ +package com.jiuqi.elove.widget.mediapicker.adapter; + +import android.content.res.ColorStateList; +import android.graphics.Color; +import android.graphics.drawable.Drawable; +import android.support.v4.graphics.drawable.DrawableCompat; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.TextView; + +import com.bumptech.glide.Glide; +import com.jiuqi.elove.R; +import com.jiuqi.elove.widget.mediapicker.model.PhotoDirectory; + +import java.util.ArrayList; +import java.util.List; + +public class PopupDirectoryListAdapter extends BaseAdapter { + + private List directories = new ArrayList<>(); + + public PopupDirectoryListAdapter(List directories) { + this.directories = directories; + } + + + @Override + public int getCount() { + return directories.size(); + } + + + @Override + public PhotoDirectory getItem(int position) { + return directories.get(position); + } + + + @Override + public long getItemId(int position) { + return directories.get(position).hashCode(); + } + + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + ViewHolder holder; + if (convertView == null) { + LayoutInflater mLayoutInflater = LayoutInflater.from(parent.getContext()); + convertView = mLayoutInflater.inflate(R.layout.pop_directory_item, parent, false); + holder = new ViewHolder(convertView); + convertView.setTag(holder); + } else { + holder = (ViewHolder) convertView.getTag(); + } + + holder.bindData(directories.get(position)); + + return convertView; + } + + private class ViewHolder { + + public ImageView ivCover; + public TextView tvName; + public TextView tvCount; + public ImageView ivSelect; + + public ViewHolder(View rootView) { + ivCover = (ImageView) rootView.findViewById(R.id.iv_dir_cover); + tvName = (TextView) rootView.findViewById(R.id.tv_dir_name); + tvCount = (TextView) rootView.findViewById(R.id.tv_dir_count); + ivSelect = (ImageView) rootView.findViewById(R.id.iv_dir); + } + + public void bindData(PhotoDirectory directory) { + Glide.with(ivCover.getContext()).load("file:///" + directory.getCoverPath()).into(ivCover); + tvName.setText(directory.getName()); + tvCount.setText(tvCount.getContext().getString(R.string.__picker_image_count, directory.getPhotos().size())); + ivSelect.setVisibility(directory.isSelected() ? View.VISIBLE : View.GONE); + Drawable drawable = tintDrawable(ivCover.getContext().getResources().getDrawable(R.drawable.ic_check_dir), ColorStateList.valueOf(Color.parseColor("#FF45C01A"))); + drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); + ivSelect.setImageDrawable(drawable); + } + + /** + * 给图片上色 + * + * @param drawable + * @param colors + * @return + */ + public Drawable tintDrawable(Drawable drawable, ColorStateList colors) { + final Drawable wrappedDrawable = DrawableCompat.wrap(drawable); + DrawableCompat.setTintList(wrappedDrawable, colors); + return wrappedDrawable; + } + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/mediapicker/decoration/SpaceItemDecoration.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/mediapicker/decoration/SpaceItemDecoration.java new file mode 100644 index 0000000000000000000000000000000000000000..ff1881c3ff9be957ca35d326bfaf540ac858e60c --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/mediapicker/decoration/SpaceItemDecoration.java @@ -0,0 +1,35 @@ +package com.jiuqi.elove.widget.mediapicker.decoration; + +import android.content.Context; +import android.graphics.Rect; +import android.support.v7.widget.GridLayoutManager; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.View; + + +public class SpaceItemDecoration extends RecyclerView.ItemDecoration { + private int space; + + public SpaceItemDecoration(Context context, int space) { + this.space = (int) (space * context.getResources().getDisplayMetrics().density); + } + + @Override + public void getItemOffsets(Rect outRect, View view, + RecyclerView parent, RecyclerView.State state) { + outRect.left = space; + outRect.right = space; + outRect.bottom = space; + + //判断是GridLayoutManager还是LinearLayoutManager + if (parent.getLayoutManager() instanceof GridLayoutManager) { + int spanCount = ((GridLayoutManager) parent.getLayoutManager()).getSpanCount(); + outRect.top = parent.getChildLayoutPosition(view) < spanCount ? space : 0; + } else { + LinearLayoutManager linearLayoutManager = (LinearLayoutManager) parent.getLayoutManager(); + outRect.top = linearLayoutManager.getOrientation() == LinearLayoutManager.HORIZONTAL || + parent.getChildLayoutPosition(view) == 0 ? space : 0; + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/mediapicker/model/Photo.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/mediapicker/model/Photo.java new file mode 100644 index 0000000000000000000000000000000000000000..78a4739b77751aea02dea55a8761ac6971862294 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/mediapicker/model/Photo.java @@ -0,0 +1,146 @@ +package com.jiuqi.elove.widget.mediapicker.model; + +import java.io.Serializable; + +public class Photo implements Serializable { + private int id; + private String path;//文件路径(图片或者视频) + private String mimetype; + private long duration;//视频时长 + private int width, height; + private long size; + private long adddate; + private boolean fullImage;//是否使用原图,默认图片传送需要进过压缩。 + private String thumbnail;//视频缩略图 + private boolean isVideo;//是否是视频 true为视频 false为图片 + public Photo(int id, String path, String mimetype, int width, int height, long size, String thumbnail, boolean isVideo) { + this.id = id; + this.path = path; + this.mimetype = mimetype; + this.width = width; + this.height = height; + this.size = size; + this.thumbnail = thumbnail; + this.isVideo = isVideo; + } + + public Photo() { + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Photo)) return false; + + Photo photo = (Photo) o; + + return id == photo.id; + } + + public boolean isVideo() { + return isVideo; + } + + public void setVideo(boolean video) { + isVideo = video; + } + + public long getAdddate() { + return adddate; + } + + public void setAdddate(long adddate) { + this.adddate = adddate; + } + + public boolean isFullImage() { + return fullImage; + } + + public void setFullImage(boolean fullImage) { + this.fullImage = fullImage; + } + + public String getMimetype() { + return mimetype; + } + + public void setMimetype(String mimetype) { + this.mimetype = mimetype; + } + + @Override + public int hashCode() { + return id; + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public long getDuration() { + return duration; + } + + public void setDuration(long duration) { + this.duration = duration; + } + + public int getWidth() { + return width; + } + + public void setWidth(int width) { + this.width = width; + } + + public int getHeight() { + return height; + } + + public void setHeight(int height) { + this.height = height; + } + + public long getSize() { + return size; + } + + public void setSize(long size) { + this.size = size; + } + + public String getThumbnail() { + return thumbnail; + } + + public void setThumbnail(String thumbnail) { + this.thumbnail = thumbnail; + } + + @Override + public String toString() { + return "Photo{" + + "id=" + id + + ", path='" + path + '\'' + + ", mimetype='" + mimetype + '\'' + + ", duration=" + duration + + ", width=" + width + + ", height=" + height + + ", size=" + size + + ", fullImage=" + fullImage + + '}'; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/mediapicker/model/PhotoDirectory.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/mediapicker/model/PhotoDirectory.java new file mode 100644 index 0000000000000000000000000000000000000000..a2c3843809662199b44e8f757078e2ad4c3ebd4b --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/mediapicker/model/PhotoDirectory.java @@ -0,0 +1,94 @@ +package com.jiuqi.elove.widget.mediapicker.model; + +import java.util.ArrayList; +import java.util.List; + + +public class PhotoDirectory { + + private int id; + private String coverPath; + private String name; + private long dateAdded; + private List photos = new ArrayList<>(); + private boolean selected = false; + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof PhotoDirectory)) return false; + + PhotoDirectory directory = (PhotoDirectory) o; + return id == directory.getId(); + } + + public boolean isSelected() { + return selected; + } + + public void setSelected(boolean selected) { + this.selected = selected; + } + + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getCoverPath() { + return coverPath; + } + + public void setCoverPath(String coverPath) { + this.coverPath = coverPath; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public long getDateAdded() { + return dateAdded; + } + + public void setDateAdded(long dateAdded) { + this.dateAdded = dateAdded; + } + + public List getPhotos() { + return photos; + } + + public void setPhotos(List photos) { + if (photos == null) return; + for (int i = 0, j = 0, num = photos.size(); i < num; i++) { + Photo p = photos.get(j); + if (p == null) { + photos.remove(j); + } else { + j++; + } + } + this.photos = photos; + } + + public List getPhotoPaths() { + List paths = new ArrayList<>(photos.size()); + for (Photo photo : photos) { + paths.add(photo.getPath()); + } + return paths; + } + + public void addPhoto(Photo photo) { + photos.add(photo); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/mediapicker/util/GalleryFinal.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/mediapicker/util/GalleryFinal.java new file mode 100644 index 0000000000000000000000000000000000000000..fd132a27699bb27e95bdce49a5eeb9f3c0e5fc8d --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/mediapicker/util/GalleryFinal.java @@ -0,0 +1,49 @@ +package com.jiuqi.elove.widget.mediapicker.util; + +import android.content.Context; +import android.content.Intent; + +import com.jiuqi.elove.widget.mediapicker.model.Photo; +import com.jiuqi.elove.widget.mediapicker.view.MediaPickerActivity; + +import java.util.ArrayList; + + +public class GalleryFinal { + static OnSelectMediaListener mOnSelectMediaListener; + public static final int TYPE_IMAGE = 1;//图片类型 + public static final int TYPE_VIDEO = 2;//视频类型 + public static final int TYPE_ALL = 3;//所有类型 + + public static void selectMedias(Context context, int type, int maxSum, OnSelectMediaListener onSelectMediaListener) { + mOnSelectMediaListener = onSelectMediaListener; + Intent intent = new Intent(context, MediaPickerActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.putExtra("maxSum", maxSum); + if (type != TYPE_ALL) + intent.putExtra("type", type); + context.startActivity(intent); + } + + public static void selectMedias(Context context, int maxSum, OnSelectMediaListener onSelectMediaListener) { + selectMedias(context, TYPE_ALL, maxSum, onSelectMediaListener); + } + + public static void selectMedias(Context context, int type, int maxSum) { + mOnSelectMediaListener = null; + Intent intent = new Intent(context, MediaPickerActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.putExtra("maxSum", maxSum); + if (type != TYPE_ALL) + intent.putExtra("type", type); + context.startActivity(intent); + } + + public static void selectMedias(Context context, int maxSum) { + selectMedias(context, TYPE_ALL, maxSum); + } + + public interface OnSelectMediaListener { + void onSelected(ArrayList photoArrayList); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/mediapicker/util/MediaManager.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/mediapicker/util/MediaManager.java new file mode 100644 index 0000000000000000000000000000000000000000..0e79611f32a5a97907c956671588b3905c4e0d1a --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/mediapicker/util/MediaManager.java @@ -0,0 +1,167 @@ +package com.jiuqi.elove.widget.mediapicker.util; + +import com.jiuqi.elove.widget.mediapicker.model.Photo; +import com.jiuqi.elove.widget.mediapicker.model.PhotoDirectory; + +import org.greenrobot.eventbus.EventBus; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +public class MediaManager { + private static final MediaManager ourInstance = new MediaManager(); + + public static MediaManager getInstance() { + return ourInstance; + } + + private MediaManager() { + } + + Map checkStatus; + Map originalImage; + List onCheckchangeListeners; + List photoDirectorys; + private int maxMediaSum; + private int selectIndex; + + public void init() { + checkStatus = new HashMap<>(); + onCheckchangeListeners = new ArrayList<>(); + photoDirectorys = new ArrayList<>(); + originalImage = new HashMap<>(); + maxMediaSum = Integer.MAX_VALUE; + selectIndex = 0; + } + + public void clear() { + checkStatus.clear(); + originalImage.clear(); + photoDirectorys.clear(); + } + + public int getMaxMediaSum() { + return maxMediaSum; + } + + public void setMaxMediaSum(int maxMediaSum) { + this.maxMediaSum = maxMediaSum; + } + + public void addOnCheckchangeListener(OnCheckchangeListener onCheckchangeListener) { + if (onCheckchangeListener != null) { + onCheckchangeListeners.add(onCheckchangeListener); + } + } + + public void removeOnCheckchangeListener(OnCheckchangeListener onCheckchangeListener) { + if (onCheckchangeListener != null) + onCheckchangeListeners.remove(onCheckchangeListener); + } + + /** + * 超过最大允许的数量就不能再添加了 + * + * @param id + * @param photo + * @param uiUpdated + * @return + */ + public boolean addMedia(int id, Photo photo, boolean uiUpdated) { + if (checkStatus.size() >= maxMediaSum) { + return false; + } + if (!checkStatus.containsKey(id)) { + checkStatus.put(id, photo); + notifyDataChange(id, uiUpdated); + } + return true; + } + + public boolean addMedia(int id, Photo photo) { + return addMedia(id, photo, false); + } + + public void removeMedia(int id, boolean uiUpdated) { + if (checkStatus.containsKey(id)) { + checkStatus.remove(id); + notifyDataChange(id, uiUpdated); + } + } + + public void removeMedia(int id) { + if (checkStatus.containsKey(id)) { + checkStatus.remove(id); + notifyDataChange(id, false); + } + } + + public int getSelectIndex() { + return selectIndex; + } + + public void setSelectIndex(int selectIndex) { + this.selectIndex = selectIndex; + } + + public boolean exsit(int id) { + return checkStatus.containsKey(id); + } + + public Map getCheckStatus() { + return checkStatus; + } + + public List getPhotoDirectorys() { + return photoDirectorys; + } + + public void setPhotoDirectorys(List photoDirectorys) { + this.photoDirectorys = photoDirectorys; + } + + public PhotoDirectory getSelectDirectory() { + return photoDirectorys.get(selectIndex); + } + + public void setOriginal(int id, boolean original) { + originalImage.put(id, original); + } + + public void removeOriginal(int id) { + if (originalImage.containsKey(id)) + originalImage.remove(id); + } + + public boolean isOriginal(int id) { + return originalImage.containsKey(id); + } + + private void notifyDataChange(int id, boolean uiUpdated) { + for (OnCheckchangeListener listner : + onCheckchangeListeners) { + listner.onCheckedChanged(checkStatus, id, uiUpdated); + } + } + + public interface OnCheckchangeListener { + void onCheckedChanged(Map checkStaus, int changedId, boolean uiUpdated); + } + + public void send() { + ArrayList photoArrayList = new ArrayList<>(checkStatus.size()); + for (Integer integer : checkStatus.keySet()) { + Photo photo = checkStatus.get(integer); + photo.setFullImage(originalImage.containsKey(photo.getId())); + photoArrayList.add(photo); + } + + if (GalleryFinal.mOnSelectMediaListener != null) + GalleryFinal.mOnSelectMediaListener.onSelected(photoArrayList); + EventBus.getDefault().post(photoArrayList); + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/mediapicker/util/MediaStoreHelper.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/mediapicker/util/MediaStoreHelper.java new file mode 100644 index 0000000000000000000000000000000000000000..e8075a95fe3e837fca11cfe1f320c117d8fc9a5e --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/mediapicker/util/MediaStoreHelper.java @@ -0,0 +1,188 @@ +package com.jiuqi.elove.widget.mediapicker.util; + +import android.content.ContentResolver; +import android.content.Context; +import android.database.Cursor; +import android.database.MergeCursor; +import android.provider.MediaStore; +import android.support.v4.app.FragmentActivity; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.widget.mediapicker.model.Photo; +import com.jiuqi.elove.widget.mediapicker.model.PhotoDirectory; + +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +import static android.provider.BaseColumns._ID; +import static android.provider.MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME; +import static android.provider.MediaStore.Images.ImageColumns.BUCKET_ID; +import static android.provider.MediaStore.MediaColumns.DATA; +import static android.provider.MediaStore.MediaColumns.DATE_ADDED; +import static android.provider.MediaStore.MediaColumns.HEIGHT; +import static android.provider.MediaStore.MediaColumns.MIME_TYPE; +import static android.provider.MediaStore.MediaColumns.SIZE; +import static android.provider.MediaStore.MediaColumns.WIDTH; + +public class MediaStoreHelper { + + public final static int INDEX_ALL_PHOTOS = 0; + + public static class FetchMediaThread extends Thread { + WeakReference contextWeakReference; + PhotosResultCallback resultCallback; + int type; + + public FetchMediaThread(Context context, int type, PhotosResultCallback resultCallback) { + this.contextWeakReference = new WeakReference<>(context); + this.resultCallback = resultCallback; + this.type = type; + } + + @Override + public void run() { + if (contextWeakReference.get() == null) + return; + ContentResolver contentResolver = contextWeakReference.get().getContentResolver(); + ArrayList cursorArrayList = new ArrayList<>(); + Cursor videoCursor = contentResolver.query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI + , new String[]{MediaStore.Video.Media._ID, + MediaStore.Video.Media.DATA, + MediaStore.Video.Media.BUCKET_ID, + MediaStore.Video.Media.BUCKET_DISPLAY_NAME, + MediaStore.Video.Media.DATE_ADDED, + MediaStore.Video.Media.SIZE, + MediaStore.Video.Media.WIDTH, + MediaStore.Video.Media.HEIGHT, + MediaStore.Video.VideoColumns.DURATION, + MediaStore.Video.Media.MIME_TYPE} + , MIME_TYPE + "=? or " + MIME_TYPE + "=? or " + MIME_TYPE + "=? or " + MIME_TYPE + "=? " + , new String[]{"video/mpeg", "video/mp4", "video/3gpp", "video/avi"} + , MediaStore.Images.Media.DATE_ADDED + " DESC"); + if ((GalleryFinal.TYPE_VIDEO & type) == GalleryFinal.TYPE_VIDEO) { + cursorArrayList.add(videoCursor); + } + Cursor imageCursor = contentResolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI + , new String[]{MediaStore.Images.Media._ID, + MediaStore.Images.Media.DATA, + MediaStore.Images.Media.BUCKET_ID, + MediaStore.Images.Media.BUCKET_DISPLAY_NAME, + MediaStore.Images.Media.DATE_ADDED, + MediaStore.Images.Media.SIZE, + MediaStore.Video.Media.WIDTH, + MediaStore.Video.Media.HEIGHT, + MediaStore.Images.Media.MIME_TYPE} + , MIME_TYPE + "=? or " + MIME_TYPE + "=? or " + MIME_TYPE + "=? " + , new String[]{"image/jpeg", "image/png", "image/jpg"} + , MediaStore.Images.Media.DATE_ADDED + " DESC"); + if ((GalleryFinal.TYPE_IMAGE & type) == GalleryFinal.TYPE_IMAGE) { + cursorArrayList.add(imageCursor); + } + Cursor[] cursors = cursorArrayList.toArray(new Cursor[cursorArrayList.size()]); + MergeCursor data = new MergeCursor(cursors); + List directories = new ArrayList<>(); + if (contextWeakReference.get() == null) + return; + PhotoDirectory photoDirectoryAll = new PhotoDirectory(); + if(GalleryFinal.TYPE_IMAGE==type){ + photoDirectoryAll.setName("所有图片"); + photoDirectoryAll.setId(1); + }else if(GalleryFinal.TYPE_VIDEO==type){ + photoDirectoryAll.setName("所有视频"); + photoDirectoryAll.setId(1); + }else{ + photoDirectoryAll.setName(contextWeakReference.get().getString(R.string.image_video)); + photoDirectoryAll.setId(1); + } + PhotoDirectory videoDirectoryAll = new PhotoDirectory(); + videoDirectoryAll.setName(contextWeakReference.get().getString(R.string.all_video)); + videoDirectoryAll.setId(2); + while (data.moveToNext()) { + int imageId = data.getInt(data.getColumnIndexOrThrow(_ID)); + int bucketId = data.getInt(data.getColumnIndexOrThrow(BUCKET_ID)); + String name = data.getString(data.getColumnIndexOrThrow(BUCKET_DISPLAY_NAME)); + String path = data.getString(data.getColumnIndexOrThrow(DATA)); + long size = data.getLong(data.getColumnIndexOrThrow(SIZE)); + String mimeType = data.getString(data.getColumnIndexOrThrow(MIME_TYPE)); + int width = data.getInt(data.getColumnIndexOrThrow(WIDTH)); + int height = data.getInt(data.getColumnIndexOrThrow(HEIGHT)); + long addDate = data.getInt(data.getColumnIndexOrThrow(DATE_ADDED)); + if (size < 1) continue; + Photo photo = null; + if(mimeType.contains("video")){//视频 + long duration = data.getLong(data.getColumnIndexOrThrow(MediaStore.Video.VideoColumns.DURATION)); + int id = data.getInt(data.getColumnIndexOrThrow(_ID)); + String selection = MediaStore.Video.Thumbnails.VIDEO_ID +"=?"; + String[] selectionArgs = new String[]{id+""}; + Cursor thumbCursor = contentResolver.query(MediaStore.Video.Thumbnails.EXTERNAL_CONTENT_URI, null, selection, selectionArgs, null); + if(thumbCursor!=null&&thumbCursor.moveToFirst()){ + String thumbnailPath = thumbCursor.getString(thumbCursor.getColumnIndexOrThrow(MediaStore.Video.Thumbnails.DATA)); + photo = new Photo(imageId, path, mimeType, width, height, size,thumbnailPath,true); + photo.setDuration(duration); + videoDirectoryAll.addPhoto(photo); + } + if(thumbCursor != null){ + thumbCursor.close(); + } + }else{//非视频 + photo = new Photo(imageId, path, mimeType, width, height, size,"",false); + } + if(photo!=null){ + photo.setAdddate(addDate); + } + PhotoDirectory photoDirectory = null; + for (PhotoDirectory dir : directories) {//首次drectories为空 + if (dir.getId() == bucketId) { + photoDirectory = dir; + break; + } + } + if (photoDirectory == null&&!mimeType.contains("video")) {//生成新的路径,并填充到路径列表中 + photoDirectory = new PhotoDirectory(); + photoDirectory.setId(bucketId); + photoDirectory.setName(name); + photoDirectory.setCoverPath(path); + photoDirectory.setDateAdded(data.getLong(data.getColumnIndexOrThrow(DATE_ADDED))); + directories.add(photoDirectory); + } + if(photoDirectory != null&&!mimeType.contains("video")){ + photoDirectory.addPhoto(photo); + } + photoDirectoryAll.addPhoto(photo); + } + data.close(); + Collections.sort(photoDirectoryAll.getPhotos(), new Comparator() { + @Override + public int compare(Photo lhs, Photo rhs) { + return lhs.getAdddate() >= rhs.getAdddate() ? -1 : 1;//按照添加时间进行降序排序 + } + }); + if (photoDirectoryAll.getPhotoPaths().size() > 0) { + photoDirectoryAll.setCoverPath(photoDirectoryAll.getPhotoPaths().get(0)); + } + if ((GalleryFinal.TYPE_IMAGE & type) == GalleryFinal.TYPE_IMAGE) + directories.add(INDEX_ALL_PHOTOS, photoDirectoryAll); + if (!videoDirectoryAll.getPhotos().isEmpty() && (GalleryFinal.TYPE_VIDEO & type) == GalleryFinal.TYPE_VIDEO) { + videoDirectoryAll.setCoverPath(videoDirectoryAll.getPhotoPaths().get(0)); + directories.add(INDEX_ALL_PHOTOS + 1, videoDirectoryAll); + } + if (resultCallback != null) { + resultCallback.onResultCallback(directories); + } + } + } + + + public static void getPhotoDirs(final FragmentActivity activity, int type, final PhotosResultCallback resultCallback) { + new FetchMediaThread(activity, type, resultCallback).start(); + } + + + public interface PhotosResultCallback { + void onResultCallback(List directories); + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/mediapicker/view/MediaPickerActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/mediapicker/view/MediaPickerActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..8272c7c2e29487511ed9965e3c5f86f1bba3367d --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/mediapicker/view/MediaPickerActivity.java @@ -0,0 +1,270 @@ +package com.jiuqi.elove.widget.mediapicker.view; + +import android.Manifest; +import android.animation.ObjectAnimator; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.v4.app.ActivityCompat; +import android.support.v4.content.ContextCompat; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.GridLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.Toolbar; +import android.view.View; +import android.view.ViewStub; +import android.widget.AdapterView; +import android.widget.Button; +import android.widget.PopupWindow; +import android.widget.TextView; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.widget.mediapicker.adapter.GalleryAdapter; +import com.jiuqi.elove.widget.mediapicker.adapter.PopupDirectoryListAdapter; +import com.jiuqi.elove.widget.mediapicker.decoration.SpaceItemDecoration; +import com.jiuqi.elove.widget.mediapicker.model.Photo; +import com.jiuqi.elove.widget.mediapicker.model.PhotoDirectory; +import com.jiuqi.elove.widget.mediapicker.util.GalleryFinal; +import com.jiuqi.elove.widget.mediapicker.util.MediaManager; +import com.jiuqi.elove.widget.mediapicker.util.MediaStoreHelper; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class MediaPickerActivity extends AppCompatActivity implements MediaManager.OnCheckchangeListener { + private static int maxMedia; + final int MAX_MOUNTS_DEFALUT = 9; + RecyclerView imageRecyclerView; + GalleryAdapter galleryAdapter; + Button btnSend; + TextView tvPreview, tvDirectory; + View rootView,bar_divider; + PopupWindowMenu menuWindow; + private int type; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_media_picker); + initManagerAndLimitCount(); + checkPermissionAndGetImages(); + } + + private void initManagerAndLimitCount() { + MediaManager.getInstance().init();//获取工具并初始化list等必要信息,避免空指针 + readIntentParams();//获取上个页面的数据 + EventBus.getDefault().register(this);//eventbus注册 + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void sendMedia(ArrayList photoList) { + finish(); + } + + private void checkPermissionAndGetImages() { + if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){ + ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},1); + }else{ + initUi(); + } + } + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + switch (requestCode){ + case 1: + if(grantResults.length>0&&grantResults[0]== PackageManager.PERMISSION_GRANTED){ + initUi(); + } + break; + } + } + + @Override + protected void onDestroy() { + super.onDestroy(); + MediaManager.getInstance().removeOnCheckchangeListener(this); + EventBus.getDefault().unregister(this); + MediaManager.getInstance().clear(); + } + + private void initUi() { + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); +// setSupportActionBar(toolbar); + assert toolbar != null; + toolbar.setNavigationOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); +// toolbar.setTitleTextColor(getResources().getColor(R.color.white)); + toolbar.setNavigationIcon(R.drawable.icon_leftarrow); +// getSupportActionBar().setDisplayHomeAsUpEnabled(true); + tvDirectory = (TextView) findViewById(R.id.tv_dictory); + bar_divider = findViewById(R.id.bar_divider); + if(type== GalleryFinal.TYPE_IMAGE){ +// getSupportActionBar().setTitle("图片"); + toolbar.setTitle("图片"); + tvDirectory.setText("所有图片"); + }else if(type== GalleryFinal.TYPE_VIDEO){ + toolbar.setTitle("视频"); + tvDirectory.setText("所有视频"); + }else{ + toolbar.setTitle("图片和视频"); + } + tvDirectory.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + show(); + } + }); + Drawable drawable = getResources().getDrawable(R.drawable.btn_dropdown); + drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); + tvDirectory.setCompoundDrawables(null, null, drawable, null); + btnSend = (Button) findViewById(R.id.btn_send); + btnSend.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + MediaManager.getInstance().send(); + } + }); + tvPreview = (TextView) findViewById(R.id.tv_preview); + if(maxMedia==1){ + btnSend.setVisibility(View.GONE); + tvPreview.setVisibility(View.GONE); + bar_divider.setVisibility(View.GONE); + } + imageRecyclerView = (RecyclerView) findViewById(R.id.recycler_view); + imageRecyclerView.setLayoutManager(new GridLayoutManager(this, 3)); + imageRecyclerView.addItemDecoration(new SpaceItemDecoration(this, 1)); + imageRecyclerView.setHasFixedSize(true); + imageRecyclerView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY); + tvPreview.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(getBaseContext(), PreviewActivity.class); + startActivity(intent); + } + }); + MediaStoreHelper.getPhotoDirs(this, getIntent().getIntExtra("type", GalleryFinal.TYPE_ALL), new MediaStoreHelper.PhotosResultCallback() { + @Override + public void onResultCallback(List dirs) { + if (dirs.size() > 0) + dirs.get(0).setSelected(true); + MediaManager.getInstance().setPhotoDirectorys(dirs); + runOnUiThread(new Runnable() { + @Override + public void run() { + directoryChanged(); + } + }); + } + }); + } + + /** + * 获取可选取的最大数量并设置 + * 默认为9张 + */ + private void readIntentParams() { + Intent intent = getIntent(); + maxMedia = intent.getIntExtra("maxSum", MAX_MOUNTS_DEFALUT); + type = getIntent().getIntExtra("type", GalleryFinal.TYPE_ALL); + MediaManager.getInstance().setMaxMediaSum(maxMedia); + } + + /** + * 展示图片文件夹列表 + */ + private void show() { + if (menuWindow == null) { + menuWindow = new PopupWindowMenu(MediaPickerActivity.this, new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + directoryChanged(); + tvDirectory.setText(MediaManager.getInstance().getPhotoDirectorys().get(position).getName()); + } + }); + menuWindow.setOnDismissListener(new PopupWindow.OnDismissListener() { + @Override + public void onDismiss() { + imageRecyclerView.setAlpha(1.0f); + } + }); + PopupDirectoryListAdapter popupDirectoryListAdapter = new PopupDirectoryListAdapter(MediaManager.getInstance().getPhotoDirectorys()); + menuWindow.setAdapter(popupDirectoryListAdapter); + menuWindow.setHeight(calculatePopupWindowHeight(menuWindow.getAdapter().getCount())); + } + ObjectAnimator.ofFloat(imageRecyclerView, "alpha", 1.0f, 0.2f).setDuration(600).start(); + menuWindow.showAsDropDown(findViewById(R.id.bottom)); + } + + /** + * 文件夹路径改变 + */ + private void directoryChanged() { + if (MediaManager.getInstance().getPhotoDirectorys().isEmpty()) { + ViewStub emptyStub = ((ViewStub) findViewById(R.id.stub_empty)); + emptyStub.inflate(); + return; + } + if (galleryAdapter == null) { + galleryAdapter = new GalleryAdapter(MediaPickerActivity.this, MediaManager.getInstance().getSelectDirectory()); + galleryAdapter.setImageRecyclerView(imageRecyclerView); + imageRecyclerView.setAdapter(galleryAdapter); + MediaManager.getInstance().addOnCheckchangeListener(MediaPickerActivity.this); + galleryAdapter.setOnItemClickListener(new GalleryItemClickImpl()); + } else { + galleryAdapter.setImages(MediaManager.getInstance().getSelectDirectory()); + imageRecyclerView.getLayoutManager().scrollToPosition(0); + } + } + + /** + *计算popupwindow的高度 + */ + private int calculatePopupWindowHeight(int count) { + int maxHeight = imageRecyclerView.getMeasuredHeight() - getResources().getDimensionPixelSize(R.dimen.dimen90); + int windowHeight = count * getResources().getDimensionPixelOffset(R.dimen.dimen200); + windowHeight = windowHeight < maxHeight ? windowHeight : maxHeight; + return windowHeight; + } + + @Override + public void onCheckedChanged(Map checkStaus, int changedId, boolean uiUpdated) { + final int checkSize = checkStaus.size(); + btnSend.setEnabled(checkSize != 0); + btnSend.setText(checkSize == 0 ? getString(R.string.btn_send) : String.format(getString(R.string.send_multi), checkSize, MediaManager.getInstance().getMaxMediaSum())); + + tvPreview.setEnabled(checkSize != 0); + tvPreview.setText(checkSize == 0 ? getString(R.string.preview) : getString(R.string.preview_multi, checkSize)); + if (!uiUpdated) + galleryAdapter.updateCheckbox(changedId); + } + + /** + * 不使用匿名内部类,避免出现内存泄漏 + */ + private static class GalleryItemClickImpl implements AdapterView.OnItemClickListener { + + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + if(1==maxMedia){ + MediaManager.getInstance().send(); + }else{ + Intent intent = new Intent(view.getContext(), PreviewActivity.class); + intent.putExtra("index", position); + intent.putExtra("dir", MediaManager.getInstance().getSelectIndex()); + view.getContext().startActivity(intent); + } + } + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/mediapicker/view/PopupWindowMenu.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/mediapicker/view/PopupWindowMenu.java new file mode 100644 index 0000000000000000000000000000000000000000..17dd0d5bf72d0cb690e92c9832d53493aeb3d031 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/mediapicker/view/PopupWindowMenu.java @@ -0,0 +1,66 @@ +package com.jiuqi.elove.widget.mediapicker.view; + +import android.app.Activity; +import android.graphics.drawable.ColorDrawable; +import android.os.Handler; +import android.view.View; +import android.view.ViewGroup.LayoutParams; +import android.widget.AdapterView; +import android.widget.BaseAdapter; +import android.widget.ListView; +import android.widget.PopupWindow; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.widget.mediapicker.util.MediaManager; + +public class PopupWindowMenu extends PopupWindow { + + ListView listView; + BaseAdapter baseAdapter; + + public PopupWindowMenu(Activity context, final AdapterView.OnItemClickListener onItemClickListener) { + super(context); + listView = new ListView(context); + this.setContentView(listView); + this.setWidth(LayoutParams.MATCH_PARENT); + this.setHeight(LayoutParams.WRAP_CONTENT); + this.setFocusable(true); + this.setAnimationStyle(R.style.mypopwindow_anim_style); + ColorDrawable dw = new ColorDrawable(0xffffffff); +// ColorDrawable dw = new ColorDrawable(0xb0000000); + this.setBackgroundDrawable(dw); + listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + MediaManager mediaManager = MediaManager.getInstance(); + if (position == mediaManager.getSelectIndex()) { + dismiss(); + return; + } + + mediaManager.getSelectDirectory().setSelected(false); + mediaManager.getPhotoDirectorys().get(position).setSelected(true); + mediaManager.setSelectIndex(position); + baseAdapter.notifyDataSetChanged(); + if (onItemClickListener != null) + onItemClickListener.onItemClick(parent, view, position, id); + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + dismiss();//直接关闭的话视图不会立刻修改过来,看起来不舒服,等他修改过来后再关闭,体验好些 + } + }, 200); + } + }); + } + + public void setAdapter(BaseAdapter baseAdapter) { + listView.setAdapter(baseAdapter); + this.baseAdapter = baseAdapter; + } + + public BaseAdapter getAdapter() { + return baseAdapter; + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/mediapicker/view/PreviewActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/mediapicker/view/PreviewActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..b2b39ae139a6fe68994475c1496638ce09bbc837 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/mediapicker/view/PreviewActivity.java @@ -0,0 +1,328 @@ +package com.jiuqi.elove.widget.mediapicker.view; + +import android.content.Context; +import android.content.Intent; +import android.graphics.Bitmap; +import android.net.Uri; +import android.os.Bundle; +import android.support.v4.view.PagerAdapter; +import android.support.v4.view.ViewPager; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.Toolbar; +import android.util.SparseArray; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.Toast; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.Priority; +import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool; +import com.bumptech.glide.load.resource.bitmap.BitmapTransformation; +import com.bumptech.glide.load.resource.bitmap.TransformationUtils; +import com.jiuqi.elove.R; +import com.jiuqi.elove.widget.mediapicker.model.Photo; +import com.jiuqi.elove.widget.mediapicker.util.MediaManager; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Queue; + +public class PreviewActivity extends AppCompatActivity implements MediaManager.OnCheckchangeListener { + + Button btnSend; + ViewPager viewPager; + ImageAdapter imageAdapter; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_preview); + initUi(); + EventBus.getDefault().register(this); + } + + private void initUi() { + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + toolbar.setNavigationOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + toolbar.setNavigationIcon(R.drawable.icon_leftarrow); + toolbar.setTitleTextColor(getResources().getColor(R.color.white)); + btnSend = (Button) findViewById(R.id.btn_send); + btnSend.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + MediaManager.getInstance().send(); + } + }); + viewPager = (ViewPager) findViewById(R.id.view_pager); + viewPager.setPageTransformer(true, new DepthPageTransformer()); + int index = getIntent().getIntExtra("index", 0); + int dirIndex = getIntent().getIntExtra("dir", -1); + List selectPhotoList; + if (dirIndex == -1) { + selectPhotoList = new ArrayList<>(); + for (Integer integer : MediaManager.getInstance().getCheckStatus().keySet()) { + Photo photo = MediaManager.getInstance().getCheckStatus().get(integer); + selectPhotoList.add(photo); + } + } else { + selectPhotoList = MediaManager.getInstance().getPhotoDirectorys().get(dirIndex).getPhotos(); + } + getSupportActionBar().setTitle((index + 1) + "/" + selectPhotoList.size()); + imageAdapter = new ImageAdapter(this, selectPhotoList); + viewPager.setAdapter(imageAdapter); + viewPager.setCurrentItem(index); + viewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { + @Override + public void onPageSelected(int position) { + super.onPageSelected(position); + updateUi(position); + } + }); + MediaManager.getInstance().addOnCheckchangeListener(this); + onCheckedChanged(MediaManager.getInstance().getCheckStatus(), 0, true); + updateUi(viewPager.getCurrentItem()); + } + + private void updateUi(int position) { + getSupportActionBar().setTitle((position + 1) + "/" + imageAdapter.getCount()); + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void sendMedia(ArrayList photoList) { + finish(); + } + + protected void onDestroy() { + super.onDestroy(); + imageAdapter.clearCache(); + MediaManager.getInstance().removeOnCheckchangeListener(this); + EventBus.getDefault().unregister(this); + } + + @Override + public void onCheckedChanged(Map checkStaus, int changedId, boolean uiUpdated) { + btnSend.setEnabled(!checkStaus.isEmpty()); + btnSend.setText(checkStaus.isEmpty() ? getString(R.string.btn_send) : String.format(getString(R.string.send_multi), checkStaus.size(), MediaManager.getInstance().getMaxMediaSum())); + } + + public static class PagerHolder extends RecyclerView.ViewHolder { + public TouchImageView touchImageView; + public ImageView ivVideoPlay; + public int viewType; + String url = ""; + + public PagerHolder(View itemView) { + super(itemView); + touchImageView = (TouchImageView) itemView.findViewById(R.id.iv_touch); + ivVideoPlay = (ImageView) itemView.findViewById(R.id.iv_play); + touchImageView.setMaxZoom(6); + touchImageView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + EventBus.getDefault().post(url); + } + }); + + if (ivVideoPlay != null) { + ivVideoPlay.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Context context = v.getContext(); + Intent intent = new Intent(Intent.ACTION_VIEW); + intent.setDataAndType(Uri.parse(url), "video/*"); + try { + context.startActivity(intent); + } catch (Exception e) { + e.printStackTrace(); + Toast.makeText(context, context.getString(R.string.play_video_fail), Toast.LENGTH_SHORT).show(); + } + } + }); + } + } + + public void bindData(Photo photo) { + url = "file:///" + photo.getPath(); + Glide.with(touchImageView.getContext()).load(url) + .placeholder(android.R.color.black) + .priority(Priority.IMMEDIATE) + .transform(new FitOrCenterBitmapTransformation(touchImageView.getContext(), photo.getWidth(), photo.getHeight())) + .diskCacheStrategy(DiskCacheStrategy.NONE) + .into(touchImageView); + + } + } + + public static class FitOrCenterBitmapTransformation extends BitmapTransformation { + int imageWidth, imageHeight; + float imageRatio; + + public FitOrCenterBitmapTransformation(Context context, int imageWidth, int imageHeight) { + super(context); + this.imageWidth = imageWidth; + this.imageHeight = imageHeight; + imageRatio = imageWidth * 1.0f / imageHeight; + } + + /** + * 我需要的图片缩放的效果是:图片的宽能填满控件,高可以不填满控件,fitCenter方式在图片的宽高比大于控件的宽高比的时候没问题,小于的时候宽就不能填满控件的宽了,这个时候可以用centercrop来 + * + * @param pool + * @param toTransform + * @param outWidth + * @param outHeight + * @return + */ + @Override + protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) { + float viewRatio = outWidth * 1.0f / outHeight; + if (imageRatio >= viewRatio) { + return TransformationUtils.fitCenter(toTransform, pool, outWidth, outHeight); + } else { + final Bitmap toReuse = pool.get(outWidth, outHeight, toTransform.getConfig() != null + ? toTransform.getConfig() : Bitmap.Config.ARGB_8888); + Bitmap transformed = TransformationUtils.centerCrop(toReuse, toTransform, outWidth, outHeight); + if (toReuse != null && toReuse != transformed && !pool.put(toReuse)) { + toReuse.recycle(); + } + return transformed; + } + } + + @Override + public String getId() { + return "FitCenterOrCenterCrop.com.bumptech.glide.load.resource.bitmap"; + } + } + + public class ImageAdapter extends PagerAdapter { + List images; + LayoutInflater layoutInflater; + SparseArray> caches = new SparseArray<>(); + + + public ImageAdapter(Context context, List images) { + this.images = images; + layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + } + + public PagerHolder onCreateViewHolder(ViewGroup parent, int viewType) { + switch (viewType) { + case 1: + PagerHolder pagerHolder = new PagerHolder(layoutInflater.inflate(R.layout.preview_video_item, parent, false)); + pagerHolder.viewType = viewType; + return pagerHolder; + case 2: + pagerHolder = new PagerHolder(layoutInflater.inflate(R.layout.preview_image_item, parent, false)); + pagerHolder.viewType = viewType; + return pagerHolder; + } + return null; + } + + public void onBindViewHolder(PagerHolder holder, int position) { + holder.bindData(images.get(position)); + } + + public int getItemViewType(int position) { + return getItem(position).getMimetype().contains("video") ? 1 : 2; + } + + @Override + public void destroyItem(ViewGroup container, int position, Object object) { + container.removeView((View) object); + PagerHolder pagerHolder = (PagerHolder) ((View) object).getTag(R.id.tag_holder); + if (pagerHolder != null) caches.get(getItemViewType(position)).offer(pagerHolder); + } + + public Photo getItem(int position) { + return images.get(position); + } + + @Override + public int getCount() { + return images.size(); + } + + @Override + public Object instantiateItem(ViewGroup container, int position) { + int viewType = getItemViewType(position); + Queue pagerHolderList = caches.get(viewType); + if (pagerHolderList == null) { + pagerHolderList = new ArrayDeque<>(); + caches.put(viewType, pagerHolderList); + } + PagerHolder pagerHolder = pagerHolderList.poll(); + if (pagerHolder == null) { + pagerHolder = onCreateViewHolder(container, viewType); + } + container.addView(pagerHolder.itemView); + onBindViewHolder(pagerHolder, position); + pagerHolder.itemView.setTag(R.id.tag_holder, pagerHolder); + return pagerHolder.itemView; + } + + @Override + public boolean isViewFromObject(View view, Object object) { + return view == object; + } + + public void clearCache() { + caches.clear(); + } + } + + public class DepthPageTransformer implements ViewPager.PageTransformer { + private static final float MIN_SCALE = 0.75f; + + public void transformPage(View view, float position) { + int pageWidth = view.getWidth(); + + if (position < -1) { // [-Infinity,-1) + // This page is way off-screen to the left. + view.setAlpha(0); + + } else if (position <= 0) { // [-1,0] + // Use the default slide transition when moving to the left page + view.setAlpha(1); + view.setTranslationX(0); + view.setScaleX(1); + view.setScaleY(1); + + } else if (position <= 1) { // (0,1] + // Fade the page out. + view.setAlpha(1 - position); + + // Counteract the default slide transition + view.setTranslationX(pageWidth * -position); + + // Scale the page down (between MIN_SCALE and 1) + float scaleFactor = MIN_SCALE + + (1 - MIN_SCALE) * (1 - Math.abs(position)); + view.setScaleX(scaleFactor); + view.setScaleY(scaleFactor); + + } else { // (1,+Infinity] + // This page is way off-screen to the right. + view.setAlpha(0); + } + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/mediapicker/view/SquareImageView.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/mediapicker/view/SquareImageView.java new file mode 100644 index 0000000000000000000000000000000000000000..c93d0f1c4cd4c85728d961f233aeec30b7f43500 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/mediapicker/view/SquareImageView.java @@ -0,0 +1,59 @@ +package com.jiuqi.elove.widget.mediapicker.view; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.drawable.Drawable; +import android.support.v7.widget.AppCompatImageView; +import android.util.AttributeSet; + +public class SquareImageView extends AppCompatImageView { + Drawable shade; + boolean showShade = false; + + public SquareImageView(Context context) { + super(context); + } + + public SquareImageView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public SquareImageView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + if (showShade && shade != null) { + shade.setBounds(0, 0, getWidth(), getHeight()); + shade.draw(canvas); + } + } + + public boolean isShowShade() { + return showShade; + } + + public Drawable getShade() { + return shade; + } + + public void setShade(Drawable shade) { + this.shade = shade; + } + + public void setShowShade(boolean showShade) { + this.showShade = showShade; + invalidate(); + } + + public void justSetShowShade(boolean showShade) { + this.showShade = showShade; + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, widthMeasureSpec); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/mediapicker/view/TouchImageView.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/mediapicker/view/TouchImageView.java new file mode 100644 index 0000000000000000000000000000000000000000..37a4a56b6c4fe9042206a19fb662679f1c70a9e8 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/mediapicker/view/TouchImageView.java @@ -0,0 +1,1269 @@ +package com.jiuqi.elove.widget.mediapicker.view; + + +import android.annotation.TargetApi; +import android.content.Context; +import android.content.res.Configuration; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Matrix; +import android.graphics.PointF; +import android.graphics.RectF; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.os.Build.VERSION; +import android.os.Build.VERSION_CODES; +import android.os.Bundle; +import android.os.Parcelable; +import android.support.v7.widget.AppCompatImageView; +import android.util.AttributeSet; +import android.util.Log; +import android.view.GestureDetector; +import android.view.MotionEvent; +import android.view.ScaleGestureDetector; +import android.view.View; +import android.view.animation.AccelerateDecelerateInterpolator; +import android.widget.OverScroller; +import android.widget.Scroller; + +public class TouchImageView extends AppCompatImageView { + + private static final String DEBUG = "DEBUG"; + + // + // SuperMin and SuperMax multipliers. Determine how much the image can be + // zoomed below or above the zoom boundaries, before animating back to the + // min/max zoom boundary. + // + private static final float SUPER_MIN_MULTIPLIER = .75f; + private static final float SUPER_MAX_MULTIPLIER = 1.25f; + + // + // Scale of image ranges from minScale to maxScale, where minScale == 1 + // when the image is stretched to fit view. + // + private float normalizedScale; + + // + // Matrix applied to image. MSCALE_X and MSCALE_Y should always be equal. + // MTRANS_X and MTRANS_Y are the other values used. prevMatrix is the matrix + // saved prior to the screen rotating. + // + private Matrix matrix, prevMatrix; + + private enum State { NONE, DRAG, ZOOM, FLING, ANIMATE_ZOOM } + private State state; + + private float minScale; + private float maxScale; + private float superMinScale; + private float superMaxScale; + private float[] m; + + private Context context; + private Fling fling; + + private ScaleType mScaleType; + + private boolean imageRenderedAtLeastOnce; + private boolean onDrawReady; + + private ZoomVariables delayedZoomVariables; + + // + // Size of view and previous view size (ie before rotation) + // + private int viewWidth, viewHeight, prevViewWidth, prevViewHeight; + + // + // Size of image when it is stretched to fit view. Before and After rotation. + // + private float matchViewWidth, matchViewHeight, prevMatchViewWidth, prevMatchViewHeight; + + private ScaleGestureDetector mScaleDetector; + private GestureDetector mGestureDetector; + private GestureDetector.OnDoubleTapListener doubleTapListener = null; + private OnTouchListener userTouchListener = null; + private OnTouchImageViewListener touchImageViewListener = null; + + public TouchImageView(Context context) { + super(context); + sharedConstructing(context); + } + + public TouchImageView(Context context, AttributeSet attrs) { + super(context, attrs); + sharedConstructing(context); + } + + public TouchImageView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + sharedConstructing(context); + } + + private void sharedConstructing(Context context) { + super.setClickable(true); + this.context = context; + mScaleDetector = new ScaleGestureDetector(context, new ScaleListener()); + mGestureDetector = new GestureDetector(context, new GestureListener()); + matrix = new Matrix(); + prevMatrix = new Matrix(); + m = new float[9]; + normalizedScale = 1; + if (mScaleType == null) { + mScaleType = ScaleType.FIT_CENTER; + } + minScale = 1; + maxScale = 3; + superMinScale = SUPER_MIN_MULTIPLIER * minScale; + superMaxScale = SUPER_MAX_MULTIPLIER * maxScale; + setImageMatrix(matrix); + setScaleType(ScaleType.MATRIX); + setState(State.NONE); + onDrawReady = false; + super.setOnTouchListener(new PrivateOnTouchListener()); + } + + @Override + public void setOnTouchListener(OnTouchListener l) { + userTouchListener = l; + } + + public void setOnTouchImageViewListener(OnTouchImageViewListener l) { + touchImageViewListener = l; + } + + public void setOnDoubleTapListener(GestureDetector.OnDoubleTapListener l) { + doubleTapListener = l; + } + + @Override + public void setImageResource(int resId) { + super.setImageResource(resId); + savePreviousImageValues(); + fitImageToView(); + } + + @Override + public void setImageBitmap(Bitmap bm) { + super.setImageBitmap(bm); + savePreviousImageValues(); + fitImageToView(); + } + + @Override + public void setImageDrawable(Drawable drawable) { + super.setImageDrawable(drawable); + savePreviousImageValues(); + fitImageToView(); + } + + @Override + public void setImageURI(Uri uri) { + super.setImageURI(uri); + savePreviousImageValues(); + fitImageToView(); + } + + @Override + public void setScaleType(ScaleType type) { + if (type == ScaleType.FIT_START || type == ScaleType.FIT_END) { + throw new UnsupportedOperationException("TouchImageView does not support FIT_START or FIT_END"); + } + if (type == ScaleType.MATRIX) { + super.setScaleType(ScaleType.MATRIX); + + } else { + mScaleType = type; + if (onDrawReady) { + // + // If the image is already rendered, scaleType has been called programmatically + // and the TouchImageView should be updated with the new scaleType. + // + setZoom(this); + } + } + } + + @Override + public ScaleType getScaleType() { + return mScaleType; + } + + /** + * Returns false if image is in initial, unzoomed state. False, otherwise. + * @return true if image is zoomed + */ + public boolean isZoomed() { + return normalizedScale != 1; + } + + /** + * Return a Rect representing the zoomed image. + * @return rect representing zoomed image + */ + public RectF getZoomedRect() { + if (mScaleType == ScaleType.FIT_XY) { + throw new UnsupportedOperationException("getZoomedRect() not supported with FIT_XY"); + } + PointF topLeft = transformCoordTouchToBitmap(0, 0, true); + PointF bottomRight = transformCoordTouchToBitmap(viewWidth, viewHeight, true); + + float w = getDrawable().getIntrinsicWidth(); + float h = getDrawable().getIntrinsicHeight(); + return new RectF(topLeft.x / w, topLeft.y / h, bottomRight.x / w, bottomRight.y / h); + } + + /** + * Save the current matrix and view dimensions + * in the prevMatrix and prevView variables. + */ + private void savePreviousImageValues() { + if (matrix != null && viewHeight != 0 && viewWidth != 0) { + matrix.getValues(m); + prevMatrix.setValues(m); + prevMatchViewHeight = matchViewHeight; + prevMatchViewWidth = matchViewWidth; + prevViewHeight = viewHeight; + prevViewWidth = viewWidth; + } + } + + @Override + public Parcelable onSaveInstanceState() { + Bundle bundle = new Bundle(); + bundle.putParcelable("instanceState", super.onSaveInstanceState()); + bundle.putFloat("saveScale", normalizedScale); + bundle.putFloat("matchViewHeight", matchViewHeight); + bundle.putFloat("matchViewWidth", matchViewWidth); + bundle.putInt("viewWidth", viewWidth); + bundle.putInt("viewHeight", viewHeight); + matrix.getValues(m); + bundle.putFloatArray("matrix", m); + bundle.putBoolean("imageRendered", imageRenderedAtLeastOnce); + return bundle; + } + + @Override + public void onRestoreInstanceState(Parcelable state) { + if (state instanceof Bundle) { + Bundle bundle = (Bundle) state; + normalizedScale = bundle.getFloat("saveScale"); + m = bundle.getFloatArray("matrix"); + prevMatrix.setValues(m); + prevMatchViewHeight = bundle.getFloat("matchViewHeight"); + prevMatchViewWidth = bundle.getFloat("matchViewWidth"); + prevViewHeight = bundle.getInt("viewHeight"); + prevViewWidth = bundle.getInt("viewWidth"); + imageRenderedAtLeastOnce = bundle.getBoolean("imageRendered"); + super.onRestoreInstanceState(bundle.getParcelable("instanceState")); + return; + } + + super.onRestoreInstanceState(state); + } + + @Override + protected void onDraw(Canvas canvas) { + onDrawReady = true; + imageRenderedAtLeastOnce = true; + if (delayedZoomVariables != null) { + setZoom(delayedZoomVariables.scale, delayedZoomVariables.focusX, delayedZoomVariables.focusY, delayedZoomVariables.scaleType); + delayedZoomVariables = null; + } + super.onDraw(canvas); + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + savePreviousImageValues(); + } + + /** + * Get the max zoom multiplier. + * @return max zoom multiplier. + */ + public float getMaxZoom() { + return maxScale; + } + + /** + * Set the max zoom multiplier. Default value: 3. + * @param max max zoom multiplier. + */ + public void setMaxZoom(float max) { + maxScale = max; + superMaxScale = SUPER_MAX_MULTIPLIER * maxScale; + } + + /** + * Get the min zoom multiplier. + * @return min zoom multiplier. + */ + public float getMinZoom() { + return minScale; + } + + /** + * Get the current zoom. This is the zoom relative to the initial + * scale, not the original resource. + * @return current zoom multiplier. + */ + public float getCurrentZoom() { + return normalizedScale; + } + + /** + * Set the min zoom multiplier. Default value: 1. + * @param min min zoom multiplier. + */ + public void setMinZoom(float min) { + minScale = min; + superMinScale = SUPER_MIN_MULTIPLIER * minScale; + } + + /** + * Reset zoom and translation to initial state. + */ + public void resetZoom() { + normalizedScale = 1; + fitImageToView(); + } + + /** + * Set zoom to the specified scale. Image will be centered by default. + * @param scale + */ + public void setZoom(float scale) { + setZoom(scale, 0.5f, 0.5f); + } + + /** + * Set zoom to the specified scale. Image will be centered around the point + * (focusX, focusY). These floats range from 0 to 1 and denote the focus point + * as a fraction from the left and top of the view. For example, the top left + * corner of the image would be (0, 0). And the bottom right corner would be (1, 1). + * @param scale + * @param focusX + * @param focusY + */ + public void setZoom(float scale, float focusX, float focusY) { + setZoom(scale, focusX, focusY, mScaleType); + } + + /** + * Set zoom to the specified scale. Image will be centered around the point + * (focusX, focusY). These floats range from 0 to 1 and denote the focus point + * as a fraction from the left and top of the view. For example, the top left + * corner of the image would be (0, 0). And the bottom right corner would be (1, 1). + * @param scale + * @param focusX + * @param focusY + * @param scaleType + */ + public void setZoom(float scale, float focusX, float focusY, ScaleType scaleType) { + // + // setZoom can be called before the image is on the screen, but at this point, + // image and view sizes have not yet been calculated in onMeasure. Thus, we should + // delay calling setZoom until the view has been measured. + // + if (!onDrawReady) { + delayedZoomVariables = new ZoomVariables(scale, focusX, focusY, scaleType); + return; + } + + if (scaleType != mScaleType) { + setScaleType(scaleType); + } + resetZoom(); + scaleImage(scale, viewWidth / 2, viewHeight / 2, true); + matrix.getValues(m); + m[Matrix.MTRANS_X] = -((focusX * getImageWidth()) - (viewWidth * 0.5f)); + m[Matrix.MTRANS_Y] = -((focusY * getImageHeight()) - (viewHeight * 0.5f)); + matrix.setValues(m); + fixTrans(); + setImageMatrix(matrix); + } + + /** + * Set zoom parameters equal to another TouchImageView. Including scale, position, + * and ScaleType. + */ + public void setZoom(TouchImageView img) { + PointF center = img.getScrollPosition(); + setZoom(img.getCurrentZoom(), center.x, center.y, img.getScaleType()); + } + + /** + * Return the point at the center of the zoomed image. The PointF coordinates range + * in value between 0 and 1 and the focus point is denoted as a fraction from the left + * and top of the view. For example, the top left corner of the image would be (0, 0). + * And the bottom right corner would be (1, 1). + * @return PointF representing the scroll position of the zoomed image. + */ + public PointF getScrollPosition() { + Drawable drawable = getDrawable(); + if (drawable == null) { + return null; + } + int drawableWidth = drawable.getIntrinsicWidth(); + int drawableHeight = drawable.getIntrinsicHeight(); + + PointF point = transformCoordTouchToBitmap(viewWidth / 2, viewHeight / 2, true); + point.x /= drawableWidth; + point.y /= drawableHeight; + return point; + } + + /** + * Set the focus point of the zoomed image. The focus points are denoted as a fraction from the + * left and top of the view. The focus points can range in value between 0 and 1. + * @param focusX + * @param focusY + */ + public void setScrollPosition(float focusX, float focusY) { + setZoom(normalizedScale, focusX, focusY); + } + + /** + * Performs boundary checking and fixes the image matrix if it + * is out of bounds. + */ + private void fixTrans() { + matrix.getValues(m); + float transX = m[Matrix.MTRANS_X]; + float transY = m[Matrix.MTRANS_Y]; + + float fixTransX = getFixTrans(transX, viewWidth, getImageWidth()); + float fixTransY = getFixTrans(transY, viewHeight, getImageHeight()); + + if (fixTransX != 0 || fixTransY != 0) { + matrix.postTranslate(fixTransX, fixTransY); + } + } + + /** + * When transitioning from zooming from focus to zoom from center (or vice versa) + * the image can become unaligned within the view. This is apparent when zooming + * quickly. When the content size is less than the view size, the content will often + * be centered incorrectly within the view. fixScaleTrans first calls fixTrans() and + * then makes sure the image is centered correctly within the view. + */ + private void fixScaleTrans() { + fixTrans(); + matrix.getValues(m); + if (getImageWidth() < viewWidth) { + m[Matrix.MTRANS_X] = (viewWidth - getImageWidth()) / 2; + } + + if (getImageHeight() < viewHeight) { + m[Matrix.MTRANS_Y] = (viewHeight - getImageHeight()) / 2; + } + matrix.setValues(m); + } + + private float getFixTrans(float trans, float viewSize, float contentSize) { + float minTrans, maxTrans; + + if (contentSize <= viewSize) { + minTrans = 0; + maxTrans = viewSize - contentSize; + + } else { + minTrans = viewSize - contentSize; + maxTrans = 0; + } + + if (trans < minTrans) + return -trans + minTrans; + if (trans > maxTrans) + return -trans + maxTrans; + return 0; + } + + private float getFixDragTrans(float delta, float viewSize, float contentSize) { + if (contentSize <= viewSize) { + return 0; + } + return delta; + } + + private float getImageWidth() { + return matchViewWidth * normalizedScale; + } + + private float getImageHeight() { + return matchViewHeight * normalizedScale; + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + Drawable drawable = getDrawable(); + if (drawable == null || drawable.getIntrinsicWidth() == 0 || drawable.getIntrinsicHeight() == 0) { + setMeasuredDimension(0, 0); + return; + } + + int drawableWidth = drawable.getIntrinsicWidth(); + int drawableHeight = drawable.getIntrinsicHeight(); + int widthSize = MeasureSpec.getSize(widthMeasureSpec); + int widthMode = MeasureSpec.getMode(widthMeasureSpec); + int heightSize = MeasureSpec.getSize(heightMeasureSpec); + int heightMode = MeasureSpec.getMode(heightMeasureSpec); + viewWidth = setViewSize(widthMode, widthSize, drawableWidth); + viewHeight = setViewSize(heightMode, heightSize, drawableHeight); + + // + // Set view dimensions + // + setMeasuredDimension(viewWidth, viewHeight); + + // + // Fit content within view + // + fitImageToView(); + } + + /** + * If the normalizedScale is equal to 1, then the image is made to fit the screen. Otherwise, + * it is made to fit the screen according to the dimensions of the previous image matrix. This + * allows the image to maintain its zoom after rotation. + */ + private void fitImageToView() { + Drawable drawable = getDrawable(); + if (drawable == null || drawable.getIntrinsicWidth() == 0 || drawable.getIntrinsicHeight() == 0) { + return; + } + if (matrix == null || prevMatrix == null) { + return; + } + + int drawableWidth = drawable.getIntrinsicWidth(); + int drawableHeight = drawable.getIntrinsicHeight(); + + // + // Scale image for view + // + float scaleX = (float) viewWidth / drawableWidth; + float scaleY = (float) viewHeight / drawableHeight; + + switch (mScaleType) { + case CENTER: + scaleX = scaleY = 1; + break; + + case CENTER_CROP: + scaleX = scaleY = Math.max(scaleX, scaleY); + break; + + case CENTER_INSIDE: + scaleX = scaleY = Math.min(1, Math.min(scaleX, scaleY)); + + case FIT_CENTER: + scaleX = scaleY = Math.min(scaleX, scaleY); + break; + + case FIT_XY: + break; + + default: + // + // FIT_START and FIT_END not supported + // + throw new UnsupportedOperationException("TouchImageView does not support FIT_START or FIT_END"); + + } + + // + // Center the image + // + float redundantXSpace = viewWidth - (scaleX * drawableWidth); + float redundantYSpace = viewHeight - (scaleY * drawableHeight); + matchViewWidth = viewWidth - redundantXSpace; + matchViewHeight = viewHeight - redundantYSpace; + if (!isZoomed() && !imageRenderedAtLeastOnce) { + // + // Stretch and center image to fit view + // + matrix.setScale(scaleX, scaleY); + matrix.postTranslate(redundantXSpace / 2, redundantYSpace / 2); + normalizedScale = 1; + + } else { + // + // These values should never be 0 or we will set viewWidth and viewHeight + // to NaN in translateMatrixAfterRotate. To avoid this, call savePreviousImageValues + // to set them equal to the current values. + // + if (prevMatchViewWidth == 0 || prevMatchViewHeight == 0) { + savePreviousImageValues(); + } + + prevMatrix.getValues(m); + + // + // Rescale Matrix after rotation + // + m[Matrix.MSCALE_X] = matchViewWidth / drawableWidth * normalizedScale; + m[Matrix.MSCALE_Y] = matchViewHeight / drawableHeight * normalizedScale; + + // + // TransX and TransY from previous matrix + // + float transX = m[Matrix.MTRANS_X]; + float transY = m[Matrix.MTRANS_Y]; + + // + // Width + // + float prevActualWidth = prevMatchViewWidth * normalizedScale; + float actualWidth = getImageWidth(); + translateMatrixAfterRotate(Matrix.MTRANS_X, transX, prevActualWidth, actualWidth, prevViewWidth, viewWidth, drawableWidth); + + // + // Height + // + float prevActualHeight = prevMatchViewHeight * normalizedScale; + float actualHeight = getImageHeight(); + translateMatrixAfterRotate(Matrix.MTRANS_Y, transY, prevActualHeight, actualHeight, prevViewHeight, viewHeight, drawableHeight); + + // + // Set the matrix to the adjusted scale and translate values. + // + matrix.setValues(m); + } + fixTrans(); + setImageMatrix(matrix); + } + + /** + * Set view dimensions based on layout params + * + * @param mode + * @param size + * @param drawableWidth + * @return + */ + private int setViewSize(int mode, int size, int drawableWidth) { + int viewSize; + if(mode== MeasureSpec.EXACTLY){ + viewSize = size; + }else if(mode== MeasureSpec.AT_MOST){ + viewSize = Math.min(drawableWidth, size); + }else if(mode== MeasureSpec.UNSPECIFIED){ + viewSize = drawableWidth; + }else{ + viewSize = size; + } +// switch (mode) { +// case MeasureSpec.EXACTLY: +// viewSize = size; +// break; +// +// case MeasureSpec.AT_MOST: +// viewSize = Math.min(drawableWidth, size); +// break; +// +// case MeasureSpec.UNSPECIFIED: +// viewSize = drawableWidth; +// break; +// +// default: +// viewSize = size; +// break; +// } + return viewSize; + } + + /** + * After rotating, the matrix needs to be translated. This function finds the area of image + * which was previously centered and adjusts translations so that is again the center, post-rotation. + * + * @param axis Matrix.MTRANS_X or Matrix.MTRANS_Y + * @param trans the value of trans in that axis before the rotation + * @param prevImageSize the width/height of the image before the rotation + * @param imageSize width/height of the image after rotation + * @param prevViewSize width/height of view before rotation + * @param viewSize width/height of view after rotation + * @param drawableSize width/height of drawable + */ + private void translateMatrixAfterRotate(int axis, float trans, float prevImageSize, float imageSize, int prevViewSize, int viewSize, int drawableSize) { + if (imageSize < viewSize) { + // + // The width/height of image is less than the view's width/height. Center it. + // + m[axis] = (viewSize - (drawableSize * m[Matrix.MSCALE_X])) * 0.5f; + + } else if (trans > 0) { + // + // The image is larger than the view, but was not before rotation. Center it. + // + m[axis] = -((imageSize - viewSize) * 0.5f); + + } else { + // + // Find the area of the image which was previously centered in the view. Determine its distance + // from the left/top side of the view as a fraction of the entire image's width/height. Use that percentage + // to calculate the trans in the new view width/height. + // + float percentage = (Math.abs(trans) + (0.5f * prevViewSize)) / prevImageSize; + m[axis] = -((percentage * imageSize) - (viewSize * 0.5f)); + } + } + + private void setState(State state) { + this.state = state; + } + + public boolean canScrollHorizontallyFroyo(int direction) { + return canScrollHorizontally(direction); + } + + @Override + public boolean canScrollHorizontally(int direction) { + matrix.getValues(m); + float x = m[Matrix.MTRANS_X]; + + if (getImageWidth() < viewWidth) { + return false; + + } else if (x >= -1 && direction < 0) { + return false; + + } else if (Math.abs(x) + viewWidth + 1 >= getImageWidth() && direction > 0) { + return false; + } + + return true; + } + + /** + * Gesture Listener detects a single click or long click and passes that on + * to the view's listener. + * @author Ortiz + * + */ + private class GestureListener extends GestureDetector.SimpleOnGestureListener { + + @Override + public boolean onSingleTapConfirmed(MotionEvent e) + { + if(doubleTapListener != null) { + return doubleTapListener.onSingleTapConfirmed(e); + } + return performClick(); + } + + @Override + public void onLongPress(MotionEvent e) + { + performLongClick(); + } + + @Override + public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) + { + if (fling != null) { + // + // If a previous fling is still active, it should be cancelled so that two flings + // are not run simultaenously. + // + fling.cancelFling(); + } + fling = new Fling((int) velocityX, (int) velocityY); + compatPostOnAnimation(fling); + return super.onFling(e1, e2, velocityX, velocityY); + } + + @Override + public boolean onDoubleTap(MotionEvent e) { + boolean consumed = false; + if(doubleTapListener != null) { + consumed = doubleTapListener.onDoubleTap(e); + } + if (state == State.NONE) { + float targetZoom = (normalizedScale == minScale) ? maxScale : minScale; + DoubleTapZoom doubleTap = new DoubleTapZoom(targetZoom, e.getX(), e.getY(), false); + compatPostOnAnimation(doubleTap); + consumed = true; + } + return consumed; + } + + @Override + public boolean onDoubleTapEvent(MotionEvent e) { + return doubleTapListener != null?doubleTapListener.onDoubleTapEvent(e):false; + } + } + + public interface OnTouchImageViewListener { + void onMove(); + } + + /** + * Responsible for all touch events. Handles the heavy lifting of drag and also sends + * touch events to Scale Detector and Gesture Detector. + * @author Ortiz + * + */ + private class PrivateOnTouchListener implements OnTouchListener { + + // + // Remember last point position for dragging + // + private PointF last = new PointF(); + + @Override + public boolean onTouch(View v, MotionEvent event) { + mScaleDetector.onTouchEvent(event); + mGestureDetector.onTouchEvent(event); + PointF curr = new PointF(event.getX(), event.getY()); + + if (state == State.NONE || state == State.DRAG || state == State.FLING) { + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + last.set(curr); + if (fling != null) + fling.cancelFling(); + setState(State.DRAG); + break; + + case MotionEvent.ACTION_MOVE: + if (state == State.DRAG) { + float deltaX = curr.x - last.x; + float deltaY = curr.y - last.y; + float fixTransX = getFixDragTrans(deltaX, viewWidth, getImageWidth()); + float fixTransY = getFixDragTrans(deltaY, viewHeight, getImageHeight()); + matrix.postTranslate(fixTransX, fixTransY); + fixTrans(); + last.set(curr.x, curr.y); + } + break; + + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_POINTER_UP: + setState(State.NONE); + break; + } + } + + setImageMatrix(matrix); + + // + // User-defined OnTouchListener + // + if(userTouchListener != null) { + userTouchListener.onTouch(v, event); + } + + // + // OnTouchImageViewListener is set: TouchImageView dragged by user. + // + if (touchImageViewListener != null) { + touchImageViewListener.onMove(); + } + + // + // indicate event was handled + // + return true; + } + } + + /** + * ScaleListener detects user two finger scaling and scales image. + * @author Ortiz + * + */ + private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener { + @Override + public boolean onScaleBegin(ScaleGestureDetector detector) { + setState(State.ZOOM); + return true; + } + + @Override + public boolean onScale(ScaleGestureDetector detector) { + scaleImage(detector.getScaleFactor(), detector.getFocusX(), detector.getFocusY(), true); + + // + // OnTouchImageViewListener is set: TouchImageView pinch zoomed by user. + // + if (touchImageViewListener != null) { + touchImageViewListener.onMove(); + } + return true; + } + + @Override + public void onScaleEnd(ScaleGestureDetector detector) { + super.onScaleEnd(detector); + setState(State.NONE); + boolean animateToZoomBoundary = false; + float targetZoom = normalizedScale; + if (normalizedScale > maxScale) { + targetZoom = maxScale; + animateToZoomBoundary = true; + + } else if (normalizedScale < minScale) { + targetZoom = minScale; + animateToZoomBoundary = true; + } + + if (animateToZoomBoundary) { + DoubleTapZoom doubleTap = new DoubleTapZoom(targetZoom, viewWidth / 2, viewHeight / 2, true); + compatPostOnAnimation(doubleTap); + } + } + } + + private void scaleImage(double deltaScale, float focusX, float focusY, boolean stretchImageToSuper) { + + float lowerScale, upperScale; + if (stretchImageToSuper) { + lowerScale = superMinScale; + upperScale = superMaxScale; + + } else { + lowerScale = minScale; + upperScale = maxScale; + } + + float origScale = normalizedScale; + normalizedScale *= deltaScale; + if (normalizedScale > upperScale) { + normalizedScale = upperScale; + deltaScale = upperScale / origScale; + } else if (normalizedScale < lowerScale) { + normalizedScale = lowerScale; + deltaScale = lowerScale / origScale; + } + + matrix.postScale((float) deltaScale, (float) deltaScale, focusX, focusY); + fixScaleTrans(); + } + + /** + * DoubleTapZoom calls a series of runnables which apply + * an animated zoom in/out graphic to the image. + * @author Ortiz + * + */ + private class DoubleTapZoom implements Runnable { + + private long startTime; + private static final float ZOOM_TIME = 500; + private float startZoom, targetZoom; + private float bitmapX, bitmapY; + private boolean stretchImageToSuper; + private AccelerateDecelerateInterpolator interpolator = new AccelerateDecelerateInterpolator(); + private PointF startTouch; + private PointF endTouch; + + DoubleTapZoom(float targetZoom, float focusX, float focusY, boolean stretchImageToSuper) { + setState(State.ANIMATE_ZOOM); + startTime = System.currentTimeMillis(); + this.startZoom = normalizedScale; + this.targetZoom = targetZoom; + this.stretchImageToSuper = stretchImageToSuper; + PointF bitmapPoint = transformCoordTouchToBitmap(focusX, focusY, false); + this.bitmapX = bitmapPoint.x; + this.bitmapY = bitmapPoint.y; + + // + // Used for translating image during scaling + // + startTouch = transformCoordBitmapToTouch(bitmapX, bitmapY); + endTouch = new PointF(viewWidth / 2, viewHeight / 2); + } + + @Override + public void run() { + float t = interpolate(); + double deltaScale = calculateDeltaScale(t); + scaleImage(deltaScale, bitmapX, bitmapY, stretchImageToSuper); + translateImageToCenterTouchPosition(t); + fixScaleTrans(); + setImageMatrix(matrix); + + // + // OnTouchImageViewListener is set: double tap runnable updates listener + // with every frame. + // + if (touchImageViewListener != null) { + touchImageViewListener.onMove(); + } + + if (t < 1f) { + // + // We haven't finished zooming + // + compatPostOnAnimation(this); + + } else { + // + // Finished zooming + // + setState(State.NONE); + } + } + + /** + * Interpolate between where the image should start and end in order to translate + * the image so that the point that is touched is what ends up centered at the end + * of the zoom. + * @param t + */ + private void translateImageToCenterTouchPosition(float t) { + float targetX = startTouch.x + t * (endTouch.x - startTouch.x); + float targetY = startTouch.y + t * (endTouch.y - startTouch.y); + PointF curr = transformCoordBitmapToTouch(bitmapX, bitmapY); + matrix.postTranslate(targetX - curr.x, targetY - curr.y); + } + + /** + * Use interpolator to get t + * @return + */ + private float interpolate() { + long currTime = System.currentTimeMillis(); + float elapsed = (currTime - startTime) / ZOOM_TIME; + elapsed = Math.min(1f, elapsed); + return interpolator.getInterpolation(elapsed); + } + + /** + * Interpolate the current targeted zoom and get the delta + * from the current zoom. + * @param t + * @return + */ + private double calculateDeltaScale(float t) { + double zoom = startZoom + t * (targetZoom - startZoom); + return zoom / normalizedScale; + } + } + + /** + * This function will transform the coordinates in the touch event to the coordinate + * system of the drawable that the imageview contain + * @param x x-coordinate of touch event + * @param y y-coordinate of touch event + * @param clipToBitmap Touch event may occur within view, but outside image content. True, to clip return value + * to the bounds of the bitmap size. + * @return Coordinates of the point touched, in the coordinate system of the original drawable. + */ + private PointF transformCoordTouchToBitmap(float x, float y, boolean clipToBitmap) { + matrix.getValues(m); + float origW = getDrawable().getIntrinsicWidth(); + float origH = getDrawable().getIntrinsicHeight(); + float transX = m[Matrix.MTRANS_X]; + float transY = m[Matrix.MTRANS_Y]; + float finalX = ((x - transX) * origW) / getImageWidth(); + float finalY = ((y - transY) * origH) / getImageHeight(); + + if (clipToBitmap) { + finalX = Math.min(Math.max(finalX, 0), origW); + finalY = Math.min(Math.max(finalY, 0), origH); + } + + return new PointF(finalX , finalY); + } + + /** + * Inverse of transformCoordTouchToBitmap. This function will transform the coordinates in the + * drawable's coordinate system to the view's coordinate system. + * @param bx x-coordinate in original bitmap coordinate system + * @param by y-coordinate in original bitmap coordinate system + * @return Coordinates of the point in the view's coordinate system. + */ + private PointF transformCoordBitmapToTouch(float bx, float by) { + matrix.getValues(m); + float origW = getDrawable().getIntrinsicWidth(); + float origH = getDrawable().getIntrinsicHeight(); + float px = bx / origW; + float py = by / origH; + float finalX = m[Matrix.MTRANS_X] + getImageWidth() * px; + float finalY = m[Matrix.MTRANS_Y] + getImageHeight() * py; + return new PointF(finalX , finalY); + } + + /** + * Fling launches sequential runnables which apply + * the fling graphic to the image. The values for the translation + * are interpolated by the Scroller. + * @author Ortiz + * + */ + private class Fling implements Runnable { + + CompatScroller scroller; + int currX, currY; + + Fling(int velocityX, int velocityY) { + setState(State.FLING); + scroller = new CompatScroller(context); + matrix.getValues(m); + + int startX = (int) m[Matrix.MTRANS_X]; + int startY = (int) m[Matrix.MTRANS_Y]; + int minX, maxX, minY, maxY; + + if (getImageWidth() > viewWidth) { + minX = viewWidth - (int) getImageWidth(); + maxX = 0; + + } else { + minX = maxX = startX; + } + + if (getImageHeight() > viewHeight) { + minY = viewHeight - (int) getImageHeight(); + maxY = 0; + + } else { + minY = maxY = startY; + } + + scroller.fling(startX, startY, velocityX, velocityY, minX, + maxX, minY, maxY); + currX = startX; + currY = startY; + } + + public void cancelFling() { + if (scroller != null) { + setState(State.NONE); + scroller.forceFinished(true); + } + } + + @Override + public void run() { + + // + // OnTouchImageViewListener is set: TouchImageView listener has been flung by user. + // Listener runnable updated with each frame of fling animation. + // + if (touchImageViewListener != null) { + touchImageViewListener.onMove(); + } + + if (scroller.isFinished()) { + scroller = null; + return; + } + + if (scroller.computeScrollOffset()) { + int newX = scroller.getCurrX(); + int newY = scroller.getCurrY(); + int transX = newX - currX; + int transY = newY - currY; + currX = newX; + currY = newY; + matrix.postTranslate(transX, transY); + fixTrans(); + setImageMatrix(matrix); + compatPostOnAnimation(this); + } + } + } + + @TargetApi(VERSION_CODES.GINGERBREAD) + private class CompatScroller { + Scroller scroller; + OverScroller overScroller; + boolean isPreGingerbread; + + public CompatScroller(Context context) { + if (VERSION.SDK_INT < VERSION_CODES.GINGERBREAD) { + isPreGingerbread = true; + scroller = new Scroller(context); + + } else { + isPreGingerbread = false; + overScroller = new OverScroller(context); + } + } + + public void fling(int startX, int startY, int velocityX, int velocityY, int minX, int maxX, int minY, int maxY) { + if (isPreGingerbread) { + scroller.fling(startX, startY, velocityX, velocityY, minX, maxX, minY, maxY); + } else { + overScroller.fling(startX, startY, velocityX, velocityY, minX, maxX, minY, maxY); + } + } + + public void forceFinished(boolean finished) { + if (isPreGingerbread) { + scroller.forceFinished(finished); + } else { + overScroller.forceFinished(finished); + } + } + + public boolean isFinished() { + if (isPreGingerbread) { + return scroller.isFinished(); + } else { + return overScroller.isFinished(); + } + } + + public boolean computeScrollOffset() { + if (isPreGingerbread) { + return scroller.computeScrollOffset(); + } else { + overScroller.computeScrollOffset(); + return overScroller.computeScrollOffset(); + } + } + + public int getCurrX() { + if (isPreGingerbread) { + return scroller.getCurrX(); + } else { + return overScroller.getCurrX(); + } + } + + public int getCurrY() { + if (isPreGingerbread) { + return scroller.getCurrY(); + } else { + return overScroller.getCurrY(); + } + } + } + + @TargetApi(VERSION_CODES.JELLY_BEAN) + private void compatPostOnAnimation(Runnable runnable) { + if (VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN) { + postOnAnimation(runnable); + + } else { + postDelayed(runnable, 1000/60); + } + } + + private class ZoomVariables { + public float scale; + public float focusX; + public float focusY; + public ScaleType scaleType; + + public ZoomVariables(float scale, float focusX, float focusY, ScaleType scaleType) { + this.scale = scale; + this.focusX = focusX; + this.focusY = focusY; + this.scaleType = scaleType; + } + } + + private void printMatrixInfo() { + float[] n = new float[9]; + matrix.getValues(n); + Log.d(DEBUG, "Scale: " + n[Matrix.MSCALE_X] + " TransX: " + n[Matrix.MTRANS_X] + " TransY: " + n[Matrix.MTRANS_Y]); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/mediapicker/viewholder/GalleryHolder.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/mediapicker/viewholder/GalleryHolder.java new file mode 100644 index 0000000000000000000000000000000000000000..ac5b88d50c7d6f9cfd1d6be6578b6627ea9ba5e7 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/mediapicker/viewholder/GalleryHolder.java @@ -0,0 +1,30 @@ +package com.jiuqi.elove.widget.mediapicker.viewholder; + +import android.graphics.Color; +import android.graphics.drawable.ColorDrawable; +import android.support.v7.widget.AppCompatCheckBox; +import android.support.v7.widget.RecyclerView; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.widget.mediapicker.view.SquareImageView; + +public class GalleryHolder extends RecyclerView.ViewHolder { + public SquareImageView thumbIv; + public AppCompatCheckBox appCompatCheckBox; + public TextView tvVideoDuration; + public ImageView ivVideoFlag; + + public GalleryHolder(View itemView) { + super(itemView); + itemView.setClickable(true); + thumbIv = (SquareImageView) itemView.findViewById(R.id.iv_thumb); + thumbIv.setScaleType(ImageView.ScaleType.CENTER_CROP); + appCompatCheckBox = (AppCompatCheckBox) itemView.findViewById(R.id.cb_media); + tvVideoDuration = (TextView) itemView.findViewById(R.id.tv_video_duration); + ivVideoFlag = (ImageView) itemView.findViewById(R.id.iv_video_flag); + thumbIv.setShade(new ColorDrawable(Color.parseColor("#92000000"))); + } +} \ No newline at end of file diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/popupwindow/CustomPopWindow.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/popupwindow/CustomPopWindow.java new file mode 100644 index 0000000000000000000000000000000000000000..59668778c0b38ee981d145d09840e59104c49efd --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/popupwindow/CustomPopWindow.java @@ -0,0 +1,318 @@ +package com.jiuqi.elove.widget.popupwindow; + +import android.annotation.TargetApi; +import android.app.Activity; +import android.content.Context; +import android.graphics.drawable.ColorDrawable; +import android.os.Build; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; +import android.widget.PopupWindow; + +/** + * Created by dl on 2017/6/9 + */ +public class CustomPopWindow implements PopupWindow.OnDismissListener{ + + private static final float DEFAULT_ALPHA = 0.7f; + private Context mContext; + private int mWidth; + private int mHeight; + private boolean mIsFocusable = true; + private boolean mIsOutside = true; + private int mResLayoutId = -1; + private View mContentView; + private PopupWindow mPopupWindow; + private int mAnimationStyle = -1; + + private boolean mClippEnable = false;//默认是false,这样可以全屏背景 + private boolean mIgnoreCheekPress = false; + private int mInputMode = -1; + private PopupWindow.OnDismissListener mOnDismissListener; + private int mSoftInputMode = -1; + private boolean mTouchable = true;//default is ture + private View.OnTouchListener mOnTouchListener; + + private Window mWindow;//当前Activity 的窗口 + /** + * 弹出PopWindow 背景是否变暗,默认不会变暗。 + */ + private boolean mIsBackgroundDark = false; + + private float mBackgroundDrakValue = 0;// 背景变暗的值,0 - 1 + + private CustomPopWindow(Context context){ + mContext = context; + } + + public int getWidth() { + return mWidth; + } + + public int getHeight() { + return mHeight; + } + + /** + * + * @param anchor + * @param xOff + * @param yOff + * @return + */ + public CustomPopWindow showAsDropDown(View anchor, int xOff, int yOff){ + if(mPopupWindow!=null){ + mPopupWindow.showAsDropDown(anchor,xOff,yOff); + } + return this; + } + + public CustomPopWindow showAsDropDown(View anchor){ + if(mPopupWindow!=null){ + mPopupWindow.showAsDropDown(anchor); + } + return this; + } + + @TargetApi(Build.VERSION_CODES.KITKAT) + public CustomPopWindow showAsDropDown(View anchor, int xOff, int yOff, int gravity){ + if(mPopupWindow!=null){ + mPopupWindow.showAsDropDown(anchor,xOff,yOff,gravity); + } + return this; + } + + + /** + * 相对于父控件的位置(通过设置Gravity.CENTER,下方Gravity.BOTTOM等 ),可以设置具体位置坐标 + * @param parent 父控件 + * @param gravity + * @param x the popup's x location offset + * @param y the popup's y location offset + * @return + */ + public CustomPopWindow showAtLocation(View parent, int gravity, int x, int y){ + if(mPopupWindow!=null){ + mPopupWindow.showAtLocation(parent,gravity,x,y); + } + return this; + } + + /** + * 添加一些属性设置 + * @param popupWindow + */ + private void apply(PopupWindow popupWindow){ + popupWindow.setClippingEnabled(mClippEnable); + if(mIgnoreCheekPress){ + popupWindow.setIgnoreCheekPress(); + } + if(mInputMode!=-1){ + popupWindow.setInputMethodMode(mInputMode); + } + if(mSoftInputMode!=-1){ + popupWindow.setSoftInputMode(mSoftInputMode); + } + if(mOnDismissListener!=null){ + popupWindow.setOnDismissListener(mOnDismissListener); + } + if(mOnTouchListener!=null){ + popupWindow.setTouchInterceptor(mOnTouchListener); + } + popupWindow.setTouchable(mTouchable); + } + + private PopupWindow build(){ + + if(mContentView == null){ + mContentView = LayoutInflater.from(mContext).inflate(mResLayoutId,null); + } + + // 2017.3.17 add + // 获取当前Activity的window + Activity activity = (Activity) mContentView.getContext(); + if(activity!=null && mIsBackgroundDark){ + //如果设置的值在0 - 1的范围内,则用设置的值,否则用默认值 + final float alpha = (mBackgroundDrakValue > 0 && mBackgroundDrakValue < 1) ? mBackgroundDrakValue : DEFAULT_ALPHA; + mWindow = activity.getWindow(); + WindowManager.LayoutParams params = mWindow.getAttributes(); + params.alpha = alpha; + mWindow.setAttributes(params); + } + + + if(mWidth != 0 && mHeight!=0 ){ + mPopupWindow = new PopupWindow(mContentView,mWidth,mHeight); + }else{ + mPopupWindow = new PopupWindow(mContentView, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); + } + if(mAnimationStyle!=-1){ + mPopupWindow.setAnimationStyle(mAnimationStyle); + } + + apply(mPopupWindow);//设置一些属性 + + mPopupWindow.setFocusable(mIsFocusable); + mPopupWindow.setBackgroundDrawable(new ColorDrawable(0x60000000)); + mPopupWindow.setOutsideTouchable(mIsOutside); + + if(mWidth == 0 || mHeight == 0){ + mPopupWindow.getContentView().measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); + //如果外面没有设置宽高的情况下,计算宽高并赋值 + mWidth = mPopupWindow.getContentView().getMeasuredWidth(); + mHeight = mPopupWindow.getContentView().getMeasuredHeight(); + } + + // 添加dissmiss 监听 + mPopupWindow.setOnDismissListener(this); + + + mPopupWindow.update(); + + return mPopupWindow; + } + + @Override + public void onDismiss() { + dissmiss(); + } + + /** + * 关闭popWindow + */ + public void dissmiss(){ + + if(mOnDismissListener!=null){ + mOnDismissListener.onDismiss(); + } + + //如果设置了背景变暗,那么在dissmiss的时候需要还原 + if(mWindow!=null){ + WindowManager.LayoutParams params = mWindow.getAttributes(); + params.alpha = 1.0f; + mWindow.setAttributes(params); + } + if(mPopupWindow!=null && mPopupWindow.isShowing()){ + mPopupWindow.dismiss(); + } + } + + + public static class PopupWindowBuilder{ + private CustomPopWindow mCustomPopWindow; + + public PopupWindowBuilder(Context context){ + mCustomPopWindow = new CustomPopWindow(context); + } + public PopupWindowBuilder size(int width,int height){ + mCustomPopWindow.mWidth = width; + mCustomPopWindow.mHeight = height; + return this; + } + + + public PopupWindowBuilder setFocusable(boolean focusable){ + mCustomPopWindow.mIsFocusable = focusable; + return this; + } + + + + public PopupWindowBuilder setView(int resLayoutId){ + mCustomPopWindow.mResLayoutId = resLayoutId; + mCustomPopWindow.mContentView = null; + return this; + } + + public PopupWindowBuilder setView(View view){ + mCustomPopWindow.mContentView = view; + mCustomPopWindow.mResLayoutId = -1; + return this; + } + + public PopupWindowBuilder setOutsideTouchable(boolean outsideTouchable){ + mCustomPopWindow.mIsOutside = outsideTouchable; + return this; + } + + /** + * 设置弹窗动画 + * @param animationStyle + * @return + */ + public PopupWindowBuilder setAnimationStyle(int animationStyle){ + mCustomPopWindow.mAnimationStyle = animationStyle; + return this; + } + + + public PopupWindowBuilder setClippingEnable(boolean enable){ + mCustomPopWindow.mClippEnable =enable; + return this; + } + + + public PopupWindowBuilder setIgnoreCheekPress(boolean ignoreCheekPress){ + mCustomPopWindow.mIgnoreCheekPress = ignoreCheekPress; + return this; + } + + public PopupWindowBuilder setInputMethodMode(int mode){ + mCustomPopWindow.mInputMode = mode; + return this; + } + + public PopupWindowBuilder setOnDissmissListener(PopupWindow.OnDismissListener onDissmissListener){ + mCustomPopWindow.mOnDismissListener = onDissmissListener; + return this; + } + + + public PopupWindowBuilder setSoftInputMode(int softInputMode){ + mCustomPopWindow.mSoftInputMode = softInputMode; + return this; + } + + + public PopupWindowBuilder setTouchable(boolean touchable){ + mCustomPopWindow.mTouchable = touchable; + return this; + } + + public PopupWindowBuilder setTouchIntercepter(View.OnTouchListener touchIntercepter){ + mCustomPopWindow.mOnTouchListener = touchIntercepter; + return this; + } + + /** + * 设置背景变暗是否可用 + * @param isDark + * @return + */ + public PopupWindowBuilder enableBackgroundDark(boolean isDark){ + mCustomPopWindow.mIsBackgroundDark = isDark; + return this; + } + + /** + * 设置北京变暗的值 + * @param darkValue + * @return + */ + public PopupWindowBuilder setBgDarkAlpha(float darkValue){ + mCustomPopWindow.mBackgroundDrakValue = darkValue; + return this; + } + + + public CustomPopWindow create(){ + //构建PopWindow + mCustomPopWindow.build(); + return mCustomPopWindow; + } + + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/pulltorefresh/PullDownOnlyListView.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/pulltorefresh/PullDownOnlyListView.java new file mode 100644 index 0000000000000000000000000000000000000000..d1cd4c16e701ad3e8abd3516af6f8878d07b3fa5 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/pulltorefresh/PullDownOnlyListView.java @@ -0,0 +1,46 @@ +package com.jiuqi.elove.widget.pulltorefresh; + +import android.content.Context; +import android.util.AttributeSet; +import android.widget.ListView; + +/** + * + * Created by liulin on 2016/11/16. + */ +public class PullDownOnlyListView extends ListView implements Pullable{ + + public PullDownOnlyListView(Context context) + { + super(context); + } + + public PullDownOnlyListView(Context context, AttributeSet attrs) + { + super(context, attrs); + } + + public PullDownOnlyListView(Context context, AttributeSet attrs, int defStyle) + { + super(context, attrs, defStyle); + } + @Override + public boolean canPullDown() { + if (getCount() == 0) + { + // 没有item的时候也可以下拉刷新 + return true; + } else if (getFirstVisiblePosition() == 0 + && getChildAt(0).getTop() >= 0) + { + // 滑到ListView的顶部了 + return true; + } else + return false; + } + + @Override + public boolean canPullUp() { + return false; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/pulltorefresh/PullDownOnlyScrollView.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/pulltorefresh/PullDownOnlyScrollView.java new file mode 100644 index 0000000000000000000000000000000000000000..332fca8324ca09aa45de9621d8bf1f1a6a3193e9 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/pulltorefresh/PullDownOnlyScrollView.java @@ -0,0 +1,44 @@ +package com.jiuqi.elove.widget.pulltorefresh; + +import android.content.Context; +import android.util.AttributeSet; +import android.widget.ScrollView; + +import com.jiuqi.elove.widget.SlowScrollView; + +/** + * + * Created by liulin on 2016/11/16. + */ +public class PullDownOnlyScrollView extends SlowScrollView implements Pullable{ + + public PullDownOnlyScrollView(Context context) + { + super(context); + } + + public PullDownOnlyScrollView(Context context, AttributeSet attrs) + { + super(context, attrs); + } + + public PullDownOnlyScrollView(Context context, AttributeSet attrs, int defStyle) + { + super(context, attrs, defStyle); + } + + @Override + public boolean canPullDown() + { + if (getScrollY() == 0) + return true; + else + return false; + } + + @Override + public boolean canPullUp() + { + return false; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/pulltorefresh/PullToRefreshLayout.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/pulltorefresh/PullToRefreshLayout.java new file mode 100644 index 0000000000000000000000000000000000000000..97ac75705de4deedc80cfba8daa4fc5670d1ba0e --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/pulltorefresh/PullToRefreshLayout.java @@ -0,0 +1,672 @@ +package com.jiuqi.elove.widget.pulltorefresh; + +import java.util.Timer; +import java.util.TimerTask; + +import android.content.Context; +import android.os.AsyncTask; +import android.os.Handler; +import android.os.Message; +import android.util.AttributeSet; +import android.util.Log; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.AnimationUtils; +import android.view.animation.LinearInterpolator; +import android.view.animation.RotateAnimation; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.jiuqi.elove.R; + +/** + * 自定义的布局,用来管理三个子控件,其中一个是下拉头,一个是包含内容的pullableView(可以是实现Pullable接口的的任何View), + * 还有一个上拉头,更多详解见博客http://blog.csdn.net/zhongkejingwang/article/details/38868463 + * + * @author 陈靖 + */ +public class PullToRefreshLayout extends RelativeLayout +{ + public static final String TAG = "PullToRefreshLayout"; + // 初始状态 + public static final int INIT = 0; + // 释放刷新 + public static final int RELEASE_TO_REFRESH = 1; + // 正在刷新 + public static final int REFRESHING = 2; + // 释放加载 + public static final int RELEASE_TO_LOAD = 3; + // 正在加载 + public static final int LOADING = 4; + // 操作完毕 + public static final int DONE = 5; + // 当前状态 + private int state = INIT; + // 刷新回调接口 + private OnRefreshListener mListener; + // 刷新成功 + public static final int SUCCEED = 0; + //刷新成功,但是无数据了 + public static final int SUC_NODATA = 2; + // 刷新失败 + public static final int FAIL = 1; + // 按下Y坐标,上一个事件点Y坐标 + private float downY, lastY; + + // 下拉的距离。注意:pullDownY和pullUpY不可能同时不为0 + public float pullDownY = 0; + // 上拉的距离 + private float pullUpY = 0; + + // 释放刷新的距离 + private float refreshDist = 200; + // 释放加载的距离 + private float loadmoreDist = 200; + + private MyTimer timer; + // 回滚速度 + public float MOVE_SPEED = 8; + // 第一次执行布局 + private boolean isLayout = false; + // 在刷新过程中滑动操作 + private boolean isTouch = false; + // 手指滑动距离与下拉头的滑动距离比,中间会随正切函数变化 + private float radio = 2; + + // 下拉箭头的转180°动画 + private RotateAnimation rotateAnimation; + // 均匀旋转动画 + private RotateAnimation refreshingAnimation; + + // 下拉头 + private View refreshView; + // 正在刷新的图标 + private View refreshingView; + // 刷新结果:成功或失败 + private TextView refreshStateTextView; + + // 上拉头 + private View loadmoreView; + // 正在加载的图标 + private View loadingView; + // 加载结果:成功或失败 + private TextView loadStateTextView; + + // 实现了Pullable接口的View + private View pullableView; + // 过滤多点触碰 + private int mEvents; + // 这两个变量用来控制pull的方向,如果不加控制,当情况满足可上拉又可下拉时没法下拉 + private boolean canPullDown = true; + private boolean canPullUp = true; + + private Context mContext; + + /** + * 执行自动回滚的handler + */ + Handler updateHandler = new Handler() + { + + @Override + public void handleMessage(Message msg) + { + // 回弹速度随下拉距离moveDeltaY增大而增大 + MOVE_SPEED = (float) (8 + 5 * Math.tan(Math.PI / 2 + / getMeasuredHeight() * (pullDownY + Math.abs(pullUpY)))); + if (!isTouch) + { + // 正在刷新,且没有往上推的话则悬停,显示"正在刷新..." + if (state == REFRESHING && pullDownY <= refreshDist) + { + pullDownY = refreshDist; + timer.cancel(); + } else if (state == LOADING && -pullUpY <= loadmoreDist) + { + pullUpY = -loadmoreDist; + timer.cancel(); + } + + } + if (pullDownY > 0) + pullDownY -= MOVE_SPEED; + else if (pullUpY < 0) + pullUpY += MOVE_SPEED; + if (pullDownY < 0) + { + // 已完成回弹 + pullDownY = 0; +// pullView.clearAnimation(); + // 隐藏下拉头时有可能还在刷新,只有当前状态不是正在刷新时才改变状态 + if (state != REFRESHING && state != LOADING) + changeState(INIT); + timer.cancel(); + requestLayout(); + } + if (pullUpY > 0) + { + // 已完成回弹 + pullUpY = 0; +// pullUpView.clearAnimation(); + // 隐藏上拉头时有可能还在刷新,只有当前状态不是正在刷新时才改变状态 + if (state != REFRESHING && state != LOADING) + changeState(INIT); + timer.cancel(); + requestLayout(); + } + Log.d("handle", "handle"); + // 刷新布局,会自动调用onLayout + requestLayout(); + // 没有拖拉或者回弹完成 + if (pullDownY + Math.abs(pullUpY) == 0) + timer.cancel(); + } + + }; + + public void setOnRefreshListener(OnRefreshListener listener) + { + mListener = listener; + } + + public PullToRefreshLayout(Context context) + { + super(context); + initView(context); + } + + public PullToRefreshLayout(Context context, AttributeSet attrs) + { + super(context, attrs); + initView(context); + } + + public PullToRefreshLayout(Context context, AttributeSet attrs, int defStyle) + { + super(context, attrs, defStyle); + initView(context); + } + + private void initView(Context context) + { + mContext = context; + timer = new MyTimer(updateHandler); + rotateAnimation = (RotateAnimation) AnimationUtils.loadAnimation( + context, R.anim.reverse_anim); + refreshingAnimation = (RotateAnimation) AnimationUtils.loadAnimation( + context, R.anim.rotating); + // 添加匀速转动动画 + LinearInterpolator lir = new LinearInterpolator(); + rotateAnimation.setInterpolator(lir); + refreshingAnimation.setInterpolator(lir); + } + + private void hide() + { + timer.schedule(5); + } + + /** + * 完成刷新操作,显示刷新结果。注意:刷新完成后一定要调用这个方法 + */ + /** + * @param refreshResult + * PullToRefreshLayout.SUCCEED代表成功,PullToRefreshLayout.FAIL代表失败 + */ + public void refreshFinish(int refreshResult) + { + if(refreshView!=null){//自己加的,因为经常报错 + refreshingView.clearAnimation(); + } +// refreshingView.setVisibility(View.GONE); + switch (refreshResult) + { + case SUCCEED: + // 刷新成功 + if(refreshStateTextView!=null){ + refreshStateTextView.setText(R.string.refresh_succeed); + } + break; + case FAIL: + default: + // 刷新失败 + if(refreshStateTextView!=null){ + refreshStateTextView.setText(R.string.refresh_fail); + } + break; + } + if (pullDownY > 0) + { + // 刷新结果停留1秒 + new Handler() + { + @Override + public void handleMessage(Message msg) + { + changeState(DONE); + hide(); + } + }.sendEmptyMessageDelayed(0, 1000); + } else + { + changeState(DONE); + hide(); + } + } + + /** + * 加载完毕,显示加载结果。注意:加载完成后一定要调用这个方法 + * + * @param refreshResult + * PullToRefreshLayout.SUCCEED代表成功,PullToRefreshLayout.FAIL代表失败 + */ + public void loadmoreFinish(int refreshResult) + { + if(loadingView!=null){ + loadingView.clearAnimation(); + } +// loadingView.setVisibility(View.GONE); + switch (refreshResult) + { + case SUCCEED: + // 加载成功 + if(loadStateTextView!=null){ + loadStateTextView.setText(R.string.load_succeed); + } + break; + case SUC_NODATA: + if(loadStateTextView!=null){ + loadStateTextView.setText(R.string.no_data); + } + break; + case FAIL: + default: + // 加载失败 + loadStateTextView.setText(R.string.load_fail); + break; + } + if (pullUpY < 0) + { + // 刷新结果停留1秒 + new Handler() + { + @Override + public void handleMessage(Message msg) + { + changeState(DONE); + hide(); + } + }.sendEmptyMessageDelayed(0, 1000); + } else + { + changeState(DONE); + hide(); + } + } + + private void changeState(int to) + { + state = to; + switch (state) + { + case INIT: + // 下拉布局初始状态 + refreshStateTextView.setText(R.string.pull_to_refresh); + // 上拉布局初始状态 + loadStateTextView.setText(R.string.pullup_to_load); + break; + case RELEASE_TO_REFRESH: + // 释放刷新状态 + refreshStateTextView.setText(R.string.release_to_refresh); +// pullView.startAnimation(rotateAnimation); + break; + case REFRESHING: + // 正在刷新状态 + refreshingView.setVisibility(View.VISIBLE); + refreshingView.startAnimation(refreshingAnimation); + refreshStateTextView.setText(R.string.refreshing); + break; + case RELEASE_TO_LOAD: + // 释放加载状态 + loadStateTextView.setText(R.string.release_to_load); + break; + case LOADING: + // 正在加载状态 + loadingView.setVisibility(View.VISIBLE); + loadingView.startAnimation(refreshingAnimation); + loadStateTextView.setText(R.string.loading); + break; + case DONE: + // 刷新或加载完毕,啥都不做 + break; + } + } + + /** + * 不限制上拉或下拉 + */ + private void releasePull() + { + canPullDown = true; + canPullUp = true; + } + + /** + * (非 Javadoc)由父控件决定是否分发事件,防止事件冲突 + * + * @see android.view.ViewGroup#dispatchTouchEvent(android.view.MotionEvent) + */ + @Override + public boolean dispatchTouchEvent(MotionEvent ev) + { + switch (ev.getActionMasked()) + { + case MotionEvent.ACTION_DOWN: + downY = ev.getY(); + lastY = downY; + timer.cancel(); + mEvents = 0; + releasePull(); + break; + case MotionEvent.ACTION_POINTER_DOWN: + case MotionEvent.ACTION_POINTER_UP: + // 过滤多点触碰 + mEvents = -1; + break; + case MotionEvent.ACTION_MOVE: + if (mEvents == 0) + { + if (pullDownY > 0 + || (((Pullable) pullableView).canPullDown() + && canPullDown && state != LOADING)) + { + // 可以下拉,正在加载时不能下拉 + // 对实际滑动距离做缩小,造成用力拉的感觉 + pullDownY = pullDownY + (ev.getY() - lastY) / radio; + if (pullDownY < 0) + { + pullDownY = 0; + canPullDown = false; + canPullUp = true; + } + if (pullDownY > getMeasuredHeight()) + pullDownY = getMeasuredHeight(); + if (state == REFRESHING) + { + // 正在刷新的时候触摸移动 + isTouch = true; + } + } else if (pullUpY < 0 + || (((Pullable) pullableView).canPullUp() && canPullUp && state != REFRESHING)) + { + // 可以上拉,正在刷新时不能上拉 + pullUpY = pullUpY + (ev.getY() - lastY) / radio; + if (pullUpY > 0) + { + pullUpY = 0; + canPullDown = true; + canPullUp = false; + } + if (pullUpY < -getMeasuredHeight()) + pullUpY = -getMeasuredHeight(); + if (state == LOADING) + { + // 正在加载的时候触摸移动 + isTouch = true; + } + } else + releasePull(); + } else + mEvents = 0; + lastY = ev.getY(); + // 根据下拉距离改变比例 + radio = (float) (2 + 2 * Math.tan(Math.PI / 2 / getMeasuredHeight() + * (pullDownY + Math.abs(pullUpY)))); + if (pullDownY > 0 || pullUpY < 0) + requestLayout(); + if (pullDownY > 0) + { + if (pullDownY <= refreshDist + && (state == RELEASE_TO_REFRESH || state == DONE)) + { + // 如果下拉距离没达到刷新的距离且当前状态是释放刷新,改变状态为下拉刷新 + changeState(INIT); + } + if (pullDownY >= refreshDist && state == INIT) + { + // 如果下拉距离达到刷新的距离且当前状态是初始状态刷新,改变状态为释放刷新 + changeState(RELEASE_TO_REFRESH); + } + } else if (pullUpY < 0) + { + // 下面是判断上拉加载的,同上,注意pullUpY是负值 + if (-pullUpY <= loadmoreDist + && (state == RELEASE_TO_LOAD || state == DONE)) + { + changeState(INIT); + } + // 上拉操作 + if (-pullUpY >= loadmoreDist && state == INIT) + { + changeState(RELEASE_TO_LOAD); + } + + } + // 因为刷新和加载操作不能同时进行,所以pullDownY和pullUpY不会同时不为0,因此这里用(pullDownY + + // Math.abs(pullUpY))就可以不对当前状态作区分了 + if ((pullDownY + Math.abs(pullUpY)) > 8) + { + // 防止下拉过程中误触发长按事件和点击事件 + ev.setAction(MotionEvent.ACTION_CANCEL); + } + break; + case MotionEvent.ACTION_UP: + if (pullDownY > refreshDist || -pullUpY > loadmoreDist) + // 正在刷新时往下拉(正在加载时往上拉),释放后下拉头(上拉头)不隐藏 + { + isTouch = false; + } + if (state == RELEASE_TO_REFRESH) + { + changeState(REFRESHING); + // 刷新操作 + if (mListener != null) + mListener.onRefresh(this); + } else if (state == RELEASE_TO_LOAD) + { + changeState(LOADING); + // 加载操作 + if (mListener != null) + mListener.onLoadMore(this); + } + hide(); + default: + break; + } + // 事件分发交给父类 + super.dispatchTouchEvent(ev); + return true; + } + + /** + * @author chenjing 自动模拟手指滑动的task + * + */ + private class AutoRefreshAndLoadTask extends + AsyncTask + { + + @Override + protected String doInBackground(Integer... params) + { + while (pullDownY < 4 / 3 * refreshDist) + { + pullDownY += MOVE_SPEED; + publishProgress(pullDownY); + try + { + Thread.sleep(params[0]); + } catch (InterruptedException e) + { + e.printStackTrace(); + } + } + return null; + } + + @Override + protected void onPostExecute(String result) + { + changeState(REFRESHING); + // 刷新操作 + if (mListener != null) + mListener.onRefresh(PullToRefreshLayout.this); + hide(); + } + + @Override + protected void onProgressUpdate(Float... values) + { + if (pullDownY > refreshDist) + changeState(RELEASE_TO_REFRESH); + requestLayout(); + } + + } + + /** + * 自动刷新 + */ + public void autoRefresh() + { + AutoRefreshAndLoadTask task = new AutoRefreshAndLoadTask(); + task.execute(20); + } + + /** + * 自动加载 + */ + public void autoLoad() + { + pullUpY = -loadmoreDist; + requestLayout(); + changeState(LOADING); + // 加载操作 + if (mListener != null) + mListener.onLoadMore(this); + } + + private void initView() + { + // 初始化下拉布局 + refreshStateTextView = (TextView) refreshView + .findViewById(R.id.state_tv); + refreshingView = refreshView.findViewById(R.id.refreshing_icon); + // 初始化上拉布局 + loadStateTextView = (TextView) loadmoreView + .findViewById(R.id.loadstate_tv); + loadingView = loadmoreView.findViewById(R.id.loading_icon); + } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) + { + Log.d("Test", "Test"); + if (!isLayout) + { + // 这里是第一次进来的时候做一些初始化 + refreshView = getChildAt(0); + pullableView = getChildAt(1); + loadmoreView = getChildAt(2); + isLayout = true; + initView(); + refreshDist = ((ViewGroup) refreshView).getChildAt(0) + .getMeasuredHeight(); + loadmoreDist = ((ViewGroup) loadmoreView).getChildAt(0) + .getMeasuredHeight(); + } + // 改变子控件的布局,这里直接用(pullDownY + pullUpY)作为偏移量,这样就可以不对当前状态作区分 + refreshView.layout(0, + (int) (pullDownY + pullUpY) - refreshView.getMeasuredHeight(), + refreshView.getMeasuredWidth(), (int) (pullDownY + pullUpY)); + pullableView.layout(0, (int) (pullDownY + pullUpY), + pullableView.getMeasuredWidth(), (int) (pullDownY + pullUpY) + + pullableView.getMeasuredHeight()); + loadmoreView.layout(0, + (int) (pullDownY + pullUpY) + pullableView.getMeasuredHeight(), + loadmoreView.getMeasuredWidth(), + (int) (pullDownY + pullUpY) + pullableView.getMeasuredHeight() + + loadmoreView.getMeasuredHeight()); + } + + class MyTimer + { + private Handler handler; + private Timer timer; + private MyTask mTask; + + public MyTimer(Handler handler) + { + this.handler = handler; + timer = new Timer(); + } + + public void schedule(long period) + { + if (mTask != null) + { + mTask.cancel(); + mTask = null; + } + mTask = new MyTask(handler); + timer.schedule(mTask, 0, period); + } + + public void cancel() + { + if (mTask != null) + { + mTask.cancel(); + mTask = null; + } + } + + class MyTask extends TimerTask + { + private Handler handler; + + public MyTask(Handler handler) + { + this.handler = handler; + } + + @Override + public void run() + { + handler.obtainMessage().sendToTarget(); + } + + } + } + + /** + * 刷新加载回调接口 + * + * @author chenjing + * + */ + public interface OnRefreshListener + { + /** + * 刷新操作 + */ + void onRefresh(PullToRefreshLayout pullToRefreshLayout); + + /** + * 加载操作 + */ + void onLoadMore(PullToRefreshLayout pullToRefreshLayout); + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/pulltorefresh/PullUpOnlyListView.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/pulltorefresh/PullUpOnlyListView.java new file mode 100644 index 0000000000000000000000000000000000000000..c99e9ea8a6e2c67649c48e97e5013658d0d4ea8a --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/pulltorefresh/PullUpOnlyListView.java @@ -0,0 +1,49 @@ +package com.jiuqi.elove.widget.pulltorefresh; + +import android.content.Context; +import android.util.AttributeSet; +import android.widget.ListView; + +/** + * + * Created by dl on 2017/5/5. + */ +public class PullUpOnlyListView extends ListView implements Pullable{ + + public PullUpOnlyListView(Context context) + { + super(context); + } + + public PullUpOnlyListView(Context context, AttributeSet attrs) + { + super(context, attrs); + } + + public PullUpOnlyListView(Context context, AttributeSet attrs, int defStyle) + { + super(context, attrs, defStyle); + } + @Override + public boolean canPullDown() { + return false; + } + + @Override + public boolean canPullUp() { + if (getCount() == 0) + { + // 没有item的时候也可以上拉加载 + return true; + } else if (getLastVisiblePosition() == (getCount() - 1)) + { + // 滑到底部了 + if (getChildAt(getLastVisiblePosition() - getFirstVisiblePosition()) != null + && getChildAt( + getLastVisiblePosition()//原代码为小于等于,这样一来数据不满一屏幕也可以上拉加载,但是如果大于则不合理且最后一项偶尔会显示不全 + - getFirstVisiblePosition()).getBottom() <= getMeasuredHeight()) + return true; + } + return false; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/pulltorefresh/Pullable.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/pulltorefresh/Pullable.java new file mode 100644 index 0000000000000000000000000000000000000000..58e289bce4ad9028c1fe86eade78aa0980c00a47 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/pulltorefresh/Pullable.java @@ -0,0 +1,18 @@ +package com.jiuqi.elove.widget.pulltorefresh; + +public interface Pullable +{ + /** + * 判断是否可以下拉,如果不需要下拉功能可以直接return false + * + * @return true如果可以下拉否则返回false + */ + boolean canPullDown(); + + /** + * 判断是否可以上拉,如果不需要上拉功能可以直接return false + * + * @return true如果可以上拉否则返回false + */ + boolean canPullUp(); +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/pulltorefresh/PullableDownOnlyRecylerView.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/pulltorefresh/PullableDownOnlyRecylerView.java new file mode 100644 index 0000000000000000000000000000000000000000..ad94d7c387f470a89ce46cf94b4c9befb9214b16 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/pulltorefresh/PullableDownOnlyRecylerView.java @@ -0,0 +1,49 @@ +package com.jiuqi.elove.widget.pulltorefresh; + +import android.content.Context; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.util.AttributeSet; + +/** + * + * Created by dl on 2017/1/5. + */ +public class PullableDownOnlyRecylerView extends RecyclerView implements Pullable { + + public PullableDownOnlyRecylerView(Context context){ + super(context); + } + + public PullableDownOnlyRecylerView(Context context, AttributeSet attrs) + { + super(context, attrs); + } + + public PullableDownOnlyRecylerView(Context context, AttributeSet attrs, int defStyle) + { + super(context, attrs, defStyle); + } + + @Override + public boolean canPullDown() + { + if (getChildCount() == 0) + { + // 没有item的时候也可以下拉刷新 + return true; + } else if (((LinearLayoutManager) getLayoutManager()).findFirstVisibleItemPosition() == 0 + && getChildAt(0).getTop() >= 0) + { + // 滑到ListView的顶部了 + return true; + } else + return false; + } + + @Override + public boolean canPullUp() + { + return false; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/pulltorefresh/PullableListView.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/pulltorefresh/PullableListView.java new file mode 100644 index 0000000000000000000000000000000000000000..6958015084c2e91a6c7c2df06d334d210658357c --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/pulltorefresh/PullableListView.java @@ -0,0 +1,60 @@ +package com.jiuqi.elove.widget.pulltorefresh; + +import android.content.Context; +import android.util.AttributeSet; +import android.util.Log; +import android.widget.ListView; + +public class PullableListView extends ListView implements Pullable +{ + + public PullableListView(Context context) + { + super(context); + } + + public PullableListView(Context context, AttributeSet attrs) + { + super(context, attrs); + } + + public PullableListView(Context context, AttributeSet attrs, int defStyle) + { + super(context, attrs, defStyle); + } + + @Override + public boolean canPullDown() + { + if (getCount() == 0) + { + // 没有item的时候也可以下拉刷新 + return true; + } else if (getFirstVisiblePosition() == 0 + && getChildAt(0).getTop() >= 0) + { + // 滑到ListView的顶部了 + return true; + } else + return false; + } + + @Override + public boolean canPullUp() + { + if (getCount() == 0) + { + // 没有item的时候也可以上拉加载 + return true; + } else if (getLastVisiblePosition() == (getCount() - 1)) + { + // 滑到底部了 + if (getChildAt(getLastVisiblePosition() - getFirstVisiblePosition()) != null + && getChildAt( + getLastVisiblePosition()//原代码为小于等于,这样一来数据不满一屏幕也可以上拉加载,但是如果大于则不合理且最后一项偶尔会显示不全 + - getFirstVisiblePosition()).getBottom() <= getMeasuredHeight()) + return true; + } + return false; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/pulltorefresh/PullableRecylerView.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/pulltorefresh/PullableRecylerView.java new file mode 100644 index 0000000000000000000000000000000000000000..89476994198480d5a95c4d263e1206ed34ad9a86 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/pulltorefresh/PullableRecylerView.java @@ -0,0 +1,62 @@ +package com.jiuqi.elove.widget.pulltorefresh; + +import android.content.Context; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.util.AttributeSet; + +/** + * + * Created by dl on 2017/1/5. + */ +public class PullableRecylerView extends RecyclerView implements Pullable{ + + public PullableRecylerView(Context context){ + super(context); + } + + public PullableRecylerView(Context context, AttributeSet attrs) + { + super(context, attrs); + } + + public PullableRecylerView(Context context, AttributeSet attrs, int defStyle) + { + super(context, attrs, defStyle); + } + + @Override + public boolean canPullDown() + { + if (getChildCount() == 0) + { + // 没有item的时候也可以下拉刷新 + return true; + } else if (((LinearLayoutManager) getLayoutManager()).findFirstVisibleItemPosition() == 0 + && getChildAt(0).getTop() >= 0) + { + // 滑到ListView的顶部了 + return true; + } else + return false; + } + + @Override + public boolean canPullUp() + { + if (getChildCount() == 0) + { + // 没有item的时候也可以上拉加载 + return true; + } else if (((LinearLayoutManager) getLayoutManager()).findLastVisibleItemPosition() == (getLayoutManager().getItemCount() - 1)) + { + // 滑到底部了 + if (getChildAt(((LinearLayoutManager) getLayoutManager()).findLastVisibleItemPosition() - ((LinearLayoutManager) getLayoutManager()).findFirstVisibleItemPosition()) != null + && getChildAt( + ((LinearLayoutManager) getLayoutManager()).findLastVisibleItemPosition()//原代码为小于等于,这样一来数据不满一屏幕也可以上拉加载,但是如果大于则不合理且最后一项偶尔会显示不全 + - ((LinearLayoutManager) getLayoutManager()).findFirstVisibleItemPosition()).getBottom() <= getMeasuredHeight()) + return true; + } + return false; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/qrcode/camera/AutoFocusManager.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/qrcode/camera/AutoFocusManager.java new file mode 100644 index 0000000000000000000000000000000000000000..27f2186fc3805f1bee9af0005c6a24c92183fb1e --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/qrcode/camera/AutoFocusManager.java @@ -0,0 +1,135 @@ +/* + * Copyright (C) 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.jiuqi.elove.widget.qrcode.camera; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.hardware.Camera; +import android.os.AsyncTask; +import android.os.Build; +import android.util.Log; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.concurrent.RejectedExecutionException; + +public class AutoFocusManager implements Camera.AutoFocusCallback { + + private static final String TAG = AutoFocusManager.class.getSimpleName(); + + private static final long AUTO_FOCUS_INTERVAL_MS = 2000L; + private static final Collection FOCUS_MODES_CALLING_AF; + + static { + FOCUS_MODES_CALLING_AF = new ArrayList(2); + FOCUS_MODES_CALLING_AF.add(Camera.Parameters.FOCUS_MODE_AUTO); + FOCUS_MODES_CALLING_AF.add(Camera.Parameters.FOCUS_MODE_MACRO); + } + + private final boolean useAutoFocus; + private final Camera camera; + private boolean stopped; + private boolean focusing; + private AsyncTask outstandingTask; + + public AutoFocusManager(Context context, Camera camera) { + this.camera = camera; + String currentFocusMode = camera.getParameters().getFocusMode(); + useAutoFocus = FOCUS_MODES_CALLING_AF.contains(currentFocusMode); + Log.i(TAG, "Current focus mode '" + currentFocusMode + "'; use auto focus? " + useAutoFocus); + start(); + } + + @Override + public synchronized void onAutoFocus(boolean success, Camera theCamera) { + focusing = false; + autoFocusAgainLater(); + } + + @SuppressLint("NewApi") + private synchronized void autoFocusAgainLater() { + if (!stopped && outstandingTask == null) { + AutoFocusTask newTask = new AutoFocusTask(); + try { + if (Build.VERSION.SDK_INT >= 11) { + newTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + } else { + newTask.execute(); + } + outstandingTask = newTask; + } catch (RejectedExecutionException ree) { + Log.w(TAG, "Could not request auto focus", ree); + } + } + } + + public synchronized void start() { + if (useAutoFocus) { + outstandingTask = null; + if (!stopped && !focusing) { + try { + camera.autoFocus(this); + focusing = true; + } catch (RuntimeException re) { + // Have heard RuntimeException reported in Android 4.0.x+; + // continue? + Log.w(TAG, "Unexpected exception while focusing", re); + // Try again later to keep cycle going + autoFocusAgainLater(); + } + } + } + } + + private synchronized void cancelOutstandingTask() { + if (outstandingTask != null) { + if (outstandingTask.getStatus() != AsyncTask.Status.FINISHED) { + outstandingTask.cancel(true); + } + outstandingTask = null; + } + } + + public synchronized void stop() { + stopped = true; + if (useAutoFocus) { + cancelOutstandingTask(); + // Doesn't hurt to call this even if not focusing + try { + camera.cancelAutoFocus(); + } catch (RuntimeException re) { + // Have heard RuntimeException reported in Android 4.0.x+; + // continue? + Log.w(TAG, "Unexpected exception while cancelling focusing", re); + } + } + } + + private final class AutoFocusTask extends AsyncTask { + @Override + protected Object doInBackground(Object... voids) { + try { + Thread.sleep(AUTO_FOCUS_INTERVAL_MS); + } catch (InterruptedException e) { + // continue + } + start(); + return null; + } + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/qrcode/camera/CameraConfigurationManager.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/qrcode/camera/CameraConfigurationManager.java new file mode 100644 index 0000000000000000000000000000000000000000..72e2280344bc80a37ef01db7198053b191ba29e6 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/qrcode/camera/CameraConfigurationManager.java @@ -0,0 +1,228 @@ +/* + * Copyright (C) 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.jiuqi.elove.widget.qrcode.camera; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.graphics.Point; +import android.hardware.Camera; +import android.util.Log; +import android.view.Display; +import android.view.WindowManager; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.Iterator; +import java.util.List; + +/** + * 邮箱: 1076559197@qq.com | tauchen1990@gmail.com + *

    + * 作者: 陈涛 + *

    + * 日期: 2014年8月20日 + *

    + * 描述: 该类主要负责设置相机的参数信息,获取最佳的预览界面 + */ +public final class CameraConfigurationManager { + + private static final String TAG = "CameraConfiguration"; + + private static final int MIN_PREVIEW_PIXELS = 480 * 320; + private static final double MAX_ASPECT_DISTORTION = 0.15; + + private final Context context; + + // 屏幕分辨率 + private Point screenResolution; + // 相机分辨率 + private Point cameraResolution; + + public CameraConfigurationManager(Context context) { + this.context = context; + } + + public void initFromCameraParameters(Camera camera) { + Camera.Parameters parameters = camera.getParameters(); + WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + Display display = manager.getDefaultDisplay(); + Point theScreenResolution = new Point(); + theScreenResolution = getDisplaySize(display); + + screenResolution = theScreenResolution; + Log.i(TAG, "Screen resolution: " + screenResolution); + + /** 因为换成了竖屏显示,所以不替换屏幕宽高得出的预览图是变形的 */ + Point screenResolutionForCamera = new Point(); + screenResolutionForCamera.x = screenResolution.x; + screenResolutionForCamera.y = screenResolution.y; + + if (screenResolution.x < screenResolution.y) { + screenResolutionForCamera.x = screenResolution.y; + screenResolutionForCamera.y = screenResolution.x; + } + + cameraResolution = findBestPreviewSizeValue(parameters, screenResolutionForCamera); + Log.i(TAG, "Camera resolution x: " + cameraResolution.x); + Log.i(TAG, "Camera resolution y: " + cameraResolution.y); + } + + @SuppressWarnings("deprecation") + @SuppressLint("NewApi") + private Point getDisplaySize(final Display display) { + final Point point = new Point(); + try { + display.getSize(point); + } catch (NoSuchMethodError ignore) { + point.x = display.getWidth(); + point.y = display.getHeight(); + } + return point; + } + + public void setDesiredCameraParameters(Camera camera, boolean safeMode) { + Camera.Parameters parameters = camera.getParameters(); + + if (parameters == null) { + Log.w(TAG, "Device error: no camera parameters are available. Proceeding without configuration."); + return; + } + + Log.i(TAG, "Initial camera parameters: " + parameters.flatten()); + + if (safeMode) { + Log.w(TAG, "In camera config safe mode -- most settings will not be honored"); + } + + parameters.setPreviewSize(cameraResolution.x, cameraResolution.y); + camera.setParameters(parameters); + + Camera.Parameters afterParameters = camera.getParameters(); + Camera.Size afterSize = afterParameters.getPreviewSize(); + if (afterSize != null && (cameraResolution.x != afterSize.width || cameraResolution.y != afterSize + .height)) { + Log.w(TAG, "Camera said it supported preview size " + cameraResolution.x + 'x' + + cameraResolution.y + ", but after setting it, preview size is " + afterSize.width + 'x' + + afterSize.height); + cameraResolution.x = afterSize.width; + cameraResolution.y = afterSize.height; + } + + /** 设置相机预览为竖屏 */ + camera.setDisplayOrientation(90); + } + + public Point getCameraResolution() { + return cameraResolution; + } + + public Point getScreenResolution() { + return screenResolution; + } + + /** + * 从相机支持的分辨率中计算出最适合的预览界面尺寸 + * + * @param parameters + * @param screenResolution + * @return + */ + private Point findBestPreviewSizeValue(Camera.Parameters parameters, Point screenResolution) { + List rawSupportedSizes = parameters.getSupportedPreviewSizes(); + if (rawSupportedSizes == null) { + Log.w(TAG, "Device returned no supported preview sizes; using default"); + Camera.Size defaultSize = parameters.getPreviewSize(); + return new Point(defaultSize.width, defaultSize.height); + } + + // Sort by size, descending + List supportedPreviewSizes = new ArrayList(rawSupportedSizes); + Collections.sort(supportedPreviewSizes, new Comparator() { + @Override + public int compare(Camera.Size a, Camera.Size b) { + int aPixels = a.height * a.width; + int bPixels = b.height * b.width; + if (bPixels < aPixels) { + return -1; + } + if (bPixels > aPixels) { + return 1; + } + return 0; + } + }); + + if (Log.isLoggable(TAG, Log.INFO)) { + StringBuilder previewSizesString = new StringBuilder(); + for (Camera.Size supportedPreviewSize : supportedPreviewSizes) { + previewSizesString.append(supportedPreviewSize.width).append('x').append + (supportedPreviewSize.height).append(' '); + } + Log.i(TAG, "Supported preview sizes: " + previewSizesString); + } + + double screenAspectRatio = (double) screenResolution.x / (double) screenResolution.y; + + // Remove sizes that are unsuitable + Iterator it = supportedPreviewSizes.iterator(); + while (it.hasNext()) { + Camera.Size supportedPreviewSize = it.next(); + int realWidth = supportedPreviewSize.width; + int realHeight = supportedPreviewSize.height; + if (realWidth * realHeight < MIN_PREVIEW_PIXELS) { + it.remove(); + continue; + } + + boolean isCandidatePortrait = realWidth < realHeight; + int maybeFlippedWidth = isCandidatePortrait ? realHeight : realWidth; + int maybeFlippedHeight = isCandidatePortrait ? realWidth : realHeight; + + double aspectRatio = (double) maybeFlippedWidth / (double) maybeFlippedHeight; + double distortion = Math.abs(aspectRatio - screenAspectRatio); + if (distortion > MAX_ASPECT_DISTORTION) { + it.remove(); + continue; + } + + if (maybeFlippedWidth == screenResolution.x && maybeFlippedHeight == screenResolution.y) { + Point exactPoint = new Point(realWidth, realHeight); + Log.i(TAG, "Found preview size exactly matching screen size: " + exactPoint); + return exactPoint; + } + } + + // If no exact match, use largest preview size. This was not a great + // idea on older devices because + // of the additional computation needed. We're likely to get here on + // newer Android 4+ devices, where + // the CPU is much more powerful. + if (!supportedPreviewSizes.isEmpty()) { + Camera.Size largestPreview = supportedPreviewSizes.get(0); + Point largestSize = new Point(largestPreview.width, largestPreview.height); + Log.i(TAG, "Using largest suitable preview size: " + largestSize); + return largestSize; + } + + // If there is nothing at all suitable, return current preview size + Camera.Size defaultPreview = parameters.getPreviewSize(); + Point defaultSize = new Point(defaultPreview.width, defaultPreview.height); + Log.i(TAG, "No suitable preview sizes, using default: " + defaultSize); + + return defaultSize; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/qrcode/camera/CameraManager.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/qrcode/camera/CameraManager.java new file mode 100644 index 0000000000000000000000000000000000000000..b5538d1cf175394e26bfd20081ef30b258b41f61 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/qrcode/camera/CameraManager.java @@ -0,0 +1,203 @@ +/* + * Copyright (C) 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.jiuqi.elove.widget.qrcode.camera; + +import android.content.Context; +import android.graphics.Point; +import android.hardware.Camera; +import android.hardware.Camera.Size; +import android.os.Handler; +import android.util.Log; +import android.view.SurfaceHolder; + +import com.jiuqi.elove.widget.qrcode.camera.open.OpenCameraInterface; + +import java.io.IOException; + +/** + * This object wraps the Camera service object and expects to be the only one + * talking to it. The implementation encapsulates the steps needed to take + * preview-sized images, which are used for both preview and decoding. + * + * @author dswitkin@google.com (Daniel Switkin) + */ +public class CameraManager { + + private static final String TAG = CameraManager.class.getSimpleName(); + + private final Context context; + private final CameraConfigurationManager configManager; + /** + * Preview frames are delivered here, which we pass on to the registered + * handler. Make sure to clear the handler so it will only receive one + * message. + */ + private final PreviewCallback previewCallback; + private Camera camera; + private AutoFocusManager autoFocusManager; + private boolean initialized; + private boolean previewing; + private int requestedCameraId = -1; + + public CameraManager(Context context) { + this.context = context; + this.configManager = new CameraConfigurationManager(context); + previewCallback = new PreviewCallback(configManager); + } + + /** + * Opens the camera driver and initializes the hardware parameters. + * + * @param holder The surface object which the camera will draw preview frames + * into. + * @throws IOException Indicates the camera driver failed to open. + */ + public synchronized void openDriver(SurfaceHolder holder) throws IOException { + Camera theCamera = camera; + if (theCamera == null) { + + if (requestedCameraId >= 0) { + theCamera = OpenCameraInterface.open(requestedCameraId); + } else { + theCamera = OpenCameraInterface.open(); + } + + if (theCamera == null) { + throw new IOException(); + } + camera = theCamera; + } + theCamera.setPreviewDisplay(holder); + + if (!initialized) { + initialized = true; + configManager.initFromCameraParameters(theCamera); + } + + Camera.Parameters parameters = theCamera.getParameters(); + String parametersFlattened = parameters == null ? null : parameters.flatten(); // Save + // these, + // temporarily + try { + configManager.setDesiredCameraParameters(theCamera, false); + } catch (RuntimeException re) { + // Driver failed + Log.w(TAG, "Camera rejected parameters. Setting only minimal safe-mode parameters"); + Log.i(TAG, "Resetting to saved camera params: " + parametersFlattened); + // Reset: + if (parametersFlattened != null) { + parameters = theCamera.getParameters(); + parameters.unflatten(parametersFlattened); + try { + theCamera.setParameters(parameters); + configManager.setDesiredCameraParameters(theCamera, true); + } catch (RuntimeException re2) { + // Well, darn. Give up + Log.w(TAG, "Camera rejected even safe-mode parameters! No configuration"); + } + } + } + + } + + public synchronized boolean isOpen() { + return camera != null; + } + + /** + * Closes the camera driver if still in use. + */ + public synchronized void closeDriver() { + if (camera != null) { + camera.release(); + camera = null; + // Make sure to clear these each time we close the camera, so that + // any scanning rect + // requested by intent is forgotten. + } + } + + /** + * Asks the camera hardware to begin drawing preview frames to the screen. + */ + public synchronized void startPreview() { + Camera theCamera = camera; + if (theCamera != null && !previewing) { + theCamera.startPreview(); + previewing = true; + autoFocusManager = new AutoFocusManager(context, camera); + } + } + + /** + * Tells the camera to stop drawing preview frames. + */ + public synchronized void stopPreview() { + if (autoFocusManager != null) { + autoFocusManager.stop(); + autoFocusManager = null; + } + if (camera != null && previewing) { + camera.stopPreview(); + previewCallback.setHandler(null, 0); + previewing = false; + } + } + + /** + * A single preview frame will be returned to the handler supplied. The data + * will arrive as byte[] in the message.obj field, with width and height + * encoded as message.arg1 and message.arg2, respectively. + * + * @param handler The handler to send the message to. + * @param message The what field of the message to be sent. + */ + public synchronized void requestPreviewFrame(Handler handler, int message) { + Camera theCamera = camera; + if (theCamera != null && previewing) { + previewCallback.setHandler(handler, message); + theCamera.setOneShotPreviewCallback(previewCallback); + } + } + + /** + * Allows third party apps to specify the camera ID, rather than determine + * it automatically based on available cameras and their orientation. + * + * @param cameraId camera ID of the camera to use. A negative value means + * "no preference". + */ + public synchronized void setManualCameraId(int cameraId) { + requestedCameraId = cameraId; + } + + /** + * 获取相机分辨率 + * + * @return + */ + public Point getCameraResolution() { + return configManager.getCameraResolution(); + } + + public Size getPreviewSize() { + if (null != camera) { + return camera.getParameters().getPreviewSize(); + } + return null; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/qrcode/camera/PreviewCallback.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/qrcode/camera/PreviewCallback.java new file mode 100644 index 0000000000000000000000000000000000000000..052d19b5e2a6a9709c45aec24f87088a7568e537 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/qrcode/camera/PreviewCallback.java @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2010 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.jiuqi.elove.widget.qrcode.camera; + +import android.graphics.Point; +import android.hardware.Camera; +import android.os.Handler; +import android.os.Message; +import android.util.Log; + +public class PreviewCallback implements Camera.PreviewCallback { + + private static final String TAG = PreviewCallback.class.getSimpleName(); + + private final CameraConfigurationManager configManager; + private Handler previewHandler; + private int previewMessage; + + public PreviewCallback(CameraConfigurationManager configManager) { + this.configManager = configManager; + } + + public void setHandler(Handler previewHandler, int previewMessage) { + this.previewHandler = previewHandler; + this.previewMessage = previewMessage; + } + + @Override + public void onPreviewFrame(byte[] data, Camera camera) { + Point cameraResolution = configManager.getCameraResolution(); + Handler thePreviewHandler = previewHandler; + if (cameraResolution != null && thePreviewHandler != null) { + Message message = thePreviewHandler.obtainMessage(previewMessage, cameraResolution.x, + cameraResolution.y, data); + message.sendToTarget(); + previewHandler = null; + } else { + Log.d(TAG, "Got preview callback, but no handler or resolution available"); + } + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/qrcode/camera/open/OpenCameraInterface.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/qrcode/camera/open/OpenCameraInterface.java new file mode 100644 index 0000000000000000000000000000000000000000..e41211bef49e0574a5592e0de7e5936c2e804699 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/qrcode/camera/open/OpenCameraInterface.java @@ -0,0 +1,85 @@ +/* + * Copyright (C) 2012 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.jiuqi.elove.widget.qrcode.camera.open; + +import android.hardware.Camera; +import android.util.Log; + +public class OpenCameraInterface { + + private static final String TAG = OpenCameraInterface.class.getName(); + + /** + * Opens the requested camera with {@link Camera#open(int)}, if one exists. + * + * @param cameraId camera ID of the camera to use. A negative value means + * "no preference" + * @return handle to {@link Camera} that was opened + */ + public static Camera open(int cameraId) { + + int numCameras = Camera.getNumberOfCameras(); + if (numCameras == 0) { + Log.w(TAG, "No cameras!"); + return null; + } + + boolean explicitRequest = cameraId >= 0; + + if (!explicitRequest) { + // Select a camera if no explicit camera requested + int index = 0; + while (index < numCameras) { + Camera.CameraInfo cameraInfo = new Camera.CameraInfo(); + Camera.getCameraInfo(index, cameraInfo); + if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) { + break; + } + index++; + } + + cameraId = index; + } + + Camera camera; + if (cameraId < numCameras) { + Log.i(TAG, "Opening camera #" + cameraId); + camera = Camera.open(cameraId); + } else { + if (explicitRequest) { + Log.w(TAG, "Requested camera does not exist: " + cameraId); + camera = null; + } else { + Log.i(TAG, "No camera facing back; returning camera #0"); + camera = Camera.open(0); + } + } + + return camera; + } + + /** + * Opens a rear-facing camera with {@link Camera#open(int)}, if one exists, + * or opens camera 0. + * + * @return handle to {@link Camera} that was opened + */ + public static Camera open() { + return open(-1); + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/qrcode/decode/DecodeFormatManager.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/qrcode/decode/DecodeFormatManager.java new file mode 100644 index 0000000000000000000000000000000000000000..59763be285b461497455b45835da5d71e3974fff --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/qrcode/decode/DecodeFormatManager.java @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2010 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.jiuqi.elove.widget.qrcode.decode; + +import com.google.zxing.BarcodeFormat; + +import java.util.Collection; +import java.util.EnumSet; +import java.util.Set; + +public class DecodeFormatManager { + + // 1D解码 + private static final Set PRODUCT_FORMATS; + private static final Set INDUSTRIAL_FORMATS; + private static final Set ONE_D_FORMATS; + + // 二维码解码 + private static final Set QR_CODE_FORMATS; + + static { + PRODUCT_FORMATS = EnumSet.of(BarcodeFormat.UPC_A, BarcodeFormat.UPC_E, BarcodeFormat.EAN_13, + BarcodeFormat.EAN_8, BarcodeFormat.RSS_14, BarcodeFormat.RSS_EXPANDED); + INDUSTRIAL_FORMATS = EnumSet.of(BarcodeFormat.CODE_39, BarcodeFormat.CODE_93, BarcodeFormat + .CODE_128, BarcodeFormat.ITF, BarcodeFormat.CODABAR); + ONE_D_FORMATS = EnumSet.copyOf(PRODUCT_FORMATS); + ONE_D_FORMATS.addAll(INDUSTRIAL_FORMATS); + + QR_CODE_FORMATS = EnumSet.of(BarcodeFormat.QR_CODE); + } + + public static Collection getQrCodeFormats() { + return QR_CODE_FORMATS; + } + + public static Collection getBarCodeFormats() { + return ONE_D_FORMATS; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/qrcode/decode/DecodeHandler.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/qrcode/decode/DecodeHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..b0372997d0887fb7e96aece840f682909ad2382b --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/qrcode/decode/DecodeHandler.java @@ -0,0 +1,152 @@ +/* + * Copyright (C) 2010 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.jiuqi.elove.widget.qrcode.decode; + +import android.graphics.Bitmap; +import android.graphics.Rect; +import android.hardware.Camera.Size; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; + +import com.google.zxing.BinaryBitmap; +import com.google.zxing.DecodeHintType; +import com.google.zxing.MultiFormatReader; +import com.google.zxing.PlanarYUVLuminanceSource; +import com.google.zxing.ReaderException; +import com.google.zxing.Result; +import com.google.zxing.common.HybridBinarizer; +import com.jiuqi.elove.R; +import com.jiuqi.elove.activity.CaptureActivity; + +import java.io.ByteArrayOutputStream; +import java.util.Map; + +public class DecodeHandler extends Handler { + + private final CaptureActivity activity; + private final MultiFormatReader multiFormatReader; + private boolean running = true; + + public DecodeHandler(CaptureActivity activity, Map hints) { + multiFormatReader = new MultiFormatReader(); + multiFormatReader.setHints(hints); + this.activity = activity; + } + + private static void bundleThumbnail(PlanarYUVLuminanceSource source, Bundle bundle) { + int[] pixels = source.renderThumbnail(); + int width = source.getThumbnailWidth(); + int height = source.getThumbnailHeight(); + Bitmap bitmap = Bitmap.createBitmap(pixels, 0, width, width, height, Bitmap.Config.ARGB_8888); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + bitmap.compress(Bitmap.CompressFormat.JPEG, 50, out); + bundle.putByteArray(DecodeThread.BARCODE_BITMAP, out.toByteArray()); + } + + @Override + public void handleMessage(Message message) { + if (!running) { + return; + } + if (message.what == R.id.decode) { + decode((byte[]) message.obj, message.arg1, message.arg2); + + } else if (message.what == R.id.quit) { + running = false; + Looper.myLooper().quit(); + + } + } + + /** + * Decode the data within the viewfinder rectangle, and time how long it + * took. For efficiency, reuse the same reader objects from one decode to + * the next. + * + * @param data The YUV preview frame. + * @param width The width of the preview frame. + * @param height The height of the preview frame. + */ + private void decode(byte[] data, int width, int height) { + Size size = activity.getCameraManager().getPreviewSize(); + + // 这里需要将获取的data翻转一下,因为相机默认拿的的横屏的数据 + byte[] rotatedData = new byte[data.length]; + for (int y = 0; y < size.height; y++) { + for (int x = 0; x < size.width; x++) + rotatedData[x * size.height + size.height - y - 1] = data[x + y * size.width]; + } + + // 宽高也要调整 + int tmp = size.width; + size.width = size.height; + size.height = tmp; + + Result rawResult = null; + PlanarYUVLuminanceSource source = buildLuminanceSource(rotatedData, size.width, size.height); + if (source != null) { + BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); + try { + rawResult = multiFormatReader.decodeWithState(bitmap); + } catch (ReaderException re) { + // continue + } finally { + multiFormatReader.reset(); + } + } + + Handler handler = activity.getHandler(); + if (rawResult != null) { + // Don't log the barcode contents for security. + if (handler != null) { + Message message = Message.obtain(handler, R.id.decode_succeeded, rawResult); + Bundle bundle = new Bundle(); + bundleThumbnail(source, bundle); + message.setData(bundle); + message.sendToTarget(); + } + } else { + if (handler != null) { + Message message = Message.obtain(handler, R.id.decode_failed); + message.sendToTarget(); + } + } + + } + + /** + * A factory method to build the appropriate LuminanceSource object based on + * the format of the preview buffers, as described by Camera.Parameters. + * + * @param data A preview frame. + * @param width The width of the image. + * @param height The height of the image. + * @return A PlanarYUVLuminanceSource instance. + */ + public PlanarYUVLuminanceSource buildLuminanceSource(byte[] data, int width, int height) { + Rect rect = activity.getCropRect(); + if (rect == null) { + return null; + } + // Go ahead and assume it's YUV rather than die. + return new PlanarYUVLuminanceSource(data, width, height, rect.left, rect.top, rect.width(), rect + .height(), false); + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/qrcode/decode/DecodeThread.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/qrcode/decode/DecodeThread.java new file mode 100644 index 0000000000000000000000000000000000000000..375e80e3e9c1e94fc0ee6731747ce8da85d3240e --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/qrcode/decode/DecodeThread.java @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.jiuqi.elove.widget.qrcode.decode; + +import android.os.Handler; +import android.os.Looper; + +import com.google.zxing.BarcodeFormat; +import com.google.zxing.DecodeHintType; +import com.jiuqi.elove.activity.CaptureActivity; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.EnumMap; +import java.util.EnumSet; +import java.util.Map; +import java.util.concurrent.CountDownLatch; + +/** + * This thread does all the heavy lifting of decoding the images. + * + * @author dswitkin@google.com (Daniel Switkin) + */ +public class DecodeThread extends Thread { + + public static final String BARCODE_BITMAP = "barcode_bitmap"; + + public static final int BARCODE_MODE = 0X100; + public static final int QRCODE_MODE = 0X200; + public static final int ALL_MODE = 0X300; + + private final CaptureActivity activity; + private final Map hints; + private final CountDownLatch handlerInitLatch; + private Handler handler; + + public DecodeThread(CaptureActivity activity, int decodeMode) { + + this.activity = activity; + handlerInitLatch = new CountDownLatch(1); + + hints = new EnumMap(DecodeHintType.class); + + Collection decodeFormats = new ArrayList(); + decodeFormats.addAll(EnumSet.of(BarcodeFormat.AZTEC)); + decodeFormats.addAll(EnumSet.of(BarcodeFormat.PDF_417)); + + switch (decodeMode) { + case BARCODE_MODE: + decodeFormats.addAll(DecodeFormatManager.getBarCodeFormats()); + break; + + case QRCODE_MODE: + decodeFormats.addAll(DecodeFormatManager.getQrCodeFormats()); + break; + + case ALL_MODE: + decodeFormats.addAll(DecodeFormatManager.getBarCodeFormats()); + decodeFormats.addAll(DecodeFormatManager.getQrCodeFormats()); + break; + + default: + break; + } + + hints.put(DecodeHintType.POSSIBLE_FORMATS, decodeFormats); + } + + public Handler getHandler() { + try { + handlerInitLatch.await(); + } catch (InterruptedException ie) { + // continue? + } + return handler; + } + + @Override + public void run() { + Looper.prepare(); + handler = new DecodeHandler(activity, hints); + handlerInitLatch.countDown(); + Looper.loop(); + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/qrcode/encoding/EncodingUtils.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/qrcode/encoding/EncodingUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..cc355c769581f88a4aa9556b75e42f8a26fadf40 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/qrcode/encoding/EncodingUtils.java @@ -0,0 +1,106 @@ +package com.jiuqi.elove.widget.qrcode.encoding; + +import android.graphics.Bitmap; +import android.graphics.Canvas; + +import com.google.zxing.BarcodeFormat; +import com.google.zxing.EncodeHintType; +import com.google.zxing.WriterException; +import com.google.zxing.common.BitMatrix; +import com.google.zxing.qrcode.QRCodeWriter; +import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; + +import java.util.HashMap; +import java.util.Map; + +/** + * 二维码生成工具类 + */ +public class EncodingUtils { + + /** + * 创建二维码 + * + * @param content content + * @param widthPix widthPix + * @param heightPix heightPix + * @param logoBm logoBm + * @return 二维码 + */ + public static Bitmap createQRCode(String content, int widthPix, int heightPix, Bitmap logoBm) { + try { + if (content == null || "".equals(content)) { + return null; + } + // 配置参数 + Map hints = new HashMap<>(); + hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); + // 容错级别 + hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); + // 图像数据转换,使用了矩阵转换 + BitMatrix bitMatrix = new QRCodeWriter().encode(content, BarcodeFormat.QR_CODE, widthPix, + heightPix, hints); + int[] pixels = new int[widthPix * heightPix]; + // 下面这里按照二维码的算法,逐个生成二维码的图片, + // 两个for循环是图片横列扫描的结果 + for (int y = 0; y < heightPix; y++) { + for (int x = 0; x < widthPix; x++) { + if (bitMatrix.get(x, y)) { + pixels[y * widthPix + x] = 0xff000000; + } else { + pixels[y * widthPix + x] = 0xffffffff; + } + } + } + // 生成二维码图片的格式,使用ARGB_8888 + Bitmap bitmap = Bitmap.createBitmap(widthPix, heightPix, Bitmap.Config.ARGB_8888); + bitmap.setPixels(pixels, 0, widthPix, 0, 0, widthPix, heightPix); + if (logoBm != null) { + bitmap = addLogo(bitmap, logoBm); + } + //必须使用compress方法将bitmap保存到文件中再进行读取。直接返回的bitmap是没有任何压缩的,内存消耗巨大! + return bitmap; + } catch (WriterException e) { + e.printStackTrace(); + } + return null; + } + + /** + * 在二维码中间添加Logo图案 + */ + private static Bitmap addLogo(Bitmap src, Bitmap logo) { + if (src == null) { + return null; + } + if (logo == null) { + return src; + } + //获取图片的宽高 + int srcWidth = src.getWidth(); + int srcHeight = src.getHeight(); + int logoWidth = logo.getWidth(); + int logoHeight = logo.getHeight(); + if (srcWidth == 0 || srcHeight == 0) { + return null; + } + if (logoWidth == 0 || logoHeight == 0) { + return src; + } + //logo大小为二维码整体大小的1/5 + float scaleFactor = srcWidth * 1.0f / 5 / logoWidth; + Bitmap bitmap = Bitmap.createBitmap(srcWidth, srcHeight, Bitmap.Config.ARGB_8888); + try { + Canvas canvas = new Canvas(bitmap); + canvas.drawBitmap(src, 0, 0, null); + canvas.scale(scaleFactor, scaleFactor, srcWidth / 2, srcHeight / 2); + canvas.drawBitmap(logo, (srcWidth - logoWidth) / 2, (srcHeight - logoHeight) / 2, null); + canvas.save(Canvas.ALL_SAVE_FLAG); + canvas.restore(); + } catch (Exception e) { + bitmap = null; + e.getStackTrace(); + } + return bitmap; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/qrcode/utils/BeepManager.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/qrcode/utils/BeepManager.java new file mode 100644 index 0000000000000000000000000000000000000000..ed6397f09138312b2daa0b9fe905973315bb16af --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/qrcode/utils/BeepManager.java @@ -0,0 +1,141 @@ +/* + * Copyright (C) 2010 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.jiuqi.elove.widget.qrcode.utils; + +import android.app.Activity; +import android.content.Context; +import android.content.SharedPreferences; +import android.content.res.AssetFileDescriptor; +import android.media.AudioManager; +import android.media.MediaPlayer; +import android.os.Vibrator; +import android.preference.PreferenceManager; +import android.util.Log; + +import com.jiuqi.elove.R; + +import java.io.Closeable; +import java.io.IOException; + +/** + * Manages beeps and vibrations for + */ +public class BeepManager implements MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener, Closeable { + + private static final String TAG = BeepManager.class.getSimpleName(); + + private static final float BEEP_VOLUME = 0.10f; + private static final long VIBRATE_DURATION = 200L; + + private final Activity activity; + private MediaPlayer mediaPlayer; + private boolean playBeep; + private boolean vibrate; + + public BeepManager(Activity activity) { + this.activity = activity; + this.mediaPlayer = null; + updatePrefs(); + } + + private static boolean shouldBeep(SharedPreferences prefs, Context activity) { + boolean shouldPlayBeep = true; + if (shouldPlayBeep) { + // See if sound settings overrides this + AudioManager audioService = (AudioManager) activity.getSystemService(Context.AUDIO_SERVICE); + if (audioService.getRingerMode() != AudioManager.RINGER_MODE_NORMAL) { + shouldPlayBeep = false; + } + } + return shouldPlayBeep; + } + + private synchronized void updatePrefs() { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity); + playBeep = shouldBeep(prefs, activity); + vibrate = true; + if (playBeep && mediaPlayer == null) { + // The volume on STREAM_SYSTEM is not adjustable, and users found it + // too loud, + // so we now play on the music stream. + activity.setVolumeControlStream(AudioManager.STREAM_MUSIC); + mediaPlayer = buildMediaPlayer(activity); + } + } + + public synchronized void playBeepSoundAndVibrate() { + if (playBeep && mediaPlayer != null) { + mediaPlayer.start(); + } + if (vibrate) { + Vibrator vibrator = (Vibrator) activity.getSystemService(Context.VIBRATOR_SERVICE); + vibrator.vibrate(VIBRATE_DURATION); + } + } + + private MediaPlayer buildMediaPlayer(Context activity) { + MediaPlayer mediaPlayer = new MediaPlayer(); + mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); + mediaPlayer.setOnCompletionListener(this); + mediaPlayer.setOnErrorListener(this); + try { + AssetFileDescriptor file = activity.getResources().openRawResourceFd(R.raw.beep); + try { + mediaPlayer.setDataSource(file.getFileDescriptor(), file.getStartOffset(), file.getLength()); + } finally { + file.close(); + } + mediaPlayer.setVolume(BEEP_VOLUME, BEEP_VOLUME); + mediaPlayer.prepare(); + return mediaPlayer; + } catch (IOException ioe) { + Log.w(TAG, ioe); + mediaPlayer.release(); + return null; + } + } + + @Override + public void onCompletion(MediaPlayer mp) { + // When the beep has finished playing, rewind to queue up another one. + mp.seekTo(0); + } + + @Override + public synchronized boolean onError(MediaPlayer mp, int what, int extra) { + if (what == MediaPlayer.MEDIA_ERROR_SERVER_DIED) { + // we are finished, so put up an appropriate error toast if required + // and finish + activity.finish(); + } else { + // possibly media player error, so release and recreate + mp.release(); + mediaPlayer = null; + updatePrefs(); + } + return true; + } + + @Override + public synchronized void close() { + if (mediaPlayer != null) { + mediaPlayer.release(); + mediaPlayer = null; + } + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/qrcode/utils/CaptureActivityHandler.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/qrcode/utils/CaptureActivityHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..28342784cfcb82504544023464396a30a5b39715 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/qrcode/utils/CaptureActivityHandler.java @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.jiuqi.elove.widget.qrcode.utils; + +import android.app.Activity; +import android.content.Intent; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; + +import com.google.zxing.Result; +import com.jiuqi.elove.R; +import com.jiuqi.elove.activity.CaptureActivity; +import com.jiuqi.elove.widget.qrcode.camera.CameraManager; +import com.jiuqi.elove.widget.qrcode.decode.DecodeThread; + +/** + * This class handles all the messaging which comprises the state machine for + * capture. + * + * @author dswitkin@google.com (Daniel Switkin) + */ +public class CaptureActivityHandler extends Handler { + + private final CaptureActivity activity; + private final DecodeThread decodeThread; + private final CameraManager cameraManager; + private State state; + + public CaptureActivityHandler(CaptureActivity activity, CameraManager cameraManager, int decodeMode) { + this.activity = activity; + decodeThread = new DecodeThread(activity, decodeMode); + decodeThread.start(); + state = State.SUCCESS; + + // Start ourselves capturing previews and decoding. + this.cameraManager = cameraManager; + cameraManager.startPreview(); + restartPreviewAndDecode(); + } + + @Override + public void handleMessage(Message message) { + if (message.what == R.id.restart_preview) { + restartPreviewAndDecode(); + + } else if (message.what == R.id.decode_succeeded) { + state = State.SUCCESS; + Bundle bundle = message.getData(); + + activity.handleDecode((Result) message.obj, bundle); + + } else if (message.what == R.id.decode_failed) {// We're decoding as fast as possible, so when one + // decode fails, + // start another. + state = State.PREVIEW; + cameraManager.requestPreviewFrame(decodeThread.getHandler(), R.id.decode); + + } else if (message.what == R.id.return_scan_result) { + activity.setResult(Activity.RESULT_OK, (Intent) message.obj); + activity.finish(); + + } + } + + public void quitSynchronously() { + state = State.DONE; + cameraManager.stopPreview(); + Message quit = Message.obtain(decodeThread.getHandler(), R.id.quit); + quit.sendToTarget(); + try { + // Wait at most half a second; should be enough time, and onPause() + // will timeout quickly + decodeThread.join(500L); + } catch (InterruptedException e) { + // continue + } + + // Be absolutely sure we don't send any queued up messages + removeMessages(R.id.decode_succeeded); + removeMessages(R.id.decode_failed); + } + + private void restartPreviewAndDecode() { + if (state == State.SUCCESS) { + state = State.PREVIEW; + cameraManager.requestPreviewFrame(decodeThread.getHandler(), R.id.decode); + } + } + + private enum State { + PREVIEW, SUCCESS, DONE + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/qrcode/utils/InactivityTimer.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/qrcode/utils/InactivityTimer.java new file mode 100644 index 0000000000000000000000000000000000000000..4077a42c6f7df311a21e0ceaf5ddaec397c93b62 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/qrcode/utils/InactivityTimer.java @@ -0,0 +1,124 @@ +/* + * Copyright (C) 2010 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.jiuqi.elove.widget.qrcode.utils; + +import android.annotation.SuppressLint; +import android.app.Activity; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.os.AsyncTask; +import android.os.BatteryManager; +import android.os.Build; +import android.util.Log; + +/** + * Finishes an activity after a period of inactivity if the device is on battery + * power. + */ +public class InactivityTimer { + + private static final String TAG = InactivityTimer.class.getSimpleName(); + + private static final long INACTIVITY_DELAY_MS = 5 * 60 * 1000L; + + private Activity activity; + private BroadcastReceiver powerStatusReceiver; + private boolean registered; + private AsyncTask inactivityTask; + + public InactivityTimer(Activity activity) { + this.activity = activity; + powerStatusReceiver = new PowerStatusReceiver(); + registered = false; + onActivity(); + } + + @SuppressLint("NewApi") + public synchronized void onActivity() { + cancel(); + inactivityTask = new InactivityAsyncTask(); + if (Build.VERSION.SDK_INT >= 11) { + inactivityTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + } else { + inactivityTask.execute(); + } + } + + public synchronized void onPause() { + cancel(); + if (registered) { + activity.unregisterReceiver(powerStatusReceiver); + registered = false; + } else { + Log.w(TAG, "PowerStatusReceiver was never registered?"); + } + } + + public synchronized void onResume() { + if (registered) { + Log.w(TAG, "PowerStatusReceiver was already registered?"); + } else { + activity.registerReceiver(powerStatusReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); + registered = true; + } + onActivity(); + } + + private synchronized void cancel() { + AsyncTask task = inactivityTask; + if (task != null) { + task.cancel(true); + inactivityTask = null; + } + } + + public void shutdown() { + cancel(); + } + + private class PowerStatusReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + if (Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction())) { + // 0 indicates that we're on battery + boolean onBatteryNow = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1) <= 0; + if (onBatteryNow) { + InactivityTimer.this.onActivity(); + } else { + InactivityTimer.this.cancel(); + } + } + } + } + + private class InactivityAsyncTask extends AsyncTask { + @Override + protected Object doInBackground(Object... objects) { + try { + Thread.sleep(INACTIVITY_DELAY_MS); + Log.i(TAG, "Finishing activity due to inactivity"); + activity.finish(); + } catch (InterruptedException e) { + // continue without killing + } + return null; + } + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/rvhelper/adapter/CommonAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/rvhelper/adapter/CommonAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..6491472831c969707af6bea451f2275e5fbd8213 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/rvhelper/adapter/CommonAdapter.java @@ -0,0 +1,54 @@ +package com.jiuqi.elove.widget.rvhelper.adapter; + +import android.content.Context; +import android.view.LayoutInflater; + +import com.jiuqi.elove.widget.rvhelper.base.ItemViewDelegate; +import com.jiuqi.elove.widget.rvhelper.base.ViewHolder; + +import java.util.ArrayList; +import java.util.List; + + +/** + * Created by zhy on 16/4/9. + */ +public abstract class CommonAdapter extends MultiItemTypeAdapter { + protected Context mContext; + protected int mLayoutId; + protected List mDatas; + protected LayoutInflater mInflater; + + public CommonAdapter(final Context context, final int layoutId) { + this(context, layoutId, new ArrayList()); + } + + public CommonAdapter(final Context context, final int layoutId, List datas) { + super(context, datas); + mContext = context; + mInflater = LayoutInflater.from(context); + mLayoutId = layoutId; + mDatas = datas; + + addItemViewDelegate(new ItemViewDelegate() { + @Override + public int getItemViewLayoutId() { + return layoutId; + } + + @Override + public boolean isForViewType(T item, int position) { + return true; + } + + @Override + public void convert(ViewHolder holder, T t, int position) { + CommonAdapter.this.convert(holder, t, position); + } + }); + } + + protected abstract void convert(ViewHolder holder, T t, int position); + + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/rvhelper/adapter/MultiItemTypeAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/rvhelper/adapter/MultiItemTypeAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..3238b488d034a26c144cf864d4faebc97e00c66f --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/rvhelper/adapter/MultiItemTypeAdapter.java @@ -0,0 +1,154 @@ +package com.jiuqi.elove.widget.rvhelper.adapter; + +import android.content.Context; +import android.support.v7.widget.RecyclerView; +import android.view.View; +import android.view.ViewGroup; + +import com.jiuqi.elove.widget.rvhelper.base.ItemViewDelegate; +import com.jiuqi.elove.widget.rvhelper.base.ItemViewDelegateManager; +import com.jiuqi.elove.widget.rvhelper.base.ViewHolder; + +import java.util.ArrayList; +import java.util.List; + + +/** + * Created by zhy on 16/4/9 + */ +public class MultiItemTypeAdapter extends RecyclerView.Adapter +{ + protected Context mContext; + protected List mDatas; + + protected ItemViewDelegateManager mItemViewDelegateManager; + protected OnItemClickListener mOnItemClickListener; + public int offset = 0; + + public MultiItemTypeAdapter(Context context, List datas) + { + mContext = context; + mDatas = datas; + mItemViewDelegateManager = new ItemViewDelegateManager(); + } + + public MultiItemTypeAdapter(Context context) + { + this(context, new ArrayList()); + } + + @Override + public int getItemViewType(int position) + { + if (!useItemViewDelegateManager()) return super.getItemViewType(position); + return mItemViewDelegateManager.getItemViewType(mDatas.get(position), position); + } + + + @Override + public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) + { + int layoutId = mItemViewDelegateManager.getItemViewLayoutId(viewType); + ViewHolder holder = ViewHolder.createViewHolder(mContext, parent, layoutId); + setListener(parent, holder, viewType); + return holder; + } + + public void convert(ViewHolder holder, T t) + { + mItemViewDelegateManager.convert(holder, t, holder.getAdapterPosition()); + } + + protected boolean isEnabled(int viewType) + { + return true; + } + + + protected void setListener(final ViewGroup parent, final ViewHolder viewHolder, int viewType) + { + if (!isEnabled(viewType)) return; + viewHolder.getConvertView().setOnClickListener(new View.OnClickListener() + { + @Override + public void onClick(View v) + { + if (mOnItemClickListener != null) + { + int position = viewHolder.getAdapterPosition(); + mOnItemClickListener.onItemClick(v, viewHolder, mDatas.get(position - offset), position); + } + } + }); + + viewHolder.getConvertView().setOnLongClickListener(new View.OnLongClickListener() + { + @Override + public boolean onLongClick(View v) + { + if (mOnItemClickListener != null) + { + int position = viewHolder.getAdapterPosition(); + return mOnItemClickListener.onItemLongClick(v, viewHolder, mDatas.get(position - offset), position); + } + return false; + } + }); + } + + @Override + public void onBindViewHolder(ViewHolder holder, int position) + { + convert(holder, mDatas.get(position)); + } + + @Override + public int getItemCount() + { + int itemCount = mDatas.size(); + return itemCount; + } + + + public List getDatas() + { + return mDatas; + } + + public MultiItemTypeAdapter addItemViewDelegate(ItemViewDelegate itemViewDelegate) + { + mItemViewDelegateManager.addDelegate(itemViewDelegate); + return this; + } + + public MultiItemTypeAdapter addItemViewDelegate(int viewType, ItemViewDelegate itemViewDelegate) + { + mItemViewDelegateManager.addDelegate(viewType, itemViewDelegate); + return this; + } + + protected boolean useItemViewDelegateManager() + { + return mItemViewDelegateManager.getItemViewDelegateCount() > 0; + } + + public interface OnItemClickListener + { + void onItemClick(View view, RecyclerView.ViewHolder holder, T o, int position); + + boolean onItemLongClick(View view, RecyclerView.ViewHolder holder, T o, int position); + } + + public void setOnItemClickListener(OnItemClickListener onItemClickListener) + { + this.mOnItemClickListener = onItemClickListener; + } + + public void addDataAll(List data) { + mDatas.addAll(data); + } + + public void clearData() { + mDatas.clear(); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/rvhelper/adapter/ParallaxRecyclerAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/rvhelper/adapter/ParallaxRecyclerAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..8aa2829eb1203e55cdb89db45c3eaa621169fcc4 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/rvhelper/adapter/ParallaxRecyclerAdapter.java @@ -0,0 +1,312 @@ +package com.jiuqi.elove.widget.rvhelper.adapter; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Rect; +import android.os.Build; +import android.support.v7.widget.RecyclerView; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.TranslateAnimation; +import android.widget.RelativeLayout; + +import java.util.List; + +/** + * Create By Anthony on 2016/1/15 + * Class Note: + * 实现视差效果的recyclerView + * https://github.com/kanytu/android-parallax-recyclerview + * + * + */ +public abstract class ParallaxRecyclerAdapter extends RecyclerView.Adapter { + private float mScrollMultiplier = 0.5f; + + public static class VIEW_TYPES { + public static final int NORMAL = 1; + public static final int HEADER = 2; + public static final int FIRST_VIEW = 3; + } + + public abstract void onBindViewHolderImpl(RecyclerView.ViewHolder viewHolder, ParallaxRecyclerAdapter adapter, int i); + + public abstract RecyclerView.ViewHolder onCreateViewHolderImpl(ViewGroup viewGroup, ParallaxRecyclerAdapter adapter, int i); + + public abstract int getItemCountImpl(ParallaxRecyclerAdapter adapter); + + public interface OnClickEvent { + /** + * Event triggered when you click on a item of the adapter + * + * @param v view + * @param position position on the array + */ + void onClick(View v, int position); + } + + public interface OnParallaxScroll { + /** + * Event triggered when the parallax is being scrolled. + */ + void onParallaxScroll(float percentage, float offset, View parallax); + } + + private List mData; + private CustomRelativeWrapper mHeader; + private OnClickEvent mOnClickEvent; + private OnParallaxScroll mParallaxScroll; + private RecyclerView mRecyclerView; + private boolean mShouldClipView = true; + + /** + * Translates the adapter in Y + * + * @param of offset in px + */ + public void translateHeader(float of) { + float ofCalculated = of * mScrollMultiplier; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB && of < mHeader.getHeight()) { + mHeader.setTranslationY(ofCalculated); + } else if (of < mHeader.getHeight()) { + TranslateAnimation anim = new TranslateAnimation(0, 0, ofCalculated, ofCalculated); + anim.setFillAfter(true); + anim.setDuration(0); + mHeader.startAnimation(anim); + } + mHeader.setClipY(Math.round(ofCalculated)); + if (mParallaxScroll != null) { + final RecyclerView.ViewHolder holder = mRecyclerView.findViewHolderForAdapterPosition(0); + float left; + if (holder != null) { + left = Math.min(1, ((ofCalculated) / (mHeader.getHeight() * mScrollMultiplier))); + }else { + left = 1; + } + mParallaxScroll.onParallaxScroll(left, of, mHeader); + } + } + + /** + * Set the view as header. + * + * @param header The inflated header + * @param view The RecyclerView to set scroll listeners + */ + public void setParallaxHeader(View header, final RecyclerView view) { + mRecyclerView = view; + mHeader = new CustomRelativeWrapper(header.getContext(), mShouldClipView); + mHeader.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); + mHeader.addView(header, new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); + view.setOnScrollListener(new RecyclerView.OnScrollListener() { + @Override + public void onScrolled(RecyclerView recyclerView, int dx, int dy) { + super.onScrolled(recyclerView, dx, dy); + if (mHeader != null) { + translateHeader(mRecyclerView.getLayoutManager().getChildAt(0) == mHeader ? + mRecyclerView.computeVerticalScrollOffset() : mHeader.getHeight()); + + } + } + }); + } + + @Override + public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, final int i) { + if (mHeader != null) { + if (i == 0) { + return; + } + onBindViewHolderImpl(viewHolder, this, i - 1); + } else { + onBindViewHolderImpl(viewHolder, this, i); + } + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, final int i) { + if (i == VIEW_TYPES.HEADER && mHeader != null) { + return new ViewHolder(mHeader); + } + if (i == VIEW_TYPES.FIRST_VIEW && mHeader != null && mRecyclerView != null) { + final RecyclerView.ViewHolder holder = mRecyclerView.findViewHolderForAdapterPosition(0); + if (holder != null) { + translateHeader(-holder.itemView.getTop()); + } + } + final RecyclerView.ViewHolder holder = onCreateViewHolderImpl(viewGroup, this, i); + if (mOnClickEvent != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mOnClickEvent.onClick(v, holder.getAdapterPosition() - (mHeader == null ? 0 : 1)); + } + }); + } + return holder; + } + + /** + * @return true if there is a header on this adapter, false otherwise + */ + public boolean hasHeader() { + return mHeader != null; + } + + public void setOnClickEvent(OnClickEvent onClickEvent) { + mOnClickEvent = onClickEvent; + } + + + public boolean isShouldClipView() { + return mShouldClipView; + } + + /** + * Defines if we will clip the layout or not. MUST BE CALLED BEFORE {@link + * #setParallaxHeader(View, RecyclerView)} + */ + public void setShouldClipView(boolean shouldClickView) { + mShouldClipView = shouldClickView; + } + + public void setOnParallaxScroll(OnParallaxScroll parallaxScroll) { + mParallaxScroll = parallaxScroll; + mParallaxScroll.onParallaxScroll(0, 0, mHeader); + } + + public ParallaxRecyclerAdapter(List data) { + mData = data; + } + + public List getData() { + return mData; + } + + public void setData(List data) { + mData = data; + notifyDataSetChanged(); + } + + public void addItem(T item, int position) { + mData.add(position, item); + notifyItemInserted(position + (mHeader == null ? 0 : 1)); + } + + public void removeItem(T item) { + int position = mData.indexOf(item); + if (position < 0) + return; + mData.remove(item); + notifyItemRemoved(position + (mHeader == null ? 0 : 1)); + } + + + public int getItemCount() { + return getItemCountImpl(this) + (mHeader == null ? 0 : 1); + } + + @Override + public int getItemViewType(int position) { + if (position == 1) + return VIEW_TYPES.FIRST_VIEW; + return position == 0 && mHeader != null ? VIEW_TYPES.HEADER : VIEW_TYPES.NORMAL; + } + + static class ViewHolder extends RecyclerView.ViewHolder { + public ViewHolder(View itemView) { + super(itemView); + } + } + + static class CustomRelativeWrapper extends RelativeLayout { + + private int mOffset; + private boolean mShouldClip; + + public CustomRelativeWrapper(Context context, boolean shouldClick) { + super(context); + mShouldClip = shouldClick; + } + + @Override + protected void dispatchDraw(Canvas canvas) { + if (mShouldClip) { + canvas.clipRect(new Rect(getLeft(), getTop(), getRight(), getBottom() + mOffset)); + } + super.dispatchDraw(canvas); + } + + public void setClipY(int offset) { + mOffset = offset; + invalidate(); + } + } + /** + * Set parallax scroll multiplier. + * + * @param mul The multiplier + */ + public void setScrollMultiplier(float mul) { + this.mScrollMultiplier = mul; + } + + /** + * Get the current parallax scroll multiplier. + * + */ + public float getScrollMultiplier() { + return this.mScrollMultiplier; + } +} + +/** + * Sample here + */ +/* + private void createAdapter(RecyclerView recyclerView) { + final List content = new ArrayList<>(); + for (int i = 0; i < 50; i++) { + content.add("item " + i); + } + + final ParallaxRecyclerAdapter adapter = new ParallaxRecyclerAdapter(content) { + @Override + public void onBindViewHolderImpl(RecyclerView.ViewHolder viewHolder, ParallaxRecyclerAdapter adapter, int i) { + ((ViewHolder) viewHolder).textView.setText(adapter.getData().get(i)); + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolderImpl(ViewGroup viewGroup, final ParallaxRecyclerAdapter adapter, int i) { + return new ViewHolder(getLayoutInflater().inflate(R.layout.row_recyclerview, viewGroup, false)); + } + + @Override + public int getItemCountImpl(ParallaxRecyclerAdapter adapter) { + return content.size(); + } + }; + + adapter.setOnClickEvent(new ParallaxRecyclerAdapter.OnClickEvent() { + @Override + public void onClick(View v, int position) { + Toast.makeText(PersonalInfoActivity.this, "You clicked '" + position + "'", Toast.LENGTH_SHORT).show(); + } + }); + + //alpha effect in TopBar + adapter.setOnParallaxScroll(new ParallaxRecyclerAdapter.OnParallaxScroll() { + @Override + public void onParallaxScroll(float percentage, float offset, View parallax) { + Drawable c = personalTopBar.getBackground(); + c.setAlpha(Math.round(percentage * 255)); + personalTopBar.setBackground(c); + } + }); + + recyclerView.setLayoutManager(new LinearLayoutManager(this)); + View header = getLayoutInflater().inflate(R.layout.header, recyclerView, false); + adapter.setParallaxHeader(header, recyclerView); + adapter.setData(content); + recyclerView.setAdapter(adapter); + }*/ \ No newline at end of file diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/rvhelper/base/ItemViewDelegate.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/rvhelper/base/ItemViewDelegate.java new file mode 100644 index 0000000000000000000000000000000000000000..87b359f69ba7c9f2201ef7c9d2a04049d2b203f1 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/rvhelper/base/ItemViewDelegate.java @@ -0,0 +1,17 @@ +package com.jiuqi.elove.widget.rvhelper.base; + + +/** + * Created by zhy on 16/6/22 + */ +public interface ItemViewDelegate +{ + + int getItemViewLayoutId(); + + boolean isForViewType(T item, int position); + + void convert(ViewHolder holder, T t, int position); + + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/rvhelper/base/ItemViewDelegateManager.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/rvhelper/base/ItemViewDelegateManager.java new file mode 100644 index 0000000000000000000000000000000000000000..8ab9e6479a4b08750d7549923b17316b38b0af3d --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/rvhelper/base/ItemViewDelegateManager.java @@ -0,0 +1,111 @@ +package com.jiuqi.elove.widget.rvhelper.base; + +import android.support.v4.util.SparseArrayCompat; + + +/** + * Created by zhy on 16/6/22 + */ +public class ItemViewDelegateManager +{ + SparseArrayCompat> delegates = new SparseArrayCompat(); + + public int getItemViewDelegateCount() + { + return delegates.size(); + } + + public ItemViewDelegateManager addDelegate(ItemViewDelegate delegate) + { + int viewType = delegates.size(); + if (delegate != null) + { + delegates.put(viewType, delegate); + viewType++; + } + return this; + } + + public ItemViewDelegateManager addDelegate(int viewType, ItemViewDelegate delegate) + { + if (delegates.get(viewType) != null) + { + throw new IllegalArgumentException( + "An ItemViewDelegate is already registered for the viewType = " + + viewType + + ". Already registered ItemViewDelegate is " + + delegates.get(viewType)); + } + delegates.put(viewType, delegate); + return this; + } + + public ItemViewDelegateManager removeDelegate(ItemViewDelegate delegate) + { + if (delegate == null) + { + throw new NullPointerException("ItemViewDelegate is null"); + } + int indexToRemove = delegates.indexOfValue(delegate); + + if (indexToRemove >= 0) + { + delegates.removeAt(indexToRemove); + } + return this; + } + + public ItemViewDelegateManager removeDelegate(int itemType) + { + int indexToRemove = delegates.indexOfKey(itemType); + + if (indexToRemove >= 0) + { + delegates.removeAt(indexToRemove); + } + return this; + } + + public int getItemViewType(T item, int position) + { + int delegatesCount = delegates.size(); + for (int i = delegatesCount - 1; i >= 0; i--) + { + ItemViewDelegate delegate = delegates.valueAt(i); + if (delegate.isForViewType( item, position)) + { + return delegates.keyAt(i); + } + } + throw new IllegalArgumentException( + "No ItemViewDelegate added that matches position=" + position + " in data source"); + } + + public void convert(ViewHolder holder, T item, int position) + { + int delegatesCount = delegates.size(); + for (int i = 0; i < delegatesCount; i++) + { + ItemViewDelegate delegate = delegates.valueAt(i); + + if (delegate.isForViewType( item, position)) + { + delegate.convert(holder, item, position); + return; + } + } + throw new IllegalArgumentException( + "No ItemViewDelegateManager added that matches position=" + position + " in data source"); + } + + + public int getItemViewLayoutId(int viewType) + { + return delegates.get(viewType).getItemViewLayoutId(); + } + + public int getItemViewType(ItemViewDelegate itemViewDelegate) + { + return delegates.indexOfValue(itemViewDelegate); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/rvhelper/base/ViewHolder.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/rvhelper/base/ViewHolder.java new file mode 100644 index 0000000000000000000000000000000000000000..b697f8ec23f79c7497f521c262e40e3c4601e17d --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/rvhelper/base/ViewHolder.java @@ -0,0 +1,360 @@ +package com.jiuqi.elove.widget.rvhelper.base; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Paint; +import android.graphics.Typeface; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.support.v4.graphics.drawable.RoundedBitmapDrawable; +import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory; +import android.support.v7.widget.RecyclerView; +import android.text.TextUtils; +import android.text.util.Linkify; +import android.util.DisplayMetrics; +import android.util.SparseArray; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.AlphaAnimation; +import android.widget.Checkable; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.RatingBar; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.target.BitmapImageViewTarget; +import com.jiuqi.elove.R; +import com.jiuqi.elove.application.EloveApplication; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.util.EasyGlide; +import com.jiuqi.elove.util.GlideRoundTransform; +import com.jiuqi.elove.util.JqStrUtil; +import com.jiuqi.elove.util.SupportMultiScreenUtil; + +/** + * Created by zhy on 16/6/22 + */ +public class ViewHolder extends RecyclerView.ViewHolder { + + private SparseArray mViews; + private View mConvertView; + private Context mContext; + + + public ViewHolder(Context context, View itemView) { + super(itemView); + mContext = context; + mConvertView = itemView; + mViews = new SparseArray<>(); + } + + + public static ViewHolder createViewHolder(Context context, View itemView) { + return new ViewHolder(context, itemView); + } + + public static ViewHolder createViewHolder(Context context, ViewGroup parent, int layoutId) { + View itemView = LayoutInflater.from(context).inflate(layoutId, parent, false); + SupportMultiScreenUtil.scale(itemView);//我自己加入的屏幕适配 + return new ViewHolder(context, itemView); + } + + + /** + * 通过viewId获取控件 + */ + public T getView(int viewId) { + View view = mViews.get(viewId); + if (view == null) { + view = mConvertView.findViewById(viewId); + mViews.put(viewId, view); + } + return (T) view; + } + + public View getConvertView() { + return mConvertView; + } + + + /****以下为辅助方法*****/ + + /** + * 设置TextView的值 + * + * @param viewId + * @param text + * @return + */ + public ViewHolder setText(int viewId, String text) { + TextView tv = getView(viewId); + tv.setText(text); + return this; + } + + public ViewHolder setImageResource(int viewId, int resId) { + ImageView view = getView(viewId); + Glide.with(EloveApplication.getAppContext()).load(resId).into(view); +// view.setImageResource(resId); + return this; + } + + public ViewHolder setImageResource(int viewId, String resId, int placeholder) { + ImageView view = getView(viewId); + Glide.with(EloveApplication.getAppContext()).load(resId).placeholder(placeholder).dontAnimate().into(view); +// view.setImageResource(resId); + return this; + } + + public ViewHolder setImageResourceGround(int viewId, String resId, int dp, int placeholder){ + ImageView view = getView(viewId); + EasyGlide.getInstance().showImage(true,resId,view,placeholder); + return this; + } + + public ViewHolder setImageResourceGround(int viewId, int resId, int dp){ + ImageView view = getView(viewId); + Glide.with(EloveApplication.getAppContext()).load(resId).placeholder(R.drawable.img_hx_avatar).dontAnimate().centerCrop().transform(new GlideRoundTransform(mContext,dp)).into(view); + return this; + } + + public ViewHolder setImageResourceGround(int viewId, String resId, int dp){ + ImageView view = getView(viewId); + Glide.with(EloveApplication.getAppContext()).load(resId).placeholder(R.drawable.img_hx_avatar).dontAnimate().centerCrop().transform(new GlideRoundTransform(mContext,dp)).into(view); + return this; + } + + public ViewHolder setImageResourceCircle(int viewId, String resId){ + ImageView view = getView(viewId); + Glide.with(EloveApplication.getAppContext()).load(resId).asBitmap().centerCrop().dontAnimate().placeholder(R.drawable.img_yuanqueshengtouxiang).into(new BitmapImageViewTarget(view) { + @Override + protected void setResource(Bitmap resource) { + RoundedBitmapDrawable circularBitmapDrawable = + RoundedBitmapDrawableFactory.create(EloveApplication.getAppContext().getResources(), resource); + circularBitmapDrawable.setCircular(true); + view.setImageDrawable(circularBitmapDrawable); + } + }); + return this; + } + + public ViewHolder setImageTextCircle(int viewId, String namepre, String name){ + TextView view = getView(viewId); + EasyGlide.getInstance().showTextCircleAvatar(view,namepre,name); + return this; + } + + public ViewHolder setImageBitmap(int viewId, Bitmap bitmap) { + ImageView view = getView(viewId); + view.setImageBitmap(bitmap); + return this; + } + + public ViewHolder setImageDrawable(int viewId, Drawable drawable) { + ImageView view = getView(viewId); + view.setImageDrawable(drawable); + return this; + } + + public ViewHolder setBackgroundColor(int viewId, int color) { + View view = getView(viewId); + view.setBackgroundColor(color); + return this; + } + + public ViewHolder setBackgroundRes(int viewId, int backgroundRes) { + View view = getView(viewId); + view.setBackgroundResource(backgroundRes); + return this; + } + + public ViewHolder setTextColor(int viewId, int textColor) { + TextView view = getView(viewId); + view.setTextColor(textColor); + return this; + } + + public ViewHolder setTextColorRes(int viewId, int textColorRes) { + TextView view = getView(viewId); + view.setTextColor(mContext.getResources().getColor(textColorRes)); + return this; + } + + @SuppressLint("NewApi") + public ViewHolder setAlpha(int viewId, float value) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + getView(viewId).setAlpha(value); + } else { + // Pre-honeycomb hack to set Alpha value + AlphaAnimation alpha = new AlphaAnimation(value, value); + alpha.setDuration(0); + alpha.setFillAfter(true); + getView(viewId).startAnimation(alpha); + } + return this; + } + + public ViewHolder setVisible(int viewId, boolean visible) { + View view = getView(viewId); + view.setVisibility(visible ? View.VISIBLE : View.GONE); + return this; + } + + public ViewHolder linkify(int viewId) { + TextView view = getView(viewId); + Linkify.addLinks(view, Linkify.ALL); + return this; + } + + public ViewHolder setTypeface(Typeface typeface, int... viewIds) { + for (int viewId : viewIds) { + TextView view = getView(viewId); + view.setTypeface(typeface); + view.setPaintFlags(view.getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG); + } + return this; + } + + public ViewHolder setProgress(int viewId, int progress) { + ProgressBar view = getView(viewId); + view.setProgress(progress); + return this; + } + + public ViewHolder setProgress(int viewId, int progress, int max) { + ProgressBar view = getView(viewId); + view.setMax(max); + view.setProgress(progress); + return this; + } + + public ViewHolder setMax(int viewId, int max) { + ProgressBar view = getView(viewId); + view.setMax(max); + return this; + } + + public ViewHolder setRating(int viewId, float rating) { + RatingBar view = getView(viewId); + view.setRating(rating); + return this; + } + + public ViewHolder setRating(int viewId, float rating, int max) { + RatingBar view = getView(viewId); + view.setMax(max); + view.setRating(rating); + return this; + } + + public ViewHolder setTag(int viewId, Object tag) { + View view = getView(viewId); + view.setTag(tag); + return this; + } + + public ViewHolder setTag(int viewId, int key, Object tag) { + View view = getView(viewId); + view.setTag(key, tag); + return this; + } + + public ViewHolder setChecked(int viewId, boolean checked) { + Checkable view = (Checkable) getView(viewId); + view.setChecked(checked); + return this; + } + + /** + * 关于事件的 + */ + public ViewHolder setOnClickListener(int viewId, + View.OnClickListener listener) { + View view = getView(viewId); + view.setOnClickListener(listener); + return this; + } + + public ViewHolder setOnTouchListener(int viewId, View.OnTouchListener listener) { + View view = getView(viewId); + view.setOnTouchListener(listener); + return this; + } + + public ViewHolder setOnLongClickListener(int viewId, View.OnLongClickListener listener) { + View view = getView(viewId); + view.setOnLongClickListener(listener); + return this; + } + + /** + * 1 linearlayout + * 2 relativelayout + * @param viewId + * @param dimen + * @param layoutType + * @return + */ + public ViewHolder setImageLayout(Context context, int viewId, int dimen, int layoutType, int count) { + ImageView view = getView(viewId); + DisplayMetrics dm = context.getResources().getDisplayMetrics(); + int width = dm.widthPixels - dimen; + if(1==layoutType){ + view.setLayoutParams(new LinearLayout.LayoutParams(width/count,width/count)); + }else if(2==layoutType){ + view.setLayoutParams(new RelativeLayout.LayoutParams(width/count,width/count)); + }else if(3==layoutType){ + view.setLayoutParams(new FrameLayout.LayoutParams(width/count,width/count)); + } + return this; + } + + public ViewHolder setImageLayout(Context context, int viewId, int dimen, int layoutType, int wcount, int hcount) { + ImageView view = getView(viewId); + DisplayMetrics dm = context.getResources().getDisplayMetrics(); + int width = dm.widthPixels - dimen; + if(1==layoutType){ + view.setLayoutParams(new LinearLayout.LayoutParams(width/wcount,width/hcount)); + }else if(2==layoutType){ + view.setLayoutParams(new RelativeLayout.LayoutParams(width/wcount,width/hcount)); + }else if(3==layoutType){ + view.setLayoutParams(new FrameLayout.LayoutParams(width/wcount,width/hcount)); + } + return this; + } + + public ViewHolder setRelativeLayoutParam(int viewId, RelativeLayout.LayoutParams lp) { + View view = getView(viewId); + view.setLayoutParams(lp); + return this; + } + + public ViewHolder setResultIvLayoutParam(int viewId, RelativeLayout.LayoutParams lp){ + ImageView view = getView(viewId); + lp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); + view.setLayoutParams(lp); + return this; + } + + public ViewHolder setLayoutwh(int viewId, int width, int height){ + RelativeLayout rl = getView(viewId); + ViewGroup.LayoutParams param = rl.getLayoutParams(); + param.width = width; + param.height = height; + return this; + } + + public ViewHolder setLayoutwh(int viewId, int width){ + RelativeLayout rl = getView(viewId); + ViewGroup.LayoutParams param = rl.getLayoutParams(); + param.width = width; + param.height = ViewGroup.LayoutParams.WRAP_CONTENT; + return this; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/rvhelper/divider/ConditionItemBean.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/rvhelper/divider/ConditionItemBean.java new file mode 100644 index 0000000000000000000000000000000000000000..c756fa4e6b475f3b307d06d4151f8464e75c0165 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/rvhelper/divider/ConditionItemBean.java @@ -0,0 +1,20 @@ +package com.jiuqi.elove.widget.rvhelper.divider; + +/** + * Created by dl on 2017/7/13 + */ +public class ConditionItemBean { + + public int type;//0单选 1多选 2组内单选,多选 3日期类 4城市类 5其他 + public String title;//分组title + public String hint;//提示信息 + public String result;//结果信息 + public String url;//头像 + + public ConditionItemBean(String title, String hint, int type){ + this.type = type; + this.title = title; + this.hint = hint; + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/rvhelper/divider/RecycleViewDivider.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/rvhelper/divider/RecycleViewDivider.java new file mode 100644 index 0000000000000000000000000000000000000000..790d183182ff01c9601bde3f1c9cf323372926ed --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/rvhelper/divider/RecycleViewDivider.java @@ -0,0 +1,129 @@ +package com.jiuqi.elove.widget.rvhelper.divider; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.support.v4.content.ContextCompat; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.View; + +/** + * RecyclerView 分界线 + */ +public class RecycleViewDivider extends RecyclerView.ItemDecoration { + + private Paint mPaint; + private Drawable mDivider; + private int mDividerHeight = 4;//分割线高度,默认为1px + private int mOrientation;//列表的方向:LinearLayoutManager.VERTICAL或LinearLayoutManager.HORIZONTAL + private static final int[] ATTRS = new int[]{android.R.attr.listDivider}; + + /** + * 默认分割线:高度为2px,颜色为灰色 + * + * @param context + * @param orientation 列表方向 + */ + public RecycleViewDivider(Context context, int orientation) { + if (orientation != LinearLayoutManager.VERTICAL && orientation != LinearLayoutManager.HORIZONTAL) { + throw new IllegalArgumentException("请输入正确的参数!"); + } + mOrientation = orientation; + + final TypedArray a = context.obtainStyledAttributes(ATTRS); + mDivider = a.getDrawable(0); + a.recycle(); + } + + /** + * 自定义分割线 + * + * @param context + * @param orientation 列表方向 + * @param drawableId 分割线图片 + */ + public RecycleViewDivider(Context context, int orientation, int drawableId) { + this(context, orientation); + mDivider = ContextCompat.getDrawable(context, drawableId); + mDividerHeight = mDivider.getIntrinsicHeight(); + } + + /** + * 自定义分割线 + * + * @param context + * @param orientation 列表方向 + * @param dividerHeight 分割线高度 + * @param dividerColor 分割线颜色 + */ + public RecycleViewDivider(Context context, int orientation, int dividerHeight, int dividerColor) { + this(context, orientation); + mDividerHeight = dividerHeight; + mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + mPaint.setColor(dividerColor); + mPaint.setStyle(Paint.Style.FILL); + } + + + //获取分割线尺寸 + @Override + public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { + super.getItemOffsets(outRect, view, parent, state); + outRect.set(0, 0, 0, mDividerHeight); + } + + //绘制分割线 + @Override + public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { + super.onDraw(c, parent, state); + if (mOrientation == LinearLayoutManager.VERTICAL) { + drawVertical(c, parent); + } else { + drawHorizontal(c, parent); + } + } + + //绘制横向 item 分割线 + private void drawHorizontal(Canvas canvas, RecyclerView parent) { + final int left = parent.getPaddingLeft(); + final int right = parent.getMeasuredWidth() - parent.getPaddingRight(); + final int childSize = parent.getChildCount(); + for (int i = 0; i < childSize; i++) { + final View child = parent.getChildAt(i); + RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams(); + final int top = child.getBottom() + layoutParams.bottomMargin; + final int bottom = top + mDividerHeight; + if (mDivider != null) { + mDivider.setBounds(left, top, right, bottom); + mDivider.draw(canvas); + } + if (mPaint != null) { + canvas.drawRect(left, top, right, bottom, mPaint); + } + } + } + + //绘制纵向 item 分割线 + private void drawVertical(Canvas canvas, RecyclerView parent) { + final int top = parent.getPaddingTop(); + final int bottom = parent.getMeasuredHeight() - parent.getPaddingBottom(); + final int childSize = parent.getChildCount(); + for (int i = 0; i < childSize; i++) { + final View child = parent.getChildAt(i); + RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams(); + final int left = child.getRight() + layoutParams.rightMargin; + final int right = left + mDividerHeight; + if (mDivider != null) { + mDivider.setBounds(left, top, right, bottom); + mDivider.draw(canvas); + } + if (mPaint != null) { + canvas.drawRect(left, top, right, bottom, mPaint); + } + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/rvhelper/divider/TitleItemDecoration.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/rvhelper/divider/TitleItemDecoration.java new file mode 100644 index 0000000000000000000000000000000000000000..4ff7af71e695806633cbea36329273c925368156 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/rvhelper/divider/TitleItemDecoration.java @@ -0,0 +1,212 @@ +package com.jiuqi.elove.widget.rvhelper.divider; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Rect; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.util.Log; +import android.util.TypedValue; +import android.view.LayoutInflater; +import android.view.View; + +import java.util.List; + +/** + * 有分类title的 ItemDecoration + * Created by zhangxutong . + * Date: 16/08/28 + */ + +public class TitleItemDecoration extends RecyclerView.ItemDecoration { + private List mDatas; + private Paint mPaint; + private Rect mBounds;//用于存放测量文字Rect + + private LayoutInflater mInflater; + + private int mTitleHeight;//title的高 + private static int COLOR_TITLE_BG = Color.parseColor("#FFDFDFDF"); + private static int COLOR_TITLE_FONT = Color.parseColor("#FF000000"); + private static int mTitleFontSize;//title字体大小 + + + public TitleItemDecoration(Context context, List datas) { + super(); + mDatas = datas; + mPaint = new Paint(); + mBounds = new Rect(); + mTitleHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 30, context.getResources().getDisplayMetrics()); + mTitleFontSize = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 16, context.getResources().getDisplayMetrics()); + mPaint.setTextSize(mTitleFontSize); + mPaint.setAntiAlias(true); + mInflater = LayoutInflater.from(context); + } + + @Override + public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { + super.onDraw(c, parent, state); + final int left = parent.getPaddingLeft(); + final int right = parent.getWidth() - parent.getPaddingRight(); + final int childCount = parent.getChildCount(); + for (int i = 0; i < childCount; i++) { + final View child = parent.getChildAt(i); + final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child + .getLayoutParams(); + int position = params.getViewLayoutPosition(); + //我记得Rv的item position在重置时可能为-1.保险点判断一下吧 + if (position > -1) { + if (position == 0) {//等于0肯定要有title的 + drawTitleArea(c, left, right, child, params, position); + + } else {//其他的通过判断 + if (null != mDatas.get(position).title && !mDatas.get(position).title.equals(mDatas.get(position - 1).title)) { + //不为空 且跟前一个tag不一样了,说明是新的分类,也要title + drawTitleArea(c, left, right, child, params, position); + } else { + //none + } + } + } + } + } + + /** + * 绘制Title区域背景和文字的方法 + * + * @param c + * @param left + * @param right + * @param child + * @param params + * @param position + */ + private void drawTitleArea(Canvas c, int left, int right, View child, RecyclerView.LayoutParams params, int position) {//最先调用,绘制在最下层 + mPaint.setColor(COLOR_TITLE_BG); + c.drawRect(left, child.getTop() - params.topMargin - mTitleHeight, right, child.getTop() - params.topMargin, mPaint); + mPaint.setColor(COLOR_TITLE_FONT); +/* + Paint.FontMetricsInt fontMetrics = mPaint.getFontMetricsInt(); + int baseline = (getMeasuredHeight() - fontMetrics.bottom + fontMetrics.top) / 2 - fontMetrics.top;*/ + + mPaint.getTextBounds(mDatas.get(position).title, 0, mDatas.get(position).title.length(), mBounds); + c.drawText(mDatas.get(position).title, child.getPaddingLeft(), child.getTop() - params.topMargin - (mTitleHeight / 2 - mBounds.height() / 2), mPaint); + } + + @Override + public void onDrawOver(Canvas c, final RecyclerView parent, RecyclerView.State state) {//最后调用 绘制在最上层 + int pos = ((LinearLayoutManager) (parent.getLayoutManager())).findFirstVisibleItemPosition(); + + String tag = mDatas.get(pos).title; + //View child = parent.getChildAt(pos); + View child = parent.findViewHolderForLayoutPosition(pos).itemView;//出现一个奇怪的bug,有时候child为空,所以将 child = parent.getChildAt(i)。-》 parent.findViewHolderForLayoutPosition(pos).itemView + + boolean flag = false;//定义一个flag,Canvas是否位移过的标志 + if ((pos + 1) < mDatas.size()) {//防止数组越界(一般情况不会出现) + if (null != tag && !tag.equals(mDatas.get(pos + 1).title)) {//当前第一个可见的Item的tag,不等于其后一个item的tag,说明悬浮的View要切换了 + Log.d("zxt", "onDrawOver() called with: c = [" + child.getTop());//当getTop开始变负,它的绝对值,是第一个可见的Item移出屏幕的距离, + if (child.getHeight() + child.getTop() < mTitleHeight) {//当第一个可见的item在屏幕中还剩的高度小于title区域的高度时,我们也该开始做悬浮Title的“交换动画” + c.save();//每次绘制前 保存当前Canvas状态, + flag = true; + + //一种头部折叠起来的视效,个人觉得也还不错~ + //可与123行 c.drawRect 比较,只有bottom参数不一样,由于 child.getHeight() + child.getTop() < mTitleHeight,所以绘制区域是在不断的减小,有种折叠起来的感觉 + //c.clipRect(parent.getPaddingLeft(), parent.getPaddingTop(), parent.getRight() - parent.getPaddingRight(), parent.getPaddingTop() + child.getHeight() + child.getTop()); + + //类似饿了么点餐时,商品列表的悬停头部切换“动画效果” + //上滑时,将canvas上移 (y为负数) ,所以后面canvas 画出来的Rect和Text都上移了,有种切换的“动画”感觉 + c.translate(0, child.getHeight() + child.getTop() - mTitleHeight); + } + } + } + mPaint.setColor(COLOR_TITLE_BG); + c.drawRect(parent.getPaddingLeft(), parent.getPaddingTop(), parent.getRight() - parent.getPaddingRight(), parent.getPaddingTop() + mTitleHeight, mPaint); + mPaint.setColor(COLOR_TITLE_FONT); + mPaint.getTextBounds(tag, 0, tag.length(), mBounds); + c.drawText(tag, child.getPaddingLeft(), + parent.getPaddingTop() + mTitleHeight - (mTitleHeight / 2 - mBounds.height() / 2), + mPaint); + if (flag) + c.restore();//恢复画布到之前保存的状态 + + +/* Button button = new Button(parent.getContext()); + button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Toast.makeText(parent.getContext(), "啊哈", Toast.LENGTH_SHORT).show();//即使给View设置了点击事件,也是无效的,它仅仅draw了 + } + }); + ViewGroup.LayoutParams params = button.getLayoutParams(); + if (params == null){ + params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); + } + button.setLayoutParams(params); + button.setBackgroundColor(Color.RED); + button.setText("无哈"); + *//*button.measure(View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.EXACTLY),View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.EXACTLY)); +*//* + //必须经过 测量 和 布局,View才能被正常的显示出来 + button.measure(View.MeasureSpec.makeMeasureSpec(9999,View.MeasureSpec.UNSPECIFIED),View.MeasureSpec.makeMeasureSpec(9999,View.MeasureSpec.UNSPECIFIED)); + button.layout(parent.getPaddingLeft(),parent.getPaddingTop(), + parent.getPaddingLeft()+button.getMeasuredWidth(),parent.getPaddingTop()+button.getMeasuredHeight()); + button.draw(c);*/ + + //inflate一个复杂布局 并draw出来 +/* View toDrawView = mInflater.inflate(R.layout.header_complex, parent, false); + int toDrawWidthSpec;//用于测量的widthMeasureSpec + int toDrawHeightSpec;//用于测量的heightMeasureSpec + //拿到复杂布局的LayoutParams,如果为空,就new一个。 + // 后面需要根据这个lp 构建toDrawWidthSpec,toDrawHeightSpec + ViewGroup.LayoutParams lp = toDrawView.getLayoutParams(); + if (lp == null) { + lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);//这里是根据复杂布局layout的width height,new一个Lp + toDrawView.setLayoutParams(lp); + } + if (lp.width == ViewGroup.LayoutParams.MATCH_PARENT) { + //如果是MATCH_PARENT,则用父控件能分配的最大宽度和EXACTLY构建MeasureSpec。 + toDrawWidthSpec = View.MeasureSpec.makeMeasureSpec(parent.getWidth() - parent.getPaddingLeft() - parent.getPaddingRight(), View.MeasureSpec.EXACTLY); + } else if (lp.width == ViewGroup.LayoutParams.WRAP_CONTENT) { + //如果是WRAP_CONTENT,则用父控件能分配的最大宽度和AT_MOST构建MeasureSpec。 + toDrawWidthSpec = View.MeasureSpec.makeMeasureSpec(parent.getWidth() - parent.getPaddingLeft() - parent.getPaddingRight(), View.MeasureSpec.AT_MOST); + } else { + //否则则是具体的宽度数值,则用这个宽度和EXACTLY构建MeasureSpec。 + toDrawWidthSpec = View.MeasureSpec.makeMeasureSpec(lp.width, View.MeasureSpec.EXACTLY); + } + //高度同理 + if (lp.height == ViewGroup.LayoutParams.MATCH_PARENT) { + toDrawHeightSpec = View.MeasureSpec.makeMeasureSpec(parent.getHeight() - parent.getPaddingTop() - parent.getPaddingBottom(), View.MeasureSpec.EXACTLY); + } else if (lp.height == ViewGroup.LayoutParams.WRAP_CONTENT) { + toDrawHeightSpec = View.MeasureSpec.makeMeasureSpec(parent.getHeight() - parent.getPaddingTop() - parent.getPaddingBottom(), View.MeasureSpec.AT_MOST); + } else { + toDrawHeightSpec = View.MeasureSpec.makeMeasureSpec(lp.width, View.MeasureSpec.EXACTLY); + } + //依次调用 measure,layout,draw方法,将复杂头部显示在屏幕上。 + toDrawView.measure(toDrawWidthSpec, toDrawHeightSpec); + toDrawView.layout(parent.getPaddingLeft(), parent.getPaddingTop(), + parent.getPaddingLeft() + toDrawView.getMeasuredWidth(), parent.getPaddingTop() + toDrawView.getMeasuredHeight()); + toDrawView.draw(c);*/ + + } + + @Override + public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { + super.getItemOffsets(outRect, view, parent, state); + int position = ((RecyclerView.LayoutParams) view.getLayoutParams()).getViewLayoutPosition(); + //我记得Rv的item position在重置时可能为-1.保险点判断一下吧 + if (position > -1) { + if (position == 0) {//等于0肯定要有title的 + outRect.set(0, mTitleHeight, 0, 0); + } else {//其他的通过判断 + if (null != mDatas.get(position).title && !mDatas.get(position).title.equals(mDatas.get(position - 1).title)) { + outRect.set(0, mTitleHeight, 0, 0);//不为空 且跟前一个tag不一样了,说明是新的分类,也要title + } else { + outRect.set(0, 0, 0, 0); + } + } + } + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/rvhelper/section/Section.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/rvhelper/section/Section.java new file mode 100644 index 0000000000000000000000000000000000000000..70dfb5d3a0416e9f086cb4fd85f04fd4b2684b4e --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/rvhelper/section/Section.java @@ -0,0 +1,311 @@ +package com.jiuqi.elove.widget.rvhelper.section; + +import android.content.Context; +import android.view.View; + +import com.jiuqi.elove.widget.rvhelper.base.ViewHolder; + +/** + * Abstract Section used by SectionRVAdapter. + */ +public abstract class Section { + + public enum State { LOADING, LOADED, FAILED} + + private State state = State.LOADED; + + boolean visible = true; + + boolean hasHeader = false; + boolean hasFooter = false; + + Integer headerResourceId; + Integer footerResourceId; + + int itemResourceId; + + private Integer loadingResourceId; + private Integer failedResourceId; + + /** + * Package-level constructor + */ + Section() { + + } + + /** + * Create a Section object with loading/failed states but no header and footer + * @param itemResourceId layout resource for its items + * @param loadingResourceId layout resource for its loading state + * @param failedResourceId layout resource for its failed state + */ + public Section(int itemResourceId, int loadingResourceId, int failedResourceId) { + this.itemResourceId = itemResourceId; + this.loadingResourceId = loadingResourceId; + this.failedResourceId = failedResourceId; + } + + /** + * Create a Section object with loading/failed states, a custom header but no footer + * @param headerResourceId layout resource for its header + * @param itemResourceId layout resource for its items + * @param loadingResourceId layout resource for its loading state + * @param failedResourceId layout resource for its failed state + */ + public Section(int headerResourceId, int itemResourceId, int loadingResourceId, int failedResourceId) { + this(itemResourceId, loadingResourceId, failedResourceId); + this.headerResourceId = headerResourceId; + hasHeader = true; + } + + /** + * Create a Section object with loading/failed states, a custom header and footer + * @param headerResourceId layout resource for its header + * @param footerResourceId layout resource for its footer + * @param itemResourceId layout resource for its items + * @param loadingResourceId layout resource for its loading state + * @param failedResourceId layout resource for its failed state + */ + public Section(int headerResourceId, int footerResourceId, int itemResourceId, int loadingResourceId, int failedResourceId) { + this(headerResourceId, itemResourceId, loadingResourceId, failedResourceId); + this.footerResourceId = footerResourceId; + hasFooter = true; + } + + /** + * Set the State of this Section + * @param state state of this section + */ + public final void setState(State state) { + this.state = state; + } + + /** + * Return the current State of this Section + * @return current state of this section + */ + public final State getState() { + return state; + } + + /** + * Check if this Section is visible + * @return true if this Section is vibisle + */ + public final boolean isVisible() { + return visible; + } + + /** + * Set if this Section is visible + * @param visible true if this Section is visible + */ + public final void setVisible(boolean visible) { + this.visible = visible; + } + + /** + * Check if this Section has a header + * @return true if this Section has a header + */ + public final boolean hasHeader() { + return hasHeader; + } + + /** + * Set if this Section has header + * @param hasHeader true if this Section has a header + */ + public final void setHasHeader(boolean hasHeader) { + this.hasHeader = hasHeader; + } + + /** + * Check if this Section has a footer + * @return true if this Section has a footer + */ + public final boolean hasFooter() { + return hasFooter; + } + + /** + * Set if this Section has footer + * @param hasFooter true if this Section has a footer + */ + public final void setHasFooter(boolean hasFooter) { + this.hasFooter = hasFooter; + } + + /** + * Return the layout resource id of the header + * @return layout resource id of the header + */ + public final Integer getHeaderResourceId() { + return headerResourceId; + } + + /** + * Return the layout resource id of the footer + * @return layout resource id of the footer + */ + public final Integer getFooterResourceId() { + return footerResourceId; + } + + /** + * Return the layout resource id of the item + * @return layout resource id of the item + */ + public final int getItemResourceId() { + return itemResourceId; + } + + /** + * Return the layout resource id of the loading view + * @return layout resource id of the loading view + */ + public final Integer getLoadingResourceId() { + return loadingResourceId; + } + + /** + * Return the layout resource id of the failed view + * @return layout resource id of the failed view + */ + public final Integer getFailedResourceId() { + return failedResourceId; + } + + /** + * Bind the data to the ViewHolder for the Content of this Section, that can be the Items, + * Loading view or Failed view, depending on the current state of the section + * @param holder ViewHolder for the Content of this Section + * @param position position of the item in the Section, not in the RecyclerView + */ + public final void onBindContentViewHolder(ViewHolder holder, int position) { + switch (state) { + case LOADING: + onBindLoadingViewHolder(holder); + break; + case LOADED: + onBindItemViewHolder(holder, position); + break; + case FAILED: + onBindFailedViewHolder(holder); + break; + default: + throw new IllegalStateException("Invalid state"); + } + } + + /** + * Return the total of items of this Section, including content items (according to the section + * state) plus header and footer + * @return total of items of this section + */ + public final int getSectionItemsTotal() { + int contentItemsTotal; + + switch (state) { + case LOADING: + contentItemsTotal = 1; + break; + case LOADED: + contentItemsTotal = getContentItemsTotal(); + break; + case FAILED: + contentItemsTotal = 1; + break; + default: + throw new IllegalStateException("Invalid state"); + } + + return contentItemsTotal + (hasHeader? 1 : 0) + (hasFooter? 1 : 0); + } + + /** + * Return the total of items of this Section + * @return total of items of this Section + */ + public abstract int getContentItemsTotal(); + + /** + * Return the ViewHolder for the Header of this Section + * @param view View inflated by resource returned by getHeaderResourceId + * @return ViewHolder for the Header of this Section + */ + public ViewHolder getHeaderViewHolder(Context context, View view) { + return new SectionRVAdapter.EmptyViewHolder(context,view); + } + + /** + * Bind the data to the ViewHolder for the Header of this Section + * @param holder ViewHolder for the Header of this Section + */ + public void onBindHeaderViewHolder(ViewHolder holder) { + // Nothing to bind here. + } + + /** + * Return the ViewHolder for the Footer of this Section + * @param view View inflated by resource returned by getFooterResourceId + * @return ViewHolder for the Footer of this Section + */ + public ViewHolder getFooterViewHolder(Context context, View view) { + return new SectionRVAdapter.EmptyViewHolder(context,view); + } + + /** + * Bind the data to the ViewHolder for the Footer of this Section + * @param holder ViewHolder for the Footer of this Section + */ + public void onBindFooterViewHolder(ViewHolder holder) { + // Nothing to bind here. + } + + /** + * Return the ViewHolder for a single Item of this Section + * @param view View inflated by resource returned by getItemResourceId + * @return ViewHolder for the Item of this Section + */ + public abstract ViewHolder getItemViewHolder(View view, int viewType); + /** + * Bind the data to the ViewHolder for an Item of this Section + * @param holder ViewHolder for the Item of this Section + * @param position position of the item in the Section, not in the RecyclerView + */ + public abstract void onBindItemViewHolder(ViewHolder holder, int position); + + /** + * Return the ViewHolder for the Loading state of this Section + * @param view View inflated by resource returned by getItemResourceId + * @return ViewHolder for the Loading state of this Section + */ + public ViewHolder getLoadingViewHolder(Context context, View view) { + return new SectionRVAdapter.EmptyViewHolder(context,view); + } + /** + * Bind the data to the ViewHolder for Loading state of this Section + * @param holder ViewHolder for the Loading state of this Section + */ + public void onBindLoadingViewHolder(ViewHolder holder) { + // Nothing to bind here. + } + + /** + * Return the ViewHolder for the Failed state of this Section + * @param view View inflated by resource returned by getItemResourceId + * @return ViewHolder for the Failed of this Section + */ + public ViewHolder getFailedViewHolder(Context context, View view) { + return new SectionRVAdapter.EmptyViewHolder(context,view); + } + /** + * Bind the data to the ViewHolder for the Failed state of this Section + * @param holder ViewHolder for the Failed state of this Section + */ + public void onBindFailedViewHolder(ViewHolder holder) { + // Nothing to bind here. + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/rvhelper/section/SectionRVAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/rvhelper/section/SectionRVAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..887974be94a330dd3a43db9ccc00ed91e33ab8ba --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/rvhelper/section/SectionRVAdapter.java @@ -0,0 +1,381 @@ +package com.jiuqi.elove.widget.rvhelper.section; + +import android.content.Context; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.jiuqi.elove.widget.rvhelper.base.ViewHolder; + +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.UUID; + + +/** + * Created by Anthony on 2016/8/17. + * Class Note: + * A custom RecyclerView with Sections with custom Titles. + * Sections are displayed in the same order they were added. + * + * item view can only be one type!!!! + */ +public class SectionRVAdapter extends RecyclerView.Adapter { + public final static int VIEW_TYPE_HEADER = 0; + public final static int VIEW_TYPE_FOOTER = 1; + public final static int VIEW_TYPE_ITEM_LOADED = 2; + public final static int VIEW_TYPE_LOADING = 3; + public final static int VIEW_TYPE_FAILED = 4; + + private LinkedHashMap sections; + private HashMap sectionViewTypeNumbers; + private int viewTypeCount = 0; + private final static int VIEW_TYPE_QTY = 5; + private Context mContext; + + public SectionRVAdapter(Context context) { + this.mContext = context; + sections = new LinkedHashMap<>(); + sectionViewTypeNumbers = new HashMap<>(); + } + + + @Override + public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + ViewHolder viewHolder = null; + View view = null; + + for (Map.Entry entry : sectionViewTypeNumbers.entrySet()) { + if (viewType >= entry.getValue() && viewType < entry.getValue() + VIEW_TYPE_QTY) { + + Section section = sections.get(entry.getKey()); + int sectionViewType = viewType - entry.getValue(); + + switch (sectionViewType) { + case VIEW_TYPE_HEADER: { + Integer resId = section.getHeaderResourceId(); + + if (resId == null) + throw new NullPointerException("Missing 'header' resource id"); + + view = LayoutInflater.from(parent.getContext()).inflate(resId, parent, false); + // get the header viewholder from the section + viewHolder = section.getHeaderViewHolder(mContext,view); + break; + } + case VIEW_TYPE_FOOTER: { + Integer resId = section.getFooterResourceId(); + + if (resId == null) + throw new NullPointerException("Missing 'footer' resource id"); + + view = LayoutInflater.from(parent.getContext()).inflate(resId, parent, false); + // get the footer viewholder from the section + viewHolder = section.getFooterViewHolder(mContext,view); + break; + } + case VIEW_TYPE_ITEM_LOADED: { + view = LayoutInflater.from(parent.getContext()).inflate(section.getItemResourceId(), parent, false); + // get the item viewholder from the section + viewHolder = section.getItemViewHolder(view,viewType); + break; + } + case VIEW_TYPE_LOADING: { + Integer resId = section.getLoadingResourceId(); + + if (resId == null) + throw new NullPointerException("Missing 'loading state' resource id"); + + view = LayoutInflater.from(parent.getContext()).inflate(resId, parent, false); + // get the loading viewholder from the section + viewHolder = section.getLoadingViewHolder(mContext,view); + break; + } + case VIEW_TYPE_FAILED: { + Integer resId = section.getFailedResourceId(); + + if (resId == null) + throw new NullPointerException("Missing 'failed state' resource id"); + + view = LayoutInflater.from(parent.getContext()).inflate(resId, parent, false); + // get the failed load viewholder from the section + viewHolder = section.getFailedViewHolder(mContext,view); + break; + } + default: + throw new IllegalArgumentException("Invalid viewType"); + } + } + } + + return viewHolder; + } + + + /** + * Add a section to this recyclerview. + * + * @param tag unique identifier of the section + * @param section section to be added + */ + public void addSection(String tag, Section section) { + this.sections.put(tag, section); + this.sectionViewTypeNumbers.put(tag, viewTypeCount); + viewTypeCount += VIEW_TYPE_QTY; + } + + /** + * Add a section to this recyclerview with a random tag; + * + * @param section section to be added + * @return generated tag + */ + public String addSection(Section section) { + String tag = UUID.randomUUID().toString(); + + addSection(tag, section); + + return tag; + } + + /** + * Return the section with the tag provided + * + * @param tag unique identifier of the section + * @return section + */ + public Section getSection(String tag) { + return this.sections.get(tag); + } + + /** + * Remove section from this recyclerview. + * + * @param tag unique identifier of the section + */ + public void removeSection(String tag) { + this.sections.remove(tag); + } + + /** + * Remove all sections from this recyclerview. + */ + public void removeAllSections() { + this.sections.clear(); + } + + @Override + public void onBindViewHolder(ViewHolder holder, int position) { + + int currentPos = 0; + + for (Map.Entry entry : sections.entrySet()) { + Section section = entry.getValue(); + + // ignore invisible sections + if (!section.isVisible()) continue; + + int sectionTotal = section.getSectionItemsTotal(); + + // check if position is in this section + if (position >= currentPos && position <= (currentPos + sectionTotal - 1)) { + + if (section.hasHeader()) { + if (position == currentPos) { + // delegate the binding to the section header + getSectionForPosition(position).onBindHeaderViewHolder(holder); + return; + } + } + + if (section.hasFooter()) { + if (position == (currentPos + sectionTotal - 1)) { + // delegate the binding to the section header + getSectionForPosition(position).onBindFooterViewHolder(holder); + return; + } + } + + // delegate the binding to the section content + getSectionForPosition(position).onBindContentViewHolder(holder, getSectionPosition(position)); + return; + } + + currentPos += sectionTotal; + } + + throw new IndexOutOfBoundsException("Invalid position"); + } + + + @Override + public int getItemCount() { + int count = 0; + + for (Map.Entry entry : sections.entrySet()) { + Section section = entry.getValue(); + + // ignore invisible sections + if (!section.isVisible()) continue; + + count += section.getSectionItemsTotal(); + } + + return count; + } + + + @Override + public int getItemViewType(int position) { + /* + Each Section has 5 "viewtypes": + 1) header + 2) footer + 3) items + 4) loading + 5) load failed + */ + int currentPos = 0; + + for (Map.Entry entry : sections.entrySet()) { + Section section = entry.getValue(); + + // ignore invisible sections + if (!section.isVisible()) continue; + + int sectionTotal = section.getSectionItemsTotal(); + + // check if position is in this section + if (position >= currentPos && position <= (currentPos + sectionTotal - 1)) { + + int viewType = sectionViewTypeNumbers.get(entry.getKey()); + + if (section.hasHeader()) { + if (position == currentPos) { + return viewType; + } + } + + if (section.hasFooter()) { + if (position == (currentPos + sectionTotal - 1)) { + return viewType + 1; + } + } + + switch (section.getState()) { + case LOADED: + return viewType + 2; + case LOADING: + return viewType + 3; + case FAILED: + return viewType + 4; + default: + throw new IllegalStateException("Invalid state"); + } + + } + + currentPos += sectionTotal; + } + + throw new IndexOutOfBoundsException("Invalid position"); + } + + + /** + * Returns the Section ViewType of an item based on the position in the adapter: + * - SectionedRecyclerViewAdapter.VIEW_TYPE_HEADER + * - SectionedRecyclerViewAdapter.VIEW_TYPE_FOOTER + * - SectionedRecyclerViewAdapter.VIEW_TYPE_ITEM_LOADED + * - SectionedRecyclerViewAdapter.VIEW_TYPE_LOADING + * - SectionedRecyclerViewAdapter.VIEW_TYPE_FAILED + * + * @param position position in the adapter + * @return SectionedRecyclerViewAdapter.VIEW_TYPE_HEADER, VIEW_TYPE_FOOTER, + * VIEW_TYPE_ITEM_LOADED, VIEW_TYPE_LOADING or VIEW_TYPE_FAILED + */ + public int getSectionItemViewType(int position) { + int viewType = getItemViewType(position); + + return viewType % VIEW_TYPE_QTY; + } + + /** + * Returns the Section object for a position in the adapter + * + * @param position position in the adapter + * @return Section object for that position + */ + public Section getSectionForPosition(int position) { + + int currentPos = 0; + + for (Map.Entry entry : sections.entrySet()) { + Section section = entry.getValue(); + + // ignore invisible sections + if (!section.isVisible()) continue; + + int sectionTotal = section.getSectionItemsTotal(); + + // check if position is in this section + if (position >= currentPos && position <= (currentPos + sectionTotal - 1)) { + return section; + } + + currentPos += sectionTotal; + } + + throw new IndexOutOfBoundsException("Invalid position"); + } + + /** + * Return the item position relative to the section. + * + * @param position position of the item in the adapter + * @return position of the item in the section + */ + public int getSectionPosition(int position) { + int currentPos = 0; + + for (Map.Entry entry : sections.entrySet()) { + Section section = entry.getValue(); + + // ignore invisible sections + if (!section.isVisible()) continue; + + int sectionTotal = section.getSectionItemsTotal(); + + // check if position is in this section + if (position >= currentPos && position <= (currentPos + sectionTotal - 1)) { + return position - currentPos - (section.hasHeader() ? 1 : 0); + } + + currentPos += sectionTotal; + } + + throw new IndexOutOfBoundsException("Invalid position"); + } + + /** + * Return a map with all sections of this adapter + * + * @return a map with all sections + */ + public LinkedHashMap getSectionsMap() { + return sections; + } + + /** + * A concrete class of an empty ViewHolder. + * Should be used to avoid the boilerplate of creating a ViewHolder class for simple case + * scenarios. + */ + public static class EmptyViewHolder extends ViewHolder { + public EmptyViewHolder(Context context, View itemView) { + super(context, itemView); + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/rvhelper/section/StatelessSection.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/rvhelper/section/StatelessSection.java new file mode 100644 index 0000000000000000000000000000000000000000..a2904f21877ac32189f2243d031ae1d2facb4e77 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/rvhelper/section/StatelessSection.java @@ -0,0 +1,64 @@ +package com.jiuqi.elove.widget.rvhelper.section; + +import android.content.Context; +import android.view.View; + +import com.jiuqi.elove.widget.rvhelper.base.ViewHolder; + +/** + * Abstract Section with no States. + */ +public abstract class StatelessSection extends Section { + + /** + * Create a Section object with loading/failed states but no header and footer + * @param itemResourceId layout resource for its items + */ + public StatelessSection(int itemResourceId) { + super(); + this.itemResourceId = itemResourceId; + } + + /** + * Create a Section object with loading/failed states, a custom header but no footer + * @param headerResourceId layout resource for its header + * @param itemResourceId layout resource for its items + */ + public StatelessSection(int headerResourceId, int itemResourceId) { + this(itemResourceId); + this.headerResourceId = headerResourceId; + this.hasHeader = true; + } + + /** + * Create a Section object with loading/failed states, a custom header and footer + * @param headerResourceId layout resource for its header + * @param footerResourceId layout resource for its footer + * @param itemResourceId layout resource for its items + */ + public StatelessSection(int headerResourceId, int footerResourceId, int itemResourceId) { + this(headerResourceId, itemResourceId); + this.footerResourceId = footerResourceId; + this.hasFooter = true; + } + + @Override + public final void onBindLoadingViewHolder(ViewHolder holder) { + super.onBindLoadingViewHolder(holder); + } + + @Override + public final ViewHolder getLoadingViewHolder(Context context, View view) { + return super.getLoadingViewHolder(context,view); + } + + @Override + public final void onBindFailedViewHolder(ViewHolder holder) { + super.onBindFailedViewHolder(holder); + } + + @Override + public final ViewHolder getFailedViewHolder(Context context, View view) { + return super.getFailedViewHolder(context,view); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/rvhelper/utils/WrapperUtils.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/rvhelper/utils/WrapperUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..9afe59fe682689880fd6622ab5568ec4a27b41ba --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/rvhelper/utils/WrapperUtils.java @@ -0,0 +1,53 @@ +package com.jiuqi.elove.widget.rvhelper.utils; + +import android.support.v7.widget.GridLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.StaggeredGridLayoutManager; +import android.view.ViewGroup; + +/** + * Created by zhy on 16/6/28 + */ +public class WrapperUtils +{ + public interface SpanSizeCallback + { + int getSpanSize(GridLayoutManager layoutManager, GridLayoutManager.SpanSizeLookup oldLookup, int position); + } + + public static void onAttachedToRecyclerView(RecyclerView.Adapter innerAdapter, RecyclerView recyclerView, final SpanSizeCallback callback) + { + innerAdapter.onAttachedToRecyclerView(recyclerView); + + RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager(); + if (layoutManager instanceof GridLayoutManager) + { + final GridLayoutManager gridLayoutManager = (GridLayoutManager) layoutManager; + final GridLayoutManager.SpanSizeLookup spanSizeLookup = gridLayoutManager.getSpanSizeLookup(); + + gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() + { + @Override + public int getSpanSize(int position) + { + return callback.getSpanSize(gridLayoutManager, spanSizeLookup, position); + } + }); + gridLayoutManager.setSpanCount(gridLayoutManager.getSpanCount()); + } + } + + public static void setFullSpan(RecyclerView.ViewHolder holder) + { + ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams(); + + if (lp != null + && lp instanceof StaggeredGridLayoutManager.LayoutParams) + { + + StaggeredGridLayoutManager.LayoutParams p = (StaggeredGridLayoutManager.LayoutParams) lp; + + p.setFullSpan(true); + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/rvhelper/wrapper/EmptyWrapper.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/rvhelper/wrapper/EmptyWrapper.java new file mode 100644 index 0000000000000000000000000000000000000000..23341b69a3a5f4baed5d044988659c855331e70a --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/rvhelper/wrapper/EmptyWrapper.java @@ -0,0 +1,124 @@ +package com.jiuqi.elove.widget.rvhelper.wrapper; + +import android.support.v7.widget.GridLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.View; +import android.view.ViewGroup; + +import com.jiuqi.elove.widget.rvhelper.base.ViewHolder; +import com.jiuqi.elove.widget.rvhelper.utils.WrapperUtils; + + +/** + * Created by zhy on 16/6/23 + */ +public class EmptyWrapper extends RecyclerView.Adapter +{ + public static final int ITEM_TYPE_EMPTY = Integer.MAX_VALUE - 1; + + private RecyclerView.Adapter mInnerAdapter; + private View mEmptyView; + private int mEmptyLayoutId; + + + public EmptyWrapper(RecyclerView.Adapter adapter) + { + mInnerAdapter = adapter; + } + + private boolean isEmpty() + { + return (mEmptyView != null || mEmptyLayoutId != 0) && mInnerAdapter.getItemCount() == 0; + } + + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) + { + if (isEmpty()) + { + ViewHolder holder; + if (mEmptyView != null) + { + holder = ViewHolder.createViewHolder(parent.getContext(), mEmptyView); + } else + { + holder = ViewHolder.createViewHolder(parent.getContext(), parent, mEmptyLayoutId); + } + return holder; + } + return mInnerAdapter.onCreateViewHolder(parent, viewType); + } + + @Override + public void onAttachedToRecyclerView(RecyclerView recyclerView) + { + WrapperUtils.onAttachedToRecyclerView(mInnerAdapter, recyclerView, new WrapperUtils.SpanSizeCallback() + { + @Override + public int getSpanSize(GridLayoutManager gridLayoutManager, GridLayoutManager.SpanSizeLookup oldLookup, int position) + { + if (isEmpty()) + { + return gridLayoutManager.getSpanCount(); + } + if (oldLookup != null) + { + return oldLookup.getSpanSize(position); + } + return 1; + } + }); + + + } + + @Override + public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) + { + mInnerAdapter.onViewAttachedToWindow(holder); + if (isEmpty()) + { + WrapperUtils.setFullSpan(holder); + } + } + + + @Override + public int getItemViewType(int position) + { + if (isEmpty()) + { + return ITEM_TYPE_EMPTY; + } + return mInnerAdapter.getItemViewType(position); + } + + @Override + public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) + { + if (isEmpty()) + { + return; + } + mInnerAdapter.onBindViewHolder(holder, position); + } + + @Override + public int getItemCount() + { + if (isEmpty()) return 1; + return mInnerAdapter.getItemCount(); + } + + public void setEmptyView(View emptyView) + { + mEmptyView = emptyView; + } + + public void setEmptyView(int layoutId) + { + mEmptyLayoutId = layoutId; + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/rvhelper/wrapper/HeaderAndFooterWrapper.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/rvhelper/wrapper/HeaderAndFooterWrapper.java new file mode 100644 index 0000000000000000000000000000000000000000..1b7f93bb3b0d1b7ceaf24df301f88eddac1b69d2 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/rvhelper/wrapper/HeaderAndFooterWrapper.java @@ -0,0 +1,210 @@ +package com.jiuqi.elove.widget.rvhelper.wrapper; + +import android.support.v4.util.SparseArrayCompat; +import android.support.v7.widget.GridLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.View; +import android.view.ViewGroup; + +import com.jiuqi.elove.widget.rvhelper.adapter.MultiItemTypeAdapter; +import com.jiuqi.elove.widget.rvhelper.base.ViewHolder; +import com.jiuqi.elove.widget.rvhelper.utils.WrapperUtils; + + +/** + * Created by zhy on 16/6/23 + */ +public class HeaderAndFooterWrapper extends RecyclerView.Adapter +{ + private static final int BASE_ITEM_TYPE_HEADER = 100000; + private static final int BASE_ITEM_TYPE_FOOTER = 200000; + + private SparseArrayCompat mHeaderViews = new SparseArrayCompat<>(); + private SparseArrayCompat mFootViews = new SparseArrayCompat<>(); + + private RecyclerView.Adapter mInnerAdapter; + private RecyclerView.Adapter mNotifyAdapter; + + public HeaderAndFooterWrapper(RecyclerView.Adapter adapter) + { + mInnerAdapter = adapter; + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) + { + if (mHeaderViews.get(viewType) != null) + { + ViewHolder holder = ViewHolder.createViewHolder(parent.getContext(), mHeaderViews.get(viewType)); + return holder; + + } else if (mFootViews.get(viewType) != null) + { + ViewHolder holder = ViewHolder.createViewHolder(parent.getContext(), mFootViews.get(viewType)); + return holder; + } + return mInnerAdapter.onCreateViewHolder(parent, viewType); + } + + @Override + public int getItemViewType(int position) + { + if (isHeaderViewPos(position)) + { + return mHeaderViews.keyAt(position); + } else if (isFooterViewPos(position)) + { + return mFootViews.keyAt(position - getHeadersCount() - getRealItemCount()); + } + return mInnerAdapter.getItemViewType(position - getHeadersCount()); + } + + private int getRealItemCount() + { + return mInnerAdapter.getItemCount(); + } + + + @Override + public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) + { + if (isHeaderViewPos(position)) + { + return; + } + if (isFooterViewPos(position)) + { + return; + } + mInnerAdapter.onBindViewHolder(holder, position - getHeadersCount()); + } + + @Override + public int getItemCount() + { + return getHeadersCount() + getFootersCount() + getRealItemCount(); + } + + @Override + public void onAttachedToRecyclerView(RecyclerView recyclerView) + { + mNotifyAdapter = recyclerView.getAdapter(); + WrapperUtils.onAttachedToRecyclerView(mInnerAdapter, recyclerView, new WrapperUtils.SpanSizeCallback() + { + @Override + public int getSpanSize(GridLayoutManager layoutManager, GridLayoutManager.SpanSizeLookup oldLookup, int position) + { + int viewType = getItemViewType(position); + if (mHeaderViews.get(viewType) != null) + { + return layoutManager.getSpanCount(); + } else if (mFootViews.get(viewType) != null) + { + return layoutManager.getSpanCount(); + } + if (oldLookup != null) + return oldLookup.getSpanSize(position); + return 1; + } + }); + } + + @Override + public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) + { + mInnerAdapter.onViewAttachedToWindow(holder); + int position = holder.getLayoutPosition(); + if (isHeaderViewPos(position) || isFooterViewPos(position)) + { + WrapperUtils.setFullSpan(holder); + } + } + + private boolean isHeaderViewPos(int position) + { + return position < getHeadersCount(); + } + + private boolean isFooterViewPos(int position) + { + return position >= getHeadersCount() + getRealItemCount(); + } + + public void addHeaderView(View view) + { + int key = findHeaderKeyByView(view); + if (key == -1) { + mHeaderViews.put(mHeaderViews.size() + BASE_ITEM_TYPE_HEADER, view); + if (mNotifyAdapter != null) + mNotifyAdapter.notifyDataSetChanged(); + + if (mInnerAdapter instanceof MultiItemTypeAdapter) { + ((MultiItemTypeAdapter) mInnerAdapter).offset += 1; + } + } + } + + public void addFootView(View view) + { + mFootViews.put(mFootViews.size() + BASE_ITEM_TYPE_FOOTER, view); + } + + public int getHeadersCount() + { + return mHeaderViews.size(); + } + + public int getFootersCount() + { + return mFootViews.size(); + } + + public void deleteHeaderView(View view) + { +// if (mHeaderViews.size() > position && position >=0 ) { +// View v = mHeaderViews.get(position + BASE_ITEM_TYPE_HEADER, null); +// if (v != null) { +// mHeaderViews.remove(position + BASE_ITEM_TYPE_HEADER); +// if (mInnerAdapter instanceof MultiItemTypeAdapter) { +// ((MultiItemTypeAdapter) mInnerAdapter).offset -= 1; +// } +// if (mNotifyAdapter != null) +// mNotifyAdapter.notifyDataSetChanged(); +// } +// } + +// for(int i=0; i extends RecyclerView.Adapter +{ + public static final int ITEM_TYPE_LOAD_MORE = Integer.MAX_VALUE - 2; + + private RecyclerView.Adapter mInnerAdapter; + private View mLoadMoreView; + private int mLoadMoreLayoutId; + + public LoadMoreWrapper(RecyclerView.Adapter adapter) + { + mInnerAdapter = adapter; + } + + private boolean hasLoadMore() + { + return mLoadMoreView != null || mLoadMoreLayoutId != 0; + } + + + private boolean isShowLoadMore(int position) + { + return hasLoadMore() && (position >= mInnerAdapter.getItemCount()); + } + + @Override + public int getItemViewType(int position) + { + if (isShowLoadMore(position)) + { + return ITEM_TYPE_LOAD_MORE; + } + return mInnerAdapter.getItemViewType(position); + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) + { + if (viewType == ITEM_TYPE_LOAD_MORE) + { + ViewHolder holder; + if (mLoadMoreView != null) + { + holder = ViewHolder.createViewHolder(parent.getContext(), mLoadMoreView); + } else + { + holder = ViewHolder.createViewHolder(parent.getContext(), parent, mLoadMoreLayoutId); + } + return holder; + } + return mInnerAdapter.onCreateViewHolder(parent, viewType); + } + + @Override + public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) + { + if (isShowLoadMore(position)) + { + if (mOnLoadMoreListener != null) + { + mOnLoadMoreListener.onLoadMoreRequested(); + } + return; + } + mInnerAdapter.onBindViewHolder(holder, position); + } + + @Override + public void onAttachedToRecyclerView(RecyclerView recyclerView) + { + WrapperUtils.onAttachedToRecyclerView(mInnerAdapter, recyclerView, new WrapperUtils.SpanSizeCallback() + { + @Override + public int getSpanSize(GridLayoutManager layoutManager, GridLayoutManager.SpanSizeLookup oldLookup, int position) + { + if (isShowLoadMore(position)) + { + return layoutManager.getSpanCount(); + } + if (oldLookup != null) + { + return oldLookup.getSpanSize(position); + } + return 1; + } + }); + } + + + @Override + public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) + { + mInnerAdapter.onViewAttachedToWindow(holder); + + if (isShowLoadMore(holder.getLayoutPosition())) + { + setFullSpan(holder); + } + } + + private void setFullSpan(RecyclerView.ViewHolder holder) + { + ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams(); + + if (lp != null + && lp instanceof StaggeredGridLayoutManager.LayoutParams) + { + StaggeredGridLayoutManager.LayoutParams p = (StaggeredGridLayoutManager.LayoutParams) lp; + + p.setFullSpan(true); + } + } + + @Override + public int getItemCount() + { + return mInnerAdapter.getItemCount() + (hasLoadMore() ? 1 : 0); + } + + + public interface OnLoadMoreListener + { + void onLoadMoreRequested(); + } + + private OnLoadMoreListener mOnLoadMoreListener; + + public LoadMoreWrapper setOnLoadMoreListener(OnLoadMoreListener loadMoreListener) + { + if (loadMoreListener != null) + { + mOnLoadMoreListener = loadMoreListener; + } + return this; + } + + public LoadMoreWrapper setLoadMoreView(View loadMoreView) + { + mLoadMoreView = loadMoreView; + return this; + } + + public LoadMoreWrapper setLoadMoreView(int layoutId) + { + mLoadMoreLayoutId = layoutId; + return this; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/slide_card/DiscreteScrollItemTransformer.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/slide_card/DiscreteScrollItemTransformer.java new file mode 100644 index 0000000000000000000000000000000000000000..6291eda0d0b4ab96f6a60c395c122f67b3cfe98a --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/slide_card/DiscreteScrollItemTransformer.java @@ -0,0 +1,11 @@ +package com.jiuqi.elove.widget.slide_card; + +import android.view.View; + +/** + * Created by yarolegovich on 02.03.2017. + */ + +public interface DiscreteScrollItemTransformer { + void transformItem(View item, float position); +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/slide_card/DiscreteScrollLayoutManager.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/slide_card/DiscreteScrollLayoutManager.java new file mode 100644 index 0000000000000000000000000000000000000000..3fefce90116ceb5d3e6ebdc08fc34f38e9fd7ab8 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/slide_card/DiscreteScrollLayoutManager.java @@ -0,0 +1,570 @@ +package com.jiuqi.elove.widget.slide_card; + +import android.content.Context; +import android.graphics.PointF; +import android.os.Bundle; +import android.os.Parcelable; +import android.support.annotation.IntDef; +import android.support.annotation.Nullable; +import android.support.v4.view.accessibility.AccessibilityEventCompat; +import android.support.v4.view.accessibility.AccessibilityRecordCompat; +import android.support.v7.widget.LinearSmoothScroller; +import android.support.v7.widget.RecyclerView; +import android.util.SparseArray; +import android.view.View; +import android.view.ViewGroup; +import android.view.accessibility.AccessibilityEvent; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * Created by yarolegovich on 17.02.2017. + */ +class DiscreteScrollLayoutManager extends RecyclerView.LayoutManager { + + private static final String EXTRA_POSITION = "extra_position"; + + private static final int DIRECTION_START = -1; + private static final int DIRECTION_END = 1; + private static final int NO_POSITION = -1; + private static final int DEFAULT_TIME_FOR_ITEM_SETTLE = 150; + + private int childViewWidth; + private int childHalfWidth, childHalfHeight; + private int recyclerCenterX, recyclerCenterY; + + private int currentScrollState; + private int scrollToChangeTheCurrent; + + private int scrolled; + private int pendingScroll; + private int currentPosition; + private int pendingPosition; + + private Context context; + + private int timeForItemSettle; + + private SparseArray detachedCache; + + private DiscreteScrollItemTransformer itemTransformer; + private ScrollStateListener scrollStateListener; + + public DiscreteScrollLayoutManager(Context c) { + this.context = c; + this.timeForItemSettle = DEFAULT_TIME_FOR_ITEM_SETTLE; + this.pendingPosition = NO_POSITION; + this.currentPosition = NO_POSITION; + this.detachedCache = new SparseArray<>(); + setAutoMeasureEnabled(true); + } + + @Override + public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) { + if (state.getItemCount() == 0) { + removeAndRecycleAllViews(recycler); + currentPosition = pendingPosition = NO_POSITION; + scrolled = pendingScroll = 0; + return; + } + + boolean isFirstOrEmptyLayout = getChildCount() == 0; + if (isFirstOrEmptyLayout) { + initChildDimensions(recycler); + } + + updateRecyclerDimensions(); + + detachAndScrapAttachedViews(recycler); + + fill(recycler); + + applyItemTransformToChildren(); + + if (isFirstOrEmptyLayout) { + notifyFirstLayoutCompleted(); + } + } + + private void initChildDimensions(RecyclerView.Recycler recycler) { + View viewToMeasure = recycler.getViewForPosition(0); + addView(viewToMeasure); + measureChildWithMargins(viewToMeasure, 0, 0); + + childViewWidth = getDecoratedMeasuredWidth(viewToMeasure); + childHalfWidth = childViewWidth / 2; + childHalfHeight = getDecoratedMeasuredHeight(viewToMeasure) / 2; + + //This is the distance between adjacent view's x-center coordinates + scrollToChangeTheCurrent = childViewWidth; + + detachAndScrapView(viewToMeasure, recycler); + } + + private void updateRecyclerDimensions() { + recyclerCenterX = getWidth() / 2; + recyclerCenterY = getHeight() / 2; + } + + private void fill(RecyclerView.Recycler recycler) { + cacheAndDetachAttachedViews(); + + final int currentViewCenterX = recyclerCenterX - scrolled; + final int childTop = recyclerCenterY - childHalfHeight; + final int childBottom = recyclerCenterY + childHalfHeight; + + //Layout current + layoutView(recycler, currentPosition, + currentViewCenterX - childHalfWidth, childTop, + currentViewCenterX + childHalfWidth, childBottom); + + int position; + + //Layout items to the left of the current item + int viewRight = currentViewCenterX - childHalfWidth; + position = currentPosition - 1; + while (position >= 0 && viewRight > 0) { + layoutView(recycler, position, + viewRight - childViewWidth, childTop, + viewRight, childBottom); + viewRight -= childViewWidth; + position--; + } + + //Layout items to the right of the current item + int viewLeft = currentViewCenterX + childHalfWidth; + position = currentPosition + 1; + while (position < getItemCount() && viewLeft < getWidth()) { + layoutView(recycler, position, + viewLeft, childTop, + viewLeft + childViewWidth, childBottom); + viewLeft += childViewWidth; + position++; + } + + recycleViewsAndClearCache(recycler); + } + + private void layoutView(RecyclerView.Recycler recycler, int position, int l, int t, int r, int b) { + View v = detachedCache.get(position); + if (v == null) { + v = recycler.getViewForPosition(position); + addView(v); + measureChildWithMargins(v, 0, 0); + layoutDecoratedWithMargins(v, l, t, r, b); + } else { + attachView(v); + detachedCache.remove(position); + } + } + + private void cacheAndDetachAttachedViews() { + detachedCache.clear(); + for (int i = 0; i < getChildCount(); i++) { + View child = getChildAt(i); + detachedCache.put(getPosition(child), child); + } + + for (int i = 0; i < detachedCache.size(); i++) { + detachView(detachedCache.valueAt(i)); + } + } + + private void recycleViewsAndClearCache(RecyclerView.Recycler recycler) { + for (int i = 0; i < detachedCache.size(); i++) { + recycler.recycleView(detachedCache.valueAt(i)); + } + detachedCache.clear(); + } + + @Override + public void onItemsAdded(RecyclerView recyclerView, int positionStart, int itemCount) { + if (currentPosition == NO_POSITION) { + currentPosition = 0; + } else if (currentPosition >= positionStart) { + currentPosition += itemCount; + } + } + + @Override + public void onItemsRemoved(RecyclerView recyclerView, int positionStart, int itemCount) { + if (getItemCount() == 0) { + currentPosition = NO_POSITION; + } else if (currentPosition >= positionStart) { + currentPosition = Math.max(0, currentPosition - itemCount); + } + } + + @Override + public void onItemsChanged(RecyclerView recyclerView) { + //notifyDataSetChanged() was called. We need to ensure that currentPosition is not out of bounds + currentPosition = Math.min(Math.max(0, currentPosition), getItemCount() - 1); + } + + @Override + public int scrollHorizontallyBy(int dx, RecyclerView.Recycler recycler, RecyclerView.State state) { + if (getChildCount() == 0) { + return 0; + } + + int direction = dxToDirection(dx); + int leftToScroll = calculateAllowedScrollIn(direction); + if (leftToScroll <= 0) { + return 0; + } + + int delta = Math.min(leftToScroll, Math.abs(dx)) * direction; + scrolled += delta; + if (pendingScroll != 0) { + pendingScroll -= delta; + } + + offsetChildrenHorizontal(-delta); + + View firstChild = getFirstChild(), lastChild = getLastChild(); + boolean isNewVisibleFromLeft = getDecoratedLeft(firstChild) > 0 + && getPosition(firstChild) > 0; + boolean isNewVisibleFromRight = getDecoratedRight(lastChild) < getWidth() + && getPosition(lastChild) < getItemCount() - 1; + + if (isNewVisibleFromLeft || isNewVisibleFromRight) { + fill(recycler); + } + + notifyScroll(); + + applyItemTransformToChildren(); + + return delta; + } + + private void applyItemTransformToChildren() { + if (itemTransformer != null) { + for (int i = 0; i < getChildCount(); i++) { + View child = getChildAt(i); + itemTransformer.transformItem(child, getCenterRelativePositionOf(child)); + } + } + } + + @Override + public void scrollToPosition(int position) { + if (currentPosition == position) { + return; + } + + currentPosition = position; + requestLayout(); + } + + @Override + public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) { + if (currentPosition == position) { + return; + } + + pendingScroll = -scrolled; + int requiredDx = Math.abs(position - currentPosition) + * dxToDirection(position - currentPosition) + * scrollToChangeTheCurrent; + pendingScroll += requiredDx; + + pendingPosition = position; + startSmoothPendingScroll(); + } + + @Override + public boolean canScrollHorizontally() { + return true; + } + + @Override + public boolean canScrollVertically() { + return false; + } + + @Override + public void onScrollStateChanged(int state) { + if (currentScrollState == RecyclerView.SCROLL_STATE_IDLE && currentScrollState != state) { + notifyScrollStart(); + } + + if (state == RecyclerView.SCROLL_STATE_IDLE) { + //Scroll is not finished until current view is centered + boolean isScrollEnded = onScrollEnd(); + if (isScrollEnded) { + notifyScrollEnd(); + } else { + //Scroll continues and we don't want to set currentScrollState to STATE_IDLE, + //because this will then trigger notifyScrollStart() + return; + } + } else if (state == RecyclerView.SCROLL_STATE_DRAGGING) { + onDragStart(); + } + currentScrollState = state; + } + + /** + * @return true if scroll is ended and we don't need to settle items + */ + private boolean onScrollEnd() { + if (pendingPosition != NO_POSITION) { + currentPosition = pendingPosition; + pendingPosition = NO_POSITION; + scrolled = 0; + } + + int scrollDirection = dxToDirection(scrolled); + if (Math.abs(scrolled) == scrollToChangeTheCurrent) { + currentPosition += scrollDirection; + scrolled = 0; + } + + if (isAnotherItemCloserThanCurrent()) { + pendingScroll = getHowMuchIsLeftToScroll(scrolled); + } else { + pendingScroll = -scrolled; + } + + if (pendingScroll == 0) { + return true; + } else { + startSmoothPendingScroll(); + return false; + } + } + + private void onDragStart() { + //Here we need to: + //1. Stop any pending scroll + //2. Set currentPosition to position of the item that is closest to the center + boolean isScrollingThroughMultiplePositions = Math.abs(scrolled) > scrollToChangeTheCurrent; + if (isScrollingThroughMultiplePositions) { + int scrolledPositions = scrolled / scrollToChangeTheCurrent; + currentPosition += scrolledPositions; + scrolled -= scrolledPositions * scrollToChangeTheCurrent; + } + if (isAnotherItemCloserThanCurrent()) { + int direction = dxToDirection(scrolled); + currentPosition += direction; + scrolled = -getHowMuchIsLeftToScroll(scrolled); + } + pendingPosition = NO_POSITION; + pendingScroll = 0; + } + + public void onFling(int velocity) { + int direction = dxToDirection(velocity); + int newPosition = currentPosition + direction; + boolean canFling = newPosition >= 0 && newPosition < getItemCount(); + if (canFling) { + pendingScroll = getHowMuchIsLeftToScroll(velocity); + if (pendingScroll != 0) { + startSmoothPendingScroll(); + } + } else { + returnToCurrentPosition(); + } + } + + public void returnToCurrentPosition() { + pendingScroll = -scrolled; + if (pendingScroll != 0) { + startSmoothPendingScroll(); + } + } + + private int calculateAllowedScrollIn(@Direction int direction) { + if (pendingScroll != 0) { + return Math.abs(pendingScroll); + } + int allowedScroll; + boolean isBoundReached; + boolean isScrollDirectionAsBefore = direction * scrolled > 0; + if (direction == DIRECTION_START && currentPosition == 0) { + //We can scroll to the left when currentPosition == 0 only if we scrolled to the right before + isBoundReached = scrolled == 0; + allowedScroll = isBoundReached ? 0 : Math.abs(scrolled); + } else if (direction == DIRECTION_END && currentPosition == getItemCount() - 1) { + //We can scroll to the right when currentPosition == last only if we scrolled to the left before + isBoundReached = scrolled == 0; + allowedScroll = isBoundReached ? 0 : Math.abs(scrolled); + } else { + isBoundReached = false; + allowedScroll = isScrollDirectionAsBefore ? + scrollToChangeTheCurrent - Math.abs(scrolled) : + scrollToChangeTheCurrent + Math.abs(scrolled); + } + notifyBoundReached(isBoundReached); + return allowedScroll; + } + + private void startSmoothPendingScroll() { + LinearSmoothScroller scroller = new DiscreteLinearSmoothScroller(context); + scroller.setTargetPosition(currentPosition); + startSmoothScroll(scroller); + } + + @Override + public void onAdapterChanged(RecyclerView.Adapter oldAdapter, RecyclerView.Adapter newAdapter) { + if (newAdapter.getItemCount() > 0) { + pendingPosition = NO_POSITION; + scrolled = pendingScroll = 0; + currentPosition = 0; + } + removeAllViews(); + } + + @Override + public Parcelable onSaveInstanceState() { + Bundle bundle = new Bundle(); + if (pendingPosition != NO_POSITION) { + currentPosition = pendingPosition; + } + bundle.putInt(EXTRA_POSITION, currentPosition); + return bundle; + } + + @Override + public void onRestoreInstanceState(Parcelable state) { + Bundle bundle = (Bundle) state; + currentPosition = bundle.getInt(EXTRA_POSITION); + } + + @Override + public RecyclerView.LayoutParams generateDefaultLayoutParams() { + return new RecyclerView.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT); + } + + public void setItemTransformer(DiscreteScrollItemTransformer itemTransformer) { + this.itemTransformer = itemTransformer; + } + + public void setScrollStateListener(ScrollStateListener boundReachedListener) { + this.scrollStateListener = boundReachedListener; + } + + public void setTimeForItemSettle(int timeForItemSettle) { + this.timeForItemSettle = timeForItemSettle; + } + + public int getCurrentPosition() { + return currentPosition; + } + + @Override + public void onInitializeAccessibilityEvent(AccessibilityEvent event) { + super.onInitializeAccessibilityEvent(event); + if (getChildCount() > 0) { + final AccessibilityRecordCompat record = AccessibilityEventCompat.asRecord(event); + record.setFromIndex(getPosition(getFirstChild())); + record.setToIndex(getPosition(getLastChild())); + } + } + + private float getCenterRelativePositionOf(View v) { + int viewCenterX = (getDecoratedLeft(v) + getDecoratedRight(v)) / 2; + int centerX = getWidth() / 2; + float distanceFromCenter = viewCenterX - centerX; + return Math.min(Math.max(-1f, distanceFromCenter / scrollToChangeTheCurrent), 1f); + } + + private int getHowMuchIsLeftToScroll(int dx) { + return (scrollToChangeTheCurrent - Math.abs(scrolled)) * dxToDirection(dx); + } + + private boolean isAnotherItemCloserThanCurrent() { + return Math.abs(scrolled) >= scrollToChangeTheCurrent * 0.6f; + } + + @Direction + private int dxToDirection(int dx) { + return dx > 0 ? DIRECTION_END : DIRECTION_START; + } + + private View getFirstChild() { + return getChildAt(0); + } + + private View getLastChild() { + return getChildAt(getChildCount() - 1); + } + + private void notifyScrollEnd() { + if (scrollStateListener != null) { + scrollStateListener.onScrollEnd(); + } + } + + private void notifyScrollStart() { + if (scrollStateListener != null) { + scrollStateListener.onScrollStart(); + } + } + + private void notifyBoundReached(boolean isReached) { + if (scrollStateListener != null) { + scrollStateListener.onIsBoundReachedFlagChange(isReached); + } + } + + private void notifyScroll() { + if (scrollStateListener != null) { + float position = -Math.min(Math.max(-1f, + scrolled / (float) scrollToChangeTheCurrent), + 1f); + scrollStateListener.onScroll(position); + } + } + + private void notifyFirstLayoutCompleted() { + if (scrollStateListener != null) { + scrollStateListener.onCurrentViewFirstLayout(); + } + } + + private class DiscreteLinearSmoothScroller extends LinearSmoothScroller { + + public DiscreteLinearSmoothScroller(Context context) { + super(context); + } + + @Override + public int calculateDxToMakeVisible(View view, int snapPreference) { + return -pendingScroll; + } + + @Override + protected int calculateTimeForScrolling(int dx) { + float dist = Math.min(Math.abs(dx), scrollToChangeTheCurrent); + return (int) (Math.max(0.01f, dist / scrollToChangeTheCurrent) * timeForItemSettle); + } + + @Nullable + @Override + public PointF computeScrollVectorForPosition(int targetPosition) { + return new PointF(-pendingScroll, 0); + } + } + + public interface ScrollStateListener { + void onIsBoundReachedFlagChange(boolean isBoundReached); + + void onScrollStart(); + + void onScrollEnd(); + + void onScroll(float currentViewPosition); + + void onCurrentViewFirstLayout(); + } + + @IntDef({DIRECTION_START, DIRECTION_END}) + @Retention(RetentionPolicy.SOURCE) + private @interface Direction { + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/slide_card/DiscreteScrollView.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/slide_card/DiscreteScrollView.java new file mode 100644 index 0000000000000000000000000000000000000000..3d474334a2372dd8c3fb1928c819d35d1f61a424 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/slide_card/DiscreteScrollView.java @@ -0,0 +1,149 @@ +package com.jiuqi.elove.widget.slide_card; + +import android.content.Context; +import android.support.annotation.IntRange; +import android.support.v7.widget.RecyclerView; +import android.util.AttributeSet; + + +/** + * Created by yarolegovich on 18.02.2017. + */ +@SuppressWarnings("unchecked") +public class DiscreteScrollView extends RecyclerView { + + private DiscreteScrollLayoutManager layoutManager; + + private ScrollStateChangeListener scrollStateChangeListener; + private CurrentItemChangeListener currentItemChangeListener; + + public DiscreteScrollView(Context context) { + super(context); + } + + public DiscreteScrollView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public DiscreteScrollView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + { + layoutManager = new DiscreteScrollLayoutManager(getContext()); + layoutManager.setScrollStateListener(new DiscreteScrollLayoutManager.ScrollStateListener() { + @Override + public void onIsBoundReachedFlagChange(boolean isBoundReached) { + setOverScrollMode(isBoundReached ? OVER_SCROLL_ALWAYS : OVER_SCROLL_NEVER); + } + + @Override + public void onScrollStart() { + if (scrollStateChangeListener != null) { + int current = layoutManager.getCurrentPosition(); + ViewHolder holder = getViewHolder(current); + scrollStateChangeListener.onScrollStart(holder, current); + } + } + + @Override + public void onScrollEnd() { + ViewHolder holder = null; + int current = layoutManager.getCurrentPosition(); + if (scrollStateChangeListener != null) { + holder = getViewHolder(current); + scrollStateChangeListener.onScrollEnd(holder, current); + } + if (currentItemChangeListener != null) { + if (holder == null) { + holder = getViewHolder(current); + } + currentItemChangeListener.onCurrentItemChanged(holder, current); + } + } + + @Override + public void onScroll(float currentViewPosition) { + if (scrollStateChangeListener != null) { + scrollStateChangeListener.onScroll(currentViewPosition); + } + } + + @Override + public void onCurrentViewFirstLayout() { + if (currentItemChangeListener != null) { + int current = layoutManager.getCurrentPosition(); + currentItemChangeListener.onCurrentItemChanged(getViewHolder(current), current); + } + } + }); + setLayoutManager(layoutManager); + } + + @Override + public void setLayoutManager(LayoutManager layout) { + if (layout instanceof DiscreteScrollLayoutManager) { + super.setLayoutManager(layout); + } else { + throw new IllegalArgumentException( + "You should not set LayoutManager on DiscreteScrollView.class" + + "instance. Library uses a special one. Just don't call the method."); + } + } + + + @Override + public boolean fling(int velocityX, int velocityY) { + boolean isFling = super.fling(velocityX, velocityY); + if (isFling) { + layoutManager.onFling(velocityX); + } else { + layoutManager.returnToCurrentPosition(); + } + return isFling; + } + + public ViewHolder getViewHolder(int position) { + return getChildViewHolder(layoutManager.findViewByPosition(position)); + } + + public void setItemTransformer(DiscreteScrollItemTransformer transformer) { + layoutManager.setItemTransformer(transformer); + } + + public void setItemTransitionTimeMillis(@IntRange(from = 10) int millis) { + layoutManager.setTimeForItemSettle(millis); + } + + public void setScrollStateChangeListener(ScrollStateChangeListener scrollStateChangeListener) { + this.scrollStateChangeListener = scrollStateChangeListener; + } + + public void setCurrentItemChangeListener(CurrentItemChangeListener currentItemChangeListener) { + this.currentItemChangeListener = currentItemChangeListener; + } + + /** + * @return adapter position of the current item or -1 if nothing is selected + */ + public int getCurrentItem() { + return layoutManager.getCurrentPosition(); + } + + public interface ScrollStateChangeListener { + + void onScrollStart(T currentItemHolder, int adapterPosition); + + void onScrollEnd(T currentItemHolder, int adapterPosition); + + void onScroll(float scrollPosition); + } + + public interface CurrentItemChangeListener { + /* + * This method will be also triggered when view appears on the screen for the first time. + */ + void onCurrentItemChanged(T viewHolder, int adapterPosition); + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/slide_card/Pivot.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/slide_card/Pivot.java new file mode 100644 index 0000000000000000000000000000000000000000..16636ebe9ce9757b4ef422f6d300405b02e7d8fa --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/slide_card/Pivot.java @@ -0,0 +1,116 @@ +package com.jiuqi.elove.widget.slide_card; + +import android.support.annotation.IntDef; +import android.view.View; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * Created by yarolegovich on 03.03.2017. + */ + +public class Pivot { + + public static final int AXIS_X = 0; + public static final int AXIS_Y = 1; + + private static final int PIVOT_CENTER = -1; + private static final int PIVOT_MAX = -2; + + private int axis; + private int pivotPoint; + + public Pivot(@Axis int axis, int pivotPoint) { + this.axis = axis; + this.pivotPoint = pivotPoint; + } + + public void setOn(View view) { + if (axis == AXIS_X) { + switch (pivotPoint) { + case PIVOT_CENTER: + view.setPivotX(view.getWidth() * 0.5f); + break; + case PIVOT_MAX: + view.setPivotX(view.getWidth()); + break; + default: + view.setPivotX(pivotPoint); + break; + } + return; + } + + if (axis == AXIS_Y) { + switch (pivotPoint) { + case PIVOT_CENTER: + view.setPivotY(view.getHeight() * 0.5f); + break; + case PIVOT_MAX: + view.setPivotY(view.getHeight()); + break; + default: + view.setPivotY(pivotPoint); + break; + } + } + } + + @Axis + public int getAxis() { + return axis; + } + + public enum X { + LEFT { + @Override + public Pivot create() { + return new Pivot(AXIS_X, 0); + } + }, + CENTER { + @Override + public Pivot create() { + return new Pivot(AXIS_X, PIVOT_CENTER); + } + }, + RIGHT { + @Override + public Pivot create() { + return new Pivot(AXIS_X, PIVOT_MAX); + } + }; + + public abstract Pivot create(); + } + + public enum Y { + TOP { + @Override + public Pivot create() { + return new Pivot(AXIS_Y, 0); + } + }, + CENTER { + @Override + public Pivot create() { + return new Pivot(AXIS_Y, PIVOT_CENTER); + } + }, + BOTTOM { + @Override + public Pivot create() { + return new Pivot(AXIS_Y, PIVOT_MAX); + } + }; + + public abstract Pivot create(); + } + + @IntDef({AXIS_X, AXIS_Y}) + @Retention(RetentionPolicy.SOURCE) + public @interface Axis{ + } +} + diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/slide_card/ScaleTransformer.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/slide_card/ScaleTransformer.java new file mode 100644 index 0000000000000000000000000000000000000000..7cfaa6d89574cc7c892913aacc03d91a97fd490a --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/slide_card/ScaleTransformer.java @@ -0,0 +1,85 @@ +package com.jiuqi.elove.widget.slide_card; + +import android.support.annotation.FloatRange; +import android.view.View; + +/** + * Created by yarolegovich on 03.03.2017. + */ + +public class ScaleTransformer implements DiscreteScrollItemTransformer { + + private Pivot pivotX; + private Pivot pivotY; + private float minScale; + private float maxScale; + private float maxMinDiff; + + public ScaleTransformer() { + pivotX = Pivot.X.CENTER.create(); + pivotY = Pivot.Y.CENTER.create(); + minScale = 0.8f; + maxScale = 1f; + maxMinDiff = maxScale - minScale; + } + + @Override + public void transformItem(View item, float position) { + pivotX.setOn(item); + pivotY.setOn(item); + float closenessToCenter = 1f - Math.abs(position); + float scale = minScale + maxMinDiff * closenessToCenter; + item.setScaleX(scale); + item.setScaleY(scale); + } + + public static class Builder { + + private ScaleTransformer transformer; + + public Builder() { + transformer = new ScaleTransformer(); + } + + public Builder setMinScale(@FloatRange(from = 0.01) float scale) { + transformer.minScale = scale; + return this; + } + + public Builder setMaxScale(@FloatRange(from = 0.01) float scale) { + transformer.maxMinDiff = scale; + return this; + } + + public Builder setPivotX(Pivot.X pivotX) { + return setPivotX(pivotX.create()); + } + + public Builder setPivotX(Pivot pivot) { + assertAxis(pivot, Pivot.AXIS_X); + transformer.pivotX = pivot; + return this; + } + + public Builder setPivotY(Pivot.Y pivotY) { + return setPivotY(pivotY.create()); + } + + public Builder setPivotY(Pivot pivot) { + assertAxis(pivot, Pivot.AXIS_Y); + transformer.pivotY = pivot; + return this; + } + + public ScaleTransformer build() { + transformer.maxMinDiff = transformer.maxScale - transformer.minScale; + return transformer; + } + + private void assertAxis(Pivot pivot, @Pivot.Axis int axis) { + if (pivot.getAxis() != axis) { + throw new IllegalArgumentException("You passed a Pivot for wrong axis."); + } + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/timepicker/BasePickerView.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/timepicker/BasePickerView.java new file mode 100644 index 0000000000000000000000000000000000000000..a1189c36d6c8b08240f00b57166365db81c33cd1 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/timepicker/BasePickerView.java @@ -0,0 +1,170 @@ +package com.jiuqi.elove.widget.timepicker; + +import android.app.Activity; +import android.content.Context; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.Animation; +import android.view.animation.AnimationUtils; +import android.widget.FrameLayout; + +import com.jiuqi.elove.R; + +/** + * Created by Sai on 15/11/22. + * 精仿iOSPickerViewController控件 + */ +public class BasePickerView { + private final FrameLayout.LayoutParams params = new FrameLayout.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.BOTTOM + ); + + private Context context; + protected ViewGroup contentContainer; + private ViewGroup decorView;//activity的根View + private ViewGroup rootView;//附加View 的 根View + + private OnDismissListener onDismissListener; + private boolean dismissing; + + private Animation outAnim; + private Animation inAnim; + private boolean showing; + private int gravity = Gravity.BOTTOM; + + public BasePickerView(Context context){ + this.context = context; + + initViews(); + init(); + initEvents(); + } + + protected void initViews(){ + LayoutInflater layoutInflater = LayoutInflater.from(context); + decorView = (ViewGroup) ((Activity)context).getWindow().getDecorView().findViewById(android.R.id.content); + rootView = (ViewGroup) layoutInflater.inflate(R.layout.layout_basepickerview, decorView, false); + rootView.setLayoutParams(new FrameLayout.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT + )); + contentContainer = (ViewGroup) rootView.findViewById(R.id.content_container); + contentContainer.setLayoutParams(params); + } + + protected void init() { + inAnim = getInAnimation(); + outAnim = getOutAnimation(); + } + protected void initEvents() { + } + /** + * show的时候调用 + * + * @param view 这个View + */ + private void onAttached(View view) { + decorView.addView(view); + contentContainer.startAnimation(inAnim); + } + /** + * 添加这个View到Activity的根视图 + */ + public void show() { + if (isShowing()) { + return; + } + showing = true; + onAttached(rootView); + } + /** + * 检测该View是不是已经添加到根视图 + * @return 如果视图已经存在该View返回true + */ + public boolean isShowing() { + View view = decorView.findViewById(R.id.outmost_container); + return (view != null&&showing); + } + public void dismiss() { + if (dismissing&&!showing) { + return; + } + + //消失动画 + outAnim.setAnimationListener(new Animation.AnimationListener() { + @Override + public void onAnimationStart(Animation animation) { + + } + + @Override + public void onAnimationEnd(Animation animation) { + decorView.post(new Runnable() { + @Override + public void run() { + //从activity根视图移除 + decorView.removeView(rootView); + showing = false; + dismissing = false; + if (onDismissListener != null) { + onDismissListener.onDismiss(BasePickerView.this); + } + } + }); + } + + @Override + public void onAnimationRepeat(Animation animation) { + + } + }); + contentContainer.startAnimation(outAnim); + dismissing = true; + } + public Animation getInAnimation() { +// int res = PickerViewAnimateUtil.getAnimationResource(this.gravity, true); + int res = R.anim.slide_in_bottom; + return AnimationUtils.loadAnimation(context, res); + } + + public Animation getOutAnimation() { +// int res = PickerViewAnimateUtil.getAnimationResource(this.gravity, false); + int res = R.anim.slide_out_bottom; + return AnimationUtils.loadAnimation(context, res); + } + + public BasePickerView setOnDismissListener(OnDismissListener onDismissListener) { + this.onDismissListener = onDismissListener; + return this; + } + + public BasePickerView setCancelable(boolean isCancelable) { + View view = rootView.findViewById(R.id.outmost_container); + + if (isCancelable) { + view.setOnTouchListener(onCancelableTouchListener); + } + else{ + view.setOnTouchListener(null); + } + return this; + } + /** + * Called when the user touch on black overlay in order to dismiss the dialog + */ + private final View.OnTouchListener onCancelableTouchListener = new View.OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + if (event.getAction() == MotionEvent.ACTION_DOWN) { + dismiss(); + } + return false; + } + }; + + public View findViewById(int id){ + return contentContainer.findViewById(id); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/timepicker/IPickerViewData.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/timepicker/IPickerViewData.java new file mode 100644 index 0000000000000000000000000000000000000000..e2681a709b09339fa5a274cd08d07d262fcaffac --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/timepicker/IPickerViewData.java @@ -0,0 +1,8 @@ +package com.jiuqi.elove.widget.timepicker; + +/** + * Created by Sai on 2016/7/13. + */ +public interface IPickerViewData { + String getPickerViewText(); +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/timepicker/InertiaTimerTask.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/timepicker/InertiaTimerTask.java new file mode 100644 index 0000000000000000000000000000000000000000..f083e95fdf43977bd4425f68e7a123e80b639a4f --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/timepicker/InertiaTimerTask.java @@ -0,0 +1,65 @@ +package com.jiuqi.elove.widget.timepicker; + +import java.util.TimerTask; + +final class InertiaTimerTask extends TimerTask { + + float a; + final float velocityY; + final WheelView1 loopView; + + InertiaTimerTask(WheelView1 loopview, float velocityY) { + super(); + loopView = loopview; + this.velocityY = velocityY; + a = Integer.MAX_VALUE; + } + + @Override + public final void run() { + if (a == Integer.MAX_VALUE) { + if (Math.abs(velocityY) > 2000F) { + if (velocityY > 0.0F) { + a = 2000F; + } else { + a = -2000F; + } + } else { + a = velocityY; + } + } + if (Math.abs(a) >= 0.0F && Math.abs(a) <= 20F) { + loopView.cancelFuture(); + loopView.handler.sendEmptyMessage(MessageHandler.WHAT_SMOOTH_SCROLL); + return; + } + int i = (int) ((a * 10F) / 1000F); + loopView.totalScrollY = loopView.totalScrollY - i; + if (!loopView.isLoop) { + float itemHeight = loopView.itemHeight; + float top = (-loopView.initPosition) * itemHeight; + float bottom = (loopView.getItemsCount() - 1 - loopView.initPosition) * itemHeight; + if(loopView.totalScrollY - itemHeight*0.3 < top){ + top = loopView.totalScrollY + i; + } + else if(loopView.totalScrollY + itemHeight*0.3 > bottom){ + bottom = loopView.totalScrollY + i; + } + + if (loopView.totalScrollY <= top){ + a = 40F; + loopView.totalScrollY = (int)top; + } else if (loopView.totalScrollY >= bottom) { + loopView.totalScrollY = (int)bottom; + a = -40F; + } + } + if (a < 0.0F) { + a = a + 20F; + } else { + a = a - 20F; + } + loopView.handler.sendEmptyMessage(MessageHandler.WHAT_INVALIDATE_LOOP_VIEW); + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/timepicker/LoopViewGestureListener.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/timepicker/LoopViewGestureListener.java new file mode 100644 index 0000000000000000000000000000000000000000..a0357bab83e5d97d5f6120f852718daf1223d045 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/timepicker/LoopViewGestureListener.java @@ -0,0 +1,18 @@ +package com.jiuqi.elove.widget.timepicker; + +import android.view.MotionEvent; + +final class LoopViewGestureListener extends android.view.GestureDetector.SimpleOnGestureListener { + + final WheelView1 loopView; + + LoopViewGestureListener(WheelView1 loopview) { + loopView = loopview; + } + + @Override + public final boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { + loopView.scrollBy(velocityY); + return true; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/timepicker/MessageHandler.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/timepicker/MessageHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..2d4c25d6785738d17fad159505e53c4148fc77dd --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/timepicker/MessageHandler.java @@ -0,0 +1,34 @@ +package com.jiuqi.elove.widget.timepicker; + +import android.os.Handler; +import android.os.Message; + +final class MessageHandler extends Handler { + public static final int WHAT_INVALIDATE_LOOP_VIEW = 1000; + public static final int WHAT_SMOOTH_SCROLL = 2000; + public static final int WHAT_ITEM_SELECTED = 3000; + + final WheelView1 loopview; + + MessageHandler(WheelView1 loopview) { + this.loopview = loopview; + } + + @Override + public final void handleMessage(Message msg) { + switch (msg.what) { + case WHAT_INVALIDATE_LOOP_VIEW: + loopview.invalidate(); + break; + + case WHAT_SMOOTH_SCROLL: + loopview.smoothScroll(WheelView1.ACTION.FLING); + break; + + case WHAT_ITEM_SELECTED: + loopview.onItemSelected(); + break; + } + } + +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/timepicker/NumericWheelAdapter.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/timepicker/NumericWheelAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..4188df766f22f58a3638c7b11281b2cbd7576049 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/timepicker/NumericWheelAdapter.java @@ -0,0 +1,54 @@ +package com.jiuqi.elove.widget.timepicker; + + +/** + * Numeric Wheel adapter. + */ +public class NumericWheelAdapter implements WheelAdapter1 { + + /** The default min value */ + public static final int DEFAULT_MAX_VALUE = 9; + + /** The default max value */ + private static final int DEFAULT_MIN_VALUE = 0; + + // Values + private int minValue; + private int maxValue; + + /** + * Default constructor + */ + public NumericWheelAdapter() { + this(DEFAULT_MIN_VALUE, DEFAULT_MAX_VALUE); + } + + /** + * Constructor + * @param minValue the wheel min value + * @param maxValue the wheel max value + */ + public NumericWheelAdapter(int minValue, int maxValue) { + this.minValue = minValue; + this.maxValue = maxValue; + } + + @Override + public Object getItem(int index) { + if (index >= 0 && index < getItemsCount()) { + int value = minValue + index; + return value; + } + return 0; + } + + @Override + public int getItemsCount() { + return maxValue - minValue + 1; + } + + @Override + public int indexOf(Object o){ + return (int)o - minValue; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/timepicker/OnDismissListener.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/timepicker/OnDismissListener.java new file mode 100644 index 0000000000000000000000000000000000000000..c196b15ac3bf5ce27c6b9ceb2be64a29fae4f98d --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/timepicker/OnDismissListener.java @@ -0,0 +1,8 @@ +package com.jiuqi.elove.widget.timepicker; + +/** + * Created by Sai on 15/8/9. + */ +public interface OnDismissListener { + public void onDismiss(Object o); +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/timepicker/OnItemSelectedListener.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/timepicker/OnItemSelectedListener.java new file mode 100644 index 0000000000000000000000000000000000000000..3c8756934d7bef000ebe1a8f90861ece2b44bb8a --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/timepicker/OnItemSelectedListener.java @@ -0,0 +1,6 @@ +package com.jiuqi.elove.widget.timepicker; + + +public interface OnItemSelectedListener { + void onItemSelected(int index); +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/timepicker/OnItemSelectedRunnable.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/timepicker/OnItemSelectedRunnable.java new file mode 100644 index 0000000000000000000000000000000000000000..74b083d0dba427d9e053660a88631879a1b57d71 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/timepicker/OnItemSelectedRunnable.java @@ -0,0 +1,14 @@ +package com.jiuqi.elove.widget.timepicker; + +final class OnItemSelectedRunnable implements Runnable { + final WheelView1 loopView; + + OnItemSelectedRunnable(WheelView1 loopview) { + loopView = loopview; + } + + @Override + public final void run() { + loopView.onItemSelectedListener.onItemSelected(loopView.getCurrentItem()); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/timepicker/PickerViewAnimateUtil.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/timepicker/PickerViewAnimateUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..de92aa79eb597e7ba105a260ac36c46dd1d84fa1 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/timepicker/PickerViewAnimateUtil.java @@ -0,0 +1,27 @@ +package com.jiuqi.elove.widget.timepicker; + +import android.view.Gravity; + +import com.jiuqi.elove.R; + + +/** + * Created by Sai on 15/8/9. + */ +public class PickerViewAnimateUtil { + private static final int INVALID = -1; + /** + * Get default animation resource when not defined by the user + * + * @param gravity the gravity of the dialog + * @param isInAnimation determine if is in or out animation. true when is is + * @return the id of the animation resource + */ + public static int getAnimationResource(int gravity, boolean isInAnimation) { + switch (gravity) { + case Gravity.BOTTOM: + return isInAnimation ? R.anim.slide_in_bottom : R.anim.slide_out_bottom; + } + return INVALID; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/timepicker/SmoothScrollTimerTask.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/timepicker/SmoothScrollTimerTask.java new file mode 100644 index 0000000000000000000000000000000000000000..fffaae1de3c0773d41a5f23553c2228ae78ebb87 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/timepicker/SmoothScrollTimerTask.java @@ -0,0 +1,57 @@ +package com.jiuqi.elove.widget.timepicker; + +import java.util.TimerTask; + +final class SmoothScrollTimerTask extends TimerTask { + + int realTotalOffset; + int realOffset; + int offset; + final WheelView1 loopView; + + SmoothScrollTimerTask(WheelView1 loopview, int offset) { + this.loopView = loopview; + this.offset = offset; + realTotalOffset = Integer.MAX_VALUE; + realOffset = 0; + } + + @Override + public final void run() { + if (realTotalOffset == Integer.MAX_VALUE) { + realTotalOffset = offset; + } + //把要滚动的范围细分成十小份,按是小份单位来重绘 + realOffset = (int) ((float) realTotalOffset * 0.1F); + + if (realOffset == 0) { + if (realTotalOffset < 0) { + realOffset = -1; + } else { + realOffset = 1; + } + } + + if (Math.abs(realTotalOffset) <= 1) { + loopView.cancelFuture(); + loopView.handler.sendEmptyMessage(MessageHandler.WHAT_ITEM_SELECTED); + } else { + loopView.totalScrollY = loopView.totalScrollY + realOffset; + + //这里如果不是循环模式,则点击空白位置需要回滚,不然就会出现选到-1 item的 情况 + if (!loopView.isLoop) { + float itemHeight = loopView.itemHeight; + float top = (float) (-loopView.initPosition) * itemHeight; + float bottom = (float) (loopView.getItemsCount() - 1 - loopView.initPosition) * itemHeight; + if (loopView.totalScrollY <= top||loopView.totalScrollY >= bottom) { + loopView.totalScrollY = loopView.totalScrollY - realOffset; + loopView.cancelFuture(); + loopView.handler.sendEmptyMessage(MessageHandler.WHAT_ITEM_SELECTED); + return; + } + } + loopView.handler.sendEmptyMessage(MessageHandler.WHAT_INVALIDATE_LOOP_VIEW); + realTotalOffset = realTotalOffset - realOffset; + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/timepicker/TimePickerView.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/timepicker/TimePickerView.java new file mode 100644 index 0000000000000000000000000000000000000000..423892dce752d6f02db2a12b57a29a73030181e8 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/timepicker/TimePickerView.java @@ -0,0 +1,147 @@ +package com.jiuqi.elove.widget.timepicker; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.TextView; + +import com.jiuqi.elove.R; + +import java.text.ParseException; +import java.util.Calendar; +import java.util.Date; + +/** + * 时间选择器 + * Created by Sai on 15/11/22. + */ +public class TimePickerView extends BasePickerView implements View.OnClickListener { + public enum Type { + ALL, YEAR_MONTH_DAY, HOURS_MINS, MONTH_DAY_HOUR_MIN , YEAR_MONTH + }// 四种选择模式,年月日时分,年月日,时分,月日时分 + + WheelTime wheelTime; + private View btnSubmit, btnCancel; + private TextView tvTitle; + private static final String TAG_SUBMIT = "submit"; + private static final String TAG_CANCEL = "cancel"; + private OnTimeSelectListener timeSelectListener; + + public TimePickerView(Context context, Type type) { + super(context); + + LayoutInflater.from(context).inflate(R.layout.pickerview_time, contentContainer); + // -----确定和取消按钮 + btnSubmit = findViewById(R.id.btnSubmit); + btnSubmit.setTag(TAG_SUBMIT); + btnCancel = findViewById(R.id.btnCancel); + btnCancel.setTag(TAG_CANCEL); + btnSubmit.setOnClickListener(this); + btnCancel.setOnClickListener(this); + //顶部标题 + tvTitle = (TextView) findViewById(R.id.tvTitle); + // ----时间转轮 + final View timepickerview = findViewById(R.id.timepicker); + wheelTime = new WheelTime(timepickerview, type); + + //默认选中当前时间 + Calendar calendar = Calendar.getInstance(); + calendar.setTimeInMillis(System.currentTimeMillis()); + int year = calendar.get(Calendar.YEAR); + int month = calendar.get(Calendar.MONTH); + int day = calendar.get(Calendar.DAY_OF_MONTH); + int hours = calendar.get(Calendar.HOUR_OF_DAY); + int minute = calendar.get(Calendar.MINUTE); + wheelTime.setPicker(year, month, day, hours, minute); + + } + + /** + * 设置可以选择的时间范围 + * 要在setTime之前调用才有效果 + * @param startYear 开始年份 + * @param endYear 结束年份 + */ + public void setRange(int startYear, int endYear) { + wheelTime.setStartYear(startYear); + wheelTime.setEndYear(endYear); + } + + /** + * 设置选中时间 + * @param date 时间 + */ + public void setTime(Date date) { + Calendar calendar = Calendar.getInstance(); + if (date == null) + calendar.setTimeInMillis(System.currentTimeMillis()); + else + calendar.setTime(date); + int year = calendar.get(Calendar.YEAR); + int month = calendar.get(Calendar.MONTH); + int day = calendar.get(Calendar.DAY_OF_MONTH); + int hours = calendar.get(Calendar.HOUR_OF_DAY); + int minute = calendar.get(Calendar.MINUTE); + wheelTime.setPicker(year, month, day, hours, minute); + } + +// /** +// * 指定选中的时间,显示选择器 +// * +// * @param date +// */ +// public void show(Date date) { +// Calendar calendar = Calendar.getInstance(); +// if (date == null) +// calendar.setTimeInMillis(System.currentTimeMillis()); +// else +// calendar.setTime(date); +// int year = calendar.get(Calendar.YEAR); +// int month = calendar.get(Calendar.MONTH); +// int day = calendar.get(Calendar.DAY_OF_MONTH); +// int hours = calendar.get(Calendar.HOUR_OF_DAY); +// int minute = calendar.get(Calendar.MINUTE); +// wheelTime.setPicker(year, month, day, hours, minute); +// show(); +// } + + /** + * 设置是否循环滚动 + * @param cyclic 是否循环 + */ + public void setCyclic(boolean cyclic) { + wheelTime.setCyclic(cyclic); + } + + @Override + public void onClick(View v) { + String tag = (String) v.getTag(); + if (tag.equals(TAG_CANCEL)) { + dismiss(); + return; + } else { + if (timeSelectListener != null) { + try { + Date date = WheelTime.dateFormat.parse(wheelTime.getTime()); + timeSelectListener.onTimeSelect(date); + } catch (ParseException e) { + e.printStackTrace(); + } + } + dismiss(); + return; + } + } + + public interface OnTimeSelectListener { + void onTimeSelect(Date date); + } + + public void setOnTimeSelectListener(OnTimeSelectListener timeSelectListener) { + this.timeSelectListener = timeSelectListener; + } + + public void setTitle(String title){ + tvTitle.setText(title); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/timepicker/WheelAdapter1.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/timepicker/WheelAdapter1.java new file mode 100644 index 0000000000000000000000000000000000000000..468ffba70da360e8893944b70d7e881601955337 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/timepicker/WheelAdapter1.java @@ -0,0 +1,24 @@ +package com.jiuqi.elove.widget.timepicker; + +public interface WheelAdapter1 { + /** + * Gets items count + * @return the count of wheel items + */ + int getItemsCount(); + + /** + * Gets a wheel item by index. + * @param index the item index + * @return the wheel item text or null + */ + T getItem(int index); + + /** + * Gets maximum item length. It is used to determine the wheel width. + * If -1 is returned there will be used the default wheel width. + * @param o + * @return the maximum item length or -1 + */ + int indexOf(T o); +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/timepicker/WheelTime.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/timepicker/WheelTime.java new file mode 100644 index 0000000000000000000000000000000000000000..67640910f86e052abfd370ecfb61bb868cefbb34 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/timepicker/WheelTime.java @@ -0,0 +1,241 @@ +package com.jiuqi.elove.widget.timepicker; + +import android.content.Context; +import android.view.View; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.widget.WheelView; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.List; + + +public class WheelTime { + public static DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + private View view; + private WheelView1 wv_year; + private WheelView1 wv_month; + private WheelView1 wv_day; + private WheelView1 wv_hours; + private WheelView1 wv_mins; + + private TimePickerView.Type type; + public static final int DEFULT_START_YEAR = 1990; + public static final int DEFULT_END_YEAR = 2100; + private int startYear = DEFULT_START_YEAR; + private int endYear = DEFULT_END_YEAR; + + + + public WheelTime(View view) { + super(); + this.view = view; + type = TimePickerView.Type.ALL; + setView(view); + } + public WheelTime(View view, TimePickerView.Type type) { + super(); + this.view = view; + this.type = type; + setView(view); + } + public void setPicker(int year ,int month,int day){ + this.setPicker(year, month, day, 0, 0); + } + + public void setPicker(int year ,int month ,int day,int h,int m) { + // 添加大小月月份并将其转换为list,方便之后的判断 + String[] months_big = { "1", "3", "5", "7", "8", "10", "12" }; + String[] months_little = { "4", "6", "9", "11" }; + + final List list_big = Arrays.asList(months_big); + final List list_little = Arrays.asList(months_little); + + Context context = view.getContext(); + // 年 + wv_year = (WheelView1) view.findViewById(R.id.year); + wv_year.setAdapter(new NumericWheelAdapter(startYear, endYear));// 设置"年"的显示数据 + wv_year.setLabel(context.getString(R.string.pickerview_year));// 添加文字 + wv_year.setCurrentItem(year - startYear);// 初始化时显示的数据 + + // 月 + wv_month = (WheelView1) view.findViewById(R.id.month); + wv_month.setAdapter(new NumericWheelAdapter(1, 12)); + wv_month.setLabel(context.getString(R.string.pickerview_month)); + wv_month.setCurrentItem(month); + + // 日 + wv_day = (WheelView1) view.findViewById(R.id.day); + // 判断大小月及是否闰年,用来确定"日"的数据 + if (list_big.contains(String.valueOf(month + 1))) { + wv_day.setAdapter(new NumericWheelAdapter(1, 31)); + } else if (list_little.contains(String.valueOf(month + 1))) { + wv_day.setAdapter(new NumericWheelAdapter(1, 30)); + } else { + // 闰年 + if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) + wv_day.setAdapter(new NumericWheelAdapter(1, 29)); + else + wv_day.setAdapter(new NumericWheelAdapter(1, 28)); + } + wv_day.setLabel(context.getString(R.string.pickerview_day)); + wv_day.setCurrentItem(day - 1); + + + wv_hours = (WheelView1)view.findViewById(R.id.hour); + wv_hours.setAdapter(new NumericWheelAdapter(0, 23)); + wv_hours.setLabel(context.getString(R.string.pickerview_hours));// 添加文字 + wv_hours.setCurrentItem(h); + + wv_mins = (WheelView1)view.findViewById(R.id.min); + wv_mins.setAdapter(new NumericWheelAdapter(0, 59)); + wv_mins.setLabel(context.getString(R.string.pickerview_minutes));// 添加文字 + wv_mins.setCurrentItem(m); + + // 添加"年"监听 + OnItemSelectedListener wheelListener_year = new OnItemSelectedListener() { + @Override + public void onItemSelected(int index) { + int year_num = index + startYear; + // 判断大小月及是否闰年,用来确定"日"的数据 + int maxItem = 30; + if (list_big + .contains(String.valueOf(wv_month.getCurrentItem() + 1))) { + wv_day.setAdapter(new NumericWheelAdapter(1, 31)); + maxItem = 31; + } else if (list_little.contains(String.valueOf(wv_month + .getCurrentItem() + 1))) { + wv_day.setAdapter(new NumericWheelAdapter(1, 30)); + maxItem = 30; + } else { + if ((year_num % 4 == 0 && year_num % 100 != 0) + || year_num % 400 == 0){ + wv_day.setAdapter(new NumericWheelAdapter(1, 29)); + maxItem = 29; + } + else{ + wv_day.setAdapter(new NumericWheelAdapter(1, 28)); + maxItem = 28; + } + } + if (wv_day.getCurrentItem() > maxItem - 1){ + wv_day.setCurrentItem(maxItem - 1); + } + } + }; + // 添加"月"监听 + OnItemSelectedListener wheelListener_month = new OnItemSelectedListener() { + @Override + public void onItemSelected(int index) { + int month_num = index + 1; + int maxItem = 30; + // 判断大小月及是否闰年,用来确定"日"的数据 + if (list_big.contains(String.valueOf(month_num))) { + wv_day.setAdapter(new NumericWheelAdapter(1, 31)); + maxItem = 31; + } else if (list_little.contains(String.valueOf(month_num))) { + wv_day.setAdapter(new NumericWheelAdapter(1, 30)); + maxItem = 30; + } else { + if (((wv_year.getCurrentItem() + startYear) % 4 == 0 && (wv_year + .getCurrentItem() + startYear) % 100 != 0) + || (wv_year.getCurrentItem() + startYear) % 400 == 0){ + wv_day.setAdapter(new NumericWheelAdapter(1, 29)); + maxItem = 29; + } + else{ + wv_day.setAdapter(new NumericWheelAdapter(1, 28)); + maxItem = 28; + } + } + if (wv_day.getCurrentItem() > maxItem - 1){ + wv_day.setCurrentItem(maxItem - 1); + } + + } + }; + wv_year.setOnItemSelectedListener(wheelListener_year); + wv_month.setOnItemSelectedListener(wheelListener_month); + + // 根据屏幕密度来指定选择器字体的大小(不同屏幕可能不同) + int textSize = 6; + switch(type){ + case ALL: + textSize = textSize * 3; + break; + case YEAR_MONTH_DAY: + textSize = textSize * 4; + wv_hours.setVisibility(View.GONE); + wv_mins.setVisibility(View.GONE); + break; + case HOURS_MINS: + textSize = textSize * 4; + wv_year.setVisibility(View.GONE); + wv_month.setVisibility(View.GONE); + wv_day.setVisibility(View.GONE); + break; + case MONTH_DAY_HOUR_MIN: + textSize = textSize * 3; + wv_year.setVisibility(View.GONE); + break; + case YEAR_MONTH: + textSize = textSize * 4; + wv_day.setVisibility(View.GONE); + wv_hours.setVisibility(View.GONE); + wv_mins.setVisibility(View.GONE); + } + wv_day.setTextSize(textSize); + wv_month.setTextSize(textSize); + wv_year.setTextSize(textSize); + wv_hours.setTextSize(textSize); + wv_mins.setTextSize(textSize); + + } + + /** + * 设置是否循环滚动 + * @param cyclic + */ + public void setCyclic(boolean cyclic){ + wv_year.setCyclic(cyclic); + wv_month.setCyclic(cyclic); + wv_day.setCyclic(cyclic); + wv_hours.setCyclic(cyclic); + wv_mins.setCyclic(cyclic); + } + public String getTime() { + StringBuffer sb = new StringBuffer(); + sb.append((wv_year.getCurrentItem() + startYear)).append("-") + .append((wv_month.getCurrentItem() + 1)).append("-") + .append((wv_day.getCurrentItem() + 1)).append(" ") + .append(wv_hours.getCurrentItem()).append(":") + .append(wv_mins.getCurrentItem()); + return sb.toString(); + } + + public View getView() { + return view; + } + + public void setView(View view) { + this.view = view; + } + + public int getStartYear() { + return startYear; + } + + public void setStartYear(int startYear) { + this.startYear = startYear; + } + + public int getEndYear() { + return endYear; + } + + public void setEndYear(int endYear) { + this.endYear = endYear; + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/timepicker/WheelView1.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/timepicker/WheelView1.java new file mode 100644 index 0000000000000000000000000000000000000000..6dd0383fedf86f14ba31022465cd4825de5bf1ce --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/timepicker/WheelView1.java @@ -0,0 +1,581 @@ +package com.jiuqi.elove.widget.timepicker; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.Typeface; +import android.os.Handler; +import android.util.AttributeSet; +import android.view.GestureDetector; +import android.view.Gravity; +import android.view.MotionEvent; +import android.view.View; + +import com.jiuqi.elove.R; + +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; + +/** + * 3d滚轮控件 + */ +public class WheelView1 extends View { + + public enum ACTION { + // 点击,滑翔(滑到尽头),拖拽事件 + CLICK, FLING, DAGGLE + } + + Context context; + + Handler handler; + private GestureDetector gestureDetector; + OnItemSelectedListener onItemSelectedListener; + + // Timer mTimer; + ScheduledExecutorService mExecutor = Executors.newSingleThreadScheduledExecutor(); + private ScheduledFuture mFuture; + + Paint paintOuterText; + Paint paintCenterText; + Paint paintIndicator; + + WheelAdapter1 adapter; + + private String label;//附加单位 + int textSize;//选项的文字大小 + boolean customTextSize;//自定义文字大小,为true则用于使setTextSize函数无效,只能通过xml修改 + int maxTextWidth; + int maxTextHeight; + float itemHeight;//每行高度 + + int textColorOut; + int textColorCenter; + int dividerColor; + + // 条目间距倍数 + static final float lineSpacingMultiplier = 1.4F; + boolean isLoop; + + // 第一条线Y坐标值 + float firstLineY; + //第二条线Y坐标 + float secondLineY; + //中间Y坐标 + float centerY; + + //滚动总高度y值 + int totalScrollY; + //初始化默认选中第几个 + int initPosition; + //选中的Item是第几个 + private int selectedItem; + int preCurrentIndex; + //滚动偏移值,用于记录滚动了多少个item + int change; + + // 显示几个条目 + int itemsVisible = 11; + + int measuredHeight; + int measuredWidth; + + // 半圆周长 + int halfCircumference; + // 半径 + int radius; + + private int mOffset = 0; + private float previousY = 0; + long startTime = 0; + + // 修改这个值可以改变滑行速度 + private static final int VELOCITYFLING = 5; + int widthMeasureSpec; + + private int mGravity = Gravity.CENTER; + private int drawCenterContentStart = 0;//中间选中文字开始绘制位置 + private int drawOutContentStart = 0;//非中间文字开始绘制位置 + private static final float SCALECONTENT = 0.8F;//非中间文字则用此控制高度,压扁形成3d错觉 + private static final float CENTERCONTENTOFFSET = 6;//中间文字文字居中需要此偏移值 + + public WheelView1(Context context) { + this(context, null); + } + + public WheelView1(Context context, AttributeSet attrs) { + super(context, attrs); + textColorOut = getResources().getColor(R.color.pickerview_wheelview_textcolor_out); + textColorCenter = getResources().getColor(R.color.pickerview_wheelview_textcolor_center); + dividerColor = getResources().getColor(R.color.pickerview_wheelview_textcolor_divider); + //配合customTextSize使用,customTextSize为true才会发挥效果 + textSize = getResources().getDimensionPixelSize(R.dimen.pickerview_textsize); + customTextSize = getResources().getBoolean(R.bool.pickerview_customTextSize); + if (attrs != null) { + TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.pickerview, 0, 0); + mGravity = a.getInt(R.styleable.pickerview_pickerview_gravity, Gravity.CENTER); + textColorOut = a.getColor(R.styleable.pickerview_pickerview_textColorOut, textColorOut); + textColorCenter = a.getColor(R.styleable.pickerview_pickerview_textColorCenter, textColorCenter); + dividerColor = a.getColor(R.styleable.pickerview_pickerview_dividerColor, dividerColor); + textSize = a.getDimensionPixelOffset(R.styleable.pickerview_pickerview_textSize, textSize); + } + initLoopView(context); + } + + private void initLoopView(Context context) { + this.context = context; + handler = new MessageHandler(this); + gestureDetector = new GestureDetector(context, new LoopViewGestureListener(this)); + gestureDetector.setIsLongpressEnabled(false); + + isLoop = true; + + totalScrollY = 0; + initPosition = -1; + + initPaints(); + + } + + private void initPaints() { + paintOuterText = new Paint(); + paintOuterText.setColor(textColorOut); + paintOuterText.setAntiAlias(true); + paintOuterText.setTypeface(Typeface.MONOSPACE); + paintOuterText.setTextSize(textSize); + + paintCenterText = new Paint(); + paintCenterText.setColor(textColorCenter); + paintCenterText.setAntiAlias(true); + paintCenterText.setTextScaleX(1.1F); + paintCenterText.setTypeface(Typeface.MONOSPACE); + paintCenterText.setTextSize(textSize); + + paintIndicator = new Paint(); + paintIndicator.setColor(dividerColor); + paintIndicator.setAntiAlias(true); + + if (android.os.Build.VERSION.SDK_INT >= 11) { + setLayerType(LAYER_TYPE_SOFTWARE, null); + } + } + + private void remeasure() { + if (adapter == null) { + return; + } + + measureTextWidthHeight(); + + //最大Text的高度乘间距倍数得到 可见文字实际的总高度,半圆的周长 + halfCircumference = (int) (itemHeight * (itemsVisible - 1)); + //整个圆的周长除以PI得到直径,这个直径用作控件的总高度 + measuredHeight = (int) ((halfCircumference * 2) / Math.PI); + //求出半径 + radius = (int) (halfCircumference / Math.PI); + //控件宽度,这里支持weight + measuredWidth = MeasureSpec.getSize(widthMeasureSpec); + //计算两条横线和控件中间点的Y位置 + firstLineY = (measuredHeight - itemHeight) / 2.0F; + secondLineY = (measuredHeight + itemHeight) / 2.0F; + centerY = (measuredHeight + maxTextHeight) / 2.0F - CENTERCONTENTOFFSET; + //初始化显示的item的position,根据是否loop + if (initPosition == -1) { + if (isLoop) { + initPosition = (adapter.getItemsCount() + 1) / 2; + } else { + initPosition = 0; + } + } + + preCurrentIndex = initPosition; + } + + /** + * 计算最大len的Text的宽高度 + */ + private void measureTextWidthHeight() { + Rect rect = new Rect(); + for (int i = 0; i < adapter.getItemsCount(); i++) { + String s1 = getContentText(adapter.getItem(i)); + paintCenterText.getTextBounds(s1, 0, s1.length(), rect); + int textWidth = rect.width(); + if (textWidth > maxTextWidth) { + maxTextWidth = textWidth; + } + paintCenterText.getTextBounds("\u661F\u671F", 0, 2, rect); // 星期 + int textHeight = rect.height(); + if (textHeight > maxTextHeight) { + maxTextHeight = textHeight; + } + } + itemHeight = lineSpacingMultiplier * maxTextHeight; + } + + void smoothScroll(ACTION action) { + cancelFuture(); + if (action == ACTION.FLING || action == ACTION.DAGGLE) { + mOffset = (int) ((totalScrollY % itemHeight + itemHeight) % itemHeight); + if ((float) mOffset > itemHeight / 2.0F) { + mOffset = (int) (itemHeight - (float) mOffset); + } else { + mOffset = -mOffset; + } + } + //停止的时候,位置有偏移,不是全部都能正确停止到中间位置的,这里把文字位置挪回中间去 + mFuture = mExecutor.scheduleWithFixedDelay(new SmoothScrollTimerTask(this, mOffset), 0, 10, TimeUnit.MILLISECONDS); + } + + protected final void scrollBy(float velocityY) { + cancelFuture(); + + mFuture = mExecutor.scheduleWithFixedDelay(new InertiaTimerTask(this, velocityY), 0, VELOCITYFLING, TimeUnit.MILLISECONDS); + } + + public void cancelFuture() { + if (mFuture != null && !mFuture.isCancelled()) { + mFuture.cancel(true); + mFuture = null; + } + } + + /** + * 设置是否循环滚动 + * @param cyclic 是否循环 + */ + public final void setCyclic(boolean cyclic) { + isLoop = cyclic; + } + + public final void setTextSize(float size) { + if (size > 0.0F && !customTextSize) { + textSize = (int) (context.getResources().getDisplayMetrics().density * size); + paintOuterText.setTextSize(textSize); + paintCenterText.setTextSize(textSize); + } + } + + public final void setCurrentItem(int currentItem) { + this.initPosition = currentItem; + totalScrollY = 0;//回归顶部,不然重设setCurrentItem的话位置会偏移的,就会显示出不对位置的数据 + invalidate(); + } + + public final void setOnItemSelectedListener(OnItemSelectedListener OnItemSelectedListener) { + this.onItemSelectedListener = OnItemSelectedListener; + } + + public final void setAdapter(WheelAdapter1 adapter) { + this.adapter = adapter; + remeasure(); + invalidate(); + } + + public final WheelAdapter1 getAdapter() { + return adapter; + } + + public final int getCurrentItem() { + return selectedItem; + } + + protected final void onItemSelected() { + if (onItemSelectedListener != null) { + postDelayed(new OnItemSelectedRunnable(this), 200L); + } + } + + @Override + protected void onDraw(Canvas canvas) { + if (adapter == null) { + return; + } + //可见的item数组 + Object visibles[] = new Object[itemsVisible]; + //滚动的Y值高度除去每行Item的高度,得到滚动了多少个item,即change数 + change = (int) (totalScrollY / itemHeight); + try { + //滚动中实际的预选中的item(即经过了中间位置的item) = 滑动前的位置 + 滑动相对位置 + preCurrentIndex = initPosition + change % adapter.getItemsCount(); + } catch (ArithmeticException e) { + System.out.println("出错了!adapter.getItemsCount() == 0,联动数据不匹配"); + } + if (!isLoop) {//不循环的情况 + if (preCurrentIndex < 0) { + preCurrentIndex = 0; + } + if (preCurrentIndex > adapter.getItemsCount() - 1) { + preCurrentIndex = adapter.getItemsCount() - 1; + } + } else {//循环 + if (preCurrentIndex < 0) {//举个例子:如果总数是5,preCurrentIndex = -1,那么preCurrentIndex按循环来说,其实是0的上面,也就是4的位置 + preCurrentIndex = adapter.getItemsCount() + preCurrentIndex; + } + if (preCurrentIndex > adapter.getItemsCount() - 1) {//同理上面,自己脑补一下 + preCurrentIndex = preCurrentIndex - adapter.getItemsCount(); + } + } + + //跟滚动流畅度有关,总滑动距离与每个item高度取余,即并不是一格格的滚动,每个item不一定滚到对应Rect里的,这个item对应格子的偏移值 + int itemHeightOffset = (int) (totalScrollY % itemHeight); + // 设置数组中每个元素的值 + int counter = 0; + while (counter < itemsVisible) { + int index = preCurrentIndex - (itemsVisible / 2 - counter);//索引值,即当前在控件中间的item看作数据源的中间,计算出相对源数据源的index值 + + //判断是否循环,如果是循环数据源也使用相对循环的position获取对应的item值,如果不是循环则超出数据源范围使用""空白字符串填充,在界面上形成空白无数据的item项 + if (isLoop) { + index = getLoopMappingIndex(index); + visibles[counter] = adapter.getItem(index); + } else if (index < 0) { + visibles[counter] = ""; + } else if (index > adapter.getItemsCount() - 1) { + visibles[counter] = ""; + } else { + visibles[counter] = adapter.getItem(index); + } + + counter++; + + } + + //中间两条横线 + canvas.drawLine(0.0F, firstLineY, measuredWidth, firstLineY, paintIndicator); + canvas.drawLine(0.0F, secondLineY, measuredWidth, secondLineY, paintIndicator); + //单位的Label + if (label != null) { + int drawRightContentStart = measuredWidth - getTextWidth(paintCenterText, label); + //靠右并留出空隙 + canvas.drawText(label, drawRightContentStart - CENTERCONTENTOFFSET, centerY, paintCenterText); + } + counter = 0; + while (counter < itemsVisible) { + canvas.save(); + // L(弧长)=α(弧度)* r(半径) (弧度制) + // 求弧度--> (L * π ) / (π * r) (弧长X派/半圆周长) + float itemHeight = maxTextHeight * lineSpacingMultiplier; + double radian = ((itemHeight * counter - itemHeightOffset) * Math.PI) / halfCircumference; + // 弧度转换成角度(把半圆以Y轴为轴心向右转90度,使其处于第一象限及第四象限 + float angle = (float) (90D - (radian / Math.PI) * 180D); + // 九十度以上的不绘制 + if (angle >= 90F || angle <= -90F) { + canvas.restore(); + } else { + + + String contentText = getContentText(visibles[counter]); + + //计算开始绘制的位置 + measuredCenterContentStart(contentText); + measuredOutContentStart(contentText); + float translateY = (float) (radius - Math.cos(radian) * radius - (Math.sin(radian) * maxTextHeight) / 2D); + //根据Math.sin(radian)来更改canvas坐标系原点,然后缩放画布,使得文字高度进行缩放,形成弧形3d视觉差 + canvas.translate(0.0F, translateY); + canvas.scale(1.0F, (float) Math.sin(radian)); + if (translateY <= firstLineY && maxTextHeight + translateY >= firstLineY) { + // 条目经过第一条线 + canvas.save(); + canvas.clipRect(0, 0, measuredWidth, firstLineY - translateY); + canvas.scale(1.0F, (float) Math.sin(radian) * SCALECONTENT); + canvas.drawText(contentText, drawOutContentStart, maxTextHeight, paintOuterText); + canvas.restore(); + canvas.save(); + canvas.clipRect(0, firstLineY - translateY, measuredWidth, (int) (itemHeight)); + canvas.scale(1.0F, (float) Math.sin(radian) * 1F); + canvas.drawText(contentText, drawCenterContentStart, maxTextHeight - CENTERCONTENTOFFSET, paintCenterText); + canvas.restore(); + } else if (translateY <= secondLineY && maxTextHeight + translateY >= secondLineY) { + // 条目经过第二条线 + canvas.save(); + canvas.clipRect(0, 0, measuredWidth, secondLineY - translateY); + canvas.scale(1.0F, (float) Math.sin(radian) * 1.0F); + canvas.drawText(contentText, drawCenterContentStart, maxTextHeight - CENTERCONTENTOFFSET, paintCenterText); + canvas.restore(); + canvas.save(); + canvas.clipRect(0, secondLineY - translateY, measuredWidth, (int) (itemHeight)); + canvas.scale(1.0F, (float) Math.sin(radian) * SCALECONTENT); + canvas.drawText(contentText, drawOutContentStart, maxTextHeight, paintOuterText); + canvas.restore(); + } else if (translateY >= firstLineY && maxTextHeight + translateY <= secondLineY) { + // 中间条目 + canvas.clipRect(0, 0, measuredWidth, (int) (itemHeight)); + canvas.drawText(contentText, drawCenterContentStart, maxTextHeight - CENTERCONTENTOFFSET, paintCenterText); + int preSelectedItem = adapter.indexOf(visibles[counter]); + if (preSelectedItem != -1) { + selectedItem = preSelectedItem; + } + } else { + // 其他条目 + canvas.save(); + canvas.clipRect(0, 0, measuredWidth, (int) (itemHeight)); + canvas.scale(1.0F, (float) Math.sin(radian) * SCALECONTENT); + canvas.drawText(contentText, drawOutContentStart, maxTextHeight, paintOuterText); + canvas.restore(); + } + canvas.restore(); + } + counter++; + } + } + + //递归计算出对应的index + private int getLoopMappingIndex(int index) { + if (index < 0) { + index = index + adapter.getItemsCount(); + index = getLoopMappingIndex(index); + } else if (index > adapter.getItemsCount() - 1) { + index = index - adapter.getItemsCount(); + index = getLoopMappingIndex(index); + } + return index; + } + + /** + * 根据传进来的对象获取getPickerViewText()方法,来获取需要显示的值 + * @param item 数据源的item + * @return 对应显示的字符串 + */ + private String getContentText(Object item) { + if (item == null) { + return ""; + } + else if (item instanceof IPickerViewData) { + return ((IPickerViewData) item).getPickerViewText(); + } + return item.toString(); + } + + private void measuredCenterContentStart(String content) { + Rect rect = new Rect(); + paintCenterText.getTextBounds(content, 0, content.length(), rect); + switch (mGravity) { + case Gravity.CENTER: + drawCenterContentStart = (int) ((measuredWidth - rect.width()) * 0.5); + break; + case Gravity.LEFT: + drawCenterContentStart = 0; + break; + case Gravity.RIGHT: + drawCenterContentStart = measuredWidth - rect.width(); + break; + } + } + + private void measuredOutContentStart(String content) { + Rect rect = new Rect(); + paintOuterText.getTextBounds(content, 0, content.length(), rect); + switch (mGravity) { + case Gravity.CENTER: + drawOutContentStart = (int) ((measuredWidth - rect.width()) * 0.5); + break; + case Gravity.LEFT: + drawOutContentStart = 0; + break; + case Gravity.RIGHT: + drawOutContentStart = measuredWidth - rect.width(); + break; + } + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + this.widthMeasureSpec = widthMeasureSpec; + remeasure(); + setMeasuredDimension(measuredWidth, measuredHeight); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + boolean eventConsumed = gestureDetector.onTouchEvent(event); + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + startTime = System.currentTimeMillis(); + cancelFuture(); + previousY = event.getRawY(); + break; + + case MotionEvent.ACTION_MOVE: + float dy = previousY - event.getRawY(); + previousY = event.getRawY(); + totalScrollY = (int) (totalScrollY + dy); + + // 边界处理。 + if (!isLoop) { + float top = -initPosition * itemHeight; + float bottom = (adapter.getItemsCount() - 1 - initPosition) * itemHeight; + if (totalScrollY - itemHeight * 0.3 < top) { + top = totalScrollY - dy; + } else if (totalScrollY + itemHeight * 0.3 > bottom) { + bottom = totalScrollY - dy; + } + + if (totalScrollY < top) { + totalScrollY = (int) top; + } else if (totalScrollY > bottom) { + totalScrollY = (int) bottom; + } + } + break; + + case MotionEvent.ACTION_UP: + default: + if (!eventConsumed) { + float y = event.getY(); + double l = Math.acos((radius - y) / radius) * radius; + int circlePosition = (int) ((l + itemHeight / 2) / itemHeight); + + float extraOffset = (totalScrollY % itemHeight + itemHeight) % itemHeight; + mOffset = (int) ((circlePosition - itemsVisible / 2) * itemHeight - extraOffset); + + if ((System.currentTimeMillis() - startTime) > 120) { + // 处理拖拽事件 + smoothScroll(ACTION.DAGGLE); + } else { + // 处理条目点击事件 + smoothScroll(ACTION.CLICK); + } + } + break; + } + invalidate(); + + return true; + } + + /** + * 获取Item个数 + * @return item个数 + */ + public int getItemsCount() { + return adapter != null ? adapter.getItemsCount() : 0; + } + + /** + * 附加在右边的单位字符串 + * @param label 单位 + */ + public void setLabel(String label) { + this.label = label; + } + + public void setGravity(int gravity) { + this.mGravity = gravity; + } + + public int getTextWidth(Paint paint, String str) { + int iRet = 0; + if (str != null && str.length() > 0) { + int len = str.length(); + float[] widths = new float[len]; + paint.getTextWidths(str, widths); + for (int j = 0; j < len; j++) { + iRet += (int) Math.ceil(widths[j]); + } + } + return iRet; + } +} \ No newline at end of file diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/videoplay/LoadingCircleView.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/videoplay/LoadingCircleView.java new file mode 100644 index 0000000000000000000000000000000000000000..4d46f1dfe0b181294be4ddbede1fb0fab9d2d4c1 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/videoplay/LoadingCircleView.java @@ -0,0 +1,138 @@ +package com.jiuqi.elove.widget.videoplay; + + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.RectF; +import android.util.AttributeSet; +import android.view.View; +import android.view.animation.Animation; +import android.view.animation.Transformation; + +/** + * 播放视频加载框 + * Created by dl on 2017/5/17. + */ +public class LoadingCircleView extends View { + + + private Paint paintBgCircle; + + + private Paint paintCircle; + + private Paint paintProgressCircle; + + + private float startAngle = -90f;//开始角度 + + private float sweepAngle = 0;//结束 + + private int progressCirclePadding = 0;//进度圆与背景圆的间距 + + + private boolean fillIn = false;//进度圆是否填充 + + private int animDuration = 2000; + + + private LodingCircleViewAnim mLodingCircleViewAnim;//动画效果 + + + public LoadingCircleView(Context context) { + super(context); + init(); + } + + public LoadingCircleView(Context context, AttributeSet attrs) { + super(context, attrs); + init(); + } + + public LoadingCircleView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(); + } + + public int dip2px(Context context, float dpValue) { + final float scale = context.getResources().getDisplayMetrics().density; + return (int) (dpValue * scale + 0.5f); + } + + + private void init() { + + mLodingCircleViewAnim = new LodingCircleViewAnim(); + mLodingCircleViewAnim.setDuration(animDuration); + progressCirclePadding = dip2px(getContext(), 3); + + paintBgCircle = new Paint(); + paintBgCircle.setAntiAlias(true); + paintBgCircle.setStyle(Paint.Style.FILL); + paintBgCircle.setColor(Color.WHITE); + + + paintCircle = new Paint(); + paintCircle.setAntiAlias(true); + paintCircle.setStyle(Paint.Style.FILL); + paintCircle.setColor(Color.GRAY); + + + paintProgressCircle = new Paint(); + paintProgressCircle.setAntiAlias(true); + paintProgressCircle.setStyle(Paint.Style.FILL); + paintProgressCircle.setColor(Color.WHITE); + + } + + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + canvas.drawCircle(getMeasuredWidth() / 2, getMeasuredWidth() / 2, getMeasuredWidth() / 2, paintBgCircle); + canvas.drawCircle(getMeasuredWidth() / 2, getMeasuredWidth() / 2, getMeasuredWidth() / 2 - progressCirclePadding / 2, paintCircle); + RectF f = new RectF(progressCirclePadding, progressCirclePadding, getMeasuredWidth() - progressCirclePadding, getMeasuredWidth() - progressCirclePadding); + canvas.drawArc(f, startAngle, sweepAngle, true, paintProgressCircle); + if (!fillIn) + canvas.drawCircle(getMeasuredWidth() / 2, getMeasuredWidth() / 2, getMeasuredWidth() / 2 - progressCirclePadding * 2, paintCircle); + + + } + + + public void startAnimAutomatic(boolean fillIn) { + this.fillIn = fillIn; + if (mLodingCircleViewAnim != null) + clearAnimation(); + startAnimation(mLodingCircleViewAnim); + } + + public void stopAnimAutomatic() { + if (mLodingCircleViewAnim != null) + clearAnimation(); + } + + + public void setProgerss(int progerss, boolean fillIn) { + this.fillIn = fillIn; + sweepAngle = (float) (360 / 100.0 * progerss); + invalidate(); + } + + + private class LodingCircleViewAnim extends Animation { + @Override + protected void applyTransformation(float interpolatedTime, Transformation t) { + super.applyTransformation(interpolatedTime, t); + if (interpolatedTime < 1.0f) { + sweepAngle = 360 * interpolatedTime; + invalidate(); + } else { + startAnimAutomatic(fillIn); + } + + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/videoplay/SurfaceVideoView.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/videoplay/SurfaceVideoView.java new file mode 100644 index 0000000000000000000000000000000000000000..1863cec61098c9f5eab782e8d160078f5230e522 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/videoplay/SurfaceVideoView.java @@ -0,0 +1,554 @@ +package com.jiuqi.elove.widget.videoplay; + +import android.content.Context; +import android.graphics.PixelFormat; +import android.media.AudioManager; +import android.media.MediaPlayer; +import android.media.MediaPlayer.OnInfoListener; +import android.media.MediaPlayer.OnVideoSizeChangedListener; +import android.net.Uri; +import android.os.Build; +import android.os.Handler; +import android.os.Message; +import android.text.TextUtils; +import android.util.AttributeSet; +import android.view.KeyEvent; +import android.view.SurfaceHolder; +import android.view.SurfaceHolder.Callback; +import android.view.SurfaceView; + +import java.io.IOException; + + +/** + * Created by dl on 2017/5/17. + */ +public class SurfaceVideoView extends SurfaceView implements Callback { + + /** 定时暂停 */ + private static final int HANDLER_MESSAGE_PARSE = 0; + /** 定时循环 */ + private static final int HANDLER_MESSAGE_LOOP = 1; + + private MediaPlayer.OnCompletionListener mOnCompletionListener; + private MediaPlayer.OnPreparedListener mOnPreparedListener; + private MediaPlayer.OnErrorListener mOnErrorListener; + private MediaPlayer.OnSeekCompleteListener mOnSeekCompleteListener; + private OnInfoListener mOnInfoListener; + private OnVideoSizeChangedListener mOnVideoSizeChangedListener; + private OnPlayStateListener mOnPlayStateListener; + private MediaPlayer mMediaPlayer = null; + private SurfaceHolder mSurfaceHolder = null; + + private MediaPlayer.OnBufferingUpdateListener mOnBufferingUpdateListener; + + private static final int STATE_ERROR = -1; + private static final int STATE_IDLE = 0; + private static final int STATE_PREPARING = 1; + private static final int STATE_PREPARED = 2; + private static final int STATE_PLAYING = 3; + private static final int STATE_PAUSED = 4; + /** + * PlaybackCompleted状态:文件正常播放完毕,而又没有设置循环播放的话就进入该状态, + * 并会触发OnCompletionListener的onCompletion + * ()方法。此时可以调用start()方法重新从头播放文件,也可以stop()停止MediaPlayer,或者也可以seekTo()来重新定位播放位置。 + */ + private static final int STATE_PLAYBACK_COMPLETED = 5; + /** Released/End状态:通过release()方法可以进入End状态 */ + private static final int STATE_RELEASED = 5; + + private int mCurrentState = STATE_IDLE; + private int mTargetState = STATE_IDLE; + + private int mVideoWidth; + private int mVideoHeight; + // private int mSurfaceWidth; + // private int mSurfaceHeight; + + // private float mSystemVolumn = -1; + private int mDuration; + private Uri mUri; + + // SurfaceTextureAvailable + + public SurfaceVideoView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + initVideoView(); + } + + public SurfaceVideoView(Context context) { + super(context); + initVideoView(); + } + + public SurfaceVideoView(Context context, AttributeSet attrs) { + super(context, attrs); + initVideoView(); + } + + @SuppressWarnings("deprecation") + protected void initVideoView() { + // mTryCount = 0; + mVideoWidth = 0; + mVideoHeight = 0; + + getHolder().setFormat(PixelFormat.RGBA_8888); // PixelFormat.RGB_565 + getHolder().addCallback(this); + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { + getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); + } + + setFocusable(true); + setFocusableInTouchMode(true); + requestFocus(); + + mCurrentState = STATE_IDLE; + mTargetState = STATE_IDLE; + } + + /** 更新音量 */ + public static float getSystemVolumn(Context context) { + if (context != null) { + try { + AudioManager mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); + int maxVolumn = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); + return mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC) * 1.0F / maxVolumn; + } catch (UnsupportedOperationException e) { + + } + } + return 0.5F; + } + + public void setOnInfoListener(OnInfoListener l) { + mOnInfoListener = l; + } + + public void setOnVideoSizeChangedListener(OnVideoSizeChangedListener l) { + mOnVideoSizeChangedListener = l; + } + + public void setOnPreparedListener(MediaPlayer.OnPreparedListener l) { + mOnPreparedListener = l; + } + + public void setOnErrorListener(MediaPlayer.OnErrorListener l) { + mOnErrorListener = l; + } + + public void setOnPlayStateListener(OnPlayStateListener l) { + mOnPlayStateListener = l; + } + + public void setOnSeekCompleteListener(MediaPlayer.OnSeekCompleteListener l) { + mOnSeekCompleteListener = l; + } + + /** 方便网络链接加载回调 */ + public void setOnBufferingUpdateListener( + MediaPlayer.OnBufferingUpdateListener l + ){ + mOnBufferingUpdateListener = l; + } + + public static interface OnPlayStateListener { + public void onStateChanged(boolean isPlaying); + } + + public void setOnCompletionListener(MediaPlayer.OnCompletionListener l) { + mOnCompletionListener = l; + } + + public void setVideoPath(String path) { + // && MediaUtils.isNative(path) + if (!TextUtils.isEmpty(path)) { + mTargetState = STATE_PREPARED; + openVideo(Uri.parse(path)); + } + } + + public int getVideoWidth() { + return mVideoWidth; + } + + public int getVideoHeight() { + return mVideoHeight; + } + + public void reOpen() { + mTargetState = STATE_PREPARED; + openVideo(mUri); + } + + public int getDuration() { + return mDuration; + } + + /** 重试 */ + private void tryAgain(Exception e) { + mCurrentState = STATE_ERROR; + openVideo(mUri); + } + + public void start() { + mTargetState = STATE_PLAYING; + //可用状态{Prepared, Started, Paused, PlaybackCompleted} + if (mMediaPlayer != null && (mCurrentState == STATE_PREPARED || mCurrentState == STATE_PAUSED || mCurrentState == STATE_PLAYING || mCurrentState == STATE_PLAYBACK_COMPLETED)) { + try { + if (!isPlaying()) + mMediaPlayer.start(); + mCurrentState = STATE_PLAYING; + if (mOnPlayStateListener != null) + mOnPlayStateListener.onStateChanged(true); + } catch (IllegalStateException e) { + tryAgain(e); + } catch (Exception e) { + tryAgain(e); + } + } + } + + public void pause() { + mTargetState = STATE_PAUSED; + //可用状态{Started, Paused} + if (mMediaPlayer != null && (mCurrentState == STATE_PLAYING)) { + try { + mMediaPlayer.pause(); + mCurrentState = STATE_PAUSED; + if (mOnPlayStateListener != null) + mOnPlayStateListener.onStateChanged(false); + } catch (IllegalStateException e) { + tryAgain(e); + } catch (Exception e) { + tryAgain(e); + } + } + } + + /** 处理音量键 */ + public void dispatchKeyEvent(Context context, KeyEvent event) { + switch (event.getKeyCode()) { + case KeyEvent.KEYCODE_VOLUME_DOWN: + case KeyEvent.KEYCODE_VOLUME_UP: + setVolume(getSystemVolumn(context)); + break; + } + } + + public void setVolume(float volume) { + //可用状态{Idle, Initialized, Stopped, Prepared, Started, Paused, PlaybackCompleted} + if (mMediaPlayer != null && (mCurrentState == STATE_PREPARED || mCurrentState == STATE_PLAYING || mCurrentState == STATE_PAUSED || mCurrentState == STATE_PLAYBACK_COMPLETED)) { + try { + mMediaPlayer.setVolume(volume, volume); + } catch (Exception e) { + + } + } + } + public void setLooping(boolean looping) { + //可用状态{Idle, Initialized, Stopped, Prepared, Started, Paused, PlaybackCompleted} + if (mMediaPlayer != null && (mCurrentState == STATE_PREPARED || mCurrentState == STATE_PLAYING || mCurrentState == STATE_PAUSED || mCurrentState == STATE_PLAYBACK_COMPLETED)) { + try { + mMediaPlayer.setLooping(looping); + } catch (Exception e) { + } + } + } + + public void seekTo(int msec) { + //可用状态{Prepared, Started, Paused, PlaybackCompleted} + if (mMediaPlayer != null && (mCurrentState == STATE_PREPARED || mCurrentState == STATE_PLAYING || mCurrentState == STATE_PAUSED || mCurrentState == STATE_PLAYBACK_COMPLETED)) { + try { + if (msec < 0) + msec = 0; + mMediaPlayer.seekTo(msec); + } catch (IllegalStateException e) { + } catch (Exception e) { + } + } + } + + /** 获取当前播放位置 */ + public int getCurrentPosition() { + int position = 0; + //可用状态{Idle, Initialized, Prepared, Started, Paused, Stopped, PlaybackCompleted} + if (mMediaPlayer != null) { + switch (mCurrentState) { + case STATE_PLAYBACK_COMPLETED: + position = getDuration(); + break; + case STATE_PLAYING: + case STATE_PAUSED: + try { + position = mMediaPlayer.getCurrentPosition(); + } catch (IllegalStateException e) { + } catch (Exception e) { + } + break; + } + } + return position; + } + + public boolean isPlaying() { + //可用状态{Idle, Initialized, Prepared, Started, Paused, Stopped, PlaybackCompleted} + if (mMediaPlayer != null && mCurrentState == STATE_PLAYING) { + try { + return mMediaPlayer.isPlaying(); + } catch (IllegalStateException e) { + } catch (Exception e) { + } + } + return false; + } + + /** 调用release方法以后MediaPlayer无法再恢复使用 */ + public void release() { + mTargetState = STATE_RELEASED; + mCurrentState = STATE_RELEASED; + if (mMediaPlayer != null) { + try { + mMediaPlayer.release(); + } catch (IllegalStateException e) { + } catch (Exception e) { + } + mMediaPlayer = null; + } + } + + public SurfaceHolder getSurfaceHolder() { + return mSurfaceHolder; + } + + /** 支持网络链接 */ + public void openVideo(Uri uri) { + if (uri == null || mSurfaceHolder == null || getContext() == null) { + // not ready for playback just yet, will try again later + if (mSurfaceHolder == null && uri != null) { + mUri = uri; + } + return; + } + + mUri = uri; + mDuration = 0; + + //Idle 状态:当使用new()方法创建一个MediaPlayer对象或者调用了其reset()方法时,该MediaPlayer对象处于idle状态。 + //End 状态:通过release()方法可以进入End状态,只要MediaPlayer对象不再被使用,就应当尽快将其通过release()方法释放掉 + //Initialized 状态:这个状态比较简单,MediaPlayer调用setDataSource()方法就进入Initialized状态,表示此时要播放的文件已经设置好了。 + //Prepared 状态:初始化完成之后还需要通过调用prepare()或prepareAsync()方法,这两个方法一个是同步的一个是异步的,只有进入Prepared状态,才表明MediaPlayer到目前为止都没有错误,可以进行文件播放。 + + Exception exception = null; + try { + if (mMediaPlayer == null) { + mMediaPlayer = new MediaPlayer(); + mMediaPlayer.setOnBufferingUpdateListener(mOnBufferingUpdateListener); + mMediaPlayer.setOnPreparedListener(mPreparedListener); + mMediaPlayer.setOnCompletionListener(mCompletionListener); + mMediaPlayer.setOnErrorListener(mErrorListener); + mMediaPlayer.setOnVideoSizeChangedListener(mVideoSizeChangedListener); + mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); + mMediaPlayer.setOnSeekCompleteListener(mSeekCompleteListener); + mMediaPlayer.setOnInfoListener(mInfoListener); + // mMediaPlayer.setScreenOnWhilePlaying(true); + // mMediaPlayer.setVolume(mSystemVolumn, mSystemVolumn); + mMediaPlayer.setDisplay(mSurfaceHolder); + } else { + mMediaPlayer.reset(); + } + mMediaPlayer.setDataSource(getContext(), uri); + + // if (mLooping) + // mMediaPlayer.setLooping(true);//循环播放 + mMediaPlayer.prepareAsync(); + // we don't set the target state here either, but preserve the + // target state that was there before. + mCurrentState = STATE_PREPARING; + } catch (IOException ex) { + exception = ex; + } catch (IllegalArgumentException ex) { + exception = ex; + } catch (Exception ex) { + exception = ex; + } + if (exception != null) { + mCurrentState = STATE_ERROR; + if (mErrorListener != null) + mErrorListener.onError(mMediaPlayer, MediaPlayer.MEDIA_ERROR_UNKNOWN, 0); + } + } + + private MediaPlayer.OnCompletionListener mCompletionListener = new MediaPlayer.OnCompletionListener() { + @Override + public void onCompletion(MediaPlayer mp) { + mCurrentState = STATE_PLAYBACK_COMPLETED; + // mTargetState = STATE_PLAYBACK_COMPLETED; + if (mOnCompletionListener != null) + mOnCompletionListener.onCompletion(mp); + } + }; + + MediaPlayer.OnPreparedListener mPreparedListener = new MediaPlayer.OnPreparedListener() { + @Override + public void onPrepared(MediaPlayer mp) { + //必须是正常状态 + if (mCurrentState == STATE_PREPARING) { + mCurrentState = STATE_PREPARED; + try { + mDuration = mp.getDuration(); + } catch (IllegalStateException e) { + } + + try { + mVideoWidth = mp.getVideoWidth(); + mVideoHeight = mp.getVideoHeight(); + } catch (IllegalStateException e) { + } + + switch (mTargetState) { + case STATE_PREPARED: + if (mOnPreparedListener != null) + mOnPreparedListener.onPrepared(mMediaPlayer); + break; + case STATE_PLAYING: + start(); + break; + } + } + } + }; + + OnVideoSizeChangedListener mVideoSizeChangedListener = new OnVideoSizeChangedListener() { + + @Override + public void onVideoSizeChanged(MediaPlayer mp, int width, int height) { + mVideoWidth = width; + mVideoHeight = height; + if (mOnVideoSizeChangedListener != null) + mOnVideoSizeChangedListener.onVideoSizeChanged(mp, width, height); + } + + }; + + OnInfoListener mInfoListener = new OnInfoListener() { + + @Override + public boolean onInfo(MediaPlayer mp, int what, int extra) { + if (mOnInfoListener != null) + mOnInfoListener.onInfo(mp, what, extra); + return false; + } + }; + + private MediaPlayer.OnSeekCompleteListener mSeekCompleteListener = new MediaPlayer.OnSeekCompleteListener() { + + @Override + public void onSeekComplete(MediaPlayer mp) { + if (mOnSeekCompleteListener != null) + mOnSeekCompleteListener.onSeekComplete(mp); + } + }; + + private MediaPlayer.OnErrorListener mErrorListener = new MediaPlayer.OnErrorListener() { + @Override + public boolean onError(MediaPlayer mp, int framework_err, int impl_err) { + mCurrentState = STATE_ERROR; + // mTargetState = STATE_ERROR; + //FIX,可以考虑出错以后重新开始 + if (mOnErrorListener != null) + mOnErrorListener.onError(mp, framework_err, impl_err); + + return true; + } + }; + + /** 是否可用 */ + public boolean isPrepared() { + return mMediaPlayer != null && (mCurrentState == STATE_PREPARED); + } + + public boolean isComplate(){ + return mMediaPlayer != null && (mCurrentState == STATE_PLAYBACK_COMPLETED); + } + + /** 是否已经释放 */ + public boolean isRelease() { + return mMediaPlayer == null || mCurrentState == STATE_IDLE || mCurrentState == STATE_ERROR || mCurrentState == STATE_RELEASED; + } + + private Handler mVideoHandler = new Handler() { + @Override + public void handleMessage(Message msg) { + switch (msg.what) { + case HANDLER_MESSAGE_PARSE: + pause(); + break; + case HANDLER_MESSAGE_LOOP: + if (isPlaying()) { + seekTo(msg.arg1); + sendMessageDelayed(mVideoHandler.obtainMessage(HANDLER_MESSAGE_LOOP, msg.arg1, msg.arg2), msg.arg2); + } + break; + default: + break; + } + super.handleMessage(msg); + } + }; + + /** 定时暂停 */ + public void pauseDelayed(int delayMillis) { + if (mVideoHandler.hasMessages(HANDLER_MESSAGE_PARSE)) + mVideoHandler.removeMessages(HANDLER_MESSAGE_PARSE); + mVideoHandler.sendEmptyMessageDelayed(HANDLER_MESSAGE_PARSE, delayMillis); + } + + /** 暂停并且清除定时任务 */ + public void pauseClearDelayed() { + pause(); + if (mVideoHandler.hasMessages(HANDLER_MESSAGE_PARSE)) + mVideoHandler.removeMessages(HANDLER_MESSAGE_PARSE); + if (mVideoHandler.hasMessages(HANDLER_MESSAGE_LOOP)) + mVideoHandler.removeMessages(HANDLER_MESSAGE_LOOP); + } + + /** 区域内循环播放 */ + public void loopDelayed(int startTime, int endTime) { + if (mVideoHandler.hasMessages(HANDLER_MESSAGE_PARSE)) + mVideoHandler.removeMessages(HANDLER_MESSAGE_PARSE); + if (mVideoHandler.hasMessages(HANDLER_MESSAGE_LOOP)) + mVideoHandler.removeMessages(HANDLER_MESSAGE_LOOP); + int delayMillis = endTime - startTime; + seekTo(startTime); + if (!isPlaying()) + start(); + if (mVideoHandler.hasMessages(HANDLER_MESSAGE_LOOP)) + mVideoHandler.removeMessages(HANDLER_MESSAGE_LOOP); + mVideoHandler.sendMessageDelayed(mVideoHandler.obtainMessage(HANDLER_MESSAGE_LOOP, getCurrentPosition(), delayMillis), delayMillis); + } + + @Override + public void surfaceCreated(SurfaceHolder holder) { + boolean needReOpen = (mSurfaceHolder == null); + mSurfaceHolder = holder; + if (needReOpen) { + reOpen(); + } + } + + @Override + public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { + mSurfaceHolder = holder; + } + + @Override + public void surfaceDestroyed(SurfaceHolder holder) { + mSurfaceHolder = null; + release(); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/videoplay/SurfaceVideoViewCreator.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/videoplay/SurfaceVideoViewCreator.java new file mode 100644 index 0000000000000000000000000000000000000000..b21efb2ae959a4c379e223a9a3b215dc2825ce1b --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/widget/videoplay/SurfaceVideoViewCreator.java @@ -0,0 +1,339 @@ +package com.jiuqi.elove.widget.videoplay; + +import android.annotation.TargetApi; +import android.app.Activity; +import android.media.MediaPlayer; +import android.os.AsyncTask; +import android.os.Build; +import android.os.Environment; +import android.util.DisplayMetrics; +import android.util.Log; +import android.util.TypedValue; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.RelativeLayout; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.common.Constant; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; +/** + * 播放缘圈视频 + * Created by dl on 2017/5/17. + */ +public abstract class SurfaceVideoViewCreator + implements + SurfaceVideoView.OnPlayStateListener, MediaPlayer.OnErrorListener, + MediaPlayer.OnPreparedListener, View.OnClickListener, MediaPlayer.OnCompletionListener, + MediaPlayer.OnInfoListener +{ + + private SurfaceVideoView surfaceVideoView; + private LoadingCircleView progressBar; + private Button statusButton; + private ImageView surface_video_screenshot; + + private File videoFile = null; + private boolean isUseCache = false; + private boolean mNeedResume; + + public boolean debugModel = false; + + protected abstract Activity getActivity(); + protected abstract boolean setAutoPlay(); + protected abstract int getSurfaceWidth(); + protected abstract int geturfaceHeight(); + protected abstract void setThumbImage(ImageView thumbImageView); + protected abstract String getSecondVideoCachePath(); + protected abstract String getVideoPath(); + + public void setUseCache(boolean useCache){ + this.isUseCache = useCache; + } + + public SurfaceVideoViewCreator(Activity activity, ViewGroup container) + { + View view = LayoutInflater + .from(activity) + .inflate(R.layout.surface_video_view_layout,container,false); + + container.addView(view); + + surfaceVideoView = (SurfaceVideoView) view.findViewById(R.id.surface_video_view); + progressBar = (LoadingCircleView) view.findViewById(R.id.surface_video_progress); + statusButton = (Button) view.findViewById(R.id.surface_video_button); + surface_video_screenshot = (ImageView) view.findViewById(R.id.surface_video_screenshot); + int width = getSurfaceWidth(); + int height = geturfaceHeight(); + if(width != 0 && height!=0){ + /** 默认就是手机宽度 */ +// surfaceVideoView.getLayoutParams().width = width; + RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(width,height); + lp.addRule(RelativeLayout.CENTER_IN_PARENT); + surfaceVideoView.setLayoutParams(lp); + surface_video_screenshot.setLayoutParams(lp); + } + setThumbImage(surface_video_screenshot); +// view.findViewById(R.id.surface_video_container).getLayoutParams().height +// = +// (int) TypedValue.applyDimension +// ( +// TypedValue.COMPLEX_UNIT_DIP, geturfaceHeight(), container.getContext().getResources().getDisplayMetrics() +// ); +// view.findViewById(R.id.surface_video_container).requestLayout(); + + surfaceVideoView.setOnPreparedListener(this); + surfaceVideoView.setOnPlayStateListener(this); + surfaceVideoView.setOnErrorListener(this); + surfaceVideoView.setOnInfoListener(this); + surfaceVideoView.setOnCompletionListener(this); + + surfaceVideoView.setOnClickListener(this); + + if(setAutoPlay()) { + prepareStart(getVideoPath()); + }else { + statusButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + /** 点击即加载 */ + /** 这里进行本地是否存在判断 */ + prepareStart(getVideoPath()); + } + }); + } + } + + private void prepareStart(String videoPath){ + try{ + String rootPath = Constant.CIRCLE_VIDEO_PATH; + File file = new File(rootPath); + if(!file.exists()){ + if(!file.mkdirs()){ + throw new NullPointerException("创建 rootPath 失败,注意 6.0+ 的动态申请权限"); + } + } + + String[] temp = videoPath.split("/"); + videoFile = + new File(Constant.CIRCLE_VIDEO_PATH+temp[temp.length-1]); + + if(debugModel){ + /** 测试模式 */ + if(isUseCache){ + play(videoFile.getAbsolutePath()); + }else{ + if(videoFile.exists()){ + videoFile.delete(); + videoFile.createNewFile(); + } + new MyAsyncTask().execute(getVideoPath()); + } + return; + } + /** 实际情况 */ + if(videoFile.exists()){ /** 存在缓存 */ + play(videoFile.getAbsolutePath()); + }else{ + String secondCacheFilePath = getSecondVideoCachePath(); /** 第二缓存目录,应对此种情况,例如,本地上传是一个目录,那么就可能要到这个目录找一下 */ + if(secondCacheFilePath != null){ + play(secondCacheFilePath); + return; + } + videoFile.createNewFile(); + new MyAsyncTask().execute(getVideoPath()); /** 下载再播放 */ + } + + }catch (Exception e){ + Log.d("zzzzz",e.toString()); + } + } + + public void onKeyEvent(KeyEvent event){ + switch (event.getKeyCode()) {// 跟随系统音量走 + case KeyEvent.KEYCODE_VOLUME_DOWN: + case KeyEvent.KEYCODE_VOLUME_UP: + if (!getActivity().isFinishing()) + surfaceVideoView.dispatchKeyEvent(getActivity(), event); + break; + } + } + + public void onDestroy(){ + progressBar = null; + statusButton = null; + interceptFlag = true; + if (surfaceVideoView != null) { + surfaceVideoView.release(); + surfaceVideoView = null; + } + } + + public void onResume(){ + if (surfaceVideoView != null && mNeedResume) { + mNeedResume = false; + interceptFlag = false; + if (surfaceVideoView.isRelease()) + surfaceVideoView.reOpen(); + else + surfaceVideoView.start(); + } + } + + public void onPause(){ + if (surfaceVideoView != null) { + if (surfaceVideoView.isPlaying()) { + mNeedResume = true; + surfaceVideoView.pause(); + } + } + } + + private void play(String path){ + if(!surfaceVideoView.isPlaying()){ + progressBar.setVisibility(View.GONE); + statusButton.setVisibility(View.GONE); + surfaceVideoView.setVideoPath(path); + } + } + + @Override + public void onCompletion(MediaPlayer mp) { + if (!getActivity().isFinishing()) + surfaceVideoView.reOpen(); + } + + @Override + public boolean onError(MediaPlayer mp, int what, int extra) { + Log.d("zzzzz","播放失败 onError "+what); + return false; + } + + @TargetApi(Build.VERSION_CODES.JELLY_BEAN) + @Override + public boolean onInfo(MediaPlayer mp, int what, int extra) { + switch (what) { + case MediaPlayer.MEDIA_INFO_BAD_INTERLEAVING: + /** 音频和视频数据不正确 */ + Log.d("zzzzz","音频和视频数据不正确 "); + break; + case MediaPlayer.MEDIA_INFO_BUFFERING_START: /** 缓冲开始 */ + if (!getActivity().isFinishing()) { + surfaceVideoView.pause(); + } + break; + case MediaPlayer.MEDIA_INFO_BUFFERING_END: /** 缓冲结束 */ + if (!getActivity().isFinishing()) + surfaceVideoView.start(); + break; + case MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START: /** 渲染开始 rendering */ + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + surfaceVideoView.setBackground(null); + } else { + surfaceVideoView.setBackgroundDrawable(null); + } + break; + } + return false; + } + + @Override + public void onPrepared(MediaPlayer mp) { + Log.d("zzzzz","播放开始 onPrepared "); + surfaceVideoView.setVolume(SurfaceVideoView.getSystemVolumn(getActivity())); + surfaceVideoView.start(); + //progressBar.setVisibility(View.GONE); + surface_video_screenshot.setVisibility(View.GONE); + } + + @Override + public void onClick(View v) { + getActivity().finish(); + } + + @Override + public void onStateChanged(boolean isPlaying) { + statusButton.setVisibility(isPlaying ? View.GONE : View.VISIBLE); + } + + + /** 内部下载类,微信的机制是下载好再播放的,也可以直接边下载边播放 */ + private boolean interceptFlag = false; + private class MyAsyncTask extends AsyncTask { + + @Override + protected void onPreExecute() { + super.onPreExecute(); + statusButton.setVisibility(View.GONE); + progressBar.setVisibility(View.VISIBLE); + } + + @Override + protected String doInBackground(String[] params) { + try { + String urlPath = params[0]; + URL url = new URL(urlPath); + + HttpURLConnection conn = (HttpURLConnection)url.openConnection(); + conn.connect(); + int length = conn.getContentLength(); + InputStream is = conn.getInputStream(); + + FileOutputStream fos = new FileOutputStream(videoFile); + int count = 0; + byte buf[] = new byte[1024]; + + do{ + int numread = is.read(buf); + count += numread; + int progress =(int)(((float)count / length) * 100); + //更新进度 + Log.d("zzzzz","更新进度 "+progress); + if(numread <= 0){ + publishProgress(100); + break; + }else{ + publishProgress(progress); + } + fos.write(buf,0,numread); + }while(!interceptFlag);//点击取消就停止下载. + Log.d("zzzzz","下载结束 "); + fos.close(); + is.close(); + } catch (MalformedURLException e) { + Log.d("zzzzz",e.toString()); + } catch(IOException e){ + // Toast.makeText(App.context,"安卓6.0+ 请动态申请文件读取权限",Toast.LENGTH_LONG).show(); + Log.d("zzzzz",e.toString()); + } + return null; + } + + @Override + protected void onProgressUpdate(Integer[] values) { + if(progressBar == null) + return; + int progress = values[0]; + progressBar.setProgerss(progress,true); + if(progress >= 100){ + Log.d("zzzzz","开始播放 "); + play(videoFile.getAbsolutePath()); + } + } + + @Override + protected void onPostExecute(String o) { + super.onPostExecute(o); + } + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/wxapi/WBShareActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/wxapi/WBShareActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..43a93ba5479428274ae2ec51d009e3202cc4386e --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/wxapi/WBShareActivity.java @@ -0,0 +1,9 @@ +package com.jiuqi.elove.wxapi; + +import com.umeng.socialize.media.WBShareCallBackActivity; + +/** + * Created by wangfei on 15/12/3. + */ +public class WBShareActivity extends WBShareCallBackActivity{ +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/wxapi/WXEntryActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/wxapi/WXEntryActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..f9a3c733f2ebb970cea8301e1d142369d14750fc --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/wxapi/WXEntryActivity.java @@ -0,0 +1,22 @@ +package com.jiuqi.elove.wxapi; + + +import android.os.Bundle; + +import com.umeng.socialize.weixin.view.WXCallbackActivity; + +/** + * Created by ntop on 15/9/4. + */ +public class WXEntryActivity extends WXCallbackActivity { + @Override + protected void onCreate(Bundle savedInstanceState) { + try{ + super.onCreate(savedInstanceState); + }catch (Exception e){ + finish(); +// e.printStackTrace(); + } + + } +} diff --git a/JQ_ELOVE/src/main/java/com/jiuqi/elove/wxapi/WXPayEntryActivity.java b/JQ_ELOVE/src/main/java/com/jiuqi/elove/wxapi/WXPayEntryActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..7024537789ff72e0c254f067a662c9926d589b86 --- /dev/null +++ b/JQ_ELOVE/src/main/java/com/jiuqi/elove/wxapi/WXPayEntryActivity.java @@ -0,0 +1,120 @@ +package com.jiuqi.elove.wxapi; + +import android.app.Activity; +import android.content.Intent; +import android.os.Bundle; +import android.util.Log; + +import com.jiuqi.elove.R; +import com.jiuqi.elove.activity.EActDetailActivity2_0_3; +import com.jiuqi.elove.activity.MyRedbeanActivity; +import com.jiuqi.elove.activity.OrderDetailActivity254; +import com.jiuqi.elove.activity.OrderManagementActivity; +import com.jiuqi.elove.activity.PayForRedbeanActivity; +import com.jiuqi.elove.activity.RedbeanListActivity; +import com.jiuqi.elove.activity.WaitingAndSelectPayTypeActivity254; +import com.jiuqi.elove.common.Constant; +import com.jiuqi.elove.util.JqStrUtil; +import com.tencent.mm.sdk.modelbase.BaseReq; +import com.tencent.mm.sdk.modelbase.BaseResp; +import com.tencent.mm.sdk.openapi.IWXAPI; +import com.tencent.mm.sdk.openapi.IWXAPIEventHandler; +import com.tencent.mm.sdk.openapi.WXAPIFactory; + +/** + * Created by liulin on 2016/9/27. + * 微信支付成功显示页面 + */ +public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler { + + private static final String TAG = "WXPayEntryActivity"; + + private IWXAPI api; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); +// setContentView(R.layout.pay_result); + + // 通过WXAPIFactory工厂,获取IWXAPI的实例 + api = WXAPIFactory.createWXAPI(this, Constant.WX_APPID, false); + api.handleIntent(getIntent(), this); + } + + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + setIntent(intent); + api.handleIntent(intent, this); + } + + @Override + public void onReq(BaseReq req) { + } + + /** + * 得到支付结果回调 + */ + @Override + public void onResp(BaseResp resp) { + Log.d(TAG, "onPayFinish, errCode = " + resp.errCode);// 支付结果码 + String result; + switch (resp.errCode) { + case BaseResp.ErrCode.ERR_OK: + result = getResources().getString(R.string.errcode_success); + if(OrderManagementActivity.instance!=null){ + OrderManagementActivity.instance.refresh(); + } + if(EActDetailActivity2_0_3.instance!=null){ + EActDetailActivity2_0_3.instance.refresh(); + } + if(WaitingAndSelectPayTypeActivity254.instance!=null){ + WaitingAndSelectPayTypeActivity254.instance.finish(); + } + if(WaitingAndSelectPayTypeActivity254.instance!=null){ + WaitingAndSelectPayTypeActivity254.instance.finish(); + if(OrderDetailActivity254.instance!=null){ + OrderDetailActivity254.instance.refresh(); + }else{ + Intent intent = new Intent(WXPayEntryActivity.this,OrderDetailActivity254.class); + intent.putExtra("ordernum",WaitingAndSelectPayTypeActivity254.instance.ordernum); + startActivity(intent); + } + } + if(PayForRedbeanActivity.instance!=null){ + PayForRedbeanActivity.instance.finish(); + if(RedbeanListActivity.instance!=null){ + RedbeanListActivity.instance.refresh(); + }else if(RedbeanListActivity.instance==null){ + Intent intent = new Intent(WXPayEntryActivity.this,RedbeanListActivity.class); + startActivity(intent); + } + if(MyRedbeanActivity.instance!=null){ + MyRedbeanActivity.instance.refresh(); + } + } + + break; + case BaseResp.ErrCode.ERR_USER_CANCEL: + result = getResources().getString(R.string.errcode_cancel); + break; + case BaseResp.ErrCode.ERR_AUTH_DENIED: + result = getResources().getString(R.string.errcode_deny); + break; + case BaseResp.ErrCode.ERR_COMM: + result = "微信状态异常"; + break; + case BaseResp.ErrCode.ERR_SENT_FAILED: + result = "发送失败"; + break; + case BaseResp.ErrCode.ERR_UNSUPPORT: + result = "不支持哦"; + break; + default: + result = getResources().getString(R.string.errcode_unknown); + break; + } + JqStrUtil.showToast(getApplicationContext(),result); + finish(); + } +} \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/anim/activity_close.xml b/JQ_ELOVE/src/main/res/anim/activity_close.xml new file mode 100644 index 0000000000000000000000000000000000000000..86fb53bd07680a2cc78bd29e320799055b309f22 --- /dev/null +++ b/JQ_ELOVE/src/main/res/anim/activity_close.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/anim/activity_fade_out.xml b/JQ_ELOVE/src/main/res/anim/activity_fade_out.xml new file mode 100644 index 0000000000000000000000000000000000000000..42367027316e744532872ea85233676eb4eb2bb5 --- /dev/null +++ b/JQ_ELOVE/src/main/res/anim/activity_fade_out.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/anim/activity_open.xml b/JQ_ELOVE/src/main/res/anim/activity_open.xml new file mode 100644 index 0000000000000000000000000000000000000000..a98387bc9368c2438198a1f96fd597da09ac06e8 --- /dev/null +++ b/JQ_ELOVE/src/main/res/anim/activity_open.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/anim/circle_enter_anim.xml b/JQ_ELOVE/src/main/res/anim/circle_enter_anim.xml new file mode 100644 index 0000000000000000000000000000000000000000..fa686c9dc771da61150d413230849d28404fa110 --- /dev/null +++ b/JQ_ELOVE/src/main/res/anim/circle_enter_anim.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/anim/circle_exit_anim.xml b/JQ_ELOVE/src/main/res/anim/circle_exit_anim.xml new file mode 100644 index 0000000000000000000000000000000000000000..90cc7c62911cb95b9c2e21f6c517c766ba1cdfa1 --- /dev/null +++ b/JQ_ELOVE/src/main/res/anim/circle_exit_anim.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/anim/pop_enter_anim.xml b/JQ_ELOVE/src/main/res/anim/pop_enter_anim.xml new file mode 100644 index 0000000000000000000000000000000000000000..2f022c00282746b468638a0072c2ceab9b27c7f9 --- /dev/null +++ b/JQ_ELOVE/src/main/res/anim/pop_enter_anim.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/anim/pop_exit_anim.xml b/JQ_ELOVE/src/main/res/anim/pop_exit_anim.xml new file mode 100644 index 0000000000000000000000000000000000000000..17de5458b31bfc438069f69e80ab733dc03825bb --- /dev/null +++ b/JQ_ELOVE/src/main/res/anim/pop_exit_anim.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/anim/reverse_anim.xml b/JQ_ELOVE/src/main/res/anim/reverse_anim.xml new file mode 100644 index 0000000000000000000000000000000000000000..19209153b63dcc5328faec42d10190f3e452f21c --- /dev/null +++ b/JQ_ELOVE/src/main/res/anim/reverse_anim.xml @@ -0,0 +1,11 @@ + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/anim/rotating.xml b/JQ_ELOVE/src/main/res/anim/rotating.xml new file mode 100644 index 0000000000000000000000000000000000000000..8fffa4989a82a0ad253a6ddc8edb154a895d2caf --- /dev/null +++ b/JQ_ELOVE/src/main/res/anim/rotating.xml @@ -0,0 +1,11 @@ + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/anim/slide_in.xml b/JQ_ELOVE/src/main/res/anim/slide_in.xml new file mode 100644 index 0000000000000000000000000000000000000000..d024ea0e9ee8c779e62dc27f8e5704794ed98ff0 --- /dev/null +++ b/JQ_ELOVE/src/main/res/anim/slide_in.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/anim/slide_in_bottom.xml b/JQ_ELOVE/src/main/res/anim/slide_in_bottom.xml new file mode 100644 index 0000000000000000000000000000000000000000..bfbf597794adda5bf28208aa6a8750a3ec1228ac --- /dev/null +++ b/JQ_ELOVE/src/main/res/anim/slide_in_bottom.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/anim/slide_out.xml b/JQ_ELOVE/src/main/res/anim/slide_out.xml new file mode 100644 index 0000000000000000000000000000000000000000..30f53fa2e6e902f7494af1348a14d1f6592a44d4 --- /dev/null +++ b/JQ_ELOVE/src/main/res/anim/slide_out.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/anim/slide_out_bottom.xml b/JQ_ELOVE/src/main/res/anim/slide_out_bottom.xml new file mode 100644 index 0000000000000000000000000000000000000000..6fde776344365be5a1e3a9b09db7cfaf0f51a2d7 --- /dev/null +++ b/JQ_ELOVE/src/main/res/anim/slide_out_bottom.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/anim/umeng_socialize_fade_in.xml b/JQ_ELOVE/src/main/res/anim/umeng_socialize_fade_in.xml new file mode 100644 index 0000000000000000000000000000000000000000..075b19f67c6c8024d13cb5055f72b184183ac15e --- /dev/null +++ b/JQ_ELOVE/src/main/res/anim/umeng_socialize_fade_in.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/anim/umeng_socialize_fade_out.xml b/JQ_ELOVE/src/main/res/anim/umeng_socialize_fade_out.xml new file mode 100644 index 0000000000000000000000000000000000000000..6c0d876fbe2140b4aa8edd29b149b14b8a4e9c5d --- /dev/null +++ b/JQ_ELOVE/src/main/res/anim/umeng_socialize_fade_out.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/anim/umeng_socialize_shareboard_animation_in.xml b/JQ_ELOVE/src/main/res/anim/umeng_socialize_shareboard_animation_in.xml new file mode 100644 index 0000000000000000000000000000000000000000..669055ade92251d252bd6a6760e7b14f5c05f4ef --- /dev/null +++ b/JQ_ELOVE/src/main/res/anim/umeng_socialize_shareboard_animation_in.xml @@ -0,0 +1,17 @@ + + + + + + + diff --git a/JQ_ELOVE/src/main/res/anim/umeng_socialize_shareboard_animation_out.xml b/JQ_ELOVE/src/main/res/anim/umeng_socialize_shareboard_animation_out.xml new file mode 100644 index 0000000000000000000000000000000000000000..a17c9dd587684c3fbaf4468f5dc042aa116657b9 --- /dev/null +++ b/JQ_ELOVE/src/main/res/anim/umeng_socialize_shareboard_animation_out.xml @@ -0,0 +1,8 @@ + + + + + diff --git a/JQ_ELOVE/src/main/res/anim/umeng_socialize_slide_in_from_bottom.xml b/JQ_ELOVE/src/main/res/anim/umeng_socialize_slide_in_from_bottom.xml new file mode 100644 index 0000000000000000000000000000000000000000..ab964cf2645d71a97ef13a228e81e21a129e4184 --- /dev/null +++ b/JQ_ELOVE/src/main/res/anim/umeng_socialize_slide_in_from_bottom.xml @@ -0,0 +1,7 @@ + + diff --git a/JQ_ELOVE/src/main/res/anim/umeng_socialize_slide_out_from_bottom.xml b/JQ_ELOVE/src/main/res/anim/umeng_socialize_slide_out_from_bottom.xml new file mode 100644 index 0000000000000000000000000000000000000000..b583023859fccc71ad99bbf9653bd431aa6b6c73 --- /dev/null +++ b/JQ_ELOVE/src/main/res/anim/umeng_socialize_slide_out_from_bottom.xml @@ -0,0 +1,7 @@ + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/color/click_style.xml b/JQ_ELOVE/src/main/res/color/click_style.xml new file mode 100644 index 0000000000000000000000000000000000000000..6768aba3e01350e2f1177f58b16e4f6fc2f57e1d --- /dev/null +++ b/JQ_ELOVE/src/main/res/color/click_style.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable-hdpi/em_app_pref_bg.9.png b/JQ_ELOVE/src/main/res/drawable-hdpi/em_app_pref_bg.9.png new file mode 100644 index 0000000000000000000000000000000000000000..c9a634ce12d4ba657860c591141d30f4dd925a6b Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-hdpi/em_app_pref_bg.9.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-hdpi/em_seabar_input.9.png b/JQ_ELOVE/src/main/res/drawable-hdpi/em_seabar_input.9.png new file mode 100644 index 0000000000000000000000000000000000000000..f9388351c6bc11c187fd69e5e0f8d97fb41a1ee1 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-hdpi/em_seabar_input.9.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-hdpi/giftdialog_send_orange_bottomradius8.xml b/JQ_ELOVE/src/main/res/drawable-hdpi/giftdialog_send_orange_bottomradius8.xml new file mode 100644 index 0000000000000000000000000000000000000000..d261cd9255648e7ec44e0a06a915fc97e577afad --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable-hdpi/giftdialog_send_orange_bottomradius8.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable-hdpi/indicator_normal.xml b/JQ_ELOVE/src/main/res/drawable-hdpi/indicator_normal.xml new file mode 100644 index 0000000000000000000000000000000000000000..a5b08f91f92df87cb0a4a5265cf313adc9d1b8ee --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable-hdpi/indicator_normal.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable-hdpi/indicator_selected.xml b/JQ_ELOVE/src/main/res/drawable-hdpi/indicator_selected.xml new file mode 100644 index 0000000000000000000000000000000000000000..c1e92030f63bd700805487d63785962547543e11 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable-hdpi/indicator_selected.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable-hdpi/richpush_btn_selector.xml b/JQ_ELOVE/src/main/res/drawable-hdpi/richpush_btn_selector.xml new file mode 100644 index 0000000000000000000000000000000000000000..4750de92cf857dff98473958c54df51f698ae319 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable-hdpi/richpush_btn_selector.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable-hdpi/selector_pickerview_btn.xml b/JQ_ELOVE/src/main/res/drawable-hdpi/selector_pickerview_btn.xml new file mode 100644 index 0000000000000000000000000000000000000000..9ebc219e5da6b35b922f6a9871e83ae8ccc47523 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable-hdpi/selector_pickerview_btn.xml @@ -0,0 +1,6 @@ + + + + + diff --git a/JQ_ELOVE/src/main/res/drawable-hdpi/umeng_socialize_light_bar_bg_pad.9.png b/JQ_ELOVE/src/main/res/drawable-hdpi/umeng_socialize_light_bar_bg_pad.9.png new file mode 100644 index 0000000000000000000000000000000000000000..b2b4974661fbeee9f755004fc15fc2dbf085063c Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-hdpi/umeng_socialize_light_bar_bg_pad.9.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-hdpi/umeng_socialize_nav_bar_bg_pad.9.png b/JQ_ELOVE/src/main/res/drawable-hdpi/umeng_socialize_nav_bar_bg_pad.9.png new file mode 100644 index 0000000000000000000000000000000000000000..10651c58938648104c69b1ba01be1e9c26929160 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-hdpi/umeng_socialize_nav_bar_bg_pad.9.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-hdpi/umeng_socialize_oauth_check_off.png b/JQ_ELOVE/src/main/res/drawable-hdpi/umeng_socialize_oauth_check_off.png new file mode 100644 index 0000000000000000000000000000000000000000..cc3279174974b7b59004b710feee875f82d5e48b Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-hdpi/umeng_socialize_oauth_check_off.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-hdpi/umeng_socialize_oauth_check_on.png b/JQ_ELOVE/src/main/res/drawable-hdpi/umeng_socialize_oauth_check_on.png new file mode 100644 index 0000000000000000000000000000000000000000..acb7ba78925610f44edf986ae2afe3284ba8eb2d Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-hdpi/umeng_socialize_oauth_check_on.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/add_map.png b/JQ_ELOVE/src/main/res/drawable-nodpi/add_map.png new file mode 100644 index 0000000000000000000000000000000000000000..510bc42d6eeec2c36698438009b8719253a3038b Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/add_map.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/btn_dropdown.xml b/JQ_ELOVE/src/main/res/drawable-nodpi/btn_dropdown.xml new file mode 100644 index 0000000000000000000000000000000000000000..db56fe6e217a0fd70d68cf4981201302c68de7b5 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable-nodpi/btn_dropdown.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/circle_comment.png b/JQ_ELOVE/src/main/res/drawable-nodpi/circle_comment.png new file mode 100644 index 0000000000000000000000000000000000000000..6235519df5aadf4e4747b626f8fce866217ade2b Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/circle_comment.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/circle_focus_false.png b/JQ_ELOVE/src/main/res/drawable-nodpi/circle_focus_false.png new file mode 100644 index 0000000000000000000000000000000000000000..c449688c18e34fc226344c8ad9db86f234d6720b Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/circle_focus_false.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/circle_focus_true.png b/JQ_ELOVE/src/main/res/drawable-nodpi/circle_focus_true.png new file mode 100644 index 0000000000000000000000000000000000000000..c74df8096ff5a9bb011bca13776eed1aed57561d Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/circle_focus_true.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/circle_focus_un.png b/JQ_ELOVE/src/main/res/drawable-nodpi/circle_focus_un.png new file mode 100644 index 0000000000000000000000000000000000000000..d4984efb99cfcbdf21c3de67e17bd836b8ea9d79 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/circle_focus_un.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/circle_jubao.png b/JQ_ELOVE/src/main/res/drawable-nodpi/circle_jubao.png new file mode 100644 index 0000000000000000000000000000000000000000..620553be7bdf55e0c7f9b8a3659c3b3325627443 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/circle_jubao.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/circle_like.png b/JQ_ELOVE/src/main/res/drawable-nodpi/circle_like.png new file mode 100644 index 0000000000000000000000000000000000000000..b65a81a082cd7a0c78ee9f7d9f10d55645d39a79 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/circle_like.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/circle_like_on.png b/JQ_ELOVE/src/main/res/drawable-nodpi/circle_like_on.png new file mode 100644 index 0000000000000000000000000000000000000000..9e458e55cc5cfcaa172624af099a9f8d24526493 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/circle_like_on.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/circle_shoucang_false.png b/JQ_ELOVE/src/main/res/drawable-nodpi/circle_shoucang_false.png new file mode 100644 index 0000000000000000000000000000000000000000..e128f0c944c8d8e1de727ec1afa24c1eb81fef3e Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/circle_shoucang_false.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/circle_shoucang_true.png b/JQ_ELOVE/src/main/res/drawable-nodpi/circle_shoucang_true.png new file mode 100644 index 0000000000000000000000000000000000000000..a263f7143d55ae99f16c3103abae07cb8c9200b1 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/circle_shoucang_true.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/del_map.png b/JQ_ELOVE/src/main/res/drawable-nodpi/del_map.png new file mode 100644 index 0000000000000000000000000000000000000000..5b30053fd21310e8c99d299e96178c978efe0d9a Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/del_map.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/ic_check_dir.png b/JQ_ELOVE/src/main/res/drawable-nodpi/ic_check_dir.png new file mode 100644 index 0000000000000000000000000000000000000000..a11a793a08b7d75823326bc1d74427b43c5874b9 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/ic_check_dir.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/ic_media_empty.png b/JQ_ELOVE/src/main/res/drawable-nodpi/ic_media_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..7ec077493ab8ac343fe7d54328c6de78652a97d8 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/ic_media_empty.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/ic_search.png b/JQ_ELOVE/src/main/res/drawable-nodpi/ic_search.png new file mode 100644 index 0000000000000000000000000000000000000000..1afcb183d0a7ee094ec74c0bc4e8f183598d1945 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/ic_search.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/ic_search_clear.png b/JQ_ELOVE/src/main/res/drawable-nodpi/ic_search_clear.png new file mode 100644 index 0000000000000000000000000000000000000000..964d4523015c2053170a285c4c2e6d193c5afaaf Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/ic_search_clear.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/ic_video_flag.png b/JQ_ELOVE/src/main/res/drawable-nodpi/ic_video_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..c6b03c7590fb43eaac9ef3540177c37693aa18c5 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/ic_video_flag.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/ic_video_play.png b/JQ_ELOVE/src/main/res/drawable-nodpi/ic_video_play.png new file mode 100644 index 0000000000000000000000000000000000000000..9af789281a51654d35f59b4d5c1c43c30e1687d0 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/ic_video_play.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/icon_close.png b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_close.png new file mode 100644 index 0000000000000000000000000000000000000000..d2a91c7893cd96051df72280ef3b55f3c768b653 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_close.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/icon_company_on.png b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_company_on.png new file mode 100644 index 0000000000000000000000000000000000000000..08498d03a812b6341cf9ed9cc9fa4848ba6e75bf Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_company_on.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/icon_company_on_else.png b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_company_on_else.png new file mode 100644 index 0000000000000000000000000000000000000000..24bb8f4edc5b535838a0903127f396ebdc072c8b Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_company_on_else.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/icon_company_un.png b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_company_un.png new file mode 100644 index 0000000000000000000000000000000000000000..64f3a8567fbf0320b42fd1e775af7121013e9adb Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_company_un.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/icon_company_un_else.png b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_company_un_else.png new file mode 100644 index 0000000000000000000000000000000000000000..e671b3fc517320f2a9f0d53a4a9192bb94582ba1 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_company_un_else.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/icon_downarrow.png b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_downarrow.png new file mode 100644 index 0000000000000000000000000000000000000000..fae39c83dd8e6769de5258541e6e4b9b00b31d7c Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_downarrow.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/icon_extend.png b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_extend.png new file mode 100644 index 0000000000000000000000000000000000000000..14d52796e8e784fd840893157ff64f78ae19fc7c Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_extend.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/icon_gift_notify.png b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_gift_notify.png new file mode 100644 index 0000000000000000000000000000000000000000..ced79ffc440762f77ea3452230ce8f9e0f0d4c21 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_gift_notify.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/icon_hobby.png b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_hobby.png new file mode 100644 index 0000000000000000000000000000000000000000..8ecc736bfe87628435027dbdd66e1cef8f5fc995 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_hobby.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/icon_homepage_bg.png b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_homepage_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..b994f34e71974a21d29a4691c73b59291dda3cc5 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_homepage_bg.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/icon_idcard_on.png b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_idcard_on.png new file mode 100644 index 0000000000000000000000000000000000000000..af0b9fda86812e5e28a205c9716433455650e54b Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_idcard_on.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/icon_idcard_un.png b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_idcard_un.png new file mode 100644 index 0000000000000000000000000000000000000000..c7ec7e20f4407e8264a53c446433cbf6a648980e Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_idcard_un.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/icon_juhe.png b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_juhe.png new file mode 100644 index 0000000000000000000000000000000000000000..382f7d4e2ef01f138e8e59b8720f51214475f4da Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_juhe.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/icon_leftarrow.png b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_leftarrow.png new file mode 100644 index 0000000000000000000000000000000000000000..47f2d61231bb5a0d57e9f463b829f323e1e84b84 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_leftarrow.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/icon_leftarrow_w.png b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_leftarrow_w.png new file mode 100644 index 0000000000000000000000000000000000000000..cee348f6dd85e7baa40feb7c3d0dd82ce7b31a75 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_leftarrow_w.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/icon_login_register.png b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_login_register.png new file mode 100644 index 0000000000000000000000000000000000000000..5c28a08d40a781b9f318f4ff2f0149a4119c7aed Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_login_register.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/icon_mark.png b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_mark.png new file mode 100644 index 0000000000000000000000000000000000000000..da269603275c116527f88fe3f41f93b2a9e0a026 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_mark.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/icon_mobile_on.png b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_mobile_on.png new file mode 100644 index 0000000000000000000000000000000000000000..f04b92d23f11e810b2e40e092f54b4a6c19309a1 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_mobile_on.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/icon_mobile_un.png b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_mobile_un.png new file mode 100644 index 0000000000000000000000000000000000000000..8114c2ac3578c45ee01d1ea3bf5e8931a471a734 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_mobile_un.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/icon_nearby.png b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_nearby.png new file mode 100644 index 0000000000000000000000000000000000000000..171a7f4028e543d9148b049376d570f75506d518 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_nearby.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/icon_qingnian_on.png b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_qingnian_on.png new file mode 100644 index 0000000000000000000000000000000000000000..31925021ec1e3b099356ed0a2bdc56a421a91979 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_qingnian_on.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/icon_qingnian_un.png b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_qingnian_un.png new file mode 100644 index 0000000000000000000000000000000000000000..398ee93c9151c84f71cdfab2b2f39d7f8aab2541 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_qingnian_un.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/icon_remove.png b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_remove.png new file mode 100644 index 0000000000000000000000000000000000000000..1b055b3059da9dcbbea693b7dc55de5364857ace Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_remove.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/icon_reply.png b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_reply.png new file mode 100644 index 0000000000000000000000000000000000000000..f73d7b7c489a13840da772a7bc1a30aff5818e96 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_reply.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/icon_retract.png b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_retract.png new file mode 100644 index 0000000000000000000000000000000000000000..27a9cac00390c374d77aa88743deb085d9eedcf3 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_retract.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/icon_sex.png b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_sex.png new file mode 100644 index 0000000000000000000000000000000000000000..273bee78060cd9d4fa2586d349a0a1c7f61b6e32 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_sex.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/icon_share_circle.png b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_share_circle.png new file mode 100644 index 0000000000000000000000000000000000000000..dc136187c6ae105d69f465d4fd1400b66ad06007 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_share_circle.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/icon_topic_publish.png b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_topic_publish.png new file mode 100644 index 0000000000000000000000000000000000000000..b5583f4e59f26cd91e5ddf23f8813e0cfba95941 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_topic_publish.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/icon_uparrow.png b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_uparrow.png new file mode 100644 index 0000000000000000000000000000000000000000..fa2607eacd77cba848d41a3039646d115930a90a Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/icon_uparrow.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/image_choose.png b/JQ_ELOVE/src/main/res/drawable-nodpi/image_choose.png new file mode 100644 index 0000000000000000000000000000000000000000..57012cb9c644de61ab8f659990120c48bbe12518 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/image_choose.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/image_not_chose.png b/JQ_ELOVE/src/main/res/drawable-nodpi/image_not_chose.png new file mode 100644 index 0000000000000000000000000000000000000000..1415caedf7f7062c72056f8100b546b1e05d10ed Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/image_not_chose.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/img_select_checkbox.xml b/JQ_ELOVE/src/main/res/drawable-nodpi/img_select_checkbox.xml new file mode 100644 index 0000000000000000000000000000000000000000..8bcf2cf1b84acc644ec6eef1c7eba76d7e0e8356 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable-nodpi/img_select_checkbox.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/info_edit.png b/JQ_ELOVE/src/main/res/drawable-nodpi/info_edit.png new file mode 100644 index 0000000000000000000000000000000000000000..6c12adcfb6ee7cf387ead0d24061d20361ba6982 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/info_edit.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/lw_sendgift.png b/JQ_ELOVE/src/main/res/drawable-nodpi/lw_sendgift.png new file mode 100644 index 0000000000000000000000000000000000000000..206f88b4fe0795a5092c29d969e41d81bf972f81 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/lw_sendgift.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/other_center_focus_on.png b/JQ_ELOVE/src/main/res/drawable-nodpi/other_center_focus_on.png new file mode 100644 index 0000000000000000000000000000000000000000..f0cb3b99549a4d8212adeccffaff19a7248c6edd Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/other_center_focus_on.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/other_center_focus_un.png b/JQ_ELOVE/src/main/res/drawable-nodpi/other_center_focus_un.png new file mode 100644 index 0000000000000000000000000000000000000000..d9a71180985c2154ca1db86bef4b51af81a352d5 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/other_center_focus_un.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/other_center_say.png b/JQ_ELOVE/src/main/res/drawable-nodpi/other_center_say.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f12458e94cad6794190b886f4420291539c237 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/other_center_say.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/phone_editor.png b/JQ_ELOVE/src/main/res/drawable-nodpi/phone_editor.png new file mode 100644 index 0000000000000000000000000000000000000000..6c12adcfb6ee7cf387ead0d24061d20361ba6982 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/phone_editor.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/picker_item_bg.xml b/JQ_ELOVE/src/main/res/drawable-nodpi/picker_item_bg.xml new file mode 100644 index 0000000000000000000000000000000000000000..92bbc8f5e60979bfa01df25d18647a0bfb46fca7 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable-nodpi/picker_item_bg.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/qy_zx.png b/JQ_ELOVE/src/main/res/drawable-nodpi/qy_zx.png new file mode 100644 index 0000000000000000000000000000000000000000..df54f3e95e6cb96ea24e1010398ea8057b0c7138 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/qy_zx.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/refresh.png b/JQ_ELOVE/src/main/res/drawable-nodpi/refresh.png new file mode 100644 index 0000000000000000000000000000000000000000..a912c8062d65b900628c903a189a3552da09112d Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/refresh.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/refresh_ding.png b/JQ_ELOVE/src/main/res/drawable-nodpi/refresh_ding.png new file mode 100644 index 0000000000000000000000000000000000000000..bfd6c860383dfa55e6cd35f9fc6ff0b7fc372af4 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/refresh_ding.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/selector_indicator_normal.png b/JQ_ELOVE/src/main/res/drawable-nodpi/selector_indicator_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..01a138777d8395158b154077a0cd99ec1c929555 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/selector_indicator_normal.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/selector_indicator_pressed.png b/JQ_ELOVE/src/main/res/drawable-nodpi/selector_indicator_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..dc878a11b6e4dff7fefa96de6e390a1832bd63fb Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/selector_indicator_pressed.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/sys_recommend.png b/JQ_ELOVE/src/main/res/drawable-nodpi/sys_recommend.png new file mode 100644 index 0000000000000000000000000000000000000000..971bf58a50e0538768d6ff0109cc994f505136d7 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/sys_recommend.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/today_vistor.png b/JQ_ELOVE/src/main/res/drawable-nodpi/today_vistor.png new file mode 100644 index 0000000000000000000000000000000000000000..6db92e16cff1a5b7694fe7e89a3b3175be37c69d Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/today_vistor.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/total_vistor.png b/JQ_ELOVE/src/main/res/drawable-nodpi/total_vistor.png new file mode 100644 index 0000000000000000000000000000000000000000..057a6de76a29adfef338dc297911b81714995f95 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/total_vistor.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/wdzj.png b/JQ_ELOVE/src/main/res/drawable-nodpi/wdzj.png new file mode 100644 index 0000000000000000000000000000000000000000..1e027cb6e0111e3ef1ccb4313354740466c67195 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/wdzj.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-nodpi/yuanfen_test.png b/JQ_ELOVE/src/main/res/drawable-nodpi/yuanfen_test.png new file mode 100644 index 0000000000000000000000000000000000000000..7e9324d3d7e578c3feabbce8802bf5c7eeb689d8 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-nodpi/yuanfen_test.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/activity_selected.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/activity_selected.png new file mode 100644 index 0000000000000000000000000000000000000000..9a68208eec2b84207ba1ba76ff1c53c0accc217c Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/activity_selected.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/activity_unselect.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/activity_unselect.png new file mode 100644 index 0000000000000000000000000000000000000000..199894c86b8b7fa1b518ad748ccdaaa849cf5f8b Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/activity_unselect.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/add_video_photo.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/add_video_photo.png new file mode 100644 index 0000000000000000000000000000000000000000..6290cd5f196a8f2c46d844038b0a2285adc1c86c Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/add_video_photo.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/alipay.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/alipay.png new file mode 100644 index 0000000000000000000000000000000000000000..c842e9557bf5ef4ac19fc3d2922fdbe184370a81 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/alipay.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/answer_checked.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/answer_checked.png new file mode 100644 index 0000000000000000000000000000000000000000..9628768fa51357a1e6a8b8ca7b75772563bffdf4 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/answer_checked.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/answer_uncheck.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/answer_uncheck.png new file mode 100644 index 0000000000000000000000000000000000000000..d3c2e19197c7a0e8c4c1e3164964b9e8960fa272 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/answer_uncheck.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/card_full_on.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/card_full_on.png new file mode 100644 index 0000000000000000000000000000000000000000..d7b10edfa46c10a6fa893342e20406a79d8f30a2 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/card_full_on.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/card_full_out.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/card_full_out.png new file mode 100644 index 0000000000000000000000000000000000000000..5eade0c1d313cfca2acfd38d1a7898595e31aabc Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/card_full_out.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/card_money_on.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/card_money_on.png new file mode 100644 index 0000000000000000000000000000000000000000..0822f89f59fa38814a7979f742545286e93bee40 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/card_money_on.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/card_money_out.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/card_money_out.png new file mode 100644 index 0000000000000000000000000000000000000000..2aec864d96727ff2458c68c9807e124827ac9482 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/card_money_out.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/card_timeout.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/card_timeout.png new file mode 100644 index 0000000000000000000000000000000000000000..a4b9f9a85f0ab196423539bc761eaec6e3f9b0dd Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/card_timeout.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/card_used.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/card_used.png new file mode 100644 index 0000000000000000000000000000000000000000..e966805e86a2da66a40279d10dbe9d2c76e7cd5c Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/card_used.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/community_select.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/community_select.png new file mode 100644 index 0000000000000000000000000000000000000000..e5052e2138ae3ec0d2ea6e5f462dfcb9d6d4c364 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/community_select.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/community_unselect.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/community_unselect.png new file mode 100644 index 0000000000000000000000000000000000000000..76448e8b196fa1264608c0aa10782ac197ba9bcb Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/community_unselect.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/ease_group_icon.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/ease_group_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..93fa4e74a986283cc8ffc8905f69c01f39aae2e6 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/ease_group_icon.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/em_add_public_group.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/em_add_public_group.png new file mode 100644 index 0000000000000000000000000000000000000000..0e3c7067ca30c1ba3eca69a96b84701b2bc88cec Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/em_add_public_group.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/em_create_group.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/em_create_group.png new file mode 100644 index 0000000000000000000000000000000000000000..1bbaf503eefac87a51cff2c7e986575c371a826b Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/em_create_group.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/em_dx_checkbox_off.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/em_dx_checkbox_off.png new file mode 100644 index 0000000000000000000000000000000000000000..e55765af75f21d4f2d502cd88f13662a96c9b57a Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/em_dx_checkbox_off.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/em_dx_checkbox_on.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/em_dx_checkbox_on.png new file mode 100644 index 0000000000000000000000000000000000000000..3cbed23e75a6b7d35b9a6b407d3536600492423c Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/em_dx_checkbox_on.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/em_group_icon.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/em_group_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a7c870291af3154dfd19bae0b99ca4e34f3a787f Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/em_group_icon.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/em_groups_icon.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/em_groups_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..de87ce8cd47f7145c9fff3ba4ae3aa1f16a8285a Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/em_groups_icon.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/em_msg_state_fail_resend.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/em_msg_state_fail_resend.png new file mode 100644 index 0000000000000000000000000000000000000000..b7461400012edf6423c8d9431c3e051d023b6be5 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/em_msg_state_fail_resend.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/em_msg_state_fail_resend_pressed.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/em_msg_state_fail_resend_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..d7942159482ef3ffe56f6ca3dfd69da17bbf3be1 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/em_msg_state_fail_resend_pressed.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/em_roominfo_add_btn_normal.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/em_roominfo_add_btn_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..fff0b05331dd84a7c2e06aaf4c803b52362197ac Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/em_roominfo_add_btn_normal.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/em_roominfo_add_btn_pressed.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/em_roominfo_add_btn_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..e9f05269feeb487b311332fa8ffbe27a8c618080 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/em_roominfo_add_btn_pressed.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/em_search_bar_icon_normal.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/em_search_bar_icon_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..e1f0f0b26a4a34d8a11058714099edd181e62e9a Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/em_search_bar_icon_normal.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/em_smiley_add_btn_nor.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/em_smiley_add_btn_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..b267b5dd720690416a954dedccc924eef968710b Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/em_smiley_add_btn_nor.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/em_smiley_add_btn_pressed.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/em_smiley_add_btn_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..c841564f5e93c823fd8a3ec641c0a94a999dbbbf Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/em_smiley_add_btn_pressed.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/em_smiley_minus_btn_nor.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/em_smiley_minus_btn_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..4949b06d807b9675b1945708309adb94405067e4 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/em_smiley_minus_btn_nor.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/em_smiley_minus_btn_pressed.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/em_smiley_minus_btn_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..b4c8247fa5dea81e2de10f2e8b5525e096ff165b Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/em_smiley_minus_btn_pressed.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/emotion_invite_on.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/emotion_invite_on.png new file mode 100644 index 0000000000000000000000000000000000000000..4dcf5256a4ef5effc09a458563a1c14a1eb72fce Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/emotion_invite_on.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/emotion_test.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/emotion_test.png new file mode 100644 index 0000000000000000000000000000000000000000..2a4518b1d363b037fb0dae9f8d1400270f59dea4 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/emotion_test.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/expert_reply_buble.9.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/expert_reply_buble.9.png new file mode 100644 index 0000000000000000000000000000000000000000..a53b10a6283ac0af49bd46834e10e6bb09f93c07 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/expert_reply_buble.9.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/first.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/first.png new file mode 100644 index 0000000000000000000000000000000000000000..f0fa9b9f4bfb7a8a73bf4a23186036b4bca5f28c Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/first.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/fourth.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/fourth.png new file mode 100644 index 0000000000000000000000000000000000000000..8c24563a291d19e6e14e1f71269e6b3d566f1f31 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/fourth.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/homepage_filter_icon.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/homepage_filter_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..549099bc421db0eb23566c3b1997fd984076b3b7 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/homepage_filter_icon.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/homepage_mobile_auth.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/homepage_mobile_auth.png new file mode 100644 index 0000000000000000000000000000000000000000..8b55f8b3e8c7c0257ed8af6a2912bb5267d68bf8 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/homepage_mobile_auth.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/homepage_notify_perfect.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/homepage_notify_perfect.png new file mode 100644 index 0000000000000000000000000000000000000000..fd999b879639ee257aad2f235cc2d953a89ca68e Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/homepage_notify_perfect.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/homepage_selected.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/homepage_selected.png new file mode 100644 index 0000000000000000000000000000000000000000..bd708db2826ff1b60c8da96abf85951879bd12df Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/homepage_selected.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/homepage_unselect.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/homepage_unselect.png new file mode 100644 index 0000000000000000000000000000000000000000..d212453fe2c0975ab89713274088ad3959b0ba86 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/homepage_unselect.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/ic_directory_folder.9.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/ic_directory_folder.9.png new file mode 100644 index 0000000000000000000000000000000000000000..d11b99a5080f0af6a4a7c24df25ba1f0ca64654a Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/ic_directory_folder.9.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/ic_richpush_actionbar_back.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/ic_richpush_actionbar_back.png new file mode 100644 index 0000000000000000000000000000000000000000..d6745197f14dc595194c31c3221a4830cf60eee1 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/ic_richpush_actionbar_back.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/ic_richpush_actionbar_divider.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/ic_richpush_actionbar_divider.png new file mode 100644 index 0000000000000000000000000000000000000000..6539a1e649807740972e2ca706f3264909728288 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/ic_richpush_actionbar_divider.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_account.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_account.png new file mode 100644 index 0000000000000000000000000000000000000000..e5aa5bc1c4cc5e3efe91113a6f48846221e40958 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_account.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_act_locate.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_act_locate.png new file mode 100644 index 0000000000000000000000000000000000000000..d253300d4643eab7ae0c6e3261bc08e5e6f34eb0 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_act_locate.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_add_label.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_add_label.png new file mode 100644 index 0000000000000000000000000000000000000000..4880edb088fb289986364d343e6f73bb95b101b4 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_add_label.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_add_with_border.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_add_with_border.png new file mode 100644 index 0000000000000000000000000000000000000000..e1d8a589bd6adeb0053cf7b55c5b8994b78d810e Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_add_with_border.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_age_select.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_age_select.png new file mode 100644 index 0000000000000000000000000000000000000000..55dc9f17c9e223feca3d47ba2aa1701c131da153 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_age_select.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_answer_next.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_answer_next.png new file mode 100644 index 0000000000000000000000000000000000000000..bf413ba10b2c69aac73fe861a6057c19a8718b50 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_answer_next.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_answer_pre.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_answer_pre.png new file mode 100644 index 0000000000000000000000000000000000000000..949a9f818fa0de7b924af2b257d64db2fc65d116 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_answer_pre.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_arrowdown.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_arrowdown.png new file mode 100644 index 0000000000000000000000000000000000000000..ca3aef53db3ca7ce9faf3a7c82cec0fe783f003e Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_arrowdown.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_arrowup.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_arrowup.png new file mode 100644 index 0000000000000000000000000000000000000000..60bdd004029f00bfe76bacc92b21da2293d59a6c Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_arrowup.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_audio_record.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_audio_record.png new file mode 100644 index 0000000000000000000000000000000000000000..ed9386949b9ce301b02d8e455f086fdb49ffdd5f Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_audio_record.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_baolu.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_baolu.png new file mode 100644 index 0000000000000000000000000000000000000000..d4c6fb1629399a792e4645de62693bc53e23d3b2 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_baolu.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_black.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_black.png new file mode 100644 index 0000000000000000000000000000000000000000..f7827857678c5fe44316f825832aaac2eabefa11 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_black.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_boy_blue.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_boy_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..22428a22293f11c9c688f39ad8b362c27f1f2159 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_boy_blue.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_cancle.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_cancle.png new file mode 100644 index 0000000000000000000000000000000000000000..da173cf068b33ddbbbcdadad8349dc34adbb06d4 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_cancle.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_card_explanation.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_card_explanation.png new file mode 100644 index 0000000000000000000000000000000000000000..b263b1f1cc3a4fcc851a044c243c11c85ba6a074 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_card_explanation.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_circle_address.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_circle_address.png new file mode 100644 index 0000000000000000000000000000000000000000..4a3f2c284b9976acdc36ee8ba5e6a3c8e2d7f7c2 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_circle_address.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_circle_arrordown.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_circle_arrordown.png new file mode 100644 index 0000000000000000000000000000000000000000..6b756211f1abf9f9fa4f2f361eb941690eb2f79d Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_circle_arrordown.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_circle_comment.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_circle_comment.png new file mode 100644 index 0000000000000000000000000000000000000000..551286165144869039d4a426e3343c1a6c0228b7 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_circle_comment.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_comment_prompt.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_comment_prompt.png new file mode 100644 index 0000000000000000000000000000000000000000..39df8a1ed0450e57d1a5a23d1e3125e7a4762e23 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_comment_prompt.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_crown.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_crown.png new file mode 100644 index 0000000000000000000000000000000000000000..003ead44ab6e7bc1a8e8d088ffe53dbbbccc7914 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_crown.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_dcus.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_dcus.png new file mode 100644 index 0000000000000000000000000000000000000000..2bbf01ed8e7790d5442f63bc636130e88fe9995d Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_dcus.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_delete.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_delete.png new file mode 100644 index 0000000000000000000000000000000000000000..7b0f4609e3fb02ecc762137fd000a8e64cd414b2 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_delete.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_discuss.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_discuss.png new file mode 100644 index 0000000000000000000000000000000000000000..dd33a9c9bb14550b9bae52e2b9837ff28887c6e6 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_discuss.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_eact_adds.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_eact_adds.png new file mode 100644 index 0000000000000000000000000000000000000000..3c151d736797222547020f993dae454e7854f8f0 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_eact_adds.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_feiren.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_feiren.png new file mode 100644 index 0000000000000000000000000000000000000000..6840a57fce0c59bd414d5e41c6348fc73b275f01 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_feiren.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_feitou.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_feitou.png new file mode 100644 index 0000000000000000000000000000000000000000..143852cf9b6a9cd39e5cdf558c660acb3cf20b6a Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_feitou.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_findperson.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_findperson.png new file mode 100644 index 0000000000000000000000000000000000000000..a2758ecd01a0f01584056fce0e547e09cdaeccc5 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_findperson.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_focus_gray.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_focus_gray.png new file mode 100644 index 0000000000000000000000000000000000000000..a5029e2899ed7fdca73a757bdbc12fcfd27c10c0 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_focus_gray.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_focus_pink.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_focus_pink.png new file mode 100644 index 0000000000000000000000000000000000000000..c750f7ea309129eb402d363218b586fd31ae57a4 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_focus_pink.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_girl_pink.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_girl_pink.png new file mode 100644 index 0000000000000000000000000000000000000000..36be7e5eb138350ac7c01e8d29d6f67506191fbb Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_girl_pink.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_holder.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_holder.png new file mode 100644 index 0000000000000000000000000000000000000000..52e30b12567cbc909c9683d302efc5ff1d247f40 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_holder.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_idcard.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_idcard.png new file mode 100644 index 0000000000000000000000000000000000000000..ecceb1f5280a961e6e03a312a41f422d9b433848 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_idcard.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_idcard_add.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_idcard_add.png new file mode 100644 index 0000000000000000000000000000000000000000..a41858020bd213055eef76b72a47ac127145762b Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_idcard_add.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_idcard_deafult.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_idcard_deafult.png new file mode 100644 index 0000000000000000000000000000000000000000..a17fe1ee418b352f49ed253f278f46f8fd85ca23 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_idcard_deafult.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_idcard_prompt.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_idcard_prompt.png new file mode 100644 index 0000000000000000000000000000000000000000..49260c4ee360422cb0a6ae654cab82c84ac9e05c Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_idcard_prompt.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_invite.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_invite.png new file mode 100644 index 0000000000000000000000000000000000000000..cbe92ede4d9868ffb7e7cbc1fe878cd07c276744 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_invite.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_is_video.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_is_video.png new file mode 100644 index 0000000000000000000000000000000000000000..9db2ea8c962228e5c30b3a76ad84ce20fb50af08 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_is_video.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_label_delete.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_label_delete.png new file mode 100644 index 0000000000000000000000000000000000000000..7b12faa166af5310ab07c6fe9f01e5318260923f Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_label_delete.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_leftarrow.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_leftarrow.png new file mode 100644 index 0000000000000000000000000000000000000000..47f2d61231bb5a0d57e9f463b829f323e1e84b84 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_leftarrow.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_like.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_like.png new file mode 100644 index 0000000000000000000000000000000000000000..583cfc0a30bd4a64fae21fbbf4e93952c6ea846b Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_like.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_like_grayborder_large.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_like_grayborder_large.png new file mode 100644 index 0000000000000000000000000000000000000000..76a6571ea29a1e1f058a0f9a9dace836dc4430dd Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_like_grayborder_large.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_like_red.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_like_red.png new file mode 100644 index 0000000000000000000000000000000000000000..2cfe429b31f3b52f1c3a777d6bf74b581e9515c2 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_like_red.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_like_redborder_large.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_like_redborder_large.png new file mode 100644 index 0000000000000000000000000000000000000000..c29b98b31fdeb608ab4e00ffa282e5da290e6624 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_like_redborder_large.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_like_redborder_small.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_like_redborder_small.png new file mode 100644 index 0000000000000000000000000000000000000000..534732120f64d33eef8b8a5d1b8ab535ad95e81b Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_like_redborder_small.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_looknum.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_looknum.png new file mode 100644 index 0000000000000000000000000000000000000000..014e9ef6307c936efe3ab5cdbe1b397fa232a648 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_looknum.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_mohu.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_mohu.png new file mode 100644 index 0000000000000000000000000000000000000000..a6105bedb48e7f1521910bbbaab88aca77a14038 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_mohu.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_money_gray.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_money_gray.png new file mode 100644 index 0000000000000000000000000000000000000000..96601ca95dd894748772f11f8384dd21562221ec Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_money_gray.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_more_white.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_more_white.png new file mode 100644 index 0000000000000000000000000000000000000000..b343eb5d544c8aaed35ac0769394c95c9f0a9512 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_more_white.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_msg.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_msg.png new file mode 100644 index 0000000000000000000000000000000000000000..71fe98f0ce8a80891c3101025b2c723a4fa574ec Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_msg.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_myact.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_myact.png new file mode 100644 index 0000000000000000000000000000000000000000..cfcdff71520804f15ed977843e937f5b593cb452 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_myact.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_myinfo_video.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_myinfo_video.png new file mode 100644 index 0000000000000000000000000000000000000000..c110cf6768fc4ffeb03cace3c3202f442d76ecc3 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_myinfo_video.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_name_card.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_name_card.png new file mode 100644 index 0000000000000000000000000000000000000000..888e783868abcdb929099bbfaf207e20e829c97c Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_name_card.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_near.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_near.png new file mode 100644 index 0000000000000000000000000000000000000000..27fa26d15a3232e089385863d95b477cd93cfe36 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_near.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_no_comment.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_no_comment.png new file mode 100644 index 0000000000000000000000000000000000000000..09b49009cbf776a110349e6be9894a7f36b85fac Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_no_comment.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_password.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_password.png new file mode 100644 index 0000000000000000000000000000000000000000..9eaa94c6554ab35eba95986ced617b26f1339013 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_password.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_pay_redbean.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_pay_redbean.png new file mode 100644 index 0000000000000000000000000000000000000000..90cfccf634a593f7e49817e87a194ed3ed115b82 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_pay_redbean.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_people.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_people.png new file mode 100644 index 0000000000000000000000000000000000000000..3f9787f57748db0e0ca63fc50a40057b214ec47c Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_people.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_phone.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_phone.png new file mode 100644 index 0000000000000000000000000000000000000000..ae99576f079b1bb7b4c81d9460844ee7af23fd73 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_phone.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_qa_publish.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_qa_publish.png new file mode 100644 index 0000000000000000000000000000000000000000..d3d2b748ec931b201423e3eccf43d91f6b6a7022 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_qa_publish.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_qingxie.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_qingxie.png new file mode 100644 index 0000000000000000000000000000000000000000..06a4efff229a1301e45054cb6dec19af03226067 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_qingxie.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_qq_gray.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_qq_gray.png new file mode 100644 index 0000000000000000000000000000000000000000..55f760251ed389ab35d46ef2c4820e14360af07a Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_qq_gray.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_questionimg_close.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_questionimg_close.png new file mode 100644 index 0000000000000000000000000000000000000000..70b32dce3a0ab86964964b3b9220c60dbe304fcf Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_questionimg_close.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_realname.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_realname.png new file mode 100644 index 0000000000000000000000000000000000000000..f8d92ed6be5e197114a5e591371982615cf4ba55 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_realname.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_recommend_bg.9.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_recommend_bg.9.png new file mode 100644 index 0000000000000000000000000000000000000000..c69e965fd57628d7c964a8449e9047eb1fb46ef4 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_recommend_bg.9.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_reward.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_reward.png new file mode 100644 index 0000000000000000000000000000000000000000..947bf571d58897d7b6808ba7112dc1d4f2050ae6 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_reward.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_reward_action.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_reward_action.png new file mode 100644 index 0000000000000000000000000000000000000000..2ef675b85cead8b593dfeedf95b3e14731b8547d Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_reward_action.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_rightarrow.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_rightarrow.png new file mode 100644 index 0000000000000000000000000000000000000000..b0d87f475643410ea258aa0d03d9abe8aa61c914 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_rightarrow.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_scan.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_scan.png new file mode 100644 index 0000000000000000000000000000000000000000..f594fa305f9f33f55ebd4789b0f8a580d59d7434 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_scan.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_search.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_search.png new file mode 100644 index 0000000000000000000000000000000000000000..a665e5f9f09b0356fd157d354f465a9ef0aaa077 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_search.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_setting.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_setting.png new file mode 100644 index 0000000000000000000000000000000000000000..c0f0b1b1185f863cde819c935d2258713b3a47ff Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_setting.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_sex_boy.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_sex_boy.png new file mode 100644 index 0000000000000000000000000000000000000000..37827e11f50c6832e162760d4d44a3f032ed4179 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_sex_boy.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_sex_girl.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_sex_girl.png new file mode 100644 index 0000000000000000000000000000000000000000..405b45394e9882ba5e355b118d81b83470d759c3 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_sex_girl.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_share.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_share.png new file mode 100644 index 0000000000000000000000000000000000000000..f0174efd07e49aceaeee971d56bdcc85f881612a Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_share.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_sharenum.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_sharenum.png new file mode 100644 index 0000000000000000000000000000000000000000..a595610173be127ce1cc9d37581f96aa84cf43ac Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_sharenum.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_sign.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..c199981fe25f552d1a9a8e38c4667493de14042c Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_sign.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_sina_gray.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_sina_gray.png new file mode 100644 index 0000000000000000000000000000000000000000..170caa29a623b2a7af8980ba20df47a98fbbe95e Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_sina_gray.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_sysmsg.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_sysmsg.png new file mode 100644 index 0000000000000000000000000000000000000000..a61058bc5de81b8d91fa3447c924431f42e28f86 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_sysmsg.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_time.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_time.png new file mode 100644 index 0000000000000000000000000000000000000000..1fac7775968fd4605dc1ccd53b0a4181c11eca58 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_time.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_true.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_true.png new file mode 100644 index 0000000000000000000000000000000000000000..1cfa7d8808d4be5e32f7efef86694ecdc2bf8e29 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_true.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_view.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_view.png new file mode 100644 index 0000000000000000000000000000000000000000..300404ab0d62b3c4ac2453e4cd2557f5250e11e4 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_view.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_wechat_gray.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_wechat_gray.png new file mode 100644 index 0000000000000000000000000000000000000000..1a7b9f44fb54f1b73e6da5675f2c0f17b07300f4 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_wechat_gray.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_zhedang.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_zhedang.png new file mode 100644 index 0000000000000000000000000000000000000000..2671704bc64dd0b306bf6a8f7db2b1b67b5ed912 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/icon_zhedang.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/img_album.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/img_album.png new file mode 100644 index 0000000000000000000000000000000000000000..a199c069369e8229b192955723c1b9e1cd7d904c Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/img_album.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/img_default_boy.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/img_default_boy.png new file mode 100644 index 0000000000000000000000000000000000000000..e139af7d72423b1479566c327a2a903e96605851 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/img_default_boy.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/img_default_girl.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/img_default_girl.png new file mode 100644 index 0000000000000000000000000000000000000000..c41d8e00698dfe245225d952c12fe7fa036bcf11 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/img_default_girl.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/img_dialog_cancel.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/img_dialog_cancel.png new file mode 100644 index 0000000000000000000000000000000000000000..9d9284c6081f2ab1fb3a46e3a2cb1a16534a79a7 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/img_dialog_cancel.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/img_dialog_delete.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/img_dialog_delete.png new file mode 100644 index 0000000000000000000000000000000000000000..e705579f4774869b64401c114f418ff5661b1152 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/img_dialog_delete.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/img_dialog_like.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/img_dialog_like.png new file mode 100644 index 0000000000000000000000000000000000000000..89552e021c19ee59adc937bac96badf1ed1169d6 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/img_dialog_like.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/img_linkphone.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/img_linkphone.png new file mode 100644 index 0000000000000000000000000000000000000000..5a5462c73d3b3530e7c4f5e8ccd5f27103200805 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/img_linkphone.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/img_nodata.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/img_nodata.png new file mode 100644 index 0000000000000000000000000000000000000000..07c4f03f3b66f6a68333da9e0a4d7ad55f08dca2 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/img_nodata.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/img_other_default.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/img_other_default.png new file mode 100644 index 0000000000000000000000000000000000000000..15fe6d1ada23beaa75a672489ae5a04ca5cc4325 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/img_other_default.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/img_play_video.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/img_play_video.png new file mode 100644 index 0000000000000000000000000000000000000000..e98f97784d6c5c5fec452333a2451a0325a44d51 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/img_play_video.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/img_radio_checked.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/img_radio_checked.png new file mode 100644 index 0000000000000000000000000000000000000000..87bee1f2ab6df422702235db1393d3398f8320f5 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/img_radio_checked.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/img_radio_unchecked.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/img_radio_unchecked.png new file mode 100644 index 0000000000000000000000000000000000000000..fcda72b4566daabf30d477c6ff8dad37d35a5e6a Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/img_radio_unchecked.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/img_recommend_avatar.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/img_recommend_avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..98f0bee9a6263bae87fa8b73036112998848c575 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/img_recommend_avatar.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/img_record_video.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/img_record_video.png new file mode 100644 index 0000000000000000000000000000000000000000..15234c83f72b2e20989afb434ff467b7df82abe6 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/img_record_video.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/loading.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/loading.png new file mode 100644 index 0000000000000000000000000000000000000000..3d8518c23a54fd80d1274d06c0921a6ae9b0b03a Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/loading.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/loading_homepage.gif b/JQ_ELOVE/src/main/res/drawable-xhdpi/loading_homepage.gif new file mode 100644 index 0000000000000000000000000000000000000000..f168b70233f6ba817f1209dec2aa7450182520f1 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/loading_homepage.gif differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/login_background.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/login_background.png new file mode 100644 index 0000000000000000000000000000000000000000..f8d564180f49b812f8d71e8cca9d19fac1a96a1a Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/login_background.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_as.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_as.png new file mode 100644 index 0000000000000000000000000000000000000000..33ac2fed850c7f43ec9286578bcb9141574195d4 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_as.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_bbt.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_bbt.png new file mode 100644 index 0000000000000000000000000000000000000000..189ade506ff77ac1e29394a8be2c6f288bb2e11f Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_bbt.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_cjd.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_cjd.png new file mode 100644 index 0000000000000000000000000000000000000000..97d48185cf16d6d681074e9b3fe2cb11c17e8207 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_cjd.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_dg.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_dg.png new file mode 100644 index 0000000000000000000000000000000000000000..68c37767e0b9d4fae5e7916e4511fa785d2ab8ac Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_dg.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_dsg.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_dsg.png new file mode 100644 index 0000000000000000000000000000000000000000..73688fbaca8c57209e99e45810bc4c10d216e1b9 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_dsg.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_dz.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_dz.png new file mode 100644 index 0000000000000000000000000000000000000000..6115d652f06e50d827c5fc1d073058e2b2973cf1 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_dz.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_fj.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_fj.png new file mode 100644 index 0000000000000000000000000000000000000000..02ffe4bd0dcb03873885138897b4d8753d916cd8 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_fj.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_fw.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_fw.png new file mode 100644 index 0000000000000000000000000000000000000000..fea37054977b30f8565cab3b2bbd9280aeb79cce Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_fw.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_jz.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_jz.png new file mode 100644 index 0000000000000000000000000000000000000000..6ffeb5d1893fda612e9caf7d54e5a44348b35bb2 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_jz.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_kh.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_kh.png new file mode 100644 index 0000000000000000000000000000000000000000..5703a622c85304011924982b3acc2edf4242fb9b Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_kh.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_mg1.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_mg1.png new file mode 100644 index 0000000000000000000000000000000000000000..1b01dad03e0c7c5ff8166eb17640490f19353f99 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_mg1.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_mg3.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_mg3.png new file mode 100644 index 0000000000000000000000000000000000000000..c41aeab25fb34c930820ded7142751c4aae26305 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_mg3.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_mg99.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_mg99.png new file mode 100644 index 0000000000000000000000000000000000000000..c9058220b83e9b89e2edfddc2a97d0b63589521e Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_mg99.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_pj.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_pj.png new file mode 100644 index 0000000000000000000000000000000000000000..1c6924071485ee9db3d6a04fe6f4adf7d536ed80 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_pj.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_qkl.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_qkl.png new file mode 100644 index 0000000000000000000000000000000000000000..fa7e52f10ef70758c72e7f502f5ff63d4a399282 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_qkl.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_yb.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_yb.png new file mode 100644 index 0000000000000000000000000000000000000000..94c414bf87a9bc6449b672bd0fa48f5092b0db29 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_yb.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_yt.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_yt.png new file mode 100644 index 0000000000000000000000000000000000000000..e1f107b56f919f80f5d9656fb0c957f50970379e Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/lw_yt.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/message_selected.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/message_selected.png new file mode 100644 index 0000000000000000000000000000000000000000..f47a0fa7e021f81e84b7856ef6728194b06b5cf7 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/message_selected.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/message_unselect.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/message_unselect.png new file mode 100644 index 0000000000000000000000000000000000000000..61906455a5080ad1acc33956aad5a64994173701 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/message_unselect.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/mine_select.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/mine_select.png new file mode 100644 index 0000000000000000000000000000000000000000..c150b579b50460cdb76ebfada318d1a5885021f2 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/mine_select.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/mine_unselect.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/mine_unselect.png new file mode 100644 index 0000000000000000000000000000000000000000..cb9b8e9a3fba0539fb4d5e6d0fe820a27bf73038 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/mine_unselect.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/my_acts.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/my_acts.png new file mode 100644 index 0000000000000000000000000000000000000000..23544ec7ff7fbc53ce2f603a9f39300c400a7afc Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/my_acts.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/my_contact.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/my_contact.png new file mode 100644 index 0000000000000000000000000000000000000000..ed144cb8b32fe9810e9760f80b8d5c685a268a98 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/my_contact.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/my_fate.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/my_fate.png new file mode 100644 index 0000000000000000000000000000000000000000..19c76c4e0b3bfbe2cdeb463c835ada0ae499c39e Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/my_fate.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/my_gift.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/my_gift.png new file mode 100644 index 0000000000000000000000000000000000000000..b8bf14b635d45d64b1397623bdb1a113f5ecc02f Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/my_gift.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/my_qa_icon.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/my_qa_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..fe9267b33221239e5bacd2fe64ff0ac19a46ec04 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/my_qa_icon.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/my_sys_msg.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/my_sys_msg.png new file mode 100644 index 0000000000000000000000000000000000000000..1de17f0e2f3c0ce16e8bee5d053adaac4986bbf6 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/my_sys_msg.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/my_verify.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/my_verify.png new file mode 100644 index 0000000000000000000000000000000000000000..c48fc7d0f0fc16a5e89581f0f0e512a12287fc26 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/my_verify.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/my_vip.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/my_vip.png new file mode 100644 index 0000000000000000000000000000000000000000..72179ba0599dd83b26071015cd4ae4088be7ef18 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/my_vip.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/no_video_default.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/no_video_default.png new file mode 100644 index 0000000000000000000000000000000000000000..500afc72e713bb3ebcbee2707d52978d567b3a89 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/no_video_default.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/order_default.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/order_default.png new file mode 100644 index 0000000000000000000000000000000000000000..ca8e8aa0bd0c336c93fadbf05b8b8707e81fb20b Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/order_default.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/other_center_like.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/other_center_like.png new file mode 100644 index 0000000000000000000000000000000000000000..c78c779969b0e262af1b9841705f6c6cec7e1c51 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/other_center_like.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/other_center_unlike.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/other_center_unlike.png new file mode 100644 index 0000000000000000000000000000000000000000..dc8cfc7b43c9762cad81ff80d0181d63174cc1bd Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/other_center_unlike.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/other_center_unvideo.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/other_center_unvideo.png new file mode 100644 index 0000000000000000000000000000000000000000..aa47d72a3de932703e8a0236c1c2c9a579363c8a Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/other_center_unvideo.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/other_center_video.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/other_center_video.png new file mode 100644 index 0000000000000000000000000000000000000000..514e0b7c75f1311a5a3b70e640698339f0dcf2b7 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/other_center_video.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/other_page_more.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/other_page_more.png new file mode 100644 index 0000000000000000000000000000000000000000..2d0487c1539c79e3d861530b8b4bf949326c05cc Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/other_page_more.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/page_indicator_focused.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/page_indicator_focused.png new file mode 100644 index 0000000000000000000000000000000000000000..a25626073324e3b3829a3e2ccbbd74b1826bb74a Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/page_indicator_focused.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/page_indicator_unfocused.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/page_indicator_unfocused.png new file mode 100644 index 0000000000000000000000000000000000000000..6eaa178ff486e62ee133bff754d3b1d363c229ad Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/page_indicator_unfocused.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/pay_first.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/pay_first.png new file mode 100644 index 0000000000000000000000000000000000000000..11950fd02d11538f594d0819e391c287577eda7d Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/pay_first.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/pay_second.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/pay_second.png new file mode 100644 index 0000000000000000000000000000000000000000..0a24d8f50e696c8aa59dddcadb30134e30fe7515 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/pay_second.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/pay_third.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/pay_third.png new file mode 100644 index 0000000000000000000000000000000000000000..d2c6ca42e237305b54b2f467ac2976e442fd7ca0 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/pay_third.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/pic_dir.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/pic_dir.png new file mode 100644 index 0000000000000000000000000000000000000000..4dc2bdb92e7fdf8fb50bb8bb334213bcd91bce15 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/pic_dir.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/picture_unselected.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/picture_unselected.png new file mode 100644 index 0000000000000000000000000000000000000000..07508f62545e7e15a874d4c323a5c68aad7ac6ff Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/picture_unselected.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/pictures_no.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/pictures_no.png new file mode 100644 index 0000000000000000000000000000000000000000..9429ad1fa06383986f7c60b637b7913d343d28ff Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/pictures_no.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/pictures_selected.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/pictures_selected.png new file mode 100644 index 0000000000000000000000000000000000000000..ef3ef646cb56a6341b7655e54b59a8152ad7c1d2 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/pictures_selected.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/qa_comment.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/qa_comment.png new file mode 100644 index 0000000000000000000000000000000000000000..0a35229fc92d11f5820fca9376808ec620fb175a Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/qa_comment.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/qb_task.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/qb_task.png new file mode 100644 index 0000000000000000000000000000000000000000..60c71945c9fb98dd6866f2f19c5a3deec4926d01 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/qb_task.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/qiyuan_acts.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/qiyuan_acts.png new file mode 100644 index 0000000000000000000000000000000000000000..370629191c502821eba5462ecd711e24b03cd472 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/qiyuan_acts.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/qiyuan_serivce.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/qiyuan_serivce.png new file mode 100644 index 0000000000000000000000000000000000000000..67e63104d58c7d7f57ad5e002457fdf7b975a91a Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/qiyuan_serivce.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/qiyuan_talk.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/qiyuan_talk.png new file mode 100644 index 0000000000000000000000000000000000000000..9505e33712817bfae9cac30e76c8a82525d3c183 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/qiyuan_talk.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/qiyuan_tongzhi.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/qiyuan_tongzhi.png new file mode 100644 index 0000000000000000000000000000000000000000..91ed2b230d39812e85e13f62d8b699630134b7e3 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/qiyuan_tongzhi.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/qiyuan_wenzhang.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/qiyuan_wenzhang.png new file mode 100644 index 0000000000000000000000000000000000000000..6772f7fb007588759d74af1faaaca75c56a62d3a Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/qiyuan_wenzhang.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/qq_login.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/qq_login.png new file mode 100644 index 0000000000000000000000000000000000000000..932ab57a90b92ad0a76369ca3efce0d198971260 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/qq_login.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/qr_code_btn.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/qr_code_btn.png new file mode 100644 index 0000000000000000000000000000000000000000..f48cc1b29a711181da038f6564521cde5abd3a56 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/qr_code_btn.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/qr_line.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/qr_line.png new file mode 100644 index 0000000000000000000000000000000000000000..0b51e10e3ed922e835e81893c8592ce03dc92f3d Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/qr_line.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/qr_outlineborder.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/qr_outlineborder.png new file mode 100644 index 0000000000000000000000000000000000000000..1dc64c2f04e5a390aa3a18ea8a7f81747f4ed676 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/qr_outlineborder.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/qyrz_on.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/qyrz_on.png new file mode 100644 index 0000000000000000000000000000000000000000..247ffe303fdc4fa7f0b30a5cc3cb718c7b173710 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/qyrz_on.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/recorder.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/recorder.png new file mode 100644 index 0000000000000000000000000000000000000000..50d0aebbb62d2d3dbad636fb5b23216237702509 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/recorder.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/redbean_bill.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/redbean_bill.png new file mode 100644 index 0000000000000000000000000000000000000000..bfbb183a0446262c50fd189cdd81595d06f0b843 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/redbean_bill.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/rz_mobile_on.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/rz_mobile_on.png new file mode 100644 index 0000000000000000000000000000000000000000..7886e4243153e8f87049aea27456fb8f11cd49c1 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/rz_mobile_on.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/rz_name_on.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/rz_name_on.png new file mode 100644 index 0000000000000000000000000000000000000000..4fa6e79be2980820fe85d9de6eb2cee88cdd9ead Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/rz_name_on.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/rz_name_un.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/rz_name_un.png new file mode 100644 index 0000000000000000000000000000000000000000..c9831deb932e1af73b522b0be9e797714d9bb9f4 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/rz_name_un.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/rz_qiyuan_on.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/rz_qiyuan_on.png new file mode 100644 index 0000000000000000000000000000000000000000..f4aed1fbce4e095caa46bdb527b4821aa1c58262 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/rz_qiyuan_on.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/rz_qiyuan_un.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/rz_qiyuan_un.png new file mode 100644 index 0000000000000000000000000000000000000000..e9156b4514eac4a5808a5f21d71b2991812f10f1 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/rz_qiyuan_un.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/say_hi.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/say_hi.png new file mode 100644 index 0000000000000000000000000000000000000000..bcfb70d2f2ffd97b11cafa8ef6a7042f818b132f Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/say_hi.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/second.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/second.png new file mode 100644 index 0000000000000000000000000000000000000000..2247d7ffa5b320aa51c513fb50ddba476ee3dc0c Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/second.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/shadow.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..ab1dbf1838f11999f420d053f51d85d1148b1cf5 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/shadow.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/share_default_logo.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/share_default_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f036ba0fb261350696e8c22199d819406fa1636b Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/share_default_logo.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/sign_success.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/sign_success.png new file mode 100644 index 0000000000000000000000000000000000000000..cf43350f278c4d5f5b849b613a4e1e855022d36b Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/sign_success.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/sina_login.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/sina_login.png new file mode 100644 index 0000000000000000000000000000000000000000..80115e9e4710c23e5e5abd82336ae0ceef8a0bf9 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/sina_login.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/sina_web_default.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/sina_web_default.png new file mode 100644 index 0000000000000000000000000000000000000000..780c04f34a704a13600ce01cec6cc24a7d441c73 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/sina_web_default.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/switch_off.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/switch_off.png new file mode 100644 index 0000000000000000000000000000000000000000..7a917d967f95a52cee831839f18d613075f0b74b Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/switch_off.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/switch_on.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/switch_on.png new file mode 100644 index 0000000000000000000000000000000000000000..c353cf88119ed32e569fe44ee87f736a65e42898 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/switch_on.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/third.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/third.png new file mode 100644 index 0000000000000000000000000000000000000000..9df5622e8a2911e86d9d5cb401fd0ffe0b849ba0 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/third.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_action_back_normal.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_action_back_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..e5245a6e3bf037b06de342369e488f237164b2e7 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_action_back_normal.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_action_back_selected.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_action_back_selected.png new file mode 100644 index 0000000000000000000000000000000000000000..9d77a6581e0a717e0a649b9811957c8086f4a3ca Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_action_back_selected.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_at_normal.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_at_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..e2eee4329ef3e4c97d3d142bd61b178022cea293 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_at_normal.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_at_selected.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_at_selected.png new file mode 100644 index 0000000000000000000000000000000000000000..838ebf98eddd0e53443956a941f21c21552246c7 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_at_selected.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_button_login_normal.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_button_login_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..f3e7327b6401e96df3c47097dd32665ffd441953 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_button_login_normal.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_button_login_pressed.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_button_login_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..f3e7327b6401e96df3c47097dd32665ffd441953 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_button_login_pressed.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_douban_off.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_douban_off.png new file mode 100644 index 0000000000000000000000000000000000000000..6ceaa39c45f2ca8bd5d5811ae4faf935c642ee6d Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_douban_off.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_douban_on.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_douban_on.png new file mode 100644 index 0000000000000000000000000000000000000000..75aebea56616c35c1280a19f8c9a94e6ce5227f1 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_douban_on.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_facebook.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_facebook.png new file mode 100644 index 0000000000000000000000000000000000000000..7d7b4dc3cac79ac7060840df44b0f8adda1e9598 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_facebook.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_fetch_image.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_fetch_image.png new file mode 100644 index 0000000000000000000000000000000000000000..64ee84536d55131ba27baa1a2023bbc1664b567f Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_fetch_image.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_follow_off.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_follow_off.png new file mode 100644 index 0000000000000000000000000000000000000000..e41fc24d688430505862750a538761861cb97b55 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_follow_off.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_follow_on.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_follow_on.png new file mode 100644 index 0000000000000000000000000000000000000000..adb301527244d8bd3e96f894825ce6ce7365ea2e Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_follow_on.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_google.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_google.png new file mode 100644 index 0000000000000000000000000000000000000000..ac3c9fc1e1f9d30eb51cfe6bf1cd7d14f6de205c Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_google.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_location_ic.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_location_ic.png new file mode 100644 index 0000000000000000000000000000000000000000..8f86b4846db551ab5dcc3370ce25bd42ab314efa Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_location_ic.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_location_off.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_location_off.png new file mode 100644 index 0000000000000000000000000000000000000000..e3c77103caa5fb5b8149e077a814edb0d09425ca Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_location_off.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_location_on.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_location_on.png new file mode 100644 index 0000000000000000000000000000000000000000..f7ed6cb0701c432f4d11e9c922d969105e48610b Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_location_on.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_nav_bar_bg.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_nav_bar_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..94c09ce4ec1450826018a09027d23e267316c3f0 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_nav_bar_bg.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_qq_off.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_qq_off.png new file mode 100644 index 0000000000000000000000000000000000000000..3126365e18896de02a5571a3587ac9568046b160 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_qq_off.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_qq_on.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_qq_on.png new file mode 100644 index 0000000000000000000000000000000000000000..8f8e9123451fb814fa4113ea1a13da5d676daf70 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_qq_on.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_qzone_off.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_qzone_off.png new file mode 100644 index 0000000000000000000000000000000000000000..25ad620642857e6d7bbb05069530a16e214534c5 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_qzone_off.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_qzone_on.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_qzone_on.png new file mode 100644 index 0000000000000000000000000000000000000000..c8d87c6de213c22f13510bb41b9b7947e52103de Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_qzone_on.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_refersh.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_refersh.png new file mode 100644 index 0000000000000000000000000000000000000000..af6f7e8887595582cafaa0a983eddaaab794add8 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_refersh.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_renren_off.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_renren_off.png new file mode 100644 index 0000000000000000000000000000000000000000..cf42b6fe42aaa752173bdda1ddc1176e021decac Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_renren_off.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_renren_on.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_renren_on.png new file mode 100644 index 0000000000000000000000000000000000000000..e8f3b962f795a5b03584361d6585ae1fd3bfee19 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_renren_on.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_search_icon.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_search_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f4f1a6fa135799f19d517e947016deb47a287d48 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_search_icon.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_share_music.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_share_music.png new file mode 100644 index 0000000000000000000000000000000000000000..ad07270eb821c70cdbd218e1c219a17f8398264c Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_share_music.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_share_pic.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_share_pic.png new file mode 100644 index 0000000000000000000000000000000000000000..09ef645a0551ecf932244e40b58a389808d5c619 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_share_pic.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_share_video.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_share_video.png new file mode 100644 index 0000000000000000000000000000000000000000..c4087d6fd58acca22b6a7ff6723264927ea7e2ba Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_share_video.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_sina_off.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_sina_off.png new file mode 100644 index 0000000000000000000000000000000000000000..1bbef537fbfd77315daad4cfbb99f474edccd1ec Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_sina_off.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_sina_on.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_sina_on.png new file mode 100644 index 0000000000000000000000000000000000000000..37f45631394bda4163b868eed4dae48c1b12c29b Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_sina_on.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_title_back_bt_normal.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_title_back_bt_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..96a89e5eb53814e49fd6bf9fc62264f506799d20 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_title_back_bt_normal.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_title_back_bt_selected.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_title_back_bt_selected.png new file mode 100644 index 0000000000000000000000000000000000000000..c7732fb2afffc8a17ff785b30489211bc4deee34 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_title_back_bt_selected.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_title_right_bt_normal.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_title_right_bt_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..02c673e544b0e65eba5fbcc0f46fa982769ee090 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_title_right_bt_normal.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_title_right_bt_selected.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_title_right_bt_selected.png new file mode 100644 index 0000000000000000000000000000000000000000..d2fdab0ab5eb2c985b2b3bb524e2ccda1b9cba2b Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_title_right_bt_selected.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_title_tab_left_normal.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_title_tab_left_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..ba78baf707e192ee3c207e0dfc1322151c462538 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_title_tab_left_normal.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_title_tab_left_pressed.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_title_tab_left_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..92653e82c6d47076a5445c872fb05733dacfbce8 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_title_tab_left_pressed.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_title_tab_right_normal.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_title_tab_right_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..a1f6e754716d6f7a0e8afdc7f1176e150364dc76 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_title_tab_right_normal.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_title_tab_right_pressed.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_title_tab_right_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..026f7f7f362bf1c00ad7986e52040e61e701b9ca Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_title_tab_right_pressed.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_twitter.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_twitter.png new file mode 100644 index 0000000000000000000000000000000000000000..70484f5e66a3621928d72e96dd6c4ca2cc098391 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_twitter.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_tx_off.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_tx_off.png new file mode 100644 index 0000000000000000000000000000000000000000..9e451188693f166d1a6b82a3fef232f99d2e7ec5 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_tx_off.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_tx_on.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_tx_on.png new file mode 100644 index 0000000000000000000000000000000000000000..e844269282e59fe64f92642a78399af86b6e6627 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_tx_on.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_wechat.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_wechat.png new file mode 100644 index 0000000000000000000000000000000000000000..72d6e0057b1e53e2c60dc43475c93a9130466df1 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_wechat.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_wechat_gray.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_wechat_gray.png new file mode 100644 index 0000000000000000000000000000000000000000..24851eb84b7d18855447a73e2fd5556c40caed86 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_wechat_gray.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_wxcircle.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_wxcircle.png new file mode 100644 index 0000000000000000000000000000000000000000..da94344c0dc7dd2a6681fe6ef9b0f04fea9ee94e Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_wxcircle.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_wxcircle_gray.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_wxcircle_gray.png new file mode 100644 index 0000000000000000000000000000000000000000..9483f8f75c39d895d509d5b1909252be590292c1 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_wxcircle_gray.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_x_button.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_x_button.png new file mode 100644 index 0000000000000000000000000000000000000000..2f2c9fcbdc921814db87f9e049879bc284a658ce Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/umeng_socialize_x_button.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/v1.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/v1.png new file mode 100644 index 0000000000000000000000000000000000000000..678d727ba3e02fd31a3deb70cbeb5fd8bf4ac9c3 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/v1.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/v2.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/v2.png new file mode 100644 index 0000000000000000000000000000000000000000..da5ce8f25b7e254ea233f65ec94ea5961b710e2e Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/v2.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/v3.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/v3.png new file mode 100644 index 0000000000000000000000000000000000000000..5c5572b9df14e8333650fd465b24e90a9bc2ce10 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/v3.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/v4.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/v4.png new file mode 100644 index 0000000000000000000000000000000000000000..3320be0549cad64f05433eab9c1cf0df9549c9a5 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/v4.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/v5.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/v5.png new file mode 100644 index 0000000000000000000000000000000000000000..1779a6821cc0d89b0c3f69624a1b1df05215cf58 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/v5.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/v6.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/v6.png new file mode 100644 index 0000000000000000000000000000000000000000..b34d20896207126e72262dab78505035e0f626fe Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/v6.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/v7.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/v7.png new file mode 100644 index 0000000000000000000000000000000000000000..2673aac04fe95080d0be8917d59523642256d993 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/v7.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/v_anim1.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/v_anim1.png new file mode 100644 index 0000000000000000000000000000000000000000..b8df2c52aea30a1ea3298cc04cbc8e7540145e7d Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/v_anim1.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/v_anim2.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/v_anim2.png new file mode 100644 index 0000000000000000000000000000000000000000..a60d3647547f9ed4cc77c43da81ba6bf1633d1dd Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/v_anim2.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/v_anim3.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/v_anim3.png new file mode 100644 index 0000000000000000000000000000000000000000..53ca0faba2ed4f78e058a99ce302bdcde816ac57 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/v_anim3.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/voice_to_short.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/voice_to_short.png new file mode 100644 index 0000000000000000000000000000000000000000..74351ce5c1b4a3ef27f3dcb846369be982101688 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/voice_to_short.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/wdyb.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/wdyb.png new file mode 100644 index 0000000000000000000000000000000000000000..049d6aa70a5079fbd6d313bf7fdb4728e6759748 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/wdyb.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/wdzj.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/wdzj.png new file mode 100644 index 0000000000000000000000000000000000000000..3506e372e8889654643c3d4d8889d755495434e6 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/wdzj.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/wdzl.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/wdzl.png new file mode 100644 index 0000000000000000000000000000000000000000..596532ddc8e2d33f6221e5385cf818d44768c1ce Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/wdzl.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/wechat_login.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/wechat_login.png new file mode 100644 index 0000000000000000000000000000000000000000..c891cc556317ed13066df9ed3af416ef4ce039c4 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/wechat_login.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/wechat_pay.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/wechat_pay.png new file mode 100644 index 0000000000000000000000000000000000000000..1d30999edd22b185d3b64ec37dddcb548b95411f Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/wechat_pay.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/welcome.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/welcome.png new file mode 100644 index 0000000000000000000000000000000000000000..fdec65f6c297ffad2eb4ed0f152b13d9f70be797 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/welcome.png differ diff --git a/JQ_ELOVE/src/main/res/drawable-xhdpi/work_card_rz.png b/JQ_ELOVE/src/main/res/drawable-xhdpi/work_card_rz.png new file mode 100644 index 0000000000000000000000000000000000000000..2d3e7ba70791c6f3df0a54fafa57e4c5087c109f Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable-xhdpi/work_card_rz.png differ diff --git a/JQ_ELOVE/src/main/res/drawable/all_darkbackground.xml b/JQ_ELOVE/src/main/res/drawable/all_darkbackground.xml new file mode 100644 index 0000000000000000000000000000000000000000..d204f3f8b7f509121b91f998a1df95acd793f476 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/all_darkbackground.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/alpha_circle_black20.xml b/JQ_ELOVE/src/main/res/drawable/alpha_circle_black20.xml new file mode 100644 index 0000000000000000000000000000000000000000..d5f13acec44715d6df7bfeef85ae5b1668c66219 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/alpha_circle_black20.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/alpha_radius_black12.xml b/JQ_ELOVE/src/main/res/drawable/alpha_radius_black12.xml new file mode 100644 index 0000000000000000000000000000000000000000..df90b89df75bb09fa9da0a81992eeb3fafade127 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/alpha_radius_black12.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/alpha_radius_orange12.xml b/JQ_ELOVE/src/main/res/drawable/alpha_radius_orange12.xml new file mode 100644 index 0000000000000000000000000000000000000000..8ae2ea47f9a7859a422c159b5bbb38ef0c13869e --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/alpha_radius_orange12.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/alpha_radius_voice_black5.xml b/JQ_ELOVE/src/main/res/drawable/alpha_radius_voice_black5.xml new file mode 100644 index 0000000000000000000000000000000000000000..f93b1ccf7ba7db68f5ab6e0d29de2ae95a1c11f4 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/alpha_radius_voice_black5.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/avatar_other_bg_spec.xml b/JQ_ELOVE/src/main/res/drawable/avatar_other_bg_spec.xml new file mode 100644 index 0000000000000000000000000000000000000000..d0654b8a2f95edb149d89b37944794276b96bab5 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/avatar_other_bg_spec.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/border_gray_radius5.xml b/JQ_ELOVE/src/main/res/drawable/border_gray_radius5.xml new file mode 100644 index 0000000000000000000000000000000000000000..8c2abb403868ca8c71f3e90710f75d2c3b4a15b7 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/border_gray_radius5.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/border_orange_radius5.xml b/JQ_ELOVE/src/main/res/drawable/border_orange_radius5.xml new file mode 100644 index 0000000000000000000000000000000000000000..72dfe996931cb857c5e9fce70ce4d970b348df67 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/border_orange_radius5.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/border_red_radius5.xml b/JQ_ELOVE/src/main/res/drawable/border_red_radius5.xml new file mode 100644 index 0000000000000000000000000000000000000000..fa4a28c1f22b22186dc997e5cfea6ac4b863bc11 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/border_red_radius5.xml @@ -0,0 +1,11 @@ + + + + + + + diff --git a/JQ_ELOVE/src/main/res/drawable/btn_send_bg.xml b/JQ_ELOVE/src/main/res/drawable/btn_send_bg.xml new file mode 100644 index 0000000000000000000000000000000000000000..a325982373e2166aa2864a19d6304dec731e9410 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/btn_send_bg.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/circle_avatar_bg.xml b/JQ_ELOVE/src/main/res/drawable/circle_avatar_bg.xml new file mode 100644 index 0000000000000000000000000000000000000000..f010e5203ae3ba560f1ed65f9fd3145c6f97df77 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/circle_avatar_bg.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/circle_avatar_bg1.xml b/JQ_ELOVE/src/main/res/drawable/circle_avatar_bg1.xml new file mode 100644 index 0000000000000000000000000000000000000000..8e3130c7f8223ce251c0b9af58ea16c3edca30ac --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/circle_avatar_bg1.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/circle_avatar_bg10.xml b/JQ_ELOVE/src/main/res/drawable/circle_avatar_bg10.xml new file mode 100644 index 0000000000000000000000000000000000000000..d68a6fe148494c958024cef66f4834c08074ac02 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/circle_avatar_bg10.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/circle_avatar_bg11.xml b/JQ_ELOVE/src/main/res/drawable/circle_avatar_bg11.xml new file mode 100644 index 0000000000000000000000000000000000000000..22e138439ad711c8b40bce7914d5db0c6406fbec --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/circle_avatar_bg11.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/circle_avatar_bg12.xml b/JQ_ELOVE/src/main/res/drawable/circle_avatar_bg12.xml new file mode 100644 index 0000000000000000000000000000000000000000..91f7952ec4900209b8f4dff96b6f621d734833a7 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/circle_avatar_bg12.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/circle_avatar_bg2.xml b/JQ_ELOVE/src/main/res/drawable/circle_avatar_bg2.xml new file mode 100644 index 0000000000000000000000000000000000000000..1fa8a48f950d9e3c5b72ae8cd899003afff587c4 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/circle_avatar_bg2.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/circle_avatar_bg3.xml b/JQ_ELOVE/src/main/res/drawable/circle_avatar_bg3.xml new file mode 100644 index 0000000000000000000000000000000000000000..b416067dc5d06d9ce290dc91ebf67219cbb19d0f --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/circle_avatar_bg3.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/circle_avatar_bg4.xml b/JQ_ELOVE/src/main/res/drawable/circle_avatar_bg4.xml new file mode 100644 index 0000000000000000000000000000000000000000..cb33b9d2e1b42ddbde3cb6cdfb2ac016d4667a99 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/circle_avatar_bg4.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/circle_avatar_bg5.xml b/JQ_ELOVE/src/main/res/drawable/circle_avatar_bg5.xml new file mode 100644 index 0000000000000000000000000000000000000000..c98e7c3ddf6272afc07c646866ebe7b20c6b50bd --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/circle_avatar_bg5.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/circle_avatar_bg6.xml b/JQ_ELOVE/src/main/res/drawable/circle_avatar_bg6.xml new file mode 100644 index 0000000000000000000000000000000000000000..ae4a1e97ee959080962de4428f99b8d1c53de0e0 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/circle_avatar_bg6.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/circle_avatar_bg7.xml b/JQ_ELOVE/src/main/res/drawable/circle_avatar_bg7.xml new file mode 100644 index 0000000000000000000000000000000000000000..3042c800ac87a3a77a1c968da69cffde23e95d3e --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/circle_avatar_bg7.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/circle_avatar_bg8.xml b/JQ_ELOVE/src/main/res/drawable/circle_avatar_bg8.xml new file mode 100644 index 0000000000000000000000000000000000000000..e1c06f8545961a052fb0f79279a55fdfaf7b8cb3 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/circle_avatar_bg8.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/circle_avatar_bg9.xml b/JQ_ELOVE/src/main/res/drawable/circle_avatar_bg9.xml new file mode 100644 index 0000000000000000000000000000000000000000..d1287b4c4ffd1d61d39d31b12157230d60c6fca8 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/circle_avatar_bg9.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/circle_focus_bg.xml b/JQ_ELOVE/src/main/res/drawable/circle_focus_bg.xml new file mode 100644 index 0000000000000000000000000000000000000000..5679756e1098607402ef68b7d96faa724f6f24b9 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/circle_focus_bg.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/circle_focus_bg_on.xml b/JQ_ELOVE/src/main/res/drawable/circle_focus_bg_on.xml new file mode 100644 index 0000000000000000000000000000000000000000..5d4c068009d88b793fe8567a3380b24ada6cd1ae --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/circle_focus_bg_on.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/comment_bg.xml b/JQ_ELOVE/src/main/res/drawable/comment_bg.xml new file mode 100644 index 0000000000000000000000000000000000000000..6e684f1cd6588d4a4386e7c49992e11ccde0af07 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/comment_bg.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/customdialog_bg.xml b/JQ_ELOVE/src/main/res/drawable/customdialog_bg.xml new file mode 100644 index 0000000000000000000000000000000000000000..433995b88459e468f80e58d0e1c3a62a2ca2b5c4 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/customdialog_bg.xml @@ -0,0 +1,17 @@ + + + + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/customdialog_left_btn_checked.xml b/JQ_ELOVE/src/main/res/drawable/customdialog_left_btn_checked.xml new file mode 100644 index 0000000000000000000000000000000000000000..5cce5991cd194ec0005c7dd29701d667185e7577 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/customdialog_left_btn_checked.xml @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/customdialog_left_btn_selector.xml b/JQ_ELOVE/src/main/res/drawable/customdialog_left_btn_selector.xml new file mode 100644 index 0000000000000000000000000000000000000000..ea5812daf81eef260f042aba6fcd57dec69e4244 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/customdialog_left_btn_selector.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/customdialog_left_btn_unchecked.xml b/JQ_ELOVE/src/main/res/drawable/customdialog_left_btn_unchecked.xml new file mode 100644 index 0000000000000000000000000000000000000000..70969b7851e2685a5e4dccacb9424217d2d00baf --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/customdialog_left_btn_unchecked.xml @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/customdialog_one_btn_checked.xml b/JQ_ELOVE/src/main/res/drawable/customdialog_one_btn_checked.xml new file mode 100644 index 0000000000000000000000000000000000000000..2dca2f3482cb3af6faa0ecdc8fd35d04104e1a82 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/customdialog_one_btn_checked.xml @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/customdialog_one_btn_select.xml b/JQ_ELOVE/src/main/res/drawable/customdialog_one_btn_select.xml new file mode 100644 index 0000000000000000000000000000000000000000..5ea78003e0c4918e267d9417d6dca049ba62ae49 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/customdialog_one_btn_select.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/customdialog_one_btn_unchecked.xml b/JQ_ELOVE/src/main/res/drawable/customdialog_one_btn_unchecked.xml new file mode 100644 index 0000000000000000000000000000000000000000..842d39b0a4da4547b2e1951546bf3b74612e5b38 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/customdialog_one_btn_unchecked.xml @@ -0,0 +1,12 @@ + + + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/customdialog_right_btn_checked.xml b/JQ_ELOVE/src/main/res/drawable/customdialog_right_btn_checked.xml new file mode 100644 index 0000000000000000000000000000000000000000..a58d03d6a9c6c0ba9e2f9d8fbb6b93c009c04574 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/customdialog_right_btn_checked.xml @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/customdialog_right_btn_selector.xml b/JQ_ELOVE/src/main/res/drawable/customdialog_right_btn_selector.xml new file mode 100644 index 0000000000000000000000000000000000000000..13b5f67aee140adbb8a77a0cf58e1f90cebf978f --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/customdialog_right_btn_selector.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/customdialog_right_btn_unchecked.xml b/JQ_ELOVE/src/main/res/drawable/customdialog_right_btn_unchecked.xml new file mode 100644 index 0000000000000000000000000000000000000000..2316af7adef0ff081a451153a750ddc91aaa0b68 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/customdialog_right_btn_unchecked.xml @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/demand_bg.xml b/JQ_ELOVE/src/main/res/drawable/demand_bg.xml new file mode 100644 index 0000000000000000000000000000000000000000..cd44517ca5bb66c2670abd1adbac4e228b61a998 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/demand_bg.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/edit_text_style.xml b/JQ_ELOVE/src/main/res/drawable/edit_text_style.xml new file mode 100644 index 0000000000000000000000000000000000000000..672023b01852af72bbcd5137adca3fa1d07b0fc7 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/edit_text_style.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/edit_text_without_stroke.xml b/JQ_ELOVE/src/main/res/drawable/edit_text_without_stroke.xml new file mode 100644 index 0000000000000000000000000000000000000000..711b44b7c3862d7988020eb558ef97286f5975df --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/edit_text_without_stroke.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/edittext_white_noborder.xml b/JQ_ELOVE/src/main/res/drawable/edittext_white_noborder.xml new file mode 100644 index 0000000000000000000000000000000000000000..b5164d7722c2ada2789a6f08ddc097ffe562e0c4 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/edittext_white_noborder.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/edittext_whiteborder.xml b/JQ_ELOVE/src/main/res/drawable/edittext_whiteborder.xml new file mode 100644 index 0000000000000000000000000000000000000000..47fa1e999f9bad7df6257869a5887693b9b66219 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/edittext_whiteborder.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/em_appitem_del_btn.xml b/JQ_ELOVE/src/main/res/drawable/em_appitem_del_btn.xml new file mode 100644 index 0000000000000000000000000000000000000000..e0898c026a187ad4fba1d2d343d53369d7086331 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/em_appitem_del_btn.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/em_btn_logout_normal_shape.xml b/JQ_ELOVE/src/main/res/drawable/em_btn_logout_normal_shape.xml new file mode 100644 index 0000000000000000000000000000000000000000..40e47ce9d63f814d56c936758d99e6ea25acd774 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/em_btn_logout_normal_shape.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/em_btn_logout_pressed_shape.xml b/JQ_ELOVE/src/main/res/drawable/em_btn_logout_pressed_shape.xml new file mode 100644 index 0000000000000000000000000000000000000000..19233e00c0bc6ac5d7f3017d3b7036dd992a8e59 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/em_btn_logout_pressed_shape.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/em_button_bg.xml b/JQ_ELOVE/src/main/res/drawable/em_button_bg.xml new file mode 100644 index 0000000000000000000000000000000000000000..d1ccd5ca28b39502a7ec0ecac4e7746f8c789cad --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/em_button_bg.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/em_button_myprofile_selector.xml b/JQ_ELOVE/src/main/res/drawable/em_button_myprofile_selector.xml new file mode 100644 index 0000000000000000000000000000000000000000..594849b22ecb69539bc765c9195905fcf87d1642 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/em_button_myprofile_selector.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/em_button_normal_shape.xml b/JQ_ELOVE/src/main/res/drawable/em_button_normal_shape.xml new file mode 100644 index 0000000000000000000000000000000000000000..14c0b6425ac4a40216a9b895ff8f4fda462b1320 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/em_button_normal_shape.xml @@ -0,0 +1,13 @@ + + + + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/em_button_selector_shape.xml b/JQ_ELOVE/src/main/res/drawable/em_button_selector_shape.xml new file mode 100644 index 0000000000000000000000000000000000000000..2a021536672358db0407cd36b0cc736946419f31 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/em_button_selector_shape.xml @@ -0,0 +1,13 @@ + + + + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/em_checkbox_bg_selector.xml b/JQ_ELOVE/src/main/res/drawable/em_checkbox_bg_selector.xml new file mode 100644 index 0000000000000000000000000000000000000000..50b28782e983d2043a7477989f0c8c015c61bf47 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/em_checkbox_bg_selector.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/em_roominfo_add_btn.xml b/JQ_ELOVE/src/main/res/drawable/em_roominfo_add_btn.xml new file mode 100644 index 0000000000000000000000000000000000000000..7c879dfcada2c50d1c58458159950a0a8104b0f2 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/em_roominfo_add_btn.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/em_smiley_add_btn.xml b/JQ_ELOVE/src/main/res/drawable/em_smiley_add_btn.xml new file mode 100644 index 0000000000000000000000000000000000000000..4e1ea3fc55919c533054f9819a1d05b3ea00a54a --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/em_smiley_add_btn.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/em_smiley_minus_btn.xml b/JQ_ELOVE/src/main/res/drawable/em_smiley_minus_btn.xml new file mode 100644 index 0000000000000000000000000000000000000000..9ac3c2b6ae6e0db977e45f9f4a22e09d51fbaa6d --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/em_smiley_minus_btn.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/em_unread_count_bg.9.png b/JQ_ELOVE/src/main/res/drawable/em_unread_count_bg.9.png new file mode 100644 index 0000000000000000000000000000000000000000..bbefd21dc10c1642006fbdaf4ae5415def9ed22d Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable/em_unread_count_bg.9.png differ diff --git a/JQ_ELOVE/src/main/res/drawable/finish_percent_bg.xml b/JQ_ELOVE/src/main/res/drawable/finish_percent_bg.xml new file mode 100644 index 0000000000000000000000000000000000000000..e6717e157edfb8f3688d2181c29544827acdcb26 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/finish_percent_bg.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/giftdialog_send_white_topradius8.xml b/JQ_ELOVE/src/main/res/drawable/giftdialog_send_white_topradius8.xml new file mode 100644 index 0000000000000000000000000000000000000000..0be96b5c090ed9378612b036a224912f593135b7 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/giftdialog_send_white_topradius8.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/hobby_info_item_bg.xml b/JQ_ELOVE/src/main/res/drawable/hobby_info_item_bg.xml new file mode 100644 index 0000000000000000000000000000000000000000..5dda9df810cc79ef4be22348655b9c8af515842d --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/hobby_info_item_bg.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/homepage_addr_bg.xml b/JQ_ELOVE/src/main/res/drawable/homepage_addr_bg.xml new file mode 100644 index 0000000000000000000000000000000000000000..7f0c34b099a4705ca0bc3d37a28bbea273af3031 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/homepage_addr_bg.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/homepage_item_bg.xml b/JQ_ELOVE/src/main/res/drawable/homepage_item_bg.xml new file mode 100644 index 0000000000000000000000000000000000000000..02dbcde19bc72db7cd561709ad0e26d6b52bf618 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/homepage_item_bg.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/homepage_loading_bg.xml b/JQ_ELOVE/src/main/res/drawable/homepage_loading_bg.xml new file mode 100644 index 0000000000000000000000000000000000000000..f30ec18fcca0de618fad0db7d92bbe3fdfdaa380 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/homepage_loading_bg.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/homepage_match_bg.xml b/JQ_ELOVE/src/main/res/drawable/homepage_match_bg.xml new file mode 100644 index 0000000000000000000000000000000000000000..e8c3dcf12fc42c4c31d82ba75a6cb54170660105 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/homepage_match_bg.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/ic_play_24dp.xml b/JQ_ELOVE/src/main/res/drawable/ic_play_24dp.xml new file mode 100644 index 0000000000000000000000000000000000000000..6c294bb2a33ac81de9430a0acef016398a795276 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/ic_play_24dp.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/info_item_bg.xml b/JQ_ELOVE/src/main/res/drawable/info_item_bg.xml new file mode 100644 index 0000000000000000000000000000000000000000..12bf1fe5ef72223c4e61c6426971958130245e27 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/info_item_bg.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/item_normal.xml b/JQ_ELOVE/src/main/res/drawable/item_normal.xml new file mode 100644 index 0000000000000000000000000000000000000000..b737418d77768ea1e7f5ab75620ae62f56ebd7c1 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/item_normal.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/JQ_ELOVE/src/main/res/drawable/item_pressed.xml b/JQ_ELOVE/src/main/res/drawable/item_pressed.xml new file mode 100644 index 0000000000000000000000000000000000000000..07cad597d0c5f89c72f9fec4c7941439bdbe14b8 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/item_pressed.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/JQ_ELOVE/src/main/res/drawable/item_pressed_blue.xml b/JQ_ELOVE/src/main/res/drawable/item_pressed_blue.xml new file mode 100644 index 0000000000000000000000000000000000000000..85989c57862b22859176977ca7721f37795ad24f --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/item_pressed_blue.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/item_recharge_bg_select.xml b/JQ_ELOVE/src/main/res/drawable/item_recharge_bg_select.xml new file mode 100644 index 0000000000000000000000000000000000000000..a7c31abb3302e8d6f738a8e163445b82de083b2c --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/item_recharge_bg_select.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/item_recharge_bg_unselect.xml b/JQ_ELOVE/src/main/res/drawable/item_recharge_bg_unselect.xml new file mode 100644 index 0000000000000000000000000000000000000000..2ce081b364ed855d44a9b8d1554b665d8790184b --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/item_recharge_bg_unselect.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/label_bg.xml b/JQ_ELOVE/src/main/res/drawable/label_bg.xml new file mode 100644 index 0000000000000000000000000000000000000000..6e1720664da1e89ca86f090117bdd88b0195c6e1 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/label_bg.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/label_hobby_bg.xml b/JQ_ELOVE/src/main/res/drawable/label_hobby_bg.xml new file mode 100644 index 0000000000000000000000000000000000000000..349a5ae2e3191feac2c69b9eb263dfdcf12cfc22 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/label_hobby_bg.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/list_item_click_style.xml b/JQ_ELOVE/src/main/res/drawable/list_item_click_style.xml new file mode 100644 index 0000000000000000000000000000000000000000..7ab90d2177a20a97b63417bbf8c5457c593f47fb --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/list_item_click_style.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/JQ_ELOVE/src/main/res/drawable/loadingdialog_roundborder.xml b/JQ_ELOVE/src/main/res/drawable/loadingdialog_roundborder.xml new file mode 100644 index 0000000000000000000000000000000000000000..150356cb67791829ac5b9123522c10af1d7f81c4 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/loadingdialog_roundborder.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/login_btn_bg.xml b/JQ_ELOVE/src/main/res/drawable/login_btn_bg.xml new file mode 100644 index 0000000000000000000000000000000000000000..a5534864b53a12d7050caa917e482ee157ddf732 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/login_btn_bg.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/mark_info_item_bg.xml b/JQ_ELOVE/src/main/res/drawable/mark_info_item_bg.xml new file mode 100644 index 0000000000000000000000000000000000000000..ad78018bda7c62fde49f245b37db087c6cf7dc7b --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/mark_info_item_bg.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/message_red_bg.xml b/JQ_ELOVE/src/main/res/drawable/message_red_bg.xml new file mode 100644 index 0000000000000000000000000000000000000000..7590b2edd5443fc19a32393fc34cb71a22a65825 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/message_red_bg.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/mystuff_alphabg.xml b/JQ_ELOVE/src/main/res/drawable/mystuff_alphabg.xml new file mode 100644 index 0000000000000000000000000000000000000000..7b9f12b5291e698123ac706d6289eb90aac521c7 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/mystuff_alphabg.xml @@ -0,0 +1,13 @@ + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/near_num_bg.xml b/JQ_ELOVE/src/main/res/drawable/near_num_bg.xml new file mode 100644 index 0000000000000000000000000000000000000000..ef0a798656f32b64b16883a75acf719ab0e10fa7 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/near_num_bg.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/oval_shape.xml b/JQ_ELOVE/src/main/res/drawable/oval_shape.xml new file mode 100644 index 0000000000000000000000000000000000000000..9a372608788fe8aeb389f96dc5c68851292bc3db --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/oval_shape.xml @@ -0,0 +1,16 @@ + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/oval_shape_solid.xml b/JQ_ELOVE/src/main/res/drawable/oval_shape_solid.xml new file mode 100644 index 0000000000000000000000000000000000000000..a1bb0a070ca56444bbcd3e53569f90e4a7d8bd88 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/oval_shape_solid.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/overlay_bg.xml b/JQ_ELOVE/src/main/res/drawable/overlay_bg.xml new file mode 100644 index 0000000000000000000000000000000000000000..a6a51ea9c48bac74008d4feeb763cf278a60a62a --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/overlay_bg.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/pink_border_bg.xml b/JQ_ELOVE/src/main/res/drawable/pink_border_bg.xml new file mode 100644 index 0000000000000000000000000000000000000000..f41c9434743a73ed17565390436798f99be4a40e --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/pink_border_bg.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/pink_btn.xml b/JQ_ELOVE/src/main/res/drawable/pink_btn.xml new file mode 100644 index 0000000000000000000000000000000000000000..af3f6567b72e37c16119dda08fcec17d6512615e --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/pink_btn.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/popoverdialog_end_btn_checked.xml b/JQ_ELOVE/src/main/res/drawable/popoverdialog_end_btn_checked.xml new file mode 100644 index 0000000000000000000000000000000000000000..51103f2320cb3cbf7a6e1fda114b78aab654a601 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/popoverdialog_end_btn_checked.xml @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/popoverdialog_end_btn_select.xml b/JQ_ELOVE/src/main/res/drawable/popoverdialog_end_btn_select.xml new file mode 100644 index 0000000000000000000000000000000000000000..50756604d01b201bfe8bddb0073a151f048e6cac --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/popoverdialog_end_btn_select.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/popoverdialog_end_btn_unchecked.xml b/JQ_ELOVE/src/main/res/drawable/popoverdialog_end_btn_unchecked.xml new file mode 100644 index 0000000000000000000000000000000000000000..33e358c1ef2dfc51ca8215ab814ef7116e82784f --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/popoverdialog_end_btn_unchecked.xml @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/popoverdialog_first_btn_checked.xml b/JQ_ELOVE/src/main/res/drawable/popoverdialog_first_btn_checked.xml new file mode 100644 index 0000000000000000000000000000000000000000..bdd7f926a61bb18a0a714a6e332d15ade2d7af2d --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/popoverdialog_first_btn_checked.xml @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/popoverdialog_first_btn_select.xml b/JQ_ELOVE/src/main/res/drawable/popoverdialog_first_btn_select.xml new file mode 100644 index 0000000000000000000000000000000000000000..2e78ad29c6ab64829b78a074c4612693c4e38551 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/popoverdialog_first_btn_select.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/popoverdialog_first_btn_unchecked.xml b/JQ_ELOVE/src/main/res/drawable/popoverdialog_first_btn_unchecked.xml new file mode 100644 index 0000000000000000000000000000000000000000..eb833023fa157aff57a6cc06a641cc02ef9662e0 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/popoverdialog_first_btn_unchecked.xml @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/profession_blue_solid_border5.xml b/JQ_ELOVE/src/main/res/drawable/profession_blue_solid_border5.xml new file mode 100644 index 0000000000000000000000000000000000000000..405198ec19e99eb95ae9a74dce32dd2136c630a6 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/profession_blue_solid_border5.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/profession_border_solid_radius5.xml b/JQ_ELOVE/src/main/res/drawable/profession_border_solid_radius5.xml new file mode 100644 index 0000000000000000000000000000000000000000..2a16d313ef4868bce43d6947bb1aee066a7aa1dd --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/profession_border_solid_radius5.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/profession_green_solid_border5.xml b/JQ_ELOVE/src/main/res/drawable/profession_green_solid_border5.xml new file mode 100644 index 0000000000000000000000000000000000000000..0e085605262b2f474775001b4085d0bac4e286be --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/profession_green_solid_border5.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/profession_orange_border.xml b/JQ_ELOVE/src/main/res/drawable/profession_orange_border.xml new file mode 100644 index 0000000000000000000000000000000000000000..289764b818783137e40483b19a38d4d7579e2b90 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/profession_orange_border.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/profession_purple_solid_border5.xml b/JQ_ELOVE/src/main/res/drawable/profession_purple_solid_border5.xml new file mode 100644 index 0000000000000000000000000000000000000000..2a16d313ef4868bce43d6947bb1aee066a7aa1dd --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/profession_purple_solid_border5.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/put_avatar_bg.xml b/JQ_ELOVE/src/main/res/drawable/put_avatar_bg.xml new file mode 100644 index 0000000000000000000000000000000000000000..8be11d1fb95c4425a82c16fa964ab3789eadd722 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/put_avatar_bg.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/put_avatar_bg_all.xml b/JQ_ELOVE/src/main/res/drawable/put_avatar_bg_all.xml new file mode 100644 index 0000000000000000000000000000000000000000..343d50d60785397b82b46ef6ee23ff1db1ea8f4d --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/put_avatar_bg_all.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/put_avatar_close_bg.xml b/JQ_ELOVE/src/main/res/drawable/put_avatar_close_bg.xml new file mode 100644 index 0000000000000000000000000000000000000000..e90b97481f9e29029fa3f7ca2a1bf92005f0d1fe --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/put_avatar_close_bg.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/radio_checked.xml b/JQ_ELOVE/src/main/res/drawable/radio_checked.xml new file mode 100644 index 0000000000000000000000000000000000000000..74ae7d63386d6322dce688f4ff7712190f01ce64 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/radio_checked.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/radio_style.xml b/JQ_ELOVE/src/main/res/drawable/radio_style.xml new file mode 100644 index 0000000000000000000000000000000000000000..7291ace5af78c4d81e68c75f496aa7388e7df48d --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/radio_style.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/radio_unchecked.xml b/JQ_ELOVE/src/main/res/drawable/radio_unchecked.xml new file mode 100644 index 0000000000000000000000000000000000000000..2849f967e2b44de12af89abcdc04e0b1f162412c --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/radio_unchecked.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/rectangle_dash_bg.xml b/JQ_ELOVE/src/main/res/drawable/rectangle_dash_bg.xml new file mode 100644 index 0000000000000000000000000000000000000000..e6c62455ff90bd00ebf0c2c3035268fd9379c9f1 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/rectangle_dash_bg.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/refresh_bg.xml b/JQ_ELOVE/src/main/res/drawable/refresh_bg.xml new file mode 100644 index 0000000000000000000000000000000000000000..f93b1ccf7ba7db68f5ab6e0d29de2ae95a1c11f4 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/refresh_bg.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/register_btn_bg.xml b/JQ_ELOVE/src/main/res/drawable/register_btn_bg.xml new file mode 100644 index 0000000000000000000000000000000000000000..2ddb549e85726cf725b0392514c1bde3aa82ee42 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/register_btn_bg.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/reward_bg_circle.xml b/JQ_ELOVE/src/main/res/drawable/reward_bg_circle.xml new file mode 100644 index 0000000000000000000000000000000000000000..9e9969c4eb80a70d36b88093b2577ceb7a3d6431 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/reward_bg_circle.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/round_corner.xml b/JQ_ELOVE/src/main/res/drawable/round_corner.xml new file mode 100644 index 0000000000000000000000000000000000000000..02dbcde19bc72db7cd561709ad0e26d6b52bf618 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/round_corner.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/rounded_rectangle_1.xml b/JQ_ELOVE/src/main/res/drawable/rounded_rectangle_1.xml new file mode 100644 index 0000000000000000000000000000000000000000..f4e6500ba99e89bd71543ac8b2d2cfbc1cfadfcd --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/rounded_rectangle_1.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/rounded_rectangle_10.xml b/JQ_ELOVE/src/main/res/drawable/rounded_rectangle_10.xml new file mode 100644 index 0000000000000000000000000000000000000000..10517a86f46c3ad1f8e8b70161f84ac53c62a3f9 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/rounded_rectangle_10.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/rounded_rectangle_11.xml b/JQ_ELOVE/src/main/res/drawable/rounded_rectangle_11.xml new file mode 100644 index 0000000000000000000000000000000000000000..673bf349231bffff42bf84730173787403146563 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/rounded_rectangle_11.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/rounded_rectangle_12.xml b/JQ_ELOVE/src/main/res/drawable/rounded_rectangle_12.xml new file mode 100644 index 0000000000000000000000000000000000000000..7ba93012c46c9d19897580bb03d230596dcc1c70 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/rounded_rectangle_12.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/rounded_rectangle_13.xml b/JQ_ELOVE/src/main/res/drawable/rounded_rectangle_13.xml new file mode 100644 index 0000000000000000000000000000000000000000..2b7701d0fada210ff977fe570215a9059daaa6fb --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/rounded_rectangle_13.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/rounded_rectangle_2.xml b/JQ_ELOVE/src/main/res/drawable/rounded_rectangle_2.xml new file mode 100644 index 0000000000000000000000000000000000000000..07fcda00e5e7d9953b1cdee4f120381e6e5b2551 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/rounded_rectangle_2.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/rounded_rectangle_3.xml b/JQ_ELOVE/src/main/res/drawable/rounded_rectangle_3.xml new file mode 100644 index 0000000000000000000000000000000000000000..ca52385aaf0bb2766c15cbb1bf64448d28a0a8df --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/rounded_rectangle_3.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/rounded_rectangle_4.xml b/JQ_ELOVE/src/main/res/drawable/rounded_rectangle_4.xml new file mode 100644 index 0000000000000000000000000000000000000000..e655e54ee31e775b41518b6738b75cc86838682a --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/rounded_rectangle_4.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/rounded_rectangle_5.xml b/JQ_ELOVE/src/main/res/drawable/rounded_rectangle_5.xml new file mode 100644 index 0000000000000000000000000000000000000000..178ca3fab07a300198fad0a2cd2179229d7a0506 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/rounded_rectangle_5.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/rounded_rectangle_6.xml b/JQ_ELOVE/src/main/res/drawable/rounded_rectangle_6.xml new file mode 100644 index 0000000000000000000000000000000000000000..afef6833a549b7fee01080df8a6b934a16448e35 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/rounded_rectangle_6.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/rounded_rectangle_7.xml b/JQ_ELOVE/src/main/res/drawable/rounded_rectangle_7.xml new file mode 100644 index 0000000000000000000000000000000000000000..4f1b9c578c592967558475e867968376837895ea --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/rounded_rectangle_7.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/rounded_rectangle_8.xml b/JQ_ELOVE/src/main/res/drawable/rounded_rectangle_8.xml new file mode 100644 index 0000000000000000000000000000000000000000..d9cd2faef660201a0a80d22c4d41e47d8cd06669 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/rounded_rectangle_8.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/rounded_rectangle_9.xml b/JQ_ELOVE/src/main/res/drawable/rounded_rectangle_9.xml new file mode 100644 index 0000000000000000000000000000000000000000..51d3828baf8b2003137d2cc54b3e3e2cda23b32b --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/rounded_rectangle_9.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/rounded_rectangle_gray.xml b/JQ_ELOVE/src/main/res/drawable/rounded_rectangle_gray.xml new file mode 100644 index 0000000000000000000000000000000000000000..734e432b7bab76c3c0f46dfd5cfff0cc50391909 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/rounded_rectangle_gray.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/rounded_rectangle_red.xml b/JQ_ELOVE/src/main/res/drawable/rounded_rectangle_red.xml new file mode 100644 index 0000000000000000000000000000000000000000..e60d73eceade738e0ec91a0ad567f1d25200f460 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/rounded_rectangle_red.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/search_box_bg.xml b/JQ_ELOVE/src/main/res/drawable/search_box_bg.xml new file mode 100644 index 0000000000000000000000000000000000000000..f36bc053f0687afdf3d1d6db3dcda4aa6763cbba --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/search_box_bg.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/sex_age_bg.xml b/JQ_ELOVE/src/main/res/drawable/sex_age_bg.xml new file mode 100644 index 0000000000000000000000000000000000000000..426f2ac10a2e49fbe62e01856593a223bef1609d --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/sex_age_bg.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/sex_man_style.xml b/JQ_ELOVE/src/main/res/drawable/sex_man_style.xml new file mode 100644 index 0000000000000000000000000000000000000000..a5ba81facc4298a70f75da1f9bebc07751293d4a --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/sex_man_style.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/sex_woman_style.xml b/JQ_ELOVE/src/main/res/drawable/sex_woman_style.xml new file mode 100644 index 0000000000000000000000000000000000000000..e6229b5fe5c8adabb319858a66fe6a02eac302c5 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/sex_woman_style.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/sign_btn_disable.xml b/JQ_ELOVE/src/main/res/drawable/sign_btn_disable.xml new file mode 100644 index 0000000000000000000000000000000000000000..61e0c9e08ba7f7a810f59751c0e7a0d34a73f020 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/sign_btn_disable.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/sign_in_bg.xml b/JQ_ELOVE/src/main/res/drawable/sign_in_bg.xml new file mode 100644 index 0000000000000000000000000000000000000000..a2b115853ad7bae104644161a0da306d81ec6c00 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/sign_in_bg.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/single_btn.xml b/JQ_ELOVE/src/main/res/drawable/single_btn.xml new file mode 100644 index 0000000000000000000000000000000000000000..5a6df394d3d049c239a8e4ec83cb535403647bdf --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/single_btn.xml @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/single_btn_select.xml b/JQ_ELOVE/src/main/res/drawable/single_btn_select.xml new file mode 100644 index 0000000000000000000000000000000000000000..239849d246ed676a675028877581906288b32865 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/single_btn_select.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/solid_gray_radius5.xml b/JQ_ELOVE/src/main/res/drawable/solid_gray_radius5.xml new file mode 100644 index 0000000000000000000000000000000000000000..cb64c89fce6688e71e1f0831242e19f5aa99576f --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/solid_gray_radius5.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/solid_halfcircle_red12.xml b/JQ_ELOVE/src/main/res/drawable/solid_halfcircle_red12.xml new file mode 100644 index 0000000000000000000000000000000000000000..4cc5f9edf9d6c7a6827d487bfd3123b8c0cbf15d --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/solid_halfcircle_red12.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/text_btn_solid_red_circle_corner.xml b/JQ_ELOVE/src/main/res/drawable/text_btn_solid_red_circle_corner.xml new file mode 100644 index 0000000000000000000000000000000000000000..fe12698d68d723009b9673d8d7943e8a08eb384b --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/text_btn_solid_red_circle_corner.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/text_gray_border_white_solid_bg.xml b/JQ_ELOVE/src/main/res/drawable/text_gray_border_white_solid_bg.xml new file mode 100644 index 0000000000000000000000000000000000000000..412bab5a2e9ba82f11a6a1702ef1887f55f3c306 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/text_gray_border_white_solid_bg.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/text_login_register_bg.xml b/JQ_ELOVE/src/main/res/drawable/text_login_register_bg.xml new file mode 100644 index 0000000000000000000000000000000000000000..d0a89189f7ef5841a7c9f26b49e09602859dca82 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/text_login_register_bg.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/text_login_register_un_bg.xml b/JQ_ELOVE/src/main/res/drawable/text_login_register_un_bg.xml new file mode 100644 index 0000000000000000000000000000000000000000..ebfd4cf083f2f008c1597fa90803c470e63c59dd --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/text_login_register_un_bg.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/textview_orange_bg.xml b/JQ_ELOVE/src/main/res/drawable/textview_orange_bg.xml new file mode 100644 index 0000000000000000000000000000000000000000..a22658b696e81bdca3e71d315e98bebd10993611 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/textview_orange_bg.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/third_login_bg.xml b/JQ_ELOVE/src/main/res/drawable/third_login_bg.xml new file mode 100644 index 0000000000000000000000000000000000000000..2136a346d6d7af902c8cd0008a524e3f57444762 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/third_login_bg.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/title_radiobutton_text_color.xml b/JQ_ELOVE/src/main/res/drawable/title_radiobutton_text_color.xml new file mode 100644 index 0000000000000000000000000000000000000000..636aa0798714a1678440d069771109bdc8244e07 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/title_radiobutton_text_color.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/titlebar_click_style.xml b/JQ_ELOVE/src/main/res/drawable/titlebar_click_style.xml new file mode 100644 index 0000000000000000000000000000000000000000..36ad4889e303d45306da35207053da119357531d --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/titlebar_click_style.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/JQ_ELOVE/src/main/res/drawable/titlebar_normal.xml b/JQ_ELOVE/src/main/res/drawable/titlebar_normal.xml new file mode 100644 index 0000000000000000000000000000000000000000..4e5b1156a41f13728fcf10257f726313ce1810ae --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/titlebar_normal.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/JQ_ELOVE/src/main/res/drawable/titlebar_pressed.xml b/JQ_ELOVE/src/main/res/drawable/titlebar_pressed.xml new file mode 100644 index 0000000000000000000000000000000000000000..bb43292096b8159e82e6b2e250e285b0ee21f087 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/titlebar_pressed.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/JQ_ELOVE/src/main/res/drawable/topic_bg_blue.xml b/JQ_ELOVE/src/main/res/drawable/topic_bg_blue.xml new file mode 100644 index 0000000000000000000000000000000000000000..be668290a6ae0f647aa6d5cb743f4ed88620b9db --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/topic_bg_blue.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/transpant_white_bg.xml b/JQ_ELOVE/src/main/res/drawable/transpant_white_bg.xml new file mode 100644 index 0000000000000000000000000000000000000000..32eccc2fd56bc9237533dafaab0ae7b2e26f8c30 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/transpant_white_bg.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/umeng_socialize_action_back.xml b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_action_back.xml new file mode 100644 index 0000000000000000000000000000000000000000..9539e5c33b60f669d8d303c073ea1d0f3feed950 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_action_back.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/umeng_socialize_at_button.xml b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_at_button.xml new file mode 100644 index 0000000000000000000000000000000000000000..2dff9107dc1d7ddb60e1ef40b39f426478694f6b --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_at_button.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/umeng_socialize_bind_bg.9.png b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_bind_bg.9.png new file mode 100644 index 0000000000000000000000000000000000000000..5c92d0c994de26307781241045bbcb4f99d6b879 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_bind_bg.9.png differ diff --git a/JQ_ELOVE/src/main/res/drawable/umeng_socialize_button_blue.9.png b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_button_blue.9.png new file mode 100644 index 0000000000000000000000000000000000000000..260382089e1a64b58af9bd99a9b39064e1e26358 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_button_blue.9.png differ diff --git a/JQ_ELOVE/src/main/res/drawable/umeng_socialize_button_grey.9.png b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_button_grey.9.png new file mode 100644 index 0000000000000000000000000000000000000000..bfafad97e8fd8873640d93926efb5f0c97cca5a6 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_button_grey.9.png differ diff --git a/JQ_ELOVE/src/main/res/drawable/umeng_socialize_button_grey_blue.xml b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_button_grey_blue.xml new file mode 100644 index 0000000000000000000000000000000000000000..8f1977ca2531f016df33d8dd842b7b76e5a62ec8 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_button_grey_blue.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/umeng_socialize_button_login.xml b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_button_login.xml new file mode 100644 index 0000000000000000000000000000000000000000..5f2cdc80fff9ce6682d875e585ba29a1cb124817 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_button_login.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/umeng_socialize_button_red.9.png b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_button_red.9.png new file mode 100644 index 0000000000000000000000000000000000000000..dff8b180b5b6c91544df30def04d3b7d6e34baaa Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_button_red.9.png differ diff --git a/JQ_ELOVE/src/main/res/drawable/umeng_socialize_button_red_blue.xml b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_button_red_blue.xml new file mode 100644 index 0000000000000000000000000000000000000000..c3ceb58dd2cc22c196bfed38ece40279d1576edd --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_button_red_blue.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/umeng_socialize_button_white.9.png b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_button_white.9.png new file mode 100644 index 0000000000000000000000000000000000000000..a8977b1ab3851dd88c70aa05dce8db0c0df538e8 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_button_white.9.png differ diff --git a/JQ_ELOVE/src/main/res/drawable/umeng_socialize_button_white_blue.xml b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_button_white_blue.xml new file mode 100644 index 0000000000000000000000000000000000000000..77c41cd16c58fa3d5cfa1e6570cbff529470271c --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_button_white_blue.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/umeng_socialize_follow_check.xml b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_follow_check.xml new file mode 100644 index 0000000000000000000000000000000000000000..3af06f240a8068d062f0b2271c65079f71953a2c --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_follow_check.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/umeng_socialize_light_bar_bg.9.png b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_light_bar_bg.9.png new file mode 100644 index 0000000000000000000000000000000000000000..fd939321cd9764cd859e71bde65c8ddc213f185d Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_light_bar_bg.9.png differ diff --git a/JQ_ELOVE/src/main/res/drawable/umeng_socialize_oauth_check.xml b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_oauth_check.xml new file mode 100644 index 0000000000000000000000000000000000000000..c14d422a3a15aee77f168162e4c8d9da138eac3c --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_oauth_check.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/umeng_socialize_oauth_check_off.png b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_oauth_check_off.png new file mode 100644 index 0000000000000000000000000000000000000000..11b4664f31a8423e949d7faec8d55bd05911e85e Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_oauth_check_off.png differ diff --git a/JQ_ELOVE/src/main/res/drawable/umeng_socialize_oauth_check_on.png b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_oauth_check_on.png new file mode 100644 index 0000000000000000000000000000000000000000..1cc697f4635c254b2850bb1794ff80fea4274516 Binary files /dev/null and b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_oauth_check_on.png differ diff --git a/JQ_ELOVE/src/main/res/drawable/umeng_socialize_shape_solid_black.xml b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_shape_solid_black.xml new file mode 100644 index 0000000000000000000000000000000000000000..39788fcdcd1ef97e39b3695028dad743d7f517da --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_shape_solid_black.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/umeng_socialize_shape_solid_grey.xml b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_shape_solid_grey.xml new file mode 100644 index 0000000000000000000000000000000000000000..dba6ad9b69897bc26be9f6421f07fb26cb966b1c --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_shape_solid_grey.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/umeng_socialize_share_to_button.xml b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_share_to_button.xml new file mode 100644 index 0000000000000000000000000000000000000000..a5bda1d5de6f2fb186bd9290d5f594c79f90670d --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_share_to_button.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/umeng_socialize_share_transparent_corner.xml b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_share_transparent_corner.xml new file mode 100644 index 0000000000000000000000000000000000000000..b0548f3007d94cd6bf59b172975c5c9f41ff5739 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_share_transparent_corner.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/umeng_socialize_shareboard_item_background.xml b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_shareboard_item_background.xml new file mode 100644 index 0000000000000000000000000000000000000000..b0b2efc86d00cd0e5798707e26cd5f25c7d2f7f2 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_shareboard_item_background.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/umeng_socialize_sidebar_normal.xml b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_sidebar_normal.xml new file mode 100644 index 0000000000000000000000000000000000000000..86b3d78dae583cd9d5ac4253db46605088fa5901 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_sidebar_normal.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/umeng_socialize_sidebar_selected.xml b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_sidebar_selected.xml new file mode 100644 index 0000000000000000000000000000000000000000..b57a8c3d32c14da8c1e1654a59164b251b417e8c --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_sidebar_selected.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/umeng_socialize_sidebar_selector.xml b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_sidebar_selector.xml new file mode 100644 index 0000000000000000000000000000000000000000..ff260e628e262b4325969ba78d13d170bd94ed2b --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_sidebar_selector.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/umeng_socialize_title_back_bt.xml b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_title_back_bt.xml new file mode 100644 index 0000000000000000000000000000000000000000..d481c7f43ea3b79b63322f260aae8c2cf658c32a --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_title_back_bt.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/umeng_socialize_title_right_bt.xml b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_title_right_bt.xml new file mode 100644 index 0000000000000000000000000000000000000000..f02fbd53d1bb54ab0d60ad6cf356d1a259c2119b --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_title_right_bt.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/umeng_socialize_title_tab_button_left.xml b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_title_tab_button_left.xml new file mode 100644 index 0000000000000000000000000000000000000000..918d555d49e85607cae60fcd0d265144deb82a68 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_title_tab_button_left.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/umeng_socialize_title_tab_button_right.xml b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_title_tab_button_right.xml new file mode 100644 index 0000000000000000000000000000000000000000..836dcfc97c67911de6ceb6665c276b4be2dd9212 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_title_tab_button_right.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/umeng_socialize_window_shadow_pad.xml b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_window_shadow_pad.xml new file mode 100644 index 0000000000000000000000000000000000000000..83b632684411c4b9b9f4cef924821e7d893d23a2 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/umeng_socialize_window_shadow_pad.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/drawable/voice_animation.xml b/JQ_ELOVE/src/main/res/drawable/voice_animation.xml new file mode 100644 index 0000000000000000000000000000000000000000..71fa0019fa42f5a7b04de6d64efcf01da3459bf0 --- /dev/null +++ b/JQ_ELOVE/src/main/res/drawable/voice_animation.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/layout-sw550dp-large/umeng_socialize_full_alert_dialog.xml b/JQ_ELOVE/src/main/res/layout-sw550dp-large/umeng_socialize_full_alert_dialog.xml new file mode 100644 index 0000000000000000000000000000000000000000..237f694dd53e91e6015834c8c914e6a4d85a4b14 --- /dev/null +++ b/JQ_ELOVE/src/main/res/layout-sw550dp-large/umeng_socialize_full_alert_dialog.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/layout-sw550dp-large/umeng_socialize_oauth_dialog.xml b/JQ_ELOVE/src/main/res/layout-sw550dp-large/umeng_socialize_oauth_dialog.xml new file mode 100644 index 0000000000000000000000000000000000000000..9138ef2724bb2dffbecb0e481beca636ead70eef --- /dev/null +++ b/JQ_ELOVE/src/main/res/layout-sw550dp-large/umeng_socialize_oauth_dialog.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/layout-sw550dp-large/umeng_socialize_post_share.xml b/JQ_ELOVE/src/main/res/layout-sw550dp-large/umeng_socialize_post_share.xml new file mode 100644 index 0000000000000000000000000000000000000000..de7517bdd0d0ea74bd6e3d2c00c8ba1f98464634 --- /dev/null +++ b/JQ_ELOVE/src/main/res/layout-sw550dp-large/umeng_socialize_post_share.xml @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/JQ_ELOVE/src/main/res/layout-sw550dp-large/umeng_socialize_titile_bar.xml b/JQ_ELOVE/src/main/res/layout-sw550dp-large/umeng_socialize_titile_bar.xml new file mode 100644 index 0000000000000000000000000000000000000000..520122b59a74ae7a6ed7b7b188df1deff209af8f --- /dev/null +++ b/JQ_ELOVE/src/main/res/layout-sw550dp-large/umeng_socialize_titile_bar.xml @@ -0,0 +1,78 @@ + + + +