diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..972835b --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +*.iml +.gradle +/local.properties +/.idea +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +/.idea +**/*.iml +**/build +/gradle/ +/app/lint-baseline.xml diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..7e4a2dc --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 NetEase, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index bfb0ef4..d2bed12 100644 --- a/README.md +++ b/README.md @@ -1,93 +1,47 @@ -# yuliao +淘梦购基于云信IM UIKIT +云信 IM UIKit 是基于网易云信 IM SDK 开发的一款即时通讯 UI 组件库,包括聊天、会话、圈组、搜索、群管理等组件。通过 IM UIKit,可快速集成包含 UI 界面的即时通讯应用。 +IM UIKit 简化了基于 NIM SDK 的应用开发过程。它不仅能助您快速实现 UI 功能,也支持调用 NIM SDK 相应的接口实现即时通讯业务逻辑和数据处理。因此,您在使用 IM UIKit +时仅需关注自身业务或个性化扩展。 -## Getting started +## 功能优势 -To make it easy for you to get started with GitLab, here's a list of recommended next steps. +优势 | 说明 +---- | -------------- +UI 组件解耦 | IM UIKit 不同组件可相互独立运行使用。您可按需选择组件,将其快速集成到您的应用,实现相应的 UI 功能,减少无用依赖。 +UI 能力简洁易用 |IM UIKit 的业务逻辑层与 UI 层相互独立。在 UI 层,您仅需关注视图展示和事件处理。IM UIKit 清晰的数据流转处理,让 UI 层代码更简洁易懂。 +强大的自定义能力 | IM UIKit 支持在各 UI 组件的初始化过程中配置自定义 UI。同时提供 Fragment 和 View 的能力封装,助您快速将 UI 功能添加到您的应用中。 +完善的业务逻辑处理 | IM UIKit 业务逻辑层提供完善的业务逻辑处理能力。您无需关心 SDK 层不同接口间的复杂处理逻辑,业务逻辑层一个接口帮您搞定所有。 -Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)! +## 技术原理 -## Add your files +### 工作原理 -- [ ] [Create](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file) or [upload](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#upload-a-file) files -- [ ] [Add files using the command line](https://docs.gitlab.com/ee/gitlab-basics/add-file.html#add-a-file-using-the-command-line) or push an existing Git repository with the following command: +IM UIKit 采用 (Model–View–ViewModel)MVVM 架构模型,实现 UI 展示与业务逻辑开发的相互独立。 -``` -cd existing_repo -git remote add origin http://git.dengshikj.com/xuhuixiang/yuliao.git -git branch -M master -git push -uf origin master -``` +![IMuikitDataFlow_Android.png](https://yx-web-nosdn.netease.im/common/f1663a580335822a9770e486c3ea3e12/IMuikitDataFlow_Android.png) -## Integrate with your tools +流程 | 说明 +---- | -------------- +1 | IM UIKit 展示层的 Activity/Fragment/View 向响应层的 ViewModel 发送请求。 +2 | ViewModel 将请求经由业务逻辑层转发至 NIM SDK(网易云信 IM SDK)。 +3 | NIM SDK 接收请求后触发回调,回调数据经由业务逻辑层和响应层发送至 Activity/Fragment/View。 +4 | Activity/Fragment/View 将回调数据发送至 RecyclerViewAdapter。后者根据界面需要展示的不同实体的 type,判定具体的 UI 样式。例如,SDK 返回的回调数据为消息数据时,RecyclerViewAdapter 可判定消息数据中包含的消息类型(即 type),将消息在 UI 上展示为对应类型的样式。 -- [ ] [Set up project integrations](http://git.dengshikj.com/xuhuixiang/yuliao/-/settings/integrations) +### 产品架构 -## Collaborate with your team +![IMuikitArch.png](https://yx-web-nosdn.netease.im/common/4e67f1f8f355db7b8ea86ef8f9332011/IMuikitArch.png) -- [ ] [Invite team members and collaborators](https://docs.gitlab.com/ee/user/project/members/) -- [ ] [Create a new merge request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html) -- [ ] [Automatically close issues from merge requests](https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically) -- [ ] [Enable merge request approvals](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/) -- [ ] [Set auto-merge](https://docs.gitlab.com/ee/user/project/merge_requests/merge_when_pipeline_succeeds.html) +上图中: -## Test and Deploy +- UIKit UI 层的 `ContactKit-ui`、`ChatKit-ui`、`ConversationKit-ui` 和 `QChatKit-ui`,对应上述工作原理图中的 + Activity/Fragment/View。 +- UIKit UI 层的 `ContactKit`、`ChatKit` `ConversationKit` 和 `QChatKit`,对应上述工作原理图中的 Repository。 +- UIKitCore 层对应上述工作原理图中的 Provider。 -Use the built-in continuous integration in GitLab. +详见[IM UIKit介绍](https://doc.yunxin.163.com/docs/TM5MzM5Njk/zMxMTgxMjE?platformId=60002)。 -- [ ] [Get started with GitLab CI/CD](https://docs.gitlab.com/ee/ci/quick_start/index.html) -- [ ] [Analyze your code for known vulnerabilities with Static Application Security Testing (SAST)](https://docs.gitlab.com/ee/user/application_security/sast/) -- [ ] [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/requirements.html) -- [ ] [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/ee/user/clusters/agent/) -- [ ] [Set up protected environments](https://docs.gitlab.com/ee/ci/environments/protected_environments.html) +## IM UIKit 集成 -*** - -# Editing this README - -When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thanks to [makeareadme.com](https://www.makeareadme.com/) for this template. - -## Suggestions for a good README - -Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information. - -## Name -Choose a self-explaining name for your project. - -## Description -Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors. - -## Badges -On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge. - -## Visuals -Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method. - -## Installation -Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection. - -## Usage -Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README. - -## Support -Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc. - -## Roadmap -If you have ideas for releases in the future, it is a good idea to list them in the README. - -## Contributing -State if you are open to contributions and what your requirements are for accepting them. - -For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self. - -You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser. - -## Authors and acknowledgment -Show your appreciation to those who have contributed to the project. - -## License -For open source projects, say how it is licensed. - -## Project status -If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers. +具体的集成流程,请参见[快速集成 IM UIKit](https://doc.yunxin.163.com/docs/TM5MzM5Njk/Tg5NjA2ODE)。 \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts new file mode 100644 index 0000000..7ff1abe --- /dev/null +++ b/app/build.gradle.kts @@ -0,0 +1,250 @@ +import com.android.build.api.dsl.VariantDimension +import com.android.build.api.variant.BuildConfigField + +/* + * Copyright (c) 2022 NetEase, Inc. All rights reserved. + * Use of this source code is governed by a MIT license that can be found in the LICENSE file. + */ + +plugins { + id("com.android.application") + id("com.google.gms.google-services") + id("com.huawei.agconnect") +} + + +android { + + signingConfigs { +// getByName("debug") { +// storeFile = file("..\\dsjk_keystore.jks") +// storePassword = "123456" +// keyAlias = "key0" +// keyPassword = "123456" +// } + create("release") { + storeFile = file("..\\dsjk_keystore.jks") + storePassword = "123456" + keyAlias = "key0" + keyPassword = "123456" + } + } + lint { + // i如果为 true,则在发现错误时停止 gradle 构建 + abortOnError = false + // 设置为 true 以使所有发布版本针对严重性=致命的问题运行 lint,如果发现致命问题, + // 则中止生成(由上面的 abortOnError 控制) + checkReleaseBuilds = false + } + + compileSdk = 34 + + defaultConfig { + manifestPlaceholders += mapOf() + applicationId = "com.dskj.rbchat" + minSdk = 24 + targetSdk = 34 + versionCode = 185 + versionName = "1.8.5" + multiDexEnabled = true + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" +// manifestPlaceholders["IMAPPKEY"] = "c38c8bbebf7d12992d2a361bfceb6c6f" //正式 + manifestPlaceholders["IMAPPKEY"] = "4cb6b0998f9e7af9d7673963e429959a" //测试 + + manifestPlaceholders["JPUSH_PKGNAME"] = "com.dskj.rbchat" + manifestPlaceholders["JPUSH_APPKEY"] = "9041bc22de91e3d9af3cfd23" + manifestPlaceholders["JPUSH_CHANNEL"] = "developer-default" + + ndk { + abiFilters += listOf("armeabi-v7a", "arm64-v8a") + } + } + + buildTypes { + getByName("release") { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + signingConfig = signingConfigs.getByName("release") + isDebuggable = false; + + buildConfigField( + "String", + "HTTPS_BASE_URL", + "\"https://api.letschat2023.com/\"" + ) + //正式服 +// manifestPlaceholders["IMAPPKEY"] = "c38c8bbebf7d12992d2a361bfceb6c6f" + manifestPlaceholders["IMAPPKEY"] = "4cb6b0998f9e7af9d7673963e429959a" + + } + + getByName("debug") { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + signingConfig = signingConfigs.getByName("release") + isDebuggable = true + + buildConfigField( + "String", + "HTTPS_BASE_URL", + "\"https://api-test.letschat2023.com/\"" + ) + //测试APPKEY + manifestPlaceholders["IMAPPKEY"] = "4cb6b0998f9e7af9d7673963e429959a" +// manifestPlaceholders["IMAPPKEY"] = "c38c8bbebf7d12992d2a361bfceb6c6f" + + + } + lint { + baseline = file("lint-baseline.xml") + } + + } + + + + buildFeatures { + viewBinding = true + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + packagingOptions { + jniLibs.pickFirsts.add("lib/arm64-v8a/libc++_shared.so") + jniLibs.pickFirsts.add("lib/armeabi-v7a/libc++_shared.so") + } + namespace = "com.dskj.rbchat" + + +// applicationVariants.all { +// compileConfiguration.resolutionStrategy { +// +// } +// +// runtimeConfiguration.resolutionStrategy { +// +// } +// } + + configurations { + all { + exclude(group = "com.google.guava", module = "listenablefuture") + } + } +} + +dependencies { + val room_version = "2.4.3" + + implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar", "*.aar")))) + implementation("androidx.appcompat:appcompat:1.6.1") + implementation("com.google.android.material:material:1.8.0") + implementation("androidx.constraintlayout:constraintlayout:2.1.4") + implementation("androidx.multidex:multidex:2.0.1") + //local module code + implementation(project(":contactkit-ui")) + implementation(project(":conversationkit-ui")) + implementation(project(":teamkit-ui")) + implementation(project(":chatkit-ui")) + implementation(project(":locationkit")) + implementation(project(":fingermanager")) +// implementation(project(":citypickerview")) +// implementation("com.netease.yunxin.kit.contact:contactkit-ui:9.6.2") +// implementation("com.netease.yunxin.kit.conversation:conversationkit-ui:9.6.2") +// implementation("com.netease.yunxin.kit.team:teamkit-ui:9.6.2") +// implementation("com.netease.yunxin.kit.chat:chatkit-ui:9.6.2") +// implementation("com.netease.yunxin.kit.locationkit:locationkit:9.6.2") + implementation("com.netease.yunxin.kit.call:call-ui:1.8.2") //呼叫组件 UI 包 + api("com.netease.nimlib:avsignalling:9.11.0") //呼叫组件 依赖信令包 + api("com.netease.nimlib:basesdk:9.11.0") //IM SDK + implementation("com.airbnb.android:lottie:5.0.3") + implementation("com.github.bumptech.glide:glide:4.13.1") + implementation("jp.wasabeef:glide-transformations:4.3.0") + //retrofit2 + implementation("com.squareup.retrofit2:retrofit:2.9.0") + implementation("com.squareup.retrofit2:converter-gson:2.9.0") + implementation("com.squareup.retrofit2:converter-scalars:2.9.0") + + implementation("com.squareup.okhttp3:okhttp:4.9.3") + implementation("com.huawei.hms:push:6.3.0.302") { + exclude(group = "com.huawei.hms", module = "update") // com.huawei.hms:update + exclude(group = "com.huawei.hms", module = "availableupdate") // com.huawei.hms:update + } + implementation("com.meizu.flyme.internet:push-internal:4.1.0") + implementation("com.huawei.agconnect:agconnect-core:1.6.5.300") + // Hilt 对于ViewModel的支持 + implementation("androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha02") + implementation("androidx.hilt:hilt-compiler:1.0.0-alpha02") + + implementation("com.google.code.gson:gson:2.9.0") + implementation("commons-codec:commons-codec:1.10") + implementation("androidx.annotation:annotation:1.3.0") + + + //smartrefresh + implementation("io.github.scwang90:refresh-layout-kernel:2.0.6") //核心必须依赖 + implementation("io.github.scwang90:refresh-header-classics:2.0.6") //经典刷新头 + implementation("io.github.scwang90:refresh-header-material:2.0.6") //谷歌刷新头 + implementation("io.github.scwang90:refresh-footer-classics:2.0.6") //经典加载 + + +// implementation("com.ethanhua:skeleton:1.1.2") +// implementation("io.supercharge:shimmerlayout:2.1.0") + +// implementation("com.github.lzyzsd:jsbridge:1.0.4") + implementation("com.tencent.bugly:crashreport:4.0.4") + implementation("com.google.firebase:firebase-messaging:23.0.5") +// implementation("com.google.firebase:firebase-analytics:20.0.0") + implementation(platform("com.google.firebase:firebase-bom:32.3.1")) + //skeleton + implementation("com.github.ethanhua:Skeleton:ff06517d4629e87328c41a1cce614c490ed7fb51") + implementation("io.supercharge:shimmerlayout:2.1.0") + //jsbridge + implementation("com.github.lzyzsd:jsbridge:1.0.4") + implementation("com.smallbuer:jsbridge:1.0.7") + + + //华为scanplus + implementation("com.huawei.hms:scanplus:2.12.0.301") + + implementation("com.tencent.mm.opensdk:wechat-sdk-android:6.8.0") + implementation("com.youth.banner:banner:1.4.9") + + implementation("com.github.iwgang:simplifyspan:2.1") + implementation("io.github.hariprasanths:bounceview-android:0.2.0") +// implementation("com.contrarywind:Android-PickerView:4.1.9") + implementation("com.aliyun.dpa:oss-android-sdk:2.9.13") + implementation("com.github.jenly1314:zxing-lite:2.1.1") + implementation("com.blankj:utilcodex:1.31.0") +// implementation("com.github.jenly1314.AppUpdater:app-updater:1.1.3") + implementation("cn.jiguang.sdk:jpush:5.0.7") // 必选,此处以JPush 5.0.7 版本为例,注意:5.0.0 版本开始可以自动拉取 JCore 包,无需另外配置 + implementation("cn.jiguang.sdk.plugin:fcm:5.0.7") + implementation("cn.jiguang.sdk:joperate:2.0.2") // 可选,集成极光分析SDK后,即可支持行为触发推送消息、推送转化率统计,用户行为分析和用户标签等功能 + implementation("com.github.SherlockGougou:BigImageViewPager:androidx-7.2.5") + annotationProcessor("com.github.bumptech.glide:compiler:4.11.0") + + implementation("com.google.android.gms:play-services-location:21.0.1") + implementation("com.google.android.gms:play-services-maps:18.2.0") +// implementation("com.gitee.sakaue:QSVideoPayer:2.2.9") +// implementation("tv.danmaku.ijk.media:ijkplayer-armv5:0.8.8") +// implementation("tv.danmaku.ijk.media:ijkplayer-arm64:0.8.8") + + implementation("androidx.room:room-runtime:$room_version") + annotationProcessor("androidx.room:room-compiler:$room_version") + // optional - RxJava2 support for Room + implementation("androidx.room:room-rxjava2:$room_version") + // optional - Paging 3 Integration + implementation("androidx.room:room-paging:$room_version") +// implementation("com.esotericsoftware.spine:spine-libgdx:4.1.00") +// implementation("com.esotericsoftware:spine-runtimes:+") + +} diff --git a/app/google-services.json b/app/google-services.json new file mode 100644 index 0000000..0679dbe --- /dev/null +++ b/app/google-services.json @@ -0,0 +1,47 @@ +{ + "project_info": { + "project_number": "989332659051", + "project_id": "comechat-d5578", + "storage_bucket": "comechat-d5578.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:989332659051:android:0786cc1d32916e1569ca2e", + "android_client_info": { + "package_name": "com.dskj.rbchat" + } + }, + "oauth_client": [ + { + "client_id": "989332659051-s972adtvoscso4480ja4llhi73mbbog2.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.dskj.rbchat", + "certificate_hash": "1d5a6262622999ac2f1c4a9f2fe5edf30dafebd2" + } + }, + { + "client_id": "989332659051-boaaglqh8oariulu58hfhmlefa4osu04.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyAAXviskUffLY3KfnrKVPlwcj5Ks5ces_8" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "989332659051-boaaglqh8oariulu58hfhmlefa4osu04.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/app/libs/MiPush_SDK_Client_3_7_0.jar b/app/libs/MiPush_SDK_Client_3_7_0.jar new file mode 100644 index 0000000..748266b Binary files /dev/null and b/app/libs/MiPush_SDK_Client_3_7_0.jar differ diff --git a/app/libs/SparkChain.aar b/app/libs/SparkChain.aar new file mode 100644 index 0000000..e058a2b Binary files /dev/null and b/app/libs/SparkChain.aar differ diff --git a/app/libs/com.heytap.msp-push-2.1.0.aar b/app/libs/com.heytap.msp-push-2.1.0.aar new file mode 100644 index 0000000..197f12c Binary files /dev/null and b/app/libs/com.heytap.msp-push-2.1.0.aar differ diff --git a/app/libs/vivo_pushSDK_v3.0.0.4_484.aar b/app/libs/vivo_pushSDK_v3.0.0.4_484.aar new file mode 100644 index 0000000..f278999 Binary files /dev/null and b/app/libs/vivo_pushSDK_v3.0.0.4_484.aar differ diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..702de19 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,198 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle.kts. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile + +## IM SDK +-dontwarn com.netease.nim.** +-keep class com.netease.nim.** {*;} + +-dontwarn com.netease.nimlib.** +-keep class com.netease.nimlib.** {*;} + +-dontwarn com.netease.share.** +-keep class com.netease.share.** {*;} + +-dontwarn com.netease.mobsec.** +-keep class com.netease.mobsec.** {*;} + +#如果你使用全文检索插件,需要加入 +-dontwarn org.apache.lucene.** +-keep class org.apache.lucene.** {*;} + +#讯飞混淆 +-keep class com.iflytek.sparkchain.** {*;} +-keep class com.iflytek.sparkchain.** + +-keep class com.fractalwrench.** { *; } + + +## IMUIKit +-dontwarn com.netease.yunxin.kit.** +-keep class com.netease.yunxin.kit.** {*;} +-keep public class * extends com.netease.yunxin.kit.corekit.XKitInitOptions +-keep class * implements com.netease.yunxin.kit.corekit.XKitService {*;} + +## 呼叫组件混淆 +-keep class com.netease.lava.** {*;} +-keep class com.netease.yunxin.** {*;} + +### glide 4 +-keep public class * implements com.bumptech.glide.module.GlideModule +-keep public class * extends com.bumptech.glide.module.AppGlideModule +-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** { + **[] $VALUES; + public *; +} + +-keep class com.alibaba.sdk.android.oss.** { *; } +-dontwarn okio.** +-dontwarn org.apache.commons.codec.binary.** + +#okhttp +-dontwarn okhttp3.** +-keep class okhttp3.**{*;} + +#如果你使用全文检索插件,需要加入 +-dontwarn org.apache.lucene.** +-keep class org.apache.lucene.** {*;} + +#如果你开启数据库功能,需要加入 +-keep class net.sqlcipher.** {*;} + +-keep class com.google.android.material.** {*;} + +-keep class androidx.** {*;} + +-keep public class * extends androidx.** + +-keep interface androidx.** {*;} + +-dontwarn com.google.android.material.** + +-dontnote com.google.android.material.** + +-dontwarn androidx.** + +### APP 3rd party jars(xiaomi push) +-dontwarn com.xiaomi.push.** +-keep class com.xiaomi.** {*;} + +### APP 3rd party jars(huawei push) +-ignorewarnings +-keepattributes *Annotation* +-keepattributes Exceptions +-keepattributes InnerClasses +-keepattributes Signature +-keepattributes SourceFile,LineNumberTable +# hmscore-support: remote transport +-keep class com.huawei.hianalytics.**{*;} +-keep class com.huawei.updatesdk.**{*;} +-keep class com.huawei.hms.**{*;} + +### APP 3rd party jars(meizu push) +-dontwarn com.meizu.cloud.** +-keep class com.meizu.cloud.** {*;} + +#vivo +-dontwarn com.vivo.push.** +-keep class com.vivo.push.** {*;} +-keep class com.vivo.vms.** {*;} +-keep class com.netease.nimlib.mixpush.vivo.VivoPushReceiver {*;} + +#oppo +-keep public class * extends android.app.Service +-keep class com.heytap.msp.** { *;} + + +### org.json xml +-dontwarn org.json.** +-keep class org.json.**{*;} + + +#okio +-dontwarn okio.** +-keep class okio.**{*;} + +-keepclasseswithmembernames class * { + native ; +} + +-keepclasseswithmembers class * { + public (android.content.Context, android.util.AttributeSet); + public (android.content.Context, android.util.AttributeSet, int); +} + +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} + +-keep class * implements android.os.Parcelable { + public static final android.os.Parcelable$Creator *; +} + +-keepclassmembers class * implements java.io.Serializable { + static final long serialVersionUID; + private static final java.io.ObjectStreamField[] serialPersistentFields; + private void writeObject(java.io.ObjectOutputStream); + private void readObject(java.io.ObjectInputStream); + java.lang.Object writeReplace(); + java.lang.Object readResolve(); +} + +-keep class **.R$* { + *; + +} + +-dontwarn com.google.** +-keep class com.google.** {*;} + +-keep public class * extends android.app.Service +-keep class com.heytap.msp.** { *;} + + + +-dontwarn com.dskj.rbchat.** +-keep class com.dskj.rbchat.** {*;} + +# NIM SDK的类,如果集成IM时已经添加,请忽略 +-dontwarn com.netease.nim.** +-keep class com.netease.nim.** {*;} + +-dontwarn com.netease.nimlib.** +-keep class com.netease.nimlib.** {*;} + +-dontwarn com.netease.share.** +-keep class com.netease.share.** {*;} + +-dontwarn com.netease.mobsec.** +-keep class com.netease.mobsec.** {*;} + +# NERTC SDK的类 +-keep class com.netease.lava.** {*;} +-keep class com.netease.yunxin.** {*;} + +# 呼叫组件的类 +-dontwarn com.netease.yunxin.kit.** +-keep class com.netease.yunxin.kit.** {*;} +-keep public class * extends com.netease.yunxin.kit.corekit.XKitInitOptions +-keep class * implements com.netease.yunxin.kit.corekit.XKitService {*;} \ No newline at end of file diff --git a/app/release/TimeGo-release-v1.8.5-0803.apk b/app/release/TimeGo-release-v1.8.5-0803.apk new file mode 100644 index 0000000..5e30b22 Binary files /dev/null and b/app/release/TimeGo-release-v1.8.5-0803.apk differ diff --git a/app/release/output-metadata.json b/app/release/output-metadata.json new file mode 100644 index 0000000..04ba12c --- /dev/null +++ b/app/release/output-metadata.json @@ -0,0 +1,20 @@ +{ + "version": 3, + "artifactType": { + "type": "APK", + "kind": "Directory" + }, + "applicationId": "com.dskj.rbchat", + "variantName": "release", + "elements": [ + { + "type": "SINGLE", + "filters": [], + "attributes": [], + "versionCode": 185, + "versionName": "1.8.5", + "outputFile": "app-release.apk" + } + ], + "elementType": "File" +} \ No newline at end of file diff --git a/app/release/timeGo-release-v1.8.5-0803.aab b/app/release/timeGo-release-v1.8.5-0803.aab new file mode 100644 index 0000000..a01eba3 Binary files /dev/null and b/app/release/timeGo-release-v1.8.5-0803.aab differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..fc034f4 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,953 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/assets/countrycn.json b/app/src/main/assets/countrycn.json new file mode 100644 index 0000000..9ebc726 --- /dev/null +++ b/app/src/main/assets/countrycn.json @@ -0,0 +1,776 @@ +[ + { + "countryName": "安道尔", + "areaCodeName": "+376" + }, + { + "countryName": "阿联酋", + "areaCodeName": "+971" + }, + { + "countryName": "阿富汗", + "areaCodeName": "+93" + }, + { + "countryName": "安提瓜和巴布达", + "areaCodeName": "+1268" + }, + { + "countryName": "安圭拉", + "areaCodeName": "+1264" + }, + { + "countryName": "阿尔巴尼亚", + "areaCodeName": "+355" + }, + { + "countryName": "亚美尼亚", + "areaCodeName": "+374" + }, + { + "countryName": "安哥拉", + "areaCodeName": "+244" + }, + { + "countryName": "阿根廷", + "areaCodeName": "+54" + }, + { + "countryName": "奥地利", + "areaCodeName": "+43" + }, + { + "countryName": "澳大利亚", + "areaCodeName": "+61" + }, + { + "countryName": "阿鲁巴", + "areaCodeName": "+297" + }, + { + "countryName": "阿塞拜疆", + "areaCodeName": "+994" + }, + { + "countryName": "波斯尼亚和黑塞哥维那", + "areaCodeName": "+387" + }, + { + "countryName": "巴巴多斯", + "areaCodeName": "+1246" + }, + { + "countryName": "孟加拉国", + "areaCodeName": "+880" + }, + { + "countryName": "比利时", + "areaCodeName": "+32" + }, + { + "countryName": "布基纳法索", + "areaCodeName": "+226" + }, + { + "countryName": "保加利亚", + "areaCodeName": "+359" + }, + { + "countryName": "巴林", + "areaCodeName": "+973" + }, + { + "countryName": "布隆迪", + "areaCodeName": "+257" + }, + { + "countryName": "贝宁", + "areaCodeName": "+229" + }, + { + "countryName": "圣巴泰勒米", + "areaCodeName": "+590" + }, + { + "countryName": "百慕大", + "areaCodeName": "+1441" + }, + { + "countryName": "文莱", + "areaCodeName": "+673" + }, + { + "countryName": "玻利维亚", + "areaCodeName": "+591" + }, + { + "countryName": "巴西", + "areaCodeName": "+55" + }, + { + "countryName": "巴哈马", + "areaCodeName": "+1242" + }, + { + "countryName": "不丹", + "areaCodeName": "+975" + }, + { + "countryName": "博茨瓦纳", + "areaCodeName": "+267" + }, + { + "countryName": "白俄罗斯", + "areaCodeName": "+375" + }, + { + "countryName": "伯利兹", + "areaCodeName": "+501" + }, + { + "countryName": "加拿大", + "areaCodeName": "+1" + }, + { + "countryName": "刚果民主共和国", + "areaCodeName": "+243" + }, + { + "countryName": "中非共和国", + "areaCodeName": "+236" + }, + { + "countryName": "刚果共和国", + "areaCodeName": "+242" + }, + { + "countryName": "瑞士", + "areaCodeName": "+41" + }, + { + "countryName": "科特迪瓦", + "areaCodeName": "+225" + }, + { + "countryName": "库克群岛", + "areaCodeName": "+682" + }, + { + "countryName": "智利", + "areaCodeName": "+56" + }, + { + "countryName": "喀麦隆", + "areaCodeName": "+237" + }, + { + "countryName": "中国", + "areaCodeName": "+86" + }, + { + "countryName": "哥伦比亚", + "areaCodeName": "+57" + }, + { + "countryName": "哥斯达黎加", + "areaCodeName": "+506" + }, + { + "countryName": "古巴", + "areaCodeName": "+53" + }, + { + "countryName": "佛得角", + "areaCodeName": "+238" + }, + { + "countryName": "塞浦路斯", + "areaCodeName": "+357" + }, + { + "countryName": "捷克共和国", + "areaCodeName": "+420" + }, + { + "countryName": "德国", + "areaCodeName": "+49" + }, + { + "countryName": "吉布提", + "areaCodeName": "+253" + }, + { + "countryName": "丹麦", + "areaCodeName": "+45" + }, + { + "countryName": "多米尼克", + "areaCodeName": "+1767" + }, + { + "countryName": "多米尼加共和国", + "areaCodeName": "+1809" + }, + { + "countryName": "阿尔及利亚", + "areaCodeName": "+213" + }, + { + "countryName": "厄瓜多尔", + "areaCodeName": "+593" + }, + { + "countryName": "爱沙尼亚", + "areaCodeName": "+372" + }, + { + "countryName": "埃及", + "areaCodeName": "+20" + }, + { + "countryName": "厄立特里亚", + "areaCodeName": "+291" + }, + { + "countryName": "西班牙", + "areaCodeName": "+34" + }, + { + "countryName": "埃塞俄比亚", + "areaCodeName": "+251" + }, + { + "countryName": "芬兰", + "areaCodeName": "+358" + }, + { + "countryName": "斐济", + "areaCodeName": "+679" + }, + { + "countryName": "密克罗尼西亚", + "areaCodeName": "+691" + }, + { + "countryName": "法国", + "areaCodeName": "+33" + }, + { + "countryName": "加蓬", + "areaCodeName": "+241" + }, + { + "countryName": "英国", + "areaCodeName": "+44" + }, + { + "countryName": "格林纳达", + "areaCodeName": "+1473" + }, + { + "countryName": "格鲁吉亚", + "areaCodeName": "+995" + }, + { + "countryName": "加纳", + "areaCodeName": "+233" + }, + { + "countryName": "冈比亚", + "areaCodeName": "+220" + }, + { + "countryName": "几内亚", + "areaCodeName": "+224" + }, + { + "countryName": "赤道几内亚", + "areaCodeName": "+240" + }, + { + "countryName": "希腊", + "areaCodeName": "+30" + }, + { + "countryName": "危地马拉", + "areaCodeName": "+502" + }, + { + "countryName": "几内亚比绍", + "areaCodeName": "+245" + }, + { + "countryName": "圭亚那", + "areaCodeName": "+592" + }, + { + "countryName": "中国香港特别行政区", + "areaCodeName": "+852" + }, + { + "countryName": "洪都拉斯", + "areaCodeName": "+504" + }, + { + "countryName": "克罗地亚", + "areaCodeName": "+385" + }, + { + "countryName": "海地", + "areaCodeName": "+509" + }, + { + "countryName": "匈牙利", + "areaCodeName": "+36" + }, + { + "countryName": "印度尼西亚", + "areaCodeName": "+62" + }, + { + "countryName": "爱尔兰", + "areaCodeName": "+353" + }, + { + "countryName": "以色列", + "areaCodeName": "+972" + }, + { + "countryName": "印度", + "areaCodeName": "+91" + }, + { + "countryName": "伊拉克", + "areaCodeName": "+964" + }, + { + "countryName": "伊朗", + "areaCodeName": "+98" + }, + { + "countryName": "冰岛", + "areaCodeName": "+354" + }, + { + "countryName": "意大利", + "areaCodeName": "+39" + }, + { + "countryName": "牙买加", + "areaCodeName": "+1876" + }, + { + "countryName": "约旦", + "areaCodeName": "+962" + }, + { + "countryName": "日本", + "areaCodeName": "+81" + }, + { + "countryName": "肯尼亚", + "areaCodeName": "+254" + }, + { + "countryName": "吉尔吉斯斯坦", + "areaCodeName": "+996" + }, + { + "countryName": "柬埔寨", + "areaCodeName": "+855" + }, + { + "countryName": "基里巴斯", + "areaCodeName": "+686" + }, + { + "countryName": "科摩罗", + "areaCodeName": "+269" + }, + { + "countryName": "圣基茨和尼维斯", + "areaCodeName": "+1869" + }, + { + "countryName": "朝鲜", + "areaCodeName": "+850" + }, + { + "countryName": "韩国", + "areaCodeName": "+82" + }, + { + "countryName": "科威特", + "areaCodeName": "+965" + }, + { + "countryName": "哈萨克斯坦", + "areaCodeName": "+7" + }, + { + "countryName": "老挝", + "areaCodeName": "+856" + }, + { + "countryName": "黎巴嫩", + "areaCodeName": "+961" + }, + { + "countryName": "圣卢西亚", + "areaCodeName": "+1758" + }, + { + "countryName": "列支敦士登", + "areaCodeName": "+423" + }, + { + "countryName": "斯里兰卡", + "areaCodeName": "+94" + }, + { + "countryName": "利比里亚", + "areaCodeName": "+231" + }, + { + "countryName": "莱索托", + "areaCodeName": "+266" + }, + { + "countryName": "立陶宛", + "areaCodeName": "+370" + }, + { + "countryName": "卢森堡", + "areaCodeName": "+352" + }, + { + "countryName": "拉脱维亚", + "areaCodeName": "+371" + }, + { + "countryName": "利比亚", + "areaCodeName": "+218" + }, + { + "countryName": "摩洛哥", + "areaCodeName": "+212" + }, + { + "countryName": "摩纳哥", + "areaCodeName": "+377" + }, + { + "countryName": "摩尔多瓦", + "areaCodeName": "+373" + }, + { + "countryName": "马达加斯加", + "areaCodeName": "+261" + }, + { + "countryName": "马里", + "areaCodeName": "+223" + }, + { + "countryName": "缅甸", + "areaCodeName": "+95" + }, + { + "countryName": "蒙古", + "areaCodeName": "+976" + }, + { + "countryName": "中国澳门特别行政区", + "areaCodeName": "+853" + }, + { + "countryName": "蒙特塞拉特", + "areaCodeName": "+1664" + }, + { + "countryName": "马耳他", + "areaCodeName": "+356" + }, + { + "countryName": "毛里求斯", + "areaCodeName": "+230" + }, + { + "countryName": "马尔代夫", + "areaCodeName": "+960" + }, + { + "countryName": "马拉维", + "areaCodeName": "+265" + }, + { + "countryName": "墨西哥", + "areaCodeName": "+52" + }, + { + "countryName": "马来西亚", + "areaCodeName": "+60" + }, + { + "countryName": "莫桑比克", + "areaCodeName": "+258" + }, + { + "countryName": "纳米比亚", + "areaCodeName": "+264" + }, + { + "countryName": "尼日尔", + "areaCodeName": "+227" + }, + { + "countryName": "尼日利亚", + "areaCodeName": "+234" + }, + { + "countryName": "尼加拉瓜", + "areaCodeName": "+505" + }, + { + "countryName": "荷兰", + "areaCodeName": "+31" + }, + { + "countryName": "挪威", + "areaCodeName": "+47" + }, + { + "countryName": "尼泊尔", + "areaCodeName": "+977" + }, + { + "countryName": "瑙鲁", + "areaCodeName": "+674" + }, + { + "countryName": "新西兰", + "areaCodeName": "+64" + }, + { + "countryName": "阿曼", + "areaCodeName": "+968" + }, + { + "countryName": "巴拿马", + "areaCodeName": "+507" + }, + { + "countryName": "秘鲁", + "areaCodeName": "+51" + }, + { + "countryName": "法属波利尼西亚", + "areaCodeName": "+689" + }, + { + "countryName": "巴布亚新几内亚", + "areaCodeName": "+675" + }, + { + "countryName": "菲律宾", + "areaCodeName": "+63" + }, + { + "countryName": "巴基斯坦", + "areaCodeName": "+92" + }, + { + "countryName": "波兰", + "areaCodeName": "+48" + }, + { + "countryName": "葡萄牙", + "areaCodeName": "+351" + }, + { + "countryName": "巴拉圭", + "areaCodeName": "+595" + }, + { + "countryName": "卡塔尔", + "areaCodeName": "+974" + }, + { + "countryName": "罗马尼亚", + "areaCodeName": "+40" + }, + { + "countryName": "塞尔维亚", + "areaCodeName": "+381" + }, + { + "countryName": "俄罗斯", + "areaCodeName": "+7" + }, + { + "countryName": "沙特阿拉伯", + "areaCodeName": "+966" + }, + { + "countryName": "所罗门群岛", + "areaCodeName": "+677" + }, + { + "countryName": "塞舌尔", + "areaCodeName": "+248" + }, + { + "countryName": "苏丹", + "areaCodeName": "+249" + }, + { + "countryName": "瑞典", + "areaCodeName": "+46" + }, + { + "countryName": "新加坡", + "areaCodeName": "+65" + }, + { + "countryName": "斯洛文尼亚", + "areaCodeName": "+386" + }, + { + "countryName": "斯洛伐克", + "areaCodeName": "+421" + }, + { + "countryName": "塞拉利昂", + "areaCodeName": "+232" + }, + { + "countryName": "圣马力诺", + "areaCodeName": "+378" + }, + { + "countryName": "塞内加尔", + "areaCodeName": "+221" + }, + { + "countryName": "索马里", + "areaCodeName": "+252" + }, + { + "countryName": "苏里南", + "areaCodeName": "+597" + }, + { + "countryName": "圣多美和普林西比", + "areaCodeName": "+239" + }, + { + "countryName": "萨尔瓦多", + "areaCodeName": "+503" + }, + { + "countryName": "叙利亚", + "areaCodeName": "+963" + }, + { + "countryName": "斯威士兰", + "areaCodeName": "+268" + }, + { + "countryName": "乍得", + "areaCodeName": "+235" + }, + { + "countryName": "泰国", + "areaCodeName": "+66" + }, + { + "countryName": "塔吉克斯坦", + "areaCodeName": "+992" + }, + { + "countryName": "托克劳", + "areaCodeName": "+690" + }, + { + "countryName": "东帝汶", + "areaCodeName": "+670" + }, + { + "countryName": "土库曼斯坦", + "areaCodeName": "+993" + }, + { + "countryName": "突尼斯", + "areaCodeName": "+216" + }, + { + "countryName": "汤加", + "areaCodeName": "+676" + }, + { + "countryName": "土耳其", + "areaCodeName": "+90" + }, + { + "countryName": "特立尼达和多巴哥", + "areaCodeName": "+1868" + }, + { + "countryName": "台湾", + "areaCodeName": "+886" + }, + { + "countryName": "坦桑尼亚", + "areaCodeName": "+255" + }, + { + "countryName": "乌克兰", + "areaCodeName": "+380" + }, + { + "countryName": "乌干达", + "areaCodeName": "+256" + }, + { + "countryName": "美国", + "areaCodeName": "+1" + }, + { + "countryName": "乌拉圭", + "areaCodeName": "+598" + }, + { + "countryName": "乌兹别克斯坦", + "areaCodeName": "+998" + }, + { + "countryName": "梵蒂冈", + "areaCodeName": "+379" + }, + { + "countryName": "委内瑞拉", + "areaCodeName": "+58" + }, + { + "countryName": "越南", + "areaCodeName": "+84" + }, + { + "countryName": "也门", + "areaCodeName": "+967" + }, + { + "countryName": "南非", + "areaCodeName": "+27" + }, + { + "countryName": "赞比亚", + "areaCodeName": "+260" + }, + { + "countryName": "津巴布韦", + "areaCodeName": "+263" + } +] + + diff --git a/app/src/main/assets/countryen.json b/app/src/main/assets/countryen.json new file mode 100644 index 0000000..81a241e --- /dev/null +++ b/app/src/main/assets/countryen.json @@ -0,0 +1,776 @@ +[ + { + "countryName": "Andorra", + "areaCodeName": "+376" + }, + { + "countryName": "United Arab Emirates", + "areaCodeName": "+971" + }, + { + "countryName": "Afghanistan", + "areaCodeName": "+93" + }, + { + "countryName": "Antigua and Barbuda", + "areaCodeName": "+1268" + }, + { + "countryName": "Anguilla", + "areaCodeName": "+1264" + }, + { + "countryName": "Albania", + "areaCodeName": "+355" + }, + { + "countryName": "Armenia", + "areaCodeName": "+374" + }, + { + "countryName": "Angola", + "areaCodeName": "+244" + }, + { + "countryName": "Argentina", + "areaCodeName": "+54" + }, + { + "countryName": "Austria", + "areaCodeName": "+43" + }, + { + "countryName": "Australia", + "areaCodeName": "+61" + }, + { + "countryName": "Aruba", + "areaCodeName": "+297" + }, + { + "countryName": "Azerbaijan", + "areaCodeName": "+994" + }, + { + "countryName": "Bosnia and Herzegovina", + "areaCodeName": "+387" + }, + { + "countryName": "Barbados", + "areaCodeName": "+1246" + }, + { + "countryName": "Bangladesh", + "areaCodeName": "+880" + }, + { + "countryName": "Belgium", + "areaCodeName": "+32" + }, + { + "countryName": "Burkina Faso", + "areaCodeName": "+226" + }, + { + "countryName": "Bulgaria", + "areaCodeName": "+359" + }, + { + "countryName": "Bahrain", + "areaCodeName": "+973" + }, + { + "countryName": "Burundi", + "areaCodeName": "+257" + }, + { + "countryName": "Benin", + "areaCodeName": "+229" + }, + { + "countryName": "Saint Barthélemy", + "areaCodeName": "+590" + }, + { + "countryName": "Bermuda", + "areaCodeName": "+1441" + }, + { + "countryName": "Brunei Darussalam", + "areaCodeName": "+673" + }, + { + "countryName": "Bolivia", + "areaCodeName": "+591" + }, + { + "countryName": "Brazil", + "areaCodeName": "+55" + }, + { + "countryName": "Bahamas", + "areaCodeName": "+1242" + }, + { + "countryName": "Bhutan", + "areaCodeName": "+975" + }, + { + "countryName": "Botswana", + "areaCodeName": "+267" + }, + { + "countryName": "Belarus", + "areaCodeName": "+375" + }, + { + "countryName": "Belize", + "areaCodeName": "+501" + }, + { + "countryName": "Canada", + "areaCodeName": "+1" + }, + { + "countryName": "Democratic Republic of the Congo", + "areaCodeName": "+243" + }, + { + "countryName": "Central African Republic", + "areaCodeName": "+236" + }, + { + "countryName": "Republic of the Congo", + "areaCodeName": "+242" + }, + { + "countryName": "Switzerland", + "areaCodeName": "+41" + }, + { + "countryName": "Côte d'Ivoire", + "areaCodeName": "+225" + }, + { + "countryName": "Cook Islands", + "areaCodeName": "+682" + }, + { + "countryName": "Chile", + "areaCodeName": "+56" + }, + { + "countryName": "Cameroon", + "areaCodeName": "+237" + }, + { + "countryName": "China", + "areaCodeName": "+86" + }, + { + "countryName": "Colombia", + "areaCodeName": "+57" + }, + { + "countryName": "Costa Rica", + "areaCodeName": "+506" + }, + { + "countryName": "Cuba", + "areaCodeName": "+53" + }, + { + "countryName": "Cape Verde", + "areaCodeName": "+238" + }, + { + "countryName": "Cyprus", + "areaCodeName": "+357" + }, + { + "countryName": "Czech Republic", + "areaCodeName": "+420" + }, + { + "countryName": "Germany", + "areaCodeName": "+49" + }, + { + "countryName": "Djibouti", + "areaCodeName": "+253" + }, + { + "countryName": "Denmark", + "areaCodeName": "+45" + }, + { + "countryName": "Dominica", + "areaCodeName": "+1767" + }, + { + "countryName": "Dominican Republic", + "areaCodeName": "+1809" + }, + { + "countryName": "Algeria", + "areaCodeName": "+213" + }, + { + "countryName": "Ecuador", + "areaCodeName": "+593" + }, + { + "countryName": "Estonia", + "areaCodeName": "+372" + }, + { + "countryName": "Egypt", + "areaCodeName": "+20" + }, + { + "countryName": "Eritrea", + "areaCodeName": "+291" + }, + { + "countryName": "Spain", + "areaCodeName": "+34" + }, + { + "countryName": "Ethiopia", + "areaCodeName": "+251" + }, + { + "countryName": "Finland", + "areaCodeName": "+358" + }, + { + "countryName": "Fiji", + "areaCodeName": "+679" + }, + { + "countryName": "Federated States of Micronesia", + "areaCodeName": "+691" + }, + { + "countryName": "France", + "areaCodeName": "+33" + }, + { + "countryName": "Gabon", + "areaCodeName": "+241" + }, + { + "countryName": "United Kingdom", + "areaCodeName": "+44" + }, + { + "countryName": "Grenada", + "areaCodeName": "+1473" + }, + { + "countryName": "Georgia", + "areaCodeName": "+995" + }, + { + "countryName": "Ghana", + "areaCodeName": "+233" + }, + { + "countryName": "Gambia", + "areaCodeName": "+220" + }, + { + "countryName": "Guinea", + "areaCodeName": "+224" + }, + { + "countryName": "Equatorial Guinea", + "areaCodeName": "+240" + }, + { + "countryName": "Greece", + "areaCodeName": "+30" + }, + { + "countryName": "Guatemala", + "areaCodeName": "+502" + }, + { + "countryName": "GuineaBissau", + "areaCodeName": "+245" + }, + { + "countryName": "Guyana", + "areaCodeName": "+592" + }, + { + "countryName": "Hong Kong SAR China", + "areaCodeName": "+852" + }, + { + "countryName": "Honduras", + "areaCodeName": "+504" + }, + { + "countryName": "Croatia", + "areaCodeName": "+385" + }, + { + "countryName": "Haiti", + "areaCodeName": "+509" + }, + { + "countryName": "Hungary", + "areaCodeName": "+36" + }, + { + "countryName": "Indonesia", + "areaCodeName": "+62" + }, + { + "countryName": "Ireland", + "areaCodeName": "+353" + }, + { + "countryName": "Israel", + "areaCodeName": "+972" + }, + { + "countryName": "India", + "areaCodeName": "+91" + }, + { + "countryName": "Iraq", + "areaCodeName": "+964" + }, + { + "countryName": "Iran", + "areaCodeName": "+98" + }, + { + "countryName": "Iceland", + "areaCodeName": "+354" + }, + { + "countryName": "Italy", + "areaCodeName": "+39" + }, + { + "countryName": "Jamaica", + "areaCodeName": "+1876" + }, + { + "countryName": "Jordan", + "areaCodeName": "+962" + }, + { + "countryName": "Japan", + "areaCodeName": "+81" + }, + { + "countryName": "Kenya", + "areaCodeName": "+254" + }, + { + "countryName": "Kyrgyzstan", + "areaCodeName": "+996" + }, + { + "countryName": "Cambodia", + "areaCodeName": "+855" + }, + { + "countryName": "Kiribati", + "areaCodeName": "+686" + }, + { + "countryName": "Comoros", + "areaCodeName": "+269" + }, + { + "countryName": "Saint Kitts and Nevis", + "areaCodeName": "+1869" + }, + { + "countryName": "North Korea", + "areaCodeName": "+850" + }, + { + "countryName": "South Korea", + "areaCodeName": "+82" + }, + { + "countryName": "Kuwait", + "areaCodeName": "+965" + }, + { + "countryName": "Kazakhstan", + "areaCodeName": "+7" + }, + { + "countryName": "Laos", + "areaCodeName": "+856" + }, + { + "countryName": "Lebanon", + "areaCodeName": "+961" + }, + { + "countryName": "Saint Lucia", + "areaCodeName": "+1758" + }, + { + "countryName": "Liechtenstein", + "areaCodeName": "+423" + }, + { + "countryName": "Sri Lanka", + "areaCodeName": "+94" + }, + { + "countryName": "Liberia", + "areaCodeName": "+231" + }, + { + "countryName": "Lesotho", + "areaCodeName": "+266" + }, + { + "countryName": "Lithuania", + "areaCodeName": "+370" + }, + { + "countryName": "Luxembourg", + "areaCodeName": "+352" + }, + { + "countryName": "Latvia", + "areaCodeName": "+371" + }, + { + "countryName": "Libya", + "areaCodeName": "+218" + }, + { + "countryName": "Morocco", + "areaCodeName": "+212" + }, + { + "countryName": "Monaco", + "areaCodeName": "+377" + }, + { + "countryName": "Moldova", + "areaCodeName": "+373" + }, + { + "countryName": "Madagascar", + "areaCodeName": "+261" + }, + { + "countryName": "Mali", + "areaCodeName": "+223" + }, + { + "countryName": "Myanmar", + "areaCodeName": "+95" + }, + { + "countryName": "Mongolia", + "areaCodeName": "+976" + }, + { + "countryName": "Macau", + "areaCodeName": "+853" + }, + { + "countryName": "Montserrat", + "areaCodeName": "+1664" + }, + { + "countryName": "Malta", + "areaCodeName": "+356" + }, + { + "countryName": "Mauritius", + "areaCodeName": "+230" + }, + { + "countryName": "Maldives", + "areaCodeName": "+960" + }, + { + "countryName": "Malawi", + "areaCodeName": "+265" + }, + { + "countryName": "Mexico", + "areaCodeName": "+52" + }, + { + "countryName": "Malaysia", + "areaCodeName": "+60" + }, + { + "countryName": "Mozambique", + "areaCodeName": "+258" + }, + { + "countryName": "Namibia", + "areaCodeName": "+264" + }, + { + "countryName": "Niger", + "areaCodeName": "+227" + }, + { + "countryName": "Nigeria", + "areaCodeName": "+234" + }, + { + "countryName": "Nicaragua", + "areaCodeName": "+505" + }, + { + "countryName": "Netherlands", + "areaCodeName": "+31" + }, + { + "countryName": "Norway", + "areaCodeName": "+47" + }, + { + "countryName": "Nepal", + "areaCodeName": "+977" + }, + { + "countryName": "Nauru", + "areaCodeName": "+674" + }, + { + "countryName": "New Zealand", + "areaCodeName": "+64" + }, + { + "countryName": "Oman", + "areaCodeName": "+968" + }, + { + "countryName": "Panama", + "areaCodeName": "+507" + }, + { + "countryName": "Peru", + "areaCodeName": "+51" + }, + { + "countryName": "French Polynesia", + "areaCodeName": "+689" + }, + { + "countryName": "Papua New Guinea", + "areaCodeName": "+675" + }, + { + "countryName": "Philippines", + "areaCodeName": "+63" + }, + { + "countryName": "Pakistan", + "areaCodeName": "+92" + }, + { + "countryName": "Poland", + "areaCodeName": "+48" + }, + { + "countryName": "Portugal", + "areaCodeName": "+351" + }, + { + "countryName": "Paraguay", + "areaCodeName": "+595" + }, + { + "countryName": "Qatar", + "areaCodeName": "+974" + }, + { + "countryName": "Romania", + "areaCodeName": "+40" + }, + { + "countryName": "Serbia", + "areaCodeName": "+381" + }, + { + "countryName": "Russia", + "areaCodeName": "+7" + }, + { + "countryName": "Saudi Arabia", + "areaCodeName": "+966" + }, + { + "countryName": "Solomon Islands", + "areaCodeName": "+677" + }, + { + "countryName": "Seychelles", + "areaCodeName": "+248" + }, + { + "countryName": "Sudan", + "areaCodeName": "+249" + }, + { + "countryName": "Sweden", + "areaCodeName": "+46" + }, + { + "countryName": "Singapore", + "areaCodeName": "+65" + }, + { + "countryName": "Slovenia", + "areaCodeName": "+386" + }, + { + "countryName": "Slovakia", + "areaCodeName": "+421" + }, + { + "countryName": "Sierra Leone", + "areaCodeName": "+232" + }, + { + "countryName": "San Marino", + "areaCodeName": "+378" + }, + { + "countryName": "Senegal", + "areaCodeName": "+221" + }, + { + "countryName": "Somalia", + "areaCodeName": "+252" + }, + { + "countryName": "Suriname", + "areaCodeName": "+597" + }, + { + "countryName": "Sao Tome and Principe", + "areaCodeName": "+239" + }, + { + "countryName": "El Salvador", + "areaCodeName": "+503" + }, + { + "countryName": "Syria", + "areaCodeName": "+963" + }, + { + "countryName": "Swaziland", + "areaCodeName": "+268" + }, + { + "countryName": "Chad", + "areaCodeName": "+235" + }, + { + "countryName": "Thailand", + "areaCodeName": "+66" + }, + { + "countryName": "Tajikistan", + "areaCodeName": "+992" + }, + { + "countryName": "Tokelau", + "areaCodeName": "+690" + }, + { + "countryName": "TimorLeste", + "areaCodeName": "+670" + }, + { + "countryName": "Turkmenistan", + "areaCodeName": "+993" + }, + { + "countryName": "Tunisia", + "areaCodeName": "+216" + }, + { + "countryName": "Tonga", + "areaCodeName": "+676" + }, + { + "countryName": "Turkey", + "areaCodeName": "+90" + }, + { + "countryName": "Trinidad and Tobago", + "areaCodeName": "+1868" + }, + { + "countryName": "Taiwan", + "areaCodeName": "+886" + }, + { + "countryName": "Tanzania", + "areaCodeName": "+255" + }, + { + "countryName": "Ukraine", + "areaCodeName": "+380" + }, + { + "countryName": "Uganda", + "areaCodeName": "+256" + }, + { + "countryName": "United States", + "areaCodeName": "+1" + }, + { + "countryName": "Uruguay", + "areaCodeName": "+598" + }, + { + "countryName": "Uzbekistan", + "areaCodeName": "+998" + }, + { + "countryName": "Vatican City", + "areaCodeName": "+379" + }, + { + "countryName": "Venezuela", + "areaCodeName": "+58" + }, + { + "countryName": "Vietnam", + "areaCodeName": "+84" + }, + { + "countryName": "Yemen", + "areaCodeName": "+967" + }, + { + "countryName": "South Africa", + "areaCodeName": "+27" + }, + { + "countryName": "Zambia", + "areaCodeName": "+260" + }, + { + "countryName": "Zimbabwe", + "areaCodeName": "+263" + } +] + + diff --git a/app/src/main/assets/countryja.json b/app/src/main/assets/countryja.json new file mode 100644 index 0000000..bc90363 --- /dev/null +++ b/app/src/main/assets/countryja.json @@ -0,0 +1,775 @@ +[ + { + "countryName": "アンドラ", + "areaCodeName": "+376" + }, + { + "countryName": "アラブ首長国連邦", + "areaCodeName": "+971" + }, + { + "countryName": "アフガニスタン", + "areaCodeName": "+93" + }, + { + "countryName": "アンティグア・バーブーダ", + "areaCodeName": "+1268" + }, + { + "countryName": "アンギラ", + "areaCodeName": "+1264" + }, + { + "countryName": "アルバニア", + "areaCodeName": "+355" + }, + { + "countryName": "アルメニア", + "areaCodeName": "+374" + }, + { + "countryName": "アンゴラ", + "areaCodeName": "+244" + }, + { + "countryName": "アルゼンチン", + "areaCodeName": "+54" + }, + { + "countryName": "オーストリア", + "areaCodeName": "+43" + }, + { + "countryName": "オーストラリア", + "areaCodeName": "+61" + }, + { + "countryName": "アルバ", + "areaCodeName": "+297" + }, + { + "countryName": "アゼルバイジャン", + "areaCodeName": "+994" + }, + { + "countryName": "ボスニア・ヘルツェゴビナ", + "areaCodeName": "+387" + }, + { + "countryName": "バルバドス", + "areaCodeName": "+1246" + }, + { + "countryName": "バングラデシュ", + "areaCodeName": "+880" + }, + { + "countryName": "ベルギー", + "areaCodeName": "+32" + }, + { + "countryName": "ブルキナファソ", + "areaCodeName": "+226" + }, + { + "countryName": "ブルガリア", + "areaCodeName": "+359" + }, + { + "countryName": "バーレーン", + "areaCodeName": "+973" + }, + { + "countryName": "ブルンジ", + "areaCodeName": "+257" + }, + { + "countryName": "ベナン", + "areaCodeName": "+229" + }, + { + "countryName": "サン・バルテルミー", + "areaCodeName": "+590" + }, + { + "countryName": "バミューダ", + "areaCodeName": "+1441" + }, + { + "countryName": "ブルネイ", + "areaCodeName": "+673" + }, + { + "countryName": "ボリビア", + "areaCodeName": "+591" + }, + { + "countryName": "ブラジル", + "areaCodeName": "+55" + }, + { + "countryName": "バハマ", + "areaCodeName": "+1242" + }, + { + "countryName": "ブータン", + "areaCodeName": "+975" + }, + { + "countryName": "ボツワナ", + "areaCodeName": "+267" + }, + { + "countryName": "ベラルーシ", + "areaCodeName": "+375" + }, + { + "countryName": "ベリーズ", + "areaCodeName": "+501" + }, + { + "countryName": "カナダ", + "areaCodeName": "+1" + }, + { + "countryName": "コンゴ民主共和国", + "areaCodeName": "+243" + }, + { + "countryName": "中央アフリカ共和国", + "areaCodeName": "+236" + }, + { + "countryName": "コンゴ共和国", + "areaCodeName": "+242" + }, + { + "countryName": "スイス", + "areaCodeName": "+41" + }, + { + "countryName": "コートジボワール", + "areaCodeName": "+225" + }, + { + "countryName": "クック諸島", + "areaCodeName": "+682" + }, + { + "countryName": "チリ", + "areaCodeName": "+56" + }, + { + "countryName": "カメルーン", + "areaCodeName": "+237" + }, + { + "countryName": "中国", + "areaCodeName": "+86" + }, + { + "countryName": "コロンビア", + "areaCodeName": "+57" + }, + { + "countryName": "コスタリカ", + "areaCodeName": "+506" + }, + { + "countryName": "キューバ", + "areaCodeName": "+53" + }, + { + "countryName": "カーボベルデ", + "areaCodeName": "+238" + }, + { + "countryName": "キプロス", + "areaCodeName": "+357" + }, + { + "countryName": "チェコ共和国", + "areaCodeName": "+420" + }, + { + "countryName": "ドイツ", + "areaCodeName": "+49" + }, + { + "countryName": "ジブチ", + "areaCodeName": "+253" + }, + { + "countryName": "デンマーク", + "areaCodeName": "+45" + }, + { + "countryName": "ドミニカ", + "areaCodeName": "+1767" + }, + { + "countryName": "ドミニカ共和国", + "areaCodeName": "+1809" + }, + { + "countryName": "アルジェリア", + "areaCodeName": "+213" + }, + { + "countryName": "エクアドル", + "areaCodeName": "+593" + }, + { + "countryName": "エストニア", + "areaCodeName": "+372" + }, + { + "countryName": "エジプト", + "areaCodeName": "+20" + }, + { + "countryName": "エリトリア", + "areaCodeName": "+291" + }, + { + "countryName": "スペイン", + "areaCodeName": "+34" + }, + { + "countryName": "エチオピア", + "areaCodeName": "+251" + }, + { + "countryName": "フィンランド", + "areaCodeName": "+358" + }, + { + "countryName": "フィジー", + "areaCodeName": "+679" + }, + { + "countryName": "ミクロネシア連邦", + "areaCodeName": "+691" + }, + { + "countryName": "フランス", + "areaCodeName": "+33" + }, + { + "countryName": "ガボン", + "areaCodeName": "+241" + }, + { + "countryName": "イギリス", + "areaCodeName": "+44" + }, + { + "countryName": "グレナダ", + "areaCodeName": "+1473" + }, + { + "countryName": "ジョージア", + "areaCodeName": "+995" + }, + { + "countryName": "ガーナ", + "areaCodeName": "+233" + }, + { + "countryName": "ガンビア", + "areaCodeName": "+220" + }, + { + "countryName": "ギニア", + "areaCodeName": "+224" + }, + { + "countryName": "赤道ギニア", + "areaCodeName": "+240" + }, + { + "countryName": "ギリシャ", + "areaCodeName": "+30" + }, + { + "countryName": "グアテマラ", + "areaCodeName": "+502" + }, + { + "countryName": "ギニアビサウ", + "areaCodeName": "+245" + }, + { + "countryName": "ガイアナ", + "areaCodeName": "+592" + }, + { + "countryName": "中国香港特別行政区", + "areaCodeName": "+852" + }, + { + "countryName": "ホンジュラス", + "areaCodeName": "+504" + }, + { + "countryName": "クロアチア", + "areaCodeName": "+385" + }, + { + "countryName": "ハイチ", + "areaCodeName": "+509" + }, + { + "countryName": "ハンガリー", + "areaCodeName": "+36" + }, + { + "countryName": "インドネシア", + "areaCodeName": "+62" + }, + { + "countryName": "アイルランド", + "areaCodeName": "+353" + }, + { + "countryName": "イスラエル", + "areaCodeName": "+972" + }, + { + "countryName": "インド", + "areaCodeName": "+91" + }, + { + "countryName": "イラク", + "areaCodeName": "+964" + }, + { + "countryName": "イラン", + "areaCodeName": "+98" + }, + { + "countryName": "アイスランド", + "areaCodeName": "+354" + }, + { + "countryName": "イタリア", + "areaCodeName": "+39" + }, + { + "countryName": "ジャマイカ", + "areaCodeName": "+1876" + }, + { + "countryName": "ヨルダン", + "areaCodeName": "+962" + }, + { + "countryName": "日本", + "areaCodeName": "+81" + }, + { + "countryName": "ケニア", + "areaCodeName": "+254" + }, + { + "countryName": "キルギス", + "areaCodeName": "+996" + }, + { + "countryName": "カンボジア", + "areaCodeName": "+855" + }, + { + "countryName": "キリバス", + "areaCodeName": "+686" + }, + { + "countryName": "コモロ", + "areaCodeName": "+269" + }, + { + "countryName": "セントクリストファー・ネイビス", + "areaCodeName": "+1869" + }, + { + "countryName": "北朝鮮", + "areaCodeName": "+850" + }, + { + "countryName": "韓国", + "areaCodeName": "+82" + }, + { + "countryName": "クウェート", + "areaCodeName": "+965" + }, + { + "countryName": "カザフスタン", + "areaCodeName": "+7" + }, + { + "countryName": "ラオス", + "areaCodeName": "+856" + }, + { + "countryName": "レバノン", + "areaCodeName": "+961" + }, + { + "countryName": "セントルシア", + "areaCodeName": "+1758" + }, + { + "countryName": "リヒテンシュタイン", + "areaCodeName": "+423" + }, + { + "countryName": "スリランカ", + "areaCodeName": "+94" + }, + { + "countryName": "リベリア", + "areaCodeName": "+231" + }, + { + "countryName": "レソト", + "areaCodeName": "+266" + }, + { + "countryName": "リトアニア", + "areaCodeName": "+370" + }, + { + "countryName": "ルクセンブルク", + "areaCodeName": "+352" + }, + { + "countryName": "ラトビア", + "areaCodeName": "+371" + }, + { + "countryName": "リビア", + "areaCodeName": "+218" + }, + { + "countryName": "モロッコ", + "areaCodeName": "+212" + }, + { + "countryName": "モナコ", + "areaCodeName": "+377" + }, + { + "countryName": "モルドバ", + "areaCodeName": "+373" + }, + { + "countryName": "マダガスカル", + "areaCodeName": "+261" + }, + { + "countryName": "マリ", + "areaCodeName": "+223" + }, + { + "countryName": "ミャンマー", + "areaCodeName": "+95" + }, + { + "countryName": "モンゴル", + "areaCodeName": "+976" + }, + { + "countryName": "中国マカオ特別行政区", + "areaCodeName": "+853" + }, + { + "countryName": "モントセラト", + "areaCodeName": "+1664" + }, + { + "countryName": "マルタ", + "areaCodeName": "+356" + }, + { + "countryName": "モーリシャス", + "areaCodeName": "+230" + }, + { + "countryName": "モルディブ", + "areaCodeName": "+960" + }, + { + "countryName": "マラウイ", + "areaCodeName": "+265" + }, + { + "countryName": "メキシコ", + "areaCodeName": "+52" + }, + { + "countryName": "マレーシア", + "areaCodeName": "+60" + }, + { + "countryName": "モザンビーク", + "areaCodeName": "+258" + }, + { + "countryName": "ナミビア", + "areaCodeName": "+264" + }, + { + "countryName": "ニジェール", + "areaCodeName": "+227" + }, + { + "countryName": "ナイジェリア", + "areaCodeName": "+234" + }, + { + "countryName": "ニカラグア", + "areaCodeName": "+505" + }, + { + "countryName": "オランダ", + "areaCodeName": "+31" + }, + { + "countryName": "ノルウェー", + "areaCodeName": "+47" + }, + { + "countryName": "ネパール", + "areaCodeName": "+977" + }, + { + "countryName": "ナウル", + "areaCodeName": "+674" + }, + { + "countryName": "ニュージーランド", + "areaCodeName": "+64" + }, + { + "countryName": "オマーン", + "areaCodeName": "+968" + }, + { + "countryName": "パナマ", + "areaCodeName": "+507" + }, + { + "countryName": "ペルー", + "areaCodeName": "+51" + }, + { + "countryName": "フランス領ポリネシア", + "areaCodeName": "+689" + }, + { + "countryName": "パプアニューギニア", + "areaCodeName": "+675" + }, + { + "countryName": "フィリピン", + "areaCodeName": "+63" + }, + { + "countryName": "パキスタン", + "areaCodeName": "+92" + }, + { + "countryName": "ポーランド", + "areaCodeName": "+48" + }, + { + "countryName": "ポルトガル", + "areaCodeName": "+351" + }, + { + "countryName": "パラグアイ", + "areaCodeName": "+595" + }, + { + "countryName": "カタール", + "areaCodeName": "+974" + }, + { + "countryName": "ルーマニア", + "areaCodeName": "+40" + }, + { + "countryName": "セルビア", + "areaCodeName": "+381" + }, + { + "countryName": "ロシア", + "areaCodeName": "+7" + }, + { + "countryName": "サウジアラビア", + "areaCodeName": "+966" + }, + { + "countryName": "ソロモン諸島", + "areaCodeName": "+677" + }, + { + "countryName": "セーシェル", + "areaCodeName": "+248" + }, + { + "countryName": "スーダン", + "areaCodeName": "+249" + }, + { + "countryName": "スウェーデン", + "areaCodeName": "+46" + }, + { + "countryName": "シンガポール", + "areaCodeName": "+65" + }, + { + "countryName": "スロベニア", + "areaCodeName": "+386" + }, + { + "countryName": "スロバキア", + "areaCodeName": "+421" + }, + { + "countryName": "シエラレオネ", + "areaCodeName": "+232" + }, + { + "countryName": "サンマリノ", + "areaCodeName": "+378" + }, + { + "countryName": "セネガル", + "areaCodeName": "+221" + }, + { + "countryName": "ソマリア", + "areaCodeName": "+252" + }, + { + "countryName": "スリナム", + "areaCodeName": "+597" + }, + { + "countryName": "サントメ・プリンシペ", + "areaCodeName": "+239" + }, + { + "countryName": "エルサルバドル", + "areaCodeName": "+503" + }, + { + "countryName": "シリア", + "areaCodeName": "+963" + }, + { + "countryName": "エスワティニ", + "areaCodeName": "+268" + }, + { + "countryName": "チャド", + "areaCodeName": "+235" + }, + { + "countryName": "タイ", + "areaCodeName": "+66" + }, + { + "countryName": "タジキスタン", + "areaCodeName": "+992" + }, + { + "countryName": "トケラウ", + "areaCodeName": "+690" + }, + { + "countryName": "東ティモール", + "areaCodeName": "+670" + }, + { + "countryName": "トルクメニスタン", + "areaCodeName": "+993" + }, + { + "countryName": "チュニジア", + "areaCodeName": "+216" + }, + { + "countryName": "トンガ", + "areaCodeName": "+676" + }, + { + "countryName": "トルコ", + "areaCodeName": "+90" + }, + { + "countryName": "トリニダード・トバゴ", + "areaCodeName": "+1868" + }, + { + "countryName": "台湾", + "areaCodeName": "+886" + }, + { + "countryName": "タンザニア", + "areaCodeName": "+255" + }, + { + "countryName": "ウクライナ", + "areaCodeName": "+380" + }, + { + "countryName": "ウガンダ", + "areaCodeName": "+256" + }, + { + "countryName": "アメリカ合衆国", + "areaCodeName": "+1" + }, + { + "countryName": "ウルグアイ", + "areaCodeName": "+598" + }, + { + "countryName": "ウズベキスタン", + "areaCodeName": "+998" + }, + { + "countryName": "バチカン", + "areaCodeName": "+379" + }, + { + "countryName": "ベネズエラ", + "areaCodeName": "+58" + }, + { + "countryName": "ベトナム", + "areaCodeName": "+84" + }, + { + "countryName": "イエメン", + "areaCodeName": "+967" + }, + { + "countryName": "南アフリカ", + "areaCodeName": "+27" + }, + { + "countryName": "ザンビア", + "areaCodeName": "+260" + }, + { + "countryName": "ジンバブエ", + "areaCodeName": "+263" + } +] + diff --git a/app/src/main/assets/countrytw.json b/app/src/main/assets/countrytw.json new file mode 100644 index 0000000..cc4c6e3 --- /dev/null +++ b/app/src/main/assets/countrytw.json @@ -0,0 +1,776 @@ +[ + { + "countryName": "安道爾", + "areaCodeName": "+376" + }, + { + "countryName": "阿聯酋", + "areaCodeName": "+971" + }, + { + "countryName": "阿富汗", + "areaCodeName": "+93" + }, + { + "countryName": "安提瓜和巴布達", + "areaCodeName": "+1268" + }, + { + "countryName": "安圭拉", + "areaCodeName": "+1264" + }, + { + "countryName": "阿爾巴尼亞", + "areaCodeName": "+355" + }, + { + "countryName": "亞美尼亞", + "areaCodeName": "+374" + }, + { + "countryName": "安哥拉", + "areaCodeName": "+244" + }, + { + "countryName": "阿根廷", + "areaCodeName": "+54" + }, + { + "countryName": "奧地利", + "areaCodeName": "+43" + }, + { + "countryName": "澳大利亞", + "areaCodeName": "+61" + }, + { + "countryName": "阿魯巴", + "areaCodeName": "+297" + }, + { + "countryName": "阿塞拜疆", + "areaCodeName": "+994" + }, + { + "countryName": "波斯尼亞和黑塞哥維那", + "areaCodeName": "+387" + }, + { + "countryName": "巴巴多斯", + "areaCodeName": "+1246" + }, + { + "countryName": "孟加拉國", + "areaCodeName": "+880" + }, + { + "countryName": "比利時", + "areaCodeName": "+32" + }, + { + "countryName": "布基納法索", + "areaCodeName": "+226" + }, + { + "countryName": "保加利亞", + "areaCodeName": "+359" + }, + { + "countryName": "巴林", + "areaCodeName": "+973" + }, + { + "countryName": "布隆迪", + "areaCodeName": "+257" + }, + { + "countryName": "貝寧", + "areaCodeName": "+229" + }, + { + "countryName": "聖巴泰勒米", + "areaCodeName": "+590" + }, + { + "countryName": "百慕大", + "areaCodeName": "+1441" + }, + { + "countryName": "文萊", + "areaCodeName": "+673" + }, + { + "countryName": "玻利維亞", + "areaCodeName": "+591" + }, + { + "countryName": "巴西", + "areaCodeName": "+55" + }, + { + "countryName": "巴哈馬", + "areaCodeName": "+1242" + }, + { + "countryName": "不丹", + "areaCodeName": "+975" + }, + { + "countryName": "博茨瓦納", + "areaCodeName": "+267" + }, + { + "countryName": "白俄羅斯", + "areaCodeName": "+375" + }, + { + "countryName": "貝里斯", + "areaCodeName": "+501" + }, + { + "countryName": "加拿大", + "areaCodeName": "+1" + }, + { + "countryName": "剛果民主共和國", + "areaCodeName": "+243" + }, + { + "countryName": "中非共和國", + "areaCodeName": "+236" + }, + { + "countryName": "剛果共和國", + "areaCodeName": "+242" + }, + { + "countryName": "瑞士", + "areaCodeName": "+41" + }, + { + "countryName": "科特迪瓦", + "areaCodeName": "+225" + }, + { + "countryName": "庫克群島", + "areaCodeName": "+682" + }, + { + "countryName": "智利", + "areaCodeName": "+56" + }, + { + "countryName": "喀麥隆", + "areaCodeName": "+237" + }, + { + "countryName": "中國", + "areaCodeName": "+86" + }, + { + "countryName": "哥倫比亞", + "areaCodeName": "+57" + }, + { + "countryName": "哥斯達黎加", + "areaCodeName": "+506" + }, + { + "countryName": "古巴", + "areaCodeName": "+53" + }, + { + "countryName": "佛得角", + "areaCodeName": "+238" + }, + { + "countryName": "塞浦路斯", + "areaCodeName": "+357" + }, + { + "countryName": "捷克共和國", + "areaCodeName": "+420" + }, + { + "countryName": "德國", + "areaCodeName": "+49" + }, + { + "countryName": "吉布提", + "areaCodeName": "+253" + }, + { + "countryName": "丹麥", + "areaCodeName": "+45" + }, + { + "countryName": "多米尼克", + "areaCodeName": "+1767" + }, + { + "countryName": "多明尼加共和國", + "areaCodeName": "+1809" + }, + { + "countryName": "阿爾及利亞", + "areaCodeName": "+213" + }, + { + "countryName": "厄瓜多爾", + "areaCodeName": "+593" + }, + { + "countryName": "愛沙尼亞", + "areaCodeName": "+372" + }, + { + "countryName": "埃及", + "areaCodeName": "+20" + }, + { + "countryName": "厄立特里亞", + "areaCodeName": "+291" + }, + { + "countryName": "西班牙", + "areaCodeName": "+34" + }, + { + "countryName": "埃塞俄比亞", + "areaCodeName": "+251" + }, + { + "countryName": "芬蘭", + "areaCodeName": "+358" + }, + { + "countryName": "斐濟", + "areaCodeName": "+679" + }, + { + "countryName": "密克羅尼西亞", + "areaCodeName": "+691" + }, + { + "countryName": "法國", + "areaCodeName": "+33" + }, + { + "countryName": "加蓬", + "areaCodeName": "+241" + }, + { + "countryName": "英國", + "areaCodeName": "+44" + }, + { + "countryName": "格林納達", + "areaCodeName": "+1473" + }, + { + "countryName": "格魯吉亞", + "areaCodeName": "+995" + }, + { + "countryName": "加納", + "areaCodeName": "+233" + }, + { + "countryName": "岡比亞", + "areaCodeName": "+220" + }, + { + "countryName": "幾內亞", + "areaCodeName": "+224" + }, + { + "countryName": "赤道幾內亞", + "areaCodeName": "+240" + }, + { + "countryName": "希臘", + "areaCodeName": "+30" + }, + { + "countryName": "危地馬拉", + "areaCodeName": "+502" + }, + { + "countryName": "幾內亞比紹", + "areaCodeName": "+245" + }, + { + "countryName": "圭亞那", + "areaCodeName": "+592" + }, + { + "countryName": "中國香港特別行政區", + "areaCodeName": "+852" + }, + { + "countryName": "洪都拉斯", + "areaCodeName": "+504" + }, + { + "countryName": "克羅地亞", + "areaCodeName": "+385" + }, + { + "countryName": "海地", + "areaCodeName": "+509" + }, + { + "countryName": "匈牙利", + "areaCodeName": "+36" + }, + { + "countryName": "印尼", + "areaCodeName": "+62" + }, + { + "countryName": "愛爾蘭", + "areaCodeName": "+353" + }, + { + "countryName": "以色列", + "areaCodeName": "+972" + }, + { + "countryName": "印度", + "areaCodeName": "+91" + }, + { + "countryName": "伊拉克", + "areaCodeName": "+964" + }, + { + "countryName": "伊朗", + "areaCodeName": "+98" + }, + { + "countryName": "冰島", + "areaCodeName": "+354" + }, + { + "countryName": "意大利", + "areaCodeName": "+39" + }, + { + "countryName": "牙買加", + "areaCodeName": "+1876" + }, + { + "countryName": "約旦", + "areaCodeName": "+962" + }, + { + "countryName": "日本", + "areaCodeName": "+81" + }, + { + "countryName": "肯尼亞", + "areaCodeName": "+254" + }, + { + "countryName": "吉爾吉斯斯坦", + "areaCodeName": "+996" + }, + { + "countryName": "柬埔寨", + "areaCodeName": "+855" + }, + { + "countryName": "基里巴斯", + "areaCodeName": "+686" + }, + { + "countryName": "科摩羅", + "areaCodeName": "+269" + }, + { + "countryName": "聖基茨和尼維斯", + "areaCodeName": "+1869" + }, + { + "countryName": "朝鮮", + "areaCodeName": "+850" + }, + { + "countryName": "韓國", + "areaCodeName": "+82" + }, + { + "countryName": "科威特", + "areaCodeName": "+965" + }, + { + "countryName": "哈薩克斯坦", + "areaCodeName": "+7" + }, + { + "countryName": "老撾", + "areaCodeName": "+856" + }, + { + "countryName": "黎巴嫩", + "areaCodeName": "+961" + }, + { + "countryName": "聖盧西亞", + "areaCodeName": "+1758" + }, + { + "countryName": "列支敦士登", + "areaCodeName": "+423" + }, + { + "countryName": "斯里蘭卡", + "areaCodeName": "+94" + }, + { + "countryName": "利比里亞", + "areaCodeName": "+231" + }, + { + "countryName": "萊索托", + "areaCodeName": "+266" + }, + { + "countryName": "立陶宛", + "areaCodeName": "+370" + }, + { + "countryName": "盧森堡", + "areaCodeName": "+352" + }, + { + "countryName": "拉脫維亞", + "areaCodeName": "+371" + }, + { + "countryName": "利比亞", + "areaCodeName": "+218" + }, + { + "countryName": "摩洛哥", + "areaCodeName": "+212" + }, + { + "countryName": "摩納哥", + "areaCodeName": "+377" + }, + { + "countryName": "摩爾多瓦", + "areaCodeName": "+373" + }, + { + "countryName": "馬達加斯加", + "areaCodeName": "+261" + }, + { + "countryName": "馬里", + "areaCodeName": "+223" + }, + { + "countryName": "緬甸", + "areaCodeName": "+95" + }, + { + "countryName": "蒙古", + "areaCodeName": "+976" + }, + { + "countryName": "中國澳門特別行政區", + "areaCodeName": "+853" + }, + { + "countryName": "蒙特塞拉特", + "areaCodeName": "+1664" + }, + { + "countryName": "馬爾他", + "areaCodeName": "+356" + }, + { + "countryName": "毛里求斯", + "areaCodeName": "+230" + }, + { + "countryName": "馬爾代夫", + "areaCodeName": "+960" + }, + { + "countryName": "馬拉維", + "areaCodeName": "+265" + }, + { + "countryName": "墨西哥", + "areaCodeName": "+52" + }, + { + "countryName": "馬來西亞", + "areaCodeName": "+60" + }, + { + "countryName": "莫桑比克", + "areaCodeName": "+258" + }, + { + "countryName": "納米比亞", + "areaCodeName": "+264" + }, + { + "countryName": "尼日爾", + "areaCodeName": "+227" + }, + { + "countryName": "尼日利亞", + "areaCodeName": "+234" + }, + { + "countryName": "尼加拉瓜", + "areaCodeName": "+505" + }, + { + "countryName": "荷蘭", + "areaCodeName": "+31" + }, + { + "countryName": "挪威", + "areaCodeName": "+47" + }, + { + "countryName": "尼泊爾", + "areaCodeName": "+977" + }, + { + "countryName": "瑙魯", + "areaCodeName": "+674" + }, + { + "countryName": "新西蘭", + "areaCodeName": "+64" + }, + { + "countryName": "阿曼", + "areaCodeName": "+968" + }, + { + "countryName": "巴拿馬", + "areaCodeName": "+507" + }, + { + "countryName": "秘魯", + "areaCodeName": "+51" + }, + { + "countryName": "法屬波利尼西亞", + "areaCodeName": "+689" + }, + { + "countryName": "巴布亞新幾內亞", + "areaCodeName": "+675" + }, + { + "countryName": "菲律賓", + "areaCodeName": "+63" + }, + { + "countryName": "巴基斯坦", + "areaCodeName": "+92" + }, + { + "countryName": "波蘭", + "areaCodeName": "+48" + }, + { + "countryName": "葡萄牙", + "areaCodeName": "+351" + }, + { + "countryName": "巴拉圭", + "areaCodeName": "+595" + }, + { + "countryName": "卡塔爾", + "areaCodeName": "+974" + }, + { + "countryName": "羅馬尼亞", + "areaCodeName": "+40" + }, + { + "countryName": "塞爾維亞", + "areaCodeName": "+381" + }, + { + "countryName": "俄羅斯", + "areaCodeName": "+7" + }, + { + "countryName": "沙特阿拉伯", + "areaCodeName": "+966" + }, + { + "countryName": "所羅門群島", + "areaCodeName": "+677" + }, + { + "countryName": "塞舌爾", + "areaCodeName": "+248" + }, + { + "countryName": "蘇丹", + "areaCodeName": "+249" + }, + { + "countryName": "瑞典", + "areaCodeName": "+46" + }, + { + "countryName": "新加坡", + "areaCodeName": "+65" + }, + { + "countryName": "斯洛文尼亞", + "areaCodeName": "+386" + }, + { + "countryName": "斯洛伐克", + "areaCodeName": "+421" + }, + { + "countryName": "塞拉利昂", + "areaCodeName": "+232" + }, + { + "countryName": "聖馬力諾", + "areaCodeName": "+378" + }, + { + "countryName": "塞內加爾", + "areaCodeName": "+221" + }, + { + "countryName": "索馬里", + "areaCodeName": "+252" + }, + { + "countryName": "蘇里南", + "areaCodeName": "+597" + }, + { + "countryName": "聖多美和普林西比", + "areaCodeName": "+239" + }, + { + "countryName": "薩爾瓦多", + "areaCodeName": "+503" + }, + { + "countryName": "敘利亞", + "areaCodeName": "+963" + }, + { + "countryName": "斯威士蘭", + "areaCodeName": "+268" + }, + { + "countryName": "乍得", + "areaCodeName": "+235" + }, + { + "countryName": "泰國", + "areaCodeName": "+66" + }, + { + "countryName": "塔吉克斯坦", + "areaCodeName": "+992" + }, + { + "countryName": "托克勞", + "areaCodeName": "+690" + }, + { + "countryName": "東帝汶", + "areaCodeName": "+670" + }, + { + "countryName": "土庫曼斯坦", + "areaCodeName": "+993" + }, + { + "countryName": "突尼西亞", + "areaCodeName": "+216" + }, + { + "countryName": "湯加", + "areaCodeName": "+676" + }, + { + "countryName": "土耳其", + "areaCodeName": "+90" + }, + { + "countryName": "特立尼達和多巴哥", + "areaCodeName": "+1868" + }, + { + "countryName": "台灣", + "areaCodeName": "+886" + }, + { + "countryName": "坦桑尼亞", + "areaCodeName": "+255" + }, + { + "countryName": "烏克蘭", + "areaCodeName": "+380" + }, + { + "countryName": "烏干達", + "areaCodeName": "+256" + }, + { + "countryName": "美國", + "areaCodeName": "+1" + }, + { + "countryName": "烏拉圭", + "areaCodeName": "+598" + }, + { + "countryName": "烏茲別克斯坦", + "areaCodeName": "+998" + }, + { + "countryName": "梵蒂岡", + "areaCodeName": "+379" + }, + { + "countryName": "委內瑞拉", + "areaCodeName": "+58" + }, + { + "countryName": "越南", + "areaCodeName": "+84" + }, + { + "countryName": "也門", + "areaCodeName": "+967" + }, + { + "countryName": "南非", + "areaCodeName": "+27" + }, + { + "countryName": "贊比亞", + "areaCodeName": "+260" + }, + { + "countryName": "津巴布韋", + "areaCodeName": "+263" + } +] + + diff --git a/app/src/main/assets/lottie/xuanfu/test.json b/app/src/main/assets/lottie/xuanfu/test.json new file mode 100644 index 0000000..19bbd9c --- /dev/null +++ b/app/src/main/assets/lottie/xuanfu/test.json @@ -0,0 +1 @@ +{"v":"5.6.9","fr":30,"ip":0,"op":90,"w":1024,"h":1024,"nm":"03卡通手绘情人节520信封玫瑰Lottie动画","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"“y1”轮廓","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[9]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":75,"s":[9]},{"t":89,"s":[0]}],"ix":10},"p":{"a":0,"k":[36.439,250.514,0],"ix":2},"a":{"a":0,"k":[10.635,71.517,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-38.92,3.193],[18.364,-34.636],[1.198,0.616]],"o":[[-39.036,4.585],[-1.198,-0.625],[20.71,-35.527]],"v":[[49.421,-32.43],[-44.825,32.43],[-49.421,28.981]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.122000002394,0.33300000359,0.497999991623,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[49.671,50.354],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[19.268,-4.928],[3.928,7.263],[-20.258,5.244],[0.507,0.415]],"o":[[-15.153,3.896],[-3.911,-6.882],[27.146,-6.23],[-0.511,0.177]],"v":[[-0.378,15.546],[-30.972,11.564],[-6.661,-13.213],[34.376,-2.195]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.395999983245,0.769000004787,0.791999966491,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[86.138,19.693],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"“y2”轮廓","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[-10]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":75,"s":[-10]},{"t":89,"s":[0]}],"ix":10},"p":{"a":0,"k":[28.721,248.617,0],"ix":2},"a":{"a":0,"k":[81.873,84.501,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-10.738,-29.222]],"o":[[0,0],[0,0]],"v":[[-19.907,-24.948],[19.907,24.948]],"c":false},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.122000002394,0.33300000359,0.497999991623,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[61.812,70.081],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-20.535,-25.205],[-12.222,5.73],[21.529,26.584],[-1.067,0.054]],"o":[[16.13,19.852],[11.831,-5.244],[-29.626,-34.576],[0.501,0.73]],"v":[[-14.119,18.018],[29.963,42.521],[22.094,-13.675],[-42.556,-39.081]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.395999983245,0.769000004787,0.791999966491,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[43.873,48.501],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"“h1”轮廓","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[22]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":75,"s":[22]},{"t":89,"s":[0]}],"ix":10},"p":{"a":0,"k":[210.603,126.922,0],"ix":2},"a":{"a":0,"k":[32.253,243.396,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":20,"s":[0,0,100]},{"t":25,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[9.448,-7.62],[4.439,-1.155],[13.715,27.298],[0.817,3.28],[-7.254,11.485],[-2.376,5.574],[-1.321,5.956],[-3.737,3.132],[-6.28,-14.283],[-8.5,-11.553],[-7.074,1.432],[-17.086,1.542],[-1.706,-6.029],[6.658,-14.736],[2.076,-28.235]],"o":[[-3.765,3.08],[-30.489,12.074],[-1.643,-2.767],[-3.068,-11.745],[8.448,-13.374],[1.102,-2.586],[3.656,-16.476],[5.77,-4.838],[7.25,16.484],[4.067,5.525],[21.298,-4.31],[6.811,-0.615],[2.295,8.11],[-5.935,13.132],[-0.995,13.549]],"v":[[29.659,59.357],[17.236,65.867],[-62.91,36.768],[-66.578,27.639],[-60.277,-9.753],[-45.942,-34.014],[-41.858,-46.929],[-38.781,-73.103],[-5.934,-56.806],[-6.975,-13.084],[12.805,-6.058],[51.469,-54.393],[67.352,-42.896],[54.118,-15.296],[46.824,25.545]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.972999961703,0.481999984442,0.481999984442,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[90.609,82.233],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-18.985,-0.161],[-2.149,-6.606],[3.529,-3.25],[5.674,5.011]],"o":[[7.083,0.06],[4.606,14.152],[-8.906,8.204],[-9.532,-8.419]],"v":[[9.324,-31.205],[25.177,-17.596],[10.854,13.992],[-20.251,26.354]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.573000021542,0.573000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[114.078,63.201],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-12.116,14.617],[-6.479,-2.507],[-0.291,-4.787],[7.469,-1.233]],"o":[[4.521,-5.454],[13.88,5.368],[0.735,12.087],[-12.548,2.072]],"v":[[-12.313,-27.577],[8.252,-31.273],[23.694,-0.216],[13.631,31.708]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.573000021542,0.573000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[76.51,55.051],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-18.985,-0.161],[-2.15,-6.607],[3.529,-3.249],[5.674,5.012]],"o":[[7.084,0.06],[4.605,14.151],[-8.906,8.204],[-9.532,-8.419]],"v":[[9.324,-31.205],[25.179,-17.595],[10.854,13.992],[-20.251,26.354]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.972999961703,0.481999984442,0.481999984442,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[95.339,53.61],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[21.532,-14.063],[0.842,14.225],[-2.068,0.737],[-13.447,-0.493],[-7.606,-0.813],[-2.555,-11.494],[15.044,-17.6]],"o":[[-4.934,-24.323],[-2.742,-46.365],[5.645,-2.014],[9.858,0.363],[11.196,1.197],[3.047,13.709],[-9.044,10.58]],"v":[[-29.756,55.963],[-37.471,-2.814],[-30.5,-53.949],[-7.338,-47.183],[12.182,-50.306],[37.166,-26.622],[15.305,16.579]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.929000016755,0.344999994016,0.344999994016,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[106.328,56.213],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.944,-2.865],[-6.999,-2.306],[-4.889,14.834],[-0.059,2.686]],"o":[[-1.551,2.194],[-4.889,14.833],[6.998,2.307],[0.944,-2.864],[0,0]],"v":[[-7.124,-17.187],[-10.95,-9.583],[-4.964,14.88],[14.395,-1.229],[15.839,-9.618]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.395999983245,0.769000004787,0.791999966491,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[61.921,156.937],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 6","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.096,3.323],[0,0],[0,0],[0,0],[-1.997,-0.658]],"o":[[0,0],[0,0],[0,0],[-1.095,3.322],[1.998,0.659]],"v":[[-22.567,79.56],[30.897,-82.658],[23.663,-85.043],[-29.801,77.176],[-28.168,84.384]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.122000002394,0.33300000359,0.497999991623,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[31.146,249.499],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 7","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"“z1”轮廓","parent":6,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[238.132,141.285,0],"ix":2},"a":{"a":0,"k":[197.612,141.34,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[22.445,0],[0,0],[0,-22.439],[0,0],[22.353,0],[0,0],[0,22.368],[0,0],[0,0]],"o":[[0,0],[22.448,0],[0,0],[0,22.345],[0,0],[-22.376,0],[0,0],[0,0],[-0.001,-22.437]],"v":[[-197.362,-141.09],[156.717,-141.09],[197.362,-100.461],[197.362,100.464],[156.72,141.091],[-116.204,141.091],[-156.72,100.589],[-156.72,-100.462],[-156.72,-100.464]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[197.612,141.341],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"“f1”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[495.84,645.251,0],"ix":2},"a":{"a":0,"k":[225.861,133.643,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.379,-1.654],[12.692,0],[0,0],[7.584,8.963],[-1.517,1.378],[0,0],[-15.585,-13.649],[0,0]],"o":[[-7.587,8.963],[0,0],[-12.688,0],[1.379,-1.654],[0,0],[15.583,-13.649],[0,0],[1.516,1.378]],"v":[[215.99,82.518],[184.266,97.27],[-184.267,97.27],[-215.99,82.518],[-211.577,78.107],[-27.307,-83.622],[27.31,-83.622],[211.577,78.107]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.834999952129,0.819999964097,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[225.853,169.655],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-5.534],[0,0],[22.901,0],[0,0],[0,22.765],[0,0],[-2.138,5.032],[0,0],[0,0]],"o":[[0,0],[0,22.765],[0,0],[-22.775,0],[0,0],[0,-5.534],[0,0],[0,0],[2.137,5.032]],"v":[[225.611,-117.419],[225.611,92.011],[184.214,133.393],[-184.339,133.393],[-225.611,92.011],[-225.611,-117.419],[-222.339,-133.393],[0.001,61.949],[222.34,-133.393]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.573000021542,0.573000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[225.861,133.644],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"“z2”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[495.831,769.538,0],"to":[0,-15.5,0],"ti":[0,15.5,0]},{"t":30,"s":[495.831,676.538,0]}],"ix":2,"x":"var $bm_rt;\nvar amp, freq, decay, n, t, v;\ntry {\n amp = $bm_div(effect('\\u4f4d\\u7f6e - Overshoot')('ADBE Slider Control-0001'), 2.5), freq = $bm_div(effect('\\u4f4d\\u7f6e - Bounce')('ADBE Slider Control-0001'), 20), decay = $bm_div(effect('\\u4f4d\\u7f6e - Friction')('ADBE Slider Control-0001'), 20), n = 0, 0 < numKeys && (n = nearestKey(time).index, key(n).time > time && n--), t = 0 === n ? 0 : $bm_sub(time, key(n).time), $bm_rt = 0 < n ? (v = velocityAtTime($bm_sub(key(n).time, $bm_div(thisComp.frameDuration, 10))), $bm_sum(value, $bm_div($bm_mul($bm_mul($bm_div(v, 100), amp), Math.sin($bm_mul($bm_mul($bm_mul(freq, t), 2), Math.PI))), Math.exp($bm_mul(decay, t))))) : value;\n} catch (e$$4) {\n $bm_rt = value = value;\n}"},"a":{"a":0,"k":[177.285,381.899,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"位置 - Overshoot","np":3,"mn":"ADBE Slider Control","ix":1,"en":1,"ef":[{"ty":0,"nm":"滑块","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":20,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"位置 - Bounce","np":3,"mn":"ADBE Slider Control","ix":2,"en":1,"ef":[{"ty":0,"nm":"滑块","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":40,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]},{"ty":5,"nm":"位置 - Friction","np":3,"mn":"ADBE Slider Control","ix":3,"en":1,"ef":[{"ty":0,"nm":"滑块","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":40,"ix":1,"x":"var $bm_rt;\n$bm_rt = clamp(value, 0, 100);"}}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-22.542,0],[0,0]],"o":[[0,0],[0,0],[0,-22.541],[0,0],[0,0]],"v":[[177.035,191.649],[-177.035,191.649],[-177.035,-150.834],[-136.219,-191.649],[177.035,-191.649]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.910000011968,0.917999985639,0.913999968884,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[177.284,191.899],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"“f2”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[495.83,514.297,0],"ix":2},"a":{"a":0,"k":[222.584,193.205,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.343,-5.791],[0,0],[0,0],[-4.827,4.137],[0,0],[-15.586,-13.649],[0,0]],"o":[[0,0],[0,0],[2.345,-5.791],[0,0],[15.583,-13.649],[0,0],[4.827,4.137]],"v":[[222.334,-2.413],[0.002,192.955],[-222.334,-2.413],[-211.576,-17.58],[-27.307,-179.306],[27.311,-179.306],[211.578,-17.58]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.328999986836,0.2,0.438999998803,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[222.584,193.205],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"“bg”轮廓","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[512.135,511.008,0],"ix":2},"a":{"a":0,"k":[430.25,430.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-237.482],[237.482,0],[0,237.482],[-237.483,0]],"o":[[0,237.482],[-237.483,0],[0,-237.482],[237.482,0]],"v":[[430,0],[0,430],[-430,0],[0,-430]],"c":true},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.26699999641,0.419999994016,0.776000019148,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[430.25,430.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/app/src/main/assets/lottie/xuanfu/xuanhukefu.atlas b/app/src/main/assets/lottie/xuanfu/xuanhukefu.atlas new file mode 100644 index 0000000..6156786 --- /dev/null +++ b/app/src/main/assets/lottie/xuanfu/xuanhukefu.atlas @@ -0,0 +1,153 @@ + +xuanhukefu.png +size: 316,969 +format: RGBA8888 +filter: Linear,Linear +repeat: none +01 + rotate: false + xy: 280, 649 + size: 30, 46 + orig: 33, 50 + offset: 0, 2 + index: -1 +02 + rotate: true + xy: 262, 310 + size: 37, 46 + orig: 41, 50 + offset: 2, 2 + index: -1 +03 + rotate: false + xy: 280, 601 + size: 30, 46 + orig: 33, 50 + offset: 1, 2 + index: -1 +04 + rotate: true + xy: 2, 7 + size: 139, 145 + orig: 139, 145 + offset: 0, 0 + index: -1 +05 + rotate: false + xy: 2, 336 + size: 201, 200 + orig: 201, 201 + offset: 0, 1 + index: -1 +06 + rotate: true + xy: 2, 148 + size: 186, 187 + orig: 186, 187 + offset: 0, 0 + index: -1 +07 + rotate: false + xy: 2, 538 + size: 220, 220 + orig: 220, 220 + offset: 0, 0 + index: -1 +08 + rotate: false + xy: 280, 555 + size: 20, 44 + orig: 20, 44 + offset: 0, 0 + index: -1 +081 + rotate: false + xy: 296, 925 + size: 18, 42 + orig: 18, 42 + offset: 0, 0 + index: -1 +09 + rotate: false + xy: 280, 509 + size: 20, 44 + orig: 20, 44 + offset: 0, 0 + index: -1 +092 + rotate: false + xy: 296, 881 + size: 18, 42 + orig: 18, 42 + offset: 0, 0 + index: -1 +10 + rotate: true + xy: 191, 2 + size: 258, 123 + orig: 260, 125 + offset: 1, 1 + index: -1 +11 + rotate: true + xy: 296, 826 + size: 35, 6 + orig: 35, 6 + offset: 0, 0 + index: -1 +12 + rotate: false + xy: 296, 863 + size: 16, 16 + orig: 16, 17 + offset: 0, 0 + index: -1 +13 + rotate: false + xy: 296, 863 + size: 16, 16 + orig: 16, 17 + offset: 0, 0 + index: -1 +14 + rotate: false + xy: 2, 760 + size: 292, 207 + orig: 292, 208 + offset: 0, 0 + index: -1 +15 + rotate: true + xy: 280, 697 + size: 61, 29 + orig: 68, 34 + offset: 4, 3 + index: -1 +16 + rotate: false + xy: 262, 421 + size: 42, 71 + orig: 42, 71 + offset: 0, 0 + index: -1 +17 + rotate: false + xy: 262, 349 + size: 41, 70 + orig: 42, 72 + offset: 0, 2 + index: -1 +18 + rotate: true + xy: 205, 262 + size: 230, 55 + orig: 268, 55 + offset: 0, 0 + index: -1 +19 + rotate: true + xy: 224, 494 + size: 264, 54 + orig: 276, 54 + offset: 0, 0 + index: -1 diff --git a/app/src/main/assets/lottie/xuanfu/xuanhukefu.json b/app/src/main/assets/lottie/xuanfu/xuanhukefu.json new file mode 100644 index 0000000..74a7718 --- /dev/null +++ b/app/src/main/assets/lottie/xuanfu/xuanhukefu.json @@ -0,0 +1,1324 @@ +{ + "skeleton": { + "hash": "1S4/K2InuM4GprIilUFI1ShWOOI", + "spine": "3.8.75", + "x": -154.04, + "y": 28.73, + "width": 324.31, + "height": 220 + }, + "bones": [{ + "name": "root" + }, { + "name": "bone", + "parent": "root", + "x": -0.06, + "y": 0.72 + }, { + "name": "04", + "parent": "bone", + "length": 109.81, + "rotation": 103.17, + "x": 8.33, + "y": 84.24 + }, { + "name": "03", + "parent": "04", + "x": 52.88, + "y": 19.4 + }, { + "name": "01", + "parent": "04", + "x": 52.97, + "y": -18.56 + }, { + "name": "07", + "parent": "bone", + "x": -5.21, + "y": 138.01 + }, { + "name": "06", + "parent": "bone", + "x": -6.26, + "y": 137.61 + }, { + "name": "05", + "parent": "bone", + "x": -5.66, + "y": 137.84 + }, { + "name": "14", + "parent": "bone", + "x": 22.37, + "y": 131.08 + }, { + "name": "11", + "parent": "bone", + "length": 27.36, + "rotation": 0.72, + "x": -151.42, + "y": 138.34 + }, { + "name": "12", + "parent": "11", + "rotation": -0.72, + "x": 34.31, + "y": -0.19 + }, { + "name": "13", + "parent": "12", + "x": 8.79, + "y": -0.58 + }, { + "name": "19", + "parent": "bone", + "length": 78.66, + "rotation": -0.25, + "x": -103.06, + "y": 78.83 + }, { + "name": "18", + "parent": "bone", + "length": 106.02, + "rotation": 0.55, + "x": -103.74, + "y": 198.53 + }, { + "name": "17", + "parent": "bone", + "length": 41.59, + "rotation": -78.14, + "x": -126.31, + "y": 128.42 + }, { + "name": "16", + "parent": "bone", + "length": 49.44, + "rotation": 75.58, + "x": -127.34, + "y": 150.31 + }, { + "name": "08", + "parent": "bone", + "x": 127.11, + "y": 174.59 + }, { + "name": "09", + "parent": "bone", + "x": 126.77, + "y": 101.06 + }, { + "name": "15", + "parent": "bone", + "x": -122.89, + "y": 135.94 + }, { + "name": "10", + "parent": "bone", + "x": 152.76, + "y": 144.84 + }, { + "name": "9", + "parent": "bone", + "x": 126.77, + "y": 101.06 + }, { + "name": "8", + "parent": "bone", + "x": 127.11, + "y": 174.59 + }], + "slots": [{ + "name": "14", + "bone": "14", + "attachment": "14" + }, { + "name": "19", + "bone": "19", + "attachment": "19" + }, { + "name": "18", + "bone": "18", + "attachment": "18" + }, { + "name": "17", + "bone": "17", + "attachment": "17" + }, { + "name": "16", + "bone": "16", + "attachment": "16" + }, { + "name": "15", + "bone": "15", + "attachment": "15" + }, { + "name": "13", + "bone": "13", + "attachment": "13" + }, { + "name": "12", + "bone": "12", + "attachment": "12" + }, { + "name": "11", + "bone": "11", + "attachment": "11" + }, { + "name": "10", + "bone": "10", + "attachment": "10" + }, { + "name": "09", + "bone": "09" + }, { + "name": "9", + "bone": "9", + "attachment": "09" + }, { + "name": "08", + "bone": "08" + }, { + "name": "8", + "bone": "8", + "attachment": "08" + }, { + "name": "07", + "bone": "07", + "attachment": "07" + }, { + "name": "06", + "bone": "06", + "attachment": "06" + }, { + "name": "05", + "bone": "05", + "attachment": "05" + }, { + "name": "04", + "bone": "04", + "attachment": "04" + }, { + "name": "03", + "bone": "03", + "attachment": "03" + }, { + "name": "01", + "bone": "01", + "attachment": "02" + }], + "skins": [{ + "name": "default", + "attachments": { + "01": { + "01": { + "type": "mesh", + "uvs": [0.54551, 0.05981, 0.74114, 0.18791, 0.87934, 0.63268, 0.88, 0.83424, 0.78348, 0.91432, 0.56941, 0.95762, 0.32494, 0.91619, 0.18376, 0.74607, 0.02971, 0.2801, 0.1147, 0.11169, 0.31801, 0.04942], + "triangles": [10, 8, 9, 7, 8, 2, 10, 1, 8, 0, 1, 10, 2, 8, 1, 7, 5, 6, 2, 3, 5, 7, 2, 5, 3, 4, 5], + "vertices": [1, 4, 20.83, -7.4, 1, 1, 4, 13.13, -12.23, 1, 1, 4, -9.57, -11.6, 1, 1, 4, -19.39, -9.33, 1, 1, 4, -22.56, -5.31, 1, 1, 4, -23.06, 2.06, 1, 1, 4, -19.2, 9.44, 1, 1, 4, -9.86, 12.04, 1, 1, 4, 13.99, 11.68, 1, 1, 4, 21.55, 7.03, 1, 1, 4, 23.05, -0.21, 1], + "hull": 11 + }, + "02": { + "x": 1.69, + "y": -1.38, + "rotation": -103.17, + "width": 41, + "height": 50 + } + }, + "03": { + "03": { + "type": "mesh", + "uvs": [0.57539, 0.05951, 0.7726, 0.18846, 0.91035, 0.58227, 0.90928, 0.83984, 0.78961, 0.92125, 0.59154, 0.95446, 0.40797, 0.93999, 0.25157, 0.82151, 0.13067, 0.51322, 0.06006, 0.27872, 0.14548, 0.11163, 0.36916, 0.05258], + "triangles": [11, 8, 9, 10, 11, 9, 7, 8, 2, 11, 1, 8, 0, 1, 11, 2, 8, 1, 2, 5, 7, 2, 3, 5, 5, 6, 7, 3, 4, 5], + "vertices": [1, 3, 20.93, -7.35, 1, 1, 3, 13.17, -12.22, 1, 1, 3, -7.04, -12.16, 1, 1, 3, -19.57, -9.19, 1, 1, 3, -22.63, -4.42, 1, 1, 3, -22.76, 2.32, 1, 1, 3, -20.67, 8.06, 1, 1, 3, -13.73, 11.73, 1, 1, 3, 2.19, 12.11, 1, 1, 3, 14.14, 11.7, 1, 1, 3, 21.63, 7.05, 1, 1, 3, 22.82, -0.81, 1], + "hull": 12 + } + }, + "04": { + "04": { + "type": "mesh", + "uvs": [0.85894, 0.00348, 1, 0.53489, 1, 0.77128, 0.7087, 1, 0.55677, 1, 0.22959, 0.95269, 0, 0.32714, 0, 0.22829, 0.09374, 0.10228, 0.61516, 0.00737], + "triangles": [6, 7, 8, 9, 0, 1, 9, 6, 8, 1, 5, 6, 9, 1, 6, 1, 4, 5, 1, 3, 4, 2, 3, 1], + "vertices": [1, 2, 126.33, -58.17, 1, 1, 2, 46.84, -59.71, 1, 1, 2, 13.47, -51.9, 1, 1, 2, -9.6, -4.91, 1, 1, 2, -4.79, 15.65, 1, 1, 2, 12.26, 58.37, 1, 1, 2, 107.85, 68.77, 1, 1, 2, 121.8, 65.5, 1, 1, 2, 136.62, 48.65, 1, 1, 2, 133.51, -25.05, 1], + "hull": 10 + } + }, + "05": { + "05": { + "type": "mesh", + "uvs": [0.42763, 0.00485, 0.5789, 0.00474, 0.66082, 0.02609, 0.72918, 0.05487, 0.75194, 0.07788, 0.77565, 0.08058, 0.86106, 0.15573, 0.87262, 0.17604, 0.92451, 0.22783, 0.91499, 0.25463, 0.92684, 0.26632, 0.94034, 0.26852, 0.96304, 0.31389, 0.94784, 0.34499, 0.97927, 0.3494, 0.9964, 0.46121, 0.99499, 0.57059, 0.98005, 0.58505, 0.98043, 0.64777, 0.96623, 0.67757, 0.9436, 0.73683, 0.91272, 0.73368, 0.91822, 0.77412, 0.87696, 0.81454, 0.85413, 0.84888, 0.81261, 0.8791, 0.77265, 0.91893, 0.72657, 0.90943, 0.73401, 0.9416, 0.67341, 0.96127, 0.62791, 0.98031, 0.59433, 0.98013, 0.58132, 0.9901, 0.43287, 0.99027, 0.41631, 0.98021, 0.35462, 0.98023, 0.33844, 0.95508, 0.30158, 0.95565, 0.2253, 0.914, 0.17517, 0.87682, 0.1311, 0.83283, 0.1454, 0.80125, 0.10425, 0.80105, 0.08016, 0.76456, 0.09134, 0.74256, 0.0785, 0.73121, 0.05656, 0.7317, 0.03801, 0.67693, 0.00952, 0.61181, 0.02268, 0.58576, 0.00446, 0.55943, 0.00484, 0.43025, 0.02385, 0.34784, 0.05111, 0.34052, 0.03588, 0.31206, 0.09895, 0.19671, 0.13938, 0.20106, 0.1319, 0.16183, 0.16127, 0.13135, 0.19441, 0.13839, 0.19366, 0.1047, 0.23704, 0.07558, 0.26139, 0.10733, 0.26865, 0.07645, 0.26785, 0.05576, 0.31195, 0.03832, 0.33293, 0.05727, 0.34474, 0.02397, 0.40809, 0.00892], + "triangles": [63, 64, 65, 62, 59, 60, 62, 60, 61, 59, 56, 57, 59, 57, 58, 9, 7, 8, 54, 55, 56, 53, 54, 56, 63, 65, 66, 12, 10, 11, 14, 15, 13, 16, 17, 15, 53, 49, 51, 50, 51, 49, 52, 53, 51, 45, 47, 49, 48, 49, 47, 13, 17, 21, 15, 17, 13, 19, 17, 18, 53, 44, 49, 44, 45, 49, 46, 47, 45, 7, 9, 4, 9, 13, 62, 10, 13, 9, 12, 13, 10, 19, 21, 17, 20, 21, 19, 53, 41, 44, 41, 42, 44, 43, 44, 42, 62, 41, 56, 56, 41, 53, 66, 68, 0, 0, 1, 66, 66, 67, 68, 66, 1, 4, 2, 4, 1, 13, 27, 62, 23, 21, 22, 4, 2, 3, 62, 63, 66, 4, 62, 66, 39, 62, 36, 6, 4, 5, 9, 62, 4, 7, 4, 6, 23, 24, 21, 62, 39, 41, 40, 41, 39, 59, 62, 56, 13, 21, 27, 24, 25, 21, 25, 27, 21, 36, 38, 39, 26, 27, 25, 62, 27, 36, 37, 38, 36, 36, 27, 34, 29, 27, 28, 29, 31, 27, 31, 34, 27, 35, 36, 34, 30, 31, 29, 31, 33, 34, 32, 33, 31], + "vertices": [1, 7, -14.6, 99.2, 1, 1, 7, 15.81, 99.22, 1, 1, 7, 32.27, 94.93, 1, 1, 7, 46.01, 89.14, 1, 1, 7, 50.59, 84.52, 1, 1, 7, 55.35, 83.98, 1, 1, 7, 72.52, 68.87, 1, 1, 7, 74.84, 64.79, 1, 1, 7, 85.27, 54.38, 1, 1, 7, 83.36, 48.99, 1, 1, 7, 85.74, 46.64, 1, 1, 7, 88.46, 46.2, 1, 1, 7, 93.02, 37.08, 1, 1, 7, 89.96, 30.83, 1, 1, 7, 96.28, 29.94, 1, 1, 7, 99.72, 7.47, 1, 1, 7, 99.44, -14.52, 1, 1, 7, 96.44, -17.42, 1, 1, 7, 96.51, -30.03, 1, 1, 7, 93.66, -36.02, 1, 1, 7, 89.11, -47.93, 1, 1, 7, 82.9, -47.3, 1, 1, 7, 84.01, -55.43, 1, 1, 7, 75.72, -63.55, 1, 1, 7, 71.13, -70.45, 1, 1, 7, 62.78, -76.53, 1, 1, 7, 54.75, -84.53, 1, 1, 7, 45.49, -82.62, 1, 1, 7, 46.98, -89.09, 1, 1, 7, 34.8, -93.04, 1, 1, 7, 25.66, -96.87, 1, 1, 7, 18.91, -96.83, 1, 1, 7, 16.29, -98.84, 1, 1, 7, -13.55, -98.87, 1, 1, 7, -16.87, -96.85, 1, 1, 7, -29.27, -96.86, 1, 1, 7, -32.53, -91.8, 1, 1, 7, -39.93, -91.91, 1, 1, 7, -55.27, -83.54, 1, 1, 7, -65.34, -76.07, 1, 1, 7, -74.2, -67.23, 1, 1, 7, -71.33, -60.88, 1, 1, 7, -79.6, -60.84, 1, 1, 7, -84.44, -53.51, 1, 1, 7, -82.19, -49.08, 1, 1, 7, -84.77, -46.8, 1, 1, 7, -89.18, -46.9, 1, 1, 7, -92.91, -35.89, 1, 1, 7, -98.64, -22.8, 1, 1, 7, -95.99, -17.57, 1, 1, 7, -99.66, -12.27, 1, 1, 7, -99.58, 13.69, 1, 1, 7, -95.76, 30.26, 1, 1, 7, -90.28, 31.73, 1, 1, 7, -93.34, 37.45, 1, 1, 7, -80.66, 60.63, 1, 1, 7, -72.54, 59.76, 1, 1, 7, -74.04, 67.64, 1, 1, 7, -68.14, 73.77, 1, 1, 7, -61.48, 72.36, 1, 1, 7, -61.63, 79.13, 1, 1, 7, -52.91, 84.98, 1, 1, 7, -48.01, 78.6, 1, 1, 7, -46.55, 84.81, 1, 1, 7, -46.71, 88.96, 1, 1, 7, -37.85, 92.47, 1, 1, 7, -33.63, 88.66, 1, 1, 7, -31.26, 95.35, 1, 1, 7, -18.53, 98.38, 1], + "hull": 69 + } + }, + "06": { + "06": { + "type": "mesh", + "uvs": [0.59905, 0, 0.93387, 0.19789, 1, 0.59097, 1, 0.59668, 0.79617, 0.93624, 0.40538, 0.99738, 0.06576, 0.80667, 0, 0.34907, 0.24284, 0.05278], + "triangles": [2, 0, 1, 5, 6, 7, 0, 2, 5, 3, 4, 2, 5, 8, 0, 4, 5, 2, 5, 7, 8], + "vertices": [1, 6, 18.48, 93.4, 1, 1, 6, 80.75, 56.4, 1, 1, 6, 93.05, -17.11, 1, 1, 6, 93.05, -18.18, 1, 1, 6, 55.14, -81.68, 1, 1, 6, -17.55, -93.11, 1, 1, 6, -80.72, -57.45, 1, 1, 6, -92.95, 28.13, 1, 1, 6, -47.78, 83.53, 1], + "hull": 9 + } + }, + "07": { + "07": { + "type": "mesh", + "uvs": [1, 1, 0, 1, 0, 0, 1, 0], + "triangles": [1, 2, 3, 1, 3, 0], + "vertices": [110, -110, -110, -110, -110, 110, 110, 110], + "hull": 4 + } + }, + "08": { + "081": { + "x": -0.99, + "y": 0.42, + "width": 18, + "height": 42 + } + }, + "09": { + "092": { + "x": -0.66, + "y": 1.26, + "width": 18, + "height": 42 + } + }, + "10": { + "10": { + "x": -127.97, + "y": -6.32, + "width": 260, + "height": 125 + } + }, + "11": { + "11": { + "type": "mesh", + "uvs": [0.0241, 0.16292, 0.95625, 0.16457, 0.98361, 0.18733, 0.98444, 0.83565, 0.02963, 0.83993], + "triangles": [4, 0, 1, 3, 4, 1, 3, 1, 2], + "vertices": [-2.54, 1.73, 30.08, 1.31, 31.04, 1.16, 31.02, -2.73, -2.4, -2.33], + "hull": 5 + } + }, + "12": { + "12": { + "type": "mesh", + "uvs": [1, 0.52897, 1, 0.53058, 0.565, 0.94183, 0.05991, 0.94283, 0.51626, 0.52833, 0.05796, 0.11626, 0.56316, 0.1161], + "triangles": [4, 5, 6, 4, 6, 0, 4, 0, 1, 2, 4, 1, 3, 4, 2], + "vertices": [1, 10, 7.05, -0.32, 1, 1, 10, 7.05, -0.34, 1, 1, 10, 0.09, -7.34, 1, 1, 10, -7.99, -7.35, 1, 1, 10, -0.69, -0.31, 1, 1, 10, -8.02, 6.7, 1, 1, 10, 0.07, 6.7, 1], + "hull": 7 + } + }, + "13": { + "13": { + "type": "mesh", + "uvs": [1, 0.52854, 1, 0.53017, 0.56267, 0.94317, 0.05708, 0.94426, 0.51951, 0.52212, 0.06021, 0.11681, 0.56287, 0.11692], + "triangles": [4, 5, 6, 4, 6, 0, 4, 0, 1, 2, 4, 1, 3, 4, 2], + "vertices": [1, 11, 6.5, 0.03, 1, 1, 11, 6.5, 0, 1, 1, 11, -0.49, -7.02, 1, 1, 11, -8.58, -7.03, 1, 1, 11, -1.18, 0.14, 1, 1, 11, -8.53, 7.03, 1, 1, 11, -0.49, 7.03, 1], + "hull": 7 + } + }, + "14": { + "14": { + "type": "mesh", + "uvs": [0.99469, 0.21641, 0.9984, 0.64626, 0.95328, 0.79421, 0.36168, 0.99595, 0.00645, 0.76705, 0, 0.39316, 0, 0.23382, 0.36114, 0.00559], + "triangles": [5, 6, 7, 3, 4, 5, 1, 2, 7, 1, 7, 0, 7, 3, 5, 2, 3, 7], + "vertices": [1, 8, 146.87, 65.92, 1, 1, 8, 147.95, -23.49, 1, 1, 8, 134.78, -54.26, 1, 1, 8, -37.97, -96.22, 1, 1, 8, -141.7, -48.61, 1, 1, 8, -143.58, 29.15, 1, 1, 8, -143.58, 62.3, 1, 1, 8, -38.13, 109.77, 1], + "hull": 8 + } + }, + "15": { + "15": { + "type": "mesh", + "uvs": [0.69143, 0.07605, 0.85073, 0.14, 0.94183, 0.32396, 0.94156, 0.67663, 0.86112, 0.83815, 0.79382, 0.883, 0.60408, 0.8839, 0.51508, 0.79506, 0.16197, 0.79412, 0.07291, 0.62014, 0.07353, 0.38197, 0.13395, 0.26094, 0.19287, 0.20571, 0.51501, 0.20815, 0.58502, 0.13468], + "triangles": [1, 2, 5, 8, 11, 12, 9, 10, 11, 8, 9, 11, 7, 13, 14, 12, 13, 7, 8, 12, 7, 3, 4, 2, 5, 0, 1, 4, 5, 2, 6, 14, 0, 6, 7, 14, 0, 5, 6], + "vertices": [1, 18, 12.7, 15.48, 1, 1, 18, 23.53, 13.31, 1, 1, 18, 29.73, 7.06, 1, 1, 18, 29.71, -4.94, 1, 1, 18, 24.24, -10.43, 1, 1, 18, 19.66, -11.95, 1, 1, 18, 6.76, -11.98, 1, 1, 18, 0.71, -8.96, 1, 1, 18, -23.3, -8.93, 1, 1, 18, -29.36, -3.02, 1, 1, 18, -29.32, 5.08, 1, 1, 18, -25.21, 9.2, 1, 1, 18, -21.2, 11.08, 1, 1, 18, 0.7, 10.99, 1, 1, 18, 5.46, 13.49, 1], + "hull": 15 + } + }, + "16": { + "16": { + "type": "mesh", + "uvs": [0.97594, 0, 0.98748, 0.00176, 0.69316, 0.34951, 0.56317, 0.58378, 0.45267, 0.98727, 1.0E-5, 0.98642, 0.30661, 0.92052, 0.43749, 0.53788, 0.80994, 0.09781], + "triangles": [8, 0, 1, 2, 8, 1, 2, 7, 8, 3, 7, 2, 6, 7, 3, 4, 6, 3, 5, 6, 4], + "vertices": [72.08, -8.43, 72.08, -8.93, 45.09, -3.11, 27.62, -1.97, -1.28, -4.61, -5.96, 13.82, 1.78, 2.52, 29.46, 3.96, 63.62, -3.41], + "hull": 9 + } + }, + "17": { + "17": { + "type": "mesh", + "uvs": [0, 0.01368, 0.45585, 0.01263, 0.4527, 0.09178, 0.61498, 0.50603, 0.69097, 0.63896, 0.9645, 0.95794, 0.92282, 0.95985, 0.76333, 0.83462, 0.53041, 0.56782, 0.34236, 0.23893, 0.32752, 0.09248, 0, 0.02345], + "triangles": [10, 11, 0, 0, 1, 10, 2, 10, 1, 9, 10, 2, 9, 2, 3, 8, 9, 3, 8, 3, 4, 5, 7, 4, 8, 4, 7, 6, 7, 5], + "vertices": [1, 14, -4.74, -14.92, 1, 1, 14, -0.88, 3.83, 1, 1, 14, 4.67, 2.53, 1, 1, 14, 35.26, 3.07, 1, 1, 14, 45.28, 4.23, 1, 1, 14, 70.12, 10.75, 1, 1, 14, 69.89, 9.01, 1, 1, 14, 59.69, 4.3, 1, 1, 14, 38.88, -1.32, 1, 1, 14, 14.08, -4.18, 1, 1, 14, 3.64, -2.62, 1, 1, 14, -4.06, -15.06, 1], + "hull": 12 + } + }, + "18": { + "18": { + "type": "mesh", + "uvs": [0.04953, 0.00536, 0.85777, 0, 0.81956, 0.06028, 0.04588, 0.32501, 0.02611, 0.58288, 0.01096, 0.97121, 0.00369, 0.99392, 0.00351, 0.82382, 0.01468, 0.54751, 0.02628, 0.32078], + "triangles": [2, 0, 1, 3, 9, 0, 3, 0, 2, 8, 9, 3, 4, 8, 3, 7, 8, 4, 5, 7, 4, 6, 7, 5], + "vertices": [1, 13, -4.17, 2.23, 1, 1, 13, 212.43, 0.43, 1, 1, 13, 202.16, -2.79, 1, 1, 13, -5.32, -15.34, 1, 1, 13, -10.76, -29.47, 1, 1, 13, -15.02, -50.79, 1, 1, 13, -16.99, -52.02, 1, 1, 13, -16.94, -42.66, 1, 1, 13, -13.8, -27.5, 1, 1, 13, -10.57, -15.06, 1], + "hull": 10 + } + }, + "19": { + "19": { + "type": "mesh", + "uvs": [7.1E-4, 0, 0.00348, 0, 0.01092, 0.03484, 0.02528, 0.40431, 0.0431, 0.66, 0.06774, 0.89112, 0.95402, 0.95816, 0.95339, 0.98238, 0.04457, 0.98333, 0.01074, 0.40865], + "triangles": [2, 0, 1, 9, 2, 3, 9, 0, 2, 7, 5, 6, 8, 4, 5, 8, 5, 7, 9, 3, 4, 8, 9, 4], + "vertices": [1, 12, -18.18, 51.11, 1, 1, 12, -17.41, 51.11, 1, 1, 12, -15.35, 49.24, 1, 1, 12, -11.3, 29.3, 1, 1, 12, -6.33, 15.52, 1, 1, 12, 0.53, 3.07, 1, 1, 12, 245.16, 0.51, 1, 1, 12, 244.99, -0.8, 1, 1, 12, -5.84, -1.94, 1, 1, 12, -15.31, 29.05, 1], + "hull": 10 + } + }, + "8": { + "08": { + "type": "mesh", + "uvs": [0.11757, 0.02092, 0.53108, 0.00594, 0.843, 0.49833, 1, 0.9815, 0.49208, 1, 0.23703, 0.52693, 0.01309, 0.12499], + "triangles": [1, 6, 0, 2, 6, 1, 2, 5, 6, 4, 5, 2, 4, 2, 3], + "vertices": [1, 21, -8.97, 21.5, 1, 1, 21, -0.7, 22.16, 1, 1, 21, 5.54, 0.5, 1, 1, 21, 8.68, -20.76, 1, 1, 21, -1.48, -21.58, 1, 1, 21, -6.58, -0.76, 1, 1, 21, -11.06, 16.92, 1], + "hull": 7 + } + }, + "9": { + "09": { + "type": "mesh", + "uvs": [1, 0.02242, 0.94505, 0.30281, 0.72808, 0.68776, 0.48881, 0.97953, 1.0E-5, 0.97345, 1.0E-5, 0.93037, 0.28771, 0.39889, 0.45203, 0.02202], + "triangles": [1, 7, 0, 6, 7, 1, 2, 6, 1, 5, 6, 2, 3, 4, 5, 2, 3, 5], + "vertices": [1, 20, 9.02, 21.97, 1, 1, 20, 7.92, 9.63, 1, 1, 20, 3.58, -7.31, 1, 1, 20, -1.2, -20.15, 1, 1, 20, -10.98, -19.88, 1, 1, 20, -10.98, -17.98, 1, 1, 20, -5.22, 5.4, 1, 1, 20, -1.94, 21.99, 1], + "hull": 8 + } + } + } + }], + "animations": { + "02": { + "bones": { + "06": { + "rotate": [{ + "curve": 0.276, + "c3": 0.621, + "c4": 0.4 + }, { + "time": 0.6667, + "angle": -37.47, + "curve": 0.314, + "c2": 0.27, + "c3": 0.657, + "c4": 0.64 + }, { + "time": 1.3333, + "angle": -88.11 + }, { + "time": 2, + "angle": -159.56 + }, { + "time": 2.6667, + "angle": 139.33 + }, { + "time": 3.3333, + "angle": 70.9 + }, { + "time": 4, + "angle": 1 + }] + }, + "11": { + "translate": [{ + "x": 0.25, + "curve": 0.382, + "c2": 0.58, + "c3": 0.731 + }, { + "time": 0.1, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 0.4, + "x": 3.85, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 0.7667, + "x": 2.89, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 1.1, + "x": 1.04, + "curve": 0.243, + "c3": 0.655, + "c4": 0.63 + }, { + "time": 1.3333, + "x": 0.25 + }], + "scale": [{ + "x": 1.01, + "y": 1.01, + "curve": 0.382, + "c2": 0.58, + "c3": 0.731 + }, { + "time": 0.1, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 0.4, + "x": 0.98, + "y": 0.98, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 0.7667, + "x": 1.079, + "y": 1.079, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 1.1, + "x": 1.04, + "y": 1.04, + "curve": 0.243, + "c3": 0.655, + "c4": 0.63 + }, { + "time": 1.3333, + "x": 1.01, + "y": 1.01 + }] + }, + "05": { + "rotate": [{ + "curve": 0.332, + "c3": 0.665, + "c4": 0.33 + }, { + "time": 0.1667, + "angle": -9.59, + "curve": 0.33, + "c2": 0.17, + "c3": 0.663, + "c4": 0.5 + }, { + "time": 0.5, + "angle": -45, + "curve": 0.329, + "c2": 0.22, + "c3": 0.662, + "c4": 0.56 + }, { + "time": 1, + "angle": -90, + "curve": 0.325, + "c2": 0.23, + "c3": 0.658, + "c4": 0.56 + }, { + "time": 2, + "angle": 180, + "curve": 0.314, + "c2": 0.27, + "c3": 0.657, + "c4": 0.64 + }, { + "time": 4, + "angle": 0.5 + }] + }, + "13": { + "translate": [{ + "x": 0.99, + "curve": 0.289, + "c2": 0.17, + "c3": 0.755 + }, { + "time": 0.3, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 0.6, + "x": 2.59, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 0.9667, + "x": 2.89, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 1.3, + "x": 1.04, + "curve": 0.305, + "c3": 0.64, + "c4": 0.36 + }, { + "time": 1.3333, + "x": 0.99 + }], + "scale": [{ + "x": 1.038, + "y": 1.038, + "curve": 0.289, + "c2": 0.17, + "c3": 0.755 + }, { + "time": 0.3, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 0.6, + "x": 0.98, + "y": 0.98, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 0.9667, + "x": 1.079, + "y": 1.079, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 1.3, + "x": 1.04, + "y": 1.04, + "curve": 0.305, + "c3": 0.64, + "c4": 0.36 + }, { + "time": 1.3333, + "x": 1.038, + "y": 1.038 + }] + }, + "12": { + "translate": [{ + "x": 0.66, + "curve": 0.363, + "c2": 0.44, + "c3": 0.755 + }, { + "time": 0.2, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 0.5, + "x": 3.85, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 0.8667, + "x": 2.89, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 1.2, + "x": 1.04, + "curve": 0.258, + "c3": 0.619, + "c4": 0.45 + }, { + "time": 1.3333, + "x": 0.66 + }], + "scale": [{ + "x": 1.025, + "y": 1.025, + "curve": 0.363, + "c2": 0.44, + "c3": 0.755 + }, { + "time": 0.2, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 0.5, + "x": 0.98, + "y": 0.98, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 0.8667, + "x": 1.079, + "y": 1.079, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 1.2, + "x": 1.04, + "y": 1.04, + "curve": 0.258, + "c3": 0.619, + "c4": 0.45 + }, { + "time": 1.3333, + "x": 1.025, + "y": 1.025 + }] + }, + "07": { + "rotate": [{}, { + "time": 1, + "angle": -90 + }, { + "time": 2, + "angle": 180 + }, { + "time": 4, + "angle": 1 + }] + } + } + }, + "animation": { + "slots": { + "01": { + "attachment": [{ + "time": 0.4333, + "name": "01" + }, { + "time": 0.5, + "name": "02" + }] + }, + "19": { + "color": [{ + "color": "ffffffa5", + "curve": 0.25, + "c3": 0.75 + }, { + "time": 0.4667, + "color": "ffffffff", + "curve": 0.25, + "c3": 0.75 + }, { + "time": 1.3333, + "color": "ffffffa5" + }] + }, + "18": { + "color": [{ + "color": "ffffff9a", + "curve": 0.25, + "c3": 0.75 + }, { + "time": 0.4667, + "color": "ffffffff", + "curve": 0.25, + "c3": 0.75 + }, { + "time": 1.3333, + "color": "ffffff9a" + }] + }, + "16": { + "color": [{ + "time": 0.2667, + "color": "ffffffff" + }, { + "time": 0.4667, + "color": "ffffff6d" + }, { + "time": 0.6333, + "color": "ffffffff" + }] + }, + "9": { + "color": [{ + "time": 0.3333, + "color": "ffffffff" + }, { + "time": 0.5333, + "color": "ffffff00", + "curve": "stepped" + }, { + "time": 0.9, + "color": "ffffff00" + }, { + "time": 1.1, + "color": "ffffffff" + }] + }, + "09": { + "color": [{ + "time": 0.3333, + "color": "ffffff75" + }, { + "time": 0.5333, + "color": "ffffffff", + "curve": "stepped" + }, { + "time": 0.9, + "color": "ffffffff" + }, { + "time": 1.1, + "color": "ffffff00" + }], + "attachment": [{ + "time": 0.3333, + "name": "092" + }] + }, + "17": { + "color": [{ + "time": 0.2667, + "color": "ffffffff" + }, { + "time": 0.4667, + "color": "ffffff6d" + }, { + "time": 0.6333, + "color": "ffffffff" + }] + }, + "08": { + "color": [{ + "time": 0.3333, + "color": "ffffff75" + }, { + "time": 0.5333, + "color": "ffffffff", + "curve": "stepped" + }, { + "time": 0.9, + "color": "ffffffff" + }, { + "time": 1.1, + "color": "ffffff00" + }], + "attachment": [{ + "time": 0.3333, + "name": "081" + }] + }, + "8": { + "color": [{ + "time": 0.3333, + "color": "ffffffff" + }, { + "time": 0.5333, + "color": "ffffff00", + "curve": "stepped" + }, { + "time": 0.9, + "color": "ffffff00" + }, { + "time": 1.1, + "color": "ffffffff" + }] + } + }, + "bones": { + "04": { + "translate": [{ + "y": -0.9 + }, { + "time": 0.6667, + "x": -0.9, + "y": 0.9 + }, { + "time": 1.3333, + "y": -0.9 + }] + }, + "03": { + "scale": [{ + "time": 0.1667, + "curve": 0.849, + "c2": 0.02, + "c3": 0.438, + "c4": 1.03 + }, { + "time": 0.3333, + "x": 0.354, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 0.4667, + "x": 0.038, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 0.5, + "x": 0.354, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 0.6 + }] + }, + "01": { + "scale": [{ + "time": 0.1667, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 0.3333, + "x": 0.354, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 0.4667, + "x": 0.038, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 0.5, + "x": 0.354, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 0.6 + }] + }, + "07": { + "rotate": [{}, { + "time": 0.3333, + "angle": -90 + }, { + "time": 0.6667, + "angle": -180 + }, { + "time": 1.3333, + "angle": 1 + }] + }, + "06": { + "rotate": [{ + "angle": -0.24, + "curve": 0.379, + "c2": 0.6, + "c3": 0.724 + }, { + "time": 0.1667, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 0.8333, + "angle": -1.32, + "curve": 0.242, + "c3": 0.667, + "c4": 0.67 + }, { + "time": 1.3333, + "angle": -0.24 + }], + "translate": [{ + "curve": 0.25, + "c3": 0.75 + }, { + "time": 0.6667, + "y": -1.64, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 1.3333 + }] + }, + "05": { + "rotate": [{ + "angle": -0.66, + "curve": 0.375, + "c2": 0.5, + "c3": 0.75 + }, { + "time": 0.3333, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 1, + "angle": -1.32, + "curve": 0.25, + "c3": 0.625, + "c4": 0.5 + }, { + "time": 1.3333, + "angle": -0.66 + }], + "translate": [{ + "y": -0.3, + "curve": 0.379, + "c2": 0.6, + "c3": 0.724 + }, { + "time": 0.1667, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 0.8333, + "y": -1.64, + "curve": 0.242, + "c3": 0.667, + "c4": 0.67 + }, { + "time": 1.3333, + "y": -0.3 + }] + }, + "11": { + "translate": [{ + "x": 0.25, + "curve": 0.382, + "c2": 0.58, + "c3": 0.731 + }, { + "time": 0.1, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 0.4, + "x": 3.85, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 0.7667, + "x": 2.89, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 1.1, + "x": 1.04, + "curve": 0.243, + "c3": 0.655, + "c4": 0.63 + }, { + "time": 1.3333, + "x": 0.25 + }], + "scale": [{ + "x": 1.01, + "y": 1.01, + "curve": 0.382, + "c2": 0.58, + "c3": 0.731 + }, { + "time": 0.1, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 0.4, + "x": 0.98, + "y": 0.98, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 0.7667, + "x": 1.079, + "y": 1.079, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 1.1, + "x": 1.04, + "y": 1.04, + "curve": 0.243, + "c3": 0.655, + "c4": 0.63 + }, { + "time": 1.3333, + "x": 1.01, + "y": 1.01 + }] + }, + "13": { + "translate": [{ + "x": 0.99, + "curve": 0.289, + "c2": 0.17, + "c3": 0.755 + }, { + "time": 0.3, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 0.6, + "x": 2.59, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 0.9667, + "x": 2.89, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 1.3, + "x": 1.04, + "curve": 0.305, + "c3": 0.64, + "c4": 0.36 + }, { + "time": 1.3333, + "x": 0.99 + }], + "scale": [{ + "x": 1.038, + "y": 1.038, + "curve": 0.289, + "c2": 0.17, + "c3": 0.755 + }, { + "time": 0.3, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 0.6, + "x": 0.98, + "y": 0.98, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 0.9667, + "x": 1.079, + "y": 1.079, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 1.3, + "x": 1.04, + "y": 1.04, + "curve": 0.305, + "c3": 0.64, + "c4": 0.36 + }, { + "time": 1.3333, + "x": 1.038, + "y": 1.038 + }] + }, + "12": { + "translate": [{ + "x": 0.66, + "curve": 0.363, + "c2": 0.44, + "c3": 0.755 + }, { + "time": 0.2, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 0.5, + "x": 3.85, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 0.8667, + "x": 2.89, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 1.2, + "x": 1.04, + "curve": 0.258, + "c3": 0.619, + "c4": 0.45 + }, { + "time": 1.3333, + "x": 0.66 + }], + "scale": [{ + "x": 1.025, + "y": 1.025, + "curve": 0.363, + "c2": 0.44, + "c3": 0.755 + }, { + "time": 0.2, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 0.5, + "x": 0.98, + "y": 0.98, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 0.8667, + "x": 1.079, + "y": 1.079, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 1.2, + "x": 1.04, + "y": 1.04, + "curve": 0.258, + "c3": 0.619, + "c4": 0.45 + }, { + "time": 1.3333, + "x": 1.025, + "y": 1.025 + }] + }, + "19": { + "translate": [{ + "curve": 0.25, + "c3": 0.75 + }, { + "time": 0.6667, + "x": 0.67, + "y": -4.66, + "curve": 0.379, + "c2": 0.6, + "c3": 0.724 + }, { + "time": 1.3333 + }], + "scale": [{ + "x": 0.86, + "y": 0.86, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 0.4667, + "x": 1.069, + "y": 1.069, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 0.7333, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 1.3333, + "x": 0.86, + "y": 0.86 + }] + }, + "18": { + "translate": [{ + "curve": 0.25, + "c3": 0.75 + }, { + "time": 0.6667, + "y": 3.33, + "curve": 0.379, + "c2": 0.6, + "c3": 0.724 + }, { + "time": 1.3333 + }], + "scale": [{ + "x": 0.86, + "y": 0.86, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 0.4667, + "x": 1.069, + "y": 1.069, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 0.7333, + "curve": 0.25, + "c3": 0.75 + }, { + "time": 1.3333, + "x": 0.86, + "y": 0.86 + }] + }, + "17": { + "scale": [{}, { + "time": 0.2667, + "x": 1.007, + "y": 1.007 + }, { + "time": 0.4667, + "x": 1.212, + "y": 1.212 + }, { + "time": 1.3333 + }] + }, + "16": { + "scale": [{}, { + "time": 0.2667, + "x": 1.007, + "y": 1.007 + }, { + "time": 0.4667, + "x": 1.212, + "y": 1.212 + }, { + "time": 1.3333 + }] + }, + "08": { + "scale": [{}, { + "time": 0.3333, + "x": 1.059, + "y": 1.059 + }, { + "time": 0.6667, + "x": 0.946, + "y": 0.946 + }, { + "time": 1, + "x": 0.932, + "y": 0.932 + }, { + "time": 1.3333 + }] + }, + "09": { + "scale": [{}, { + "time": 0.3333, + "x": 1.059, + "y": 1.059 + }, { + "time": 0.6667, + "x": 0.946, + "y": 0.946 + }, { + "time": 1, + "x": 0.932, + "y": 0.932 + }, { + "time": 1.3333 + }] + }, + "9": { + "scale": [{}, { + "time": 0.3333, + "x": 1.059, + "y": 1.059 + }, { + "time": 0.6667, + "x": 0.946, + "y": 0.946 + }, { + "time": 1, + "x": 0.932, + "y": 0.932 + }, { + "time": 1.3333 + }] + }, + "8": { + "scale": [{}, { + "time": 0.3333, + "x": 1.059, + "y": 1.059 + }, { + "time": 0.6667, + "x": 0.946, + "y": 0.946 + }, { + "time": 1, + "x": 0.932, + "y": 0.932 + }, { + "time": 1.3333 + }] + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/assets/lottie/xuanfu/xuanhukefu.png b/app/src/main/assets/lottie/xuanfu/xuanhukefu.png new file mode 100644 index 0000000..933259c Binary files /dev/null and b/app/src/main/assets/lottie/xuanfu/xuanhukefu.png differ diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..a812c05 Binary files /dev/null and b/app/src/main/ic_launcher-playstore.png differ diff --git a/app/src/main/java/com/dskj/rbchat/AppSkinConfig.java b/app/src/main/java/com/dskj/rbchat/AppSkinConfig.java new file mode 100644 index 0000000..4fc434d --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/AppSkinConfig.java @@ -0,0 +1,71 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + + package com.dskj.rbchat; + +import com.netease.yunxin.kit.corekit.im.utils.PreferenceUtils; + +public class AppSkinConfig { + + private AppSkinConfig() {} + + private static class AppSkinConfigHolder { + private static final AppSkinConfig instance = new AppSkinConfig(); + } + + public static AppSkinConfig getInstance() { + return AppSkinConfigHolder.instance; + } + + //本地储存的皮肤类型key值 + private static final String APP_SKIN_KEY = "app_skin_key"; + + //基础类型 + public static final int APP_SKIN_BASE_TYPE = 0; + + //通用皮肤 + public static final int APP_SKIN_COMMON = 1; + + AppSkin currentSkin; + + //获取皮肤类型 + public AppSkin getAppSkinStyle() { + if (currentSkin == null) { + int style = PreferenceUtils.INSTANCE.getInt(APP_SKIN_KEY, APP_SKIN_BASE_TYPE); + currentSkin = AppSkin.typeOfValue(style); + } + return currentSkin; + } + + public void setAppSkinStyle(AppSkin style) { + currentSkin = style; + PreferenceUtils.INSTANCE.saveInt(APP_SKIN_KEY, style.getValue()); + } + + public enum AppSkin { + //基础类型 + baseSkin(APP_SKIN_BASE_TYPE), + // 通用皮肤 + commonSkin(APP_SKIN_COMMON); + + final int value; + + AppSkin(int value) { + this.value = value; + } + + public int getValue() { + return value; + } + + public static AppSkin typeOfValue(int value) { + for (AppSkin e : values()) { + if (e.getValue() == value) { + return e; + } + } + return baseSkin; + } + } +} diff --git a/app/src/main/java/com/dskj/rbchat/CustomConfig.java b/app/src/main/java/com/dskj/rbchat/CustomConfig.java new file mode 100644 index 0000000..78f8062 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/CustomConfig.java @@ -0,0 +1,342 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat; + +import android.content.Context; + +import com.dskj.rbchat.custom.ChatStickerViewHolder; + +import android.graphics.Color; + +import com.netease.yunxin.kit.chatkit.ui.ChatKitClient; +import com.netease.yunxin.kit.chatkit.ui.ChatMessageType; +import com.netease.yunxin.kit.chatkit.ui.ChatUIConfig; +import com.netease.yunxin.kit.chatkit.ui.custom.BusinessAttachment; +import com.netease.yunxin.kit.chatkit.ui.custom.ChatBusinessViewHolder; +import com.netease.yunxin.kit.chatkit.ui.custom.HelpPayAttachment; +import com.netease.yunxin.kit.chatkit.ui.custom.HelpPayViewHolder; +import com.netease.yunxin.kit.chatkit.ui.custom.InviteGroupAttachment; +import com.netease.yunxin.kit.chatkit.ui.custom.InviteGroupViewHolder; +import com.netease.yunxin.kit.chatkit.ui.custom.RedPacketAttachment; +import com.netease.yunxin.kit.chatkit.ui.custom.RedPacketGetAttachment; +import com.netease.yunxin.kit.chatkit.ui.custom.RedPacketGetViewHolder; +import com.netease.yunxin.kit.chatkit.ui.custom.RedPacketViewHolder; +import com.netease.yunxin.kit.chatkit.ui.custom.StickerAttachment; +import com.netease.yunxin.kit.chatkit.ui.custom.TransferAttachment; +import com.netease.yunxin.kit.chatkit.ui.custom.TransferViewHolder; +import com.netease.yunxin.kit.chatkit.ui.custom.UserAlbumsAttachment; +import com.netease.yunxin.kit.chatkit.ui.custom.UserAlbumsViewHolder; +import com.netease.yunxin.kit.chatkit.ui.view.message.MessageProperties; +import com.netease.yunxin.kit.contactkit.ui.ContactUIConfig; +import com.netease.yunxin.kit.conversationkit.ui.ConversationKitClient; +import com.netease.yunxin.kit.conversationkit.ui.ConversationUIConfig; + +public class CustomConfig { + + // 个性化配置会话消息页面 + public static void configChatKit(Context context) { + // test + ChatUIConfig chatUIConfig = new ChatUIConfig(); + chatUIConfig.messageProperties = new MessageProperties(); + chatUIConfig.messageProperties.messageTextColor = context.getColor(R.color.color_383838); + + // chatUIConfig.messageItemClickListener = + // new IMessageItemClickListener() { + // @Override + // public boolean onSelfIconLongClick(View view, int position, ChatMessageBean messageInfo) { + // ToastX.showShortToast("会话页面onSelfIconLongClick点击事件"); + // return false; + // } + // + // @Override + // public boolean onUserIconLongClick(View view, int position, ChatMessageBean messageInfo) { + // ToastX.showShortToast("会话页面onUserIconLongClick点击事件"); + // return false; + // } + // + // @Override + // public boolean onMessageClick(View view, int position, ChatMessageBean messageInfo) { + // ToastX.showShortToast("会话消息点击事件"+messageInfo.getMessageData().getMessage().getContent()); + // return false; + // } + // + // @Override + // public boolean onReplyMessageClick(View view, int position, IMMessageInfo messageInfo) { + // ToastX.showShortToast("onReplyMessageClick"+messageInfo.getMessage().getContent()); + // return false; + // } + // + // @Override + // public boolean onReEditRevokeMessage( + // View view, + // int position, + // ChatMessageBean messageInfo + // ) { + // ToastX.showShortToast("onReEditRevokeMessage"+messageInfo.getMessageData().getMessage().getContent()); + // return false; + // } + // }; + // 设置是否展示标题栏、右侧按钮图片和右侧按钮点击事件 + // chatUIConfig.messageProperties = new MessageProperties(); + + // chatUIConfig.messageProperties.showTitleBar = false; + // chatUIConfig.messageProperties.titleBarRightRes = R.drawable.ic_user_setting; + // chatUIConfig.messageProperties.avatarCornerRadius = 30f; + // chatUIConfig.messageProperties.messageTextColor = Color.GREEN; + // chatUIConfig.messageProperties.titleBarRightClick = + // new View.OnClickListener() { + // @Override + // public void onClick(View v) { + // ToastX.showShortToast("会话页面标题栏右侧点击事件"); + // } + // }; + + // chatUIConfig.messageProperties.selfMessageBg = + // new ColorDrawable(context.getResources().getColor(R.color.color_blue_3a9efb)); + // chatUIConfig.messageProperties.receiveMessageBg = + // new ColorDrawable(context.getResources().getColor(R.color.color_666666)); + // + // chatUIConfig.messageProperties.chatViewBackground = + // new ColorDrawable(context.getResources().getColor(R.color.red)); + // 个性化配置会话消息页面视图 + // chatUIConfig.chatViewCustom = + // new IChatViewCustom() { + // @Override + // public void customizeChatLayout(IChatView layout) { + // if (layout instanceof FunChatView) { + // FunChatView chatLayout = (FunChatView) layout; + // FrameLayout frameLayout = chatLayout.getChatBodyBottomLayout(); + // TextView textView = new TextView(context, null); + // textView.setText("hahhahhhh"); + // FrameLayout.LayoutParams layoutParams = + // new FrameLayout.LayoutParams( + // ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); + // layoutParams.gravity = Gravity.BOTTOM; + // frameLayout.addView(textView, layoutParams); + // } else if (layout instanceof ChatView) { + // ChatView chatLayout = (ChatView) layout; + // FrameLayout frameLayout = chatLayout.getChatBodyBottomLayout(); + // TextView textView = new TextView(context, null); + // textView.setText("hahhahhhh"); + // FrameLayout.LayoutParams layoutParams = + // new FrameLayout.LayoutParams( + // ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); + // layoutParams.gravity = Gravity.BOTTOM; + // frameLayout.addView(textView, layoutParams); + // } + // } + // }; + // 个信号配置输入框下面输入按钮 + // chatUIConfig.chatInputMenu = + // new IChatInputMenu() { + // @Override + // public List customizeInputBar(List actionItemList) { + // return actionItemList; + // } + // + // @Override + // public List customizeInputMore(List actionItemList) { + // actionItemList.add( + // new ActionItem("custom_more_1", R.drawable.ic_user_setting, R.string.chat)); + // return null; + // } + // + // @Override + // public boolean onCustomInputClick(Context context, View view, String action) { + // ToastX.showShortToast(action); + // return true; + // } + // }; + + // 个性化配置会话消息中消息长按弹窗菜单 + // chatUIConfig.chatPopMenu = + // new IChatPopMenu() { + // @NonNull + // @Override + // public List customizePopMenu( + // List menuList, ChatMessageBean messageBean) { + // if(menuList != null){ + // for (int index = menuList.size() - 1;index >=0;index--){ + // if + // (TextUtils.equals(menuList.get(index).getAction(),ActionConstants.POP_ACTION_PIN)){ + // menuList.remove(index); + // break; + // } + // } + // } + // return menuList; + // } + // + // @Override + // public boolean showDefaultPopMenu() { + // return true; + // } + // }; + ChatKitClient.setChatUIConfig(chatUIConfig); + ChatKitClient.addCustomAttach(ChatMessageType.CUSTOM_STICKER_CIRCLE, StickerAttachment.class); + ChatKitClient.addCustomViewHolder(ChatMessageType.CUSTOM_STICKER_CIRCLE, ChatStickerViewHolder.class); + + ChatKitClient.addCustomAttach(ChatMessageType.CUSTOM_STICKER_BUSINESS_CARD, BusinessAttachment.class); + ChatKitClient.addCustomViewHolder(ChatMessageType.CUSTOM_STICKER_BUSINESS_CARD, ChatBusinessViewHolder.class); + + + ChatKitClient.addCustomAttach(ChatMessageType.CUSTOM_STICKER_TRANSFER_ACCOUNTS, TransferAttachment.class); + ChatKitClient.addCustomViewHolder(ChatMessageType.CUSTOM_STICKER_TRANSFER_ACCOUNTS, TransferViewHolder.class); + + ChatKitClient.addCustomAttach(ChatMessageType.CUSTOM_STICKER_RED_ENVELOPE, RedPacketAttachment.class); + ChatKitClient.addCustomViewHolder(ChatMessageType.CUSTOM_STICKER_RED_ENVELOPE, RedPacketViewHolder.class); + + + ChatKitClient.addCustomAttach(ChatMessageType.CUSTOM_STICKER_RED_ENVELOPE_GET, RedPacketGetAttachment.class); + ChatKitClient.addCustomViewHolder(ChatMessageType.CUSTOM_STICKER_RED_ENVELOPE_GET, RedPacketGetViewHolder.class); + + ChatKitClient.addCustomAttach(ChatMessageType.CUSTOM_STICKER_ALBUMS, UserAlbumsAttachment.class); + ChatKitClient.addCustomViewHolder(ChatMessageType.CUSTOM_STICKER_ALBUMS, UserAlbumsViewHolder.class); + + ChatKitClient.addCustomAttach(ChatMessageType.CUSTOM_STICKER_HELPPAY, HelpPayAttachment.class); + ChatKitClient.addCustomViewHolder(ChatMessageType.CUSTOM_STICKER_HELPPAY, HelpPayViewHolder.class); + + + ChatKitClient.addCustomAttach(ChatMessageType.CUSTOM_STICKER_JOINGROUP, InviteGroupAttachment.class); + ChatKitClient.addCustomViewHolder(ChatMessageType.CUSTOM_STICKER_JOINGROUP, InviteGroupViewHolder.class); + } + + // 个性化定制联系人页面 + public static void configContactKit(Context context) { + ContactUIConfig contactUIConfig = new ContactUIConfig(); + // contactUIConfig.showHeader = false; + // contactUIConfig.showTitleBar = false; + // contactUIConfig.showTitleBarRightIcon = false; + // contactUIConfig.showTitleBarRight2Icon = false; + + // contactUIConfig.title = "我的通讯录"; + // contactUIConfig.titleColor = Color.GREEN; + // contactUIConfig.titleBarRight2Res = R.drawable.ic_about; + // contactUIConfig.titleBarRightRes = R.drawable.ic_about; + // contactUIConfig.titleBarRightClick = v -> ToastX.showShortToast("titleBarRightClick"); + // contactUIConfig.titleBarRight2Click = v -> ToastX.showShortToast("titleBarRight2Click"); + + // contactUIConfig.contactAttrs = new ContactListViewAttrs(); + // contactUIConfig.contactAttrs.setShowIndexBar(false); + // contactUIConfig.contactAttrs.setNameTextColor(Color.GREEN); + // contactUIConfig.contactAttrs.setIndexTextColor(Color.RED); + // contactUIConfig.itemClickListeners.put(2, (position, data) -> { + // ToastX.showShortToast("itemClickListeners:2"); + // }); + + // contactUIConfig.customLayout = + // new IContactViewLayout() { + // @Override + // public void customizeContactLayout(ContactLayout layout) { + // layout + // .getBodyLayout() + // + // .setBackgroundColor(context.getResources().getColor(R.color.color_a6adb6)); + // TextView textView = new TextView(context); + // textView.setText("this is contact"); + // layout.getBodyTopLayout().addView(textView); + // } + // }; + // ContactKitClient.setContactUIConfig(contactUIConfig); + } + + // 个性化配置会话列表页面 + public static void configConversation(Context context) { + ConversationUIConfig conversationUIConfig = new ConversationUIConfig(); + // conversationUIConfig.showTitleBarLeftIcon = false; + // conversationUIConfig.showTitleBarRight2Icon = false; + // conversationUIConfig.showTitleBarRightIcon = false; + // conversationUIConfig.showTitleBar = false; + // conversationUIConfig.titleBarLeftRes = R.drawable.ic_more_point; + // conversationUIConfig.titleBarRightRes = R.drawable.ic_more_point; + // conversationUIConfig.titleBarRight2Res = R.drawable.ic_more_point; + // conversationUIConfig.titleBarLeftClick = v -> { + // + // ToastX.showShortToast("titleBarLeftClick"); + // }; + // conversationUIConfig.titleBarRightClick = v -> { + // + // ToastX.showShortToast("titleBarRightClick"); + // }; + // conversationUIConfig.titleBarRight2Click = v -> { + // + // ToastX.showShortToast("titleBarRight2Click"); + // }; + + // conversationUIConfig.titleBarTitle = "会话列表"; + // conversationUIConfig.titleBarTitleColor = Color.GREEN; + // + // + // conversationUIConfig.itemTitleColor = Color.GREEN; + // conversationUIConfig.itemTitleSize = 42; + // conversationUIConfig.itemBackground = new ColorDrawable(Color.BLACK); + // conversationUIConfig.itemContentColor = Color.GREEN; + // conversationUIConfig.itemContentSize = 32; + // conversationUIConfig.itemDateColor = Color.GREEN; + // conversationUIConfig.itemDateSize = 32; + // conversationUIConfig.itemStickTopBackground = new ColorDrawable(Color.RED); + // conversationUIConfig.avatarCornerRadius = 30f; + + // conversationUIConfig.itemClickListener = + // new ItemClickListener() { + // @Override + // public boolean onClick(Context context, ConversationBean data, int position) { + // + // ToastX.showShortToast("onClick"); + // return false; + // } + // + // @Override + // public boolean onAvatarClick(Context context, ConversationBean data, int position) { + // ToastX.showShortToast("onAvatarClick"); + // return false; + // } + // + // @Override + // public boolean onLongClick(Context context, ConversationBean data, int position) { + // ToastX.showShortToast("onLongClick"); + // return false; + // } + // + // @Override + // public boolean onAvatarLongClick(Context context, ConversationBean data, int + // position) { + // ToastX.showShortToast("onAvatarLongClick"); + // return false; + // } + // }; + + // conversationUIConfig.conversationCustom = new ConversationCustom(){ + // @Override + // public String customContentText(Context context, ConversationInfo conversationInfo) + // { + // String test = super.customContentText(context,conversationInfo); + // return test+"test"; + // } + // }; + + // conversationUIConfig.customLayout = new IConversationViewLayout() { + // @Override + // public void customizeConversationLayout(ConversationBaseFragment fragment) { + // + // if (fragment instanceof ConversationFragment){ + // ConversationFragment conversationFragment = (ConversationFragment) fragment; + // TextView textView = new TextView(conversationFragment.getContext()); + // textView.setText("this is conversationFragment"); + // conversationFragment.getBodyTopLayout().addView(textView); + // }else if (fragment instanceof FunConversationFragment){ + // FunConversationFragment conversationFragment = (FunConversationFragment) + // fragment; + // TextView textView = new TextView(conversationFragment.getContext()); + // textView.setText("this is FunConversationFragment"); + // conversationFragment.getBodyTopLayout().addView(textView); + // } + // + // } + // }; + + ConversationKitClient.setConversationUIConfig(conversationUIConfig); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/IMApplication.java b/app/src/main/java/com/dskj/rbchat/IMApplication.java new file mode 100644 index 0000000..09e58bf --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/IMApplication.java @@ -0,0 +1,420 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat; + +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.PATH_FUN_TEAM_SETTING_PAGE; + +import android.app.Activity; +import android.app.NotificationManager; +import android.content.Context; +import android.content.Intent; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.os.Bundle; +import android.text.TextUtils; +import android.util.DisplayMetrics; +import android.util.Log; + +import com.dskj.rbchat.imkit.team.TeamAnnouncementActivity; +import com.dskj.rbchat.map.LocationPageActivity1; +import com.dskj.rbchat.utils.GsonUtils; +import com.netease.yunxin.kit.chatkit.model.IMMessageInfo; +import com.netease.yunxin.kit.chatkit.repo.ChatObserverRepo; +import com.netease.yunxin.kit.chatkit.ui.ChatKitUIConstant; +import com.netease.yunxin.kit.chatkit.ui.common.ChatDataUtils; +import com.netease.yunxin.kit.chatkit.ui.common.ChatUtils; +import com.netease.yunxin.kit.chatkit.ui.page.LocationPageActivity; +import com.netease.yunxin.kit.conversationkit.ui.fun.viewholder.EmojiManager; +import com.netease.yunxin.kit.corekit.im.model.EventObserver; +import com.scwang.smart.refresh.footer.ClassicsFooter; + +import androidx.annotation.Nullable; +import androidx.multidex.MultiDexApplication; + +import com.blankj.utilcode.util.LanguageUtils; +import com.dskj.rbchat.contact.ContactGroupSettingActivity; +import com.dskj.rbchat.contact.FunBlackListActivity; +import com.dskj.rbchat.imkit.person.PersonSettingActivity; +import com.dskj.rbchat.imkit.selector.FunContactSelectorActivity; +import com.dskj.rbchat.imkit.team.TeamSettingActivity; +import com.dskj.rbchat.main.MainActivity; +import com.dskj.rbchat.main.mine.MineInfoActivity; +import com.dskj.rbchat.contact.UserInfoActivity; +import com.dskj.rbchat.model.AlbumBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.push.PushMessageHandler; +import com.dskj.rbchat.utils.Constant; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.voom.TiktoInfokActivity; +import com.dskj.rbchat.welcome.WelcomeActivity; +import com.heytap.msp.push.HeytapPushManager; +import com.huawei.hms.support.common.ActivityMgr; +import com.iflytek.sparkchain.core.LLM; +import com.iflytek.sparkchain.core.LLMConfig; +import com.iflytek.sparkchain.core.Memory; +import com.iflytek.sparkchain.core.SparkChain; +import com.iflytek.sparkchain.core.SparkChainConfig; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.SDKOptions; +import com.netease.nimlib.sdk.auth.LoginInfo; +import com.netease.yunxin.kit.alog.ALog; +import com.netease.yunxin.kit.chatkit.ui.common.RxBus; +import com.netease.yunxin.kit.chatkit.ui.custom.StickerAttachment; +import com.netease.yunxin.kit.chatkit.ui.fun.page.FunChatSettingActivity; +import com.netease.yunxin.kit.chatkit.ui.model.RxBusToVoom; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.contactkit.ui.ContactConstant; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.repo.SettingRepo; +import com.netease.yunxin.kit.corekit.im.utils.IMKitUtils; +import com.netease.yunxin.kit.corekit.im.utils.RouterConstant; +import com.netease.yunxin.kit.corekit.route.XKitRouter; +import com.netease.yunxin.kit.locationkit.LocationKitClient; +import com.tencent.bugly.crashreport.CrashReport; +import com.vivo.push.PushClient; +import com.vivo.push.util.VivoPushException; + +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +import cn.jiguang.api.JCoreInterface; +import cn.jiguang.api.utils.JCollectionAuth; +import cn.jpush.android.api.JPushInterface; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class IMApplication extends MultiDexApplication { + private static final String TAG = "IMApplication"; + private static boolean coldStart = false; + private static int foregroundActCount = 0; + public static final int LOGIN_PARENT_SCOPE = 2; + public static final int LOGIN_SCOPE = 7; + public static IMApplication AppContext; + public LLM llm; + public static String schemeUserId = null; + public static String schemeTeamId = null; + public static String schemeSilverQrCode = null; + + public static IMApplication getInstance() { + return AppContext; + } + + @Override + public void onCreate() { + super.onCreate(); + ALog.d(Constant.PROJECT_TAG, TAG, "onCreate"); + //app init + registerActivityLifeCycle(); +// AppCrashHandler.getInstance().initCrashHandler(this); +// Thread.setDefaultUncaughtExceptionHandler(AppCrashHandler.getInstance()); + AppContext = this; + initUIKit(); + // temp register for mine + registerRouter(); + CrashReport.initCrashReport(getApplicationContext(), "29ecb7c2d2", true); + initLang(); + initAiSDK(); + JPushInterface.setDebugMode(BuildConfig.DEBUG); + JPushInterface.init(this); +// JCoreInterface.testCountryCode(this, "us"); +// String id = JPushInterface.getRegistrationID(this); +// LogUtils.d("id===" + id); + JCollectionAuth.setAuth(this, true); //如初始化被拦截过,将重试初始化过程 + RxBus.getInstance().toObservable(RxBusToVoom.class) + .subscribeOn(rx.schedulers.Schedulers.io()) + .unsubscribeOn(rx.schedulers.Schedulers.io()) + .subscribe(changeImageViewBean -> {//回顶部 + getPostInfo(changeImageViewBean); + }); + + initFooter(); + EmojiManager.init(this); + } + + public void initFooter() { + ClassicsFooter.REFRESH_FOOTER_PULLING = getResources().getString(R.string.srl_footer_pulling);//"上拉加载更多"; + ClassicsFooter.REFRESH_FOOTER_RELEASE = getResources().getString(R.string.srl_footer_release);//"释放立即加载"; + ClassicsFooter.REFRESH_FOOTER_LOADING = getResources().getString(R.string.srl_footer_loading);//"正在刷新..."; + ClassicsFooter.REFRESH_FOOTER_REFRESHING = getResources().getString(R.string.srl_footer_refreshing);//"正在加载..."; + ClassicsFooter.REFRESH_FOOTER_FINISH = getResources().getString(R.string.srl_footer_finish);//"加载完成"; + ClassicsFooter.REFRESH_FOOTER_FAILED = getResources().getString(R.string.srl_footer_failed);//"加载失败"; + ClassicsFooter.REFRESH_FOOTER_NOTHING = getResources().getString(R.string.srl_footer_nothing);//"全部加载完成"; + } + + + private void getPostInfo(RxBusToVoom attachment) { + Api.getInstance().postsInfo(attachment.getPostId()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + AlbumBean albumBean = feedbackResp.data; + Intent intent = new Intent(getAppContext(), TiktoInfokActivity.class); + intent.putExtra("bean", albumBean); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + getAppContext().startActivity(intent); + + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast(msg); + + } + }); + } + + + public void registerRouter() { + XKitRouter.registerRouter(RouterConstant.PATH_MINE_INFO_PAGE, MineInfoActivity.class); + XKitRouter.registerRouter( + RouterConstant.PATH_CONTACT_SELECTOR_PAGE, FunContactSelectorActivity.class); + XKitRouter.registerRouter( + RouterConstant.PATH_FUN_CONTACT_SELECTOR_PAGE, FunContactSelectorActivity.class); + // XKitRouter.registerRouter(RouterConstant.PATH_ADD_FRIEND_PAGE, FunAddFriendActivity.class); +// XKitRouter.registerRouter(RouterConstant.PATH_FUN_ADD_FRIEND_PAGE, FunAddFriendActivity.class); + XKitRouter.registerRouter(RouterConstant.PATH_FUN_USER_INFO_PAGE, UserInfoActivity.class); + XKitRouter.registerRouter(RouterConstant.PATH_USER_INFO_PAGE, UserInfoActivity.class); + XKitRouter.registerRouter(ContactConstant.PATH_FUN_CREATE_GROUP_PAGE, ContactGroupSettingActivity.class); +// XKitRouter.registerRouter(PATH_FUN_TEAM_SETTING_PAGE, FunTeamSettingActivity.class); + XKitRouter.registerRouter(RouterConstant.PATH_FUN_TEAM_SETTING_PAGE, TeamSettingActivity.class); + XKitRouter.registerRouter(ChatKitUIConstant.PATH_FUN_TEAM_ANNOUNCEMENT_PAGE, TeamAnnouncementActivity.class); + XKitRouter.registerRouter(RouterConstant.PATH_FUN_CHAT_SETTING_PAGE, PersonSettingActivity.class); + // XKitRouter.registerRouter(RouterConstant.PATH_CHAT_SETTING_PAGE, FunChatSettingActivity.class); + + XKitRouter.registerRouter(RouterConstant.PATH_FUN_MY_BLACK_PAGE, FunBlackListActivity.class); + XKitRouter.registerRouter(RouterConstant.PATH_CHAT_LOCATION_PAGE, LocationPageActivity1.class); + XKitRouter.registerRouter("locationPage", LocationPageActivity.class); + + } + + public void initAiSDK() { + // 初始化SDK,Appid等信息在清单中配置 + SparkChainConfig sparkChainConfig = SparkChainConfig.builder(); + sparkChainConfig.appID(IMUIKitConfig.AI_APPID) + .apiKey(IMUIKitConfig.AI_APIKEY) + .apiSecret(IMUIKitConfig.AI_APISECRET)//应用申请的appid三元组 + .logLevel(0); + int ret = SparkChain.getInst().init(getApplicationContext(), sparkChainConfig); + if (ret == 0) { + Log.d(TAG, "SDK初始化成功:" + ret); + LLMConfig llmConfig = LLMConfig.builder(); + llmConfig.domain("generalv3"); +// llmConfig.url("ws(s)://spark-api.xf-yun.com/v3.1/chat"); + //memory有两种,windows_memory和tokens_memory,二选一即可 + Memory window_memory = Memory.windowMemory(5); + llm = new LLM(llmConfig, window_memory); +// Memory tokens_memory = Memory.tokenMemory(8192); +// llm = new LLM(llmConfig,tokens_memory); + + + } + + } + + + private void initLang() { + if (DataUtils.get(getAppContext(), "locale", -1) == -1) {//如果一次都没有设置,则需要默认设置一次,以便Activity中生效 +// PreferencesToolkits.getNew(getAppContext(),"locale",0); + if (Locale.getDefault().getCountry().equals(Locale.CHINA.getCountry())) { + DataUtils.set(getAppContext(), "locale", 1); + } else if (Locale.getDefault().equals(Locale.ENGLISH)) { + DataUtils.set(getAppContext(), "locale", 2); + } else if (Locale.getDefault().equals(Locale.JAPANESE)) { + DataUtils.set(getAppContext(), "locale", 3); + } else { + DataUtils.set(getAppContext(), "locale", 0); + } + + } + int loc = DataUtils.get(getAppContext(), "locale", 3); + ChatDataUtils.set(getAppContext(), "locale", loc); + + LogUtils.i("下标:" + loc); + switch (loc) { + case 0: + LanguageUtils.updateAppContextLanguage(Locale.TRADITIONAL_CHINESE, null); + applyLanguage(Resources.getSystem(), Locale.TRADITIONAL_CHINESE); + //修复StringUtils获取string的语言 + applyLanguage(this.getResources(), Locale.TRADITIONAL_CHINESE); + break; + + case 1: + LanguageUtils.updateAppContextLanguage(Locale.CHINESE, null); + applyLanguage(Resources.getSystem(), Locale.CHINESE); + //修复StringUtils获取string的语言 + applyLanguage(this.getResources(), Locale.CHINESE); + break; + + case 2: + LanguageUtils.updateAppContextLanguage(Locale.ENGLISH, null); + applyLanguage(Resources.getSystem(), Locale.ENGLISH); + //修复StringUtils获取string的语言 + applyLanguage(this.getResources(), Locale.ENGLISH); + break; + + case 3: + LanguageUtils.updateAppContextLanguage(Locale.JAPANESE, null); + applyLanguage(Resources.getSystem(), Locale.JAPANESE); + //修复StringUtils获取string的语言 + applyLanguage(this.getResources(), Locale.JAPANESE); + //修复StringUtils获取string的语言 + break; + + + } + + + } + + + //设置当前语言 + public static void applyLanguage(Resources resources, Locale locale) { + Locale.setDefault(locale); + Configuration config = resources.getConfiguration(); + DisplayMetrics dm = resources.getDisplayMetrics(); + config.locale = locale; + resources.updateConfiguration(config, dm); + } + + private void initUIKit() { + SDKOptions options = NimSDKOptionConfig.getSDKOptions(this, DataUtils.readAppKey(this)); + IMKitClient.init(this, null, options); + ALog.d(Constant.PROJECT_TAG, TAG, "initUIKit"); + + if (IMKitUtils.isMainProcess(this)) { + ALog.d(Constant.PROJECT_TAG, TAG, "initUIKit:isMainProcess"); + LocationKitClient.init(this); + //huawei push + ActivityMgr.INST.init(this); + //oppo push + HeytapPushManager.init(this, true); + try { + //vivo push + PushClient.getInstance(this).initialize(); + } catch (VivoPushException e) { + e.printStackTrace(); + } + IMKitClient.toggleNotification(SettingRepo.isPushNotify()); + IMKitClient.registerMixPushMessageHandler(new PushMessageHandler()); + SettingRepo.setShowReadStatus(false); + IMKitClient.getStatus(); + } + } + + + // 如果返回值为 null,则全部使用默认参数。 + private SDKOptions options() { + SDKOptions options = new SDKOptions(); + //此处仅设置appkey,其他设置请自行参看信令文档设置 :https://dev.yunxin.163.com/docs/product/信令/SDK开发集成/Android开发集成/初始化 + options.appKey = "4cb6b0998f9e7af9d7673963e429959a"; + return options; + } + + + public static Context getAppContext() { + return AppContext; + } + + public final List activities = new ArrayList<>(); + + //用于系统杀死应用之后,系统恢复应用,可能存在没有登录的异常 + //此处如果在没有登录的情况下,其他页面打开的时候进行finish();除了MainActivity + //MainActivity启动进行登录检测,如果没有登录进行登录操作 + private void registerActivityLifeCycle() { + registerActivityLifecycleCallbacks( + new ActivityLifecycleCallbacks() { + @Override + public void onActivityCreated(Activity activity, Bundle savedInstanceState) { + if (TextUtils.isEmpty(IMKitClient.account()) + && !(activity instanceof MainActivity || activity instanceof WelcomeActivity) + && !coldStart) { + activity.finish(); + } else { + activities.add(activity); + } + } + + @Override + public void onActivityStarted(Activity activity) { + foregroundActCount++; + closeNotify(); + } + + @Override + public void onActivityResumed(Activity activity) { + } + + @Override + public void onActivityPaused(Activity activity) { + } + + @Override + public void onActivityStopped(Activity activity) { + foregroundActCount--; + } + + @Override + public void onActivitySaveInstanceState(Activity activity, Bundle outState) { + } + + @Override + public void onActivityDestroyed(Activity activity) { + if (activities.isEmpty()) { + return; + } + activities.remove(activity); + } + }); + } + + public void removeAllActivity() { + while (activities.size() > 0) { + try { + activities.get(activities.size() - 1).finish(); + activities.remove(activities.size() - 1); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + private void closeNotify() { + NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); + manager.cancelAll(); + } + + public void clearActivity(Activity exclude) { + for (int i = 0; i < activities.size(); i++) { + if (activities.get(i) != null && activities.get(i) != exclude) { + activities.get(i).finish(); + } + } + } + + public static void setColdStart(boolean value) { + coldStart = value; + } + + @Override + public void onTerminate() { + super.onTerminate(); + SparkChain.getInst().unInit(); + + foregroundActCount = 0; + } + + + public static int getForegroundActCount() { + return foregroundActCount; + } + + +} diff --git a/app/src/main/java/com/dskj/rbchat/IMUIKitConfig.java b/app/src/main/java/com/dskj/rbchat/IMUIKitConfig.java new file mode 100644 index 0000000..9ad9a0b --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/IMUIKitConfig.java @@ -0,0 +1,172 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. +package com.dskj.rbchat; + + +import com.netease.yunxin.kit.chatkit.ui.network.ApiService; + +public class IMUIKitConfig { + public static String WECHAT_APPID = "wx32763c513be885ba"; + + public static String WECHAT_SECRET = "e108b4515db1bf351aeb16cade35e668"; + + public static String LOGIN_ACCOUNT = "login_account"; + public static String LOGIN_TOKEN = "login_token"; + + public static String LOC_COUNTRY_CODE = "loc_country_code"; + + public static String RBCHAT_PRIVACY_CN_URL = "https://api.letschat2023.com/web/userAgreement.html?v=" + System.currentTimeMillis(); + public static String RBCHAT_SERVICE_CN_URL = "https://api.letschat2023.com/web/serviceAgreement.html?v=" + System.currentTimeMillis(); //服务协议 + + public static String MIANMI_AGREEMENT_CN_URL = "https://api.letschat2023.com/web/nopwdAgreement.html?v=" + System.currentTimeMillis(); //免密协议 + + public static String SUBSTATIONID = ApiService.SUBSTATIONID; + + public static int MOMENTS_SOURCE_TIME = 1000 * 60; + + // public static String AVATAR_DOWNLOAD_CONTROLLER_URL_ROOT = ApiService.URL + "static/avatar/%s"; + // public static String AVATAR_DOWNLOAD_CONTROLLER_URL_ROOT = "http://192.168.110.233:8000/"+"static/avatar/%s"; + + public static int PUSH_CIR_SUCC = 567; + + public static String OSS_DOWNLOAD_URL = "http://pic.qtalk666.top/"; + + + /** + * 支付地址 + */ + public static String ONLINE_PAYMENT_URL = ApiService.URL.equals("https://api.letschat2023.com/") ? "https://admin.letschat2023.com/#/appPay" : "https://admin-test.letschat2023.com/#/appPay"; +// public static String ONLINE_PAYMENT_URL = "https://admin.letschat2023.com/#/appPay"; + + /** + * 分享落地页行动码地址 + */ +// public static String SHARE_INVCODE = "http://qtalk666.top/#/download?code=%s"; + public static String SHARE_INVCODE = "https://admin.letschat2023.com/#/downLoad?code=%s&userId=%s"; + public static String SHARE_INVCODEGROUP = "https://admin.letschat2023.com/#/downLoad?code=%s&teamId=%s"; + public static String SHARE_INVCODEGROUP1 = "https://admin.letschat2023.com/#/downLoad?teamId=%s"; + + public static String SHARE_INVCODE1 = "https://admin.letschat2023.com/#/downLoad?userId=%s"; + public static String SHARE_INVCODE_START = "https://admin.letschat2023.com/#/downLoad"; + + /*** + * 分享用户ID 行动码 + */ +// public static String SHARE_ADD_USER = "time_go_chat://add_user/%s"; + + /*** + * 分享用户ID 行动码 + */ + public static String SHARE_ADD_USER = SHARE_INVCODE; + + /** + * 分享群ID 行动码 + */ + public static String SHARE_JOIN_GROUP = "time_go_chat://join_group/%s"; + + + /** + * 收款码 + */ + public static String SHARE_USER_PAYMENT_CODE = "time_go_chat://payment_code/%s"; + + + /** + * 储币机兑币 + */ + public static String SHARE_ATM_SAVE_CODE = "time_go_chat://payment_atm/%s"; + + + public static String bucketName = "letschat";//shenqi777 + + public static String OSS_URL = "https://" + bucketName + ".oss-cn-hongkong.aliyuncs.com/"; + + public static String AVATAR_DOWNLOAD_CONTROLLER_URL_ROOT = OSS_URL + "%s"; + + + public static String AI_APPID = "6934a910"; + public static String AI_APIKEY = "003b77140ae26da0eaa9eea60ec15845"; + public static String AI_APISECRET = "NmYxNjBmMjM5MzMwOTM1NGM0NjNmNGE1"; + + /** + * 刷新关注列表 + */ + public static Integer CHANGE_FOLLOW_USER = 7659; + + /** + * 关注列表的标记位 + */ + public static String FOLLOW_USER_TAG = "follow_user_tag"; + + /** + * 单个红包最高金额 + */ + public static int SINGLE_MAX_MONEY = 200; + + /** + * 群红包最高金额 + */ + public static int GROUP_MAX_MONEY = 200; + + + /*** + * 朋友圈消息的起始时间 + * + */ + public static long VOOM_MESSAGE_START_TIME = 1698818011000l; + + /** + * 商城推送消息起始时间 + */ + public static long NOTIFY_MESSAGE_START_TIME = 1714492800000l; + + + /** + * 娃娃机地址 + */ +// public static String WAWAJ_PATH =ApiService.URL.equals("https://api.letschat2023.com/")?"https://toy.letschat2023.com/#/?authorizeCode=":"http://toy.newsclub666.com/#/?authorizeCode="; + public static String WAWAJ_PATH = ApiService.URL.equals("https://api.letschat2023.com/") ? "https://toy.letschat2023.com/#/" : "https://toy-test.letschat2023.com/#/"; + + /** + * 银币商城 + */ +// public static String YINBI_PATH_LOC ="http://192.168.8.52:8080/#/?authorizeCode="; +// public static String YINBI_PATH_LOC = "http://192.168.8.239:8080/#/"; + public static String YINBI_PATH_LOC = "http://192.168.8.175:8080/#/"; + + public static String YINBI_PATH_LOC1 = "http://192.168.8.200:8080/#/"; + + /** + * 银币商城 + */ + public static String YINBI_PATH = ApiService.URL.equals("https://api.letschat2023.com/") ? "https://shop.letschat2023.com/#/" : "http://8.218.226.64:2396/"; + + + /** + * 商户管理 + */ + public static String MERCHANT_URL = ApiService.URL.equals("https://api.letschat2023.com/") ? "https://biz.letschat2023.com/#/pages/owner/index" : "https://biz-test.letschat2023.com/#/pages/owner/index"; + + /** + * 商户 用户 + */ + public static String MERCHANT_USER_URL = ApiService.URL.equals("https://api.letschat2023.com/") ? "https://biz.letschat2023.com/#/" : "https://biz-test.letschat2023.com/#/"; + + /** + * 兑换积分 + */ + public static String SILVER_URL = ApiService.URL.equals("https://api.letschat2023.com/") ? "https://shop.letschat2023.com/#/pages/scanexchange/index?tagCode=" : "http://8.218.226.64:2396/#/pages/scanexchange/index?tagCode="; + + /** + * 客服列表ids + */ + public static String SERVICES_IDS_TAG = "services_id"; + public static String RING_MESSAGE_TAG = "message_rings"; + public static String RING_CALL_TAG = "call_rings"; + + /** + * GoogleMap apikey + */ + public static final String API_KEY = "AIzaSyB7P1o1EIA02eWoNP_7QJ9XwWe3WkSZb9k"; +} diff --git a/app/src/main/java/com/dskj/rbchat/NimSDKOptionConfig.java b/app/src/main/java/com/dskj/rbchat/NimSDKOptionConfig.java new file mode 100644 index 0000000..0d7da70 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/NimSDKOptionConfig.java @@ -0,0 +1,241 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat; + +import android.app.Notification; +import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.content.ContentResolver; +import android.content.Context; +import android.graphics.Color; +import android.net.Uri; +import android.os.Build; +import android.os.Environment; +import android.text.TextUtils; + +import com.dskj.rbchat.main.MainActivity; +import com.dskj.rbchat.push.PushUserInfoProvider; +import com.dskj.rbchat.utils.Constant; +import com.dskj.rbchat.utils.DataUtils; +import com.netease.nimlib.sdk.NotificationFoldStyle; +import com.netease.nimlib.sdk.SDKOptions; +import com.netease.nimlib.sdk.ServerAddresses; +import com.netease.nimlib.sdk.StatusBarNotificationConfig; +import com.netease.nimlib.sdk.StatusBarNotificationFilter; +import com.netease.nimlib.sdk.mixpush.MixPushConfig; +import com.netease.yunxin.kit.alog.ALog; +import com.netease.yunxin.kit.common.utils.ScreenUtils; + +import java.io.IOException; + +/** + * Nim SDK config info + */ +public class NimSDKOptionConfig { + + public static final String NOTIFY_SOUND_KEY = + "android.resource://com.dskj.rbchat/raw/xxmoren"; + public static final int LED_ON_MS = 1000; + public static final int LED_OFF_MS = 1500; + + static SDKOptions getSDKOptions(Context context, String appKey) { + SDKOptions options = new SDKOptions(); + options.appKey = appKey; + initStatusBarNotificationConfig(options); + options.sdkStorageRootPath = getAppCacheDir(context); + options.preloadAttach = true; + options.thumbnailSize = (int) (222.0 / 375.0 * ScreenUtils.getDisplayWidth()); + options.userInfoProvider = new PushUserInfoProvider(context); + options.sessionReadAck = true; + options.animatedImageThumbnailEnabled = true; + options.asyncInitSDK = true; + options.reducedIM = false; + options.checkManifestConfig = false; + options.enableTeamMsgAck = true; + options.enableFcs = false; + options.shouldConsiderRevokedMessageUnreadCount = true; + // 会话置顶是否漫游 + options.notifyStickTopSession = true; + options.mixPushConfig = buildMixPushConfig(); + options.serverConfig = configServer(context); + // 打开消息撤回未读数-1的开关 + options.shouldConsiderRevokedMessageUnreadCount = true; + return options; + } + + public static ServerAddresses configServer(Context context) { + + if (DataUtils.getServerConfigType(context) == Constant.OVERSEA_CONFIG) { + ServerAddresses serverAddresses = new ServerAddresses(); + serverAddresses.lbs = "https://lbs.netease.im/lbs/conf.jsp"; + serverAddresses.nosUploadLbs = "http://wannos.127.net/lbs"; + serverAddresses.nosUploadDefaultLink = "https://nosup-hz1.127.net"; + serverAddresses.nosDownloadUrlFormat = "{bucket}-nosdn.netease.im/{object}"; + serverAddresses.nosUpload = "nosup-hz1.127.net"; + serverAddresses.nosSupportHttps = true; + ALog.d("ServerAddresses", "ServerConfig:use Singapore node"); + return serverAddresses; + } + return null; + } + + public static void initStatusBarNotificationConfig(SDKOptions options) { + // load notification +// StatusBarNotificationConfig config = loadStatusBarNotificationConfig(); +// // load 用户的 StatusBarNotificationConfig 设置项 +// // SDK statusBarNotificationConfig 生效 +//// config.notificationFilter = +//// imMessage -> +//// IMApplication.getForegroundActCount() > 0 +//// ? StatusBarNotificationFilter.FilterPolicy.DENY +//// : StatusBarNotificationFilter.FilterPolicy.DEFAULT; +// options.statusBarNotificationConfig = config; + + + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + NotificationManager notificationManager = (NotificationManager) IMApplication.getAppContext().getSystemService(Context.NOTIFICATION_SERVICE); + + NotificationChannel morenchanel = new NotificationChannel("xxmoren", IMApplication.getAppContext().getString(R.string.bell_default), NotificationManager.IMPORTANCE_DEFAULT); + // morenchanel.setDescription("默认默认"); + morenchanel.enableLights(true); + morenchanel.enableVibration(true); + morenchanel.setSound(Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + IMApplication.getAppContext().getPackageName() + "/raw/" + R.raw.xxmoren), + Notification.AUDIO_ATTRIBUTES_DEFAULT); + notificationManager.createNotificationChannel(morenchanel); + + + NotificationChannel daqichanel = new NotificationChannel("xxdaqi", IMApplication.getAppContext().getString(R.string.bell_generous), NotificationManager.IMPORTANCE_DEFAULT); + // daqichanel.setDescription("大气大气"); + daqichanel.enableLights(true); + daqichanel.enableVibration(true); + daqichanel.setSound(Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + IMApplication.getAppContext().getPackageName() + "/raw/" + R.raw.xxdaqi), + Notification.AUDIO_ATTRIBUTES_DEFAULT); + notificationManager.createNotificationChannel(daqichanel); + + + NotificationChannel huopochanel = new NotificationChannel("xxhuopo", IMApplication.getAppContext().getString(R.string.bell_lively), NotificationManager.IMPORTANCE_DEFAULT); + // huopochanel.setDescription("活泼活泼"); + huopochanel.enableLights(true); + huopochanel.enableVibration(true); + huopochanel.setSound(Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + IMApplication.getAppContext().getPackageName() + "/raw/" + R.raw.xxhuopo), + Notification.AUDIO_ATTRIBUTES_DEFAULT); + notificationManager.createNotificationChannel(huopochanel); + + NotificationChannel jianduanchanel = new NotificationChannel("xxjianduan", IMApplication.getAppContext().getString(R.string.bell_brief), NotificationManager.IMPORTANCE_DEFAULT); + // huopochanel.setDescription("活泼活泼"); + jianduanchanel.enableLights(true); + jianduanchanel.enableVibration(true); + jianduanchanel.setSound(Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + IMApplication.getAppContext().getPackageName() + "/raw/" + R.raw.xxjianduan), + Notification.AUDIO_ATTRIBUTES_DEFAULT); + notificationManager.createNotificationChannel(jianduanchanel); + + + NotificationChannel keaichanel = new NotificationChannel("xxkeai", IMApplication.getAppContext().getString(R.string.bell_loveliness), NotificationManager.IMPORTANCE_DEFAULT); + // huopochanel.setDescription("活泼活泼"); + keaichanel.enableLights(true); + keaichanel.enableVibration(true); + keaichanel.setSound(Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + IMApplication.getAppContext().getPackageName() + "/raw/" + R.raw.xxkeai), + Notification.AUDIO_ATTRIBUTES_DEFAULT); + notificationManager.createNotificationChannel(keaichanel); + + + NotificationChannel liushuichanel = new NotificationChannel("xxliushui", IMApplication.getAppContext().getString(R.string.bell_flowingwater), NotificationManager.IMPORTANCE_DEFAULT); + // huopochanel.setDescription("活泼活泼"); + liushuichanel.enableLights(true); + liushuichanel.enableVibration(true); + liushuichanel.setSound(Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + IMApplication.getAppContext().getPackageName() + "/raw/" + R.raw.xxliushui), + Notification.AUDIO_ATTRIBUTES_DEFAULT); + notificationManager.createNotificationChannel(liushuichanel); + + NotificationChannel qingcuichanel = new NotificationChannel("xxqingcui", IMApplication.getAppContext().getString(R.string.bell_clear), NotificationManager.IMPORTANCE_DEFAULT); + qingcuichanel.enableLights(true); + qingcuichanel.enableVibration(true); + qingcuichanel.setSound(Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + IMApplication.getAppContext().getPackageName() + "/raw/" + R.raw.xxqingcui), + Notification.AUDIO_ATTRIBUTES_DEFAULT); + notificationManager.createNotificationChannel(qingcuichanel); + + NotificationChannel qingkuaichanel = new NotificationChannel("xxqingkuai", IMApplication.getAppContext().getString(R.string.bell_brisk), NotificationManager.IMPORTANCE_DEFAULT); + qingkuaichanel.enableLights(true); + qingkuaichanel.enableVibration(true); + qingkuaichanel.setSound(Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + IMApplication.getAppContext().getPackageName() + "/raw/" + R.raw.xxqingkuai), + Notification.AUDIO_ATTRIBUTES_DEFAULT); + notificationManager.createNotificationChannel(qingkuaichanel); + + NotificationChannel quweichanel = new NotificationChannel("xxquwei", IMApplication.getAppContext().getString(R.string.bell_interest), NotificationManager.IMPORTANCE_DEFAULT); + quweichanel.enableLights(true); + quweichanel.enableVibration(true); + quweichanel.setSound(Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + IMApplication.getAppContext().getPackageName() + "/raw/" + R.raw.xxquwei), + Notification.AUDIO_ATTRIBUTES_DEFAULT); + notificationManager.createNotificationChannel(quweichanel); + + } + + } + + // config StatusBarNotificationConfig + public static StatusBarNotificationConfig loadStatusBarNotificationConfig() { + StatusBarNotificationConfig config = new StatusBarNotificationConfig(); + config.notificationEntrance = MainActivity.class; + config.notificationSmallIconId = R.mipmap.ic_launcher; + config.notificationColor = Color.parseColor("#3a9efb"); + config.notificationSound = null; + config.notificationFoldStyle = NotificationFoldStyle.ALL; + config.downTimeEnableNotification = true; + config.ledARGB = Color.GREEN; + config.ledOnMs = LED_ON_MS; + config.ledOffMs = LED_OFF_MS; + config.showBadge = true; + return config; + } + + /** + * config app image/voice/file/log directory + */ + static String getAppCacheDir(Context context) { + String storageRootPath = null; + try { + if (context.getExternalCacheDir() != null) { + storageRootPath = context.getExternalCacheDir().getCanonicalPath(); + } + } catch (IOException e) { + e.printStackTrace(); + } + if (TextUtils.isEmpty(storageRootPath)) { + storageRootPath = Environment.getExternalStorageDirectory() + "/" + context.getPackageName(); + } + return storageRootPath; + } + + private static MixPushConfig buildMixPushConfig() { + MixPushConfig config = new MixPushConfig(); + // xiaomi +// config.xmAppId = "xiao mi push app id"; //apply in xiaomi +// config.xmAppKey = "xiao mi push app key";//apply in xiaomi +// config.xmCertificateName = "Certificate Name";//config in yunxin platform + + // huawei +// config.hwAppId = "huawei app id";//apply in huawei +// config.hwCertificateName = "Certificate Name";//config in yunxin platform + + // meizu +// config.mzAppId = "meizu push app id";//apply in meizu +// config.mzAppKey = "meizu push app key";//apply in meizu +// config.mzCertificateName = "Certificate Name";//config in yunxin platform + + // fcm + config.fcmCertificateName = "DEMO_FCM_PUSH"; + + // vivo +// config.vivoCertificateName = "Certificate Name";//config in yunxin platform + + // oppo +// config.oppoAppId = "oppo push app id";//apply in oppo +// config.oppoAppKey = "oppo push app key";//apply in oppo +// config.oppoAppSercet = "oppo push app secret"; //apply in oppo +// config.oppoCertificateName = "Certificate Name";//config in yunxin platform + return config; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/about/AboutActivity.java b/app/src/main/java/com/dskj/rbchat/about/AboutActivity.java new file mode 100644 index 0000000..8f6a4d3 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/about/AboutActivity.java @@ -0,0 +1,35 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.about; + +import android.os.Bundle; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.view.SupportMenuInflater; + +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.ActivityAboutBinding; +import com.dskj.rbchat.utils.AppUtils; +import com.netease.yunxin.kit.common.ui.activities.BrowseActivity; + +public class AboutActivity extends AppCompatActivity { + + private ActivityAboutBinding viewBinding; + private final String productUrl = "https://netease.im/m/"; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + viewBinding = ActivityAboutBinding.inflate(getLayoutInflater()); + setContentView(viewBinding.getRoot()); + viewBinding.flProduct.setOnClickListener( + v -> + BrowseActivity.Companion.launch( + AboutActivity.this, getString(R.string.mine_about), productUrl)); + viewBinding.tvVersion.setText(AppUtils.getAppVersionName(this)); + viewBinding.aboutTitleBar.setOnBackIconClickListener(v -> onBackPressed()); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/adapter/CommonAdapter.java b/app/src/main/java/com/dskj/rbchat/adapter/CommonAdapter.java new file mode 100644 index 0000000..7b2e427 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/adapter/CommonAdapter.java @@ -0,0 +1,117 @@ +package com.dskj.rbchat.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + + +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.ItemDragTouchHelper; +import com.dskj.rbchat.utils.LogUtils; + +import java.util.List; + +/** + * 通用列表适配器 + * @param + */ +public abstract class CommonAdapter extends RecyclerView.Adapter implements ItemDragTouchHelper { + + @Override + public void onItemMove(RecyclerView.ViewHolder source, RecyclerView.ViewHolder target) { + int fromPosition = source.getBindingAdapterPosition(); + int toPosition = target.getBindingAdapterPosition(); + if(mDatas.get(mDatas.size()-1).equals("add")){ + if (fromPosition < mDatas.size()-1 && toPosition < mDatas.size()-1) { + T date = mDatas.get(fromPosition); + mDatas.remove(date); + mDatas.add(toPosition,date); +// Collections.swap(mDatas, fromPosition, toPosition); + notifyItemMoved(fromPosition, toPosition); + } + }else{ + if (fromPosition < mDatas.size() && toPosition < mDatas.size()) { +// Collections.swap(mDatas, fromPosition, toPosition); + T date = mDatas.get(fromPosition); + mDatas.remove(date); + mDatas.add(toPosition,date); + notifyItemMoved(fromPosition, toPosition); + } + } + LogUtils.i("数据结构:"+ GsonUtils.beanToJSONString(mDatas)); + onItemClear(source); + } + + @Override + public void onItemSelect(RecyclerView.ViewHolder source) { + source.itemView.setScaleX(1.2f); + source.itemView.setScaleY(1.2f); + } + + + + @Override + public void onItemClear(RecyclerView.ViewHolder source) { + source.itemView.setScaleX(1.0f); + source.itemView.setScaleY(1.0f); + } + + protected Context mContext; + protected int mLayoutId; + protected List mDatas; + protected LayoutInflater mInflater; + + ViewHolder viewHolder; + + + public CommonAdapter(Context context, int layoutId, List datas) { + mContext = context; + mInflater = LayoutInflater.from(context); + mLayoutId = layoutId; + mDatas = datas; + } + public void setDates(List dates){ + this.mDatas=dates; + notifyDataSetChanged(); + } + public void addDates(List dates){ + this.mDatas.addAll(dates); + notifyDataSetChanged(); + } + + //局部刷新 + public void addItems(int size, T datas) { + this.mDatas.add(datas); + notifyItemChanged(size, datas); + } + + + public List getDates(){ + return this.mDatas; + } + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + viewHolder = ViewHolder.get(mContext, parent, mLayoutId); + return viewHolder; + } + + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + + convert(holder, mDatas.get(position),position); + } + + public abstract void convert(ViewHolder holder, T t,int index); + + + @Override + public int getItemCount() { + return mDatas.size(); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/adapter/ViewHolder.java b/app/src/main/java/com/dskj/rbchat/adapter/ViewHolder.java new file mode 100644 index 0000000..f6d13b7 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/adapter/ViewHolder.java @@ -0,0 +1,60 @@ +package com.dskj.rbchat.adapter; + +import android.content.Context; +import android.util.SparseArray; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.recyclerview.widget.RecyclerView; + +/** + * 通用列表ViewHolder + */ +public class ViewHolder extends RecyclerView.ViewHolder { + + private SparseArray mViews; + private View mConvertView; + private Context mContext; + + public ViewHolder(Context context, View itemView, ViewGroup parent) { + super(itemView); + mContext = context; + mConvertView = itemView; + mViews = new SparseArray(); + } + + public static ViewHolder get(Context context, ViewGroup parent, int layoutId) { + + View itemView = LayoutInflater.from(context).inflate(layoutId, parent, + false); + ViewHolder holder = new ViewHolder(context, itemView, parent); + return holder; + } + + + 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 ViewHolder setText(int viewId, String text) + { + TextView tv = getView(viewId); + tv.setText(text); + return this; + } + + public ViewHolder setOnClickListener(int viewId, View.OnClickListener listener) { + View view = getView(viewId); + view.setOnClickListener(listener); + return this; + } + +} diff --git a/app/src/main/java/com/dskj/rbchat/base/LllChatBaseActivity.java b/app/src/main/java/com/dskj/rbchat/base/LllChatBaseActivity.java new file mode 100644 index 0000000..524ddb3 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/base/LllChatBaseActivity.java @@ -0,0 +1,39 @@ +package com.dskj.rbchat.base; + +import android.os.Bundle; +import android.view.MotionEvent; +import android.view.inputmethod.InputMethodManager; + +import androidx.annotation.Nullable; + +import com.dskj.rbchat.R; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; + +public abstract class LllChatBaseActivity extends BaseActivity { + + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + int statusBarColor = initStatusBarColor(); + int navigationBarColor = initNavigationBarColor(); + getWindow().setStatusBarColor(statusBarColor == 0 ? getColor(R.color.color_white) : statusBarColor); + getWindow().setNavigationBarColor(navigationBarColor == 0 ? getColor(R.color.color_white) : navigationBarColor); + + } + + public abstract int initNavigationBarColor(); + + public abstract int initStatusBarColor(); + + public boolean onTouchEvent(MotionEvent event) { + if (null != this.getCurrentFocus()) { + /** + * 点击空白位置 隐藏软键盘 + */ + InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + return mInputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0); + } + return super.onTouchEvent(event); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/contact/ContactGroupSettingActivity.java b/app/src/main/java/com/dskj/rbchat/contact/ContactGroupSettingActivity.java new file mode 100644 index 0000000..ad73190 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/contact/ContactGroupSettingActivity.java @@ -0,0 +1,381 @@ +package com.dskj.rbchat.contact; + +import static com.netease.yunxin.kit.contactkit.ui.ContactConstant.REQUEST_CONTACT_SELECTOR_AVATAR; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.KEY_REQUEST_SELECTOR_NAME; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.KEY_TEAM_ICON; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.KEY_TEAM_NAME; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.REQUEST_CONTACT_SELECTOR_KEY; + +import android.Manifest; +import android.content.Intent; +import android.os.Build; +import android.os.Bundle; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.util.TypedValue; +import android.view.View; +import android.widget.Toast; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.dskj.rbchat.model.UsersExistBean; +import com.dskj.rbchat.utils.ShareDateUtils; +import com.netease.yunxin.kit.common.ui.photo.PhotoPicker; +import com.netease.yunxin.kit.common.ui.utils.CommonCallback; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.common.ui.widgets.BackTitleBar; +import com.netease.yunxin.kit.common.utils.NetworkUtils; +import com.netease.yunxin.kit.contactkit.ui.ContactConstant; +import com.netease.yunxin.kit.contactkit.ui.R; +import com.netease.yunxin.kit.contactkit.ui.databinding.FunContactSelectorSettingActivityBinding; +import com.netease.yunxin.kit.contactkit.ui.fun.selector.FunBaseSelectorDataActivity; +import com.netease.yunxin.kit.contactkit.ui.fun.selector.FunContactMembersAdapter; +import com.netease.yunxin.kit.contactkit.ui.fun.selector.FunContactSelectorDialog; +import com.netease.yunxin.kit.contactkit.ui.model.ContactFriendBean; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.model.FriendInfo; +import com.netease.yunxin.kit.corekit.im.model.UserInfo; +import com.netease.yunxin.kit.corekit.im.provider.FetchCallback; +import com.netease.yunxin.kit.corekit.im.repo.CommonRepo; +import com.netease.yunxin.kit.corekit.im.utils.RouterConstant; +import com.netease.yunxin.kit.teamkit.ui.utils.TeamUtils; +import com.netease.yunxin.kit.teamkit.ui.utils.viewmodel.TeamSettingViewModel; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; + + +//设定群组档案 +public class ContactGroupSettingActivity extends FunBaseSelectorDataActivity implements CommonCallback { + + FunContactSelectorSettingActivityBinding binding; + protected FunContactMembersAdapter membersAdapter; + protected boolean isChecked = true; + protected ArrayList listkey; + protected ArrayList listname; + protected ArrayList listavat; + protected final TeamSettingViewModel model = new TeamSettingViewModel(); + private String groupHeadUrl = ""; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = FunContactSelectorSettingActivityBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + Intent data = getIntent(); + listname = data.getStringArrayListExtra(KEY_REQUEST_SELECTOR_NAME); + listkey = data.getStringArrayListExtra(REQUEST_CONTACT_SELECTOR_KEY); + listavat = data.getStringArrayListExtra(REQUEST_CONTACT_SELECTOR_AVATAR); + + initData(); + initView(); + permissionLauncher = registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(), result -> { + if (result != null) { + for (Map.Entry entry : result.entrySet()) { + String permission = entry.getKey().toString(); + boolean grant = (Boolean) entry.getValue(); + if (grant) { + if (TextUtils.equals( + permission, Manifest.permission.READ_MEDIA_IMAGES) + || TextUtils.equals( + permission, Manifest.permission.READ_MEDIA_VIDEO) + || TextUtils.equals( + permission, Manifest.permission.READ_EXTERNAL_STORAGE)) { + PhotoPicker.getInstance().getAPhotoFromAlbumCropAndUpload(this, this); + } + if (TextUtils.equals( + permission, Manifest.permission.CAMERA)) { + PhotoPicker.getInstance().takePhotoCorpAndUpload(this, this); + + } + } else { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (shouldShowRequestPermissionRationale(permission)) { + ToastX.showShortToast(getResources().getString(com.netease.yunxin.kit.common.ui.R.string.dialog_permission_tips)); + } else { + ToastX.showShortToast(getString(com.netease.yunxin.kit.common.ui.R.string.dialog_permission_tips)); + } + } + } + } + } + + }); + } + + + public void initView() { + configTitleBar(binding.title); + setGroupName(listname); + binding.editGroupname.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void afterTextChanged(Editable editable) { + if (TextUtils.isEmpty(binding.editGroupname.getText().toString())) { + binding.icCleanEdit.setVisibility(View.GONE); + } else { + binding.icCleanEdit.setVisibility(View.VISIBLE); + } + } + }); + binding.icCleanEdit.setOnClickListener(view -> binding.editGroupname.setText("")); + binding.icGrouphead.setData(R.mipmap.ic_group_defaulthead, "head", 1); + binding.rbClickview.setOnClickListener(view -> { + isChecked = !isChecked; + binding.rbSelector.setChecked(isChecked); + } + ); + LinearLayoutManager layoutManager = + new LinearLayoutManager(this, RecyclerView.HORIZONTAL, false); + binding.rvMembers.setLayoutManager(layoutManager); + membersAdapter = new FunContactMembersAdapter(this); + listmemebers.add(IMKitClient.getUserInfo()); + listmemebers.add(IMKitClient.getUserInfo()); + binding.rvMembers.setAdapter(membersAdapter); + for (int i = 0; i < listname.size(); i++) { + UserInfo userInfo = new UserInfo(listkey.get(i), listname.get(i), listavat.get(i)); + listmemebers.add(userInfo); + } + membersAdapter.setData(listmemebers); + membersAdapter.setItemClickListener(new FunContactMembersAdapter.ItemClickListener() { + @Override + public void onItemClick(UserInfo item) { + listkey.remove(item.getAccount()); + listname.remove(item.getName()); + listavat.remove(item.getAvatar()); + setGroupName(listname); + } + + @Override + public void onAddClick() { + //新增 + showAddFriendsDialog(listkey, new FunContactSelectorDialog.onActionClickListener() { + @Override + public void invited(List listaccount, List newlistname, List listavat) { + int initsize = membersAdapter.getItemCount(); + List addmembers = new ArrayList<>(); + for (int i = 0; i < newlistname.size(); i++) { + UserInfo userInfo = new UserInfo(listaccount.get(i), newlistname.get(i), listavat.get(i)); + addmembers.add(userInfo); + listname.add(userInfo.getName()); + listkey.add(userInfo.getAccount()); + } + membersAdapter.addFriends(initsize, addmembers); + setGroupName(listname); + contactSelectorDialog.dismiss(); + } + + @Override + public void search(String text) { + searchViewModel.queryFriend(text); + } + }); + } + }); + + binding.icGrouphead.setOnClickListener(view -> { + choicePhoto(); + }); + + + } + + protected ActivityResultLauncher permissionLauncher; + + private void choicePhoto() { + + TeamUtils.updateHead(this, permissionLauncher, this); + +// PhotoChoiceDialog photoChoiceDialog = new PhotoChoiceDialog(this); +// photoChoiceDialog.show( +// new CommonCallback() { +// @Override +// public void onSuccess(@Nullable File param) { +// if (NetworkUtils.isConnected() && param != null) { +// CommonRepo.uploadImage( +// param, +// new FetchCallback() { +// @Override +// public void onSuccess(@Nullable String urlParam) { +// // updateFocusBg(null, urlParam); +// } +// +// @Override +// public void onFailed(int code) { +// Toast.makeText( +// getApplicationContext(), +// getString(R.string.add_friend_operate_fail), +// Toast.LENGTH_SHORT) +// .show(); +// } +// +// @Override +// public void onException(@Nullable Throwable exception) { +// Toast.makeText( +// getApplicationContext(), +// getString(R.string.add_friend_operate_fail), +// Toast.LENGTH_SHORT) +// .show(); +// } +// }); +// } else { +// Toast.makeText( +// getApplicationContext(), +// getString(R.string.add_friend_operate_fail), +// Toast.LENGTH_SHORT) +// .show(); +// } +// } +// +// @Override +// public void onFailed(int code) { +// Toast.makeText( +// getApplicationContext(), +// getString(R.string.add_friend_operate_fail), +// Toast.LENGTH_SHORT) +// .show(); +// } +// +// @Override +// public void onException(@Nullable Throwable exception) { +// Toast.makeText( +// getApplicationContext(), +// getString(R.string.add_friend_operate_fail), +// Toast.LENGTH_SHORT) +// .show(); +// } +// }); + + } + + + public void setGroupName(List listname) { + if (TextUtils.isEmpty(binding.editGroupname.getText().toString())) { + StringBuilder stringBuilder = new StringBuilder(Objects.requireNonNull(IMKitClient.getUserInfo()).getName() + ","); + for (String name : listname) { + stringBuilder.append(name + ","); + } + binding.editGroupname.setHint(stringBuilder.substring(0, stringBuilder.length() - 1)); + } + binding.tvgroupMembers.setText(String.format(getString(R.string.fun_creategroup_members), listname.size() + 1)); + + } + + + public void configTitleBar(BackTitleBar titleBar) { + titleBar.setOnBackIconClickListener(view -> onBackPressed()).setActionListener(view -> { + //下一步 + String groupname = binding.editGroupname.getText().toString(); + Intent result = new Intent(); + result.putExtra(REQUEST_CONTACT_SELECTOR_KEY, listkey); + result.putExtra(KEY_TEAM_NAME, TextUtils.isEmpty(groupname) ? binding.editGroupname.getHint().toString() : groupname); + result.putExtra(KEY_TEAM_ICON, groupHeadUrl); + result.putExtra(ContactConstant.REQUEST_FUN_CREATE_GROUP_AUTO, isChecked); + setResult(RESULT_OK, result); + finish(); + }).setActionTextColor(getResources().getColor(R.color.color_6877fe)); + titleBar.getTitleTextView().setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20); + titleBar.getRightTextView().setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); + } + + public void updateGroupHead(String url) { + groupHeadUrl = url; + binding.icGrouphead.setData(groupHeadUrl, ""); + } + + @Override + public void onException(@Nullable Throwable throwable) { + Toast.makeText( + getApplicationContext(), + getString(com.netease.yunxin.kit.teamkit.ui.R.string.team_request_fail), + Toast.LENGTH_SHORT) + .show(); + } + + @Override + public void onFailed(int i) { + Toast.makeText( + getApplicationContext(), + getString(com.netease.yunxin.kit.teamkit.ui.R.string.team_request_fail), + Toast.LENGTH_SHORT) + .show(); + } + + @Override + public void onSuccess(@Nullable File file) { + //选取成功 + if (NetworkUtils.isConnected() && file != null) { + CommonRepo.uploadImage( + file, + new FetchCallback() { + @Override + public void onSuccess(@Nullable String urlParam) { + updateGroupHead(urlParam); + } + + @Override + public void onFailed(int code) { + Toast.makeText( + getApplicationContext(), + getString(com.netease.yunxin.kit.teamkit.ui.R.string.team_request_fail), + Toast.LENGTH_SHORT) + .show(); + } + + @Override + public void onException(@Nullable Throwable exception) { + Toast.makeText( + getApplicationContext(), + getString(com.netease.yunxin.kit.teamkit.ui.R.string.team_request_fail), + Toast.LENGTH_SHORT) + .show(); + } + }); + } else { + Toast.makeText( + getApplicationContext(), + getString(com.netease.yunxin.kit.teamkit.ui.R.string.team_network_error), + Toast.LENGTH_SHORT) + .show(); + } + } + + @Override + public List getLovelist() { + List followlist = ShareDateUtils.getFollowUsers(); + if (followlist != null) { + return convertFollowList(followlist); + } else { + return new ArrayList<>(); + } + } + + + public List convertFollowList(List list) { + List contactFriendBeans = new ArrayList<>(); + for (UsersExistBean bean : list) { + FriendInfo friendInfo = new FriendInfo(String.valueOf(bean.getUserId()), bean.getNickname(), ""); + friendInfo.setUserInfo(new UserInfo(String.valueOf(bean.getUserId()), bean.getNickname(), bean.getAvatar())); + ContactFriendBean item = new ContactFriendBean(friendInfo); + contactFriendBeans.add(item); + } + return contactFriendBeans; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/contact/FunBlackListActivity.java b/app/src/main/java/com/dskj/rbchat/contact/FunBlackListActivity.java new file mode 100644 index 0000000..764b10c --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/contact/FunBlackListActivity.java @@ -0,0 +1,196 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.contact; + +import android.graphics.Typeface; +import android.os.Bundle; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Toast; + +import androidx.annotation.Nullable; + +import com.netease.yunxin.kit.common.utils.NetworkUtils; +import com.netease.yunxin.kit.contactkit.ui.R; +import com.netease.yunxin.kit.contactkit.ui.blacklist.BaseBlackListActivity; +import com.netease.yunxin.kit.contactkit.ui.databinding.BaseListActivityLayoutBinding; +import com.netease.yunxin.kit.contactkit.ui.fun.view.FunContactViewHolderFactory; +import com.netease.yunxin.kit.contactkit.ui.fun.view.viewholder.FunBlackListViewHolder; +import com.netease.yunxin.kit.contactkit.ui.model.ContactBlackListBean; +import com.netease.yunxin.kit.contactkit.ui.model.IViewTypeConstant; +import com.netease.yunxin.kit.contactkit.ui.view.viewholder.BaseContactViewHolder; +import com.netease.yunxin.kit.corekit.im.provider.FetchCallback; +import com.netease.yunxin.kit.corekit.im.utils.RouterConstant; +import com.netease.yunxin.kit.corekit.route.XKitRouter; + +import java.util.ArrayList; +import java.util.List; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class FunBlackListActivity extends BaseBlackListActivity { + + private FunBlackListViewHolder viewHolder; + private List listBlackUserInfo = new ArrayList<>(); + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + changeStatusBarColor(R.color.color_white); + binding.heimindanTv.setVisibility(View.VISIBLE); + binding.tvBlackremove.setVisibility(View.VISIBLE); + binding.tvBlackremove.setOnClickListener(view -> { + if (listBlackUserInfo.size() > 0) { + if (!NetworkUtils.isConnected()) { + Toast.makeText( + FunBlackListActivity.this, + R.string.contact_network_error_tip, + Toast.LENGTH_SHORT) + .show(); + return; + } + for (ContactBlackListBean data : listBlackUserInfo) { + remove(data); + } + + } + }); + } + + public void remove(ContactBlackListBean data) { + viewModel.removeBlackOp( + data.data.getAccount(), + new FetchCallback() { + + @Override + public void onException(@Nullable Throwable exception) { + Toast.makeText( + FunBlackListActivity.this, + getText(R.string.remove_black_fail), + Toast.LENGTH_SHORT) + .show(); + + } + + @Override + public void onFailed(int code) { + Toast.makeText( + FunBlackListActivity.this, + getText(R.string.remove_black_fail), + Toast.LENGTH_SHORT) + .show(); + } + + @Override + public void onSuccess(@Nullable Void param) { + binding.contactListView.removeContactData(data); + listBlackUserInfo.clear(); + removeBlack(data.data.getAccount()); + } + }); + } + + private void removeBlack(String account) { + com.netease.yunxin.kit.chatkit.ui.network.Api.getInstance().deleteBlock(account) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new com.netease.yunxin.kit.chatkit.ui.network.BaseObserver<>() { + @Override + public void onSuccess(com.netease.yunxin.kit.chatkit.ui.network.Result feedbackResp) { + } + + @Override + public void onError(int code, String msg) { + } + }); + } + + + protected void configTitle(BaseListActivityLayoutBinding binding) { + binding + .title + .setTitle(R.string.black_list) +// .setActionImg(R.mipmap.ic_title_bar_more) + .setActionListener( + v -> { + XKitRouter.withKey(RouterConstant.PATH_FUN_CONTACT_SELECTOR_PAGE) + .withContext(this) + .navigate(blackListLauncher); + }); + binding.title.getTitleTextView().setTextSize(17); + binding.title.getTitleTextView().setTypeface(Typeface.defaultFromStyle(Typeface.BOLD)); + binding.title.setBackgroundResource(R.color.color_white); + } + + public void setBlackRemoveBg() { + if (listBlackUserInfo.size() > 0) { + setBtnBackground(true); + } else { + setBtnBackground(false); + } + } + + @Override + protected void configViewHolderFactory() { + binding.contactListView.setViewHolderFactory( + new FunContactViewHolderFactory() { + @Override + protected BaseContactViewHolder getCustomViewHolder(ViewGroup view, int viewType) { + if (viewType == IViewTypeConstant.CONTACT_BLACK_LIST) { + viewHolder = new FunBlackListViewHolder(view); + viewHolder.setItemCheckedListener((data, isCheck) -> { + if (isCheck) { + listBlackUserInfo.add(data); + } else { + listBlackUserInfo.remove(data); + } + setBlackRemoveBg(); + }); +// viewHolder.setRelieveListener( +// data -> { +// if (!NetworkUtils.isConnected()) { +// Toast.makeText( +// FunBlackListActivity.this, +// R.string.contact_network_error_tip, +// Toast.LENGTH_SHORT) +// .show(); +// return; +// } +// viewModel.removeBlackOp( +// data.data.getAccount(), +// new FetchCallback() { +// +// @Override +// public void onException(@Nullable Throwable exception) { +// Toast.makeText( +// FunBlackListActivity.this, +// getText(R.string.remove_black_fail), +// Toast.LENGTH_SHORT) +// .show(); +// } +// +// @Override +// public void onFailed(int code) { +// Toast.makeText( +// FunBlackListActivity.this, +// getText(R.string.remove_black_fail), +// Toast.LENGTH_SHORT) +// .show(); +// } +// +// @Override +// public void onSuccess(@Nullable Void param) { +// binding.contactListView.removeContactData(data); +// } +// }); +// }); + return viewHolder; + } + return null; + } + }); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/contact/ReportActivity.java b/app/src/main/java/com/dskj/rbchat/contact/ReportActivity.java new file mode 100644 index 0000000..7bf61f8 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/contact/ReportActivity.java @@ -0,0 +1,745 @@ +package com.dskj.rbchat.contact; + +import android.Manifest; +import android.content.Context; +import android.content.Intent; +import android.content.pm.ActivityInfo; +import android.graphics.Color; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.text.Editable; +import android.text.Html; +import android.text.TextUtils; +import android.text.TextWatcher; +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 androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.Nullable; +import androidx.cardview.widget.CardView; +import androidx.core.content.ContextCompat; +import androidx.core.widget.NestedScrollView; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.alibaba.sdk.android.oss.ClientException; +import com.alibaba.sdk.android.oss.OSSClient; +import com.alibaba.sdk.android.oss.ServiceException; +import com.alibaba.sdk.android.oss.callback.OSSCompletedCallback; +import com.alibaba.sdk.android.oss.common.auth.OSSCredentialProvider; +import com.alibaba.sdk.android.oss.common.auth.OSSStsTokenCredentialProvider; +import com.alibaba.sdk.android.oss.model.PutObjectRequest; +import com.alibaba.sdk.android.oss.model.PutObjectResult; +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.bumptech.glide.load.resource.bitmap.CenterCrop; +import com.bumptech.glide.request.RequestOptions; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.databinding.ActivityTransferInfoBinding; +import com.dskj.rbchat.databinding.ReportActivityBinding; +import com.dskj.rbchat.model.AlbumBean; +import com.dskj.rbchat.model.GroupActionBean; +import com.dskj.rbchat.model.ReportBean; +import com.dskj.rbchat.model.StsCredentialsBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.KeyboardUtil; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.widget.CircleImageView; +import com.luck.picture.lib.basic.PictureSelector; +import com.luck.picture.lib.config.SelectMimeType; +import com.luck.picture.lib.entity.LocalMedia; +import com.luck.picture.lib.interfaces.OnResultCallbackListener; +import com.luck.picture.lib.style.BottomNavBarStyle; +import com.luck.picture.lib.style.PictureSelectorStyle; +import com.luck.picture.lib.style.SelectMainStyle; +import com.luck.picture.lib.style.TitleBarStyle; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.team.TeamService; +import com.netease.nimlib.sdk.team.model.Team; +import com.netease.nimlib.sdk.uinfo.UserService; +import com.netease.nimlib.sdk.uinfo.model.NimUserInfo; +import com.netease.yunxin.kit.chatkit.ui.common.GlideEngine; +import com.netease.yunxin.kit.chatkit.ui.dialog.PermissionExplainDialog; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.dialog.LoadingDialog; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.common.utils.PermissionUtils; +import com.netease.yunxin.kit.contactkit.ui.utils.ColorUtils; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; +import okhttp3.MediaType; +import okhttp3.MultipartBody; +import okhttp3.RequestBody; + +public class ReportActivity extends BaseActivity { + + List lists = new ArrayList<>(); + List uris = new ArrayList<>(); + List uriStrings = new ArrayList<>(); + CommonAdapter commonAdapterTop, commonAdapter; + List localMedias = new ArrayList<>(); + List outputStrings = new ArrayList<>(); + + //0 举报用户,1 举报群聊,2 举报动态 + int type = 0; + private AlbumBean albumBean; + //举报ID + String userId = null; + private ReportActivityBinding viewBinding; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + getWindow().setStatusBarColor(getResources().getColor(R.color.color_fcfcfc)); + getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white)); + super.onCreate(savedInstanceState); + viewBinding = ReportActivityBinding.inflate(getLayoutInflater()); + setContentView(viewBinding.getRoot()); + initView(); + } + + protected void initView() { + + type = getIntent().getIntExtra("type", 0); + viewBinding.mainAboutTitleBar.getBackImageView().setOnClickListener(v -> finish()); + LogUtils.i("举报类型:" + type + ";举报ID:" + userId); + + if (type == 2) { + viewBinding.dongtaiTv.setVisibility(View.VISIBLE); + viewBinding.cardView.setVisibility(View.VISIBLE); + viewBinding.jubaoTypeLy.setVisibility(View.GONE); + viewBinding.textTv.setVisibility(View.VISIBLE); + viewBinding.jubaoV1.setVisibility(View.VISIBLE); + albumBean = (AlbumBean) getIntent().getSerializableExtra("bean"); + } else { + viewBinding.dongtaiTv.setVisibility(View.GONE); + userId = getIntent().getStringExtra("toId"); + viewBinding.cardView.setVisibility(View.GONE); + viewBinding.jubaoTypeLy.setVisibility(View.VISIBLE); + } + initData(); + initTopAdapter(); + initAdapter(); + + + viewBinding.tupianzhenmingTv.setText(String.format(getString(R.string.tupianzhengming_txt), 0)); + viewBinding.qianmingTv.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) { + viewBinding.numberTv.setText(viewBinding.qianmingTv.getText().toString().trim().length() + "/100"); + } + + @Override + public void afterTextChanged(Editable s) { + + } + }); + + if (type == 0) { + viewBinding.jubaoTxt.setText(R.string.report_user_txt); + getUserInfo(userId); + + } else if (type == 1) { + viewBinding.jubaoTxt.setText(R.string.report_grouo_txt); + getGroupInfo(userId); + } else { + if (!TextUtils.isEmpty(albumBean.getVideo()) || !TextUtils.isEmpty(albumBean.getPicture1())) { + viewBinding.leftRy.setVisibility(View.VISIBLE); + if (!TextUtils.isEmpty(albumBean.getVideo())) { + viewBinding.videoIv.setVisibility(View.VISIBLE); + + loadImage1(ReportActivity.this, albumBean.getVideo().replace("video_output", "video_input") + "?x-oss-process=video/snapshot,t_7000,f_jpg,m_fast", viewBinding.bigIv); + } else { + viewBinding.videoIv.setVisibility(View.GONE); +// loadImage1(ReportActivity.this, ApiService.URL1+albumBean.getPicture1(), bigIv); + loadImage1(ReportActivity.this, albumBean.getPicture1(), viewBinding.bigIv); + + } + } else { + viewBinding.leftRy.setVisibility(View.GONE); + } + + if (TextUtils.isEmpty(albumBean.getText())) { + viewBinding.textTv.setText(Html.fromHtml("" + albumBean.getUserNickname() + ":" + getString(R.string.post_updates_txt))); + } else { + viewBinding.textTv.setText(Html.fromHtml("" + albumBean.getUserNickname() + ":" + albumBean.getText())); + + } + + + } + + viewBinding.tupianzhenmingTv.setText(getString(R.string.tpzm_txt) + "(0/6)"); + + + viewBinding.tijiaoTv.setOnClickListener(v -> { + if (getSelectList() == 0) { +// WidgetUtils.showToast(ReportActivity.this, getString(R.string.qxxzjbyy_txt), WidgetUtils.ToastType.ERROR); + ToastX.showShortToast(getString(R.string.qxxzjbyy_txt)); + return; + } + if (TextUtils.isEmpty(viewBinding.qianmingTv.getText().toString().trim())) { +// WidgetUtils.showToast(ReportActivity.this, getString(R.string.qxtxjtqksm_txt), WidgetUtils.ToastType.ERROR); + ToastX.showShortToast(getString(R.string.qxtxjtqksm_txt)); + + return; + } + KeyboardUtil.hideSoftInput(ReportActivity.this); + if (localMedias == null || localMedias.size() == 0) { + showLoadingDialog(); + sumbit(); + } else { + toShangchuanAli(); + } + }); + viewBinding.backTv.setOnClickListener(v -> finish()); + + permissionLauncher = + registerForActivityResult( + new ActivityResultContracts.RequestMultiplePermissions(), + result -> { + if (result != null) { + for (Map.Entry entry : result.entrySet()) { + String permission = entry.getKey().toString(); + boolean grant = (Boolean) entry.getValue(); + if (grant) { + if (TextUtils.equals( + permission, Manifest.permission.READ_EXTERNAL_STORAGE) || TextUtils.equals( + permission, Manifest.permission.READ_MEDIA_IMAGES) || TextUtils.equals( + permission, Manifest.permission.READ_MEDIA_VIDEO)) { + startPickMedia(); + } + } else { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (shouldShowRequestPermissionRationale(permission)) { + ToastX.showShortToast(getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_deny_tips)); + } else { + ToastX.showShortToast(getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_storage)); + } + } + } + } + } + if (permissionExplainDialog != null) { + permissionExplainDialog.dismiss(); + } + }); + + + } + + + StsCredentialsBean stsCredentialsBean; + + private void toShangchuanAli() { + showLoadingDialog(); + Api.getInstance().stsCredentials() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result feedbackResp) { + stsCredentialsBean = feedbackResp.data; + toAliYunOss(); + } + + @Override + public void onError(int code, String msg) { + dimessLoadingDialog(); + } + }); + } + + private void toAliYunOss() { + String endpoint = "https://oss-cn-hongkong.aliyuncs.com"; + String accessKeyId = stsCredentialsBean.getAccessKeyId(); + String accessKeySecret = stsCredentialsBean.getAccessKeySecret(); + String securityToken = stsCredentialsBean.getSecurityToken(); + String bucketName = IMUIKitConfig.bucketName; + + OSSCredentialProvider credentialProvider = new OSSStsTokenCredentialProvider(accessKeyId, accessKeySecret, securityToken); + OSSClient oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider); + toUpdateOss(bucketName, 0, oss); + + } + + // + private void toUpdateOss(String bucketName, int i, OSSClient oss) { + String updatePathPic = "report"; +// Calendar calendar= Calendar.getInstance(); +// String year = calendar.get(Calendar.YEAR)+""; +// String month = (calendar.get(Calendar.MONTH)+1)<10?"0"+(calendar.get(Calendar.MONTH)+1):(calendar.get(Calendar.MONTH)+1)+""; +// String d = calendar.get(Calendar.DATE)<10?"0"+calendar.get(Calendar.DAY_OF_MONTH):calendar.get(Calendar.DAY_OF_MONTH)+""; + + String data = DataUtils.getCurrentTimeTypeNoline(System.currentTimeMillis()); + if (i < uris.size()) { + + File file = new File(uriStrings.get(i)); + String fileName = System.currentTimeMillis() + "_" + file.getName(); + // 构造上传请求。 + PutObjectRequest put = new PutObjectRequest(bucketName, "media/" + updatePathPic + "/" + data + "/" + fileName + ".png", localMedias.get(i).getRealPath()); + + + put.setProgressCallback((request, currentSize, totalSize) -> { + LogUtils.i("PutObject", "currentSize: " + currentSize + " totalSize: " + totalSize); +// if(isVideo){ +// showLoadingDialog(("正在上传"+(currentSize*100)/totalSize)+"%"); +// } + }); + + //OSSAsyncTask task = + oss.asyncPutObject(put, new OSSCompletedCallback<>() { + @Override + public void onSuccess(PutObjectRequest request, PutObjectResult result) { + LogUtils.i("PutObject", "UploadSuccess"); + LogUtils.i("ETag", result.getETag()); + LogUtils.i("RequestId", result.getRequestId()); + LogUtils.i("获取到的数据:" + GsonUtils.beanToJSONString(result)); + outputStrings.add(IMUIKitConfig.OSS_URL + "media/" + updatePathPic + "/" + data + "/" + fileName + ".png"); + //https://shenqi777.oss-cn-hongkong.aliyuncs.com/qtalk/pic_output/20230914/null_false53.jpg + if (i == uris.size() - 1) { + sumbit(); + } else { + toUpdateOss(bucketName, i + 1, oss); + } + } + + @Override + public void onFailure(PutObjectRequest request, ClientException clientExcepion, ServiceException serviceException) { + dimessLoadingDialog(); + LogUtils.i("ErrorCode", clientExcepion.getMessage()); + + // 请求异常。 + if (clientExcepion != null) { + // 本地异常,如网络异常等。 + clientExcepion.printStackTrace(); + } + if (serviceException != null) { + // 服务异常。 + LogUtils.i("ErrorCode", serviceException.getErrorCode()); + LogUtils.i("RequestId", serviceException.getRequestId()); + LogUtils.i("HostId", serviceException.getHostId()); + LogUtils.i("RawMessage", serviceException.getRawMessage()); + } + } + }); + } + } + + + //不带圆角,目前视频使用 + public void loadImage1(Context context, String path, CircleImageView imageView) { +// RoundedCorners roundedCorners = new RoundedCorners(20);//数字为圆角度数 + RequestOptions coverRequestOptions = new RequestOptions() + .transforms(new CenterCrop())//, roundedCorners +// .error(R.mipmap.default_img)//加载错误显示 +// .placeholder(R.mipmap.default_img)//加载中显示 + .diskCacheStrategy(DiskCacheStrategy.ALL)//缓存全部 +// .skipMemoryCache(true)//多种原因造成闪烁,这里是之一,如果坚持跳过内存缓存,需要tag,增加noty的各种判断, + //但是不跳过,可能因为数据过大会boom, + ;//不做内存缓存 + + //Glide 加载图片简单用法 + Glide.with(context) + .load(path) + .apply(coverRequestOptions) + .into(imageView); + + + } + + private void sumbit() { + + List map = new ArrayList<>(); + MultipartBody.Part reportType = MultipartBody.Part.createFormData("reportType", type + ""); + map.add(reportType); + if (type == 0) { + MultipartBody.Part reportedUserId = MultipartBody.Part.createFormData("reportedUserId", userId); + map.add(reportedUserId); + } else if (type == 1) { + MultipartBody.Part reportedGroupId = MultipartBody.Part.createFormData("reportedGroupId", userId); + map.add(reportedGroupId); + } else { + MultipartBody.Part reportedGroupId = MultipartBody.Part.createFormData("reportedPostId", albumBean.getPostId()); + map.add(reportedGroupId); + } + MultipartBody.Part explain = MultipartBody.Part.createFormData("explain", viewBinding.qianmingTv.getText().toString().trim()); + map.add(explain); + + List reportBeans = getSelectListBean(); + for (int i = 0; i < reportBeans.size(); i++) { + MultipartBody.Part reasonType = MultipartBody.Part.createFormData("reasonType" + (i + 1), reportBeans.get(i).getIndex() + ""); + map.add(reasonType); + } + for (int i = 0; i < outputStrings.size(); i++) { +// File file = new File(localMedias.get(i).getRealPath()); +// LogUtils.i("文件地址:"+localMedias.get(i).getRealPath()); +// RequestBody imageBody = RequestBody.create(MediaType.parse("multipart/form-data"), file); +// MultipartBody.Part imageBodyPart = MultipartBody.Part.createFormData("screenshot"+(i+1), file.getName(), imageBody); + MultipartBody.Part imageBodyPart = MultipartBody.Part.createFormData("screenshot" + (i + 1), outputStrings.get(i)); + + map.add(imageBodyPart); + } + + Api.getInstance().report(map) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver() { + @Override + public void onSuccess(Result feedbackResp) { + dimessLoadingDialog(); + if (feedbackResp.data != null) { + viewBinding.step2Ly.setVisibility(View.VISIBLE); + viewBinding.step1Lyf.setVisibility(View.GONE); + + } + } + + @Override + public void onError(int code, String msg) { + dimessLoadingDialog(); + LogUtils.i("获取到的错误:" + code + "" + msg); +// WidgetUtils.showToast(ReportActivity.this, msg, WidgetUtils.ToastType.ERROR); + ToastX.showShortToast(msg); + + } + }); + + } + + LoadingDialog loadingDialog; + + public void showLoadingDialog() { + if (loadingDialog == null) + loadingDialog = new LoadingDialog(this); + loadingDialog.show(); + } + + public void showLoadingDialog(String msg) { + if (loadingDialog == null) + loadingDialog = new LoadingDialog(this); + loadingDialog.setLoadingText(msg); + loadingDialog.show(); + } + + + public void dimessLoadingDialog() { + if (loadingDialog != null) { + loadingDialog.dismiss(); + } + + } + + private void getGroupInfo(String toId) { + Team team = NIMClient.getService(TeamService.class).queryTeamBlock(toId); + if (team != null) { + ColorUtils.loadGroupAvator(team.getIcon(), viewBinding.userHeadIv); +// viewBinding.userHeadIv.setData(team.getIcon(),team.getName()); + viewBinding.nameTv.setText(team.getName()); + + } + + } + + + private void getUserInfo(String user_uid) { + +// Api.getInstance().userInfo(user_uid) +// .subscribeOn(Schedulers.io()) +// .observeOn(AndroidSchedulers.mainThread()) +// .subscribe(new BaseObserver>() { +// @Override +// public void onSuccess(Result feedbackResp) { +// ImageCacheLoader.loadAvatarImgWithGlide(ReportActivity.this, feedbackResp.data.getUser_uid(), feedbackResp.data.getUserAvatarFileName() +// , userHeadIv, 12 // 圆角单位是dp,(相当于xxhdpi下的21像素) +// , R.drawable.default_cir, false, false); +// nameTv.setText(feedbackResp.data.getNickNameWithRemark()); +// +// } +// +// @Override +// public void onError(int code, String msg) { +// LogUtils.i("获取到的错误:"+code+""+ msg); +//// WidgetUtils.showToast(getActivity(), msg, WidgetUtils.ToastType.ERROR); +// } +// }); + NimUserInfo nimUserInfo = NIMClient.getService(UserService.class).getUserInfo(user_uid); + if (nimUserInfo != null) { + ColorUtils.loadAvator(nimUserInfo.getAvatar(), viewBinding.userHeadIv); +// viewBinding.userHeadIv.setData(nimUserInfo.getAvatar(), nimUserInfo.getName()); + viewBinding.nameTv.setText(nimUserInfo.getName()); + + } + + + } + + private void initAdapter() { + + uriStrings = getList(uriStrings); + + viewBinding.recylerview1.setLayoutManager(new GridLayoutManager(this, 4)); + commonAdapter = new CommonAdapter<>(this, R.layout.item_post_circle, uriStrings) { + @Override + public void convert(ViewHolder holder, String s, int index) { + if (uriStrings.get(index).equals("add")) { + holder.getView(R.id.item_image_iv).setVisibility(View.GONE); + holder.getView(R.id.item_image_iv1).setVisibility(View.VISIBLE); + holder.getView(R.id.colose_iv).setVisibility(View.GONE); + } else { + holder.getView(R.id.item_image_iv).setVisibility(View.VISIBLE); + holder.getView(R.id.item_image_iv1).setVisibility(View.GONE); + holder.getView(R.id.colose_iv).setVisibility(View.VISIBLE); + Glide.with(ReportActivity.this).load(uris.get(index)).into((CircleImageView) holder.getView(R.id.item_image_iv)); + } + holder.getView(R.id.item_image_iv1).setOnClickListener(v -> { + if (uriStrings.get(index).equals("add")) { + addPic(); + } + }); + holder.getView(R.id.colose_iv).setOnClickListener(v -> { + uris.remove(index); + localMedias.remove(index); + viewBinding.tupianzhenmingTv.setText(getString(R.string.tpzm_txt) + "(" + uris.size() + "/6)"); + uriStrings.remove(index); + if (uris.size() == 5 || uriStrings.size() == 0) { + uriStrings = getList(uriStrings); + } + notifyDataSetChanged(); + }); + } + }; + viewBinding.recylerview1.setAdapter(commonAdapter); + + } + + private void addPic() { + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + if (PermissionUtils.hasPermissions( + ReportActivity.this, Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO)) { + startPickMedia(); + } else { + requestCameraPermission(); + } + } else { + if (PermissionUtils.hasPermissions( + ReportActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE)) { + startPickMedia(); + } else { + requestCameraPermission( + Manifest.permission.READ_EXTERNAL_STORAGE); + } + } + } + + + protected ActivityResultLauncher permissionLauncher; + PermissionExplainDialog permissionExplainDialog; + private void requestCameraPermission(String permission) { + permissionExplainDialog = new PermissionExplainDialog(this, getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_storage_title), getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_storage_content)); + permissionExplainDialog.show(); + permissionLauncher.launch(new String[]{permission}); + } + + private void requestCameraPermission() { + permissionExplainDialog = new PermissionExplainDialog(this, getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_storage_title), getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_storage_content)); + permissionExplainDialog.show(); + permissionLauncher.launch(new String[]{Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO}); + } + + protected void startPickMedia() { +// pickMediaLauncher.launch("image/*;video/*"); + + TitleBarStyle whiteTitleBarStyle = new TitleBarStyle(); + whiteTitleBarStyle.setTitleBackgroundColor(ContextCompat.getColor(ReportActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_white)); + whiteTitleBarStyle.setTitleDrawableRightResource(com.netease.yunxin.kit.chatkit.ui.R.drawable.ic_orange_arrow_down); + whiteTitleBarStyle.setTitleLeftBackResource(com.netease.yunxin.kit.common.ui.R.drawable.ic_back); + whiteTitleBarStyle.setTitleTextColor(ContextCompat.getColor(ReportActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_black)); + whiteTitleBarStyle.setTitleCancelTextColor(ContextCompat.getColor(ReportActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_53575e)); + whiteTitleBarStyle.setDisplayTitleBarLine(true); + + BottomNavBarStyle whiteBottomNavBarStyle = new BottomNavBarStyle(); + whiteBottomNavBarStyle.setBottomNarBarBackgroundColor(Color.parseColor("#FFFFFF")); + whiteBottomNavBarStyle.setBottomPreviewSelectTextColor(ContextCompat.getColor(ReportActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_53575e)); + + whiteBottomNavBarStyle.setBottomPreviewNormalTextColor(ContextCompat.getColor(ReportActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_9b)); + whiteBottomNavBarStyle.setBottomPreviewSelectTextColor(ContextCompat.getColor(ReportActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.color_222222)); + whiteBottomNavBarStyle.setCompleteCountTips(false); + whiteBottomNavBarStyle.setBottomEditorTextColor(ContextCompat.getColor(ReportActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_53575e)); + whiteBottomNavBarStyle.setBottomOriginalTextColor(ContextCompat.getColor(ReportActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_53575e)); + + SelectMainStyle selectMainStyle = new SelectMainStyle(); + selectMainStyle.setStatusBarColor(ContextCompat.getColor(ReportActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_white)); + selectMainStyle.setDarkStatusBarBlack(true); + selectMainStyle.setSelectNormalTextColor(ContextCompat.getColor(ReportActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_9b)); + selectMainStyle.setSelectTextColor(ContextCompat.getColor(ReportActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.color_222222)); + selectMainStyle.setPreviewSelectBackground(com.netease.yunxin.kit.chatkit.ui.R.drawable.ps_demo_white_preview_selector); + selectMainStyle.setSelectBackground(com.netease.yunxin.kit.chatkit.ui.R.drawable.ps_checkbox_selector); +// selectMainStyle.setSelectText(R.string.ps_done_front_num); + selectMainStyle.setMainListBackgroundColor(ContextCompat.getColor(ReportActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_white)); + PictureSelectorStyle selectorStyle = new PictureSelectorStyle(); + selectorStyle.setTitleBarStyle(whiteTitleBarStyle); + selectorStyle.setBottomBarStyle(whiteBottomNavBarStyle); + selectorStyle.setSelectMainStyle(selectMainStyle); + + + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .setImageEngine(GlideEngine.createGlideEngine()) + .setMaxSelectNum(6) +// .setMaxVideoSelectNum(9) + .setSelectorUIStyle(selectorStyle) + .forResult(new OnResultCallbackListener<>() { + @Override + public void onResult(ArrayList result) { + if (uriStrings.size() > 1) { + uriStrings.remove(uriStrings.size() - 1); +// uriStrings.addAll(Matisse.obtainPathResult(data)); +// uris.addAll(Matisse.obtainResult(data)); + localMedias.addAll(result); + for (int i = 0; i < result.size(); ++i) { + Uri uri = Uri.parse(result.get(i).getAvailablePath()); + uris.add(uri); + uriStrings.add(result.get(i).getAvailablePath()); + } + } else { + uris.clear(); + uriStrings.clear(); + localMedias = result; + for (int i = 0; i < result.size(); ++i) { + Uri uri = Uri.parse(result.get(i).getAvailablePath()); + uris.add(uri); + uriStrings.add(result.get(i).getAvailablePath()); + } + } + viewBinding.tupianzhenmingTv.setText(String.format(getString(R.string.tupianzhengming_txt), localMedias.size())); + + getList(uriStrings); + + commonAdapter.setDates(uriStrings); + + } + + @Override + public void onCancel() { + + } + }); + + } + + + private List getList(List list) { + if (list == null) { + list = new ArrayList<>(); + } + if (list.size() < 6) { + list.add("add"); + } + return list; + } + + + private void initTopAdapter() { + int loc = DataUtils.get(ReportActivity.this, "locale", 0); + + GridLayoutManager linearLayoutManager = new GridLayoutManager(ReportActivity.this, loc < 2 ? 3 : 2); + viewBinding.recylerview.setLayoutManager(linearLayoutManager); + commonAdapterTop = new CommonAdapter(ReportActivity.this, R.layout.report_item, lists) { + @Override + public void convert(ViewHolder holder, ReportBean s, int pos) { + holder.setText(R.id.top_name, s.getTitle()); + holder.getView(R.id.top_name1).setOnClickListener(view -> { + if (!s.isCheck()) { + if (getSelectList() >= 3) { + ToastX.showShortToast(getString(R.string.zdxzsg_txt)); + return; + } + lists.get(pos).setCheck(!lists.get(pos).isCheck()); + } else { + lists.get(pos).setCheck(!lists.get(pos).isCheck()); + } + notifyDataSetChanged(); + + }); + ImageView imageView = holder.getView(R.id.gou_iv); + imageView.setImageResource(R.mipmap.dialog_gou_ff); + if (s.isCheck()) { + imageView.setImageResource(R.mipmap.dialog_gou_tt); + } + } + }; + viewBinding.recylerview.setAdapter(commonAdapterTop); + } + + private int getSelectList() { + int number = 0; + for (int i = 0; i < lists.size(); i++) { + if (lists.get(i).isCheck()) { + number += 1; + } + } + return number; + } + + + private ArrayList getSelectListBean() { + ArrayList reportBeans = new ArrayList<>(); + for (int i = 0; i < lists.size(); i++) { + if (lists.get(i).isCheck()) { + reportBeans.add(lists.get(i)); + } + } + return reportBeans; + } + + private void initData() { + lists = new ArrayList<>(); + lists.add(new ReportBean(0, false, getString(R.string.report_sqds_txt))); + lists.add(new ReportBean(1, false, getString(R.string.report_kbxx_txt))); + lists.add(new ReportBean(2, false, getString(R.string.report_mmgj_txt))); + lists.add(new ReportBean(3, false, getString(R.string.report_xjqp_txt))); + + lists.add(new ReportBean(4, false, getString(R.string.report_ggsr_txt))); + lists.add(new ReportBean(5, false, getString(R.string.report_qinquan_txt))); + lists.add(new ReportBean(6, false, getString(R.string.report_wjnr_txt))); + lists.add(new ReportBean(7, false, getString(R.string.report_other_txt))); + } + + public boolean onTouchEvent(MotionEvent event) { + if(null != this.getCurrentFocus()){ + /** + * 点击空白位置 隐藏软键盘 + */ + InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + return mInputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0); + } + return super .onTouchEvent(event); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/contact/UserInfoActivity.java b/app/src/main/java/com/dskj/rbchat/contact/UserInfoActivity.java new file mode 100644 index 0000000..3c8900c --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/contact/UserInfoActivity.java @@ -0,0 +1,1040 @@ +package com.dskj.rbchat.contact; + +import android.content.Intent; +import android.content.pm.PackageManager; +import android.graphics.Color; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewTreeObserver; +import android.view.inputmethod.InputMethodManager; +import android.widget.FrameLayout; +import android.widget.TextView; +import android.widget.Toast; +import android.widget.Button; +import android.widget.LinearLayout; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.Nullable; +import androidx.appcompat.widget.AppCompatImageView; +import androidx.lifecycle.ViewModelProvider; +import androidx.recyclerview.widget.GridLayoutManager; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.bumptech.glide.request.RequestOptions; +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.databinding.ActivityUserInfoBinding; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.main.MainActivity; +import com.dskj.rbchat.main.mine.EditFriendUserInfoActivity; +import com.dskj.rbchat.main.mine.EditUserInfoActivity; +import com.dskj.rbchat.main.mine.photo.AddPhotoActivity; +import com.dskj.rbchat.main.mine.photo.UserPhotoDetailsActivity; +import com.dskj.rbchat.main.mine.photo.UserPhotoListActivity; +import com.dskj.rbchat.model.AlbumBean; +import com.dskj.rbchat.model.ListBeanResult; +import com.dskj.rbchat.model.LoginBean; +import com.dskj.rbchat.model.UserAlbumBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.Constant; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.voom.TiktokActivityMe; +import com.google.android.material.bottomsheet.BottomSheetDialog; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.msg.MsgService; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.yunxin.kit.chatkit.repo.ContactRepo; +import com.netease.yunxin.kit.chatkit.ui.common.ChatUtils; +import com.netease.yunxin.kit.chatkit.ui.common.RxBus; +import com.netease.yunxin.kit.chatkit.ui.model.ChatBlackEvent; +import com.netease.yunxin.kit.chatkit.ui.model.ChatDeleteEvent; +import com.netease.yunxin.kit.chatkit.ui.model.CleanHistoryEvent; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.common.ui.viewmodel.LoadStatus; +import com.netease.yunxin.kit.common.utils.NetworkUtils; +import com.netease.yunxin.kit.common.utils.XKitUtils; +import com.netease.yunxin.kit.contactkit.ui.blacklist.BlackListViewModel; +import com.netease.yunxin.kit.contactkit.ui.fun.addfriend.FunAddFriendsBottomDialog; +import com.netease.yunxin.kit.contactkit.ui.model.ContactUserInfoBean; +import com.netease.yunxin.kit.contactkit.ui.userinfo.UserInfoViewModel; +import com.netease.yunxin.kit.corekit.event.EventCenter; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.model.FriendInfo; +import com.netease.yunxin.kit.corekit.im.model.UserInfo; +import com.netease.yunxin.kit.corekit.im.provider.FetchCallback; +import com.netease.yunxin.kit.corekit.im.repo.CommonRepo; +import com.netease.yunxin.kit.corekit.im.utils.RouterConstant; +import com.netease.yunxin.kit.corekit.route.XKitRouter; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class UserInfoActivity extends BaseActivity { + private ActivityUserInfoBinding viewBinding; + protected UserInfoViewModel viewModel; + protected ContactUserInfoBean userInfoData; + protected String accId; + private ActivityResultLauncher launcher; + protected BlackListViewModel blackListViewModel; + + private String alias = ""; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + getWindow().setDecorFitsSystemWindows(false); + } else { + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); + } + getWindow().setStatusBarColor(Color.TRANSPARENT); + + super.onCreate(savedInstanceState); + viewBinding = ActivityUserInfoBinding.inflate(getLayoutInflater()); + + setContentView(viewBinding.getRoot()); + initView(); + initData(); + + launcher = + registerForActivityResult( + new ActivityResultContracts.StartActivityForResult(), + result -> { + if (result.getResultCode() == RESULT_OK) { + loadData(accId); + ContactRepo.fetchFriend(accId, new FetchCallback() { + @Override + public void onSuccess(@Nullable FriendInfo friendInfo) { + if (friendInfo != null) { + alias = friendInfo.getAlias(); + if (TextUtils.isEmpty(alias)) { + viewBinding.userNameTv.setText(friendInfo.getName()); + } else { + viewBinding.userNameTv.setText(friendInfo.getUserInfo().getName() + "(" + alias + ")"); + } + + } + + } + + @Override + public void onFailed(int i) { + + } + + @Override + public void onException(@Nullable Throwable throwable) { + + } + }); + CommonRepo.getUserInfo( + accId, + new FetchCallback() { + @Override + public void onSuccess(@Nullable UserInfo param) { + if (!TextUtils.isEmpty(param.getSignature())) { + viewBinding.signTv.setText(param.getSignature()); + viewBinding.signTv.setVisibility(View.VISIBLE); + } else { + viewBinding.signTv.setVisibility(View.GONE); + } + } + + @Override + public void onFailed(int code) { + } + + @Override + public void onException(@Nullable Throwable exception) { + } + }); +// } + } + }); + + + } + + private void loadData(String account) { + getUserInfo(account); + } + + private void initView() { + + viewBinding.backIv.setOnClickListener(v -> onBackPressed()); + viewBinding.addFriendsTv.setOnClickListener(v -> addFriendSHow(userInfoData.data)); + + viewBinding.chatTv.setOnClickListener(v -> goChat()); + + viewBinding.voiceTv.setOnClickListener(v -> { + toCall(false); + }); + viewBinding.videoTv.setOnClickListener(v -> { + toCall(true); + + }); + viewBinding.privateTv.setOnClickListener(v -> { + getDateList(); + }); + viewBinding.starIv.setOnClickListener(v -> toStarAction()); + + viewBinding.moreIv.setOnClickListener(v -> showBottom()); + + viewBinding.blackTv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + blackListViewModel.removeBlackOp( + accId, + new FetchCallback() { + + @Override + public void onException(@Nullable Throwable exception) { + Toast.makeText( + UserInfoActivity.this, + getText(com.netease.yunxin.kit.contactkit.ui.R.string.remove_black_fail), + Toast.LENGTH_SHORT) + .show(); + + } + + @Override + public void onFailed(int code) { + Toast.makeText( + UserInfoActivity.this, + getText(com.netease.yunxin.kit.contactkit.ui.R.string.remove_black_fail), + Toast.LENGTH_SHORT) + .show(); + } + + @Override + public void onSuccess(@Nullable Void param) { + removeBlack(accId); + initData(); + } + }); + } + }); + viewBinding.btnAlbum.setOnClickListener(view -> { + toUserAlbumList(); + }); + setUserAlbums(); + } + + + public void addFriendSHow(UserInfo userInfo) { + FunAddFriendsBottomDialog addFriendsBottomDialog = new FunAddFriendsBottomDialog(this) + .configUser(userInfo.getName(), userInfo.getAvatar()); + addFriendsBottomDialog.show( + () -> { + if (!NetworkUtils.isConnected()) { + Toast.makeText(this, com.netease.yunxin.kit.contactkit.ui.R.string.contact_network_error_tip, Toast.LENGTH_SHORT).show(); + return; + } + //发送 + if (userInfo != null) { + addfriend(userInfo.getAccount(), addFriendsBottomDialog.getVerifyMsg(), u.getAddFriendNeedVerify() == 1); + } + }); + + } + + public void addfriend(String account, String verifymsg, boolean isVerify) { + viewModel.addFriendVerifyMsg( + account, + verifymsg, + isVerify, + new FetchCallback() { + @Override + public void onSuccess(@Nullable Void param) { + viewModel.fetchData(userInfoData.data.getAccount()); + ToastX.showShortToast( + getResources().getString(com.netease.yunxin.kit.contactkit.ui.R.string.add_friend_operate_success) + ); + } + + @Override + public void onFailed(int code) { + String tips = getResources().getString(com.netease.yunxin.kit.contactkit.ui.R.string.add_friend_operate_fail); + ToastX.showShortToast( + String.format(tips, String.valueOf(code)) + ); + } + + @Override + public void onException(@Nullable Throwable exception) { + String tips = getResources().getString(com.netease.yunxin.kit.contactkit.ui.R.string.add_friend_operate_fail); + ToastX.showShortToast( + String.format(tips, exception.getMessage())); + } + }); + } + + private void removeBlack(String accId) { + com.netease.yunxin.kit.chatkit.ui.network.Api.getInstance().deleteBlock(accId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new com.netease.yunxin.kit.chatkit.ui.network.BaseObserver<>() { + @Override + public void onSuccess(com.netease.yunxin.kit.chatkit.ui.network.Result feedbackResp) { + EventCenter.notifyEvent(new ChatBlackEvent(false)); + } + + @Override + public void onError(int code, String msg) { + } + }); + } + + /** + * 音视频通话 + * + * @param isVideoCall 是否视频通话 + */ + private void toCall(boolean isVideoCall) { + if (!XKitUtils.getApplicationContext() + .getPackageManager() + .hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY)) { + ToastX.showShortToast(com.netease.yunxin.kit.chatkit.ui.R.string.chat_message_camera_unavailable); + return; + } + if (isVideoCall) { + ChatUtils.startVideoCall(UserInfoActivity.this, userInfoData.data.getAccount()); +// CallParam param = CallParam.createSingleCallParam(RouterConstant.KEY_CALL_TYPE_VIDEO,IMKitClient.account(),userInfoData.data.getAccount()); +// CallKitUI.startSingleCall(UserInfoActivity.this, param); + + } else { + ChatUtils.startAudioCall(UserInfoActivity.this, userInfoData.data.getAccount()); +// CallParam param = new CallParam.Builder() +// .addCalledUserAccId(userInfoData.data.getAccount()) // 被叫用户云信 IM accid +// .channelType(RouterConstant.KEY_CALL_TYPE_AUDIO) // 呼叫类型为视频 +// .callExtraInfo("") +// .build(); +// CallParam param = CallParam.createSingleCallParam(RouterConstant.KEY_CALL_TYPE_AUDIO,IMKitClient.account(),userInfoData.data.getAccount()); +// CallKitUI.startSingleCall(UserInfoActivity.this, param); + + } + } + + private void toStarAction() { + if (u != null) { + Map map = new HashMap<>(); + map.put("userId", accId); + if (u.getIsFollow().equals(0)) { + Api.getInstance().follow(accId, alias) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result feedbackResp) { + getUserInfo(accId); + RxBus.getInstance().post(IMUIKitConfig.CHANGE_FOLLOW_USER); + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + } + }); + } else { + cancelFollow(accId); + } + } + } + + public void cancelFollow(String accId) { + Api.getInstance().followCancel(accId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result feedbackResp) { + getUserInfo(accId); + RxBus.getInstance().post(IMUIKitConfig.CHANGE_FOLLOW_USER); + + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + } + }); + } + + + private LinearLayout laheiLy; + private Button laheiTv; + private LinearLayout deleteLy; + private Button deleteTv; + private LinearLayout cancelLy; + private Button cancelTv; + + private LinearLayout jubaoLy; + private Button jubaoTv; + + private void showBottom() { + BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(this, R.style.BottomSheetDialog); + View bottomView = LayoutInflater.from(UserInfoActivity.this).inflate(R.layout.bottom_sheet_layout_user, null); + bottomSheetDialog.setContentView(bottomView); + bottomSheetDialog.show(); + + laheiLy = (LinearLayout) bottomView.findViewById(R.id.lahei_ly); + laheiTv = (Button) bottomView.findViewById(R.id.lahei_tv); + deleteLy = (LinearLayout) bottomView.findViewById(R.id.delete_ly); + deleteTv = (Button) bottomView.findViewById(R.id.delete_tv); + cancelLy = (LinearLayout) bottomView.findViewById(R.id.cancel_ly); + cancelTv = (Button) bottomView.findViewById(R.id.cancel_tv); + + + jubaoLy = (LinearLayout) bottomView.findViewById(R.id.jubao_ly); + jubaoTv = (Button) bottomView.findViewById(R.id.jubao_tv); + + laheiTv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + bottomSheetDialog.dismiss(); + ActionConfirmDialog actionConfirmDialog = new ActionConfirmDialog(UserInfoActivity.this, getString(R.string.lahei_tips_txt), true); + actionConfirmDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + toBlack(); + } + + @Override + public void toCancel() { + + } + }); + actionConfirmDialog.show(); + } + }); + + deleteTv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + bottomSheetDialog.dismiss(); + ActionConfirmDialog actionConfirmDialog = new ActionConfirmDialog(UserInfoActivity.this, getString(R.string.qrschy_txt), true); + actionConfirmDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + toDelete(); + } + + @Override + public void toCancel() { + + } + }); + actionConfirmDialog.show(); + } + }); + + jubaoTv.setOnClickListener(v -> { + bottomSheetDialog.dismiss(); + Intent intent = new Intent(UserInfoActivity.this, ReportActivity.class); + intent.putExtra("type", 0); + intent.putExtra("toId", userInfoData.data.getAccount()); + startActivity(intent); + }); + + cancelTv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + bottomSheetDialog.dismiss(); + } + }); + + } + + private void getDateList() { + Map maps = new HashMap<>(); + maps.put("page", 1); + maps.put("size", 1); + maps.put("selectType", 2); + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + + Api.getInstance().posts(accId, maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result> feedbackResp) { + if (feedbackResp.data != null && feedbackResp.data.getList() != null && feedbackResp.data.getList().size() > 0) { + Intent intent = new Intent(UserInfoActivity.this, TiktokActivityMe.class); + intent.putExtra("userId", accId); + startActivity(intent); + } else { + ToastX.showShortToast(R.string.no_voom_txt); + } + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast(msg); + } + }); + } + + + private void toBlack() { + ContactRepo.addBlackList( + userInfoData.data.getAccount(), + new FetchCallback() { + @Override + public void onSuccess(@Nullable Void param) { +// ALog.d(LIB_TAG, TAG, "addBlack,onSuccess"); +// changeUser(); + addBlack(userInfoData.data.getAccount()); + if (u != null && !u.getIsFollow().equals(0)) { + Api.getInstance().followCancel(accId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result feedbackResp) { + RxBus.getInstance().post(IMUIKitConfig.CHANGE_FOLLOW_USER); + } + + @Override + public void onError(int code, String msg) { + RxBus.getInstance().post(IMUIKitConfig.CHANGE_FOLLOW_USER); + } + }); + } else { + RxBus.getInstance().post(IMUIKitConfig.CHANGE_FOLLOW_USER); + } + viewBinding.moreIv.setVisibility(View.GONE); + viewBinding.starIv.setVisibility(View.GONE); + viewBinding.botLy.setVisibility(View.GONE); + viewBinding.blackTv.setVisibility(View.VISIBLE); + } + + @Override + public void onFailed(int code) { +// ALog.d(LIB_TAG, TAG, "addBlack,onFailed:" + code); +// fetchResult.setError(code, ""); + } + + @Override + public void onException(@Nullable Throwable exception) { +// ALog.d(LIB_TAG, TAG, "addBlack,onException"); +// fetchResult.setError(-1, ""); + } + }); + } + + private void addBlack(String account) { + com.netease.yunxin.kit.chatkit.ui.network.Api.getInstance().toBlock(account) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new com.netease.yunxin.kit.chatkit.ui.network.BaseObserver<>() { + @Override + public void onSuccess(com.netease.yunxin.kit.chatkit.ui.network.Result feedbackResp) { + EventCenter.notifyEvent(new ChatBlackEvent(true)); + } + + @Override + public void onError(int code, String msg) { + } + }); + } + + private void toDelete() { + + ContactRepo.deleteFriend( + userInfoData.data.getAccount(), + true, + new FetchCallback() { + @Override + public void onSuccess(@Nullable Void param) { +// ALog.d(LIB_TAG, TAG, "deleteFriend,onSuccess"); +// changeUser(); + //删除会话列表 +// RecentContact recentContact = NIMClient.getService(MsgService.class).queryRecentContact(userInfoData.data.getAccount() + "", SessionTypeEnum.P2P); +// if(recentContact!=null){ +// ConversationViewModel viewModel = new ViewModelProvider(UserInfoActivity.this).get(ConversationViewModel.class); +// viewModel.deleteConversation(1,recentContact.get); +// } +// NIMClient.getService(MsgService.class).clearServerHistory(userInfoData.data.getAccount(), SessionTypeEnum.P2P, false); + NIMClient.getService(MsgService.class).deleteRecentContact2(userInfoData.data.getAccount(), SessionTypeEnum.P2P); //删除会话 没删记录 + NIMClient.getService(MsgService.class).clearServerHistory(userInfoData.data.getAccount(), SessionTypeEnum.P2P, false); //删记录 + EventCenter.notifyEvent(new ChatDeleteEvent()); + Api.getInstance().followCancel(accId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result feedbackResp) { + viewBinding.moreIv.setVisibility(View.GONE); + viewBinding.starIv.setVisibility(View.GONE); + viewBinding.friendLy.setVisibility(View.GONE); + viewBinding.addFriendsTv.setVisibility(View.VISIBLE); + finish(); + + RxBus.getInstance().post(IMUIKitConfig.CHANGE_FOLLOW_USER); + } + + @Override + public void onError(int code, String msg) { + viewBinding.moreIv.setVisibility(View.GONE); + viewBinding.starIv.setVisibility(View.GONE); + viewBinding.friendLy.setVisibility(View.GONE); + viewBinding.addFriendsTv.setVisibility(View.VISIBLE); + finish(); + + RxBus.getInstance().post(IMUIKitConfig.CHANGE_FOLLOW_USER); + } + }); + + } + + @Override + public void onFailed(int code) { +// ALog.d(LIB_TAG, TAG, "deleteFriend,onFailed:" + code); +// fetchResult.setError(code, ""); + } + + @Override + public void onException(@Nullable Throwable exception) { +// ALog.d(LIB_TAG, TAG, "deleteFriend,onException"); +// fetchResult.setError(-1, ""); + } + }); + + cancelFollow(userInfoData.data.getAccount()); + + + } + + private void changeUser() { + viewModel + .getFriendFetchResult() + .observe( + this, + mapFetchResult -> { + if (mapFetchResult.getLoadStatus() == LoadStatus.Success) { + userInfoData = mapFetchResult.getData(); +// contactInfoView.setData(userInfoData); + LogUtils.i("获取到的用户信息:" + GsonUtils.beanToJSONString(userInfoData)); + changeUserInfo(); + } else { + if (!NetworkUtils.isConnected()) { + Toast.makeText(this, com.netease.yunxin.kit.contactkit.ui.R.string.contact_network_error_tip, Toast.LENGTH_SHORT).show(); + } + } + }); + } + + protected void goChat() { + XKitRouter.withKey(RouterConstant.PATH_CHAT_P2P_PAGE) + .withParam(RouterConstant.CHAT_ID_KRY, userInfoData.data.getAccount()) + .withContext(UserInfoActivity.this) + .navigate(); + finish(); + } + + + private void initData() { + blackListViewModel = new ViewModelProvider(this).get(BlackListViewModel.class); + + viewModel = new ViewModelProvider(this).get(UserInfoViewModel.class); + accId = getIntent().getStringExtra("uid"); + if (TextUtils.isEmpty(accId)) { + accId = getIntent().getStringExtra("userId"); + if (TextUtils.isEmpty(accId)) { + finish(); + } + } + IMApplication.schemeUserId = null; + + if (accId.equals(IMKitClient.account()) || ContactRepo.isFriend(accId)) { //是好友或者是自己 可以修改备注 + viewBinding.editUserNicknameIv.setVisibility(View.VISIBLE); + } + + viewBinding.editUserNicknameIv.setOnClickListener(v -> { + if (accId.equals(IMKitClient.account())) { + EditUserInfoActivity.launch(getApplicationContext(), Constant.EDIT_NAME, launcher); + } else { + EditFriendUserInfoActivity.launch(getApplicationContext(), accId, u.getIsFollow(), launcher); + } + } + ); + viewBinding.userNameTv.setOnClickListener(v -> { + if (accId.equals(IMKitClient.account())) { + EditUserInfoActivity.launch(getApplicationContext(), Constant.EDIT_NAME, launcher); + } + if (ContactRepo.isFriend(accId)) { + EditFriendUserInfoActivity.launch(getApplicationContext(), accId, u.getIsFollow(), launcher); + } + + + }); + viewBinding.signTv.setOnClickListener(v -> { + if (accId.equals(IMKitClient.account())) { + EditUserInfoActivity.launch(getApplicationContext(), Constant.EDIT_SIGN, launcher); + } + }); + + viewModel.init(accId); + viewModel + .getFriendFetchResult() + .observe( + this, + mapFetchResult -> { + if (mapFetchResult.getLoadStatus() == LoadStatus.Success) { + userInfoData = mapFetchResult.getData(); +// contactInfoView.setData(userInfoData); + LogUtils.i("获取到的用户信息:" + GsonUtils.beanToJSONString(userInfoData)); + changeUserInfo(); + getUserInfo(accId); + } else { + if (!NetworkUtils.isConnected()) { + Toast.makeText(this, com.netease.yunxin.kit.contactkit.ui.R.string.contact_network_error_tip, Toast.LENGTH_SHORT).show(); + } + } + }); + viewModel + .getUserInfoLiveData() + .observe( + this, + userInfoResult -> { + if (userInfoResult.getLoadStatus() == LoadStatus.Finish + && userInfoResult.getData() != null) { + for (UserInfo userInfo : userInfoResult.getData()) { + if (TextUtils.equals(userInfo.getAccount(), accId)) { + if (userInfoData != null) { + userInfoData.data = userInfo; + LogUtils.i("获取到的用户信息1:" + GsonUtils.beanToJSONString(userInfoData)); + +// contactInfoView.setData(userInfoData); + } + } + } + } else { + if (!NetworkUtils.isConnected()) { + Toast.makeText(this, com.netease.yunxin.kit.contactkit.ui.R.string.contact_network_error_tip, Toast.LENGTH_SHORT).show(); + } + } + }); + viewModel + .getFriendChangeLiveData() + .observe( + this, + result -> { + if (result.getLoadStatus() == LoadStatus.Finish) { + viewModel.fetchData(accId); + } + }); + viewModel.fetchData(accId); + + //获取用户相簿 + Api.getInstance().getUserAlbums(accId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>>() { + @Override + public void onSuccess(Result> o) { + LogUtils.d("OOOO==" + o.data); + if (o.data.size() > 0) { +// if (pageSize == 1) { +// userAlbumBeans.clear(); +// userAlbumBeans.add(new UserAlbumBean()); +// } + userAlbumBeans.clear(); + List result = o.data.subList(0, o.data.size() > 4 ? 4 : o.data.size()); + userAlbumBeans.addAll(result); + + + commonAdapterAlbum.notifyDataSetChanged(); + } + + } + + @Override + public void onError(int code, String msg) { + + } + }); + } + + private List userAlbumBeans = new ArrayList<>(); + CommonAdapter commonAdapterAlbum; + + private void setUserAlbums() { + GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 4); + viewBinding.recyclerAlbums.setLayoutManager(gridLayoutManager); + commonAdapterAlbum = new CommonAdapter(this, R.layout.item_useralbum_list, userAlbumBeans) { + @Override + public void convert(ViewHolder holder, UserAlbumBean s, int index) { + TextView tvAdd = holder.getView(R.id.tv_useralbum_add); + AppCompatImageView ivalbum = holder.getView(R.id.iv_useralbum_img); + TextView tvNumber = holder.getView(R.id.tv_useralbum_number); + AppCompatImageView ivType = holder.getView(R.id.iv_useralbum_type); + TextView tvTitle = holder.getView(R.id.tv_useralbum_title); + FrameLayout layoutPwd = holder.getView(R.id.layout_useralbum_inputpwd); + ivType.setVisibility(View.GONE); + tvAdd.setVisibility(View.GONE); + layoutPwd.setVisibility(View.GONE); + tvNumber.setVisibility(View.GONE); + tvTitle.setVisibility(View.GONE); + Glide.with(UserInfoActivity.this).load(s.getLastFile()).into(ivalbum); + ivalbum.setOnClickListener(view -> { + toUserAlbumList(); + }); + } + }; + viewBinding.recyclerAlbums.setAdapter(commonAdapterAlbum); + + + } + + public void toUserAlbumList() { + startActivity(new Intent(UserInfoActivity.this, UserPhotoListActivity.class).putExtra("userId", accId).putExtra("userName", userInfoData.data.getUserInfoName())); + } + + + private void changeUserInfo() { + RequestOptions requestOptions; + requestOptions = new RequestOptions() + .error(R.mipmap.default_head_img) + .skipMemoryCache(false) + .diskCacheStrategy(DiskCacheStrategy.RESOURCE); + + viewBinding.moreIv.setVisibility(View.GONE); + viewBinding.starIv.setVisibility(View.GONE); + viewBinding.friendLy.setVisibility(View.GONE); + viewBinding.addFriendsTv.setVisibility(View.GONE); + if (userInfoData != null && userInfoData.data != null) { + String name = + TextUtils.isEmpty(userInfoData.data.getName()) ? userInfoData.data.getAccount() : userInfoData.data.getName(); + if (userInfoData.data.getAccount().equals(IMKitClient.account())) { + //自己 + viewBinding.friendLy.setVisibility(View.GONE); + viewBinding.addFriendsTv.setVisibility(View.GONE); +// viewBinding.logoIv.setData( +// userInfoData.data.getAvatar(), name, AvatarColor.avatarColor(IMKitClient.account())); + Glide.with(this) + .load(userInfoData.data.getAvatar()) + .placeholder(R.mipmap.default_head_img) + .error(R.mipmap.default_head_img) + .apply(requestOptions).into(viewBinding.logoIv); + viewBinding.btnAlbum.setText(getString(R.string.userphoto_title, getString(R.string.wo_txt))); + } else { + if (userInfoData.isFriend && !userInfoData.isBlack) { + viewBinding.friendLy.setVisibility(View.VISIBLE); + viewBinding.moreIv.setVisibility(View.VISIBLE); + viewBinding.starIv.setVisibility(View.VISIBLE); + } else { + if (!userInfoData.isBlack) { + viewBinding.addFriendsTv.setVisibility(View.VISIBLE); + } + } + Glide.with(this) + .load(userInfoData.data.getAvatar()) + .placeholder(R.mipmap.default_head_img) + .error(R.mipmap.default_head_img) + .apply(requestOptions).into(viewBinding.logoIv); + viewBinding.btnAlbum.setText(getString(R.string.userphoto_title, "TA")); +// viewBinding.logoIv.setData( +// userInfoData.data.getAvatar(), name, AvatarColor.avatarColor(userInfoData.data.getAccount())); + } + + if (userInfoData.isBlack) { + viewBinding.blackTv.setVisibility(View.VISIBLE); + viewBinding.botLy.setVisibility(View.GONE); + } else { + viewBinding.blackTv.setVisibility(View.GONE); + viewBinding.botLy.setVisibility(View.VISIBLE); + } + + if (userInfoData.friendInfo != null) { + alias = userInfoData.friendInfo.getAlias(); + } + if (TextUtils.isEmpty(alias)) { + viewBinding.userNameTv.setText(name); + } else { + viewBinding.userNameTv.setText(name + "(" + alias + ")"); + } + + + if (!TextUtils.isEmpty(userInfoData.data.getBirthday())) { + viewBinding.broTv.setText(userInfoData.data.getBirthday()); + viewBinding.broTv.setVisibility(View.VISIBLE); + } else { + viewBinding.broTv.setVisibility(View.GONE); + } + + if (!TextUtils.isEmpty(userInfoData.data.getSignature())) { + viewBinding.signTv.setText(userInfoData.data.getSignature()); + viewBinding.signTv.setVisibility(View.VISIBLE); + } else { + viewBinding.signTv.setVisibility(View.GONE); + } + + viewBinding.signTv.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { + @Override + public boolean onPreDraw() { + //这个监听的回调是异步的,在监听完以后一定要把绘制监听移除,不然这个会一直回调,导致界面错乱 + viewBinding.signTv.getViewTreeObserver().removeOnPreDrawListener(this); + int line = viewBinding.signTv.getLineCount(); + if (line > 1) { + viewBinding.signTv.setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL); + } + + return true; + } + }); + } + } + +// +// private void addNewFriend() { +// viewModel.addFriend( +// userInfoData.data.getAccount(), +// FriendVerifyType.AgreeAdd, +// new FetchCallback() { +// @Override +// public void onSuccess(@Nullable Void param) { +// viewModel.fetchData(userInfoData.data.getAccount()); +// Toast.makeText( +// UserInfoActivity.this, +// getResources().getString(com.netease.yunxin.kit.contactkit.ui.R.string.add_friend_operate_success), +// Toast.LENGTH_SHORT) +// .show(); +// } +// +// @Override +// public void onFailed(int code) { +// String tips = getResources().getString(com.netease.yunxin.kit.contactkit.ui.R.string.add_friend_operate_fail); +// Toast.makeText( +// UserInfoActivity.this, +// String.format(tips, String.valueOf(code)), +// Toast.LENGTH_SHORT) +// .show(); +// } +// +// @Override +// public void onException(@Nullable Throwable exception) { +// String tips = getResources().getString(com.netease.yunxin.kit.contactkit.ui.R.string.add_friend_operate_fail); +// Toast.makeText( +// UserInfoActivity.this, +// String.format(tips, exception.getMessage()), +// Toast.LENGTH_SHORT) +// .show(); +// } +// }); +// } + + LoginBean u; + + private void getUserInfo(String user_uid) { + + Api.getInstance().userInfo(user_uid) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result feedbackResp) { + u = feedbackResp.data; + if (!TextUtils.isEmpty(u.getPostHomepageBackground())) { + String pram = u.getPostHomepageBackground(); + + String url = pram; + if (!url.startsWith("http")) { + url = IMUIKitConfig.OSS_URL + pram; + } + try { + Glide.with(UserInfoActivity.this) + .load(url) + .error(R.color.color_themeblue) + .placeholder(R.color.color_themeblue) + .into(viewBinding.forBgIv); + } catch (Exception e) { + e.printStackTrace(); + } + } + +// viewBinding.userNameTv.setText(userInfoData.getName()); + RequestOptions requestOptions; + requestOptions = new RequestOptions() + .error(R.mipmap.default_head_img) + .skipMemoryCache(false) + .diskCacheStrategy(DiskCacheStrategy.RESOURCE); + try { + + + Glide.with(UserInfoActivity.this) + .load(u.getUserAvatarFileName()) + .placeholder(R.mipmap.default_head_img) + .error(R.mipmap.default_head_img) + .apply(requestOptions).into(viewBinding.logoIv); + } catch (Exception e) { + e.printStackTrace(); + } + if (u.getIsFollow().equals(0)) { + viewBinding.starIv.setImageResource(R.mipmap.user_star_f_img); + } else { + viewBinding.starIv.setImageResource(R.mipmap.user_star_t_img); + + } + + if (getIntent().getBooleanExtra("isGroup", false)) { + LogUtils.i("从群里进来的"); + if (u.getAllowAddFriendByGroup().equals(1)) { + LogUtils.i("从群里进来的允许添加好友"); + + } else { + //不是好友 不允许从群添加 隐藏添加按钮 + LogUtils.i("从群里进来的不允许添加好友"); + // LogUtils.i("从群里进来的不允许添加好友:"+userInfoData.isFriend); + if (userInfoData != null && !userInfoData.isFriend) { + viewBinding.addFriendsTv.setVisibility(View.GONE); + + } + } + } + + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); +// WidgetUtils.showToast(getActivity(), msg, WidgetUtils.ToastType.ERROR); + } + }); + + + } + + public boolean onTouchEvent(MotionEvent event) { + if (null != this.getCurrentFocus()) { + /** + * 点击空白位置 隐藏软键盘 + */ + InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + return mInputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0); + } + return super.onTouchEvent(event); + } + +} diff --git a/app/src/main/java/com/dskj/rbchat/custom/ChatStickerViewHolder.java b/app/src/main/java/com/dskj/rbchat/custom/ChatStickerViewHolder.java new file mode 100644 index 0000000..ab93b98 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/custom/ChatStickerViewHolder.java @@ -0,0 +1,185 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.custom; + +import android.content.Context; +import android.content.Intent; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; + +import androidx.annotation.NonNull; +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.bumptech.glide.request.RequestOptions; +import com.dskj.rbchat.BuildConfig; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.ChatMessageStickerViewBinding; +import com.dskj.rbchat.databinding.LinkImageBinding; +import com.dskj.rbchat.model.AlbumBean; +import com.dskj.rbchat.model.CircleShareBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.ApiService; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.voom.TiktoInfokActivity; +import com.netease.yunxin.kit.chatkit.ui.common.MessageHelper; +import com.netease.yunxin.kit.chatkit.ui.common.RxBus; +import com.netease.yunxin.kit.chatkit.ui.custom.StickerAttachment; +import com.netease.yunxin.kit.chatkit.ui.databinding.ChatBaseMessageViewHolderBinding; +import com.netease.yunxin.kit.chatkit.ui.fun.view.message.viewholder.FunChatBaseMessageViewHolder; +import com.netease.yunxin.kit.chatkit.ui.model.ChatMessageBean; +import com.netease.yunxin.kit.chatkit.ui.model.RxBusToVoom; +import com.netease.yunxin.kit.chatkit.ui.view.emoji.StickerManager; +import com.netease.yunxin.kit.chatkit.ui.view.message.viewholder.ChatBaseMessageViewHolder; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.corekit.im.IMKitClient; + +import java.util.ArrayList; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class ChatStickerViewHolder extends FunChatBaseMessageViewHolder { + private static final String TAG = "ChatStickerViewHolder"; + + private LinkImageBinding binding; + + public ChatStickerViewHolder(@NonNull ChatBaseMessageViewHolderBinding parent, int viewType) { + super(parent, viewType); + } + + @Override + public void addViewToMessageContainer() { + binding = + LinkImageBinding.inflate( + LayoutInflater.from(parent.getContext()), getMessageContainer()); + } + + @Override + public void bindData(ChatMessageBean message, ChatMessageBean lastMessage) { + super.bindData(message, lastMessage); + currentMessage = message; + String name = message.getMessageData().getMessage().getAttachStr(); + LogUtils.i("获取到的数据0:"+ name); + + +// StickerAttachment attachment = +// (StickerAttachment) message.getMessageData().getMessage().getAttachment(); +// LogUtils.i("获取到的数据111:"+ GsonUtils.beanToJSONString(attachment)); +// LogUtils.i("获取到的数据2222:"+ GsonUtils.beanToJSONString(message)); + CircleShareBean circleShareBean = GsonUtils.getObjFromJSON(name,CircleShareBean.class); + StickerAttachment attachment = circleShareBean.data; + LogUtils.i("获取到的数据1:"+ GsonUtils.beanToJSONString(attachment)); + + if (attachment == null) { + return; + } + if(message.getMessageData().getMessage().getFromAccount().equals(IMKitClient.account())) { + binding.bigBg.setBackgroundResource(com.netease.yunxin.kit.chatkit.ui.R.drawable.fun_message_send_bg); + }else{ + binding.bigBg.setBackgroundResource(com.netease.yunxin.kit.chatkit.ui.R.drawable.fun_message_receive_bg); + + } + + if(!TextUtils.isEmpty(attachment.getPicPath())) { + if (attachment.getPicPath().startsWith("http")) { + + Glide.with(parent.getContext()) + .load(attachment.getPicPath()) + .error(com.netease.yunxin.kit.chatkit.ui.R.drawable.chat_zhanwei_img) + .placeholder(com.netease.yunxin.kit.chatkit.ui.R.drawable.chat_zhanwei_img) + .into(binding.picIc); + + } else { +// imgs.add(ApiService.URL1 + dongtaiBean.getPicture1()); + Glide.with(parent.getContext()) + .load(ApiService.URL + attachment.getPicPath()) + .error(com.netease.yunxin.kit.chatkit.ui.R.drawable.chat_zhanwei_img) + .placeholder(com.netease.yunxin.kit.chatkit.ui.R.drawable.chat_zhanwei_img) + .into(binding.picIc); + } + }else if(!TextUtils.isEmpty(attachment.getVideoPath())){ + if (!attachment.getVideoPath().startsWith("http")) { + Glide.with(parent.getContext()) + .load(ApiService.URL + attachment.getVideoPath()) + .error(com.netease.yunxin.kit.chatkit.ui.R.drawable.chat_zhanwei_img) + .placeholder(com.netease.yunxin.kit.chatkit.ui.R.drawable.chat_zhanwei_img) + .into(binding.picIc); + binding.videoTag.setVisibility(View.GONE); + } else { + String picUrl = attachment.getVideoPath().replace("video_input", "video_output") + "?x-oss-process=video/snapshot,t_7000,w_300,h_400,f_jpg,m_fast"; + Glide.with(parent.getContext()) + .load(picUrl) + .error(com.netease.yunxin.kit.chatkit.ui.R.drawable.chat_zhanwei_img) + .placeholder(com.netease.yunxin.kit.chatkit.ui.R.drawable.chat_zhanwei_img) + .into(binding.picIc); + binding.videoTag.setVisibility(View.VISIBLE); + + } + + }else{ +// binding.picIc.setIm + } + + binding.card1.setOnClickListener(v -> getPostInfo(attachment,binding.card1.getContext())); + + binding.titleTv.setText(attachment.getPostContent()+""); + binding.userNameTv.setText(attachment.getUserNickname()+""); + if(!TextUtils.isEmpty(attachment.getUserAvatar())) { + if (attachment.getUserAvatar().startsWith("http")) { + Glide.with(parent.getContext()) + .load(attachment.getUserAvatar()) + .placeholder(R.mipmap.default_head_img) + .error(R.mipmap.default_head_img) + .into(binding.headIv); + } else { + LogUtils.i("头像地址:" + String.format(IMUIKitConfig.AVATAR_DOWNLOAD_CONTROLLER_URL_ROOT, attachment.getUserAvatar())); + Glide.with(parent.getContext()) + .load(String.format(IMUIKitConfig.AVATAR_DOWNLOAD_CONTROLLER_URL_ROOT, attachment.getUserAvatar())) + .placeholder(R.mipmap.default_head_img) + .error(R.mipmap.default_head_img) + .into(binding.headIv); + } + } + } + + private void getPostInfo(StickerAttachment attachment, Context context) { + Api.getInstance().postsInfo(attachment.getPostId()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + AlbumBean albumBean = feedbackResp.data; + Intent intent = new Intent(binding.card1.getContext(), TiktoInfokActivity.class); + intent.putExtra("bean",albumBean); + context.startActivity(intent); + + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast(msg); + + } + }); + } + + + + @Override + public void onMessageRevokeStatus(ChatMessageBean data) { + super.onMessageRevokeStatus(data); + if (revokedViewBinding != null) { + if (!MessageHelper.revokeMsgIsEdit(data)) { + revokedViewBinding.tvAction.setVisibility(View.GONE); + } + } + } +} diff --git a/app/src/main/java/com/dskj/rbchat/custom/CustomDatePickerNew.java b/app/src/main/java/com/dskj/rbchat/custom/CustomDatePickerNew.java new file mode 100644 index 0000000..19ecc7d --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/custom/CustomDatePickerNew.java @@ -0,0 +1,578 @@ +package com.dskj.rbchat.custom; + +import android.app.Dialog; +import android.content.Context; +import android.text.TextUtils; +import android.view.Gravity; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.dskj.rbchat.R; +import com.dskj.rbchat.utils.DataUtils; +import com.netease.yunxin.kit.common.ui.widgets.datepicker.CustomDatePicker; +import com.netease.yunxin.kit.common.ui.widgets.datepicker.DateFormatUtils; +import com.netease.yunxin.kit.common.ui.widgets.datepicker.PickerView; + +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +public class CustomDatePickerNew implements View.OnClickListener, PickerView.OnSelectListener { + private Context mContext; + private CustomDatePicker.Callback mCallback; + private Calendar mBeginTime; + private Calendar mEndTime; + private Calendar mSelectedTime; + private boolean mCanDialogShow; + private Dialog mPickerDialog; + private PickerView mDpvYear; + private PickerView mDpvMonth; + private PickerView mDpvDay; + private PickerView mDpvHour; + private PickerView mDpvMinute; + private TextView mTvHourUnit; + private TextView mTvMinuteUnit; + private int mBeginYear; + private int mBeginMonth; + private int mBeginDay; + private int mBeginHour; + private int mBeginMinute; + private int mEndYear; + private int mEndMonth; + private int mEndDay; + private int mEndHour; + private int mEndMinute; + private List mYearUnits; + private List mMonthUnits; + private List mDayUnits; + private List mHourUnits; + private List mMinuteUnits; + private DecimalFormat mDecimalFormat; + private boolean mCanShowPreciseTime; + private int mScrollUnits; + private static final int SCROLL_UNIT_HOUR = 1; + private static final int SCROLL_UNIT_MINUTE = 2; + private static final int MAX_MINUTE_UNIT = 59; + private static final int MAX_HOUR_UNIT = 23; + private static final int MAX_MONTH_UNIT = 12; + private static final long LINKAGE_DELAY_DEFAULT = 100L; + private ImageView ivCloseKey; + private TextView datasTv; + private ImageView editIv; + private LinearLayout bottpmLy; + private String riqi; + + public CustomDatePickerNew(Context context, CustomDatePicker.Callback callback, String beginDateStr, String endDateStr,String riqi) { + this(context, callback, DateFormatUtils.str2Long(beginDateStr, true), DateFormatUtils.str2Long(endDateStr, true),riqi); + } + + public CustomDatePickerNew(Context context, CustomDatePicker.Callback callback, long beginTimestamp, long endTimestamp,String riqi) { + this.mYearUnits = new ArrayList(); + this.mMonthUnits = new ArrayList(); + this.mDayUnits = new ArrayList(); + this.mHourUnits = new ArrayList(); + this.mMinuteUnits = new ArrayList(); + this.riqi = riqi; + + this.mDecimalFormat = new DecimalFormat("00"); + this.mScrollUnits = 3; + if (context != null && callback != null && beginTimestamp < endTimestamp) { + this.mContext = context; + this.mCallback = callback; + this.mBeginTime = Calendar.getInstance(); + this.mBeginTime.setTimeInMillis(beginTimestamp); + this.mEndTime = Calendar.getInstance(); + this.mEndTime.setTimeInMillis(endTimestamp); + this.mSelectedTime = Calendar.getInstance(); + this.initView(); + this.initData(); + this.mCanDialogShow = true; + } else { + this.mCanDialogShow = false; + } + } + + private void initView() { + this.mPickerDialog = new Dialog(this.mContext, R.style.date_picker_dialog); + this.mPickerDialog.requestWindowFeature(1); + this.mPickerDialog.setContentView(R.layout.dialog_date_picker); + Window window = this.mPickerDialog.getWindow(); + if (window != null) { + WindowManager.LayoutParams lp = window.getAttributes(); + lp.gravity = Gravity.BOTTOM; + lp.width = WindowManager.LayoutParams.MATCH_PARENT; + lp.height = WindowManager.LayoutParams.WRAP_CONTENT; + window.setAttributes(lp); + } + + this.mPickerDialog.findViewById(R.id.tv_cancel).setOnClickListener(this); + this.mPickerDialog.findViewById(R.id.tv_confirm).setOnClickListener(this); + this.mTvHourUnit = (TextView)this.mPickerDialog.findViewById(R.id.tv_hour_unit); + this.mTvMinuteUnit = (TextView)this.mPickerDialog.findViewById(R.id.tv_minute_unit); + this.mDpvYear = (PickerView)this.mPickerDialog.findViewById(R.id.dpv_year); + this.mDpvYear.setOnSelectListener(this); + this.mDpvMonth = (PickerView)this.mPickerDialog.findViewById(R.id.dpv_month); + this.mDpvMonth.setOnSelectListener(this); + this.mDpvDay = (PickerView)this.mPickerDialog.findViewById(R.id.dpv_day); + this.mDpvDay.setOnSelectListener(this); + this.mDpvHour = (PickerView)this.mPickerDialog.findViewById(R.id.dpv_hour); + this.mDpvHour.setOnSelectListener(this); + this.mDpvMinute = (PickerView)this.mPickerDialog.findViewById(R.id.dpv_minute); + this.mDpvMinute.setOnSelectListener(this); + + + this.ivCloseKey = (ImageView) this.mPickerDialog.findViewById(R.id.iv_close_key); + this.datasTv = (TextView) this.mPickerDialog.findViewById(R.id.datas_tv); + this.editIv = (ImageView) this.mPickerDialog.findViewById(R.id.edit_iv); + this.bottpmLy = (LinearLayout) this.mPickerDialog.findViewById(R.id.bottpm_ly); + this.ivCloseKey.setOnClickListener(this); + this.editIv.setOnClickListener(v -> showBottom()); + this.datasTv.setOnClickListener(v -> showBottom()); + //格式化日期 + if(TextUtils.isEmpty(riqi)){ + this.datasTv.setText(R.string.zwszsr_txt); + }else { + Long time = DataUtils.dateToStampNew(riqi); + this.datasTv.setText(DataUtils.getCurrentTimeTypeNoline1(datasTv.getContext(), time)); + } + } + + private void showBottom() { + if(this.bottpmLy.getVisibility() == View.GONE){ + this.bottpmLy.setVisibility(View.VISIBLE); + this.editIv.setVisibility(View.GONE); + } + } + + public void onClick(View v) { + int id = v.getId(); + if (id != R.id.tv_cancel && id!=R.id.iv_close_key && id == R.id.tv_confirm && this.mCallback != null) { + this.mCallback.onTimeSelected(this.mSelectedTime.getTimeInMillis()); + } + + if (this.mPickerDialog != null && this.mPickerDialog.isShowing()) { + this.mPickerDialog.dismiss(); + } + + } + + public void onSelect(View view, String selected) { + if (view != null && !TextUtils.isEmpty(selected)) { + int timeUnit; + try { + timeUnit = Integer.parseInt(selected); + } catch (Throwable var6) { + return; + } + + int id = view.getId(); + if (id == R.id.dpv_year) { + this.mSelectedTime.set(1, timeUnit); + this.linkageMonthUnit(true, 100L); + } else if (id == R.id.dpv_month) { + int lastSelectedMonth = this.mSelectedTime.get(2) + 1; + this.mSelectedTime.add(2, timeUnit - lastSelectedMonth); + this.linkageDayUnit(true, 100L); + } else if (id == R.id.dpv_day) { + this.mSelectedTime.set(5, timeUnit); + this.linkageHourUnit(true, 100L); + } else if (id == R.id.dpv_hour) { + this.mSelectedTime.set(11, timeUnit); + this.linkageMinuteUnit(true); + } else if (id == R.id.dpv_minute) { + this.mSelectedTime.set(12, timeUnit); + } + + } + } + + private void initData() { + this.mSelectedTime.setTimeInMillis(this.mBeginTime.getTimeInMillis()); + this.mBeginYear = this.mBeginTime.get(1); + this.mBeginMonth = this.mBeginTime.get(2) + 1; + this.mBeginDay = this.mBeginTime.get(5); + this.mBeginHour = this.mBeginTime.get(11); + this.mBeginMinute = this.mBeginTime.get(12); + this.mEndYear = this.mEndTime.get(1); + this.mEndMonth = this.mEndTime.get(2) + 1; + this.mEndDay = this.mEndTime.get(5); + this.mEndHour = this.mEndTime.get(11); + this.mEndMinute = this.mEndTime.get(12); + boolean canSpanYear = this.mBeginYear != this.mEndYear; + boolean canSpanMon = !canSpanYear && this.mBeginMonth != this.mEndMonth; + boolean canSpanDay = !canSpanMon && this.mBeginDay != this.mEndDay; + boolean canSpanHour = !canSpanDay && this.mBeginHour != this.mEndHour; + boolean canSpanMinute = !canSpanHour && this.mBeginMinute != this.mEndMinute; + if (canSpanYear) { + this.initDateUnits(12, this.mBeginTime.getActualMaximum(5), 23, 59); + } else if (canSpanMon) { + this.initDateUnits(this.mEndMonth, this.mBeginTime.getActualMaximum(5), 23, 59); + } else if (canSpanDay) { + this.initDateUnits(this.mEndMonth, this.mEndDay, 23, 59); + } else if (canSpanHour) { + this.initDateUnits(this.mEndMonth, this.mEndDay, this.mEndHour, 59); + } else if (canSpanMinute) { + this.initDateUnits(this.mEndMonth, this.mEndDay, this.mEndHour, this.mEndMinute); + } + + } + + private void initDateUnits(int endMonth, int endDay, int endHour, int endMinute) { + int i; + for(i = this.mBeginYear; i <= this.mEndYear; ++i) { + this.mYearUnits.add(String.valueOf(i)); + } + + for(i = this.mBeginMonth; i <= endMonth; ++i) { + this.mMonthUnits.add(this.mDecimalFormat.format((long)i)); + } + + for(i = this.mBeginDay; i <= endDay; ++i) { + this.mDayUnits.add(this.mDecimalFormat.format((long)i)); + } + + if ((this.mScrollUnits & 1) != 1) { + this.mHourUnits.add(this.mDecimalFormat.format((long)this.mBeginHour)); + } else { + for(i = this.mBeginHour; i <= endHour; ++i) { + this.mHourUnits.add(this.mDecimalFormat.format((long)i)); + } + } + + if ((this.mScrollUnits & 2) != 2) { + this.mMinuteUnits.add(this.mDecimalFormat.format((long)this.mBeginMinute)); + } else { + for(i = this.mBeginMinute; i <= endMinute; ++i) { + this.mMinuteUnits.add(this.mDecimalFormat.format((long)i)); + } + } + + this.mDpvYear.setDataList(this.mYearUnits); + this.mDpvYear.setSelected(0); + this.mDpvMonth.setDataList(this.mMonthUnits); + this.mDpvMonth.setSelected(0); + this.mDpvDay.setDataList(this.mDayUnits); + this.mDpvDay.setSelected(0); + this.mDpvHour.setDataList(this.mHourUnits); + this.mDpvHour.setSelected(0); + this.mDpvMinute.setDataList(this.mMinuteUnits); + this.mDpvMinute.setSelected(0); + this.setCanScroll(); + } + + private void setCanScroll() { + this.mDpvYear.setCanScroll(this.mYearUnits.size() > 1); + this.mDpvMonth.setCanScroll(this.mMonthUnits.size() > 1); + this.mDpvDay.setCanScroll(this.mDayUnits.size() > 1); + this.mDpvHour.setCanScroll(this.mHourUnits.size() > 1 && (this.mScrollUnits & 1) == 1); + this.mDpvMinute.setCanScroll(this.mMinuteUnits.size() > 1 && (this.mScrollUnits & 2) == 2); + } + + private void linkageMonthUnit(final boolean showAnim, final long delay) { + int selectedYear = this.mSelectedTime.get(1); + int minMonth; + int maxMonth; + if (this.mBeginYear == this.mEndYear) { + minMonth = this.mBeginMonth; + maxMonth = this.mEndMonth; + } else if (selectedYear == this.mBeginYear) { + minMonth = this.mBeginMonth; + maxMonth = 12; + } else if (selectedYear == this.mEndYear) { + minMonth = 1; + maxMonth = this.mEndMonth; + } else { + minMonth = 1; + maxMonth = 12; + } + + this.mMonthUnits.clear(); + + int selectedMonth; + for(selectedMonth = minMonth; selectedMonth <= maxMonth; ++selectedMonth) { + this.mMonthUnits.add(this.mDecimalFormat.format((long)selectedMonth)); + } + + this.mDpvMonth.setDataList(this.mMonthUnits); + selectedMonth = this.getValueInRange(this.mSelectedTime.get(2) + 1, minMonth, maxMonth); + this.mSelectedTime.set(2, selectedMonth - 1); + this.mDpvMonth.setSelected(selectedMonth - minMonth); + if (showAnim) { + this.mDpvMonth.startAnim(); + } + + this.mDpvMonth.postDelayed(new Runnable() { + public void run() { + CustomDatePickerNew.this.linkageDayUnit(showAnim, delay); + } + }, delay); + } + + private void linkageDayUnit(final boolean showAnim, final long delay) { + int selectedYear = this.mSelectedTime.get(1); + int selectedMonth = this.mSelectedTime.get(2) + 1; + int minDay; + int maxDay; + if (this.mBeginYear == this.mEndYear && this.mBeginMonth == this.mEndMonth) { + minDay = this.mBeginDay; + maxDay = this.mEndDay; + } else if (selectedYear == this.mBeginYear && selectedMonth == this.mBeginMonth) { + minDay = this.mBeginDay; + maxDay = this.mSelectedTime.getActualMaximum(5); + } else if (selectedYear == this.mEndYear && selectedMonth == this.mEndMonth) { + minDay = 1; + maxDay = this.mEndDay; + } else { + minDay = 1; + maxDay = this.mSelectedTime.getActualMaximum(5); + } + + this.mDayUnits.clear(); + + int selectedDay; + for(selectedDay = minDay; selectedDay <= maxDay; ++selectedDay) { + this.mDayUnits.add(this.mDecimalFormat.format((long)selectedDay)); + } + + this.mDpvDay.setDataList(this.mDayUnits); + selectedDay = this.getValueInRange(this.mSelectedTime.get(5), minDay, maxDay); + this.mSelectedTime.set(5, selectedDay); + this.mDpvDay.setSelected(selectedDay - minDay); + if (showAnim) { + this.mDpvDay.startAnim(); + } + + this.mDpvDay.postDelayed(new Runnable() { + public void run() { + CustomDatePickerNew.this.linkageHourUnit(showAnim, delay); + } + }, delay); + } + + private void linkageHourUnit(final boolean showAnim, long delay) { + if ((this.mScrollUnits & 1) == 1) { + int selectedYear = this.mSelectedTime.get(1); + int selectedMonth = this.mSelectedTime.get(2) + 1; + int selectedDay = this.mSelectedTime.get(5); + int minHour; + int maxHour; + if (this.mBeginYear == this.mEndYear && this.mBeginMonth == this.mEndMonth && this.mBeginDay == this.mEndDay) { + minHour = this.mBeginHour; + maxHour = this.mEndHour; + } else if (selectedYear == this.mBeginYear && selectedMonth == this.mBeginMonth && selectedDay == this.mBeginDay) { + minHour = this.mBeginHour; + maxHour = 23; + } else if (selectedYear == this.mEndYear && selectedMonth == this.mEndMonth && selectedDay == this.mEndDay) { + minHour = 0; + maxHour = this.mEndHour; + } else { + minHour = 0; + maxHour = 23; + } + + this.mHourUnits.clear(); + + int selectedHour; + for(selectedHour = minHour; selectedHour <= maxHour; ++selectedHour) { + this.mHourUnits.add(this.mDecimalFormat.format((long)selectedHour)); + } + + this.mDpvHour.setDataList(this.mHourUnits); + selectedHour = this.getValueInRange(this.mSelectedTime.get(11), minHour, maxHour); + this.mSelectedTime.set(11, selectedHour); + this.mDpvHour.setSelected(selectedHour - minHour); + if (showAnim) { + this.mDpvHour.startAnim(); + } + } + + this.mDpvHour.postDelayed(new Runnable() { + public void run() { + CustomDatePickerNew.this.linkageMinuteUnit(showAnim); + } + }, delay); + } + + private void linkageMinuteUnit(boolean showAnim) { + if ((this.mScrollUnits & 2) == 2) { + int selectedYear = this.mSelectedTime.get(1); + int selectedMonth = this.mSelectedTime.get(2) + 1; + int selectedDay = this.mSelectedTime.get(5); + int selectedHour = this.mSelectedTime.get(11); + int minMinute; + int maxMinute; + if (this.mBeginYear == this.mEndYear && this.mBeginMonth == this.mEndMonth && this.mBeginDay == this.mEndDay && this.mBeginHour == this.mEndHour) { + minMinute = this.mBeginMinute; + maxMinute = this.mEndMinute; + } else if (selectedYear == this.mBeginYear && selectedMonth == this.mBeginMonth && selectedDay == this.mBeginDay && selectedHour == this.mBeginHour) { + minMinute = this.mBeginMinute; + maxMinute = 59; + } else if (selectedYear == this.mEndYear && selectedMonth == this.mEndMonth && selectedDay == this.mEndDay && selectedHour == this.mEndHour) { + minMinute = 0; + maxMinute = this.mEndMinute; + } else { + minMinute = 0; + maxMinute = 59; + } + + this.mMinuteUnits.clear(); + + int selectedMinute; + for(selectedMinute = minMinute; selectedMinute <= maxMinute; ++selectedMinute) { + this.mMinuteUnits.add(this.mDecimalFormat.format((long)selectedMinute)); + } + + this.mDpvMinute.setDataList(this.mMinuteUnits); + selectedMinute = this.getValueInRange(this.mSelectedTime.get(12), minMinute, maxMinute); + this.mSelectedTime.set(12, selectedMinute); + this.mDpvMinute.setSelected(selectedMinute - minMinute); + if (showAnim) { + this.mDpvMinute.startAnim(); + } + } + + this.setCanScroll(); + } + + private int getValueInRange(int value, int minValue, int maxValue) { + if (value < minValue) { + return minValue; + } else { + return value > maxValue ? maxValue : value; + } + } + + public void show(String dateStr) { + if (this.canShow() && !TextUtils.isEmpty(dateStr)) { + if (this.setSelectedTime(dateStr, false)) { + this.mPickerDialog.show(); + } + + } + } + + private boolean canShow() { + return this.mCanDialogShow && this.mPickerDialog != null; + } + + public boolean setSelectedTime(String dateStr, boolean showAnim) { + return this.canShow() && !TextUtils.isEmpty(dateStr) && this.setSelectedTime(DateFormatUtils.str2Long(dateStr, this.mCanShowPreciseTime), showAnim); + } + + public void show(long timestamp) { + if (this.canShow()) { + if (this.setSelectedTime(timestamp, false)) { + this.mPickerDialog.show(); + } + + } + } + + public boolean setSelectedTime(long timestamp, boolean showAnim) { + if (!this.canShow()) { + return false; + } else { + if (timestamp < this.mBeginTime.getTimeInMillis()) { + timestamp = this.mBeginTime.getTimeInMillis(); + } else if (timestamp > this.mEndTime.getTimeInMillis()) { + timestamp = this.mEndTime.getTimeInMillis(); + } + + this.mSelectedTime.setTimeInMillis(timestamp); + this.mYearUnits.clear(); + + for(int i = this.mBeginYear; i <= this.mEndYear; ++i) { + this.mYearUnits.add(String.valueOf(i)); + } + + this.mDpvYear.setDataList(this.mYearUnits); + this.mDpvYear.setSelected(this.mSelectedTime.get(1) - this.mBeginYear); + this.linkageMonthUnit(showAnim, showAnim ? 100L : 0L); + return true; + } + } + + public void setCancelable(boolean cancelable) { + if (this.canShow()) { + this.mPickerDialog.setCancelable(cancelable); + } + } + + public void setCanShowPreciseTime(boolean canShowPreciseTime) { + if (this.canShow()) { + if (canShowPreciseTime) { + this.initScrollUnit(); + this.mDpvHour.setVisibility(View.VISIBLE); + this.mTvHourUnit.setVisibility(View.VISIBLE); + this.mDpvMinute.setVisibility(View.VISIBLE); + this.mTvMinuteUnit.setVisibility(View.VISIBLE); + } else { + this.initScrollUnit(1, 2); + this.mDpvHour.setVisibility(View.GONE); + this.mTvHourUnit.setVisibility(View.GONE); + this.mDpvMinute.setVisibility(View.GONE); + this.mTvMinuteUnit.setVisibility(View.GONE); + } + + this.mCanShowPreciseTime = canShowPreciseTime; + } + } + + private void initScrollUnit(Integer... units) { + if (units != null && units.length != 0) { + Integer[] var2 = units; + int var3 = units.length; + + for(int var4 = 0; var4 < var3; ++var4) { + int unit = var2[var4]; + this.mScrollUnits ^= unit; + } + } else { + this.mScrollUnits = 3; + } + + } + + public void setScrollLoop(boolean canLoop) { + if (this.canShow()) { + this.mDpvYear.setCanScrollLoop(canLoop); + this.mDpvMonth.setCanScrollLoop(canLoop); + this.mDpvDay.setCanScrollLoop(canLoop); + this.mDpvHour.setCanScrollLoop(canLoop); + this.mDpvMinute.setCanScrollLoop(canLoop); + } + } + + public void setCanShowAnim(boolean canShowAnim) { + if (this.canShow()) { + this.mDpvYear.setCanShowAnim(canShowAnim); + this.mDpvMonth.setCanShowAnim(canShowAnim); + this.mDpvDay.setCanShowAnim(canShowAnim); + this.mDpvHour.setCanShowAnim(canShowAnim); + this.mDpvMinute.setCanShowAnim(canShowAnim); + } + } + + public void onDestroy() { + if (this.mPickerDialog != null) { + this.mPickerDialog.dismiss(); + this.mPickerDialog = null; + this.mDpvYear.onDestroy(); + this.mDpvMonth.onDestroy(); + this.mDpvDay.onDestroy(); + this.mDpvHour.onDestroy(); + this.mDpvMinute.onDestroy(); + } + + } + + public interface Callback { + void onTimeSelected(long var1); + } +} + diff --git a/app/src/main/java/com/dskj/rbchat/custom/PasswordEditText.java b/app/src/main/java/com/dskj/rbchat/custom/PasswordEditText.java new file mode 100644 index 0000000..227a519 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/custom/PasswordEditText.java @@ -0,0 +1,250 @@ +package com.dskj.rbchat.custom; + +import android.content.Context; +import android.content.res.TypedArray; +import android.text.Editable; +import android.text.InputFilter; +import android.text.InputType; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.text.method.HideReturnsTransformationMethod; +import android.text.method.PasswordTransformationMethod; +import android.util.AttributeSet; +import android.view.Gravity; +import android.view.WindowManager; +import android.view.inputmethod.InputMethodManager; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; + +import com.dskj.rbchat.R; + +import java.util.ArrayList; +import java.util.List; + +/** + * Description:密码输入框,也可明文显示,用作输入验证码 + * Created by 禽兽先生 + * Created on 2017/8/17 + */ + +public class PasswordEditText extends RelativeLayout { + private Context mContext; + private EditText mEditText; + private List editTexts; //选用 EditText 而不用 TextView 是因为 EditText 可以密文显示 + private int count = 6; //密码框数量 + private int passwordSize = 24; //密码文本大小 + private boolean showPassword = true; //密码是否密文显示,true 为一直明文显示,false 为 0.5s 后密文显示 + private int bgInputing = R.drawable.bg_inputing; //待输入的密码框的背景 + private int bgInputed = R.drawable.bg_inputed; //非待输入的密码框的背景 + private onCompletionListener mOnCompletionListener; + + public PasswordEditText(Context context) { + this(context, null); + } + + public PasswordEditText(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public PasswordEditText(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + mContext = context; + initAttr(attrs, defStyleAttr); + initView(); + addListener(); + } + + /** + * Description:初始化自定义属性 + * Date:2017/8/19 + */ + private void initAttr(AttributeSet attrs, int defStyleAttr) { + TypedArray mTypeArray = mContext.getTheme().obtainStyledAttributes(attrs, R.styleable.PasswordEditText, defStyleAttr, 0); + count = mTypeArray.getInt(R.styleable.PasswordEditText_count, 6); + passwordSize = mTypeArray.getInt(R.styleable.PasswordEditText_passwordSize, 24); + showPassword = mTypeArray.getBoolean(R.styleable.PasswordEditText_showPassword, true); + bgInputing = mTypeArray.getResourceId(R.styleable.PasswordEditText_bgInputing, R.drawable.bg_inputing); + bgInputed = mTypeArray.getResourceId(R.styleable.PasswordEditText_bgInputed, R.drawable.bg_inputed); + } + + /** + * Description:添加控件,密码框和不可见的输入框 + * Date:2017/8/18 + */ + private void initView() { + //新建一个容器 + LinearLayout mLinearLayout = new LinearLayout(mContext); + LinearLayout.LayoutParams linearLayoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); + mLinearLayout.setLayoutParams(linearLayoutParams); + mLinearLayout.setGravity(Gravity.CENTER); + mLinearLayout.setOrientation(LinearLayout.HORIZONTAL); + + //根据 count 添加一定数量的密码框 + editTexts = new ArrayList<>(); + LinearLayout.LayoutParams textViewParams = new LinearLayout.LayoutParams(dip2px(mContext, 45), dip2px(mContext, 50)); + textViewParams.setMargins(dip2px(mContext, 5), + dip2px(mContext, 0), + dip2px(mContext, 5), + dip2px(mContext, 0)); + for (int i = 0; i < count; i++) { + EditText mEditText = new EditText(mContext); + mEditText.setLayoutParams(textViewParams); + mEditText.setBackgroundResource(R.drawable.bg_inputed); //设置背景 + mEditText.setGravity(Gravity.CENTER); //设置文本显示位置 + mEditText.setTextSize(passwordSize); //设置文本大小 + mEditText.setTextColor(getResources().getColor(R.color.color_333333)); + mEditText.setFocusable(false); //设置无法获得焦点 + mEditText.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) { + if(TextUtils.isEmpty(mEditText.getText().toString().trim())){ + mEditText.setBackgroundResource(R.drawable.bg_inputed); //设置背景 + }else{ + mEditText.setBackgroundResource(R.drawable.bg_inputing); //设置背景 + + } + } + + @Override + public void afterTextChanged(Editable s) { + + } + }); + editTexts.add(mEditText); + + mLinearLayout.addView(mEditText); + } +// editTexts.get(0).setBackgroundResource(bgInputing); + + //添加不可见的 EditText + LinearLayout.LayoutParams editTextParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT); + + mEditText = new EditText(mContext); + mEditText.setLayoutParams(editTextParams); + mLinearLayout.setGravity(Gravity.CENTER); + mEditText.setCursorVisible(false); //设置输入游标不可见 + mEditText.setBackgroundResource(0); //设置透明背景,让下划线不可见 + mEditText.setGravity(Gravity.CENTER); //设置文本显示位置 + mEditText.setAlpha(0.0f); //设置为全透明,让输入的内容不可见 + mEditText.setInputType(InputType.TYPE_CLASS_NUMBER); //设置只能输入数字 + mEditText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(count)}); //限制输入长度 + + addView(mLinearLayout); + addView(mEditText); + } + + /** + * Description:为输入框添加监听器 + * Date:2017/8/18 + */ + private void addListener() { + mEditText.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + + /** + * + * @param s 输入后的文本 + * @param start 输入的位置 + * @param before 输入的位置上之前的字符数 + * @param count 输入的位置上新输入的字符数 + */ + @Override + public void onTextChanged(CharSequence s, final int start, int before, int count) { + if (before == 0 && count == 1) { + //为对应显示框设置对应显示内容 + editTexts.get(start).setText(s.subSequence(start, start + 1)); + //修改输入了内容的密码框的背景 +// editTexts.get(start).setBackgroundResource(bgInputing); + //如果还有下一个密码框,将其背景设置为待输入的背景 + if (start + 1 < editTexts.size()) { +// editTexts.get(start + 1).setBackgroundResource(bgInputing); + if (mOnCompletionListener != null) { + mOnCompletionListener.onCompletion(s.toString()); + } + } else { + //输入完成后关闭软键盘 + InputMethodManager imm = (InputMethodManager) mContext.getSystemService( + Context.INPUT_METHOD_SERVICE); + imm.hideSoftInputFromWindow(mEditText.getWindowToken(), 0); + //如果添加了监听器,则回调 + if (mOnCompletionListener != null) { + mOnCompletionListener.onCompletion(s.toString()); + } + } + //如果需要密文显示,则 0.5s 后设置为密文显示 + if (!showPassword) { + editTexts.get(start).postDelayed(new Runnable() { + @Override + public void run() { + editTexts.get(start).setTransformationMethod(PasswordTransformationMethod.getInstance()); + } + }, 500); + } + //如果上一个显示框还不是密文显示的话,立即将其设置为密文显示,前提是需要密文显示 + if (!showPassword && start > 0 && editTexts.get(start - 1).getTransformationMethod() instanceof HideReturnsTransformationMethod) { + editTexts.get(start - 1).setTransformationMethod(PasswordTransformationMethod.getInstance()); + } + } else if (before == 1 && count == 0) { + //清除退格位置对应显示框的内容 + editTexts.get(start).setText(""); + //将其退格的位置设置为明文显示 + editTexts.get(start).setTransformationMethod(HideReturnsTransformationMethod.getInstance()); + //设置退格位置的背景 + for (EditText editText : editTexts) { +// editText.setBackgroundResource(bgInputed); + } + if (mOnCompletionListener != null) { + mOnCompletionListener.onCompletion(s.toString()); + } + +// editTexts.get(start).setBackgroundResource(bgInputing); + } + } + + @Override + public void afterTextChanged(Editable s) { + } + }); + } + + public void setOnCompleteListener(onCompletionListener onCompletionListener) { + this.mOnCompletionListener = onCompletionListener; + } + + /** + * Description:获取屏幕宽度 + * Date:2017/8/18 + */ + private int getScreenWidth(Context context) { + WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + return wm.getDefaultDisplay().getWidth()-dip2px(mContext,40); + } + + /** + * 根据手机的分辨率从 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 interface onCompletionListener { + void onCompletion(String code); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/dialog/ActionConfirmDialog.java b/app/src/main/java/com/dskj/rbchat/dialog/ActionConfirmDialog.java new file mode 100644 index 0000000..a548954 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/dialog/ActionConfirmDialog.java @@ -0,0 +1,139 @@ +package com.dskj.rbchat.dialog; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.Gravity; +import android.view.View; +import android.view.ViewTreeObserver; +import android.view.Window; +import android.view.WindowManager; +import android.widget.TextView; + +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.DialogActionConfirmBinding; + +/** + * 通用弹窗 + */ +public class ActionConfirmDialog extends Dialog { + private final Context context; + String title; + String content; + String cancel = null; + String sure = null; + boolean showCancel = true; + OnToActionListener onToActionListener; + DialogActionConfirmBinding actionConfirmBinding; + + public interface OnToActionListener { + void toSumbit(); + + void toCancel(); + + } + + public void setOnToActionListener(OnToActionListener onNextCallListener) { + this.onToActionListener = onNextCallListener; + } + + public ActionConfirmDialog(Context context, String title, String content, boolean showCancel) { + super(context, R.style.MaterialDesignDialog); + actionConfirmBinding = DialogActionConfirmBinding.inflate(getLayoutInflater()); + setContentView(actionConfirmBinding.getRoot()); + this.title = title; + this.context = context; + this.content = content; + this.showCancel = showCancel; + } + + public ActionConfirmDialog(Context context, String content, boolean showCancel) { + super(context, R.style.MaterialDesignDialog); + actionConfirmBinding = DialogActionConfirmBinding.inflate(getLayoutInflater()); + setContentView(actionConfirmBinding.getRoot()); + + this.context = context; + this.content = content; + this.showCancel = showCancel; + } + + public ActionConfirmDialog(Context context, String content, String cancel, String sure) { + super(context, R.style.MaterialDesignDialog); + actionConfirmBinding = DialogActionConfirmBinding.inflate(getLayoutInflater()); + setContentView(actionConfirmBinding.getRoot()); + + this.context = context; + this.content = content; + this.cancel = cancel; + this.sure = sure; + } + + public ActionConfirmDialog(Context context, String content, String cancel, String sure, boolean showCancel) { + super(context, R.style.MaterialDesignDialog); + actionConfirmBinding = DialogActionConfirmBinding.inflate(getLayoutInflater()); + setContentView(actionConfirmBinding.getRoot()); + + this.context = context; + this.content = content; + this.cancel = cancel; + this.sure = sure; + this.showCancel = showCancel; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + actionConfirmBinding.contentTv.setText(content); + actionConfirmBinding.contentTv.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { + @Override + public boolean onPreDraw() { + //这个监听的回调是异步的,在监听完以后一定要把绘制监听移除,不然这个会一直回调,导致界面错乱 + actionConfirmBinding.contentTv.getViewTreeObserver().removeOnPreDrawListener(this); + int line = actionConfirmBinding.contentTv.getLineCount(); + if (line > 1) { + actionConfirmBinding.contentTv.setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL); + } + + return true; + } + }); + if (!TextUtils.isEmpty(title)) { + actionConfirmBinding.cancelTv.setVisibility(View.VISIBLE); + actionConfirmBinding.cancelTv.setText(title); + } + if (!TextUtils.isEmpty(cancel)) { + actionConfirmBinding.cancelTv.setText(cancel); + } + if (!TextUtils.isEmpty(sure)) { + actionConfirmBinding.sumbitTv.setText(sure); + } + if (!showCancel) { + actionConfirmBinding.cancelTv.setVisibility(View.GONE); +// actionConfirmBinding.lineV.setVisibility(View.GONE); + } + + actionConfirmBinding.sumbitTv.setOnClickListener(v -> { + dismiss(); + if (onToActionListener != null) { + onToActionListener.toSumbit(); + } + }); + actionConfirmBinding.cancelTv.setOnClickListener(v -> { + dismiss(); + if (onToActionListener != null) { + onToActionListener.toCancel(); + } + }); + + Window window = getWindow(); + WindowManager.LayoutParams wlp = window.getAttributes(); + wlp.gravity = Gravity.CENTER; + wlp.width = WindowManager.LayoutParams.WRAP_CONTENT; + wlp.height = WindowManager.LayoutParams.WRAP_CONTENT; + + window.setAttributes(wlp); + + } + +} diff --git a/app/src/main/java/com/dskj/rbchat/dialog/ActionConfirmDialog1.java b/app/src/main/java/com/dskj/rbchat/dialog/ActionConfirmDialog1.java new file mode 100644 index 0000000..cfb9715 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/dialog/ActionConfirmDialog1.java @@ -0,0 +1,128 @@ +package com.dskj.rbchat.dialog; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.Gravity; +import android.view.View; +import android.view.ViewTreeObserver; +import android.view.Window; +import android.view.WindowManager; +import android.widget.TextView; + +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.DialogActionConfirmBinding; + +/** + * 通用弹窗 + */ +public class ActionConfirmDialog1 extends Dialog { + private final Context context; + String title; + String content; + String cancel = null; + String sure = null; + boolean showCancel = true; + OnToActionListener onToActionListener; + DialogActionConfirmBinding actionConfirmBinding; + + public interface OnToActionListener { + void toSumbit(); + + void toCancel(); + + } + + public void setOnToActionListener(OnToActionListener onNextCallListener) { + this.onToActionListener = onNextCallListener; + } + + + public ActionConfirmDialog1(Context context, String content, boolean showCancel) { + super(context, R.style.MaterialDesignDialog); + actionConfirmBinding = DialogActionConfirmBinding.inflate(getLayoutInflater()); + setContentView(actionConfirmBinding.getRoot()); + this.context = context; + this.content = content; + this.showCancel = showCancel; + } + + public ActionConfirmDialog1(Context context, String content, String cancel, String sure) { + super(context, R.style.MaterialDesignDialog); + actionConfirmBinding = DialogActionConfirmBinding.inflate(getLayoutInflater()); + setContentView(actionConfirmBinding.getRoot()); + + this.context = context; + this.content = content; + this.cancel = cancel; + this.sure = sure; + } + + public ActionConfirmDialog1(Context context, String content, String cancel, String sure, boolean showCancel) { + super(context, R.style.MaterialDesignDialog); + actionConfirmBinding = DialogActionConfirmBinding.inflate(getLayoutInflater()); + setContentView(actionConfirmBinding.getRoot()); + this.context = context; + this.content = content; + this.cancel = cancel; + this.sure = sure; + this.showCancel = showCancel; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + actionConfirmBinding.contentTv.setText(content); + actionConfirmBinding.contentTv.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { + @Override + public boolean onPreDraw() { + //这个监听的回调是异步的,在监听完以后一定要把绘制监听移除,不然这个会一直回调,导致界面错乱 + actionConfirmBinding.contentTv.getViewTreeObserver().removeOnPreDrawListener(this); + int line = actionConfirmBinding.contentTv.getLineCount(); + if (line > 1) { + actionConfirmBinding.contentTv.setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL); + } + + return true; + } + }); + if (!TextUtils.isEmpty(cancel)) { + actionConfirmBinding.cancelTv.setText(cancel); + } + if (!TextUtils.isEmpty(sure)) { + actionConfirmBinding.sumbitTv.setText(sure); + } + if (!showCancel) { + actionConfirmBinding.cancelTv.setVisibility(View.GONE); +// actionConfirmBinding.lineV.setVisibility(View.GONE); + } + + actionConfirmBinding.sumbitTv.setOnClickListener(v -> { + dismiss(); + if (onToActionListener != null) { + onToActionListener.toSumbit(); + } + }); + actionConfirmBinding.cancelTv.setOnClickListener(v -> { + dismiss(); + if (onToActionListener != null) { + onToActionListener.toCancel(); + } + }); + setCanceledOnTouchOutside(false); + setCancelable(false); + Window window = getWindow(); + WindowManager.LayoutParams wlp = window.getAttributes(); + wlp.gravity = Gravity.CENTER; + wlp.width = WindowManager.LayoutParams.WRAP_CONTENT; + wlp.height = WindowManager.LayoutParams.WRAP_CONTENT; + + window.setAttributes(wlp); + } + + public void setSureBg(int drawableResource) { + actionConfirmBinding.sumbitTv.setBackgroundResource(drawableResource); + } + +} diff --git a/app/src/main/java/com/dskj/rbchat/dialog/ActionInputConfirmDialog.java b/app/src/main/java/com/dskj/rbchat/dialog/ActionInputConfirmDialog.java new file mode 100644 index 0000000..97443ec --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/dialog/ActionInputConfirmDialog.java @@ -0,0 +1,111 @@ +package com.dskj.rbchat.dialog; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.Editable; +import android.text.InputFilter; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.view.Gravity; +import android.view.View; +import android.view.ViewTreeObserver; +import android.view.Window; +import android.view.WindowManager; +import android.widget.EditText; + +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.DialogActionConfirmBinding; +import com.dskj.rbchat.databinding.DialogActionInputconfirmBinding; +import com.dskj.rbchat.utils.CharInputFilter; +import com.dskj.rbchat.utils.LogUtils; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * 输入框弹窗 + */ +public class ActionInputConfirmDialog extends Dialog { + private final Context context; + String title; + String content; + String cancel = null; + String sure = null; + OnToActionListener onToActionListener; + DialogActionInputconfirmBinding binding; + + public interface OnToActionListener { + void toSumbit(String value); + + void toCancel(); + + } + + public void setOnToActionListener(OnToActionListener onNextCallListener) { + this.onToActionListener = onNextCallListener; + } + + + public ActionInputConfirmDialog(Context context, String content, String cancel, String sure) { + super(context, R.style.MaterialDesignDialog); + binding = DialogActionInputconfirmBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + this.context = context; + this.content = content; + this.cancel = cancel; + this.sure = sure; + } + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding.contentTv.setText(content); + binding.contentTv.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { + @Override + public boolean onPreDraw() { + //这个监听的回调是异步的,在监听完以后一定要把绘制监听移除,不然这个会一直回调,导致界面错乱 + binding.contentTv.getViewTreeObserver().removeOnPreDrawListener(this); + int line = binding.contentTv.getLineCount(); + if (line > 1) { + binding.contentTv.setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL); + } + + return true; + } + }); + if (!TextUtils.isEmpty(cancel)) { + binding.cancelTv.setText(cancel); + } + if (!TextUtils.isEmpty(sure)) { + binding.sumbitTv.setText(sure); + } + ; + + binding.sumbitTv.setOnClickListener(v -> { + dismiss(); + if (onToActionListener != null) { + onToActionListener.toSumbit(binding.contentInput.getText().toString()); + } + }); + binding.cancelTv.setOnClickListener(v -> { + dismiss(); + if (onToActionListener != null) { + onToActionListener.toCancel(); + } + }); + + Window window = getWindow(); + WindowManager.LayoutParams wlp = window.getAttributes(); + wlp.gravity = Gravity.CENTER; + wlp.width = WindowManager.LayoutParams.WRAP_CONTENT; + wlp.height = WindowManager.LayoutParams.WRAP_CONTENT; + + window.setAttributes(wlp); + + binding.contentInput.setFilters(new InputFilter[]{new CharInputFilter(Pattern.compile("[\\u4e00-\\u9fa5]"))}); + + + } +} diff --git a/app/src/main/java/com/dskj/rbchat/dialog/MianMiDialog.java b/app/src/main/java/com/dskj/rbchat/dialog/MianMiDialog.java new file mode 100644 index 0000000..51760c3 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/dialog/MianMiDialog.java @@ -0,0 +1,77 @@ +package com.dskj.rbchat.dialog; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.Gravity; +import android.view.View; +import android.view.ViewTreeObserver; +import android.view.Window; +import android.view.WindowManager; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.DialogMianmiConfirmBinding; +import com.netease.yunxin.kit.common.ui.utils.ToastX; + +/** + * 通用弹窗 + */ +public class MianMiDialog extends Dialog { + private final Context context; + OnToActionListener onToActionListener; + DialogMianmiConfirmBinding dialogMianmiConfirmBinding; + public interface OnToActionListener { + void toOpen(); + void toXieYi(); + + } + + public void setOnToActionListener(OnToActionListener onNextCallListener) { + this.onToActionListener = onNextCallListener; + } + + + public MianMiDialog(Context context) { + super(context, R.style.MaterialDesignDialog); + dialogMianmiConfirmBinding = DialogMianmiConfirmBinding.inflate(getLayoutInflater()); + setContentView(dialogMianmiConfirmBinding.getRoot()); + this.context = context; + + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + + dialogMianmiConfirmBinding.sumbitTv.setOnClickListener(v -> { + if(!dialogMianmiConfirmBinding.registerFormAgreeLisenseCb.isChecked()){ + ToastX.showShortToast(getContext().getString(R.string.mianmixieyi_tips_txt)); + return; + } + dismiss(); + if(onToActionListener!=null){ + onToActionListener.toOpen(); + } + }); + dialogMianmiConfirmBinding.registerFormToClause.setOnClickListener(v -> { + if(onToActionListener!=null){ + onToActionListener.toXieYi(); + } + }); + + Window window = getWindow(); + WindowManager.LayoutParams wlp = window.getAttributes(); + wlp.gravity = Gravity.CENTER; + wlp.width = WindowManager.LayoutParams.WRAP_CONTENT; + wlp.height = WindowManager.LayoutParams.WRAP_CONTENT; + + window.setAttributes(wlp); + } + +} diff --git a/app/src/main/java/com/dskj/rbchat/dialog/MianMiXieyiDialog.java b/app/src/main/java/com/dskj/rbchat/dialog/MianMiXieyiDialog.java new file mode 100644 index 0000000..a79c77b --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/dialog/MianMiXieyiDialog.java @@ -0,0 +1,54 @@ +package com.dskj.rbchat.dialog; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.view.Gravity; +import android.view.Window; +import android.view.WindowManager; +import android.webkit.WebView; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.DialogMianmiXieyiBinding; +import com.netease.yunxin.kit.common.ui.utils.ToastX; + +/** + * 通用弹窗 + */ +public class MianMiXieyiDialog extends Dialog { + private final Context context; + DialogMianmiXieyiBinding dialogMianmiXieyiBinding; + public MianMiXieyiDialog(Context context) { + super(context, R.style.MaterialDesignDialog); + dialogMianmiXieyiBinding = DialogMianmiXieyiBinding.inflate(getLayoutInflater()); + setContentView(dialogMianmiXieyiBinding.getRoot()); + this.context = context; + + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + dialogMianmiXieyiBinding.sumbitTv.setOnClickListener(v -> { + dismiss(); + + }); + + dialogMianmiXieyiBinding.webivew.loadUrl(IMUIKitConfig.MIANMI_AGREEMENT_CN_URL); + + Window window = getWindow(); + WindowManager.LayoutParams wlp = window.getAttributes(); + wlp.gravity = Gravity.CENTER; + wlp.width = WindowManager.LayoutParams.WRAP_CONTENT; + wlp.height = WindowManager.LayoutParams.WRAP_CONTENT; + + window.setAttributes(wlp); + } + +} diff --git a/app/src/main/java/com/dskj/rbchat/dialog/PayCashDialog.java b/app/src/main/java/com/dskj/rbchat/dialog/PayCashDialog.java new file mode 100644 index 0000000..bf92cac --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/dialog/PayCashDialog.java @@ -0,0 +1,499 @@ +package com.dskj.rbchat.dialog; + +import android.annotation.SuppressLint; +import android.app.Dialog; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.os.CountDownTimer; +import android.provider.Settings; +import android.text.TextUtils; +import android.view.Gravity; +import android.view.View; +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 androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.dskj.rbchat.R; +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.databinding.DialogPayCashBinding; +import com.dskj.rbchat.login.ChongZhiActivity; +import com.dskj.rbchat.main.mine.ChangeAccoutActionActivity; +import com.dskj.rbchat.model.RegisteredBean; +import com.dskj.rbchat.model.WalletBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.pay.CollectionActivity; +import com.dskj.rbchat.pay.CollectionAndPaymentActivity; +import com.dskj.rbchat.utils.AppUtils; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.wallet.PaySettingActivity; +import com.dskj.rbchat.wallet.SetPayPasswordActivity; +import com.netease.yunxin.kit.common.ui.utils.ToastX; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class PayCashDialog extends Dialog implements View.OnClickListener { + private final Context context; + private final String money; + SelectPayTypeDialog.OnToTypeListener onToTypeListener; + private WalletBean walletBean; + int isShowFinger = 0; + int payType = 0; + int cashType = 0; //0,1,2 + boolean showNumber; + CommonAdapter commonAdapter; + boolean isToNext = true; + String userName; + String tipsTxt = ""; + OnListItemClickListener onNextCallListener; + DialogPayCashBinding dialogPayCashBinding; + + + public interface OnListItemClickListener { + void onPayPass(String position); + + void onChangeFinger(); + + void dimess(); + } + + private ArrayList keyboardList;//数字列表 + private String psw = "";//密码 + + public PayCashDialog(Context context, String data, boolean showNumber, int payType, WalletBean walletBean, + SelectPayTypeDialog.OnToTypeListener onToTypeListener, int isShowFinger, String userName) { + super(context, R.style.dialog_style); + dialogPayCashBinding = DialogPayCashBinding.inflate(getLayoutInflater()); + setContentView(dialogPayCashBinding.getRoot()); + this.context = context; + this.money = data;//要提现金额 + this.showNumber = showNumber; + this.onToTypeListener = onToTypeListener; + this.walletBean = walletBean; + this.payType = payType; + this.userName = userName; + this.isShowFinger = isShowFinger; + setCanceledOnTouchOutside(true); + } + + + public PayCashDialog(Context context, String data, boolean showNumber, int payType, WalletBean walletBean, + SelectPayTypeDialog.OnToTypeListener onToTypeListener, int isShowFinger, String userName, String tipsTxt) { + super(context, R.style.dialog_style); + dialogPayCashBinding = DialogPayCashBinding.inflate(getLayoutInflater()); + setContentView(dialogPayCashBinding.getRoot()); + this.context = context; + this.money = data;//要提现金额 + this.showNumber = showNumber; + this.onToTypeListener = onToTypeListener; + this.walletBean = walletBean; + this.payType = payType; + this.userName = userName; + this.isShowFinger = isShowFinger; + this.tipsTxt = tipsTxt; + setCanceledOnTouchOutside(true); + } + + + public PayCashDialog(Context context, String data, boolean showNumber, int payType, WalletBean walletBean, + SelectPayTypeDialog.OnToTypeListener onToTypeListener, int isShowFinger, String userName, int cashType) { + super(context, R.style.dialog_style); + dialogPayCashBinding = DialogPayCashBinding.inflate(getLayoutInflater()); + setContentView(dialogPayCashBinding.getRoot()); + this.context = context; + this.money = data;//要提现金额 + this.showNumber = showNumber; + this.onToTypeListener = onToTypeListener; + this.walletBean = walletBean; + this.payType = payType; + this.userName = userName; + this.isShowFinger = isShowFinger; + this.cashType = cashType; + setCanceledOnTouchOutside(true); + } + + public PayCashDialog(Context context, String data, boolean showNumber, int payType, WalletBean walletBean, + SelectPayTypeDialog.OnToTypeListener onToTypeListener, int isShowFinger, String userName, String tipsTxt, int cashType) { + super(context, R.style.dialog_style); + dialogPayCashBinding = DialogPayCashBinding.inflate(getLayoutInflater()); + setContentView(dialogPayCashBinding.getRoot()); + this.context = context; + this.money = data;//要提现金额 + this.showNumber = showNumber; + this.onToTypeListener = onToTypeListener; + this.walletBean = walletBean; + this.payType = payType; + this.userName = userName; + this.isShowFinger = isShowFinger; + this.cashType = cashType; + this.tipsTxt = tipsTxt; + + setCanceledOnTouchOutside(true); + } + + @SuppressLint("SetTextI18n") + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + Window window = this.getWindow(); +// window.requestFeature(Window.FEATURE_NO_TITLE); + + if (walletBean != null) { +// if (!isSl) { +// dialogPayCashBinding.yueTv.setText(String.format(getContext().getString(R.string.yuee_2f_txt), AppUtils.getQian(walletBean.getGoldCoin()))); +// dialogPayCashBinding.payTypeIv.setImageResource(R.mipmap.wallet_jinbi_img); +// dialogPayCashBinding.payTypeTv.setText(R.string.species_txt); +// } else { +// dialogPayCashBinding.yueTv.setText(String.format(getContext().getString(R.string.yuee_2f_txt), AppUtils.getQian(walletBean.getSilverCoin()))); +// dialogPayCashBinding.payTypeIv.setImageResource(R.mipmap.wallet_yinbi_img); +// dialogPayCashBinding.payTypeTv.setText(R.string.silver_coins_txt); +// +// } + if (cashType == 0) { + dialogPayCashBinding.yueTv.setText(String.format(getContext().getString(R.string.yuee_2f_txt), AppUtils.getQian(walletBean.getGoldCoin()))); + dialogPayCashBinding.payTypeIv.setImageResource(R.mipmap.wallet_jinbi_img); + dialogPayCashBinding.payTypeTv.setText(R.string.species_txt); + } + if (cashType == 1) { + dialogPayCashBinding.yueTv.setText(String.format(getContext().getString(R.string.yuee_2f_txt), AppUtils.getQian(walletBean.getSilverCoin()))); + dialogPayCashBinding.payTypeIv.setImageResource(R.mipmap.wallet_yinbi_img); + dialogPayCashBinding.payTypeTv.setText(R.string.silver_coins_txt); + } + if (cashType == 2) { //礼金 + dialogPayCashBinding.yueTv.setText(String.format(getContext().getString(R.string.yuee_2f_txt), AppUtils.getQian(walletBean.getGiftCoin()))); + dialogPayCashBinding.payTypeIv.setImageResource(R.mipmap.wallet_lijin_img); + dialogPayCashBinding.payTypeTv.setText(R.string.gift_redpacket_txt); + } + } + + if (!TextUtils.isEmpty(tipsTxt)) {//zfjecgxz_txt + dialogPayCashBinding.errorTv.setText(tipsTxt); + dialogPayCashBinding.errorTv.setVisibility(View.VISIBLE); + } + + dialogPayCashBinding.titleTv.setText(userName); + + if (showNumber) { + dialogPayCashBinding.tvTipMoney.setVisibility(View.VISIBLE); + dialogPayCashBinding.tvTipMoney.setText("" + money); + } else { + dialogPayCashBinding.tvTipMoney.setVisibility(View.GONE); + } + dialogPayCashBinding.tvZero.setOnClickListener(this); + dialogPayCashBinding.rlUndo.setOnClickListener(this); + dialogPayCashBinding.sumbitBt.setOnClickListener(this); + dialogPayCashBinding.ivCloseKey.setOnClickListener(this); + + dialogPayCashBinding.mainMoreSettingsSafa.setOnClickListener(this); + + WindowManager.LayoutParams attributes = window.getAttributes(); + attributes.gravity = Gravity.BOTTOM; + attributes.width = WindowManager.LayoutParams.MATCH_PARENT; + attributes.height = WindowManager.LayoutParams.WRAP_CONTENT; + setCancelable(false); + setCanceledOnTouchOutside(false); + initData(); + changePayType(); + if (isShowFinger < 1) { + dialogPayCashBinding.zhiwenzhifuTv.setVisibility(View.INVISIBLE); + } else { + dialogPayCashBinding.zhiwenzhifuTv.setVisibility(View.VISIBLE); + } + if (!DataUtils.get(getContext(), "hasFinger", false)) { + dialogPayCashBinding.zhiwenzhifuTv.setVisibility(View.INVISIBLE); + + } + dialogPayCashBinding.zhiwenzhifuTv.setOnClickListener(this); + + } + + public void setOntoAlbumListener(OnListItemClickListener onNextCallListener) { + this.onNextCallListener = onNextCallListener; + } + + /* + * 初始化 + * */ + private void initData() { + keyboardList = new ArrayList<>(); + for (int i = 1; i < 10; i++) { + keyboardList.add(i + ""); + } + //设置要提现的金额 +// tvTipMoney.setText("提现金额" + money + "元"); + + initAdapter(); + } + + private void initAdapter() { + GridLayoutManager glManager = new GridLayoutManager(context, 3); + dialogPayCashBinding.rvKeyboard.setLayoutManager(glManager); + commonAdapter = new CommonAdapter(getContext(), R.layout.pay_number_item, keyboardList) { + @Override + public void convert(ViewHolder holder, String s, int index) { + TextView tvKeyboard = holder.getView(R.id.top_name); + tvKeyboard.setText(s); + tvKeyboard.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + inputNum(s); + } + }); + } + }; + dialogPayCashBinding.rvKeyboard.setAdapter(commonAdapter); + } + + + /* + * 输入密码 先判断现有密码长度并设置显示输入了密码 添加密码到密码字符串 + * 后判断输入后密码的长度 如果等于6则关闭并请求服务器 + * */ + private void inputNum(String num) { + switch (psw.length()) { + case 0: + dialogPayCashBinding.tvFirstNum.setText(num); + break; + case 1: + dialogPayCashBinding.tvSecondNum.setText(num); + break; + case 2: + dialogPayCashBinding.tvThirdNum.setText(num); + break; + case 3: + dialogPayCashBinding.tvFourthNum.setText(num); + break; + case 4: + dialogPayCashBinding.tvFifthNum.setText(num); + break; + case 5: + dialogPayCashBinding.tvSixthNum.setText(num); + break; + } + psw += num; + } + + // @OnClick({R.id.iv_close_key, R.id.tv_zero, R.id.rl_undo}) + public void onClick(View view) { + switch (view.getId()) { + case R.id.zhiwenzhifu_tv: + if (isShowFinger < 2) { + ActionConfirmDialog actionDialog = new ActionConfirmDialog(getContext(), getContext().getResources().getString(R.string.zhiwen_tips_txt), + getContext().getString(R.string.general_got_it), getContext().getResources().getString(R.string.quluru_txt)); + actionDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + + dismiss(); + Intent intent = new Intent(Settings.ACTION_FINGERPRINT_ENROLL); + getContext().startActivity(intent); + } + + @Override + public void toCancel() { + + } + }); + actionDialog.show(); + } else { + + dismiss(); + if (onNextCallListener != null) { + onNextCallListener.onChangeFinger(); + } + } + break; + case R.id.main_more_settings_safa: +// SelectPayTypeDialog selectPayTypeDialog = new SelectPayTypeDialog(getContext(),payType,walletBean); +// selectPayTypeDialog.setOnToVipListener(type -> { +// payType = type; +// changePayType(); +// if(onToTypeListener!=null){ +// onToTypeListener.toType(type); +// } +// }); +// selectPayTypeDialog.show(); + break; + case R.id.sumbit_bt: + + psw = getStringPassword(); + + if (TextUtils.isEmpty(psw) || psw.length() != 6) { + ToastX.showShortToast(getContext().getString(R.string.dialog_input_paypassword_txt)); + return; + } + + if (isToNext) { + isToNext = false; + checkPayPassword(); + } + break; + case R.id.iv_close_key://关闭dialog +// dismiss(); + if (!(context instanceof CollectionAndPaymentActivity)) { + dismiss(); + } + if (onNextCallListener != null) { + onNextCallListener.dimess(); + } + break; + case R.id.tv_zero://输入0 + inputNum("0"); + break; + case R.id.rl_undo://删除输入的密码 + psw = getStringPassword(); + deleteNum(); + break; + } + } + + private void changePayType() { +// yueTv.setVisibility(View.GONE); +// if(payType == 0){ +// payTypeTv.setText(R.string.species_txt); +// yueTv.setVisibility(View.VISIBLE); +// payTypeIv.setImageResource(R.mipmap.wallet_jinbi_img); +// }else if(payType == 1){ +// payTypeTv.setText("line pay"); +// payTypeIv.setImageResource(R.mipmap.line_pay_img); +// }else{ +// payTypeTv.setText(R.string.neweb_txt); +// payTypeIv.setImageResource(R.mipmap.newebpay_img); +// } + } + + private String getStringPassword() { + return dialogPayCashBinding.tvFirstNum.getText().toString().trim() + dialogPayCashBinding.tvSecondNum.getText().toString().trim() + dialogPayCashBinding.tvThirdNum.getText().toString().trim() + + dialogPayCashBinding.tvFourthNum.getText().toString().trim() + dialogPayCashBinding.tvFifthNum.getText().toString().trim() + dialogPayCashBinding.tvSixthNum.getText().toString().trim(); + } + + + private void checkPayPassword() { + Map maps = new HashMap<>(); + maps.put("payPassword", psw); + Api.getInstance().checkPayPassword(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + + @Override + public void onSuccess(Result feedbackResp) { + if (feedbackResp.data.isCorrect()) { + + dismiss(); + if (onNextCallListener != null) { + onNextCallListener.onPayPass(psw); + } + } else { +// ToastX.showShortToast(getContext().getString(R.string.zfmmcw_txt)); + ActionConfirmDialog actionDialog = new ActionConfirmDialog(getContext(), + getContext().getString(R.string.zfmmcw_txt), getContext().getString(R.string.wangjimima_title_txt), getContext().getString(R.string.chongshi_txt)); + actionDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + while (!TextUtils.isEmpty(getStringPassword())) { + deleteNum(); //清空密码框 + } + + } + + @Override + public void toCancel() { + + //修改支付密码 + Intent intent = new Intent(getContext(), SetPayPasswordActivity.class); + getContext().startActivity(intent); + } + }); + actionDialog.show(); + } + isToNext = true; + } + + @Override + public void onError(int code, String msg) { +// String title = getContext().getString(R.string.zfmmcw_txt); +// if(code==1403){ //支付已被禁 +// title = msg; +// } + ActionConfirmDialog actionDialog = new ActionConfirmDialog(getContext(), + msg, getContext().getString(R.string.wangjimima_title_txt), getContext().getString(R.string.general_got_it)); + actionDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + + } + + @Override + public void toCancel() { +// Intent intent = new Intent(getContext(), ChongZhiActivity.class); +// getContext().startActivity(intent); + //修改支付密码 + + Intent intent = new Intent(getContext(), SetPayPasswordActivity.class); + getContext().startActivity(intent); + } + }); + actionDialog.show(); + + isToNext = true; + } + }); + } + + /* + * 删除密码 根据已输入的密码长度将对应的textview设置为空 + * 并将密码字符串最后一位切割掉 + * */ + private void deleteNum() { + switch (psw.length()) { + case 1: + dialogPayCashBinding.tvFirstNum.setText(""); + psw = ""; + break; + case 2: + dialogPayCashBinding.tvSecondNum.setText(""); + psw = psw.substring(0, 1); + break; + case 3: + dialogPayCashBinding.tvThirdNum.setText(""); + psw = psw.substring(0, 2); + break; + case 4: + dialogPayCashBinding.tvFourthNum.setText(""); + psw = psw.substring(0, 3); + break; + case 5: + dialogPayCashBinding.tvFifthNum.setText(""); + psw = psw.substring(0, 4); + break; + case 6: + dialogPayCashBinding.tvSixthNum.setText(""); + psw = psw.substring(0, 5); + break; + } + } + + @Override + public void dismiss() { + super.dismiss(); + + } + + +} diff --git a/app/src/main/java/com/dskj/rbchat/dialog/PayCashFingerDialog.java b/app/src/main/java/com/dskj/rbchat/dialog/PayCashFingerDialog.java new file mode 100644 index 0000000..2f36261 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/dialog/PayCashFingerDialog.java @@ -0,0 +1,272 @@ +package com.dskj.rbchat.dialog; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.Gravity; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.dskj.rbchat.R; +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.databinding.DialogPayFingerBinding; +import com.dskj.rbchat.model.WalletBean; +import com.dskj.rbchat.pay.CollectionAndPaymentActivity; +import com.dskj.rbchat.utils.AppUtils; + +import java.util.ArrayList; + +public class PayCashFingerDialog extends Dialog implements View.OnClickListener { + private final Context context; + private final String money; +// private ImageView ivCloseKey; +// private TextView zhiwenzhifuTv; +// private TextView titleTv; +// private TextView tvTipMoney; +// private TextView errorTv; +// private LinearLayout mainMoreSettingsSafa; +// private ImageView payTypeIv; +// private TextView payTypeTv; +// private TextView yueTv; +// private ImageView tozhiwenIv; + SelectPayTypeDialog.OnToTypeListener onToTypeListener; + private WalletBean walletBean; + int isShowFinger = 0; + int payType =0; + boolean showNumber; + CommonAdapter commonAdapter; + boolean isToNext = true; + String userName; + int cashType; //礼金新增 + boolean isSl = false; + String tipsTxt = ""; + DialogPayFingerBinding dialogPayFingerBinding; + OnListItemClickListener onNextCallListener; + public interface OnListItemClickListener { + void onChangePassword(); + void toFinger(); + void dimess(); + + } + + private ArrayList keyboardList;//数字列表 + private String psw = "";//密码 + public PayCashFingerDialog(Context context, String data, boolean showNumber, + int payType, WalletBean walletBean, SelectPayTypeDialog.OnToTypeListener onToTypeListener, int isShowFinger,String userName) { + super(context, R.style.dialog_style); + dialogPayFingerBinding = DialogPayFingerBinding.inflate(getLayoutInflater()); + setContentView(dialogPayFingerBinding.getRoot()); + this.context = context; + this.money = data;//要提现金额 + this.showNumber = showNumber; + this.onToTypeListener = onToTypeListener; + this.walletBean = walletBean; + this.payType = payType; + this.isShowFinger =isShowFinger; + this.userName= userName; + + setCanceledOnTouchOutside(true); + } + + public PayCashFingerDialog(Context context, String data, boolean showNumber, + int payType, WalletBean walletBean, SelectPayTypeDialog.OnToTypeListener onToTypeListener, int isShowFinger,String userName,int cashType) { + super(context, R.style.dialog_style); + dialogPayFingerBinding = DialogPayFingerBinding.inflate(getLayoutInflater()); + setContentView(dialogPayFingerBinding.getRoot()); + this.context = context; + this.money = data;//要提现金额 + this.showNumber = showNumber; + this.onToTypeListener = onToTypeListener; + this.walletBean = walletBean; + this.payType = payType; + this.isShowFinger =isShowFinger; + this.userName= userName; + this.cashType = cashType; + + setCanceledOnTouchOutside(true); + } + + public PayCashFingerDialog(Context context, String data, boolean showNumber, + int payType, WalletBean walletBean, SelectPayTypeDialog.OnToTypeListener onToTypeListener, int isShowFinger,String userName,String tipsTxt) { + super(context, R.style.dialog_style); + dialogPayFingerBinding = DialogPayFingerBinding.inflate(getLayoutInflater()); + setContentView(dialogPayFingerBinding.getRoot()); + this.context = context; + this.money = data;//要提现金额 + this.showNumber = showNumber; + this.onToTypeListener = onToTypeListener; + this.walletBean = walletBean; + this.payType = payType; + this.isShowFinger =isShowFinger; + this.userName= userName; + this.tipsTxt = tipsTxt; + + setCanceledOnTouchOutside(true); + } + + public PayCashFingerDialog(Context context, String data, boolean showNumber, + int payType, WalletBean walletBean, SelectPayTypeDialog.OnToTypeListener onToTypeListener, int isShowFinger,String userName,boolean isSl) { + super(context, R.style.dialog_style); + dialogPayFingerBinding = DialogPayFingerBinding.inflate(getLayoutInflater()); + setContentView(dialogPayFingerBinding.getRoot()); + this.context = context; + this.money = data;//要提现金额 + this.showNumber = showNumber; + this.onToTypeListener = onToTypeListener; + this.walletBean = walletBean; + this.payType = payType; + this.isShowFinger =isShowFinger; + this.userName= userName; + this.isSl = isSl; + setCanceledOnTouchOutside(true); + } + + public PayCashFingerDialog(Context context, String data, boolean showNumber, + int payType, WalletBean walletBean, SelectPayTypeDialog.OnToTypeListener onToTypeListener, int isShowFinger,String userName,String tipsTxt,boolean isSl) { + super(context, R.style.dialog_style); + dialogPayFingerBinding = DialogPayFingerBinding.inflate(getLayoutInflater()); + setContentView(dialogPayFingerBinding.getRoot()); + this.context = context; + this.money = data;//要提现金额 + this.showNumber = showNumber; + this.onToTypeListener = onToTypeListener; + this.walletBean = walletBean; + this.payType = payType; + this.isShowFinger =isShowFinger; + this.userName= userName; + this.tipsTxt = tipsTxt; + + this.isSl = isSl; + setCanceledOnTouchOutside(true); + } + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + Window window = this.getWindow(); +// window.requestFeature(Window.FEATURE_NO_TITLE); +// window.setWindowAnimations(R.style.keyboard_dialog_anim); + + +// ivCloseKey = (ImageView) findViewById(R.id.iv_close_key); +// zhiwenzhifuTv = (TextView) findViewById(R.id.zhiwenzhifu_tv); +// titleTv = (TextView) findViewById(R.id.title_tv); +// tvTipMoney = (TextView) findViewById(R.id.tv_tip_money); +// errorTv = (TextView) findViewById(R.id.error_tv); +// mainMoreSettingsSafa = (LinearLayout) findViewById(R.id.main_more_settings_safa); +// payTypeIv = (ImageView) findViewById(R.id.pay_type_iv); +// payTypeTv = (TextView) findViewById(R.id.pay_type_tv); +// yueTv = (TextView) findViewById(R.id.yue_tv); +// tozhiwenIv = (ImageView) findViewById(R.id.tozhiwen_iv); + dialogPayFingerBinding.titleTv.setText(userName); + if(!isSl){ + dialogPayFingerBinding.yueTv.setText(String.format(getContext().getString(R.string.yuee_2f_txt), AppUtils.getQian(walletBean.getGoldCoin()))); + dialogPayFingerBinding.payTypeIv.setImageResource(R.mipmap.wallet_jinbi_img); + dialogPayFingerBinding.payTypeTv.setText(R.string.species_txt); + + }else{ + dialogPayFingerBinding.yueTv.setText(String.format(getContext().getString(R.string.yuee_2f_txt),AppUtils.getQian(walletBean.getSilverCoin()))); + dialogPayFingerBinding.payTypeIv.setImageResource(R.mipmap.wallet_yinbi_img); + dialogPayFingerBinding.payTypeTv.setText(R.string.silver_coins_txt); + } + if(cashType==3){ + dialogPayFingerBinding.yueTv.setText(String.format(getContext().getString(R.string.yuee_2f_txt), AppUtils.getQian(walletBean.getGiftCoin()))); + dialogPayFingerBinding.payTypeIv.setImageResource(R.mipmap.wallet_lijin_img); + dialogPayFingerBinding.payTypeTv.setText(R.string.gift_redpacket_txt); + } + if(showNumber){ + dialogPayFingerBinding.tvTipMoney.setVisibility(View.VISIBLE); + dialogPayFingerBinding.tvTipMoney.setText(""+money); + }else{ + dialogPayFingerBinding.tvTipMoney.setVisibility(View.GONE); + } + if(!TextUtils.isEmpty(tipsTxt)){//zfjecgxz_txt + dialogPayFingerBinding.errorTv.setText(tipsTxt); + dialogPayFingerBinding.errorTv.setVisibility(View.VISIBLE); + } + dialogPayFingerBinding.ivCloseKey.setOnClickListener(this); + + dialogPayFingerBinding.mainMoreSettingsSafa.setOnClickListener(this); + + WindowManager.LayoutParams attributes = window.getAttributes(); + attributes.gravity = Gravity.BOTTOM; + attributes.width = WindowManager.LayoutParams.MATCH_PARENT; + attributes.height = WindowManager.LayoutParams.WRAP_CONTENT; + setCancelable(false); + setCanceledOnTouchOutside(false); + changePayType(); + dialogPayFingerBinding.zhiwenzhifuTv.setVisibility(View.VISIBLE); + dialogPayFingerBinding.zhiwenzhifuTv.setOnClickListener(this); + dialogPayFingerBinding.tozhiwenIv.setOnClickListener(this); + + } + + public void setOntoAlbumListener(OnListItemClickListener onNextCallListener) { + this.onNextCallListener = onNextCallListener; + } + + + +// @OnClick({R.id.iv_close_key, R.id.tv_zero, R.id.rl_undo}) + public void onClick(View view) { + switch (view.getId()) { + case R.id.tozhiwen_iv: + if(onNextCallListener!=null){ + onNextCallListener.toFinger(); + } + break; + case R.id.zhiwenzhifu_tv: + dismiss(); + if(onNextCallListener!=null){ + onNextCallListener.onChangePassword(); + } + break; + case R.id.main_more_settings_safa: +// SelectPayTypeDialog selectPayTypeDialog = new SelectPayTypeDialog(getContext(),payType,walletBean); +// selectPayTypeDialog.setOnToVipListener(type -> { +// payType = type; +// changePayType(); +// if(onToTypeListener!=null){ +// onToTypeListener.toType(type); +// } +// }); +// selectPayTypeDialog.show(); + break ; + case R.id.iv_close_key://关闭dialog + if(!(context instanceof CollectionAndPaymentActivity)) { + dismiss(); + } + if(onNextCallListener!=null){ + onNextCallListener.dimess(); + } + break; + + } + } + + private void changePayType() { +// yueTv.setVisibility(View.GONE); +// if(payType == 0){ +// payTypeTv.setText(R.string.species_txt); +// yueTv.setVisibility(View.VISIBLE); +// payTypeIv.setImageResource(R.mipmap.wallet_jinbi_img); +// }else if(payType == 1){ +// payTypeTv.setText("line pay"); +// payTypeIv.setImageResource(R.mipmap.line_pay_img); +// }else{ +// payTypeTv.setText(R.string.neweb_txt); +// payTypeIv.setImageResource(R.mipmap.newebpay_img); +// } + } + + + @Override + public void dismiss() { + super.dismiss(); + + } +} diff --git a/app/src/main/java/com/dskj/rbchat/dialog/PayDialog.java b/app/src/main/java/com/dskj/rbchat/dialog/PayDialog.java new file mode 100644 index 0000000..b15407e --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/dialog/PayDialog.java @@ -0,0 +1,262 @@ +package com.dskj.rbchat.dialog; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.Gravity; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.widget.ImageView; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.databinding.DialogPayNewBinding; +import com.dskj.rbchat.model.RegisteredBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.netease.yunxin.kit.common.ui.utils.ToastX; + + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class PayDialog extends Dialog implements View.OnClickListener { + private final Context context; + private final String money; + + boolean showNumber; + CommonAdapter commonAdapter; + boolean isToNext = true; + OnListItemClickListener onNextCallListener; + DialogPayNewBinding dialogPayNewBinding; + public interface OnListItemClickListener { + void onPayPass(String position); + void dimess(); + + } + + private ArrayList keyboardList;//数字列表 + private String psw = "";//密码 + public PayDialog(Context context, String data, boolean showNumber) { + super(context, R.style.dialog_style); + dialogPayNewBinding = DialogPayNewBinding.inflate(getLayoutInflater()); + setContentView(dialogPayNewBinding.getRoot()); + this.context = context; + this.money = data;//要提现金额 + this.showNumber = showNumber; + setCanceledOnTouchOutside(true); + } + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + Window window = this.getWindow(); +// window.requestFeature(Window.FEATURE_NO_TITLE); + + if(showNumber){ + dialogPayNewBinding.tvTipMoney.setVisibility(View.VISIBLE); + dialogPayNewBinding.tvTipMoney.setText(""+money); + }else{ + dialogPayNewBinding.tvTipMoney.setVisibility(View.GONE); + } + dialogPayNewBinding.tvZero.setOnClickListener(this); + dialogPayNewBinding.rlUndo.setOnClickListener(this); + dialogPayNewBinding.sumbitBt.setOnClickListener(this); + dialogPayNewBinding.ivCloseKey.setOnClickListener(this); + WindowManager.LayoutParams attributes = window.getAttributes(); + attributes.gravity = Gravity.BOTTOM; + attributes.width = WindowManager.LayoutParams.MATCH_PARENT; + attributes.height = WindowManager.LayoutParams.WRAP_CONTENT; +// setCancelable(true); +// setCanceledOnTouchOutside(true); + initData(); + } + + public void setOntoAlbumListener(OnListItemClickListener onNextCallListener) { + this.onNextCallListener = onNextCallListener; + } + /* + * 初始化 + * */ + private void initData() { + keyboardList = new ArrayList<>(); + for (int i = 1; i < 10; i++) { + keyboardList.add(i + ""); + } + //设置要提现的金额 +// tvTipMoney.setText("提现金额" + money + "元"); + + initAdapter(); + } + + private void initAdapter() { + GridLayoutManager glManager = new GridLayoutManager(context, 3); + dialogPayNewBinding.rvKeyboard.setLayoutManager(glManager); + commonAdapter = new CommonAdapter(getContext(), R.layout.pay_number_item, keyboardList) { + @Override + public void convert(ViewHolder holder, String s, int index) { + TextView tvKeyboard = holder.getView(R.id.top_name); + tvKeyboard.setText(s); + tvKeyboard.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + inputNum(s); + } + }); + } + }; + dialogPayNewBinding.rvKeyboard.setAdapter(commonAdapter); + } + + + /* + * 输入密码 先判断现有密码长度并设置显示输入了密码 添加密码到密码字符串 + * 后判断输入后密码的长度 如果等于6则关闭并请求服务器 + * */ + private void inputNum(String num) { + switch (psw.length()) { + case 0: + dialogPayNewBinding.tvFirstNum.setText(num); + break; + case 1: + dialogPayNewBinding.tvSecondNum.setText(num); + break; + case 2: + dialogPayNewBinding.tvThirdNum.setText(num); + break; + case 3: + dialogPayNewBinding.tvFourthNum.setText(num); + break; + case 4: + dialogPayNewBinding.tvFifthNum.setText(num); + break; + case 5: + dialogPayNewBinding.tvSixthNum.setText(num); + break; + } + psw += num; + } +// @OnClick({R.id.iv_close_key, R.id.tv_zero, R.id.rl_undo}) + public void onClick(View view) { + switch (view.getId()) { + case R.id.sumbit_bt: + + psw = getStringPassword(); + + if(TextUtils.isEmpty(psw)||psw.length()!=6){ + ToastX.showShortToast(getContext().getString(R.string.dialog_input_paypassword_txt)); + return; + } + + if(isToNext) { + isToNext = false; + checkPayPassword(); + } + break; + case R.id.iv_close_key://关闭dialog + dismiss(); + if(onNextCallListener!=null){ + onNextCallListener.dimess(); + } + break; + case R.id.tv_zero://输入0 + inputNum("0"); + break; + case R.id.rl_undo://删除输入的密码 + psw = getStringPassword(); + deleteNum(); + break; + } + } + + private String getStringPassword() { + return dialogPayNewBinding.tvFirstNum.getText().toString().trim()+dialogPayNewBinding.tvSecondNum.getText().toString().trim()+dialogPayNewBinding.tvThirdNum.getText().toString().trim() + +dialogPayNewBinding.tvFourthNum.getText().toString().trim()+dialogPayNewBinding.tvFifthNum.getText().toString().trim()+dialogPayNewBinding.tvSixthNum.getText().toString().trim(); + } + + + private void checkPayPassword(){ + Map maps= new HashMap<>(); + maps.put("payPassword",psw); + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + + Api.getInstance().checkPayPassword(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { + if(feedbackResp.data.isCorrect()){ + dismiss(); + if(onNextCallListener!=null){ + onNextCallListener.onPayPass(psw); + } + }else{ + ToastX.showShortToast(getContext().getString(R.string.zfmmcw_txt)); + + } + isToNext = true; + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast(msg); + + isToNext = true; + } + }); + } + + /* + * 删除密码 根据已输入的密码长度将对应的textview设置为空 + * 并将密码字符串最后一位切割掉 + * */ + private void deleteNum() { + switch (psw.length()) { + case 1: + dialogPayNewBinding.tvFirstNum.setText(""); + psw = ""; + break; + case 2: + dialogPayNewBinding.tvSecondNum.setText(""); + psw = psw.substring(0, 1); + break; + case 3: + dialogPayNewBinding.tvThirdNum.setText(""); + psw = psw.substring(0, 2); + break; + case 4: + dialogPayNewBinding.tvFourthNum.setText(""); + psw = psw.substring(0, 3); + break; + case 5: + dialogPayNewBinding.tvFifthNum.setText(""); + psw = psw.substring(0, 4); + break; + case 6: + dialogPayNewBinding.tvSixthNum.setText(""); + psw = psw.substring(0, 5); + break; + } + } + + @Override + public void dismiss() { + super.dismiss(); + + } +} diff --git a/app/src/main/java/com/dskj/rbchat/dialog/SelectCountryDialog.java b/app/src/main/java/com/dskj/rbchat/dialog/SelectCountryDialog.java new file mode 100644 index 0000000..2366bc1 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/dialog/SelectCountryDialog.java @@ -0,0 +1,146 @@ +package com.dskj.rbchat.dialog; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.view.Gravity; +import android.view.KeyEvent; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.view.inputmethod.EditorInfo; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.dskj.rbchat.R; +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.databinding.DialogSelectCountryBinding; +import com.dskj.rbchat.model.CountryBean; +import com.dskj.rbchat.utils.DataUtils; + + +import java.util.ArrayList; +import java.util.List; + + +public class SelectCountryDialog extends Dialog { + List menuActions = new ArrayList<>(); + private CommonAdapter commonAdapter; + + public SelectCountryDialog(Context context) { + super(context, R.style.MaterialDesignDialog); + dialogSelectCountryBinding = DialogSelectCountryBinding.inflate(getLayoutInflater()); + setContentView(dialogSelectCountryBinding.getRoot()); + } + + OnToTypeListener onNextCallListener; + DialogSelectCountryBinding dialogSelectCountryBinding; + + public interface OnToTypeListener { + void toType(CountryBean type); + + } + + public void setOnToVipListener(OnToTypeListener onNextCallListener) { + this.onNextCallListener = onNextCallListener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + menuActions = DataUtils.getCountry(getContext()); + dialogSelectCountryBinding.recycler.setLayoutManager(new LinearLayoutManager(getContext())); + commonAdapter = new CommonAdapter(getContext(), R.layout.item_country, menuActions) { + @Override + public void convert(ViewHolder holder, CountryBean s, int index) { + holder.setText(R.id.item_bg, s.getCountryName()); + holder.setText(R.id.item_areacode, s.getAreaCodeName()); + holder.getView(R.id.bot_line).setVisibility(View.VISIBLE); + if (index == menuActions.size() - 1) { + holder.getView(R.id.bot_line).setVisibility(View.GONE); + } + holder.getView(R.id.item_bg1).setOnClickListener(v -> { + notifyDataSetChanged(); + dismiss(); + if (onNextCallListener != null) { + onNextCallListener.toType(s); + } + + }); + } + }; + dialogSelectCountryBinding.recycler.setAdapter(commonAdapter); + dialogSelectCountryBinding.editSearch.setOnEditorActionListener(new TextView.OnEditorActionListener() { + @Override + public boolean onEditorAction(TextView textView, int actionId, KeyEvent keyEvent) { + if (actionId == EditorInfo.IME_ACTION_SEARCH) { + String searchStr = textView.getEditableText().toString(); + if (!TextUtils.isEmpty(searchStr)) { + List searchList = searchList(searchStr); + if (searchList.size() > 0) { + commonAdapter.setDates(searchList); + commonAdapter.notifyDataSetChanged(); + } + + } + } + return false; + } + }); + + dialogSelectCountryBinding.editSearch.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void afterTextChanged(Editable editable) { + if (TextUtils.isEmpty(editable.toString())) { + dialogSelectCountryBinding.ivEdClear.setVisibility(View.GONE); + commonAdapter.setDates(menuActions); + commonAdapter.notifyDataSetChanged(); + } else { + dialogSelectCountryBinding.ivEdClear.setVisibility(View.VISIBLE); + } + } + }); + + dialogSelectCountryBinding.ivEdClear.setOnClickListener(view -> { + dialogSelectCountryBinding.editSearch.setText(""); + }); + Window window = getWindow(); + WindowManager.LayoutParams wlp = window.getAttributes(); + wlp.gravity = Gravity.BOTTOM; + wlp.width = WindowManager.LayoutParams.MATCH_PARENT; + wlp.height = WindowManager.LayoutParams.WRAP_CONTENT; + + window.setAttributes(wlp); + + } + + + public List searchList(String search) { + List searchList = new ArrayList<>(); + for (CountryBean countryBean : menuActions) { + if (countryBean.getCountryName().contains(search) || countryBean.getAreaCodeName().contains(search)) { + searchList.add(countryBean); + } + } + return searchList; + } + +} diff --git a/app/src/main/java/com/dskj/rbchat/dialog/SelectLanguageDialog.java b/app/src/main/java/com/dskj/rbchat/dialog/SelectLanguageDialog.java new file mode 100644 index 0000000..af31654 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/dialog/SelectLanguageDialog.java @@ -0,0 +1,145 @@ +package com.dskj.rbchat.dialog; + +import android.app.Dialog; +import android.content.Context; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.os.Bundle; +import android.util.DisplayMetrics; +import android.view.Gravity; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.widget.ImageView; +import android.widget.LinearLayout; + +import com.blankj.utilcode.util.LanguageUtils; +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.DialogSelectLangTypeBinding; +import com.dskj.rbchat.utils.DataUtils; +import com.netease.yunxin.kit.chatkit.ui.common.ChatDataUtils; + +import java.util.Locale; + + +public class SelectLanguageDialog extends Dialog { + DialogSelectLangTypeBinding dialogSelectLangTypeBinding; + public SelectLanguageDialog(Context context) { + super(context, R.style.MaterialDesignDialog); + dialogSelectLangTypeBinding = DialogSelectLangTypeBinding.inflate(getLayoutInflater()); + setContentView(dialogSelectLangTypeBinding.getRoot()); + + } + OnToTypeListener onNextCallListener; + + public interface OnToTypeListener { + void toType(int type); + + } + + public void setOnToVipListener(OnToTypeListener onNextCallListener) { + this.onNextCallListener = onNextCallListener; + } + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + + + dialogSelectLangTypeBinding.ftLy.setOnClickListener(v -> changeLang(0)); + dialogSelectLangTypeBinding.jtLy.setOnClickListener(v -> changeLang(1)); + dialogSelectLangTypeBinding.ywLy.setOnClickListener(v -> changeLang(2)); + dialogSelectLangTypeBinding.rwLy.setOnClickListener(v -> changeLang(3)); + changeLoc(DataUtils.get(getContext(),"locale",0)); + dialogSelectLangTypeBinding.coloseIv.setOnClickListener(v -> dismiss()); + Window window = getWindow(); + WindowManager.LayoutParams wlp = window.getAttributes(); + wlp.gravity = Gravity.BOTTOM; + wlp.width = WindowManager.LayoutParams.MATCH_PARENT; + wlp.height = WindowManager.LayoutParams.WRAP_CONTENT; + + window.setAttributes(wlp); + + } + private void changeLoc(int type) { + dialogSelectLangTypeBinding.duigouFtIv.setVisibility(View.GONE); + dialogSelectLangTypeBinding. duigouJtIv.setVisibility(View.GONE); + dialogSelectLangTypeBinding.duigouYyIv.setVisibility(View.GONE); + dialogSelectLangTypeBinding.duigouRyIv.setVisibility(View.GONE); + switch (type){ + case 0: + dialogSelectLangTypeBinding.duigouFtIv.setVisibility(View.VISIBLE); + break; + case 1: + dialogSelectLangTypeBinding.duigouJtIv.setVisibility(View.VISIBLE); + break; + case 2: + dialogSelectLangTypeBinding.duigouYyIv.setVisibility(View.VISIBLE); + break; + case 3: + dialogSelectLangTypeBinding.duigouRyIv.setVisibility(View.VISIBLE); + break; + } + } + + private void changeLang(int i) { + DataUtils.set(getContext(),"locale",i); + ChatDataUtils.set(getContext(), "locale", i); + + changeLoc(i); + switch (i){ + case 0: + LanguageUtils.updateAppContextLanguage(Locale.TRADITIONAL_CHINESE, null); + LanguageUtils.applyLanguage(Locale.TRADITIONAL_CHINESE); + //修改Resources.getSystem()的语言 + applyLanguage(getContext(), Resources.getSystem(), Locale.TRADITIONAL_CHINESE); + //修复StringUtils获取string的语言 + break; + + case 1: + LanguageUtils.updateAppContextLanguage(Locale.CHINESE, null); + LanguageUtils.applyLanguage(Locale.CHINESE); + //修改Resources.getSystem()的语言 + applyLanguage(getContext(), Resources.getSystem(), Locale.CHINESE); + //修复StringUtils获取string的语言 + break; + + case 2: + LanguageUtils.updateAppContextLanguage(Locale.ENGLISH, null); + LanguageUtils.applyLanguage(Locale.ENGLISH); + //修改Resources.getSystem()的语言 + applyLanguage(getContext(), Resources.getSystem(), Locale.ENGLISH); + //修复StringUtils获取string的语言 + break; + + case 3: + LanguageUtils.updateAppContextLanguage(Locale.JAPANESE, null); + LanguageUtils.applyLanguage(Locale.JAPANESE); + //修改Resources.getSystem()的语言 + applyLanguage(getContext(), Resources.getSystem(), Locale.JAPANESE); + //修复StringUtils获取string的语言 + break; + + } + if(onNextCallListener!=null){ + onNextCallListener.toType(i); + } + dismiss(); + } + + + + + + //设置当前语言 + public static void applyLanguage(Context context, Resources resources, Locale locale) { + Locale.setDefault(locale); + Configuration config = resources.getConfiguration(); + DisplayMetrics dm = resources.getDisplayMetrics(); + config.locale = locale; + resources.updateConfiguration(config, dm); + + } + + +} diff --git a/app/src/main/java/com/dskj/rbchat/dialog/SelectPayTypeDialog.java b/app/src/main/java/com/dskj/rbchat/dialog/SelectPayTypeDialog.java new file mode 100644 index 0000000..7a6b131 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/dialog/SelectPayTypeDialog.java @@ -0,0 +1,83 @@ +package com.dskj.rbchat.dialog; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.view.Gravity; +import android.view.Window; +import android.view.WindowManager; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.DialogSelectPayTypeBinding; +import com.dskj.rbchat.model.WalletBean; + + +public class SelectPayTypeDialog extends Dialog { + + private int index; + private Context context; + private WalletBean walletBean; + DialogSelectPayTypeBinding dialogSelectPayTypeBinding; + public SelectPayTypeDialog(Context context, int index, WalletBean walletBean) { + super(context, R.style.MaterialDesignDialog); + dialogSelectPayTypeBinding = DialogSelectPayTypeBinding.inflate(getLayoutInflater()); + setContentView(dialogSelectPayTypeBinding.getRoot()); + this.index = index; + this.context = context; + this.walletBean = walletBean; + } + OnToTypeListener onNextCallListener; + + public interface OnToTypeListener { + void toType(int type); + } + + + + public void setOnToVipListener(OnToTypeListener onNextCallListener) { + this.onNextCallListener = onNextCallListener; + } + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if(walletBean!=null) { + dialogSelectPayTypeBinding.yueTv.setText(String.format(getContext().getResources().getString(R.string.yue_pay_txt), walletBean.getGoldCoin() / 100f)); + } + + dialogSelectPayTypeBinding.jinbiLy.setOnClickListener(v -> { + dismiss(); + if(onNextCallListener!=null) { + onNextCallListener.toType(0); + } + }); + + + dialogSelectPayTypeBinding.linePayLy.setOnClickListener(v -> { + dismiss(); + if(onNextCallListener!=null) { + onNextCallListener.toType(1); + } + }); + + + dialogSelectPayTypeBinding.newebLy.setOnClickListener(v -> { + dismiss(); + if(onNextCallListener!=null) { + onNextCallListener.toType(2); + } + }); + + Window window = getWindow(); + WindowManager.LayoutParams wlp = window.getAttributes(); + wlp.gravity = Gravity.BOTTOM; + wlp.width = WindowManager.LayoutParams.MATCH_PARENT; + wlp.height = WindowManager.LayoutParams.WRAP_CONTENT; + + window.setAttributes(wlp); + + } + +} diff --git a/app/src/main/java/com/dskj/rbchat/dialog/SelectPhotoTypeDialog.java b/app/src/main/java/com/dskj/rbchat/dialog/SelectPhotoTypeDialog.java new file mode 100644 index 0000000..952c794 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/dialog/SelectPhotoTypeDialog.java @@ -0,0 +1,93 @@ +package com.dskj.rbchat.dialog; + +import android.app.Dialog; +import android.content.Context; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.os.Bundle; +import android.util.DisplayMetrics; +import android.view.Gravity; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; + +import com.blankj.utilcode.util.LanguageUtils; +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.DialogSelectLangTypeBinding; +import com.dskj.rbchat.databinding.DialogSelectPhotoTypeBinding; +import com.dskj.rbchat.utils.DataUtils; +import com.netease.yunxin.kit.chatkit.ui.common.ChatDataUtils; + +import java.util.Locale; + + +public class SelectPhotoTypeDialog extends Dialog { + DialogSelectPhotoTypeBinding dialogBinding; + + private int type = 1; + + public SelectPhotoTypeDialog(Context context, int selectType) { + super(context, R.style.MaterialDesignDialog); + this.type = selectType; + dialogBinding = DialogSelectPhotoTypeBinding.inflate(getLayoutInflater()); + setContentView(dialogBinding.getRoot()); + + } + + OnToTypeListener onNextCallListener; + + public interface OnToTypeListener { + void toType(int type); + } + + public void setOnToVipListener(OnToTypeListener onNextCallListener) { + this.onNextCallListener = onNextCallListener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + dialogBinding.rlPublic.setOnClickListener(v -> changeType(1)); + dialogBinding.rlFriend.setOnClickListener(v -> changeType(2)); + dialogBinding.rlPrivate.setOnClickListener(v -> changeType(3)); + Window window = getWindow(); + WindowManager.LayoutParams wlp = window.getAttributes(); + wlp.gravity = Gravity.BOTTOM; + wlp.width = WindowManager.LayoutParams.MATCH_PARENT; + wlp.height = WindowManager.LayoutParams.WRAP_CONTENT; + window.setAttributes(wlp); + changeType(type); + } + + + private void changeType(int i) { + dialogBinding.ivPublicSelected.setVisibility(View.GONE); + dialogBinding.ivFriendSelected.setVisibility(View.GONE); + dialogBinding.ivPrivateSelected.setVisibility(View.GONE); + dialogBinding.tvPublicTitle.setTextColor(getContext().getColor(R.color.color_3d3d3d)); + dialogBinding.tvFriendTitle.setTextColor(getContext().getColor(R.color.color_3d3d3d)); + dialogBinding.tvPrivateTitle.setTextColor(getContext().getColor(R.color.color_3d3d3d)); + switch (type) { + case 1: + dialogBinding.ivPublicSelected.setVisibility(View.VISIBLE); + dialogBinding.tvPublicTitle.setTextColor(getContext().getColor(R.color.color_themepink)); + break; + case 2: + dialogBinding.ivFriendSelected.setVisibility(View.VISIBLE); + dialogBinding.tvFriendTitle.setTextColor(getContext().getColor(R.color.color_themepink)); + break; + case 3: + dialogBinding.ivPrivateSelected.setVisibility(View.VISIBLE); + dialogBinding.tvPrivateTitle.setTextColor(getContext().getColor(R.color.color_themepink)); + break; + + } + if (onNextCallListener != null) { + onNextCallListener.toType(i); + } + dismiss(); + } + + +} diff --git a/app/src/main/java/com/dskj/rbchat/dialog/SelectPhotosMoveDialog.java b/app/src/main/java/com/dskj/rbchat/dialog/SelectPhotosMoveDialog.java new file mode 100644 index 0000000..b77e6af --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/dialog/SelectPhotosMoveDialog.java @@ -0,0 +1,122 @@ +package com.dskj.rbchat.dialog; + +import android.app.Dialog; +import android.content.Context; +import android.content.Intent; +import android.graphics.Color; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.Gravity; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.widget.FrameLayout; +import android.widget.TextView; + +import androidx.appcompat.widget.AppCompatImageView; +import androidx.recyclerview.widget.LinearLayoutManager; + +import com.bumptech.glide.Glide; +import com.dskj.rbchat.R; +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.databinding.DialogSelectPhotoTypeBinding; +import com.dskj.rbchat.databinding.DialogSelectPhotosMoveBinding; +import com.dskj.rbchat.main.mine.photo.AddPhotoActivity; +import com.dskj.rbchat.main.mine.photo.UserPhotoListActivity; +import com.dskj.rbchat.model.UserAlbumBean; +import com.netease.yunxin.kit.common.ui.widgets.ContactAvatarView; + +import java.util.List; + +/** + * 移动相册 + */ +public class SelectPhotosMoveDialog extends Dialog { + DialogSelectPhotosMoveBinding dialogBinding; + private Context mContext; + private int selectedPosition; + private List userAlbumBeans; + + public SelectPhotosMoveDialog(Context context, List list) { + super(context, R.style.MaterialDesignDialog); + dialogBinding = DialogSelectPhotosMoveBinding.inflate(getLayoutInflater()); + setContentView(dialogBinding.getRoot()); + selectedPosition = -1; + this.mContext = context; + this.userAlbumBeans = list; + } + + OnToMoveListener onToMoveListener; + + public interface OnToMoveListener { + void toMove(int position); + } + + public void setOnToMoveListener(OnToMoveListener onToMoveListener) { + this.onToMoveListener = onToMoveListener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + dialogBinding.ivDialogClose.setOnClickListener(v -> dismiss()); + Window window = getWindow(); + WindowManager.LayoutParams wlp = window.getAttributes(); + wlp.gravity = Gravity.BOTTOM; + wlp.width = WindowManager.LayoutParams.MATCH_PARENT; + wlp.height = WindowManager.LayoutParams.WRAP_CONTENT; + window.setAttributes(wlp); + initListView(); + dialogBinding.tvDialogMove.setOnClickListener(view -> { + if (onToMoveListener != null && selectedPosition != -1) { + onToMoveListener.toMove(selectedPosition); + dismiss(); + } + }); + } + + private void initListView() { + dialogBinding.recyclerMyalbums.setLayoutManager(new LinearLayoutManager(mContext)); + CommonAdapter commonAdapter = new CommonAdapter(mContext, com.netease.yunxin.kit.chatkit.ui.R.layout.item_useralbum_movelist, userAlbumBeans) { + @Override + public void convert(ViewHolder holder, UserAlbumBean s, int index) { + TextView tvName = holder.getView(com.netease.yunxin.kit.chatkit.ui.R.id.item_tv_albumname); + ContactAvatarView ivCover = holder.getView(com.netease.yunxin.kit.chatkit.ui.R.id.item_iv_cover); + TextView tvType = holder.getView(com.netease.yunxin.kit.chatkit.ui.R.id.item_tv_albumtype); + AppCompatImageView ivSelector = holder.getView(R.id.item_iv_selector); + if (selectedPosition == index) { + ivSelector.setBackgroundResource(R.mipmap.ic_single_selected); + } else { + ivSelector.setBackgroundResource(R.mipmap.dialog_gou_ff); + } + tvName.setText(s.getUserAlbum().getName()); + if (TextUtils.isEmpty(s.getLastFile())) { + ivCover.setBackgroundColor(Color.parseColor("#ffffff")); + } else { + ivCover.setData(s.getLastFile(), "cover", 0); + } + tvType.setText(s.getFileCount() + " " + getTypeValue(s.getUserAlbum().getType())); + holder.getView(R.id.cl_root).setOnClickListener(view -> { + selectedPosition = index; + notifyDataSetChanged(); + }); + + } + + }; + dialogBinding.recyclerMyalbums.setAdapter(commonAdapter); + } + + + private String getTypeValue(int type) { + if (type == 1) { + return mContext.getString(com.netease.yunxin.kit.chatkit.ui.R.string.userphoto_create_xiangbugongkai); + } else if (type == 2) { + return mContext.getString(com.netease.yunxin.kit.chatkit.ui.R.string.userphoto_create_xiangbuhaoyou); + } else { + return mContext.getString(com.netease.yunxin.kit.chatkit.ui.R.string.userphoto_create_xiangbusimi); + } + } + +} diff --git a/app/src/main/java/com/dskj/rbchat/dialog/SelectPushTypeDialog.java b/app/src/main/java/com/dskj/rbchat/dialog/SelectPushTypeDialog.java new file mode 100644 index 0000000..1fff7d2 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/dialog/SelectPushTypeDialog.java @@ -0,0 +1,97 @@ +package com.dskj.rbchat.dialog; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.view.Gravity; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.DialogSelectPushTypeBinding; + + +public class SelectPushTypeDialog extends Dialog { + + OnToTypeListener onNextCallListener; + + private int type = 0; + DialogSelectPushTypeBinding dialogSelectPushTypeBinding; + public interface OnToTypeListener { + void toType(int type); + + } + public SelectPushTypeDialog(Context context) { + super(context, R.style.MaterialDesignDialog); + } + public SelectPushTypeDialog(Context context,int type) { + super(context, R.style.MaterialDesignDialog); + dialogSelectPushTypeBinding = DialogSelectPushTypeBinding.inflate(getLayoutInflater()); + setContentView(dialogSelectPushTypeBinding.getRoot()); + this.type = type; + } + public void setOnToVipListener(OnToTypeListener onNextCallListener) { + this.onNextCallListener = onNextCallListener; + } + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + dialogSelectPushTypeBinding.allLy.setOnClickListener(v -> { + dismiss(); + if(onNextCallListener!=null){ + onNextCallListener.toType(0); + } + }); + dialogSelectPushTypeBinding.haoyouLy.setOnClickListener(v -> { + dismiss(); + if(onNextCallListener!=null){ + onNextCallListener.toType(1); + } + }); + dialogSelectPushTypeBinding.zijiLy.setOnClickListener(v -> { + dismiss(); + if(onNextCallListener!=null){ + onNextCallListener.toType(2); + } + }); + changeType(); + + Window window = getWindow(); + WindowManager.LayoutParams wlp = window.getAttributes(); + wlp.gravity = Gravity.BOTTOM; + wlp.width = WindowManager.LayoutParams.MATCH_PARENT; + wlp.height = WindowManager.LayoutParams.WRAP_CONTENT; + + window.setAttributes(wlp); + + } + + private void changeType() { + dialogSelectPushTypeBinding.allVisibleIv.setVisibility(View.INVISIBLE); + dialogSelectPushTypeBinding.friendVisibleIv.setVisibility(View.INVISIBLE); + dialogSelectPushTypeBinding.onlymeVisibleIv.setVisibility(View.INVISIBLE); + dialogSelectPushTypeBinding.allVisibleTv.setTextColor(getContext().getResources().getColor(R.color.color_333333)); + dialogSelectPushTypeBinding.friendVisibleTv.setTextColor(getContext().getResources().getColor(R.color.color_333333)); + dialogSelectPushTypeBinding.onlymeVisibleTv.setTextColor(getContext().getResources().getColor(R.color.color_333333)); + + if(type==0){ + dialogSelectPushTypeBinding.allVisibleIv.setVisibility(View.VISIBLE); + dialogSelectPushTypeBinding.allVisibleTv.setTextColor(getContext().getResources().getColor(R.color.color_themepink)); + + }else if(type==1){ + dialogSelectPushTypeBinding.friendVisibleIv.setVisibility(View.VISIBLE); + dialogSelectPushTypeBinding.friendVisibleTv.setTextColor(getContext().getResources().getColor(R.color.color_themepink)); + + }else if(type==2){ + dialogSelectPushTypeBinding.onlymeVisibleIv.setVisibility(View.VISIBLE); + dialogSelectPushTypeBinding.onlymeVisibleTv.setTextColor(getContext().getResources().getColor(R.color.color_themepink)); + } + + } + +} diff --git a/app/src/main/java/com/dskj/rbchat/dialog/SelectSexDialog.java b/app/src/main/java/com/dskj/rbchat/dialog/SelectSexDialog.java new file mode 100644 index 0000000..7be0a70 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/dialog/SelectSexDialog.java @@ -0,0 +1,103 @@ +package com.dskj.rbchat.dialog; + +import android.app.Dialog; +import android.content.Context; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.os.Bundle; +import android.util.DisplayMetrics; +import android.view.Gravity; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; + +import com.blankj.utilcode.util.LanguageUtils; +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.DialogSelectLangTypeBinding; +import com.dskj.rbchat.databinding.DialogSelectSexBinding; +import com.dskj.rbchat.utils.DataUtils; +import com.netease.yunxin.kit.chatkit.ui.common.ChatDataUtils; +import com.netease.yunxin.kit.common.ui.utils.ToastX; + +import java.util.Locale; + + +public class SelectSexDialog extends Dialog { + DialogSelectSexBinding dialogSelectLangTypeBinding; + int sexFlag = -1; + public SelectSexDialog(Context context,int sexFlag) { + super(context, R.style.MaterialDesignDialog); + dialogSelectLangTypeBinding = DialogSelectSexBinding.inflate(getLayoutInflater()); + setContentView(dialogSelectLangTypeBinding.getRoot()); + this.sexFlag = sexFlag; + + } + OnToTypeListener onNextCallListener; + + public interface OnToTypeListener { + void toType(int type); + + } + + public void setOnToVipListener(OnToTypeListener onNextCallListener) { + this.onNextCallListener = onNextCallListener; + } + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + dialogSelectLangTypeBinding.nanLy.setOnClickListener(v -> changeLoc(0)); + dialogSelectLangTypeBinding.nvLy.setOnClickListener(v -> changeLoc(1)); + dialogSelectLangTypeBinding.configTv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(sexFlag ==-1){ + ToastX.showShortToast(R.string.qxxzxb_txt); + return; + } + dismiss(); + if(onNextCallListener!=null){ + onNextCallListener.toType(sexFlag); + } + } + }); + changeLoc(sexFlag); + dialogSelectLangTypeBinding.coloseIv.setOnClickListener(v -> dismiss()); + Window window = getWindow(); + WindowManager.LayoutParams wlp = window.getAttributes(); + wlp.gravity = Gravity.BOTTOM; + wlp.width = WindowManager.LayoutParams.MATCH_PARENT; + wlp.height = WindowManager.LayoutParams.WRAP_CONTENT; + + window.setAttributes(wlp); + + } + private void changeLoc(int type) { + dialogSelectLangTypeBinding.duigouNanIv.setVisibility(View.GONE); + dialogSelectLangTypeBinding. duigouNvIv.setVisibility(View.GONE); + sexFlag = type; + switch (type){ + case 0: + dialogSelectLangTypeBinding.duigouNanIv.setVisibility(View.VISIBLE); + break; + case 1: + dialogSelectLangTypeBinding.duigouNvIv.setVisibility(View.VISIBLE); + break; + + } + } + + + + //设置当前语言 + public static void applyLanguage(Context context, Resources resources, Locale locale) { + Locale.setDefault(locale); + Configuration config = resources.getConfiguration(); + DisplayMetrics dm = resources.getDisplayMetrics(); + config.locale = locale; + resources.updateConfiguration(config, dm); + + } + + +} diff --git a/app/src/main/java/com/dskj/rbchat/dialog/SelectTypeDialog.java b/app/src/main/java/com/dskj/rbchat/dialog/SelectTypeDialog.java new file mode 100644 index 0000000..6bf1c52 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/dialog/SelectTypeDialog.java @@ -0,0 +1,88 @@ +package com.dskj.rbchat.dialog; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.view.Gravity; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.dskj.rbchat.R; +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.databinding.DialogSelectTypeBinding; +import com.dskj.rbchat.model.TypeBean; + +import java.util.ArrayList; +import java.util.List; + + +public class SelectTypeDialog extends Dialog { + List menuActions = new ArrayList<>(); + private int mIndex = 0; + private boolean isGold; + DialogSelectTypeBinding dialogSelectTypeBinding; + public SelectTypeDialog(Context context, int index,boolean isGold) { + super(context, R.style.MaterialDesignDialog); + dialogSelectTypeBinding = DialogSelectTypeBinding.inflate(getLayoutInflater()); + setContentView(dialogSelectTypeBinding.getRoot()); + this.mIndex = index; + this.isGold= isGold; + } + OnToTypeListener onNextCallListener; + + public interface OnToTypeListener { + void toType(TypeBean type); + + } + + public void setOnToVipListener(OnToTypeListener onNextCallListener) { + this.onNextCallListener = onNextCallListener; + } + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + menuActions = TypeBean.getList(isGold); + + dialogSelectTypeBinding.coloseIv.setOnClickListener(v -> dismiss()); + dialogSelectTypeBinding. recycler.setLayoutManager(new LinearLayoutManager(getContext())); + CommonAdapter commonAdapter = new CommonAdapter(getContext(), R.layout.item_type, menuActions) { + @Override + public void convert(ViewHolder holder, TypeBean s, int index) { + holder.setText(R.id.item_bg,s.getName()); + TextView textView = holder.getView(R.id.item_bg); + ImageView duigou_iv = holder.getView(R.id.duigou_iv); + if(mIndex == s.getType()){ + duigou_iv.setImageResource(R.mipmap.dialog_gou_tt); + }else{ + duigou_iv.setImageResource(R.mipmap.dialog_gou_ff); + } + holder.getView(R.id.item_bg1).setOnClickListener(v -> { + dismiss(); + mIndex = index; + notifyDataSetChanged(); + if(onNextCallListener!=null){ + onNextCallListener.toType(s); + } + }); + } + }; + dialogSelectTypeBinding.recycler.setAdapter(commonAdapter); + Window window = getWindow(); + WindowManager.LayoutParams wlp = window.getAttributes(); + wlp.gravity = Gravity.BOTTOM; + wlp.width = WindowManager.LayoutParams.MATCH_PARENT; + wlp.height = WindowManager.LayoutParams.WRAP_CONTENT; + + window.setAttributes(wlp); + + } + +} diff --git a/app/src/main/java/com/dskj/rbchat/event/ConversationEditEvent.java b/app/src/main/java/com/dskj/rbchat/event/ConversationEditEvent.java new file mode 100644 index 0000000..776a4ad --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/event/ConversationEditEvent.java @@ -0,0 +1,39 @@ +package com.dskj.rbchat.event; + +import androidx.annotation.NonNull; + +import com.netease.nimlib.sdk.team.model.Team; +import com.netease.yunxin.kit.conversationkit.ui.model.ConversationBean; +import com.netease.yunxin.kit.corekit.event.BaseEvent; + +import java.util.ArrayList; +import java.util.List; + +public class ConversationEditEvent extends BaseEvent { + public static final String EVENT_TYPE = "ConversationEditEvent"; + + public List listConversation = new ArrayList<>(); + public int paramType; // 0 清除未读 隐藏1、删除2、更新3 + + public List getList() { + return listConversation; + } + + public void setList(List list) { + listConversation.addAll(list); + } + + public int getParamType() { + return paramType; + } + + public void setParamType(int paramType) { + this.paramType = paramType; + } + + @NonNull + @Override + public String getType() { + return EVENT_TYPE; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/dskj/rbchat/event/UserAlbumsUpdateEvent.java b/app/src/main/java/com/dskj/rbchat/event/UserAlbumsUpdateEvent.java new file mode 100644 index 0000000..116bd07 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/event/UserAlbumsUpdateEvent.java @@ -0,0 +1,19 @@ +package com.dskj.rbchat.event; + +import androidx.annotation.NonNull; + +import com.netease.nimlib.sdk.team.model.Team; +import com.netease.yunxin.kit.corekit.event.BaseEvent; + +public class UserAlbumsUpdateEvent extends BaseEvent { + public static final String EVENT_TYPE = "UserAlbumsUpdateEvent"; + + public UserAlbumsUpdateEvent() { + } + + @NonNull + @Override + public String getType() { + return EVENT_TYPE; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/dskj/rbchat/game/JsBridgeActivity.java b/app/src/main/java/com/dskj/rbchat/game/JsBridgeActivity.java new file mode 100644 index 0000000..547ebb7 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/game/JsBridgeActivity.java @@ -0,0 +1,1952 @@ +package com.dskj.rbchat.game; + +import static androidx.activity.result.contract.ActivityResultContracts.*; + +import android.Manifest; +import android.annotation.TargetApi; +import android.content.ActivityNotFoundException; +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.Color; +import android.graphics.Point; +import android.graphics.Rect; +import android.location.Address; +import android.location.Geocoder; +import android.net.Uri; +import android.nfc.NfcAdapter; +import android.nfc.NfcManager; +import android.nfc.Tag; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.provider.Settings; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.util.DisplayMetrics; +import android.util.Log; +import android.view.Display; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; +import android.view.inputmethod.InputMethodManager; +import android.webkit.CookieManager; +import android.webkit.ValueCallback; +import android.webkit.WebChromeClient; +import android.webkit.WebSettings; +import android.webkit.WebView; +import android.webkit.WebViewClient; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.activity.result.PickVisualMediaRequest; + +import com.bumptech.glide.Glide; +import com.codersun.fingerprintcompat.AonFingerChangeCallback; +import com.codersun.fingerprintcompat.FingerManager; +import com.codersun.fingerprintcompat.SimpleFingerCheckCallback; +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.contact.UserInfoActivity; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.dialog.ActionConfirmDialog1; +import com.dskj.rbchat.dialog.PayCashDialog; +import com.dskj.rbchat.dialog.PayCashFingerDialog; +import com.dskj.rbchat.main.MainActivity; +import com.dskj.rbchat.main.authorize.AuthorizeActivity; +import com.dskj.rbchat.main.mine.ChangeAccoutActionActivity; +import com.dskj.rbchat.model.BindBean; +import com.dskj.rbchat.model.JsBridgeOrderBean; +import com.dskj.rbchat.model.LoginBean; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; +import androidx.appcompat.widget.AppCompatImageView; +import androidx.core.content.ContextCompat; +import androidx.core.view.WindowCompat; +import androidx.lifecycle.ViewModelProvider; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.amap.api.location.AMapLocation; +import com.amap.api.location.AMapLocationClient; +import com.amap.api.location.AMapLocationClientOption; +import com.amap.api.location.AMapLocationListener; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.ActivityChangePaypasswordBinding; +import com.dskj.rbchat.databinding.ActivityJsbridgeBinding; +import com.dskj.rbchat.dialog.PayDialog; +import com.dskj.rbchat.model.AuthorizeBean; +import com.dskj.rbchat.model.H5ChangeTitle; +import com.dskj.rbchat.model.NewsBean; +import com.dskj.rbchat.model.StaffServiceIdBean; +import com.dskj.rbchat.model.TopUpBean; +import com.dskj.rbchat.model.UserAlbumBean; +import com.dskj.rbchat.model.UserShareBean; +import com.dskj.rbchat.model.UsersExistBean; +import com.dskj.rbchat.model.WalletBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.pay.NfcReaderActivity; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.utils.QRCodeScheme; +import com.dskj.rbchat.utils.ShareDateUtils; +import com.dskj.rbchat.utils.SoftHideKeyBoardUtil; +import com.dskj.rbchat.wallet.SetPayPasswordActivity; +import com.dskj.rbchat.welcome.WelcomeActivity; +import com.dskj.rbchat.widget.StatusLayout; +import com.google.android.material.bottomsheet.BottomSheetDialog; +import com.huawei.hms.hmsscankit.ScanUtil; +import com.huawei.hms.hmsscankit.ScanUtilHtml; +import com.huawei.hms.ml.scan.HmsScan; +import com.huawei.hms.ml.scan.HmsScanAnalyzerOptions; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.friend.FriendService; +import com.netease.nimlib.sdk.msg.MessageBuilder; +import com.netease.nimlib.sdk.msg.MsgService; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.nimlib.sdk.msg.model.IMMessage; +import com.netease.nimlib.sdk.msg.model.RecentContact; +import com.netease.nimlib.sdk.uinfo.UserService; +import com.netease.nimlib.sdk.uinfo.model.NimUserInfo; +import com.netease.yunxin.kit.chatkit.model.ConversationInfo; +import com.netease.yunxin.kit.chatkit.repo.ChatRepo; +import com.netease.yunxin.kit.chatkit.repo.ContactRepo; +import com.netease.yunxin.kit.chatkit.ui.adapter.CommonAdapter; +import com.netease.yunxin.kit.chatkit.ui.adapter.ViewHolder; +import com.netease.yunxin.kit.chatkit.ui.common.RxBus; +import com.netease.yunxin.kit.chatkit.ui.custom.HelpPayAttachment; +import com.netease.yunxin.kit.chatkit.ui.custom.UserAlbumsAttachment; +import com.netease.yunxin.kit.chatkit.ui.dialog.PermissionExplainDialog; +import com.netease.yunxin.kit.chatkit.ui.model.BusinessCardBean; +import com.netease.yunxin.kit.chatkit.ui.model.CleanHistoryEvent; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.dialog.LoadingDialog; +import com.netease.yunxin.kit.common.ui.utils.AvatarColor; +import com.netease.yunxin.kit.common.ui.utils.Permission; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.common.ui.viewmodel.LoadStatus; +import com.netease.yunxin.kit.common.ui.widgets.BackTitleBar; +import com.netease.yunxin.kit.common.ui.widgets.ContactAvatarView; +import com.netease.yunxin.kit.common.utils.PermissionUtils; +import com.netease.yunxin.kit.contactkit.ui.contact.ContactViewModel; +import com.netease.yunxin.kit.contactkit.ui.fun.selector.FunContactSelectorDialog; +import com.netease.yunxin.kit.contactkit.ui.model.ContactFriendBean; +import com.netease.yunxin.kit.contactkit.ui.search.SearchViewModel; +import com.netease.yunxin.kit.conversationkit.ui.model.ConversationBean; +import com.netease.yunxin.kit.conversationkit.ui.page.viewmodel.ConversationViewModel; +import com.netease.yunxin.kit.corekit.event.EventCenter; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.model.FriendInfo; +import com.netease.yunxin.kit.corekit.im.model.UserInfo; +import com.netease.yunxin.kit.corekit.im.provider.FetchCallback; +import com.netease.yunxin.kit.corekit.im.provider.FetchCallbackImpl; +import com.netease.yunxin.kit.locationkit.MapNavigator; +import com.netease.yunxin.nertc.ui.CallKitUI; +import com.smallbuer.jsbridge.core.BridgeHandler; +import com.smallbuer.jsbridge.core.BridgeWebView; +import com.smallbuer.jsbridge.core.CallBackFunction; +import com.smallbuer.jsbridge.core.OnBridgeCallback; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class JsBridgeActivity extends BaseActivity { + boolean isPath = false; + private Uri imageUri; + private boolean take = false; + private String url = IMUIKitConfig.RBCHAT_PRIVACY_CN_URL; + public static final int REQUEST_CODE_CHOOSE = 0x124; + protected static final int CAPTURE = 1; + CallBackFunction mBridgeHandler; + CallBackFunction mBridgeHandler1; + CallBackFunction mUserInfoCallback; + H5ChangeTitle h5ChangeTitle; + // String uuid = "", uuid1 = ""; + private static final int REQUEST_CODE_FILE_CHOOSER = 1; + private ValueCallback mUploadCallbackForLowApi; + private ValueCallback mUploadCallbackForHighApi; + private Bitmap bitmap; + boolean isDownload = false; + private boolean isGame; + boolean isText = false; + boolean isV = true; + NewsBean newsBean = null; + CallBackFunction callBackFunctionLocation; + String colorString = ""; + private boolean showTop = true; + ActivityJsbridgeBinding viewBinding; + ActivityResultLauncher pickMultipleMedia; + BindBean bindBean; + WalletBean walletBean; + + private NfcAdapter nfcAdapter; + CallBackFunction callbackNfcFunction; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + if (Build.VERSION.SDK_INT >= 30) { + } else { + setTheme(R.style.AppThemeStart1); + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); + getWindow().setStatusBarColor(Color.TRANSPARENT); + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + getWindow().setDecorFitsSystemWindows(false); + } else { + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + } + super.onCreate(savedInstanceState); + viewBinding = ActivityJsbridgeBinding.inflate(getLayoutInflater()); + setContentView(viewBinding.getRoot()); + SoftHideKeyBoardUtil.assistActivity(this); + IMApplication.schemeSilverQrCode = null; + if (Build.VERSION.SDK_INT >= 30) { + WindowCompat.setDecorFitsSystemWindows(getWindow(), false); + ViewGroup.LayoutParams layoutParams = viewBinding.bottomV.getLayoutParams(); + layoutParams.height = getNavigationBarHeight(this); + viewBinding.bottomV.setLayoutParams(layoutParams); + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR | View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR); + } + initView(); + permissionLauncher = + registerForActivityResult( + new RequestMultiplePermissions(), + result -> { + if (result != null) { + for (Map.Entry entry : result.entrySet()) { + String permission = entry.getKey().toString(); + boolean grant = (Boolean) entry.getValue(); + if (grant) { + if (TextUtils.equals(permission, Manifest.permission.CAMERA)) { + ScanUtilHtml.startScan(JsBridgeActivity.this, MainActivity.REQUEST_CODE_FOR_QRCODE_SCAN, + new HmsScanAnalyzerOptions.Creator() + .setHmsScanTypes(HmsScan.ALL_SCAN_TYPE).create()); + } + } else { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (shouldShowRequestPermissionRationale(permission)) { + + ToastX.showShortToast( + getResources().getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_deny_tips)); + + } else { + + ToastX.showShortToast(getPermissionText(permission)); + + } + } + } + } + } + }); + + // 设置新的宽高 +// ViewGroup.LayoutParams layoutParams = viewBinding.bottomV.getLayoutParams(); +// layoutParams.height = getNavigationBarHeight(this); +// viewBinding.bottomV.setLayoutParams(layoutParams); + pickMultipleMedia = + registerForActivityResult(new PickMultipleVisualMedia(5), uris -> { + // Callback is invoked after the user selects media items or closes the + // photo picker. + if (!uris.isEmpty()) { + LogUtils.i("Number of items selected: " + uris.size()); + Uri[] uris1 = new Uri[uris.size()]; + for (int i = 0; i < uris.size(); i++) { + LogUtils.i("Selected URI: " + uris.get(i)); + uris1[i] = uris.get(i); + } + mUploadCallbackForHighApi.onReceiveValue(uris1); + mUploadCallbackForHighApi = null; + } else { + LogUtils.i("No media selected"); + } + }); + getWallet(); + } + + public int getNavigationBarHeight(Context context) { + Resources resources = context.getResources(); + int resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android"); + return resources.getDimensionPixelSize(resourceId); + } + + public String getPermissionText(String permission) { + String text = getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_default); + if (TextUtils.equals(permission, Manifest.permission.CAMERA)) { + text = getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_camera); + } else if (TextUtils.equals(permission, Manifest.permission.READ_EXTERNAL_STORAGE)) { + text = getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_storage); + } else if (TextUtils.equals(permission, Manifest.permission.RECORD_AUDIO)) { + text = getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_audio); + } + return text; + } + + private void getWallet() { + Api.getInstance().walletInfo(IMKitClient.account()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + + @Override + public void onSuccess(Result feedbackResp) { + walletBean = feedbackResp.data; + RxBus.getInstance().post(walletBean); + } + + @Override + public void onError(int code, String msg) { + } + }); + + + } + + /** + * 初始化各种View + */ + protected void initView() { + viewBinding.titleBar.getBackImageView().setOnClickListener(v -> onBack()); + isText = getIntent().getBooleanExtra("isText", false); + isV = getIntent().getBooleanExtra("isV", true); + if (!isText) { + url = getIntent().getStringExtra("url") + (isV?"?v=" + System.currentTimeMillis() : ""); + } else { + newsBean = (NewsBean) getIntent().getSerializableExtra("url"); + } + isGame = getIntent().getBooleanExtra("isGame", false); + LogUtils.d("请求地址JsBridgeActivity:" + url); + colorString = getIntent().getStringExtra("colorString"); + showTop = getIntent().getBooleanExtra("showTop", true); + viewBinding.titleBar.setVisibility(View.GONE); + + if (!isText) { + Uri uri = Uri.parse(url); + String value = uri.getQueryParameter("color"); + String value1 = uri.getQueryParameter("textIsWhite"); + String value2 = uri.getQueryParameter("showTitle"); + String value3 = uri.getQueryParameter("bg"); + + LogUtils.d("获取参数color:" + value + ";;textIsWhite" + value1 + ";;showTitle:" + value2); + h5ChangeTitle = new H5ChangeTitle(); + if (!TextUtils.isEmpty(value) && value.length() == 6) { + h5ChangeTitle.setColor("#" + value); + } + if (!TextUtils.isEmpty(value1) && value1.equals("false")) { + h5ChangeTitle.setTextIsWhite(false); + } + if (!TextUtils.isEmpty(value2) && value2.equals("false")) { + h5ChangeTitle.setShowTitle(false); + } + if (!TextUtils.isEmpty(value3) && value3.length() == 6) { + h5ChangeTitle.setBg("#" + value3); + } + changTitleColor(h5ChangeTitle); + } + + WebSettings settings = viewBinding.jsbridgeBridgewebview.getSettings(); + settings.setDomStorageEnabled(true); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + CookieManager.getInstance().setAcceptThirdPartyCookies(viewBinding.jsbridgeBridgewebview, true); + settings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); + } +// settings.setAppCacheEnabled(true); + settings.setCacheMode(WebSettings.LOAD_DEFAULT); +// settings.setCacheMode(WebSettings.LOAD_NO_CACHE); + + settings.setJavaScriptEnabled(true); + settings.setLoadWithOverviewMode(true); +// settings.setAppCachePath(APP_CACHE_DIRNAME); + // 设置允许访问文件数据 + settings.setAllowFileAccess(true); + settings.setAllowContentAccess(true); + settings.setDatabaseEnabled(true); + settings.setSavePassword(false); + settings.setSaveFormData(false); + settings.setUseWideViewPort(true); + settings.setJavaScriptCanOpenWindowsAutomatically(true); + // 设置在WebView内部是否允许通过file url加载的 Js代码读取其他的本地文件 + // Android 4.1前默认允许,4.1后默认禁止 + settings.setAllowFileAccessFromFileURLs(true); + // 设置WebView内部是否允许通过 file url 加载的 Javascript 可以访问其他的源(包括http、https等源) + // Android 4.1前默认允许,4.1后默认禁止 + settings.setAllowUniversalAccessFromFileURLs(true); + + viewBinding.jsbridgeBridgewebview.setWebChromeClient(new myWebChromeClient()); +// viewBinding.jsbridgeBridgewebview.setWebViewClient(new WebViewClient(){ +// @Override +// public void onPageFinished(WebView view, String url) { +// super.onPageFinished(view, url); +// dimessLoadingDialog(); +// } +// }); + + +// if(gameDownBean == null) { + if (!isText) { +// showLoadingDialog(); + viewBinding.jsbridgeBridgewebview.loadUrl(url); + } else { + settings.setTextZoom(250); + viewBinding.jsbridgeBridgewebview.loadDataWithBaseURL(null, newsBean.getContent(), "text/html", "utf-8", null); + setTitle(newsBean.getTitle()); + viewTime(newsBean.getAnnouncementId()); + } +// }else{ +// downZip(gameDownBean); +// } + + + viewBinding.jsbridgeBridgewebview.addHandlerLocal("getAuthorizeCode", new BridgeHandler() { + @Override + public void handler(Context context, String data, CallBackFunction callBackFunction) { + LogUtils.d("getAuthorizeCode:" + data); + data = data.replace("\"", ""); + LogUtils.d("getAuthorizeCode获取到的数据:" + data); + Map map = new HashMap<>(); + map.put("token", DataUtils.getLocUserInfo().getAccessToken()); + map.put("appId", data); + map.put("redirectUri", "https://www.baidu.com/"); + map.put("allowAuthorize", true); + if (!TextUtils.isEmpty(IMUIKitConfig.SUBSTATIONID)) { + map.put("substationId", IMUIKitConfig.SUBSTATIONID); + } + Api.getInstance().authorizeLogin(map) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + if (feedbackResp.data != null) { + LogUtils.d("getAuthorizeCode:回调:" + feedbackResp.data.getAuthorizeCode()); + + callBackFunction.onCallBack(feedbackResp.data.getAuthorizeCode()); + } + } + + @Override + public void onError(int code, String msg) { + LogUtils.d("获取到的错误:" + code + "" + msg); + callBackFunction.onCallBack(""); + + } + }); + } + + + }); + + + viewBinding.jsbridgeBridgewebview.addHandlerLocal("toChat", new BridgeHandler() { + @Override + public void handler(Context context, String s, CallBackFunction callBackFunction) { + LogUtils.d("执行了toChat:" + s); + callBackFunction.onCallBack(""); + // TODO: 2023/5/9 + } + }); + + + viewBinding.jsbridgeBridgewebview.addHandlerLocal("getUserId", new BridgeHandler() { + @Override + public void handler(Context context, String s, CallBackFunction callBackFunction) { + LogUtils.d("执行了getUserId"); +// LoginBean userInfoBean = MyApplication.getInstance2().getIMClientManager().getLocalUserInfo(); +// if (userInfoBean != null) { + LogUtils.d("执行了getUserToken 111111111"); + + callBackFunction.onCallBack(IMKitClient.account()); +// } + } + }); + + + viewBinding.jsbridgeBridgewebview.addHandlerLocal("topup", new BridgeHandler() { + @Override + public void handler(Context context, String s, CallBackFunction callBackFunction) {//充值 + LoginBean loginBean = DataUtils.getLocUserInfo(); + if (loginBean != null && loginBean.getUser() != null) { + if (loginBean.getUser().getForbidQCoin() == 1) { + Map map1 = new HashMap<>(); + map1.put("code", 0); + map1.put("error", "金币被封禁"); + toRengong(); + return; + } + s = s.replace("\"", ""); + PayDialog payDialog = new PayDialog(JsBridgeActivity.this, "", false); + String finalS = s; + payDialog.setOntoAlbumListener(new PayDialog.OnListItemClickListener() { + @Override + public void onPayPass(String position) { + Map map = new HashMap<>(); + map.put("recordId", Long.parseLong(finalS)); + map.put("payPassword", position); + if (!TextUtils.isEmpty(IMUIKitConfig.SUBSTATIONID)) { + map.put("substationId", IMUIKitConfig.SUBSTATIONID); + } + Api.getInstance().chargeComplete(map) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { +// LogUtils.i("回调获取到的数据:" + GsonUtils.beanToJSONString(feedbackResp)); + callBackFunction.onCallBack(GsonUtils.beanToJSONString(feedbackResp)); + } + + @Override + public void onError(int code, String msg) { + Map map1 = new HashMap<>(); + map1.put("code", code); + map1.put("error", msg); + callBackFunction.onCallBack(GsonUtils.beanToJSONString(map1)); + } + }); + } + + @Override + public void dimess() { + Map map1 = new HashMap<>(); + map1.put("code", 0); + map1.put("error", "取消了充值"); + callBackFunction.onCallBack(GsonUtils.beanToJSONString(map1)); + } + }); + payDialog.show(); + } + + + } + }); + + viewBinding.jsbridgeBridgewebview.addHandlerLocal("getBalance", new BridgeHandler() { + @Override + public void handler(Context context, String s, CallBackFunction callBackFunction) {//充值 + LogUtils.d("获取到的数据getBalance:" + s); +// LoginBean u = DataUtils.getLocUserInfo(); +// if (u != null) { + Api.getInstance().walletInfo(IMKitClient.account()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { + LogUtils.d("获取到的数据getBalance回调:" + feedbackResp.data.getGoldCoin()); + callBackFunction.onCallBack(feedbackResp.data.getGoldCoin() + ""); + } + + @Override + public void onError(int code, String msg) { + LogUtils.d("获取到的数据getBalance回调onError:0"); + + callBackFunction.onCallBack("0"); + } + }); +// } + + } + }); + + //获取银币余额 + viewBinding.jsbridgeBridgewebview.addHandlerLocal("getBalanceSilver", new BridgeHandler() { + @Override + public void handler(Context context, String s, CallBackFunction callBackFunction) {//充值 + LogUtils.d("获取到的数据getBalanceSilver:" + s); +// LoginBean u = lu1(); +// if (u != null) { + Api.getInstance().walletInfo(IMKitClient.account()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { + LogUtils.d("获取到的数据getBalance回调:" + feedbackResp.data.getSilverCoin()); + callBackFunction.onCallBack(feedbackResp.data.getSilverCoin() + ""); + } + + @Override + public void onError(int code, String msg) { + LogUtils.d("获取到的数据getBalance回调onError:0"); + + callBackFunction.onCallBack("0"); + } + }); +// } + + } + }); + + viewBinding.jsbridgeBridgewebview.addHandlerLocal("getCoin", new BridgeHandler() { + @Override + public void handler(Context context, String s, CallBackFunction callBackFunction) {//充值 + LogUtils.d("获取到的数据getCoin:" + s); +// LoginBean u = lu1(); +// if (u != null) { + Api.getInstance().walletInfo(IMKitClient.account()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { + Map map1 = new HashMap<>(); + map1.put("code", 1); + map1.put("goldCoin", feedbackResp.data.getGoldCoin()); + map1.put("silverCoin", feedbackResp.data.getSilverCoin()); + LogUtils.d("回调结果:" + GsonUtils.beanToJSONString(map1)); + + callBackFunction.onCallBack(GsonUtils.beanToJSONString(map1)); + } + + @Override + public void onError(int code, String msg) { + Map map1 = new HashMap<>(); + map1.put("code", 0); + map1.put("error", "获取余额失败"); + callBackFunction.onCallBack(GsonUtils.beanToJSONString(map1)); + } + }); +// } + + } + }); + + + viewBinding.jsbridgeBridgewebview.addHandlerLocal("scanQrcode", new BridgeHandler() { + @Override + public void handler(Context context, String s, CallBackFunction callBackFunction) {//充值 + LogUtils.d("获取到的数据scanQrcode:" + s); + callBackFunctionLocation = callBackFunction; + if (PermissionUtils.hasPermissions( + JsBridgeActivity.this, Manifest.permission.CAMERA)) { + + ScanUtilHtml.startScan(JsBridgeActivity.this, MainActivity.REQUEST_CODE_FOR_QRCODE_SCAN, + new HmsScanAnalyzerOptions.Creator().setHmsScanTypes(HmsScan.ALL_SCAN_TYPE).create()); + } else { + requestCameraPermission(Manifest.permission.CAMERA); + } + } + }); + + viewBinding.jsbridgeBridgewebview.addHandlerLocal("topup_pass", new BridgeHandler() { + @Override + public void handler(Context context, String s, CallBackFunction callBackFunction) {//充值 + + LoginBean loginBean = DataUtils.getLocUserInfo(); + if (loginBean != null && loginBean.getUser() != null) { +// if (loginBean.getUser().getForbidQCoin() == 1) { +// toRengong(); +// callBackFunction.onCallBack(""); +// return; +// } + s = s.replace("\"", ""); + PayDialog payDialog = new PayDialog(JsBridgeActivity.this, "", false); + String finalS = s; + payDialog.setOntoAlbumListener(new PayDialog.OnListItemClickListener() { + @Override + public void onPayPass(String pass) { + callBackFunction.onCallBack(pass); + } + + @Override + public void dimess() { + callBackFunction.onCallBack(""); + } + }); + payDialog.show(); + } + + } + }); + + + viewBinding.jsbridgeBridgewebview.addHandlerLocal("getOffLine", new BridgeHandler() { + @Override + public void handler(Context context, String s, CallBackFunction callBackFunction) {//充值 + callBackFunction.onCallBack(""); + // TODO: 2023/11/6 跳充值 +// startActivity(new Intent(JsBridgeActivity.this, TopActivity.class)); + + } + }); + + viewBinding.jsbridgeBridgewebview.addHandlerLocal("getLocation", new BridgeHandler() { + @Override + public void handler(Context context, String s, CallBackFunction callBackFunction) {//充值 + callBackFunctionLocation = callBackFunction; + + initLocation(); + } + }); + + + viewBinding.jsbridgeBridgewebview.addHandlerLocal("withdrawal", new BridgeHandler() { + @Override + public void handler(Context context, String s, CallBackFunction callBackFunction) {//提现 + + } + }); + + + viewBinding.jsbridgeBridgewebview.addHandlerLocal("getUserInfo", new BridgeHandler() { + @Override + public void handler(Context context, String s, CallBackFunction callBackFunction) { + LogUtils.d("getUserInfo"); + mUserInfoCallback = callBackFunction; + LoginBean userInfoBean = DataUtils.getLocUserInfo(); + LogUtils.d("回调结果:" + GsonUtils.beanToJSONString(userInfoBean.getUser())); + mUserInfoCallback.onCallBack(GsonUtils.beanToJSONString(userInfoBean.getUser())); + +// getUser(); + + } + }); + + +// jsbridgeBridgewebview.addHandlerLocal("getWalletId", new BridgeHandler() { +// @Override +// public void handler(Context context, String s, CallBackFunction callBackFunction) { +// LogUtils.i("执行了getWalletId"); +// callBackFunction.onCallBack(SophixStubApplication.getString("wallet_uuid", "")); +// } +// }); + + + viewBinding.jsbridgeBridgewebview.addHandlerLocal("changeTitleColor", new BridgeHandler() { + @Override + public void handler(Context context, String s, CallBackFunction callBackFunction) { + LogUtils.d("执行了getWalletId"); + callBackFunction.onCallBack(""); + H5ChangeTitle title = GsonUtils.getObjFromJSON(s, H5ChangeTitle.class); + if (!title.getColor().startsWith("#") && title.getColor().length() == 6) { + title.setColor("#" + title.getColor()); + } + + if (!title.getBg().startsWith("#") && title.getBg().length() == 6) { + title.setBg("#" + title.getBg()); + } + changTitleColor(title); + } + }); + + + viewBinding.jsbridgeBridgewebview.addHandlerLocal("finish", new BridgeHandler() { + @Override + public void handler(Context context, String s, CallBackFunction callBackFunction) { + LogUtils.d("finish"); + callBackFunction.onCallBack(""); + finish(); + } + }); + + //js通知要跳转新网址 + viewBinding.jsbridgeBridgewebview.addHandlerLocal("toNewGame", new BridgeHandler() { + @Override + public void handler(Context context, String s, CallBackFunction callBackFunction) { + LogUtils.d("toNewGame"); + callBackFunction.onCallBack(""); + s = s.replace("\"", ""); + viewBinding.jsbridgeBridgewebview.loadUrl(s); + } + }); + + + viewBinding.jsbridgeBridgewebview.addHandlerLocal("goBack", new BridgeHandler() { + @Override + public void handler(Context context, String s, CallBackFunction callBackFunction) { + LogUtils.d("goBack"); + callBackFunction.onCallBack(""); + onBack(); + } + }); + + viewBinding.jsbridgeBridgewebview.addHandlerLocal("googleNavigation", new BridgeHandler() { + @Override + public void handler(Context context, String s, CallBackFunction callBackFunction) { + LogUtils.d("googleNavigation"); + callBackFunction.onCallBack(""); + + MapNavigator.googleGuide(JsBridgeActivity.this, s); + } + }); + + viewBinding.jsbridgeBridgewebview.addHandlerLocal("getLanguage", new BridgeHandler() { + @Override + public void handler(Context context, String s, CallBackFunction callBackFunction) { + LogUtils.d("getLanguage"); + int loc = DataUtils.get(IMApplication.getAppContext(), "locale", 1); + String lauguage = "zh-TW"; + switch (loc) { + case 1: + lauguage = "zh-CN"; + break; + case 2: + lauguage = "en-US"; + break; + case 3: + lauguage = "ja-JP"; + break; + } + + callBackFunction.onCallBack(lauguage); + } + }); + + viewBinding.jsbridgeBridgewebview.addHandlerLocal("getUserToken", new BridgeHandler() { + @Override + public void handler(Context context, String s, CallBackFunction callBackFunction) { + LogUtils.d("getUserToken"); + LogUtils.d("getUserToken:" + DataUtils.getToken()); + + callBackFunction.onCallBack(DataUtils.getToken()); + } + }); + + viewBinding.jsbridgeBridgewebview.addHandlerLocal("isSupportsNFC", new BridgeHandler() { + @Override + public void handler(Context context, String s, CallBackFunction callBackFunction) { + + NfcManager nfcManager = (NfcManager) getSystemService(Context.NFC_SERVICE); + NfcAdapter nfcAdapter = nfcManager.getDefaultAdapter(); + if (nfcAdapter == null) { + callBackFunction.onCallBack("0"); + } else { + callBackFunction.onCallBack("1"); + } + + } + }); + //NFC支付 + viewBinding.jsbridgeBridgewebview.addHandlerLocal("nfcPay", new BridgeHandler() { + @Override + public void handler(Context context, String s, CallBackFunction callBackFunction) { + callbackNfcFunction = callBackFunction; + if (nfcAdapter == null) { + // 检查设备是否支持NFC功能 + NfcManager nfcManager = (NfcManager) getSystemService(Context.NFC_SERVICE); + nfcAdapter = nfcManager.getDefaultAdapter(); + if (nfcAdapter == null) { + // 设备不支持NFC功能 +// Toast.makeText(JsBridgeActivity.this, "该设备不支持NFC功能", Toast.LENGTH_SHORT).show(); + callBackFunction.onCallBack(""); + + ActionConfirmDialog1 actionConfirmDialog = new ActionConfirmDialog1(JsBridgeActivity.this, + getString(R.string.tcdl_tips_txt2), "", getString(R.string.general_got_it), false); + actionConfirmDialog.setOnToActionListener(new ActionConfirmDialog1.OnToActionListener() { + @Override + public void toSumbit() { + + } + + @Override + public void toCancel() { + + } + }); + actionConfirmDialog.show(); + + return; + } + // 检查NFC是否打开 + if (!nfcAdapter.isEnabled()) { + setConfirDialog(callBackFunction); + } + } else if (!nfcAdapter.isEnabled()) { + setConfirDialog(callBackFunction); + } else { + nfcReadData(); + } + } + }); + + viewBinding.jsbridgeBridgewebview.addHandlerLocal("payWithFriend", new BridgeHandler() { + @Override + public void handler(Context context, String s, CallBackFunction callBackFunction) { + // 弹窗 + LogUtils.d("showCallback"); + if (contactSelectorDialog == null) { + fetchFriendsInfo(callBackFunction); //获取好友信息 + } else { + showSelectorFriendDialog(callBackFunction); + } + + + } + }); + + viewBinding.jsbridgeBridgewebview.addHandlerLocal("getOrderInfo", new BridgeHandler() { + @Override + public void handler(Context context, String s, CallBackFunction callBackFunction) { + // 订单ID,总金额,商品图片url, + try { +// JSONObject jsonObject = new JSONObject(s); +// String img = jsonObject.optString("img"); +// String money = jsonObject.optString("money"); +// String orderid = jsonObject.optString("orderid"); +// String payUid = jsonObject.optString("payUid"); + JsBridgeOrderBean orderBean = GsonUtils.getObjFromJSON(s, JsBridgeOrderBean.class); + toFrinedPayMessage(orderBean, ""); + } catch (Exception e) { + LogUtils.d("参数为空"); + } + } + }); + } + + + public ContactViewModel viewModel; + public ConversationViewModel conversationViewModel; + public SearchViewModel searchViewModel; + public List accountList; + public List lastlist; + public List lovelist; + FunContactSelectorDialog contactSelectorDialog; + + //邀请好友 + public void fetchFriendsInfo(CallBackFunction callBackFunction) { + viewModel = new ViewModelProvider(this).get(ContactViewModel.class); + conversationViewModel = new ViewModelProvider(this).get(ConversationViewModel.class); + searchViewModel = new ViewModelProvider(this).get(SearchViewModel.class); + viewModel + .getContactLiveData() + .observe( + this, + contactBeansResult -> { + if (contactBeansResult.getLoadStatus() == LoadStatus.Success) { + //好友列表 + accountList = contactBeansResult.getData(); + showSelectorFriendDialog(callBackFunction); + } + }); + + conversationViewModel + .getQueryLiveData() + .observe( + this, + result -> { + if (result.getLoadStatus() == LoadStatus.Success) { + lastlist = convertConvacationList(result.getData()); + } + + }); + + + searchViewModel.getQueryLiveData().observe(this, result -> { + if (result.getLoadStatus() == LoadStatus.Success) { + if (result.getData() != null && result.getData().size() > 0) { + if (contactSelectorDialog != null) { + contactSelectorDialog.showSearchResult(result.getData()); + } + } + + } + }); + conversationViewModel.fetchConversation(); + viewModel.fetchContactList(); + lovelist = new ArrayList<>(); //特别关注 + List followlist = ShareDateUtils.getFollowUsers(); + if (followlist != null) { + lovelist = convertFollowList(followlist, lovelist); + } + + + } + + public void showSelectorFriendDialog(CallBackFunction callBackFunction) { + if (contactSelectorDialog == null) { + contactSelectorDialog = new FunContactSelectorDialog(JsBridgeActivity.this) + .setSelector(new ArrayList<>()) + .setTeamShow(false) + .setAccountList(accountList) + .setLastList(lastlist) + .setLoveList(lovelist) + .setActionListener(new FunContactSelectorDialog.onActionClickListener() { + @Override + public void invited(List listaccount, List listname, List listavat) { + + } + + @Override + public void search(String text) { + searchViewModel.queryFriend(text); + } + }); + + } + contactSelectorDialog.setOnSelectorItemClickListener(new FunContactSelectorDialog.onSelectorItemClickListener() { + @Override + public void close() { + contactSelectorDialog.setSelector(null); + contactSelectorDialog.cancel(); + callBackFunction.onCallBack(""); + + } + + @Override + public void selector(String userId) { + contactSelectorDialog.setSelector(null); + contactSelectorDialog.cancel(); + callBackFunction.onCallBack(userId); + + + } + }); + contactSelectorDialog.show(); + } + + public List convertFollowList(List list, List contactFriendBeans) { + for (UsersExistBean bean : list) { + FriendInfo friendInfo = new FriendInfo(String.valueOf(bean.getUserId()), bean.getNickname(), ""); + friendInfo.setUserInfo(new UserInfo(String.valueOf(bean.getUserId()), bean.getNickname(), bean.getAvatar())); + ContactFriendBean item = new ContactFriendBean(friendInfo); + contactFriendBeans.add(item); + } + return contactFriendBeans; + } + + public List convertConvacationList(List list) { + List contactFriendBeans = new ArrayList<>(); + + for (ConversationBean bean : list) { + ConversationInfo conversationInfo = bean.infoData; + if (conversationInfo.getFriendInfo() != null) { + FriendInfo friendInfo = conversationInfo.getFriendInfo(); + friendInfo.setUserInfo(conversationInfo.getUserInfo()); + ContactFriendBean item = new ContactFriendBean(friendInfo); + contactFriendBeans.add(item); + + } + } + return contactFriendBeans; + } + + //代付消息 + private void toFrinedPayMessage(JsBridgeOrderBean bean, String content) { + HelpPayAttachment helpPayAttachment = new HelpPayAttachment(bean.getOrderid(), + IMKitClient.account(), bean.getPayUid(), bean.getImg(), + bean.getMoney()); + IMMessage customMessage = MessageBuilder.createCustomMessage(bean.getPayUid(), SessionTypeEnum.P2P, content, helpPayAttachment); + if (customMessage != null) { + ChatRepo.sendMessage( + customMessage, + false, + new FetchCallbackImpl() { + @Override + public void onSuccess(@Nullable Void param) { + super.onSuccess(param); + ToastX.showShortToast(getString(R.string.message_share_success)); + } + + @Override + public void onFailed(int code) { + + } + }); + } + + if (!TextUtils.isEmpty(content)) { + IMMessage textMessage = MessageBuilder.createTextMessage(bean.getPayUid(), SessionTypeEnum.P2P, content); + ChatRepo.sendMessage(textMessage, false, new FetchCallback() { + @Override + public void onSuccess(@Nullable Void unused) { + + } + + @Override + public void onFailed(int i) { + + } + + @Override + public void onException(@Nullable Throwable throwable) { + } + }); + } + + } + + + public void nfcReadData() { + //弹窗 + showNfcReadDialog(true); + nfcAdapter.enableReaderMode(JsBridgeActivity.this, new NfcAdapter.ReaderCallback() { + @Override + public void onTagDiscovered(Tag tag) { + byte[] byteArray = tag.getId(); + for (int i = 0; i < byteArray.length / 2; i++) { + byte temp = byteArray[i]; + byteArray[i] = byteArray[byteArray.length - 1 - i]; + byteArray[byteArray.length - 1 - i] = temp; + } + String result = byteArrayToHexStr(byteArray); + callbackNfcFunction.onCallBack(result); + callbackNfcFunction = null; + showNfcReadDialog(false); + nfcAdapter.disableReaderMode(JsBridgeActivity.this); + + } + + @NonNull + @Override + public String toString() { + return super.toString(); + } + }, (NfcAdapter.FLAG_READER_NFC_F | + NfcAdapter.FLAG_READER_NFC_V | + NfcAdapter.FLAG_READER_NFC_BARCODE), null); + } + + private BottomSheetDialog bottomSheetDialog; + + public void showNfcReadDialog(boolean isStart) { + if (bottomSheetDialog != null) { + bottomSheetDialog.dismiss(); + } + bottomSheetDialog = new BottomSheetDialog(this, R.style.BottomSheetDialog); + View bottomView = LayoutInflater.from(this).inflate(R.layout.dialog_bottom_nfcread, null); + TextView tvTitle = bottomView.findViewById(R.id.tv_nfcread_title); + AppCompatImageView ivStatus = bottomView.findViewById(R.id.iv_nfcread_status); + TextView tvStatus = bottomView.findViewById(R.id.tv_nfcread_status); + TextView tvCancel = bottomView.findViewById(R.id.tv_nfcread_cancel); + if (isStart) { + tvTitle.setVisibility(View.VISIBLE); + tvCancel.setVisibility(View.VISIBLE); + tvStatus.setText(getString(com.dskj.rbchat.R.string.nfctitle_dialog_status)); + Glide.with(this).load(R.mipmap.nfc_read).into(ivStatus); + tvCancel.setOnClickListener(view -> { + nfcAdapter.disableReaderMode(this); + bottomSheetDialog.dismiss(); + callbackNfcFunction.onCallBack(""); + }); + } else { + tvTitle.setVisibility(View.INVISIBLE); + tvCancel.setVisibility(View.INVISIBLE); + tvStatus.setText(getString(R.string.nfctitle_dialog_succes)); + ivStatus.setImageResource(R.mipmap.nfc_success); + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + bottomSheetDialog.dismiss(); + } + }, 1000); + } + bottomSheetDialog.setContentView(bottomView); + bottomSheetDialog.setCanceledOnTouchOutside(false); + bottomSheetDialog.show(); + } + + public void setConfirDialog(CallBackFunction callBack) { + callBack.onCallBack(""); + // NFC未打开,弹窗 + ActionConfirmDialog actionConfirmDialog = new ActionConfirmDialog(this, getString(R.string.nfctitle_txt), true); + actionConfirmDialog.setCanceledOnTouchOutside(false); + actionConfirmDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + startActivity(new Intent(Settings.ACTION_NFC_SETTINGS)); //弹窗提示 + + } + + @Override + public void toCancel() { + + } + }); + actionConfirmDialog.show(); + + } + + //转hex + public static String byteArrayToHexStr(byte[] byteArray) { + if (byteArray == null) { + return null; + } + char[] hexArray = "0123456789abcdef".toCharArray(); + char[] hexChars = new char[byteArray.length * 2]; + for (int j = 0; j < byteArray.length; j++) { + int v = byteArray[j] & 0xFF; + hexChars[j * 2] = hexArray[v >>> 4]; + hexChars[j * 2 + 1] = hexArray[v & 0x0F]; + } + return new String(hexChars); + + } + + + private void getUser() { + Api.getInstance().userInfo(IMKitClient.account()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result feedbackResp) { + LogUtils.d("回调结果:" + GsonUtils.beanToJSONString(feedbackResp.data)); + mUserInfoCallback.onCallBack(GsonUtils.beanToJSONString(feedbackResp.data)); + + } + + @Override + public void onError(int code, String msg) { + LoginBean userInfoBean = DataUtils.getLocUserInfo(); + LogUtils.d("回调结果ERROR:" + GsonUtils.beanToJSONString(userInfoBean.getUser())); + mUserInfoCallback.onCallBack(GsonUtils.beanToJSONString(userInfoBean.getUser())); + } + }); + } + + protected ActivityResultLauncher permissionLauncher; + + private void requestCameraPermission(String permission) { + permissionLauncher.launch(new String[]{permission}); + } + + private void toRengong() { + ActionConfirmDialog actionDialog = new ActionConfirmDialog(JsBridgeActivity.this, getString(R.string.ndqbbdj_txt), getString(R.string.general_got_it), + getString(R.string.lxkh_txt)); + actionDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + toKefu(); + } + + @Override + public void toCancel() { + + } + }); + actionDialog.show(); + + } + + + public void toKefu() { + Api.getInstance().helpCenterStaffServiceId(IMUIKitConfig.SUBSTATIONID, 1) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + toRengongCallTop(feedbackResp.data.getStaffServiceId(), feedbackResp.data.getStaffServiceNickname()); + } + + @Override + public void onError(int code, String msg) { +// WidgetUtils.showToast(JsBridgeActivity.this, msg, WidgetUtils.ToastType.ERROR); +// toRengongCall(400227); + ToastX.showShortToast(msg); + + } + }); + } + + + public void toRengongCallTop(Integer staffServiceId, String name) { +// Intent i = IntentFactory.createTempChatIntent(JsBridgeActivity.this, staffServiceId+"", name); +// startActivity(i); + } + + + private void viewTime(Integer questionId) { + Api.getInstance().announcementIdViewTime(questionId + "") + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver() { + @Override + public void onSuccess(Result feedbackResp) { + + } + + @Override + public void onError(int code, String msg) { + + } + }); + } + + public void onBack() { + onBackPressed(); + } + + @Override + public void onBackPressed() { + super.onBackPressed(); + + + } + + + private void changTitleColor(H5ChangeTitle title) { + } + + + /** + * Android 强制修改刷新 token + */ + private void setToken() { + LogUtils.i("执行了setToken"); + LoginBean userInfoBean = DataUtils.getLocUserInfo(); + if (userInfoBean != null) { + viewBinding.jsbridgeBridgewebview.callHandler("setToken", userInfoBean.getToken(), new OnBridgeCallback() { + @Override + public void onCallBack(String data) { + Log.d("wvjsblog", "Java received response: " + data.toString()); + } + }); + } + } + + + /** + * WebChromeClient 实现类 + */ + + public class myWebChromeClient extends WebChromeClient { + + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + @Override + public boolean onShowFileChooser(WebView webView, ValueCallback filePathCallback, FileChooserParams fileChooserParams) { + LogUtils.i("数据接口:onShowFileChooser"); + mUploadCallbackForHighApi = filePathCallback; + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + LogUtils.i("数据接口:onShowFileChooser11111"); + + pickMultipleMedia.launch(new PickVisualMediaRequest.Builder() + .setMediaType(PickVisualMedia.ImageOnly.INSTANCE) + .build()); + } else { + Intent intent = fileChooserParams.createIntent(); + intent.addCategory(Intent.CATEGORY_OPENABLE); + try { + startActivityForResult(intent, REQUEST_CODE_FILE_CHOOSER); + } catch (ActivityNotFoundException e) { + mUploadCallbackForHighApi = null; +// WidgetUtils.showToast(JsBridgeActivity.this, "未知错误", WidgetUtils.ToastType.ERROR); + ToastX.showShortToast("未知错误"); + return false; + } + } + return true; + } + + // For 3.0+ + protected void openFileChooser(ValueCallback uploadMsg, String acceptType) { + LogUtils.i("数据接口:openFileChooseracceptType"); + + openFilerChooser(uploadMsg); + } +// +// //For Android 4.1+ +// protected void openFileChooser(ValueCallback uploadMsg, String acceptType, String capture) { +// openFilerChooser(uploadMsg); +// } + + private void openFilerChooser(ValueCallback uploadMsg) { + LogUtils.i("数据接口:openFileChooser"); + + mUploadCallbackForLowApi = uploadMsg; + startActivityForResult(Intent.createChooser(getFilerChooserIntent(), "File Chooser"), REQUEST_CODE_FILE_CHOOSER); + } + + + private Intent getFilerChooserIntent() { + Intent intent = new Intent(Intent.ACTION_GET_CONTENT); + intent.addCategory(Intent.CATEGORY_OPENABLE); + return intent; + } + + + @Override + public void onReceivedTitle(WebView view, String title) { + super.onReceivedTitle(view, title); + // 设置title + try { + if (!isText) { + setTitle(title); + } + } catch (Exception e) { + e.printStackTrace(); + } + + + } + + } + + AMapLocation aMapLocation; + //声明AMapLocationClientOption对象 + public AMapLocationClientOption mLocationOption = null; + //声明AMapLocationClient类对象 + public AMapLocationClient mLocationClient = null; + //声明定位回调监听器 + public AMapLocationListener mLocationListener; + + private void initLocation() { + if (aMapLocation == null) { + showLoc(); + } else { + toLocation(); + } + } + + private void showLoc() { + int cameraPermission = ContextCompat.checkSelfPermission(JsBridgeActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION); + if (cameraPermission == PackageManager.PERMISSION_GRANTED) { + int cameraPermission1 = ContextCompat.checkSelfPermission(JsBridgeActivity.this, Manifest.permission.ACCESS_FINE_LOCATION); + if (cameraPermission1 == PackageManager.PERMISSION_GRANTED) { + toLocation(); + } else { + toShowNoPer(); + } +// toLocation(); + + } else { + toShowNoPer(); + } + + + } + + public PermissionExplainDialog permissionExplainDialog; + + private void toShowNoPer() { + String[] permissions = { + Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION + }; + permissionExplainDialog = new PermissionExplainDialog(JsBridgeActivity.this, getResources().getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_location_title), getResources().getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_location_content)); + permissionExplainDialog.show(); + Permission.requirePermissions(IMKitClient.getApplicationContext(), permissions) + .request( + new Permission.PermissionCallback() { + @Override + public void onGranted(List permissionsGranted) { + toLocation(); + permissionExplainDialog.dismiss(); + } + + @Override + public void onDenial( + List permissionsDenial, List permissionDenialForever) { + permissionExplainDialog.dismiss(); + Map map1 = new HashMap<>(); + map1.put("code", 0); + map1.put("error", "用户未授权"); + callBackFunctionLocation.onCallBack(GsonUtils.beanToJSONString(map1)); + } + + @Override + public void onException(Exception exception) { + permissionExplainDialog.dismiss(); + Toast.makeText(JsBridgeActivity.this, com.netease.yunxin.kit.chatkit.ui.R.string.permission_default, Toast.LENGTH_SHORT) + .show(); + Map map1 = new HashMap<>(); + map1.put("code", 0); + map1.put("error", "用户未授权"); + callBackFunctionLocation.onCallBack(GsonUtils.beanToJSONString(map1)); + } + }); + } + + + private void toLocation() { + //设置定位回调监听 + mLocationListener = amapLocation -> { + if (amapLocation != null) { + if (amapLocation.getErrorCode() == 0) { + if (aMapLocation == null) { + aMapLocation = amapLocation; + } + //可在其中解析amapLocation获取相应内容。 + LogUtils.i("定位位置:" + amapLocation.getLatitude() + ";;" + amapLocation.getLongitude() + ";" + + amapLocation.getAddress() + ";" + amapLocation.getCountry() + ";" + amapLocation.getCity() + ";" + amapLocation.getProvince()); + + toInfo(amapLocation); + + } else { + //定位失败时,可通过ErrCode(错误码)信息来确定失败的原因,errInfo是错误信息,详见错误码表。 + Map map1 = new HashMap<>(); + map1.put("code", 0); + map1.put("error", "定位失败"); + callBackFunctionLocation.onCallBack(GsonUtils.beanToJSONString(map1)); + + } + } else { + Map map1 = new HashMap<>(); + map1.put("code", 0); + map1.put("error", "定位数据为空"); + callBackFunctionLocation.onCallBack(GsonUtils.beanToJSONString(map1)); + + } + }; + + //初始化AMapLocationClientOption对象 + mLocationOption = new AMapLocationClientOption(); + mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy); + mLocationOption.setOnceLocation(true); + mLocationOption.setOnceLocationLatest(true); + mLocationOption.setHttpTimeOut(20000); + mLocationOption.setLocationCacheEnable(false); + + //初始化定位 + try { + mLocationClient = new AMapLocationClient(JsBridgeActivity.this); + mLocationClient.setLocationOption(mLocationOption); + mLocationClient.setLocationListener(mLocationListener); + mLocationClient.startLocation(); + } catch (Exception e) { + e.printStackTrace(); + } + + + } + + private void toInfo(AMapLocation amapLocation) { + + + List
addresses; + + Geocoder geocoder = new Geocoder(JsBridgeActivity.this, Locale.TAIWAN); + String addStr = null; + try { + addresses = geocoder.getFromLocation(amapLocation.getLatitude(), amapLocation.getLongitude(), 1); + LogUtils.i("选择地址11111111111"); + + String address = addresses.get(0).getAddressLine(0); + String city = addresses.get(0).getLocality(); + String state = addresses.get(0).getAdminArea(); + String zipCode = addresses.get(0).getPostalCode(); + String country = addresses.get(0).getCountryCode(); + addStr = address + "," + city + "," + state + "," + zipCode + "," + country; + LogUtils.i("选择地址222222222222"); + + LogUtils.i("选择地址" + addStr); + + Map maps = new HashMap<>(); + maps.put("code", 1); + maps.put("longitude", amapLocation.getLongitude()); + maps.put("latitude", amapLocation.getLatitude()); + maps.put("address", address); + maps.put("country", country); + maps.put("province", state); + maps.put("city", city); + LogUtils.i("回调结构:" + GsonUtils.beanToJSONString(maps)); + callBackFunctionLocation.onCallBack(GsonUtils.beanToJSONString(maps)); + } catch (IOException e) { + e.printStackTrace(); + LogUtils.i("选择地址333333333"); + + Map maps = new HashMap<>(); + maps.put("code", 1); + maps.put("longitude", amapLocation.getLongitude()); + maps.put("latitude", amapLocation.getLatitude()); + maps.put("address", amapLocation.getAddress()); + maps.put("country", amapLocation.getCountry()); + maps.put("province", amapLocation.getProvince()); + maps.put("city", amapLocation.getCity()); + LogUtils.i("回调结构:" + GsonUtils.beanToJSONString(maps)); + callBackFunctionLocation.onCallBack(GsonUtils.beanToJSONString(maps)); + + } + + + } + + + /** + * onActivityResult方法 + */ + + private void afterFileChooseGoing(int resultCode, Intent data) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + if (mUploadCallbackForHighApi == null) { + return; + } + LogUtils.i("11111111111111111111111111"); + LogUtils.i("11111111111111111111111111:" + WebChromeClient.FileChooserParams.parseResult(resultCode, data)); + LogUtils.i("11111111111111111111111111:" + data.getData()); + + mUploadCallbackForHighApi.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, data)); + mUploadCallbackForHighApi = null; + } else { + if (mUploadCallbackForLowApi == null) { + return; + } + Uri result = data == null ? null : data.getData(); + mUploadCallbackForLowApi.onReceiveValue(result); + mUploadCallbackForLowApi = null; + } + } + + public static int REQUEST_CODE_FOR_QRCODE_SCAN = 1016; + + @Override + protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + super.onActivityResult(requestCode, resultCode, data); + switch (requestCode) { + case REQUEST_CODE_FILE_CHOOSER: + if (resultCode == RESULT_OK || resultCode == RESULT_CANCELED) { + LogUtils.i("000000000000000000000:" + data.getData() + ";;;" + resultCode); + afterFileChooseGoing(resultCode, data); + } + break; + + case 1016: + try { + Object obj = data.getParcelableExtra(ScanUtil.RESULT); + if (obj instanceof HmsScan) { + if (!TextUtils.isEmpty(((HmsScan) obj).getOriginalValue())) { + String result1 = ((HmsScan) obj).getOriginalValue(); +// LogUtils.i("回调数据:"+result1); + QRCodeScheme.QRCodeData qrData = QRCodeScheme.parseCodeData(result1); + // 2维码内容前缀(形如“time_go_chat://add_user/”) + LogUtils.i("行动码是啥111:" + GsonUtils.beanToJSONString(qrData)); + + //{"scheme":"time_go_chat://payment_bead/","userId":"10","value":"388a762b474f944b"} + String scheme = qrData.getScheme(); + if (scheme.startsWith("http")) { + if (scheme.startsWith("https://admin.letschat2023.com/") && scheme.contains("deviceId")) { + sendMachine(scheme); + } + } + + if (scheme.equals("time_go_chat://payment_bead/")) { + if (bindBean != null) { + if (!bindBean.getPhoneBind()) { + showDialog(); + } else if (!bindBean.getPayPasswordSet()) { + showDialogPay(); + } else { + if (DataUtils.get(JsBridgeActivity.this, "hasFinger", false)) { + showPayCashFingerDialog(qrData.getValue(), qrData.getUserId(), MainActivity.TYPE_PAYMENT_BEAD); + } else { + showPayCashDialog(qrData.getValue(), qrData.getUserId(), MainActivity.TYPE_PAYMENT_BEAD); + } + } + } + } + + if (callBackFunctionLocation != null) { + Map map1 = new HashMap<>(); + map1.put("code", 1); + map1.put("data", result1); + LogUtils.i("回调default:" + GsonUtils.beanToJSONString(map1)); + callBackFunctionLocation.onCallBack(GsonUtils.beanToJSONString(map1)); + } + + } else { +// errCode("无效的行动码"); + errCode(getString(R.string.qrcode_scan_activity_not_surpport_qrcontent)); + + } + return; + } else { + errCode(getString(R.string.qrcode_scan_activity_not_surpport_qrcontent)); + + } + } catch (Exception e) { + errCode("取消了扫码"); + + } + + break; + + + default: + + } + } + + + PayCashDialog payDialog; + PayCashFingerDialog payCashFingerDialog; + + private void showPayCashFingerDialog(String did, String number, int type) { + + payCashFingerDialog = new PayCashFingerDialog(this, (Integer.parseInt(number)) + "", true, 0, walletBean, null, 2, + String.format(getString(R.string.fukuangei_txt), getString(R.string.shuzhuji_txt))); + + payCashFingerDialog.setOntoAlbumListener(new PayCashFingerDialog.OnListItemClickListener() { + @Override + public void onChangePassword() { + showPayCashDialog(did, number, type); + } + + @Override + public void toFinger() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + checkPayFinger(did, number, type); + } + } + + @Override + public void dimess() { + payCashFingerDialog.dismiss(); + } + }); + payCashFingerDialog.show(); + } + + @RequiresApi(api = Build.VERSION_CODES.M) + private void checkPayFinger(String did, String number, int type) { + + FingerManager.build().setApplication(IMApplication.getInstance()) + .setTitle(" ") + .setDes(" ") + .setNegativeText(" ") + .setFingerCheckCallback(new SimpleFingerCheckCallback() { + + @Override + public void onSucceed() { + ToastX.showShortToast("验证成功"); + payCashFingerDialog.dismiss(); + if (type == MainActivity.TYPE_PAYMENT_BEAD) { + toChange2(null, did, number, 2); + } + } + + @Override + public void onError(String error) { + ToastX.showShortToast("验证失败"); + + } + + @Override + public void onCancel() { + ToastX.showShortToast("您取消了识别"); + + } + }) + .setFingerChangeCallback(new AonFingerChangeCallback() { + + @Override + protected void onFingerDataChange() { + ToastX.showShortToast("指纹数据发生了变化"); + FingerManager.updateFingerData(JsBridgeActivity.this); + new Handler().postDelayed(() -> checkPayFinger(did, number, type), 1000); + } + }) + .create() + .startListener(JsBridgeActivity.this); + } + + private void toChange2(String password, String did, String number, int type) { + Map maps = new HashMap<>(); + maps.put("amount", Integer.parseInt(number) * 100); + maps.put("payVerifyCode", type); + if (!TextUtils.isEmpty(password)) { + maps.put("payPassword", password); + } + maps.put("deviceId", did); + Api.getInstance().danzhuPay(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver() { + @Override + public void onSuccess(Result feedbackResp) { + ToastX.showShortToast(getString(R.string.zhiufuchengg_txt)); + getWallet(); + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast(msg); + + } + }); + } + + private void showPayCashDialog(String did, String number, int type) { + + payDialog = new PayCashDialog(JsBridgeActivity.this, (Integer.parseInt(number)) + "", true, 0, walletBean, + null, 2, String.format(getString(R.string.fukuangei_txt), getString(R.string.shuzhuji_txt))); + + payDialog.setOntoAlbumListener(new PayCashDialog.OnListItemClickListener() { + @Override + public void onPayPass(String position) { + if (type == MainActivity.TYPE_PAYMENT_BEAD) { + toChange2(position, did, number, 1); + } + } + + @RequiresApi(api = Build.VERSION_CODES.M) + @Override + public void onChangeFinger() { + showPayCashFingerDialog(did, number, type); + } + + @Override + public void dimess() { + payDialog.dismiss(); + + } + }); + payDialog.show(); + } + + + private void showDialogPay() { + + com.netease.yunxin.kit.chatkit.ui.dialog.ActionConfirmDialog actionDialog = + new com.netease.yunxin.kit.chatkit.ui.dialog.ActionConfirmDialog(JsBridgeActivity.this, + getString(com.netease.yunxin.kit.chatkit.ui.R.string.bind_phone_des_txt1), getString(com.netease.yunxin.kit.chatkit.ui.R.string.cancel_txt), getString(com.netease.yunxin.kit.chatkit.ui.R.string.to_sett_txt)); + actionDialog.setOnToActionListener(new com.netease.yunxin.kit.chatkit.ui.dialog.ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + Intent intent = new Intent(JsBridgeActivity.this, SetPayPasswordActivity.class); + startActivity(intent); + } + + @Override + public void toCancel() { + + } + }); + actionDialog.show(); + } + + private void showDialog() { + + ActionConfirmDialog actionDialog = new ActionConfirmDialog(JsBridgeActivity.this, + getString(R.string.bind_phone_des_txt), getString(R.string.nobind_txt), getString(R.string.tobind_txt)); + actionDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + Intent intent = new Intent(JsBridgeActivity.this, ChangeAccoutActionActivity.class); + intent.putExtra("type", ChangeAccoutActionActivity.TYPE_BIND_PHONE); + startActivity(intent); + } + + @Override + public void toCancel() { + + } + }); + actionDialog.show(); + } + + + private void sendMachine(String scheme) { + scheme = scheme.replace("https://admin.letschat2023.com/#/downLoad", "https://www.baidu.com"); + Uri uri = Uri.parse(scheme); + LogUtils.i("数据是啥:" + scheme); + String id = uri.getQueryParameter("deviceId"); //id 值 10943 + Intent intent = new Intent(JsBridgeActivity.this, AuthorizeActivity.class); + intent.putExtra("deviceId", id); + startActivity(intent); + } + + private void errCode(String errorMessge) { + if (callBackFunctionLocation != null) { + Map map1 = new HashMap<>(); + map1.put("code", 0); + map1.put("error", errorMessge); + LogUtils.i("回调0:" + GsonUtils.beanToJSONString(map1)); + callBackFunctionLocation.onCallBack(GsonUtils.beanToJSONString(map1)); + } + } + + @Override + protected void onResume() { + super.onResume(); + if (bindBean == null || (!bindBean.getPhoneBind()) || (!bindBean.getPayPasswordSet())) { + bindInfo(); + } + } + + + private void bindInfo() { + Api.getInstance().bindInfo(IMKitClient.account()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + bindBean = feedbackResp.data; + LogUtils.i("获取到的数据:" + GsonUtils.beanToJSONString(bindBean)); + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + } + }); + + } + + @Override + protected void onDestroy() { + viewBinding.jsbridgeBridgewebview.destroy(); + super.onDestroy(); + } + +// LoadingDialog loadingDialog; +// public void showLoadingDialog(){ +// if(loadingDialog==null) +// loadingDialog = new LoadingDialog(this); +// loadingDialog.show(); +// } +// +// public void showLoadingDialog(String msg){ +// if(loadingDialog==null) +// loadingDialog = new LoadingDialog(this); +// loadingDialog.setLoadingText(msg); +// loadingDialog.show(); +// } +// +// +// public void dimessLoadingDialog(){ +// if(loadingDialog!=null){ +// loadingDialog.dismiss(); +// } +// +// } + + +// @Override +// protected void onPause() { +// super.onPause(); +// if (nfcAdapter != null) { +// nfcAdapter.disableReaderMode(this); +// } +// } + + public boolean onTouchEvent(MotionEvent event) { + if (null != this.getCurrentFocus()) { + /** + * 点击空白位置 隐藏软键盘 + */ + InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + return mInputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0); + } + return super.onTouchEvent(event); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/imkit/add/FunAddFriendActivity.java b/app/src/main/java/com/dskj/rbchat/imkit/add/FunAddFriendActivity.java new file mode 100644 index 0000000..4d0058b --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/imkit/add/FunAddFriendActivity.java @@ -0,0 +1,139 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.imkit.add; + +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.Toast; + +import androidx.annotation.Nullable; + +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.dialog.SelectCountryDialog; +import com.dskj.rbchat.login.PhoneLoginActivity; +import com.dskj.rbchat.model.CountryBean; +import com.dskj.rbchat.model.ListBeanResult; +import com.dskj.rbchat.model.LoginBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.contactkit.ui.addfriend.BaseAddFriendActivity; +import com.netease.yunxin.kit.contactkit.ui.databinding.FunAddFriendActivityBinding; +import com.netease.yunxin.kit.corekit.im.model.UserInfo; + +import java.util.HashMap; +import java.util.Map; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class FunAddFriendActivity extends BaseAddFriendActivity implements BaseAddFriendActivity.onBaseAddClickListener { + + + CountryBean countryBean; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + // changeStatusBarColor(R.color.color_ededed); + countryBean = DataUtils.getLocCountry(FunAddFriendActivity.this); + tvArea.setOnClickListener(view -> { + SelectCountryDialog selectCountryDialog = new SelectCountryDialog(FunAddFriendActivity.this); + selectCountryDialog.setOnToVipListener(new SelectCountryDialog.OnToTypeListener() { + @Override + public void toType(CountryBean type) { + countryBean = type; + tvArea.setText(countryBean.getAreaCodeName()); + } + }); + selectCountryDialog.show(); + }); + } + + + @Override + protected View initViewAndGetRootView(Bundle savedInstanceState) { + FunAddFriendActivityBinding viewBinding = + FunAddFriendActivityBinding.inflate(getLayoutInflater()); + layoutInputID = viewBinding.layoutAddFriendInput; + etAddFriendAccount = viewBinding.etAddFriendAccount; + ivAddFriendBack = viewBinding.ivAddFriendBack; + ivFriendClear = viewBinding.ivFriendClear; + ivFriendAccountClear = viewBinding.ivFriendaccountClear; + addFriendEmptyLayout = viewBinding.addFriendEmptyLayout; + etAddFriendPhone = viewBinding.phoneEt; + tvAddFriendID = viewBinding.tvSearchfriendId; + tvAddFriendPhone = viewBinding.tvSearchfriendPhone; + layoutInputPhone = viewBinding.lySearchfriendInputphone; + ivAccountSearch = viewBinding.ivFriendaccountSearch; + ivPhoneSearch = viewBinding.ivFriendphoneSearch; + tvArea = viewBinding.areaTv; + layoutUserInfo = viewBinding.layoutUserinfo; + avatarView = viewBinding.avIndexfraHead; + tvUserName = viewBinding.tvUsername; + tvUserTips = viewBinding.tvUsertips; + tvUserinfohint = viewBinding.tvUserinfohint; + + setOnBaseAddClickListener(this); + return viewBinding.getRoot(); + } + + + @Override + public void doSearch(String idOrPhone) { + Map maps = new HashMap<>(); + maps.put("idOrPhone", idOrPhone); + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + Api.getInstance().userSearch(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>>() { + @Override + public void onSuccess(Result> result) { + LogUtils.i("result==" + result.code + "result.data==" + result.data.getList()); + if (result.data.getList() != null && result.data.getList().size() > 0) { + LoginBean bean = result.data.getList().get(0); + loadDataResult(result.code, "", chageUser(bean), bean.getAddFriendNeedVerify() == 1); + } else { + loadDataResult(result.code, "", null, true); + } + + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("code" + code + " msg==" + msg); + loadDataResult(code, msg, null, true); + } + }); + } + + + public UserInfo chageUser(LoginBean loginBean) { + UserInfo userInfo = new UserInfo(loginBean.getUserUid(), loginBean.getNickname(), loginBean.getUserAvatarFileName()); + return userInfo; + } + +// protected void startProfileActivity(UserInfo userInfo) { +// if (userInfo == null) { +// return; +// } +// if (TextUtils.equals(userInfo.getAccount(), IMKitClient.account())) { +// XKitRouter.withKey(RouterConstant.PATH_MINE_INFO_PAGE).withContext(this).navigate(); +// } else { +// XKitRouter.withKey(RouterConstant.PATH_FUN_USER_INFO_PAGE) +// .withContext(this) +// .withParam(RouterConstant.KEY_ACCOUNT_ID_KEY, userInfo.getAccount()) +// .navigate(); +// } +// } +} diff --git a/app/src/main/java/com/dskj/rbchat/imkit/base/BaseSettingOtherActivity.java b/app/src/main/java/com/dskj/rbchat/imkit/base/BaseSettingOtherActivity.java new file mode 100644 index 0000000..8150834 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/imkit/base/BaseSettingOtherActivity.java @@ -0,0 +1,82 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.imkit.base; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.graphics.Typeface; +import android.os.Build; +import android.os.Bundle; +import android.text.TextUtils; +import android.util.TypedValue; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.bumptech.glide.Glide; +import com.dskj.rbchat.R; +import com.dskj.rbchat.base.LllChatBaseActivity; +import com.dskj.rbchat.databinding.ActivityTeamothersettingBinding; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.imkit.team.TeamHeadBgSettingActivity; +import com.dskj.rbchat.imkit.team.TeamMembersListActivity; +import com.dskj.rbchat.imkit.team.TeamSettingActivity; +import com.netease.nimlib.sdk.team.model.Team; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.teamkit.ui.utils.viewmodel.TeamSettingViewModel; + + +/** + * team setting activity + */ +public class BaseSettingOtherActivity extends LllChatBaseActivity { + + public ActivityTeamothersettingBinding binding; + + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = + ActivityTeamothersettingBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + binding.flcleanhistory.setOnClickListener(view -> { + ActionConfirmDialog actionConfirmDialog = new ActionConfirmDialog(this, getString(R.string.setting_cleanhistory), true); + actionConfirmDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + onCleanHistory(); + } + + @Override + public void toCancel() { + + + } + }); + actionConfirmDialog.show(); + }); + } + + @Override + public int initNavigationBarColor() { + return 0; + } + + @Override + public int initStatusBarColor() { + return 0; + } + + + public void onCleanHistory() { + + } + + +} diff --git a/app/src/main/java/com/dskj/rbchat/imkit/base/fragment/SettingPhotoFragment.java b/app/src/main/java/com/dskj/rbchat/imkit/base/fragment/SettingPhotoFragment.java new file mode 100644 index 0000000..89bd728 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/imkit/base/fragment/SettingPhotoFragment.java @@ -0,0 +1,607 @@ +package com.dskj.rbchat.imkit.base.fragment; + +import android.app.Activity; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.text.TextUtils; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.RequestBuilder; +import com.bumptech.glide.load.model.GlideUrl; +import com.bumptech.glide.request.target.CustomTarget; +import com.bumptech.glide.request.target.Target; +import com.bumptech.glide.request.transition.Transition; +import com.dskj.rbchat.R; +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.databinding.FragmentSetresoucePhotoBinding; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.imkit.team.TeamMembersListActivity; +import com.dskj.rbchat.imkit.team.TeamSettingActivity; +import com.dskj.rbchat.model.AlbumBean; +import com.dskj.rbchat.model.HisChatShowBean; +import com.dskj.rbchat.model.UserShareBean; +import com.dskj.rbchat.utils.AdaptScreenUtils; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.utils.ShareDateUtils; +import com.dskj.rbchat.utils.ToolKits; +import com.dskj.rbchat.voom.TiktokActivity; +import com.dskj.rbchat.widget.CircleImageView; +import com.google.android.material.bottomsheet.BottomSheetDialog; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.RequestCallback; +import com.netease.nimlib.sdk.msg.MessageBuilder; +import com.netease.nimlib.sdk.msg.MsgService; +import com.netease.nimlib.sdk.msg.attachment.FileAttachment; +import com.netease.nimlib.sdk.msg.attachment.ImageAttachment; +import com.netease.nimlib.sdk.msg.constant.MsgTypeEnum; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.nimlib.sdk.msg.model.IMMessage; +import com.netease.nimlib.sdk.msg.model.MsgSearchOption; +import com.netease.nimlib.sdk.msg.model.QueryDirectionEnum; +import com.netease.nimlib.sdk.uinfo.UserService; +import com.netease.nimlib.sdk.uinfo.model.NimUserInfo; +import com.netease.yunxin.kit.chatkit.model.IMMessageInfo; +import com.netease.yunxin.kit.chatkit.repo.ChatRepo; +import com.netease.yunxin.kit.chatkit.ui.common.ChatUtils; +import com.netease.yunxin.kit.chatkit.ui.custom.StickerAttachment; +import com.netease.yunxin.kit.chatkit.ui.interfaces.IWathBaseBottomClickListenr; +import com.netease.yunxin.kit.chatkit.ui.model.CleanHistoryEvent; +import com.netease.yunxin.kit.common.ui.fragments.BaseFragment; +import com.netease.yunxin.kit.common.ui.utils.AvatarColor; +import com.netease.yunxin.kit.common.ui.utils.TimeFormatUtils; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.common.ui.widgets.ContactAvatarView; +import com.netease.yunxin.kit.common.utils.UriUtils; +import com.netease.yunxin.kit.contactkit.ui.utils.ColorUtils; +import com.netease.yunxin.kit.corekit.event.EventCenter; +import com.netease.yunxin.kit.corekit.im.model.FriendInfo; +import com.netease.yunxin.kit.corekit.im.provider.FetchCallbackImpl; + +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URISyntaxException; +import java.net.URL; +import java.net.URLConnection; +import java.net.URLDecoder; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.List; + +public class SettingPhotoFragment extends BaseFragment { + ArrayList resultList = new ArrayList<>(); + List hisChatShowBeans = new ArrayList<>(); + private FragmentSetresoucePhotoBinding binding; + int type; + /** + * 1 私聊 2 群聊 + */ + int chatType; + /** + * 用户id 群id + */ + String accId; + + public static SettingPhotoFragment newInstance(int type, int chatType, String accId) { + Bundle bundle = new Bundle(); + bundle.putInt("type", type); + bundle.putInt("chatType", chatType); + bundle.putString("accId", accId); + SettingPhotoFragment view = new SettingPhotoFragment(); + view.setArguments(bundle); + return view; + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + binding = FragmentSetresoucePhotoBinding.inflate(inflater); + type = getArguments().getInt("type"); + chatType = getArguments().getInt("chatType"); + accId = getArguments().getString("accId"); + return binding.getRoot(); + } + + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + initShow(); + } + + private void initShow() { + shareDateUtils = new ShareDateUtils(); + shareDateUtils.getAllSessionList(); + initAdapterChatHist(); + getChatList(); + } + + + private void getChatList() { + List sessionTypeEnums = new ArrayList<>(); + if (type == 0) { + sessionTypeEnums.add(MsgTypeEnum.image); + sessionTypeEnums.add(MsgTypeEnum.video); + MsgSearchOption msgSearchOption = new MsgSearchOption(); + msgSearchOption.setMessageTypes(sessionTypeEnums); + msgSearchOption.setLimit(100); + NIMClient.getService(MsgService.class).searchMessage(chatType == 1 ? SessionTypeEnum.P2P : SessionTypeEnum.Team, accId, msgSearchOption).setCallback(new RequestCallback<>() { + @Override + public void onSuccess(List result) { + commonAdapterReadContents.setDates(result); + changItemList(result); + } + + @Override + public void onFailed(int code) { + + } + + @Override + public void onException(Throwable exception) { + + + } + }); + } + + if (type == 1) { //链接 + IMMessage message = MessageBuilder.createEmptyMessage(accId, chatType == 1 ? SessionTypeEnum.P2P : SessionTypeEnum.Team, System.currentTimeMillis()); + NIMClient.getService(MsgService.class).searchMessageHistory("http", null, message, QueryDirectionEnum.QUERY_OLD, 100).setCallback(new RequestCallback>() { + @Override + public void onSuccess(List result) { + if (result != null && result.size() > 0) { + commonAdapterReadContents.setDates(result); + changItemLinkList(result); + } + } + + @Override + public void onFailed(int code) { + + } + + @Override + public void onException(Throwable exception) { + + } + }); + } + } + + private void changItemLinkList(List result) { + hisChatShowBeans = new ArrayList<>(); + resultList = new ArrayList<>(); + for (IMMessage imMessage : result) { + if (imMessage.getMsgType() == MsgTypeEnum.text) { + resultList.add(new IMMessageInfo(imMessage)); + } + String time = DataUtils.getCurrentTimeMonth(imMessage.getTime()); + boolean isAdd = true; + for (int i = 0; i < hisChatShowBeans.size(); i++) { + if (time.equals(hisChatShowBeans.get(i).title)) { + hisChatShowBeans.get(i).imMessageInfos.add(new IMMessageInfo(imMessage)); + isAdd = false; + break; + } + } + if (isAdd) { + List imMessages = new ArrayList<>(); + imMessages.add(new IMMessageInfo(imMessage)); + hisChatShowBeans.add(new HisChatShowBean(time, imMessages)); + } + + } + if (hisChatShowBeans.size() > 0) { + binding.recyclerssss.setVisibility(View.VISIBLE); + binding.nodateLy.setVisibility(View.GONE); + } + commonAdapterReadContents.setDates(hisChatShowBeans); + } + + private void changItemList(List result) { + hisChatShowBeans = new ArrayList<>(); + resultList = new ArrayList<>(); + for (IMMessage imMessage : result) { + if (imMessage.getMsgType() == MsgTypeEnum.image) { + resultList.add(new IMMessageInfo(imMessage)); + } + String time = DataUtils.getCurrentTimeMonth(imMessage.getTime()); + boolean isAdd = true; + for (int i = 0; i < hisChatShowBeans.size(); i++) { + if (time.equals(hisChatShowBeans.get(i).title)) { + hisChatShowBeans.get(i).imMessageInfos.add(new IMMessageInfo(imMessage)); + isAdd = false; + break; + } + } + if (isAdd) { + List imMessages = new ArrayList<>(); + imMessages.add(new IMMessageInfo(imMessage)); + hisChatShowBeans.add(new HisChatShowBean(time, imMessages)); + } + + } + if (hisChatShowBeans.size() > 0) { + binding.recyclerssss.setVisibility(View.VISIBLE); + binding.nodateLy.setVisibility(View.GONE); + } + commonAdapterReadContents.setDates(hisChatShowBeans); + } + + CommonAdapter commonAdapterReadContents; + + private void initAdapterChatHist() { + + binding.recyclerssss.setLayoutManager(new LinearLayoutManager(getActivity())); + commonAdapterReadContents = new CommonAdapter<>(getActivity(), R.layout.chat_his_child_itemtop, hisChatShowBeans) { + @Override + public void convert(ViewHolder holder, HisChatShowBean s, int index) { + holder.setText(R.id.title_tv, s.title); + RecyclerView recyclerView = holder.getView(R.id.item_recyclerview); + recyclerView.setVisibility(View.VISIBLE); + if (type == 0) { + recyclerView.setLayoutManager(new GridLayoutManager(getActivity(), 4)); + } + if (type == 1) { + recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); + } + CommonAdapter commonAdapter = new CommonAdapter<>(getActivity(), R.layout.chat_his_child_item1, s.getImMessageInfos()) { + @Override + public void convert(ViewHolder holder, IMMessageInfo s, int itemindex) { + + CircleImageView circleImageView = holder.getView(R.id.item_civ); + ConstraintLayout layoutlink = holder.getView(R.id.item_link); + TextView tvTitleLink = holder.getView(R.id.titlelink_tv); + TextView tvTimeLink = holder.getView(R.id.timelink_tv); + ContactAvatarView ivlink = holder.getView(R.id.iv_link); + if (type == 0) { + layoutlink.setVisibility(View.GONE); + FileAttachment attachment = (FileAttachment) s.getMessage().getAttachment(); + if (attachment == null) { + return; + } + if (s.getMessage().getMsgType() == MsgTypeEnum.image) { + holder.getView(R.id.video_tag_iv).setVisibility(View.GONE); + } else { + holder.getView(R.id.video_tag_iv).setVisibility(View.VISIBLE); + + } + String path = attachment.getPath(); + String thumbPath = attachment.getThumbPath(); + if (!TextUtils.isEmpty(thumbPath)) { + Glide.with(getActivity()) + .load(thumbPath) + .into(circleImageView); + } else if (!TextUtils.isEmpty(path)) { + Glide.with(getActivity()) + .load(path) + .into(circleImageView); + } else { + Glide.with(getActivity()) + .load("") + .error(R.color.color_f4f4f4) + .into(circleImageView); + } + holder.getView(R.id.big_ly).setOnClickListener(v -> { + if (s.getMessage().getMsgType() == MsgTypeEnum.image) { +// ChatUtils.watchImage(getActivity(), s, resultList); + ChatUtils.watchImageSetting(getActivity(), s, resultList, new IWathBaseBottomClickListenr() { + @Override + public void onDelete(IMMessage message) { + onDeleteMessage(index, itemindex, message); + } + + @Override + public void onShare(IMMessage message, Activity context) { + onShareMessage(message, context); + } + }); + } else { +// ChatUtils.watchVideo(getActivity(), s); + ChatUtils.watchVideoSettting(getActivity(), s, new IWathBaseBottomClickListenr() { + @Override + public void onDelete(IMMessage message) { + onDeleteMessage(index, itemindex, message); + } + + @Override + public void onShare(IMMessage message, Activity activity) { + + } + }); + } + + }); + } + if (type == 1) { + layoutlink.setVisibility(View.VISIBLE); + circleImageView.setVisibility(View.GONE); + try { + ivlink.setData(R.mipmap.ivlink_default, ""); + getTitleFromURL(s.getMessage().getContent(), tvTitleLink); + if (TextUtils.isEmpty(tvTimeLink.getText().toString())) { + tvTitleLink.setText(s.getMessage().getContent()); + } + tvTimeLink.setText(TimeFormatUtils.formatMillisecond(getActivity(), s.getMessage().getTime())); + } catch (Exception e) { + LogUtils.d("value==" + e.getMessage()); + } + + } + + } + }; + recyclerView.setAdapter(commonAdapter); + } + }; + binding.recyclerssss.setAdapter(commonAdapterReadContents); + } + + + public void getTitleFromURL(String urlString, TextView tvTitle) { + new Thread(new Runnable() { + @Override + public void run() { + try { + URL url = new URL(urlString); + URLConnection conn = url.openConnection(); + BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); + String line; + while ((line = reader.readLine()) != null) { + if (line.contains("")) { + int startIndex = line.indexOf("<title>") + 7; + int endIndex = line.indexOf(""); + tvTitle.setText(line.substring(startIndex, endIndex)); + } + } + reader.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + }).start(); + + } + + + public void onDeleteMessage(int index, int itemindex, IMMessage message) { + hisChatShowBeans.get(index).getImMessageInfos().remove(itemindex); + if (hisChatShowBeans.get(index).getImMessageInfos().size() == 0) { + hisChatShowBeans.remove(index); + } + commonAdapterReadContents.notifyItemChanged(index); + if (hisChatShowBeans.size() == 0) { + binding.recyclerssss.setVisibility(View.GONE); + binding.nodateLy.setVisibility(View.VISIBLE); + } + CleanHistoryEvent historyEvent = new CleanHistoryEvent(false); + historyEvent.setItemMessage(message); + EventCenter.notifyEvent(historyEvent); + } + + //分享图片 + public ShareDateUtils shareDateUtils; + private ArrayList titleUsers; + private ImageView coloseIvShare; + private RecyclerView recyclerShare; + private EditText commentEtShare; + private TextView shareBt; + private LinearLayoutManager linearLayoutManager; + private CommonAdapter commonAdapter; + private ArrayList titleUsersIsCheck; + + @RequiresApi(api = Build.VERSION_CODES.M) + private void onShareMessage(IMMessage message, Activity context) { + titleUsers = shareDateUtils.getConverstionShareInfo(); + titleUsersIsCheck = new ArrayList<>(); + for (UserShareBean conversationInfo : titleUsers) { + titleUsersIsCheck.add(false); + } + if (titleUsers == null || titleUsers.size() == 0) { + ToastX.showShortToast(R.string.mykfxfddx_txt); + return; + } + BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(context, R.style.BottomSheetDialog); + + View bottomView = LayoutInflater.from(context).inflate(R.layout.bottom_sheet_layout, null); + + + coloseIvShare = (ImageView) bottomView.findViewById(R.id.colose_iv); + recyclerShare = (RecyclerView) bottomView.findViewById(R.id.recycler); + commentEtShare = (EditText) bottomView.findViewById(R.id.comment_et); + + shareBt = (TextView) bottomView.findViewById(R.id.share_bt); + initList(context); + bottomSheetDialog.setContentView(bottomView); + bottomSheetDialog.show(); + + bottomSheetDialog.setOnDismissListener(dialog -> context.getWindow().setNavigationBarColor(getResources().getColor(R.color.black))); + coloseIvShare.setOnClickListener(v -> bottomSheetDialog.dismiss()); + shareBt.setOnClickListener(v -> { + + boolean isSelect = false; + for (Boolean type : titleUsersIsCheck) { + if (type) { + isSelect = true; + } + } + if (!isSelect) { + ToastX.showShortToast(getString(R.string.qxxzyfxddx_txt)); + return; + } + + ImageAttachment imageAttachment = (ImageAttachment) message.getAttachment(); + doSaveQrcodeShare(bottomSheetDialog, imageAttachment.getUrl(), context); + }); + AdaptScreenUtils.setWhiteNavigationBar(bottomSheetDialog); + + } + + private void initList(Activity activity) { + linearLayoutManager = new LinearLayoutManager(activity); + linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); + recyclerShare.setLayoutManager(linearLayoutManager); + commonAdapter = new CommonAdapter<>(activity, R.layout.item_share_list, titleUsers) { + @Override + public void convert(ViewHolder holder, UserShareBean s, int index) { + ImageView select_iv = holder.getView(R.id.select_iv); + + ContactAvatarView imageView = holder.getView(R.id.logo_iv); + + if (s.getTeamInfo() != null) { + ColorUtils.loadGroupAvator(s.getTeamInfo().getIcon(), imageView); +// imageView.setData( +// s.getTeamInfo().getIcon(), s.getTeamInfo().getName(), AvatarColor.avatarColor(s.getTeamInfo().getId())); + holder.setText(R.id.title_tv, s.getTeamInfo().getName()); + } else { + LogUtils.i("用户信息:" + GsonUtils.beanToJSONString(s.getFriendInfo())); + + FriendInfo friendInfo = s.getFriendInfo(); + NimUserInfo user = NIMClient.getService(UserService.class).getUserInfo(friendInfo.getAccount()); + if (user != null) { + holder.setText(R.id.title_tv, user.getName()); + ColorUtils.loadAvator(user.getAvatar(), imageView); +// imageView.setData( +// user.getAvatar(), user.getName(), AvatarColor.avatarColor(user.getAccount())); + } + } + + + if (titleUsersIsCheck.get(index)) { + select_iv.setImageResource(R.mipmap.dialog_item_gou); + } else { + select_iv.setImageResource(R.mipmap.dialog_item_quan); + } + holder.getView(R.id.big_bg).setOnClickListener(v -> { + titleUsersIsCheck.set(index, !titleUsersIsCheck.get(index)); + commonAdapter.notifyItemChanged(index, titleUsersIsCheck.get(index)); + LogUtils.i("0000000000"); + + changeItemButton(); + }); + } + }; + recyclerShare.setAdapter(commonAdapter); + } + + private void changeItemButton() { + LogUtils.i("1111111111111111"); + boolean isSelcet = false; + for (boolean item : titleUsersIsCheck) { + if (item) { + isSelcet = true; + break; + } + } + chagnBottom(isSelcet); + + } + + private void chagnBottom(boolean b) { + LogUtils.i("22222222222:" + b); + + if (b) { + shareBt.setBackground(getResources().getDrawable(R.drawable.button_true_bg)); + shareBt.setEnabled(true); + } else { + shareBt.setBackground(getResources().getDrawable(R.drawable.button_false_bg_new)); + shareBt.setEnabled(false); + + } + } + + /** + * 将图片保存到系统相册。 + */ + private void doSaveQrcodeShare(BottomSheetDialog bottomSheetDialog, String url, Activity activity) { + Glide.with(activity).asBitmap().load(url).into(new CustomTarget() { + @Override + public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition transition) { + if (resource != null) { + Uri fileUri = ToolKits.saveBmp2GalleryShare(activity, resource); + if (fileUri != null) { + sendMessage(fileUri); + } else { + ToastX.showShortToast(getString(R.string.message_share_fail)); + } + } + bottomSheetDialog.dismiss(); + } + + @Override + public void onLoadCleared(@Nullable Drawable placeholder) { + + } + }); + } + + Handler mHandler = new Handler(); + + private void sendMessage(Uri uri) { + mHandler.postDelayed(() -> { + File imageFile = UriUtils.uri2File(uri); + + for (int i = 0; i < titleUsersIsCheck.size(); i++) { + if (titleUsersIsCheck.get(i)) { + toShareMessage(titleUsers.get(i), imageFile); + } + } + + }, 100); + } + + private void toShareMessage(UserShareBean conversationInfo, File imageFile) { + IMMessage imageMsg = null; + if (conversationInfo.getTeamInfo() != null) { + imageMsg = MessageBuilder.createImageMessage(conversationInfo.getTeamInfo().getId(), SessionTypeEnum.Team, imageFile); + } else if (conversationInfo.getFriendInfo() != null) { + imageMsg = MessageBuilder.createImageMessage(conversationInfo.getFriendInfo().getAccount(), SessionTypeEnum.P2P, imageFile); + } + if (imageMsg != null) { + ChatRepo.sendMessage( + imageMsg, + false, + new FetchCallbackImpl() { + @Override + public void onSuccess(@Nullable Void param) { + super.onSuccess(param); + ToastX.showShortToast(R.string.message_share_success); + + } + + @Override + public void onFailed(int code) { + + } + }); + } + } + +} diff --git a/app/src/main/java/com/dskj/rbchat/imkit/person/PersonOtherSettingActivity.java b/app/src/main/java/com/dskj/rbchat/imkit/person/PersonOtherSettingActivity.java new file mode 100644 index 0000000..54198dd --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/imkit/person/PersonOtherSettingActivity.java @@ -0,0 +1,91 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.imkit.person; + +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.util.TypedValue; +import android.view.View; + +import androidx.annotation.Nullable; + +import com.dskj.rbchat.R; +import com.dskj.rbchat.contact.ReportActivity; +import com.dskj.rbchat.imkit.base.BaseSettingOtherActivity; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.msg.MsgService; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.yunxin.kit.chatkit.ui.ChatKitUIConstant; +import com.netease.yunxin.kit.chatkit.ui.page.viewmodel.ChatP2PViewModel; +import com.netease.yunxin.kit.common.ui.utils.AvatarColor; +import com.netease.yunxin.kit.corekit.im.model.UserInfo; + + +/** + * 个人其他设置 setting + */ +public class PersonOtherSettingActivity extends BaseSettingOtherActivity { + + private static final String USERINFO = "userinfo"; + private boolean isRefresh = false; + private UserInfo userInfo; + private ChatP2PViewModel chatP2PViewModel = new ChatP2PViewModel(); + + public static void launch(Context context, UserInfo info) { + Intent intent = new Intent(context, PersonOtherSettingActivity.class); + intent.putExtra(USERINFO, info); + context.startActivity(intent); + } + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + userInfo = (UserInfo) getIntent().getSerializableExtra(USERINFO); + initView(); + } + + + public void initView() { + initTitleView(); + binding.llTeamName.setVisibility(View.GONE); + binding.llteamMemberType.setVisibility(View.GONE); + binding.llteamurl.setVisibility(View.GONE); + binding.flteamhead.setVisibility(View.GONE); + binding.tvteamdiss.setText(getString(R.string.teamsetting_jubao)); + binding.cavAvatar.setData( + userInfo.getAvatar(), + userInfo.getName(), + AvatarColor.avatarColor(userInfo.getAccount())); + //举报 + binding.flteamdiss.setOnClickListener(view -> { + Intent intent = new Intent(PersonOtherSettingActivity.this, ReportActivity.class); + intent.putExtra("type", 0); + intent.putExtra("toId", userInfo.getAccount()); + startActivity(intent); + }); + + } + + private void initTitleView() { + binding.settingTitleBar.getTitleTextView().setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20); +// binding.settingTitleBar.getTitleTextView().setTypeface(Typeface.defaultFromStyle(Typeface.BOLD)); + binding.settingTitleBar.setOnBackIconClickListener( + v -> { + finish(); + }); + + } + + @Override + public void onCleanHistory() { + super.onCleanHistory(); +// chatP2PViewModel.deleteLocalMessage(); + NIMClient.getService(MsgService.class).clearServerHistory(userInfo.getAccount(), SessionTypeEnum.P2P, false); + + } + + +} diff --git a/app/src/main/java/com/dskj/rbchat/imkit/person/PersonSettingActivity.java b/app/src/main/java/com/dskj/rbchat/imkit/person/PersonSettingActivity.java new file mode 100644 index 0000000..3872766 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/imkit/person/PersonSettingActivity.java @@ -0,0 +1,486 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.imkit.person; + + +import android.content.Intent; +import android.os.Build; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.view.WindowManager; +import android.widget.Toast; + +import androidx.annotation.Nullable; +import androidx.lifecycle.ViewModelProvider; +import androidx.recyclerview.widget.GridLayoutManager; + +import com.bumptech.glide.Glide; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.contact.ReportActivity; +import com.dskj.rbchat.databinding.ActivityBaseChatsettingBinding; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.imkit.team.BaseTeamQrSettingActivity; +import com.dskj.rbchat.imkit.team.SettingResourceActivity; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.widget.CircleImageView; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.RequestCallback; +import com.netease.nimlib.sdk.msg.MsgService; +import com.netease.nimlib.sdk.msg.attachment.FileAttachment; +import com.netease.nimlib.sdk.msg.constant.MsgTypeEnum; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.nimlib.sdk.msg.model.IMMessage; +import com.netease.nimlib.sdk.msg.model.MsgSearchOption; +import com.netease.yunxin.kit.chatkit.model.IMMessageInfo; +import com.netease.yunxin.kit.chatkit.repo.ContactRepo; +import com.netease.yunxin.kit.chatkit.repo.ConversationRepo; +import com.netease.yunxin.kit.chatkit.ui.common.ChatCallback; +import com.netease.yunxin.kit.chatkit.ui.common.ChatUtils; +import com.netease.yunxin.kit.chatkit.ui.common.RxBus; +import com.netease.yunxin.kit.chatkit.ui.model.ChatBlackEvent; +import com.netease.yunxin.kit.chatkit.ui.model.CleanHistoryEvent; +import com.netease.yunxin.kit.common.ui.viewmodel.LoadStatus; +import com.netease.yunxin.kit.common.utils.NetworkUtils; +import com.netease.yunxin.kit.contactkit.ui.blacklist.BlackListViewModel; +import com.netease.yunxin.kit.contactkit.ui.model.ContactBlackListBean; +import com.netease.yunxin.kit.corekit.event.EventCenter; +import com.netease.yunxin.kit.corekit.im.model.FriendInfo; +import com.netease.yunxin.kit.corekit.im.model.UserInfo; +import com.netease.yunxin.kit.corekit.im.provider.FetchCallback; +import com.netease.yunxin.kit.corekit.im.utils.RouterConstant; + +import java.util.ArrayList; +import java.util.List; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +/** + * 个人设置 setting activity + */ +public class PersonSettingActivity extends BaseTeamQrSettingActivity implements FetchCallback { + + private BlackListViewModel viewModel = new BlackListViewModel(); + private boolean isNotify = false; + private String accId = ""; + private boolean isBlack = false; + private UserInfo userInfo; + + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + accId = getIntent().getStringExtra(RouterConstant.CHAT_ID_KRY); + userInfo = (UserInfo) getIntent().getSerializableExtra(RouterConstant.CHAT_KRY); + if (userInfo == null && TextUtils.isEmpty(accId)) { + finish(); + return; + } + getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE); + listmemebers.add(userInfo); + initView(); + initData(); + } + + @Override + public View getContentView() { + binding = + ActivityBaseChatsettingBinding.inflate(getLayoutInflater()); + return binding.getRoot(); + } + + + public void initView() { + + String name = userInfo.getName(); + String alias = ContactRepo.getFriend(userInfo.getAccount()).getAlias(); + if (ContactRepo.isFriend(userInfo.getAccount()) && !TextUtils.isEmpty(alias)) { + name = alias; + } + binding.tvTitle.setText(name); + binding.ivBack.setOnClickListener(view -> onBackPressed()); + binding.tvmember.setVisibility(View.GONE); + binding.tvexit.setVisibility(View.GONE); + binding.rlteamSet.setVisibility(View.GONE); + binding.tvpingbi.setVisibility(View.VISIBLE); + binding.tvinvited.setOnClickListener(view -> { + if (isBlack) { + return; + } + showAddFriendsDialog(false); + } + ); + binding.tvnotify.setOnClickListener(view -> { + if (isBlack) { + return; + } + ConversationRepo.setNotify( + accId, + SessionTypeEnum.P2P, + !isNotify, + new ChatCallback() { + @Override + public void onSuccess(@Nullable Void param) { + setNotifyUI(!isNotify); + } + }); + + } + ); + binding.tvpingbi.setOnClickListener(view -> { + if (isBlack) { + viewModel.removeBlackOp(accId, this); + } else { + viewModel.addBlackOp(accId, this); + } + }); + binding.rlteamJubao.setOnClickListener(view -> { + //举报 + Intent intent = new Intent(PersonSettingActivity.this, ReportActivity.class); + intent.putExtra("type", 0); + intent.putExtra("toId", accId); + startActivity(intent); + + }); + binding.rlteamClearhistory.setOnClickListener(view -> { + ActionConfirmDialog actionConfirmDialog = new ActionConfirmDialog(this, getString(R.string.setting_cleanhistory), true); + actionConfirmDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + resultList.clear(); + commonAdapterReadContents.setDates(resultList); + binding.llteamsettingPhoto.setBackgroundResource(R.drawable.cornor_f4f4f4_6dp); + binding.recyclerssss.setVisibility(View.GONE); + binding.noDateTv.setVisibility(View.VISIBLE); + EventCenter.notifyEvent(new CleanHistoryEvent(true)); + NIMClient.getService(MsgService.class).clearServerHistory(userInfo.getAccount(), SessionTypeEnum.P2P, false); + + } + + @Override + public void toCancel() { + + + } + }); + actionConfirmDialog.show(); + + }); + +// binding.tvteamsettingSet.setText(getString(R.string.teamsetting_other)); +// binding.rlteamSet.setOnClickListener(view -> { +// PersonOtherSettingActivity.launch(this, userInfo); +// }); + refreshUI(); + selectorlist.add(0, userInfo.getAccount()); + + binding.ctlayoutPhoto.setOnClickListener(view -> { + startResourcePhoto(); + }); + binding.flteamurl.setOnClickListener(view -> { + startResourceUrl(); + }); + binding.flteaminfo.setOnClickListener(view -> { + startResourceInfo(); + }); + initAdapterChatHist(); + getChatList(); + } + + private void getChatList() { + List sessionTypeEnums = new ArrayList<>(); + sessionTypeEnums.add(MsgTypeEnum.image); + sessionTypeEnums.add(MsgTypeEnum.video); + LogUtils.i("数据是啥:" + accId); + MsgSearchOption msgSearchOption = new MsgSearchOption(); + msgSearchOption.setMessageTypes(sessionTypeEnums); + msgSearchOption.setLimit(4); + NIMClient.getService(MsgService.class).searchMessage(SessionTypeEnum.P2P, accId, msgSearchOption).setCallback(new RequestCallback<>() { + @Override + public void onSuccess(List result) { + + LogUtils.i("数据是啥:" + GsonUtils.beanToJSONString(result)); + if (result != null && result.size() > 0) { + // 在子线程中执行耗时操作 + resultList = result; + imMessageInfos = new ArrayList<>(); + for (IMMessage imMessage : resultList) { + if (imMessage.getMsgType() == MsgTypeEnum.image) { + imMessageInfos.add(new IMMessageInfo(imMessage)); + } + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + binding.llteamsettingPhoto.setBackgroundColor(getColor(R.color.transparent)); + } + commonAdapterReadContents.setDates(resultList); + binding.recyclerssss.setVisibility(View.VISIBLE); + binding.noDateTv.setVisibility(View.GONE); + + } else { + binding.recyclerssss.setVisibility(View.GONE); + binding.noDateTv.setVisibility(View.VISIBLE); + } + } + + @Override + public void onFailed(int code) { + binding.recyclerssss.setVisibility(View.GONE); + binding.noDateTv.setVisibility(View.VISIBLE); + + } + + @Override + public void onException(Throwable exception) { + binding.recyclerssss.setVisibility(View.GONE); + binding.noDateTv.setVisibility(View.VISIBLE); + + } + }); + } + + + private void initAdapterChatHist() { + binding.recyclerssss.setLayoutManager(new GridLayoutManager(PersonSettingActivity.this, 4)); + commonAdapterReadContents = new CommonAdapter<>(PersonSettingActivity.this, R.layout.chat_his_child_item1, resultList) { + @Override + public void convert(ViewHolder holder, IMMessage s, int index) { + CircleImageView circleImageView = holder.getView(R.id.item_civ); + FileAttachment attachment = (FileAttachment) s.getAttachment(); + if (attachment == null) { + return; + } + if (s.getMsgType() == MsgTypeEnum.image) { + holder.getView(R.id.video_tag_iv).setVisibility(View.GONE); + } else { + holder.getView(R.id.video_tag_iv).setVisibility(View.VISIBLE); + + } + String path = attachment.getPath(); + String thumbPath = attachment.getThumbPath(); + if (!TextUtils.isEmpty(thumbPath)) { + Glide.with(PersonSettingActivity.this) + .load(thumbPath) + .into(circleImageView); + } else if (!TextUtils.isEmpty(path)) { + Glide.with(PersonSettingActivity.this) + .load(path) + .into(circleImageView); + } else { + Glide.with(PersonSettingActivity.this) + .load("") + .error(R.color.color_f4f4f4) + .into(circleImageView); + } + holder.getView(R.id.big_ly).setOnClickListener(v -> { +// IMMessageInfo info = new IMMessageInfo(s); +// if (s.getMsgType() == MsgTypeEnum.image) { +// ChatUtils.watchImage(PersonSettingActivity.this, info, imMessageInfos); +// } else { +// ChatUtils.watchVideo(PersonSettingActivity.this, info); +// } + startResourcePhoto(); + + }); + } + }; + binding.recyclerssss.setAdapter(commonAdapterReadContents); + } + + + public void doCancelfollow() { + Api.getInstance().followCancel(accId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result feedbackResp) { + RxBus.getInstance().post(IMUIKitConfig.CHANGE_FOLLOW_USER); + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + } + }); + } + + public void initData() { + //获取黑名单列表 + viewModel = new ViewModelProvider(this).get(BlackListViewModel.class); + viewModel + .getFetchResult() + .observe( + this, + result -> { + if (!NetworkUtils.isConnected()) { + Toast.makeText(this, com.netease.yunxin.kit.contactkit.ui.R.string.contact_network_error_tip, Toast.LENGTH_SHORT).show(); + return; + } + if (result.getLoadStatus() == LoadStatus.Success && result.getData() != null) { + for (ContactBlackListBean bean : result.getData()) { + if (bean.data.getAccount().equals(accId)) { + isBlack = true; + setSettingUI(true); + } + } + + } + // LoadStatus.Finish respect observer data changed +// if (result.getLoadStatus() == LoadStatus.Finish && result.getData() != null) { +// if (result.getType() == FetchResult.FetchType.Add) { +// ALog.d(TAG, "FetchResult", "Add:" + result.getData().size()); +// binding.contactListView.addContactData(result.getData()); +// } else if (result.getType() == FetchResult.FetchType.Remove) { +// ALog.d(TAG, "FetchResult", "Remove:" + result.getData().size()); +// +// } +// } + }); + viewModel.fetchBlackList(); + + } + + + protected void refreshUI() { + isNotify = ConversationRepo.isNotify(accId, SessionTypeEnum.P2P); + setSettingUI(false); + } + + + public void setSettingUI(boolean ispingbi) { + if (ispingbi) { + setNofityPingBi(isNotify); + binding.tvpingbi.setCompoundDrawablesWithIntrinsicBounds(null, getResources().getDrawable(R.mipmap.ic_setting_pingbi_open), null, null); + binding.tvpingbi.setText(getString(R.string.personsetting_bingbicancel)); + binding.tvinvited.setTextColor(getResources().getColor(R.color.color_80333333)); + binding.tvinvited.setCompoundDrawablesWithIntrinsicBounds(null, getResources().getDrawable(R.mipmap.ic_setting_invite_dark), null, null); + } else { + setNotifyUI(isNotify); + binding.tvpingbi.setCompoundDrawablesWithIntrinsicBounds(null, getResources().getDrawable(R.mipmap.ic_setting_pingbi_close), null, null); + binding.tvpingbi.setText(getString(R.string.personsetting_bingbiopen)); + binding.tvinvited.setTextColor(getResources().getColor(R.color.color_333333)); + binding.tvinvited.setCompoundDrawablesWithIntrinsicBounds(null, getResources().getDrawable(R.mipmap.ic_setting_invited), null, null); + + } + + } + + public void setNotifyUI(boolean isOpen) { + binding.tvnotify.setTextColor(getResources().getColor(R.color.color_333333)); + if (isOpen) { + binding.tvnotify.setText(getResources().getString(R.string.teamsetting_notifyclose)); + binding.tvnotify.setCompoundDrawablesWithIntrinsicBounds(null, getResources().getDrawable(R.mipmap.ic_setting_notifyopen), null, null); + } else { + binding.tvnotify.setText(getResources().getString(R.string.teamsetting_notifyopen)); + binding.tvnotify.setCompoundDrawablesWithIntrinsicBounds(null, getResources().getDrawable(R.mipmap.ic_setting_notifyclose), null, null); + } + isNotify = isOpen; + + } + + public void setNofityPingBi(boolean isOpen) { + binding.tvnotify.setTextColor(getResources().getColor(R.color.color_80333333)); + if (isOpen) { + binding.tvnotify.setCompoundDrawablesWithIntrinsicBounds(null, getResources().getDrawable(R.mipmap.ic_setting_notifyopen_dark), null, null); + } else { + binding.tvnotify.setCompoundDrawablesWithIntrinsicBounds(null, getResources().getDrawable(R.mipmap.ic_setting_notifyclose_dark), null, null); + } + + } + + @Override + public void onException(@Nullable Throwable throwable) { + String content = isBlack ? getResources().getString(com.netease.yunxin.kit.contactkit.ui.R.string.remove_black_fail) : + String.format( + getResources().getString(com.netease.yunxin.kit.contactkit.ui.R.string.add_black_error), ""); + Toast.makeText(PersonSettingActivity.this, content, Toast.LENGTH_SHORT) + .show(); + } + + @Override + public void onFailed(int i) { + String content = isBlack ? getResources().getString(com.netease.yunxin.kit.contactkit.ui.R.string.remove_black_fail) : + String.format( + getResources().getString(com.netease.yunxin.kit.contactkit.ui.R.string.add_black_error), ""); + Toast.makeText(PersonSettingActivity.this, content, Toast.LENGTH_SHORT) + .show(); + } + + @Override + public void onSuccess(@Nullable Void unused) { + if (isBlack) { + doCancelfollow(); + removeBlack(); + } else { + addBlack(); + + } + isBlack = !isBlack; + EventCenter.notifyEvent(new ChatBlackEvent(isBlack)); + setSettingUI(isBlack); + } + + private void addBlack() { + com.netease.yunxin.kit.chatkit.ui.network.Api.getInstance().toBlock(accId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new com.netease.yunxin.kit.chatkit.ui.network.BaseObserver<>() { + @Override + public void onSuccess(com.netease.yunxin.kit.chatkit.ui.network.Result feedbackResp) { + } + + @Override + public void onError(int code, String msg) { + } + }); + } + + private void removeBlack() { + com.netease.yunxin.kit.chatkit.ui.network.Api.getInstance().deleteBlock(accId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new com.netease.yunxin.kit.chatkit.ui.network.BaseObserver<>() { + @Override + public void onSuccess(com.netease.yunxin.kit.chatkit.ui.network.Result feedbackResp) { + } + + @Override + public void onError(int code, String msg) { + } + }); + } + + + public void startResourcePhoto() { + SettingResourceActivity.launch(this, 0, null, userInfo); + } + + + public void startResourceInfo() { + SettingResourceActivity.launch(this, 2, null, userInfo); + } + + + public void startResourceUrl() { + SettingResourceActivity.launch(this, 1, null, userInfo); + } + + + @Override + protected void onDestroy() { + super.onDestroy(); + + } + + +} diff --git a/app/src/main/java/com/dskj/rbchat/imkit/selector/FunContactSelectorActivity.java b/app/src/main/java/com/dskj/rbchat/imkit/selector/FunContactSelectorActivity.java new file mode 100644 index 0000000..d1ade28 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/imkit/selector/FunContactSelectorActivity.java @@ -0,0 +1,301 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.imkit.selector; + +import static com.netease.yunxin.kit.contactkit.ui.ContactConstant.REQUEST_CONTACT_SELECTOR_AVATAR; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.CHAT_KRY; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.KEY_REMOTE_EXTENSION; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.KEY_REQUEST_SELECTOR_NAME; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.KEY_SESSION_ID; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.KEY_TEAM_CREATED_TIP; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.KEY_TEAM_ICON; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.KEY_TEAM_ID; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.KEY_TEAM_NAME; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.PATH_CHAT_SEND_TEAM_TIP_ACTION; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.PATH_CHAT_TEAM_PAGE; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.PATH_FUN_CREATE_ADVANCED_TEAM_ACTION; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.PATH_TEAM_INVITE_ACTION; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.REQUEST_CONTACT_SELECTOR_KEY; + +import android.content.Intent; +import android.graphics.Typeface; +import android.os.Bundle; +import android.util.TypedValue; +import android.view.View; +import android.view.ViewGroup; +import android.widget.FrameLayout; +import android.widget.LinearLayout; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.viewbinding.ViewBinding; + +import com.dskj.rbchat.model.UsersExistBean; +import com.dskj.rbchat.utils.ShareDateUtils; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.team.TeamService; +import com.netease.nimlib.sdk.team.constant.TeamBeInviteModeEnum; +import com.netease.nimlib.sdk.team.model.CreateTeamResult; +import com.netease.nimlib.sdk.team.model.Team; +import com.netease.yunxin.kit.alog.ALog; +import com.netease.yunxin.kit.chatkit.model.ConversationInfo; +import com.netease.yunxin.kit.common.ui.photo.TransHelper; +import com.netease.yunxin.kit.common.ui.widgets.BackTitleBar; +import com.netease.yunxin.kit.common.utils.NetworkUtils; +import com.netease.yunxin.kit.common.utils.SizeUtils; +import com.netease.yunxin.kit.contactkit.ui.ContactConstant; +import com.netease.yunxin.kit.contactkit.ui.R; +import com.netease.yunxin.kit.contactkit.ui.databinding.FunContactSelectorActivityLayoutBinding; +import com.netease.yunxin.kit.contactkit.ui.fun.contact.FunContactDefaultFactory; +import com.netease.yunxin.kit.contactkit.ui.fun.selector.FunSelectedListAdapter; +import com.netease.yunxin.kit.contactkit.ui.model.ContactFriendBean; +import com.netease.yunxin.kit.contactkit.ui.selector.BaseContactSelectorActivity; +import com.netease.yunxin.kit.contactkit.ui.selector.BaseSelectedListAdapter; +import com.netease.yunxin.kit.contactkit.ui.view.ContactListView; +import com.netease.yunxin.kit.conversationkit.ui.model.ConversationBean; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.model.FriendInfo; +import com.netease.yunxin.kit.corekit.im.model.UserInfo; +import com.netease.yunxin.kit.corekit.route.XKitRouter; +import com.netease.yunxin.kit.teamkit.ui.utils.viewmodel.TeamSettingViewModel; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +//建群选择好友界面 创建群聊,转发消息 +public class FunContactSelectorActivity extends BaseContactSelectorActivity { + + protected FunContactSelectorActivityLayoutBinding binding; + + + @Override + protected View initViewAndGetRootView(Bundle savedInstanceState) { + binding = FunContactSelectorActivityLayoutBinding.inflate(getLayoutInflater()); + contactListView = binding.contactListView; + lastContactView = binding.contactLast; + loveContactView = binding.contactListViewMylove; + searchContactView = binding.contactSearchlistView; + setViewHolderFactory(contactListView); + setViewHolderFactory(lastContactView); + setViewHolderFactory(loveContactView); + setViewHolderFactory(searchContactView); +// contactListView.configIndexTextBGColor(getResources().getColor(R.color.color_58be6b)); + emptyGroup = binding.emptyLayout; + rvSelected = binding.rvSelected; + ivClean = binding.icCleanEdit; + editSearch = binding.editSelectorFriends; + titleBar = binding.title; + tvMemberslist = binding.tvContactmember; + tvMembersLast = binding.tvContactlast; + tvMembersSpecialGz = binding.tvContactspecialgz; + + layoutContactList = binding.layoutContactlist; + layoutSearchList = binding.layoutSearchlist; + return binding.getRoot(); + } + + + @Override + public void updateView() { + super.updateView(); + if (type == 1) { //转发 这ui 修改的.... + rvSelected.setVisibility(View.GONE); + contactListView.showSelector(false); + lastContactView.showSelector(false); + loveContactView.showSelector(false); + searchContactView.showSelector(false); + LinearLayout.LayoutParams params1 = (LinearLayout.LayoutParams) contactListView.getLayoutParams(); + LinearLayout.LayoutParams params2 = (LinearLayout.LayoutParams) lastContactView.getLayoutParams(); + LinearLayout.LayoutParams params3 = (LinearLayout.LayoutParams) loveContactView.getLayoutParams(); + LinearLayout.LayoutParams params4 = (LinearLayout.LayoutParams) searchContactView.getLayoutParams(); + params1.setMarginStart(SizeUtils.dp2px(15)); + params2.setMarginStart(SizeUtils.dp2px(15)); + params3.setMarginStart(SizeUtils.dp2px(15)); + params4.setMarginStart(SizeUtils.dp2px(15)); + contactListView.setLayoutParams(params1); + lastContactView.setLayoutParams(params2); + loveContactView.setLayoutParams(params3); + searchContactView.setLayoutParams(params4); + } + } + + public void setViewHolderFactory(ContactListView contactView) { + contactView + .getDecoration() + .setTitleAlignBottom(true) + .setShowTagOff(false) + .setIndexDecorationBg(getResources().getColor(R.color.title_transfer)) + .setColorTitleBottomLine(getResources().getColor(R.color.title_transfer)); + FunContactDefaultFactory funContactDefaultFactory = new FunContactDefaultFactory(); + funContactDefaultFactory.setCenter(true); + contactView.setViewHolderFactory(funContactDefaultFactory); + } + + public void createGroup() { + TransHelper.launchTask( + FunContactSelectorActivity.this, + 1, + (activity, integer) -> { + XKitRouter.withKey(ContactConstant.PATH_FUN_CREATE_GROUP_PAGE) + .withParam(REQUEST_CONTACT_SELECTOR_KEY, getSelectedAccount()) + .withParam(KEY_REQUEST_SELECTOR_NAME, getSelectedName()) + .withParam(REQUEST_CONTACT_SELECTOR_AVATAR, getSelectedAvatar()) + .withContext(activity) + .withRequestCode(integer) + .navigate(); + return null; + }, + intentResultInfo -> { + if (intentResultInfo == null + || !intentResultInfo.getSuccess() + || intentResultInfo.getValue() == null) { + return null; + } + Intent data = intentResultInfo.getValue(); + ArrayList list = data.getStringArrayListExtra(REQUEST_CONTACT_SELECTOR_KEY); + if (list == null || list.isEmpty()) { + return null; + } + XKitRouter.withKey(PATH_FUN_CREATE_ADVANCED_TEAM_ACTION) + .withParam( + REQUEST_CONTACT_SELECTOR_KEY, + data.getStringArrayListExtra(REQUEST_CONTACT_SELECTOR_KEY)) + .withParam(KEY_TEAM_NAME, data.getStringExtra(KEY_TEAM_NAME)) + .withParam(KEY_TEAM_ICON, data.getStringExtra(KEY_TEAM_ICON)) + .withParam(ContactConstant.REQUEST_FUN_CREATE_GROUP_AUTO, data.getBooleanExtra(ContactConstant.REQUEST_FUN_CREATE_GROUP_AUTO, true)) + .navigate( + res -> { + if (res.getSuccess() && res.getValue() instanceof CreateTeamResult) { + Team teamInfo = ((CreateTeamResult) res.getValue()).getTeam(); +// TeamSettingViewModel teamSettingViewModel = new TeamSettingViewModel(); +// teamSettingViewModel.updateInvitePrivilege(teamInfo.getId(), 1);//更新邀请权限 +// teamSettingViewModel.updateBeInviteMode(teamInfo.getId(), false); + + Map map = new HashMap<>(1); + map.put( + KEY_TEAM_CREATED_TIP, + getString(com.netease.yunxin.kit.conversationkit.ui.R.string.create_advanced_team_success)); + // 发送创建成功群里提示信息 + XKitRouter.withKey(PATH_CHAT_SEND_TEAM_TIP_ACTION) + .withParam(KEY_SESSION_ID, teamInfo.getId()) + .withParam(KEY_REMOTE_EXTENSION, map) + .navigate(); + if (teamInfo.getTeamBeInviteMode() == TeamBeInviteModeEnum.NoAuth) { + // 邀请加入群,处理邀请通知早于创建成功通知 + XKitRouter.withKey(PATH_TEAM_INVITE_ACTION) + .withParam(KEY_TEAM_ID, teamInfo.getId()) + .withParam(REQUEST_CONTACT_SELECTOR_KEY, list) + .navigate(); + } + //跳转到会话页面 + XKitRouter.withKey(PATH_CHAT_TEAM_PAGE) + .withContext(this) + .withParam(CHAT_KRY, teamInfo) + .navigate(); + + } else { + ALog.e("TAG", "create team failed."); + } + }); + finish(); + return null; + } + ); + + } + + + protected BaseSelectedListAdapter getSelectedListAdapter() { + return new FunSelectedListAdapter(); + } + + protected void configTitle(BackTitleBar titleBar) { + if (type == 1) { + titleBar + .setOnBackIconClickListener(v -> onBackPressed()) + .setTitle(R.string.select); + } else { + titleBar + .setOnBackIconClickListener(v -> onBackPressed()) + .setTitle(R.string.select) + .setActionText(R.string.selector_sure_without_num) + .setActionTextColor(getResources().getColor(R.color.color_6877fe)) + .setActionListener( + v -> { + if (checkNetworkEnable && !NetworkUtils.isConnected()) { + Toast.makeText(this, R.string.contact_network_error_tip, Toast.LENGTH_SHORT).show(); + return; + } + List select = getSelectedAccount(); + if (select.size() < 1) { + Toast.makeText(this, getString(R.string.select_empty_tips), Toast.LENGTH_LONG) + .show(); + return; + } + if (selectedListAdapter.getItemCount() >= maxSelectCount + && selectFinalCheckCountEnable) { + Toast.makeText(this, R.string.contact_selector_over_count, Toast.LENGTH_LONG) + .show(); + return; + } + createGroup(); + + +// if (!selectedListAdapter.getSelectedFriends().isEmpty()) { +// result.putExtra(REQUEST_CONTACT_SELECTOR_KEY, getSelectedAccount()); +// if (enableReturnName) { +// result.putExtra(KEY_REQUEST_SELECTOR_NAME, getSelectedName()); +// } +// } +// setResult(RESULT_OK, result); +// finish(); + }); + + +// titleBar.getTitleTextView().setTypeface(Typeface.defaultFromStyle(Typeface.BOLD)); + // titleBar.getRightTextView().setTextColor(getResources().getColor(R.color.color_6b3689)); + } + int verticalPadding = SizeUtils.dp2px(5); + int horizontalPadding = SizeUtils.dp2px(10); + int endPadding = SizeUtils.dp2px(5); + TextView rightTextView = titleBar.getRightTextView(); + FrameLayout.LayoutParams layoutParams = + (FrameLayout.LayoutParams) rightTextView.getLayoutParams(); + layoutParams.rightMargin = SizeUtils.dp2px(endPadding); + rightTextView.setPadding( + horizontalPadding, verticalPadding, horizontalPadding, verticalPadding); + // titleBar.getRightTextView().setBackgroundResource(R.drawable.fun_contact_select_confirm_btn_bg); + titleBar.getTitleTextView().setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20); + + } + + @Override + protected List getFollowList() { + List followlist = ShareDateUtils.getFollowUsers(); + if (followlist != null) { + return convertFollowList(followlist); + } else { + return new ArrayList<>(); + } + } + + + public List convertFollowList(List list) { + List contactFriendBeans = new ArrayList<>(); + for (UsersExistBean bean : list) { + FriendInfo friendInfo = new FriendInfo(String.valueOf(bean.getUserId()), bean.getNickname(), ""); + friendInfo.setUserInfo(new UserInfo(String.valueOf(bean.getUserId()), bean.getNickname(), bean.getAvatar())); + ContactFriendBean item = new ContactFriendBean(friendInfo); + contactFriendBeans.add(item); + } + return contactFriendBeans; + } + + +} diff --git a/app/src/main/java/com/dskj/rbchat/imkit/team/BaseTeamQrSettingActivity.java b/app/src/main/java/com/dskj/rbchat/imkit/team/BaseTeamQrSettingActivity.java new file mode 100644 index 0000000..c752072 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/imkit/team/BaseTeamQrSettingActivity.java @@ -0,0 +1,932 @@ +package com.dskj.rbchat.imkit.team; + +import static com.netease.nim.highavailable.HighAvailableObject.getContext; +import static com.netease.yunxin.kit.contactkit.ui.ContactConstant.REQUEST_CONTACT_SELECTOR_AVATAR; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.CHAT_KRY; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.KEY_REMOTE_EXTENSION; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.KEY_REQUEST_SELECTOR_NAME; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.KEY_SESSION_ID; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.KEY_TEAM_CREATED_TIP; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.KEY_TEAM_ICON; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.KEY_TEAM_ID; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.KEY_TEAM_NAME; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.PATH_CHAT_SEND_TEAM_TIP_ACTION; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.PATH_CHAT_TEAM_PAGE; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.PATH_FUN_CREATE_ADVANCED_TEAM_ACTION; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.PATH_TEAM_INVITE_ACTION; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.REQUEST_CONTACT_SELECTOR_KEY; + +import android.Manifest; +import android.content.Intent; +import android.graphics.Bitmap; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.text.TextUtils; +import android.util.Log; +import android.view.LayoutInflater; +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.TextView; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; +import androidx.lifecycle.ViewModelProvider; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.base.LllChatBaseActivity; +import com.dskj.rbchat.databinding.ActivityBaseChatsettingBinding; +import com.dskj.rbchat.imkit.selector.FunContactSelectorActivity; +import com.dskj.rbchat.main.mine.UserInfoActivity; +import com.dskj.rbchat.model.LoginBean; +import com.dskj.rbchat.model.UserShareBean; +import com.dskj.rbchat.model.UsersExistBean; +import com.dskj.rbchat.utils.AdaptScreenUtils; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.utils.ShareDateUtils; +import com.dskj.rbchat.utils.ToolKits; +import com.google.android.material.bottomsheet.BottomSheetDialog; +import com.king.zxing.util.CodeUtils; +import com.netease.nimlib.sdk.msg.MessageBuilder; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.nimlib.sdk.msg.model.IMMessage; +import com.netease.nimlib.sdk.team.constant.TeamBeInviteModeEnum; +import com.netease.nimlib.sdk.team.constant.TeamMemberType; +import com.netease.nimlib.sdk.team.constant.TeamTypeEnum; +import com.netease.nimlib.sdk.team.model.CreateTeamResult; +import com.netease.nimlib.sdk.team.model.Team; +import com.netease.yunxin.kit.alog.ALog; +import com.netease.yunxin.kit.chatkit.model.ConversationInfo; +import com.netease.yunxin.kit.chatkit.model.IMMessageInfo; +import com.netease.yunxin.kit.chatkit.model.UserInfoWithTeam; +import com.netease.yunxin.kit.chatkit.repo.ChatRepo; +import com.netease.yunxin.kit.chatkit.ui.custom.HelpPayViewHolder; +import com.netease.yunxin.kit.chatkit.ui.custom.InviteGroupAttachment; +import com.netease.yunxin.kit.chatkit.ui.custom.RedPacketGetAttachment; +import com.netease.yunxin.kit.chatkit.ui.model.CleanHistoryEvent; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.photo.TransHelper; +import com.netease.yunxin.kit.common.ui.utils.AvatarColor; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.common.ui.viewmodel.LoadStatus; +import com.netease.yunxin.kit.common.ui.widgets.ContactAvatarView; +import com.netease.yunxin.kit.common.utils.PermissionUtils; +import com.netease.yunxin.kit.common.utils.UriUtils; +import com.netease.yunxin.kit.contactkit.ui.ContactConstant; +import com.netease.yunxin.kit.contactkit.ui.contact.ContactViewModel; +import com.netease.yunxin.kit.contactkit.ui.fun.selector.FunContactSelectorDialog; +import com.netease.yunxin.kit.contactkit.ui.model.ContactFriendBean; +import com.netease.yunxin.kit.contactkit.ui.search.SearchViewModel; +import com.netease.yunxin.kit.contactkit.ui.utils.ColorUtils; +import com.netease.yunxin.kit.conversationkit.ui.model.ConversationBean; +import com.netease.yunxin.kit.conversationkit.ui.page.viewmodel.ConversationViewModel; +import com.netease.yunxin.kit.corekit.event.EventCenter; +import com.netease.yunxin.kit.corekit.event.EventNotify; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.model.FriendInfo; +import com.netease.yunxin.kit.corekit.im.model.UserInfo; +import com.netease.yunxin.kit.corekit.im.provider.FetchCallbackImpl; +import com.netease.yunxin.kit.corekit.route.XKitRouter; +import com.netease.yunxin.kit.teamkit.ui.utils.viewmodel.TeamSettingViewModel; + +import java.io.File; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +//成员邀请基类 设置父类 +public abstract class BaseTeamQrSettingActivity extends BaseActivity implements FunContactSelectorDialog.onActionClickListener, FunContactSelectorDialog.onTeamQrClickListener { + + + public final TeamSettingViewModel teammodel = new TeamSettingViewModel(); + public List listmemebers = new ArrayList<>(); + + //联系人,最近联系,特别关注 + public ContactViewModel viewModel; + public ConversationViewModel conversationViewModel; + public SearchViewModel searchViewModel; + public List accountList; + public List lastlist; + public List lovelist; + public FunContactSelectorDialog contactSelectorDialog; + public List selectorlist = new ArrayList<>(); //邀請好友列表 + + + //群行动码 + public ShareDateUtils shareDateUtils; + public LoginBean loginBean; + public String teamId; + public String teamName; + public int teamNumber; + public int settingType = 0; + + public ActivityBaseChatsettingBinding binding; + + public CommonAdapter commonAdapterReadContents; + public List resultList = new ArrayList<>(); + public ArrayList imMessageInfos = new ArrayList<>(); + protected final EventNotify cleanHistoryEvent = + new EventNotify() { + @Override + public void onNotify(@NonNull CleanHistoryEvent cleanHistoryEvent) { + if (!cleanHistoryEvent.isAll) { + IMMessage message = cleanHistoryEvent.getItemMessage(); + if (message != null) { + for (int i = 0; i < resultList.size(); i++) { + if (resultList.get(i).getUuid().equals(message.getUuid())) { + resultList.remove(i); + commonAdapterReadContents.notifyDataSetChanged(); + } + } + if (resultList.size() == 0) { + binding.recyclerssss.setVisibility(View.GONE); + binding.noDateTv.setVisibility(View.VISIBLE); + binding.llteamsettingPhoto.setBackgroundResource(R.drawable.cornor_f4f4f4_6dp); + } + } + } + + + } + + @NonNull + @Override + public String getEventType() { + return CleanHistoryEvent.EVENT_TYPE; + } + }; + + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(getContentView()); + prepareData(); + intContactData(); + EventCenter.registerEventNotify(cleanHistoryEvent); + shareDateUtils = new ShareDateUtils(); + shareDateUtils.getAllSessionList(); + shareDateUtils.getLocFriends(); + loginBean = DataUtils.getLocUserInfo(); + teammodel + .getAddMembersData() + .observe( + this, + listResultInfo -> { + if (listResultInfo.getSuccess()) { + teammodel.requestTeamMembers(teamId); + ToastX.showShortToast(getResources().getString(R.string.invite_success_txt)); + } else { + ToastX.showShortToast(getResources().getString(R.string.invite_fail_txt) + listResultInfo.getMsg().getCode()); + } + }); + + permissionLauncher = + registerForActivityResult( + new ActivityResultContracts.RequestMultiplePermissions(), + result -> { + if (result != null) { + for (Map.Entry entry : result.entrySet()) { + String permission = entry.getKey().toString(); + boolean grant = (Boolean) entry.getValue(); + if (grant) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + showBottomShare(); + } + } + } + } + }); + +// if (settingType == 0) { +// shareDateUtils = new ShareDateUtils(); +// shareDateUtils.getAllSessionList(); +// shareDateUtils.getLocFriends(); +// loginBean = DataUtils.getLocUserInfo(); +// teammodel +// .getAddMembersData() +// .observe( +// this, +// listResultInfo -> { +// if (listResultInfo.getSuccess()) { +// teammodel.requestTeamMembers(teamId); +// } +// }); +// } + + } + + private boolean prepareData() { + settingType = getIntent().getIntExtra("settingtype", 0); + teamId = getIntent().getStringExtra(KEY_TEAM_ID); +// teamName = getIntent().getStringExtra(KEY_TEAM_NAME); +// teamNumber = getIntent().getIntExtra("number", 0); + if (teamId == null && settingType == 0) { + return false; + } + return true; + } + + public void intContactData() { + viewModel = new ViewModelProvider(this).get(ContactViewModel.class); + conversationViewModel = new ViewModelProvider(this).get(ConversationViewModel.class); + searchViewModel = new ViewModelProvider(this).get(SearchViewModel.class); + viewModel + .getContactLiveData() + .observe( + this, + contactBeansResult -> { + if (contactBeansResult.getLoadStatus() == LoadStatus.Success) { + //好友列表 + accountList = contactBeansResult.getData(); + + } + }); + viewModel.fetchContactList(); + + conversationViewModel = new ViewModelProvider(this).get(ConversationViewModel.class); + conversationViewModel + .getQueryLiveData() + .observe( + this, + result -> { + if (result.getLoadStatus() == LoadStatus.Success) { + lastlist = convertConvacationList(result.getData()); + } + + }); + conversationViewModel.fetchConversation(); + + searchViewModel.getQueryLiveData().observe(this, result -> { + if (result.getLoadStatus() == LoadStatus.Success) { + if (result.getData() != null && result.getData().size() > 0) { + if (contactSelectorDialog != null) { + contactSelectorDialog.showSearchResult(result.getData()); + } + } + + } + }); + + lovelist = new ArrayList<>(); //特别关注 + List followlist = ShareDateUtils.getFollowUsers(); + if (followlist != null) { + lovelist = convertFollowList(followlist, lovelist); + } + } + + public List convertFollowList(List list, List contactFriendBeans) { + for (UsersExistBean bean : list) { + FriendInfo friendInfo = new FriendInfo(String.valueOf(bean.getUserId()), TextUtils.isEmpty(bean.getRemark()) ? bean.getNickname() : bean.getRemark(), ""); + friendInfo.setUserInfo(new UserInfo(String.valueOf(bean.getUserId()), bean.getNickname(), bean.getAvatar())); + ContactFriendBean item = new ContactFriendBean(friendInfo); + contactFriendBeans.add(item); + } + return contactFriendBeans; + } + + public List convertConvacationList(List list) { + List contactFriendBeans = new ArrayList<>(); + + for (ConversationBean bean : list) { + ConversationInfo conversationInfo = bean.infoData; + if (conversationInfo.getFriendInfo() != null) { + FriendInfo friendInfo = conversationInfo.getFriendInfo(); + friendInfo.setUserInfo(conversationInfo.getUserInfo()); + ContactFriendBean item = new ContactFriendBean(friendInfo); + contactFriendBeans.add(item); + + } + } + return contactFriendBeans; + } + + public abstract View getContentView(); + + + //排序我的Team + public List sortListMembers(List teammemberlist) { + Collections.sort(teammemberlist, teammemberComparator); + return teammemberlist; + } + + + //按照群主在第一個,后加入的在最後 + public Comparator teammemberComparator = + (bean1, bean2) -> { + int result = 0; + if (bean1 == null) { + result = 1; + } else if (bean2 == null) { + result = -1; + } else if (bean1.getTeamInfo().getType() == TeamMemberType.Owner && bean2.getTeamInfo().getType() != TeamMemberType.Owner) { + result = -1; + } else if (bean1.getTeamInfo().getType() != TeamMemberType.Owner && bean2.getTeamInfo().getType() == TeamMemberType.Owner) { + result = 1; + } else if (bean1.getTeamInfo().getType() != TeamMemberType.Owner && bean2.getTeamInfo().getType() != TeamMemberType.Owner) { + long joinTime = bean1.getTeamInfo().getJoinTime() - bean2.getTeamInfo().getJoinTime(); + result = (joinTime == 0L ? 0 : (joinTime > 0 ? 1 : -1)); + } + return result; + }; + + //邀请好友 + public FunContactSelectorDialog showAddFriendsDialog(boolean isTeamShow) { + contactSelectorDialog = new FunContactSelectorDialog(this) + .setSelector(selectorlist) + .setTeamShow(isTeamShow) + .setActionTitle(getResources().getString(com.netease.yunxin.kit.contactkit.ui.R.string.invite_sure)) + .setAccountList(accountList) + .setLastList(lastlist) + .setLoveList(lovelist) + .setActionListener(this) + .setTeamQrClickListener(this); + contactSelectorDialog.show(); + return contactSelectorDialog; + + } + + @Override + public void invited(List listaccount, List listname, List listavat) { + //邀请好友 + if (listaccount != null) { + if (settingType == 0) { + teammodel.addMembers(teamId, listaccount); + } else { + //创建群聊 私聊 + for (UserInfo userInfo : listmemebers) { + listaccount.add(0, userInfo.getAccount()); + listname.add(0, userInfo.getName()); + listavat.add(0, userInfo.getAvatar()); + } + createGroup(listaccount, listname, listavat); + } + + } + if (contactSelectorDialog != null) { + contactSelectorDialog.dismiss(); + } + } + + public void createGroup(List selectorlist, List namelist, List listavat) { + TransHelper.launchTask( + BaseTeamQrSettingActivity.this, + 1, + (activity, integer) -> { + XKitRouter.withKey(ContactConstant.PATH_FUN_CREATE_GROUP_PAGE) + .withParam(REQUEST_CONTACT_SELECTOR_KEY, selectorlist) + .withParam(KEY_REQUEST_SELECTOR_NAME, namelist) + .withParam(REQUEST_CONTACT_SELECTOR_AVATAR, listavat) + .withContext(activity) + .withRequestCode(integer) + .navigate(); + return null; + }, + intentResultInfo -> { + if (intentResultInfo == null + || !intentResultInfo.getSuccess() + || intentResultInfo.getValue() == null) { + return null; + } + Intent data = intentResultInfo.getValue(); + ArrayList list = data.getStringArrayListExtra(REQUEST_CONTACT_SELECTOR_KEY); + if (list == null || list.isEmpty()) { + return null; + } + XKitRouter.withKey(PATH_FUN_CREATE_ADVANCED_TEAM_ACTION) + .withParam( + REQUEST_CONTACT_SELECTOR_KEY, + data.getStringArrayListExtra(REQUEST_CONTACT_SELECTOR_KEY)) + .withParam(KEY_TEAM_NAME, data.getStringExtra(KEY_TEAM_NAME)) + .withParam(KEY_TEAM_ICON, data.getStringExtra(KEY_TEAM_ICON)) + .withParam(ContactConstant.REQUEST_FUN_CREATE_GROUP_AUTO, data.getBooleanExtra(ContactConstant.REQUEST_FUN_CREATE_GROUP_AUTO, true)) + .navigate( + res -> { + if (res.getSuccess() && res.getValue() instanceof CreateTeamResult) { + Team teamInfo = ((CreateTeamResult) res.getValue()).getTeam(); +// TeamSettingViewModel teamSettingViewModel = new TeamSettingViewModel(); +// teamSettingViewModel.updateInvitePrivilege(teamInfo.getId(), 1);//更新邀请权限 +// teamSettingViewModel.updateBeInviteMode(teamInfo.getId(), false); + + Map map = new HashMap<>(1); + map.put( + KEY_TEAM_CREATED_TIP, + getString(com.netease.yunxin.kit.conversationkit.ui.R.string.create_advanced_team_success)); + // 发送创建成功群里提示信息 + XKitRouter.withKey(PATH_CHAT_SEND_TEAM_TIP_ACTION) + .withParam(KEY_SESSION_ID, teamInfo.getId()) + .withParam(KEY_REMOTE_EXTENSION, map) + .navigate(); + + if (teamInfo.getTeamBeInviteMode() == TeamBeInviteModeEnum.NoAuth) { + // 邀请加入群,处理邀请通知早于创建成功通知 + XKitRouter.withKey(PATH_TEAM_INVITE_ACTION) + .withParam(KEY_TEAM_ID, teamInfo.getId()) + .withParam(REQUEST_CONTACT_SELECTOR_KEY, list) + .navigate(); + } + //跳转到会话页面 + XKitRouter.withKey(PATH_CHAT_TEAM_PAGE) + .withContext(this) + .withParam(CHAT_KRY, teamInfo) + .navigate(); + + } else { + ALog.e("TAG", "create team failed."); + } + }); + finish(); + return null; + } + ); + + } + + @Override + public void search(String text) { + searchViewModel.queryFriend(text); + } + + public boolean shareQrCode = true; + + @RequiresApi(api = Build.VERSION_CODES.M) + @Override + public void showTeamQR() { + showLoading(); + shareQrCode = true; + showQrcodeView(); + } + + @Override + public void showTeamUrl() { + showLoading(); + shareQrCode = false; + showQrcodeView(); + } + + @Override + protected void onDestroy() { + EventCenter.unregisterEventNotify(cleanHistoryEvent); + super.onDestroy(); + } + + //******************************************************群行动码处理start***************************************************************** + + private ImageView coloseIv; + private LinearLayout qrcodeLy; + private ImageView qrcodeIv; + private TextView qrcodeTipsTv; + private LinearLayout qrcodeActionLy; + private TextView copyTv; + private TextView shareTv; + private TextView saveTv; + private TextView shuaxinTv; + + FunContactSelectorDialog shareDialog; + + @RequiresApi(api = Build.VERSION_CODES.M) + public void showQrcodeView() { + BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(this, R.style.BottomSheetDialog); + + View bottomView = LayoutInflater.from(this).inflate(R.layout.bottom_sheet_qrcode_layout, null); + + coloseIv = (ImageView) bottomView.findViewById(R.id.colose_iv); + qrcodeLy = (LinearLayout) bottomView.findViewById(R.id.qrcode_ly); + qrcodeIv = (ImageView) bottomView.findViewById(R.id.qrcode_iv); + qrcodeTipsTv = (TextView) bottomView.findViewById(R.id.qrcode_tips_tv); + qrcodeActionLy = (LinearLayout) bottomView.findViewById(R.id.qrcode_action_ly); + copyTv = (TextView) bottomView.findViewById(R.id.copy_tv); + shareTv = (TextView) bottomView.findViewById(R.id.share_tv); + saveTv = (TextView) bottomView.findViewById(R.id.save_tv); + shuaxinTv = (TextView) bottomView.findViewById(R.id.shuaxin_tv); + qrcodeTipsTv.setText(getResources().getString(R.string.save_teamcode_join_txt, getString(R.string.app_name))); + Bitmap bitmap = CodeUtils.createQRCode(String.format(IMUIKitConfig.SHARE_INVCODEGROUP1, teamId), DataUtils.dip2px(this, 175.0f), null); + if (loginBean != null) { + bitmap = CodeUtils.createQRCode(String.format(IMUIKitConfig.SHARE_INVCODEGROUP, loginBean.getUser().getInviteCode(), teamId), DataUtils.dip2px(this, 175.0f), null); + } + if (bitmap != null) { + qrcodeIv.setImageBitmap(bitmap); + } + + shuaxinTv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + ToastX.showShortToast(R.string.shuaxinchenggong_txt); + } + }); + + coloseIv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + bottomSheetDialog.dismiss(); + } + }); + + saveTv.setOnClickListener(v -> { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { +// if (PermissionUtils.hasPermissions( +// this, Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO)) { +// doSaveQrcode(); +// } else { +// requestCameraPermission( +// ); +// } + doSaveQrcode(); + } else { + if (PermissionUtils.hasPermissions( + this, Manifest.permission.READ_EXTERNAL_STORAGE)) { + doSaveQrcode(); + } else { + requestCameraPermission( + Manifest.permission.READ_EXTERNAL_STORAGE); + } + } + }); + + shareTv.setOnClickListener(v -> { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { +// if (PermissionUtils.hasPermissions( +// this, Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO)) { +// showBottomShare(); +// } else { +// requestCameraPermission(); +// } + showBottomShare(); + } else { + if (PermissionUtils.hasPermissions( + this, Manifest.permission.READ_EXTERNAL_STORAGE)) { + showBottomShare(); + } else { + requestCameraPermission( + Manifest.permission.READ_EXTERNAL_STORAGE); + } + } + }); + + copyTv.setOnClickListener(v -> { + if (loginBean != null) { + LogUtils.i("数据是啥:" + GsonUtils.beanToJSONString(loginBean)); + String url = String.format(IMUIKitConfig.SHARE_INVCODEGROUP, loginBean.getUser().getInviteCode(), teamId); + DataUtils.copy(url, this); + ToastX.showShortToast(R.string.fuzhichenggong_txt); + } + }); + + bottomSheetDialog.setContentView(bottomView); + bottomSheetDialog.show(); + + bottomSheetDialog.setOnDismissListener(dialog -> getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white))); + AdaptScreenUtils.setWhiteNavigationBar(bottomSheetDialog); + dismissLoading(); + } + + private void requestCameraPermission(String permission) { + permissionLauncher.launch(new String[]{permission}); + } + + protected ActivityResultLauncher permissionLauncher; + + private void requestCameraPermission() { + permissionLauncher.launch(new String[]{Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO}); + } + +// private List shareListAccount = new ArrayList<>(); + +// public void showBottomShareDialog() { +// shareDialog = new FunContactSelectorDialog(this) +// .setSelector(new ArrayList<>()) +// .setTeamShow(false) +// .setActionTitle(getString(R.string.fasong_txt)) +// .setInsertDrawable(getDrawable(com.netease.yunxin.kit.contactkit.ui.R.drawable.fun_insert_topdialog_290)) +// .setAccountList(accountList) +// .setLastList(lastlist) +// .setLoveList(lovelist) +// .setActionListener(new FunContactSelectorDialog.onActionClickListener() { +// @Override +// public void invited(List listaccount, List listname, List listavat) { +// //发送 +// shareListAccount.clear(); +// shareListAccount.addAll(listaccount); +// doSaveQrcodeShare(shareDialog); +// +// } +// +// @Override +// public void search(String text) { +// +// } +// }); +// shareDialog.show(); +// } + + + @RequiresApi(api = Build.VERSION_CODES.M) + public void showBottomShare() { + titleUsers = shareDateUtils.getConverstionShareInfo(); + titleUsersIsCheck = new ArrayList<>(); + for (UserShareBean conversationInfo : titleUsers) { + titleUsersIsCheck.add(false); + } + if (titleUsers == null || titleUsers.size() == 0) { + ToastX.showShortToast(R.string.mykfxfddx_txt); + return; + } + BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(this, R.style.BottomSheetDialog); + + View bottomView = LayoutInflater.from(this).inflate(R.layout.bottom_sheet_layout, null); + + + coloseIvShare = (ImageView) bottomView.findViewById(R.id.colose_iv); + recyclerShare = (RecyclerView) bottomView.findViewById(R.id.recycler); + commentEtShare = (EditText) bottomView.findViewById(R.id.comment_et); + + shareBt = (TextView) bottomView.findViewById(R.id.share_bt); + initList(); + bottomSheetDialog.setContentView(bottomView); + bottomSheetDialog.show(); + coloseIvShare.setOnClickListener(v -> bottomSheetDialog.dismiss()); + bottomSheetDialog.setOnDismissListener(dialog -> getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white))); + shareBt.setOnClickListener(v -> { + + boolean isSelect = false; + for (Boolean type : titleUsersIsCheck) { + if (type) { + isSelect = true; + } + } + if (!isSelect) { + ToastX.showShortToast(getString(R.string.qxxzyfxddx_txt)); + return; + } + if (shareQrCode) { + doSaveQrcodeShare(bottomSheetDialog); + } else { + InviteGroupAttachment attachment = new InviteGroupAttachment(teamId, teamName, IMKitClient.account()); + shareTeamInviteMessage(attachment); + bottomSheetDialog.dismiss(); + } + + }); + AdaptScreenUtils.setWhiteNavigationBar(bottomSheetDialog); + + } + + private ImageView coloseIvShare; + private RecyclerView recyclerShare; + private EditText commentEtShare; + private TextView shareBt; + private LinearLayoutManager linearLayoutManager; + private CommonAdapter commonAdapter; + private ArrayList titleUsers; + private ArrayList titleUsersIsCheck; + + private void initList() { + + + linearLayoutManager = new LinearLayoutManager(this); + linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); + recyclerShare.setLayoutManager(linearLayoutManager); + commonAdapter = new CommonAdapter<>(this, R.layout.item_share_list, titleUsers) { + @Override + public void convert(ViewHolder holder, UserShareBean s, int index) { + ImageView select_iv = holder.getView(R.id.select_iv); + if (titleUsersIsCheck.get(index)) { + select_iv.setImageResource(R.mipmap.dialog_item_gou); + } else { + select_iv.setImageResource(R.mipmap.dialog_item_quan); + } + + ContactAvatarView imageView = holder.getView(R.id.logo_iv); + + if (s.getTeamInfo() != null) { + if (TextUtils.isEmpty(s.getTeamInfo().getIcon())) { + imageView.setData(com.netease.yunxin.kit.conversationkit.ui.R.drawable.ic_group_defaulthead, s.getTeamInfo().getName()); + } else { + imageView.setData( + s.getTeamInfo().getIcon(), s.getTeamInfo().getName(), AvatarColor.avatarColor(s.getTeamInfo().getId())); + } + holder.setText(R.id.title_tv, s.getTeamInfo().getName()); + } else { + ColorUtils.loadAvator(s.getFriendInfo().getAvatar(), imageView); +// imageView.setData( +// s.getFriendInfo().getAvatar(), s.getFriendInfo().getName(), AvatarColor.avatarColor(s.getFriendInfo().getAccount())); + holder.setText(R.id.title_tv, s.getFriendInfo().getName()); + + } + + holder.getView(R.id.big_bg).setOnClickListener(v -> { + titleUsersIsCheck.set(index, !titleUsersIsCheck.get(index)); + commonAdapter.notifyItemChanged(index, titleUsersIsCheck.get(index)); + LogUtils.i("0000000000"); + + changeItemButton(); + }); + } + }; + recyclerShare.setAdapter(commonAdapter); + } + + private void changeItemButton() { + LogUtils.i("1111111111111111"); + boolean isSelcet = false; + for (boolean item : titleUsersIsCheck) { + if (item) { + isSelcet = true; + break; + } + } + chagnBottom(isSelcet); + + } + + private void chagnBottom(boolean b) { + LogUtils.i("22222222222:" + b); + + if (b) { + shareBt.setBackground(getResources().getDrawable(R.drawable.button_true_bg)); + shareBt.setEnabled(true); + } else { + shareBt.setBackground(getResources().getDrawable(R.drawable.button_false_bg_new)); + shareBt.setEnabled(false); + + } + } + + /** + * 将2维码保存到系统相册。 + */ + private void doSaveQrcode() { + // 先生成bitmap对象 + Bitmap bmp = DataUtils.generateBitmap(qrcodeLy); + // bitmap对象生成成功 + if (bmp != null) { + // 保存到相册成功 + if (ToolKits.saveBmp2Gallery(this, bmp)) { + ToastX.showShortToast(getString(R.string.qrcode_generate_activity_qr_save_sucess)); + } else { + ToastX.showShortToast(getString(R.string.qrcode_generate_activity_qr_save_fail)); + } + } else { + Log.w("doSaveQrcode", "将2维码保存到相册时失败了,从view生成Bitmap对象失败,生成后的bmp=null!"); + ToastX.showShortToast(getString(R.string.qrcode_generate_activity_qr_generate_fail)); + } + } + + private void shareTeamInviteMessage(InviteGroupAttachment attachment) { + for (int i = 0; i < titleUsersIsCheck.size(); i++) { + if (titleUsersIsCheck.get(i)) { + toShareMessage(titleUsers.get(i), attachment); + } + } + } + + /** + * 将2维码保存到系统相册。 + */ + private void doSaveQrcodeShare(BottomSheetDialog bottomSheetDialog) { + // 先生成bitmap对象 + Bitmap bmp = DataUtils.generateBitmap(qrcodeLy); + // bitmap对象生成成功 + if (bmp != null) { + // 保存到相册成功 + + Uri fileUri = ToolKits.saveBmp2GalleryShare(this, bmp); + if (fileUri != null) { +// ToastX.showShortToast(getString(R.string.qrcode_generate_activity_qr_save_sucess)); + sendMessage(fileUri); + } else { + ToastX.showShortToast(getString(R.string.qrcode_generate_activity_qr_save_fail)); + } + } else { + Log.w("doSaveQrcode", "将2维码保存到相册时失败了,从view生成Bitmap对象失败,生成后的bmp=null!"); + ToastX.showShortToast(getString(R.string.qrcode_generate_activity_qr_generate_fail)); + } + bottomSheetDialog.dismiss(); + } + + Handler mHandler = new Handler(); + + private void sendMessage(Uri uri) { + mHandler.postDelayed(() -> { + File imageFile = UriUtils.uri2File(uri); + + for (int i = 0; i < titleUsersIsCheck.size(); i++) { + if (titleUsersIsCheck.get(i)) { + toShareMessage(titleUsers.get(i), imageFile); + } + } + + }, 100); + } + +// private void toShareMessage(String accountId, File imageFile) { +// IMMessage imageMsg = MessageBuilder.createImageMessage(accountId, SessionTypeEnum.P2P, imageFile); +// if (imageMsg != null) { +// ChatRepo.sendMessage( +// imageMsg, +// false, +// new FetchCallbackImpl() { +// @Override +// public void onSuccess(@Nullable Void param) { +// super.onSuccess(param); +// ToastX.showShortToast(R.string.qrcode_share_succ_txt); +// } +// +// @Override +// public void onFailed(int code) { +// +// } +// }); +// } +// } + + private void toShareMessage(UserShareBean conversationInfo, File imageFile) { + IMMessage imageMsg = null; + if (conversationInfo.getTeamInfo() != null) { + imageMsg = MessageBuilder.createImageMessage(conversationInfo.getTeamInfo().getId(), SessionTypeEnum.Team, imageFile); + } else if (conversationInfo.getFriendInfo() != null) { + imageMsg = MessageBuilder.createImageMessage(conversationInfo.getFriendInfo().getAccount(), SessionTypeEnum.P2P, imageFile); + } + if (imageMsg != null) { + ChatRepo.sendMessage( + imageMsg, + false, + new FetchCallbackImpl() { + @Override + public void onSuccess(@Nullable Void param) { + super.onSuccess(param); + ToastX.showShortToast(R.string.qrcode_share_succ_txt); + } + + @Override + public void onFailed(int code) { + + } + }); + } + } + + //群邀请分享 + private void toShareMessage(UserShareBean conversationInfo, InviteGroupAttachment attachment) { + IMMessage imageMsg = null; + if (conversationInfo.getTeamInfo() != null) { + imageMsg = MessageBuilder.createCustomMessage(conversationInfo.getTeamInfo().getId(), SessionTypeEnum.Team, + getString(com.netease.yunxin.kit.chatkit.ui.R.string.inviteGroup_message_txt), attachment); + } else if (conversationInfo.getFriendInfo() != null) { + try { + imageMsg = MessageBuilder.createCustomMessage(conversationInfo.getFriendInfo().getAccount(), SessionTypeEnum.P2P, + getString(com.netease.yunxin.kit.chatkit.ui.R.string.inviteGroup_message_txt), attachment); + } catch (Exception e) { + LogUtils.d("e===" + e.getMessage()); + } + + } + if (imageMsg != null) { + ChatRepo.sendMessage( + imageMsg, + false, + new FetchCallbackImpl() { + @Override + public void onSuccess(@Nullable Void param) { + super.onSuccess(param); + ToastX.showShortToast(R.string.message_share_success); + } + + @Override + public void onFailed(int code) { + + } + }); + } + } + + //******************************************************群行动码处理end***************************************************************** + public boolean onTouchEvent(MotionEvent event) { + if (null != this.getCurrentFocus()) { + /** + * 点击空白位置 隐藏软键盘 + */ + InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + return mInputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0); + } + return super.onTouchEvent(event); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/imkit/team/SettingResourceActivity.java b/app/src/main/java/com/dskj/rbchat/imkit/team/SettingResourceActivity.java new file mode 100644 index 0000000..31aa8a6 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/imkit/team/SettingResourceActivity.java @@ -0,0 +1,148 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.imkit.team; + +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.util.TypedValue; +import android.view.View; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentActivity; +import androidx.viewpager2.adapter.FragmentStateAdapter; + +import com.dskj.rbchat.R; +import com.dskj.rbchat.base.LllChatBaseActivity; +import com.dskj.rbchat.databinding.ActivitySettingresourceBinding; +import com.dskj.rbchat.imkit.base.fragment.SettingPhotoFragment; +import com.dskj.rbchat.voom.CirclePicFragment; +import com.dskj.rbchat.voom.TiktoInfokActivity; +import com.google.android.material.tabs.TabLayoutMediator; +import com.netease.nimlib.sdk.team.model.Team; +import com.netease.yunxin.kit.corekit.im.model.UserInfo; + +import java.util.ArrayList; +import java.util.List; + + +/** + * team 个人聊天 群链接 + */ +public class SettingResourceActivity extends LllChatBaseActivity { + + + public static final String TABINDEX = "tabindex"; + public static final String SETTINGTEAMINFO = "teaminfo"; + public static final String SETTINGUSERINFO = "userinfo"; + + public static void launch(Context context, int tabindex, Team teamInfo, UserInfo userInfo) { + Intent intent = new Intent(context, SettingResourceActivity.class); + intent.putExtra(TABINDEX, tabindex); + intent.putExtra(SETTINGTEAMINFO, teamInfo); + intent.putExtra(SETTINGUSERINFO, userInfo); + context.startActivity(intent); + } + + ActivitySettingresourceBinding binding; + private Team team; + private UserInfo userInfo; + private String title; + private int[] tabTitles = {R.string.teamsetting_photo, R.string.teamsetting_link/**, R.string.teamsetting_info*/}; + private List listFragment; + private ArrayList listTitles; + private int tabindex; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = ActivitySettingresourceBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + tabindex = getIntent().getIntExtra(TABINDEX, 0); + team = (Team) getIntent().getSerializableExtra(SETTINGTEAMINFO); + userInfo = (UserInfo) getIntent().getSerializableExtra(SETTINGUSERINFO); + if (team != null) { + title = team.getName() + " (" + team.getMemberCount() + ")"; + } + if (userInfo != null) { + title = userInfo.getName(); + } + initView(); + } + + @Override + public int initNavigationBarColor() { + return 0; + } + + @Override + public int initStatusBarColor() { + return 0; + } + + + public void initView() { + initTitleBar(); + listFragment = new ArrayList<>(); + listTitles = new ArrayList<>(); + for (int i = 0; i < tabTitles.length; i++) { + listFragment.add(SettingPhotoFragment.newInstance(i, userInfo != null ? 1 : 2, userInfo != null ? userInfo.getAccount() : team.getId())); + listTitles.add(getResources().getString(tabTitles[i])); + } + ViewPagerAdapter adapter = new ViewPagerAdapter(this, listTitles, listFragment); + binding.viewpagerFmSetres.setAdapter(adapter); + //把TabLayout(选项卡布局)和ViewPager2绑定在一起。特别说明一下,下面这行代码是官方给的,特别好使。 + new TabLayoutMediator(binding.tablayoutSetres, binding.viewpagerFmSetres, (tab, position) -> tab.setText(listTitles.get(position))).attach(); + binding.viewpagerFmSetres.setCurrentItem(tabindex); + } + + public void initTitleBar() { + binding.backtitleBar.getTitleTextView().setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20); + binding.backtitleBar.setTitle(title); + binding.backtitleBar.setOnBackIconClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + finish(); + } + }); + } + + public class ViewPagerAdapter extends FragmentStateAdapter { + private ArrayList listTitle; + private List listFragment; + + + public ViewPagerAdapter(@NonNull FragmentActivity fragmentActivity, ArrayList listTitle, List listFragment) { + super(fragmentActivity); + this.listTitle = listTitle; + this.listFragment = listFragment; + } + + + @NonNull + @Override + public Fragment createFragment(int position) { + return listFragment.get(position); + } + + @Override + public int getItemCount() { + return listFragment.size(); + } + + } + + + @Override + protected void onDestroy() { + super.onDestroy(); + + } + + +} diff --git a/app/src/main/java/com/dskj/rbchat/imkit/team/TeamAnnouncementActivity.java b/app/src/main/java/com/dskj/rbchat/imkit/team/TeamAnnouncementActivity.java new file mode 100644 index 0000000..a8a626f --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/imkit/team/TeamAnnouncementActivity.java @@ -0,0 +1,156 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.imkit.team; + +import static com.netease.yunxin.kit.teamkit.ui.utils.NetworkUtilsWrapper.handleNetworkBrokenResult; + +import android.app.Activity; +import android.content.Intent; +import android.os.Build; +import android.os.Bundle; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.util.TypedValue; +import android.view.View; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.GridLayoutManager; + +import com.bumptech.glide.Glide; +import com.dskj.rbchat.R; +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.base.LllChatBaseActivity; +import com.dskj.rbchat.contact.ReportActivity; +import com.dskj.rbchat.databinding.ActivityBaseChatsettingBinding; +import com.dskj.rbchat.databinding.ActivityTeamannouncementBinding; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.model.TeamUpdateEvent; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.widget.CircleImageView; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.RequestCallback; +import com.netease.nimlib.sdk.msg.MsgService; +import com.netease.nimlib.sdk.msg.attachment.FileAttachment; +import com.netease.nimlib.sdk.msg.constant.MsgTypeEnum; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.nimlib.sdk.msg.model.IMMessage; +import com.netease.nimlib.sdk.msg.model.MsgSearchOption; +import com.netease.nimlib.sdk.team.constant.TeamMemberType; +import com.netease.nimlib.sdk.team.constant.TeamMessageNotifyTypeEnum; +import com.netease.nimlib.sdk.team.model.Team; +import com.netease.nimlib.sdk.team.model.TeamMember; +import com.netease.yunxin.kit.chatkit.model.IMMessageInfo; +import com.netease.yunxin.kit.chatkit.model.UserInfoWithTeam; +import com.netease.yunxin.kit.chatkit.ui.ChatKitUIConstant; +import com.netease.yunxin.kit.chatkit.ui.common.ChatDataUtils; +import com.netease.yunxin.kit.chatkit.ui.model.CleanHistoryEvent; +import com.netease.yunxin.kit.corekit.event.EventCenter; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.utils.RouterConstant; +import com.netease.yunxin.kit.teamkit.ui.utils.viewmodel.TeamSettingViewModel; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +/** + * 群公告 + */ +public class TeamAnnouncementActivity extends LllChatBaseActivity { + + + ActivityTeamannouncementBinding binding; + private TeamSettingViewModel teamSettingViewModel; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = ActivityTeamannouncementBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + String teamId = getIntent().getStringExtra(RouterConstant.KEY_TEAM_ID); + if (TextUtils.isEmpty(teamId)) { + TeamAnnouncementActivity.this.finish(); + return; + } + teamSettingViewModel = new TeamSettingViewModel(); + initTitleView(); + + teamSettingViewModel.getTeamWithMemberData().observe(this, teamResultInfo -> { + if (teamResultInfo.getValue() == null || !teamResultInfo.getSuccess()) { + TeamAnnouncementActivity.this.finish(); + return; + } + Team teaminfo = teamResultInfo.getValue().getTeam(); + if (teaminfo.getCreator().equals(IMKitClient.account())) { //我是群主 + binding.layoutTeammember.setVisibility(View.GONE); + binding.layoutTeammanager.setVisibility(View.VISIBLE); + String announcement = teaminfo.getAnnouncement(); + binding.editTeamannouncement.setText(announcement); + binding.tvTextlength.setText(announcement.length() + "/500"); + binding.editTeamannouncement.setSelection(announcement.length()); + binding.editTeamannouncement.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void afterTextChanged(Editable editable) { + binding.tvTextlength.setText(editable.toString().length() + "/500"); + } + }); + binding.tvTeamannouncementSave.setOnClickListener(view -> { + //更新群公告 + teamSettingViewModel.updateTeamAnnouncement(teaminfo.getId(), binding.editTeamannouncement.getText().toString()); + }); + + teamSettingViewModel.getUpdateTeamAnnouncement().observe( + this, + voidResultInfo -> { + if (voidResultInfo.getSuccess()) { + ChatDataUtils.set(TeamAnnouncementActivity.this, String.format(ChatKitUIConstant.SHOW_TEAM_ANNOUNCEMENT,IMKitClient.account(),teamId), true); + TeamAnnouncementActivity.this.finish(); + return; + } + handleNetworkBrokenResult(this, voidResultInfo); + }); + } else { + binding.layoutTeammember.setVisibility(View.VISIBLE); + binding.layoutTeammanager.setVisibility(View.GONE); + binding.tvTeamannouncement.setText(teaminfo.getAnnouncement()); + } + }); + teamSettingViewModel.requestTeamData(teamId); + + } + + @Override + public int initNavigationBarColor() { + return getColor(R.color.color_white); + } + + @Override + public int initStatusBarColor() { + return getColor(R.color.color_titlebar); + } + + private void initTitleView() { + binding.titlebarTeamannouncement.setOnBackIconClickListener(view -> finish()); + binding.titlebarTeamannouncement.getTitleTextView().setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20); + } + + +} diff --git a/app/src/main/java/com/dskj/rbchat/imkit/team/TeamHeadBgSettingActivity.java b/app/src/main/java/com/dskj/rbchat/imkit/team/TeamHeadBgSettingActivity.java new file mode 100644 index 0000000..4fec64f --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/imkit/team/TeamHeadBgSettingActivity.java @@ -0,0 +1,328 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.imkit.team; + +import android.Manifest; +import android.content.Context; +import android.content.Intent; +import android.graphics.Typeface; +import android.os.Build; +import android.os.Bundle; +import android.text.TextUtils; +import android.util.TypedValue; +import android.view.View; +import android.widget.Toast; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; + +import com.bumptech.glide.Glide; +import com.dskj.rbchat.R; +import com.dskj.rbchat.base.LllChatBaseActivity; +import com.dskj.rbchat.databinding.ActivityHeadUserEditBinding; +import com.dskj.rbchat.databinding.ActivityTeamothersettingBinding; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.main.mine.UserHeadEditActivity; +import com.dskj.rbchat.model.TeamUpdateEvent; +import com.netease.nimlib.sdk.team.model.Team; +import com.netease.yunxin.kit.common.ui.photo.PhotoPicker; +import com.netease.yunxin.kit.common.ui.utils.CommonCallback; +import com.netease.yunxin.kit.common.ui.utils.Permission; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.common.utils.NetworkUtils; +import com.netease.yunxin.kit.common.utils.PermissionUtils; +import com.netease.yunxin.kit.corekit.event.EventCenter; +import com.netease.yunxin.kit.corekit.im.provider.FetchCallback; +import com.netease.yunxin.kit.corekit.im.repo.CommonRepo; +import com.netease.yunxin.kit.teamkit.ui.utils.ColorUtils; +import com.netease.yunxin.kit.teamkit.ui.utils.viewmodel.TeamSettingViewModel; + +import java.io.File; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * team 头像背景设置 + */ +public class TeamHeadBgSettingActivity extends LllChatBaseActivity implements CommonCallback { + + private ActivityHeadUserEditBinding binding; + private static final String TEAMINFO = "team"; + private Team team; + public final TeamSettingViewModel teammodel = new TeamSettingViewModel(); + protected ActivityResultLauncher permissionLauncher; + public boolean isBackageB = false; + public String headUrl = ""; + public String bgUrl = ""; + + public static void launch(Context context, Team teaminfo, @NonNull ActivityResultLauncher launcher) { + Intent intent = new Intent(context, TeamHeadBgSettingActivity.class); + intent.putExtra(TEAMINFO, teaminfo); + launcher.launch(intent); + } + + @RequiresApi(api = Build.VERSION_CODES.M) + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = ActivityHeadUserEditBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + team = getIntent().getSerializableExtra(TEAMINFO, Team.class); + } else { + team = (Team) getIntent().getSerializableExtra(TEAMINFO); + } + initView(); + initData(); + permissionLauncher = + registerForActivityResult( + new ActivityResultContracts.RequestMultiplePermissions(), + result -> { + if (result != null) { + for (Map.Entry entry : result.entrySet()) { + String permission = entry.getKey().toString(); + boolean grant = (Boolean) entry.getValue(); + if (grant) { + if (TextUtils.equals( + permission, Manifest.permission.READ_EXTERNAL_STORAGE) || TextUtils.equals( + permission, Manifest.permission.READ_MEDIA_IMAGES) || TextUtils.equals( + permission, Manifest.permission.READ_MEDIA_VIDEO)) { + startCameraPhoto(true); + } + } else { + if (shouldShowRequestPermissionRationale(permission)) { + ToastX.showShortToast(getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_deny_tips)); + } else { + ToastX.showShortToast(getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_storage)); + } + } + } + } + }); + } + + @Override + public int initNavigationBarColor() { + return 0; + } + + @Override + public int initStatusBarColor() { + return 0; + } + + + public void initView() { + initTitleView(); + if (team != null) { + if (!TextUtils.isEmpty(team.getIcon())) { + binding.cavAvatar.setData(team.getIcon(), ""); + } else { + binding.cavAvatar.setData(com.netease.yunxin.kit.contactkit.ui.R.mipmap.ic_group_defaulthead, "head", 1); + } + binding.forbgIv.setImageResource(R.mipmap.ic_settingother_bg); + } + binding.lineZiliao.setVisibility(View.GONE); + binding.tvZiliao.setVisibility(View.GONE); + binding.flCamera1.setVisibility(View.GONE); + binding.toPhotoRy1.setVisibility(View.GONE); + binding.flCamera.setOnClickListener(v -> choicePhoto(false, false)); + binding.toPhotoRy.setOnClickListener(v -> choicePhoto(true, false)); +// binding.tvZiliao.setText(getString(R.string.teamsetting_other_teamzlfm)); +// binding.flCamera1.setOnClickListener(v -> choicePhoto(false, true)); +// binding.toPhotoRy1.setOnClickListener(v -> choicePhoto(true, true)); + + + } + + private void initTitleView() { + binding.settingTitleBar.setTitle(R.string.teamsetting_other_teamhead); + binding.settingTitleBar.getTitleTextView().setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20); +// binding.settingTitleBar.getTitleTextView().setTypeface(Typeface.defaultFromStyle(Typeface.BOLD)); + binding.settingTitleBar.setOnBackIconClickListener( + v -> { + onBackPressed(); + + + }); + + } + + @Override + public void onBackPressed() { + //保存 + if (!TextUtils.isEmpty(headUrl)) { + teammodel.updateIcon(team.getId(), headUrl); + return; + } + if (!TextUtils.isEmpty(bgUrl)) { + //更新背景图片 + setActivityResult(2); + return; + } + + finish(); + } + + private void choicePhoto(boolean isPhoto, boolean isBg) { + this.isBackageB = isBg; + if (!isPhoto) { + if (PermissionUtils.hasPermissions(TeamHeadBgSettingActivity.this, new String[]{"android.permission.CAMERA"})) { + startCameraPhoto(false); + } else { + Permission.requirePermissions(TeamHeadBgSettingActivity.this, new String[]{"android.permission.CAMERA"}).request(new Permission.PermissionCallback() { + public void onGranted(List permissionsGranted) { + if (permissionsGranted.containsAll(Arrays.asList(new String[]{"android.permission.CAMERA"}))) { + startCameraPhoto(false); + } else { + ToastX.showShortToast(R.string.dialog_permission_tips); + } + + } + + public void onDenial(List permissionsDenial, List permissionDenialForever) { + ToastX.showShortToast(R.string.dialog_permission_tips); + } + + public void onException(Exception exception) { + ToastX.showShortToast(R.string.dialog_permission_tips); + } + }); + } + } else { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { +// if (PermissionUtils.hasPermissions( +// TeamHeadBgSettingActivity.this, Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO)) { +// startCameraPhoto(true); +// } else { +// permissionLauncher.launch(new String[]{Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO}); +// } + startCameraPhoto(true); + } else { + if (PermissionUtils.hasPermissions( + TeamHeadBgSettingActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE)) { + startCameraPhoto(true); + } else { + permissionLauncher.launch(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}); + + } + } + } + + + } + + public void startCameraPhoto(boolean isPickAlbum) { + if (isPickAlbum) { + PhotoPicker.getInstance().getAPhotoFromAlbumCropAndUpload(TeamHeadBgSettingActivity.this, this); + } else { + PhotoPicker.getInstance().takePhotoCorpAndUpload(TeamHeadBgSettingActivity.this, this); + } + + } + + + private void updateFocusBg(String url) { + + if (isBackageB) { + bgUrl = url; + Glide.with(TeamHeadBgSettingActivity.this) + .load(url) + .into(binding.forbgIv); + } else { + headUrl = url; + binding.cavAvatar.setData(url, team.getName()); + } + + } + + + public void setActivityResult(int type) { + Intent intent = new Intent(); + intent.putExtra("type", type); + intent.putExtra("bgUrl", bgUrl); + setResult(RESULT_OK, intent); + finish(); + } + + public void initData() { + + teammodel.getIconData().observe(this, stringResultInfo -> { + if (stringResultInfo.getSuccess()) { + setActivityResult(3); + } + }); + + } + + @Override + protected void onDestroy() { + super.onDestroy(); + + } + + + @Override + public void onException(@Nullable Throwable throwable) { + Toast.makeText( + getApplicationContext(), + getString(com.netease.yunxin.kit.teamkit.ui.R.string.team_request_fail), + Toast.LENGTH_SHORT) + .show(); + } + + @Override + public void onFailed(int i) { + Toast.makeText( + getApplicationContext(), + getString(com.netease.yunxin.kit.teamkit.ui.R.string.team_request_fail), + Toast.LENGTH_SHORT) + .show(); + } + + @Override + public void onSuccess(@Nullable File file) { + //选取成功 + if (NetworkUtils.isConnected() && file != null) { + CommonRepo.uploadImage( + file, + new FetchCallback() { + @Override + public void onSuccess(@Nullable String urlParam) { + updateFocusBg(urlParam); + } + + @Override + public void onFailed(int code) { + Toast.makeText( + getApplicationContext(), + getString(com.netease.yunxin.kit.teamkit.ui.R.string.team_request_fail), + Toast.LENGTH_SHORT) + .show(); + } + + @Override + public void onException(@Nullable Throwable exception) { + Toast.makeText( + getApplicationContext(), + getString(com.netease.yunxin.kit.teamkit.ui.R.string.team_request_fail), + Toast.LENGTH_SHORT) + .show(); + } + }); + } else { + Toast.makeText( + getApplicationContext(), + getString(com.netease.yunxin.kit.teamkit.ui.R.string.team_network_error), + Toast.LENGTH_SHORT) + .show(); + } + } + +} diff --git a/app/src/main/java/com/dskj/rbchat/imkit/team/TeamInvitedJoinActivity.java b/app/src/main/java/com/dskj/rbchat/imkit/team/TeamInvitedJoinActivity.java new file mode 100644 index 0000000..03a1dd7 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/imkit/team/TeamInvitedJoinActivity.java @@ -0,0 +1,127 @@ +package com.dskj.rbchat.imkit.team; + +import android.content.res.ColorStateList; +import android.os.Bundle; +import android.view.View; + +import androidx.annotation.Nullable; + +import com.dskj.rbchat.R; +import com.dskj.rbchat.base.LllChatBaseActivity; +import com.dskj.rbchat.databinding.ActivityTeamInvitejoinBinding; +import com.dskj.rbchat.main.index.add.AddFriendsActivity; +import com.dskj.rbchat.model.TeamUpdateEvent; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.RequestCallback; +import com.netease.nimlib.sdk.ResponseCode; +import com.netease.nimlib.sdk.team.TeamService; +import com.netease.nimlib.sdk.team.model.Team; +import com.netease.yunxin.kit.chatkit.repo.ContactRepo; +import com.netease.yunxin.kit.chatkit.repo.TeamRepo; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.contactkit.ui.utils.ColorUtils; +import com.netease.yunxin.kit.corekit.event.EventCenter; +import com.netease.yunxin.kit.corekit.im.provider.FetchCallback; +import com.netease.yunxin.kit.corekit.im.utils.RouterConstant; +import com.netease.yunxin.kit.corekit.route.XKitRouter; +import com.netease.yunxin.kit.teamkit.ui.utils.viewmodel.TeamSettingViewModel; + + +/** + * 邀请加入群聊 + */ +public class TeamInvitedJoinActivity extends LllChatBaseActivity { + + public final TeamSettingViewModel teammodel = new TeamSettingViewModel(); + private ActivityTeamInvitejoinBinding binding; + private String teamId; + protected Team teamInfo; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = ActivityTeamInvitejoinBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + teamId = getIntent().getStringExtra("teamId"); + binding.titleBar.setOnBackIconClickListener(view -> finish()); + teammodel + .getTeamWithMemberData() + .observe( + this, + teamResultInfo -> { + if (teamResultInfo.getValue() == null || !teamResultInfo.getSuccess()) { + return; + } + teamInfo = teamResultInfo.getValue().getTeam(); + refreshUI(teamInfo); + }); + teammodel.requestTeamData(teamId); + } + + public void refreshUI(Team teaminfo) { + ColorUtils.loadGroupAvator(teaminfo.getIcon(), binding.groupHeadIv); + binding.groupNameTv.setText(teaminfo.getName()); + binding.groupNumberTv.setText(String.format(getString(R.string.join_group_number_txt), teaminfo.getMemberCount())); + if (teaminfo.isMyTeam()) { + binding.joinTv.setText(getString(R.string.joined_group_txt)); + binding.joinTv.setBackgroundTintList(ColorStateList.valueOf(getColor(R.color.color_themeblue_alpha70))); + binding.joinTv.setEnabled(false); + } else { + binding.joinTv.setText(getString(R.string.join_group_txt)); + binding.joinTv.setBackgroundTintList(null); + binding.joinTv.setEnabled(true); + } + binding.joinTv.setOnClickListener(view -> { + + NIMClient.getService(TeamService.class).applyJoinTeam(teamId, null).setCallback(new RequestCallback() { + @Override + public void onSuccess(Team team1) { + onResult(true, 0); + } + + @Override + public void onFailed(int code) { + + onResult(true, code); + } + + @Override + public void onException(Throwable exception) { + // error + onResult(true, -1); + + } + }); + }); + } + + + public void onResult(boolean isSuccess, int code) { + if (isSuccess) { + ToastX.showShortToast(R.string.joined_group_success_txt); + + } else { + if (code == ResponseCode.RES_TEAM_APPLY_SUCCESS) { + ToastX.showShortToast(R.string.dendaiqueren_txt); + } else if (code == ResponseCode.RES_TEAM_LIMIT) { + ToastX.showShortToast(R.string.team_num_limit); + } else { + ToastX.showShortToast(R.string.joined_group_fail_txt); + } + } + finish(); + } + + + @Override + public int initNavigationBarColor() { + return getColor(R.color.color_fdf6f6); + } + + @Override + public int initStatusBarColor() { + return getColor(R.color.color_fffbfb); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/imkit/team/TeamMembersListActivity.java b/app/src/main/java/com/dskj/rbchat/imkit/team/TeamMembersListActivity.java new file mode 100644 index 0000000..207875f --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/imkit/team/TeamMembersListActivity.java @@ -0,0 +1,641 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.imkit.team; + +import static com.dskj.rbchat.utils.GsonUtils.gson; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.KEY_TEAM_ID; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.KEY_TEAM_NAME; +import static com.netease.yunxin.kit.teamkit.ui.utils.NetworkUtilsWrapper.handleNetworkBrokenResult; + +import android.content.Context; +import android.content.Intent; +import android.graphics.Typeface; +import android.os.Bundle; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.util.TypedValue; +import android.view.View; +import android.view.WindowManager; +import android.view.inputmethod.EditorInfo; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.lifecycle.ViewModelProvider; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.dskj.rbchat.R; +import com.dskj.rbchat.base.LllChatBaseActivity; +import com.dskj.rbchat.databinding.ActivityTeamMembersBinding; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.imkit.team.adapter.TeamMembersAdapter; +import com.dskj.rbchat.model.AdBean; +import com.dskj.rbchat.model.UsersExistBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.utils.ShareDateUtils; +import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.google.gson.reflect.TypeToken; +import com.netease.nimlib.sdk.msg.model.IMMessage; +import com.netease.nimlib.sdk.team.constant.TeamMemberType; +import com.netease.nimlib.sdk.team.constant.TeamMessageNotifyTypeEnum; +import com.netease.nimlib.sdk.team.model.Team; +import com.netease.nimlib.sdk.team.model.TeamMember; +import com.netease.yunxin.kit.alog.ALog; +import com.netease.yunxin.kit.chatkit.model.ConversationInfo; +import com.netease.yunxin.kit.chatkit.model.TeamWithCurrentMember; +import com.netease.yunxin.kit.chatkit.model.UserInfoWithTeam; +import com.netease.yunxin.kit.chatkit.repo.ContactRepo; +import com.netease.yunxin.kit.chatkit.ui.page.LocationPageActivity; +import com.netease.yunxin.kit.chatkit.ui.page.viewmodel.ChatBaseViewModel; +import com.netease.yunxin.kit.chatkit.ui.page.viewmodel.ChatTeamViewModel; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.common.ui.viewmodel.LoadStatus; +import com.netease.yunxin.kit.common.utils.NetworkUtils; +import com.netease.yunxin.kit.contactkit.ui.contact.ContactViewModel; +import com.netease.yunxin.kit.contactkit.ui.fun.selector.FunContactMembersAdapter; +import com.netease.yunxin.kit.contactkit.ui.fun.selector.FunContactSelectorDialog; +import com.netease.yunxin.kit.contactkit.ui.model.ContactFriendBean; +import com.netease.yunxin.kit.contactkit.ui.search.SearchViewModel; +import com.netease.yunxin.kit.conversationkit.ui.model.ConversationBean; +import com.netease.yunxin.kit.conversationkit.ui.page.viewmodel.ConversationViewModel; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.model.FriendInfo; +import com.netease.yunxin.kit.corekit.im.model.UserInfo; +import com.netease.yunxin.kit.corekit.im.utils.RouterConstant; +import com.netease.yunxin.kit.corekit.model.ResultInfo; +import com.netease.yunxin.kit.corekit.route.XKitRouter; +import com.netease.yunxin.kit.teamkit.ui.normal.adapter.TeamMemberListAdapter; +import com.netease.yunxin.kit.teamkit.ui.utils.viewmodel.TeamSettingViewModel; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +/** + * 群聊成员页面 (编辑群员,群主转让那) 这快逻辑有点乱 + */ +public class TeamMembersListActivity extends BaseTeamQrSettingActivity { + + public static final String ISMANAGER = "isManager"; + public static final String LISTUSERINFOS = "listUserInfos"; + public static final String TYPE = "type"; + public static final String QUITE = "quite"; + public static final String TEAMQR = "teamQr"; + public int type; //0查看群成员,1 群主转让 + public int quite; //0 转让退群 1 只转让 + public boolean isRefresh = false; //是否刷新设置页 + public boolean teamQr = true; + public List listSearch = new ArrayList<>(); + + public static void launch(Context context, boolean isManager, boolean isShowTeamQR, String teamId, List userInfos, @NonNull ActivityResultLauncher launcher) { + Intent intent = new Intent(context, TeamMembersListActivity.class); + intent.putExtra(ISMANAGER, isManager); + intent.putExtra(TYPE, 0); + intent.putExtra(TEAMQR, isShowTeamQR); + intent.putExtra(KEY_TEAM_ID, teamId); + intent.putExtra(LISTUSERINFOS, (Serializable) userInfos); + launcher.launch(intent); + } + + public static void launch(Context context, int isQuit, String teamId, List userInfos, @NonNull ActivityResultLauncher launcher) { + Intent intent = new Intent(context, TeamMembersListActivity.class); + intent.putExtra(KEY_TEAM_ID, teamId); + intent.putExtra(TYPE, 1); + intent.putExtra(QUITE, isQuit); + intent.putExtra(LISTUSERINFOS, (Serializable) userInfos); + launcher.launch(intent); + } + + + ActivityTeamMembersBinding binding; + private boolean isManager; + + private TeamMembersAdapter membersAdapter; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + getWindow().setNavigationBarColor(getResources().getColor(com.netease.yunxin.kit.chatkit.ui.R.color.color_white)); + isManager = getIntent().getBooleanExtra(ISMANAGER, false); + type = getIntent().getIntExtra(TYPE, 0); + quite = getIntent().getIntExtra(QUITE, 0); + List list = (List) getIntent().getSerializableExtra(LISTUSERINFOS); + teamQr = getIntent().getBooleanExtra(TEAMQR, true); + + if (list != null && list.size() > 0) { + listmemebers.clear(); + listmemebers.addAll(list); + getTeamActiveTime(); + } else { + if (NetworkUtils.isConnected()) { + showLoading(); + //重新获取群成员 + teammodel.getUserInfoData().observe(this, listResultInfo -> { + dismissLoading(); + if (listResultInfo.getSuccess()) { + getTeamActiveTime(); + List listmember = listResultInfo.getValue(); + listmemebers.clear(); + listmember = sortListMembers(listmember); + for (UserInfoWithTeam userinfo : listmember) { + listmemebers.add(userinfo.getUserInfo()); + } + setData(); + + } + }); + teammodel.requestTeamMembers(teamId); + } + + } + initView(); + initData(); + } + + + @Override + public View getContentView() { + binding = ActivityTeamMembersBinding.inflate(getLayoutInflater()); + return binding.getRoot(); + } + + + Map memberMap; + + public void getTeamActiveTime() { + if (isManager && type == 0) { + Api.getInstance().teamMemberActiveTime(teamId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>>() { + @Override + public void onSuccess(Result> feedbackResp) { + LogUtils.d("dddd" + feedbackResp.data); + memberMap = feedbackResp.data; + listmemebers.remove(0); + listmemebers = sortListByActivieTime(listmemebers); + listmemebers.add(0, IMKitClient.getUserInfo()); + membersAdapter.setData(listmemebers, true, memberMap); + } + + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast(msg); + + } + }); + } + + +// String data = "{\n" + +// "\t\t\"11\": 1710661720000,\n" + +// "\t\t\"16\": 1710726520577\n" + +// "\t}"; +// memberMap = GsonUtils.getListFromJSON(data, new TypeToken>() { +// }.getType()); + + } + + //排序成员 + public List sortListByActivieTime(List teamMemberlist) { + List resultlist = new ArrayList<>(); + Set keys = memberMap.keySet(); + if (!keys.isEmpty()) { + for (String id : keys) { + for (UserInfo userInfo : teamMemberlist) { + if (userInfo.getAccount().equals(id)) { + resultlist.add(userInfo); + } + } + } + } + return resultlist; + } + + + public void setData() { + if (type == 0) { + listmemebers.add(0, IMKitClient.getUserInfo()); + membersAdapter.setData(listmemebers, true, memberMap); + binding.tvteammembers.setText(getString(com.netease.yunxin.kit.contactkit.ui.R.string.fun_creategroup_members, listmemebers.size() - 1)); + } else { //不能编辑 转让 +// UserInfo info = IMKitClient.getUserInfo(); +// int i = listmemebers.indexOf(info); +// if (i > 0) { +// listmemebers.remove(i); +// } + for (int i = 0; i < listmemebers.size(); i++) { + if (listmemebers.get(i).getAccount().equals(IMKitClient.account())) { + listmemebers.remove(i); + } + } + + binding.tvteammembers.setText(getString(com.netease.yunxin.kit.contactkit.ui.R.string.fun_creategroup_members, listmemebers.size())); + membersAdapter.setEdit(false); + membersAdapter.setData(listmemebers, false, memberMap); + } + binding.rvMembers.setAdapter(membersAdapter); + } + + public void initView() { + initTitleView(); + + LinearLayoutManager layoutManager = + new LinearLayoutManager(this, RecyclerView.VERTICAL, false); + binding.rvMembers.setLayoutManager(layoutManager); + membersAdapter = new TeamMembersAdapter(this, type); + setData(); + membersAdapter.setItemClickListener(new TeamMembersAdapter.ItemClickListener() { + @Override + public void onItemClick(UserInfo item, int position) { + //查看成员详情 普通用户点击头像 + startUserInfoActivity(item.getAccount()); +// deletePosition = position; +// if (!item.getAccount().equals(IMKitClient.account()) && membersAdapter.isEdit()) { +// if (type == 0) { +// List accounts = new ArrayList<>(); +// accounts.add(0, item.getAccount()); +// showConfirmDialog(true, getString(R.string.teammember_delete), accounts); +// } +// } +// if (!membersAdapter.isEdit() && type == 0) { +// startUserInfoActivity(item.getAccount()); +// } + + + } + + @Override + public void onAddClick() { + //邀请好友 + showAddFriendsDialog(teamQr); + } + }); + binding.editSelectorFriends.setOnEditorActionListener((textView, actionId, keyEvent) -> + { + if (actionId == EditorInfo.IME_ACTION_SEARCH) { + String search = textView.getEditableText().toString(); + //搜索好友 + List listSearchResult = searchName(search); + listSearch.clear(); + listSearch.addAll(listSearchResult); + if (listSearch.size() > 0) { + membersAdapter.refreshData(listSearch, false); + binding.tvteammembers.setText(getString(com.netease.yunxin.kit.contactkit.ui.R.string.fun_creategroup_members, listSearch.size())); + + } + } + return false; + }); + binding.editSelectorFriends.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void afterTextChanged(Editable editable) { + if (TextUtils.isEmpty(editable.toString())) { + binding.icCleanEdit.setVisibility(View.GONE); +// membersAdapter.setEdit(false); +// binding.title.setActionText(R.string.teammember_edit); +// listmemebers.add(0, IMKitClient.getUserInfo()); + membersAdapter.refreshData(listmemebers, type == 0); + binding.tvteammembers.setText(getString(com.netease.yunxin.kit.contactkit.ui.R.string.fun_creategroup_members, listmemebers.size() - 1)); + } else { + binding.icCleanEdit.setVisibility(View.VISIBLE); + } + } + }); + binding.icCleanEdit.setOnClickListener(view -> binding.editSelectorFriends.setText("")); + } + + public void startUserInfoActivity(String userid) { + XKitRouter.withKey(RouterConstant.PATH_USER_INFO_PAGE) + .withContext(TeamMembersListActivity.this) + .withParam(RouterConstant.KEY_ACCOUNT_ID_KEY, IMKitClient.account()) + .withParam("userId", userid) + .navigate(); + } + + public void initData() { + teammodel.getRemoveMembersData().observe( + this, + voidResultInfo -> { + if (voidResultInfo.getSuccess()) { + //移除群成员成功 变量太多 + List userInfos = new ArrayList<>(); + List list = membersAdapter.getSelectedInt(); + for (int i = 0; i < list.size(); i++) { + userInfos.add(membersAdapter.getData().get(list.get(i))); + } + for (int i = 0; i < userInfos.size(); i++) { + UserInfo userInfo = userInfos.get(i); +// int searchIndex = listSearch.indexOf(userInfo); +// if (searchIndex >= 0) { //通过搜索列表删除的 +// listSearch.remove(searchIndex); +// } + int indexSelector = selectorlist.indexOf(userInfo.getAccount()); + int indexMembers = listmemebers.indexOf(userInfo); + if (indexSelector >= 0) { + selectorlist.remove(indexSelector); //成员有变化 ,邀请 选中的人数就有变化(都是好友) + } + if (indexMembers >= 0) { + listmemebers.remove(indexMembers); + } + + } +// LogUtils.d("删除结束 " + listmemebers.size()); + binding.tvteammembers.setText(getString(com.netease.yunxin.kit.contactkit.ui.R.string.fun_creategroup_members, listmemebers.size() - 1)); + isRefresh = true; + setTitleEdit(listmemebers, true, R.string.teammember_edit); + binding.editSelectorFriends.setText(""); + + + //刪除的 +// if (deletePosition >= 0) { +// if (listSearch.size() == deletePosition || listmemebers.size() == deletePosition) { +// deletePosition = deletePosition - 1; +// } +//// if (listSearch.size() == 0 && listmemebers.size() == deletePosition) { +//// deletePosition = deletePosition - 1; +//// } +// UserInfo userInfo; +// if (listSearch.size() > 0) { +// userInfo = listSearch.get(deletePosition); +// listSearch.remove(deletePosition); +// membersAdapter.removeData(deletePosition); +// deletePosition = listmemebers.indexOf(userInfo); +// } else { +// membersAdapter.removeData(deletePosition); +// } +// binding.tvteammembers.setText(getString(com.netease.yunxin.kit.contactkit.ui.R.string.fun_creategroup_members, membersAdapter.getData().size())); +// selectorlist.remove(listmemebers.get(deletePosition).getAccount()); +// listmemebers.remove(deletePosition); +// isRefresh = true; +// } + } + + }); + teammodel.getUserInfoData().observe(this, listResultInfo -> { + if (listResultInfo.getSuccess()) { + memberMap = null; + getTeamActiveTime(); + List list = listResultInfo.getValue(); + //邀请成功 获取用户信息 + selectorlist.clear(); + listmemebers.clear(); + listmemebers.add(IMKitClient.getUserInfo()); + for (UserInfoWithTeam userinfo : list) { + selectorlist.add(userinfo.getUserInfo().getAccount()); + listmemebers.add(userinfo.getUserInfo()); + } + membersAdapter.setData(listmemebers, true, memberMap); + isRefresh = true; + binding.tvteammembers.setText(getString(com.netease.yunxin.kit.contactkit.ui.R.string.fun_creategroup_members, listmemebers.size() - 1)); + } + }); + + if (listmemebers != null) { + for (UserInfo userInfo : listmemebers) { + selectorlist.add(userInfo.getAccount()); + } + } + + teammodel.getQuitTeamData().observe(this, voidResultInfo -> { + if (voidResultInfo.getSuccess()) { + //成功 + showTransferDialog(true, ""); + } else { + showTransferDialog(false, voidResultInfo.getMsg().getMessage()); + } + }); + } + + + private boolean isRemove = false; + + + private void initTitleView() { + if (type == 0) { //右上角编辑,删除 + binding.title.setTitle(R.string.teamsetting_members); + if (isManager) { + setTitleAction(R.string.teammember_edit, new View.OnClickListener() { + @Override + public void onClick(View view) { + if (membersAdapter.isEdit()) { + if (isRemove) { + //完成 + listmemebers.add(0, IMKitClient.getUserInfo()); // 添加按钮 + isRemove = false; + } + //删除成员 + List selectint = membersAdapter.getSelectedInt(); + if (selectint.size() > 0) { + deleteMutileMembers(selectint); + } else { + binding.editSelectorFriends.setText(""); + listSearch.clear(); + setTitleEdit(listmemebers, true, R.string.teammember_edit); + binding.tvteammembers.setText(getString(com.netease.yunxin.kit.contactkit.ui.R.string.fun_creategroup_members, listmemebers.size() - 1)); + } + } else { + //编辑 + if (listSearch.size() > 0) { + setTitleEdit(listSearch, false, R.string.setting_delete); + binding.tvteammembers.setText(getString(com.netease.yunxin.kit.contactkit.ui.R.string.fun_creategroup_members, listSearch.size())); + } else { + //进行删除操作 + isRemove = true; + listmemebers.remove(0); //去除 添加按钮 + setTitleEdit(listmemebers, false, R.string.setting_delete); + binding.tvteammembers.setText(getString(com.netease.yunxin.kit.contactkit.ui.R.string.fun_creategroup_members, listmemebers.size())); + } + + } + + } + }); + } + } else { + binding.title.setTitle(com.netease.yunxin.kit.contactkit.ui.R.string.select); + setTitleAction(com.netease.yunxin.kit.contactkit.ui.R.string.selector_sure_without_num, new View.OnClickListener() { + @Override + public void onClick(View view) { + //确认转让 + int selectorPostion = membersAdapter.getSelectpostion(); + if (selectorPostion >= 0) { + UserInfo info = membersAdapter.getData().get(selectorPostion); + List accounts = new ArrayList<>(); + accounts.add(0, info.getAccount()); + showConfirmDialog(false, getString(R.string.teamsetting_transfer, getAlias(info)), accounts); + } + } + }); + } + binding.title.getBackImageView().setImageResource(com.netease.yunxin.kit.contactkit.ui.R.drawable.ic_dialog_close); + binding.title.getTitleTextView().setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); + binding.title.getTitleTextView().setTypeface(Typeface.defaultFromStyle(Typeface.BOLD)); + binding.title.setOnBackIconClickListener( + v -> { + if (isRefresh) { + setActivityResult(); + } else { + finish(); + } + + }); + + + } + + public void deleteMutileMembers(List list) { + List accounts = new ArrayList<>(); + for (int i = 0; i < list.size(); i++) { + accounts.add(membersAdapter.getData().get(list.get(i)).getAccount()); + } + showConfirmDialog(true, getString(R.string.teammember_delete), accounts); +// } +// + } + + public void setTitleAction(int resourcestring, View.OnClickListener onClickListener) { + binding.title.setActionText(resourcestring); + binding.title.setActionTextColor(getResources().getColor(R.color.color_themeblue)); + binding.title.setActionListener(onClickListener); + } + + public void setTitleEdit(List listmember, boolean isEdit, int actionText) { + binding.title.setActionText(actionText); + membersAdapter.setEdit(!isEdit); + membersAdapter.getSelectedInt().clear(); + membersAdapter.setData(listmember, isEdit, memberMap); + } + + public void showConfirmDialog(boolean isDelete, String title, List account) { + ActionConfirmDialog actionConfirmDialog = new ActionConfirmDialog(this, title, true); + actionConfirmDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + if (isDelete) { + teammodel.removeMember(teamId, account); + } else { + boolean isfriend = false; + String accounttransfer = account.get(0); + for (ContactFriendBean friendbean : accountList) { + UserInfo info = friendbean.data.getUserInfo(); + if (info != null && accounttransfer.equals(info.getAccount())) { + isfriend = true; + break; + } + } + if (isfriend) { + //群主转让 + teammodel.transferTeam(teamId, account.get(0), quite == 0); + } else { + showTransferDialog(false, ""); + } + + } + + } + + @Override + public void toCancel() { + } + }); + actionConfirmDialog.show(); + } + + public void showTransferDialog(boolean isSuccess, String value) { + + ActionConfirmDialog actionConfirmDialog = new ActionConfirmDialog(this, isSuccess ? getString(R.string.transfer_success) + : (TextUtils.isEmpty(value) ? getString(R.string.transfer_fail) : getString(R.string.transfer_failmsg, value)), false); + + actionConfirmDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + if (isSuccess) { + //回调结果 + quite = 2; + setActivityResult(); + } else { + actionConfirmDialog.dismiss(); + } + + } + + @Override + public void toCancel() { + } + }); + actionConfirmDialog.show(); + + } + + public void setActivityResult() { + Intent intent = new Intent(); + intent.putExtra(TYPE, type); + intent.putExtra(QUITE, quite); + setResult(RESULT_OK, intent); + finish(); + } + + public List searchName(String key) { + List listSearch = new ArrayList<>(); + List result = new ArrayList<>(); + result.addAll(listmemebers); + if (result.size() >= 2 && (result.get(0).getAccount().equals(result.get(1).getAccount()))) { //因为邀请好友icon + result.remove(result.get(0)); + } + for (UserInfo userInfo : result) { + + String name = getAlias(userInfo); + if (name.contains(key)) { + listSearch.add(userInfo); + } + } + return listSearch; + } + + + public String getAlias(UserInfo userInfo) { + String name = userInfo.getName(); + if (ContactRepo.isFriend(userInfo.getAccount())) { + String alias = ContactRepo.getFriend(userInfo.getAccount()).getAlias(); + return TextUtils.isEmpty(alias) ? name : alias; + } + return name; + } + + +} diff --git a/app/src/main/java/com/dskj/rbchat/imkit/team/TeamOtherSettingActivity.java b/app/src/main/java/com/dskj/rbchat/imkit/team/TeamOtherSettingActivity.java new file mode 100644 index 0000000..35516af --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/imkit/team/TeamOtherSettingActivity.java @@ -0,0 +1,294 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.imkit.team; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.graphics.Typeface; +import android.os.Build; +import android.os.Bundle; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.util.TypedValue; +import android.view.View; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.bumptech.glide.Glide; +import com.dskj.rbchat.R; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.imkit.base.BaseSettingOtherActivity; +import com.dskj.rbchat.model.TeamUpdateEvent; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.msg.MsgService; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.nimlib.sdk.team.constant.TeamBeInviteModeEnum; +import com.netease.nimlib.sdk.team.constant.TeamFieldEnum; +import com.netease.nimlib.sdk.team.model.Team; +import com.netease.yunxin.kit.chatkit.model.UserInfoWithTeam; +import com.netease.yunxin.kit.corekit.event.EventCenter; +import com.netease.yunxin.kit.corekit.im.model.UserInfo; +import com.netease.yunxin.kit.teamkit.ui.utils.viewmodel.TeamSettingViewModel; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +/** + * team setting activity + */ +public class TeamOtherSettingActivity extends BaseSettingOtherActivity { + + + private static final String TEAMINFO = "team"; + private Team team; + private boolean isRefresh = false; + public final TeamSettingViewModel teammodel = new TeamSettingViewModel(); + private ActivityResultLauncher launcher; + public List listmemebers = new ArrayList<>(); + private boolean updateIcon = false; + + public static void launch(Context context, Team teaminfo, @NonNull ActivityResultLauncher launcher) { + Intent intent = new Intent(context, TeamOtherSettingActivity.class); + intent.putExtra(TEAMINFO, teaminfo); + launcher.launch(intent); + } + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + team = getIntent().getSerializableExtra(TEAMINFO, Team.class); + } else { + team = (Team) getIntent().getSerializableExtra(TEAMINFO); + } + initView(); + initData(); + launcher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { + if (result.getResultCode() == Activity.RESULT_OK) { + int type = result.getData().getIntExtra("type", 0); + if (type == 1) { + //转让群 + Intent intent = new Intent(); + intent.putExtra("type", 2); + setResult(RESULT_OK, intent); + finish(); + } + if (type == 2) { + //修改群背景 + String url = result.getData().getStringExtra("bgUrl"); + if (!TextUtils.isEmpty(url)) { + Glide.with(TeamOtherSettingActivity.this) + .load(url) + .into(binding.forbgIv); + } + } + //修改群头像 + if (type == 3) { + showLoading(); + updateIcon = true; + //修改群设置 + teammodel.requestTeamData(team.getId()); + } + + + } + }); + } + + + public void initView() { + initTitleView(); + if (team != null) { + binding.tvTeamName.setText(team.getName()); + binding.icCleanEdit.setVisibility(View.VISIBLE); + if (!TextUtils.isEmpty(team.getIcon())) { + binding.cavAvatar.setData(team.getIcon(), ""); + } else { + binding.cavAvatar.setData(com.netease.yunxin.kit.contactkit.ui.R.mipmap.ic_group_defaulthead, "head", 1); + } + } + binding.tvTeamName.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void afterTextChanged(Editable editable) { + if (TextUtils.isEmpty(binding.tvTeamName.getText().toString())) { + binding.icCleanEdit.setVisibility(View.GONE); + } else { + binding.icCleanEdit.setVisibility(View.VISIBLE); + } + } + }); + binding.icCleanEdit.setOnClickListener(view -> binding.tvTeamName.setText("")); + binding.flteamtransfer.setOnClickListener(view -> { + //跳转到转让 + TeamMembersListActivity.launch(TeamOtherSettingActivity.this, 1, team.getId(), listmemebers, launcher); + }); + binding.flteamdiss.setOnClickListener(view -> { + ActionConfirmDialog actionConfirmDialog = new ActionConfirmDialog(this, getString(R.string.teamsetting_other_teamdisstips), + getString(R.string.cancel_txt), getString(R.string.teamsetting_other_teamdiss)); + actionConfirmDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + teammodel.dismissTeam(team.getId()); + } + + @Override + public void toCancel() { + } + }); + actionConfirmDialog.show(); + }); + + binding.flteamhead.setOnClickListener(view -> { + TeamHeadBgSettingActivity.launch( + TeamOtherSettingActivity.this, + team, launcher + ); + }); + String extension = team.getExtension(); + if (!TextUtils.isEmpty(extension)) { + binding.swichTeamqr.setChecked(team.getExtension().equals("1")); + } + int value = team.getVerifyType().getValue(); + binding.swichAddtype.setChecked(team.getTeamBeInviteMode().getValue() == 1); + Map map = new HashMap<>(); + binding.swichTeamqr.setOnClickListener(view -> { + //onclick check 变更 + map.put(TeamFieldEnum.Extension, binding.swichTeamqr.isChecked() ? "1" : "0"); + teammodel.UpdateTeamFilesExtension(team.getId(), map); + }); + + binding.swichAddtype.setOnClickListener(view -> { + map.put(TeamFieldEnum.BeInviteMode, binding.swichAddtype.isChecked() ? TeamBeInviteModeEnum.NoAuth : TeamBeInviteModeEnum.NeedAuth); + teammodel.UpdateTeamFilesExtension(team.getId(), map); + }); + + } + + private void initTitleView() { + binding.settingTitleBar.getTitleTextView().setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20); + binding.settingTitleBar.getTitleTextView().setTypeface(Typeface.defaultFromStyle(Typeface.BOLD)); + binding.settingTitleBar.setOnBackIconClickListener(view -> onBackPressed()); + } + + public void setActivityResult(int type) { + Intent intent = new Intent(); + intent.putExtra("type", type); + setResult(RESULT_OK, intent); + finish(); + } + + public void initData() { + teammodel.getDismissTeamData().observe(this, voidResultInfo -> { + if (voidResultInfo.getSuccess()) { + setActivityResult(1); + } + }); + + teammodel.getNameData().observe(this, stringResultInfo -> { + if (stringResultInfo.getSuccess()) { + + setActivityResult(2); + } + }); + + teammodel.getTeamWithMemberData().observe(this, teamResultInfo -> { + dismissLoading(); + if (teamResultInfo.getValue() == null || !teamResultInfo.getSuccess()) { + finish(); + return; + } + team = teamResultInfo.getValue().getTeam(); + binding.cavAvatar.setData(team.getIcon(), team.getName()); + if (updateIcon) { + TeamUpdateEvent teamUpdateEvent = new TeamUpdateEvent(); + teamUpdateEvent.setTeam(team); + EventCenter.notifyEvent(teamUpdateEvent); + } + updateIcon = false; + }); + + teammodel.getUserInfoData().observe(this, listResultInfo -> { + if (listResultInfo.getSuccess()) { + List list = listResultInfo.getValue(); + + listmemebers.clear(); + for (UserInfoWithTeam userinfo : list) { + listmemebers.add(userinfo.getUserInfo()); + } + } + }); + teammodel.getUpdateExtensionData().observe(this, voidResultInfo -> { + if (voidResultInfo.getSuccess()) { + isRefresh = true; + Map value = voidResultInfo.getValue(); + if (value.containsKey(TeamFieldEnum.Extension)) { + binding.swichTeamqr.setChecked(binding.swichTeamqr.isChecked()); + } + if (value.containsKey(TeamFieldEnum.VerifyType)) { + binding.swichAddtype.setChecked(binding.swichAddtype.isChecked()); + } + + } + }); + teammodel.requestTeamMembers(team.getId()); + + } + + @Override + public void onBackPressed() { + onBack(); +// super.onBackPressed(); + } + + public void onBack() { + String teamName = binding.tvTeamName.getText().toString(); +// if (TextUtils.isEmpty(teamName)) { +// ToastX.showShortToast(getString(R.string.toast_teamname)); +// return; +// } + if (!teamName.equals(team.getName()) && !TextUtils.isEmpty(teamName)) { + teammodel.updateName(team.getId(), teamName); + return; + } + if (isRefresh) { + setActivityResult(2); + } else { + finish(); + } + } + + @Override + public void onCleanHistory() { + super.onCleanHistory(); + NIMClient.getService(MsgService.class).clearServerHistory(team.getId(), SessionTypeEnum.Team, false); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + + } + + +} diff --git a/app/src/main/java/com/dskj/rbchat/imkit/team/TeamSettingActivity.java b/app/src/main/java/com/dskj/rbchat/imkit/team/TeamSettingActivity.java new file mode 100644 index 0000000..3e28b4d --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/imkit/team/TeamSettingActivity.java @@ -0,0 +1,489 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.imkit.team; + +import static com.netease.yunxin.kit.teamkit.ui.utils.NetworkUtilsWrapper.handleNetworkBrokenResult; + +import android.app.Activity; +import android.content.Intent; +import android.os.Build; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.GridLayoutManager; + +import com.bumptech.glide.Glide; +import com.dskj.rbchat.R; +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.contact.ReportActivity; +import com.dskj.rbchat.databinding.ActivityBaseChatsettingBinding; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.model.TeamUpdateEvent; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.widget.CircleImageView; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.RequestCallback; +import com.netease.nimlib.sdk.msg.MsgService; +import com.netease.nimlib.sdk.msg.attachment.FileAttachment; +import com.netease.nimlib.sdk.msg.constant.MsgTypeEnum; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.nimlib.sdk.msg.model.IMMessage; +import com.netease.nimlib.sdk.msg.model.MsgSearchOption; +import com.netease.nimlib.sdk.team.constant.TeamMemberType; +import com.netease.nimlib.sdk.team.constant.TeamMessageNotifyTypeEnum; +import com.netease.nimlib.sdk.team.model.Team; +import com.netease.nimlib.sdk.team.model.TeamMember; +import com.netease.yunxin.kit.chatkit.model.IMMessageInfo; +import com.netease.yunxin.kit.chatkit.model.UserInfoWithTeam; +import com.netease.yunxin.kit.chatkit.ui.ChatKitUIConstant; +import com.netease.yunxin.kit.chatkit.ui.common.ChatUtils; +import com.netease.yunxin.kit.chatkit.ui.model.CleanHistoryEvent; +import com.netease.yunxin.kit.corekit.event.EventCenter; +import com.netease.yunxin.kit.corekit.im.model.UserInfo; +import com.netease.yunxin.kit.corekit.im.utils.RouterConstant; +import com.netease.yunxin.kit.corekit.route.XKitRouter; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +/** + * team setting activity + */ +public class TeamSettingActivity extends BaseTeamQrSettingActivity { + +// protected Observer>> liveUserInfoObserver; + + protected Team teamInfo; + protected TeamMember teamMember; + private boolean isOpenNotify = true; + private ActivityResultLauncher launcher; + private boolean isTeamShow; + + private boolean isUpdateTeam = false; + + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + teammodel.requestTeamData(teamId); + teammodel.requestTeamMembers(teamId); + initView(); + initData(); + launcher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { + if (result.getResultCode() == Activity.RESULT_OK) { + int type = result.getData().getIntExtra("type", 0); + if (type == 0) { + //删除成功 或者 邀请成功 + teammodel.requestTeamMembers(teamId); + } else if (type == 1) { + int quite = result.getData().getIntExtra("quite", 0); + if (quite == 1) { + //修改群设置 + updateTeamData(); + } else if (quite == 2) { + // 转让 + updateTeamData(); + teammodel.requestTeamMembers(teamId); + } else { + finish(); + } + } else if (type == 2) { + //修改群设置 + isUpdateTeam = true; + teammodel.requestTeamData(teamId); + } + } + }); + } + + public void updateTeamData() { + isUpdateTeam = true; + teammodel.requestTeamData(teamId); + } + + @Override + public View getContentView() { + binding = + ActivityBaseChatsettingBinding.inflate(getLayoutInflater()); + return binding.getRoot(); + } + + public void initView() { + binding.ivBack.setOnClickListener(view -> onBackPressed()); + binding.tvnotify.setOnClickListener(view -> { + teammodel.muteTeam(teamId, isOpenNotify); + setNotifyUI(!isOpenNotify); + } + ); + binding.tvmember.setOnClickListener(view -> { + TeamMembersListActivity.launch(this, teamMember.getType() == TeamMemberType.Owner, isTeamShow, teamId, listmemebers, launcher); + }); + binding.tvinvited.setOnClickListener(view -> showAddFriendsDialog(isTeamShow)); + binding.tvexit.setOnClickListener(view -> setQuitTeam()); + binding.llteamsettingPhoto.setVisibility(View.VISIBLE); +// TextView tv = new TextView(this); +// tv.setText(getString(R.string.nophone_video_txt)); +// tv.setTextColor(getResources().getColor(R.color.color_d4dbd6)); +// binding.llteamsettingPhoto.addView(tv); + binding.ctlayoutPhoto.setOnClickListener(view -> { + startResourcePhoto(); + }); + binding.flteamurl.setOnClickListener(view -> { + startResourceUrl(); + }); + binding.flteaminfo.setOnClickListener(view -> { + startResourceInfo(); + }); + initAdapterChatHist(); + getChatList(); + } + + private void getChatList() { + List sessionTypeEnums = new ArrayList<>(); + sessionTypeEnums.add(MsgTypeEnum.image); + sessionTypeEnums.add(MsgTypeEnum.video); + MsgSearchOption msgSearchOption = new MsgSearchOption(); + msgSearchOption.setMessageTypes(sessionTypeEnums); + msgSearchOption.setLimit(4); + NIMClient.getService(MsgService.class).searchMessage(SessionTypeEnum.Team, teamId, msgSearchOption).setCallback(new RequestCallback<>() { + @Override + public void onSuccess(List result) { + + LogUtils.i("数据是啥:" + GsonUtils.beanToJSONString(result)); + if (result != null && result.size() > 0) { + // 在子线程中执行耗时操作 + resultList = result; + imMessageInfos = new ArrayList<>(); + for (IMMessage imMessage : resultList) { + if (imMessage.getMsgType() == MsgTypeEnum.image) { + imMessageInfos.add(new IMMessageInfo(imMessage)); + } + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + binding.llteamsettingPhoto.setBackgroundColor(getColor(R.color.transparent)); + } + binding.recyclerssss.setVisibility(View.VISIBLE); + binding.noDateTv.setVisibility(View.GONE); + commonAdapterReadContents.setDates(resultList); + + + } else { + binding.recyclerssss.setVisibility(View.GONE); + binding.noDateTv.setVisibility(View.VISIBLE); + } + } + + @Override + public void onFailed(int code) { + binding.recyclerssss.setVisibility(View.GONE); + binding.noDateTv.setVisibility(View.VISIBLE); + + } + + @Override + public void onException(Throwable exception) { + binding.recyclerssss.setVisibility(View.GONE); + binding.noDateTv.setVisibility(View.VISIBLE); + + } + }); + } + + + private void initAdapterChatHist() { + binding.recyclerssss.setLayoutManager(new GridLayoutManager(TeamSettingActivity.this, 4)); + commonAdapterReadContents = new CommonAdapter<>(TeamSettingActivity.this, R.layout.chat_his_child_item1, resultList) { + @Override + public void convert(ViewHolder holder, IMMessage s, int index) { + CircleImageView circleImageView = holder.getView(R.id.item_civ); + FileAttachment attachment = (FileAttachment) s.getAttachment(); + if (attachment == null) { + return; + } + if (s.getMsgType() == MsgTypeEnum.image) { + holder.getView(R.id.video_tag_iv).setVisibility(View.GONE); + } else { + holder.getView(R.id.video_tag_iv).setVisibility(View.VISIBLE); + } + String path = attachment.getPath(); + String thumbPath = attachment.getThumbPath(); + if (!TextUtils.isEmpty(thumbPath)) { + Glide.with(TeamSettingActivity.this) + .load(thumbPath) + .into(circleImageView); + } else if (!TextUtils.isEmpty(path)) { + Glide.with(TeamSettingActivity.this) + .load(path) + .into(circleImageView); + } else { + Glide.with(TeamSettingActivity.this) + .load("") + .error(R.color.color_f4f4f4) + .into(circleImageView); + } + holder.getView(R.id.big_ly).setOnClickListener(v -> { +// IMMessageInfo info = new IMMessageInfo(s); +// if (s.getMsgType() == MsgTypeEnum.image) { +// ChatUtils.watchImage(TeamSettingActivity.this, info, imMessageInfos); +// } else { +// ChatUtils.watchVideo(TeamSettingActivity.this, info); +// } + startResourcePhoto(); + + }); + } + }; + binding.recyclerssss.setAdapter(commonAdapterReadContents); + } + + + //获取好友列表,最近联系,搜索好友 群数据 + public void initData() { + teammodel.getUserInfoData().observe(this, listResultInfo -> { + if (listResultInfo.getSuccess()) { + List list = listResultInfo.getValue(); + selectorlist.clear(); + listmemebers.clear(); + list = sortListMembers(list); + for (UserInfoWithTeam userinfo : list) { + selectorlist.add(userinfo.getUserInfo().getAccount()); + listmemebers.add(userinfo.getUserInfo()); + } + teamNumber = listmemebers.size(); + binding.tvTitle.setText(String.format("%s(%d)", teamName, teamNumber)); + } + }); + teammodel + .getTeamWithMemberData() + .observe( + this, + teamResultInfo -> { + dismissLoading(); + if (teamResultInfo.getValue() == null || !teamResultInfo.getSuccess()) { + finish(); + return; + } + teamInfo = teamResultInfo.getValue().getTeam(); + teamMember = teamResultInfo.getValue().getTeamMember(); + if (isUpdateTeam) { + isUpdateTeam = false; + TeamUpdateEvent teamUpdateEvent = new TeamUpdateEvent(); + teamUpdateEvent.setTeam(teamInfo); + EventCenter.notifyEvent(teamUpdateEvent); + } + refreshUI(teamInfo); + }); + teammodel.getMuteTeamData().observe(this, booleanResultInfo -> { + if (booleanResultInfo.getSuccess()) { + return; + } + handleNetworkBrokenResult(this, booleanResultInfo); + setNotifyUI(!isOpenNotify); + }); + + + + teammodel.getQuitTeamData().observe(this, voidResultInfo -> { + if (voidResultInfo.getSuccess()) { + finish(); + return; + } + handleNetworkBrokenResult(this, voidResultInfo); + }); + + teammodel.getDismissTeamData().observe( + this, + voidResultInfo -> { + if (voidResultInfo.getSuccess()) { + finish(); + return; + } + handleNetworkBrokenResult(this, voidResultInfo); + }); + + +// chatviewmodel.getUserInfoLiveData().observe(this, listFetchResult -> { +// if (listFetchResult != null) { +// //更新数据 +// teammodel.requestTeamData(teamId); +// } +// }); + + +// liveUserInfoObserver = listResultInfo -> { +// if (listResultInfo.getValue() != null) { +// Log.i("dfd", listResultInfo.getValue().size() + " "); +// listmemebers = listResultInfo.getValue(); +// } +// }; +// teammodel.getLiveUserInfoData().observeForever(liveUserInfoObserver); + + + } + + + + + protected void refreshUI(Team team) { + teamName = team.getName(); + teamNumber = team.getMemberCount(); + binding.tvTitle.setText(String.format("%s(%d)", teamName, teamNumber)); + setNotifyUI(teamInfo.getMessageNotifyType() == TeamMessageNotifyTypeEnum.All); + setSettingUI(teamMember.getType() == TeamMemberType.Owner); + if (!TextUtils.isEmpty(teamInfo.getExtension()) && teamInfo.getExtension().equals("0")) { + isTeamShow = false; + } else { + isTeamShow = true; + } + } + +// public void setExtension() { +// Map fieldMap = new HashMap<>(); +// fieldMap.put(TeamFieldEnum.Extension, "1"); +// NIMClient.getService(TeamService.class).updateTeamFields(teamId, fieldMap); +// } + + public void setNotifyUI(boolean isOpen) { + if (isOpen) { + binding.tvnotify.setText(getResources().getString(R.string.teamsetting_notifyclose)); + binding.tvnotify.setCompoundDrawablesWithIntrinsicBounds(null, getResources().getDrawable(R.mipmap.ic_setting_notifyopen), null, null); + } else { + binding.tvnotify.setText(getResources().getString(R.string.teamsetting_notifyopen)); + binding.tvnotify.setCompoundDrawablesWithIntrinsicBounds(null, getResources().getDrawable(R.mipmap.ic_setting_notifyclose), null, null); + } + isOpenNotify = isOpen; + + } + + public void setSettingUI(boolean isManager) { + binding.rlteamClearhistory.setOnClickListener(view -> { + ActionConfirmDialog actionConfirmDialog = new ActionConfirmDialog(this, getString(R.string.setting_cleanhistory), true); + actionConfirmDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + resultList.clear(); + commonAdapterReadContents.setDates(resultList); + binding.llteamsettingPhoto.setBackgroundResource(R.drawable.cornor_f4f4f4_6dp); + binding.recyclerssss.setVisibility(View.GONE); + binding.noDateTv.setVisibility(View.VISIBLE); + EventCenter.notifyEvent(new CleanHistoryEvent(true)); + NIMClient.getService(MsgService.class).clearServerHistory(teamId, SessionTypeEnum.Team, false); + + } + + @Override + public void toCancel() { + + + } + }); + actionConfirmDialog.show(); + + }); + binding.rlteamJubao.setOnClickListener(view -> { + //举报 + Intent intent = new Intent(TeamSettingActivity.this, ReportActivity.class); + intent.putExtra("type", 1); + intent.putExtra("toId", teamInfo.getId()); + startActivity(intent); + }); + binding.rlteamSet.setVisibility(View.GONE); + binding.rlteamAnnouncement.setVisibility(View.VISIBLE); + if (isManager) { + binding.rlteamSet.setVisibility(View.VISIBLE); + binding.rlteamSet.setOnClickListener(view -> { + TeamOtherSettingActivity.launch(this, teamInfo, launcher); + }); + } + binding.rlteamAnnouncement.setOnClickListener(view -> { + XKitRouter.withKey(ChatKitUIConstant.PATH_FUN_TEAM_ANNOUNCEMENT_PAGE) + .withContext(this) + .withParam(RouterConstant.KEY_TEAM_ID, teamInfo.getId()) + .navigate(); + }); + + } + + //退出按钮 + public void setQuitTeam() { + boolean isTeamManager = teamMember.getType() == TeamMemberType.Owner; + String content = isTeamManager ? (teamNumber == 1 ? getString(R.string.teamsetting_quitemanager_onlyone) : getString(R.string.teamsetting_quitemanager)) : getString(R.string.teamsetting_quite); +// String cancel = isTeamManager ? getString(R.string.queit_text) : getString(R.string.cancel_txt); + + String cancel = getString(R.string.cancel_txt); + String sure = isTeamManager ? (teamNumber == 1 ? getString(R.string.sure_txt) : getString(R.string.transfer_text)) : getString(R.string.sure_txt); + ActionConfirmDialog actionConfirmDialog = new ActionConfirmDialog(this, content, cancel, sure); + actionConfirmDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + if (isTeamManager) { + if (teamNumber == 1) { + teammodel.dismissTeam(teamId); + } else { + //跳转到转让 + TeamMembersListActivity.launch(TeamSettingActivity.this, 1, teamId, listmemebers, launcher); + } + + } else { + teammodel.quitTeam(teamId); //退群 + } + } + + @Override + public void toCancel() { +// if (isTeamManager) { +// //二次弹窗 +// ActionConfirmDialog actionConfirmDialog = new ActionConfirmDialog(TeamSettingActivity.this, getString(R.string.teamsetting_quiteconfirm), true); +// actionConfirmDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { +// @Override +// public void toSumbit() { +// teammodel.dismissTeam(teamId); +// } +// +// @Override +// public void toCancel() { +// } +// }); +// actionConfirmDialog.show(); +// +// } + + } + }); + actionConfirmDialog.show(); + } + + + public void startResourcePhoto() { + SettingResourceActivity.launch(this, 0, teamInfo, null); + } + + + public void startResourceInfo() { + SettingResourceActivity.launch(this, 2, teamInfo, null); + } + + + public void startResourceUrl() { + SettingResourceActivity.launch(this, 1, teamInfo, null); + + } + + @Override + protected void onDestroy() { + super.onDestroy(); + + } + + +} diff --git a/app/src/main/java/com/dskj/rbchat/imkit/team/adapter/TeamMembersAdapter.java b/app/src/main/java/com/dskj/rbchat/imkit/team/adapter/TeamMembersAdapter.java new file mode 100644 index 0000000..f823ccb --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/imkit/team/adapter/TeamMembersAdapter.java @@ -0,0 +1,286 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.imkit.team.adapter; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; +import androidx.viewbinding.ViewBinding; + +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.TeamMembersViewHolderBinding; +import com.netease.yunxin.kit.chatkit.repo.ContactRepo; +import com.netease.yunxin.kit.chatkit.ui.normal.factory.ChatVieHolderFactory; +import com.netease.yunxin.kit.common.ui.utils.AvatarColor; +import com.netease.yunxin.kit.contactkit.ui.model.BaseContactBean; +import com.netease.yunxin.kit.contactkit.ui.model.ContactTeamBean; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.model.UserInfo; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collections; +import java.util.Comparator; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +// 群组成员列表 +public class TeamMembersAdapter extends RecyclerView.Adapter { + + protected List members; + private Context mContext; + private boolean isShowInvited = true; + private boolean isEdit = false; + private int mType; // + private int selectpostion = -1; + private Map mapTime; + private List selectedInt = new ArrayList<>(); //多选position + + public TeamMembersAdapter(Context context, int type) { + members = new ArrayList<>(); + mContext = context; + mType = type; + } + + protected TeamMembersAdapter.ItemClickListener itemClickListener; + + public void setItemClickListener(TeamMembersAdapter.ItemClickListener itemClickListener) { + this.itemClickListener = itemClickListener; + } + + public void setData(List list, boolean isShow, Map mapActiveTime) { + members.clear(); + members.addAll(list); + selectedInt.clear(); + isShowInvited = isShow; + mapTime = mapActiveTime; + notifyDataSetChanged(); + } + + public void setEdit(boolean edit) { + isEdit = edit; + } + + public boolean isEdit() { + return isEdit; + } + + + public int getSelectpostion() { + return selectpostion; + } + + + public void refreshData(List list, boolean isInvited) { + isShowInvited = isInvited; + selectpostion = -1; + members.clear(); + members.addAll(list); + notifyDataSetChanged(); + } + + public List getSelectedInt() { + return selectedInt; + } + + // public void addData(List list) { +// int initsize = members.size(); +// members.addAll(list); +// notifyItemRangeChanged(initsize, list.size()); +// } + + public void removeData(int position) { + members.remove(position); + notifyItemRemoved(position); + } + + public List getData() { + return members; + } + + @NonNull + @Override + public TeamMembersViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return new TeamMembersViewHolder(TeamMembersViewHolderBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); + } + + @Override + public void onBindViewHolder(@NonNull TeamMembersViewHolder holder, int position) { + UserInfo userInfo = members.get(position); + if (position == 0 && isShowInvited) { + holder.binding.avatarView.setData(com.netease.yunxin.kit.contactkit.ui.R.drawable.ic_creategroup_add, ""); + holder.binding.icDelete.setVisibility(View.GONE); + holder.binding.tvName.setText(mContext.getResources().getString(R.string.invcode_friend_txt)); + holder.binding.tvNameActivetime.setVisibility(View.GONE); + } else { + + if (isEdit) { + if (selectedInt.indexOf(position) >= 0) { + holder.binding.icDelete.setBackgroundResource(R.mipmap.dialog_gou_t); + } else { + holder.binding.icDelete.setBackgroundResource(R.mipmap.dialog_gou_ff); + } + holder.binding.icDelete.setVisibility(userInfo.getAccount().equals(IMKitClient.account()) ? View.GONE : View.VISIBLE); + } else if (mType == 1) { + + if (selectpostion >= 0 && position == selectpostion) { + holder.binding.icDelete.setBackgroundResource(R.mipmap.dialog_gou_tt); + } else { + holder.binding.icDelete.setBackgroundResource(R.drawable.bg_d8d8d8_singleunselector); + } + holder.binding.icDelete.setVisibility(View.VISIBLE); + } else { + holder.binding.icDelete.setVisibility(View.GONE); + } + String avaterurl = userInfo.getAvatar(); + if (TextUtils.isEmpty(avaterurl)) { + holder.binding.avatarView.setData(R.mipmap.default_head_img, userInfo.getName(), 0); + } else { + holder.binding.avatarView.setData(avaterurl, userInfo.getName()); + } + String name = userInfo.getName(); + if (ContactRepo.isFriend(userInfo.getAccount())) { + String alias = ContactRepo.getFriend(userInfo.getAccount()).getAlias(); + if (!TextUtils.isEmpty(alias)) { + name = alias; + } + } + holder.binding.tvName.setText(name); + if (mapTime != null && mapTime.size() > 0) { + holder.binding.tvNameActivetime.setVisibility(View.VISIBLE); + holder.binding.tvNameActivetime.setTextColor(Color.parseColor("#FE6881")); + holder.binding.tvNameActivetime.setBackgroundResource(R.drawable.cornor_stroke_fe6881_2dp); + String time = parseTimeLong(holder.binding.tvNameActivetime, mapTime.get(userInfo.getAccount())); + holder.binding.tvNameActivetime.setText(time); + } else { + holder.binding.tvNameActivetime.setVisibility(View.GONE); + } + } + + holder.binding.getRoot().setOnClickListener(view -> { + if (itemClickListener != null) { + if (position == 0 && isShowInvited) { + itemClickListener.onAddClick(); //邀请好友 + } else { + if (mType == 1) { //转让 + if (selectpostion == position) { + selectpostion = -1; + } else { + selectpostion = position; + } + notifyDataSetChanged(); + } else { + if (isEdit) { + //管理员删除用户选择 + int index = selectedInt.indexOf(position); + if (index >= 0) { + selectedInt.remove(index); + } else { + selectedInt.add(position); + } + notifyItemChanged(position); + + } else { + itemClickListener.onItemClick(userInfo, position); + } + } + + } + + + } + }); + } + + + /* + 相差天数 + */ + public static int differentDays(long timeseconds) { + Date date1 = new Date(timeseconds); + Date date2 = new Date(System.currentTimeMillis()); //当前日期 + Calendar cal1 = Calendar.getInstance(); + cal1.setTime(date1); + + Calendar cal2 = Calendar.getInstance(); + cal2.setTime(date2); + int day1 = cal1.get(Calendar.DAY_OF_YEAR); + int day2 = cal2.get(Calendar.DAY_OF_YEAR); + + int year1 = cal1.get(Calendar.YEAR); + int year2 = cal2.get(Calendar.YEAR); + if (year1 != year2) //不同年 + { + int timeDistance = 0; + for (int i = year1; i < year2; i++) { + if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) //闰年 + { + timeDistance += 366; + } else //不是闰年 + { + timeDistance += 365; + } + } + + return timeDistance + (day2 - day1); + } else //同年 + { + return day2 - day1; + } + } + + public String parseTimeLong(TextView textView, long timestra) { + int days = differentDays(timestra); + String time; + if (days == 0) { + time = textView.getResources().getString(R.string.today_txt); + } else if (days == 1) { + time = textView.getResources().getString(R.string.yesterday_txt); + } else if (days <= 6) { + time = String.format(textView.getResources().getString(R.string.jinjiri_txt), days + 1); + } else if (days <= 29) { + time = String.format(textView.getResources().getString(R.string.jinjiri_txt), days + 1); + } else { + textView.setTextColor(Color.parseColor("#cbcbcb")); + textView.setBackgroundResource(R.drawable.cornor_stroke_cbcbcb_2dp); + time = String.format(textView.getResources().getString(R.string.jitianqi_txt), days + 1); + } + return time; + } + + @Override + public int getItemCount() { + return members.size(); + } + + + public interface ItemClickListener { + void onItemClick(UserInfo item, int position); + + void onAddClick(); + } + + protected class TeamMembersViewHolder extends RecyclerView.ViewHolder { + + TeamMembersViewHolderBinding binding; + + public TeamMembersViewHolder(@NonNull ViewBinding binding) { + super(binding.getRoot()); + this.binding = (TeamMembersViewHolderBinding) binding; + } + } +} + + diff --git a/app/src/main/java/com/dskj/rbchat/imkit/verify/FunVerifyListActivity.java b/app/src/main/java/com/dskj/rbchat/imkit/verify/FunVerifyListActivity.java new file mode 100644 index 0000000..c6a9cd1 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/imkit/verify/FunVerifyListActivity.java @@ -0,0 +1,219 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.imkit.verify; + +import android.content.Intent; +import android.os.Bundle; +import android.util.TypedValue; +import android.view.ViewGroup; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.Nullable; + +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.yunxin.kit.contactkit.ui.ILoadListener; +import com.netease.yunxin.kit.contactkit.ui.R; +import com.netease.yunxin.kit.contactkit.ui.databinding.BaseListActivityLayoutBinding; +import com.netease.yunxin.kit.contactkit.ui.fun.verify.FunVerifyDetailsActivity; +import com.netease.yunxin.kit.contactkit.ui.fun.view.FunContactViewHolderFactory; +import com.netease.yunxin.kit.contactkit.ui.fun.view.viewholder.FunVerifyInfoViewHolder; +import com.netease.yunxin.kit.contactkit.ui.model.ContactVerifyInfoBean; +import com.netease.yunxin.kit.contactkit.ui.model.IViewTypeConstant; +import com.netease.yunxin.kit.contactkit.ui.verify.BaseVerifyListActivity; +import com.netease.yunxin.kit.contactkit.ui.view.viewholder.BaseContactViewHolder; +import com.netease.yunxin.kit.corekit.im.model.SystemMessageInfoStatus; +import com.netease.yunxin.kit.corekit.im.model.SystemMessageInfoType; +import com.netease.yunxin.kit.corekit.im.provider.FetchCallback; +import com.netease.yunxin.kit.corekit.im.utils.RouterConstant; +import com.netease.yunxin.kit.corekit.route.XKitRouter; + +public class FunVerifyListActivity extends BaseVerifyListActivity implements ILoadListener { + + + private ContactVerifyInfoBean resultBean; + private ActivityResultLauncher launcher; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + //changeStatusBarColor(R.color.color_ededed); + launcher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { + if (result.getResultCode() != RESULT_OK) { + return; + } + Intent data = result.getData(); + if (data != null) { + int resultStatus = data.getIntExtra("resultStatus", 0); + int errorCode = data.getIntExtra("errorCode", 0); + resultAgreeStatus(resultStatus, errorCode, resultBean); + } + }); + if (viewModel != null) { + viewModel.resetUnreadCount(); + } + + } + + protected void configTitle(BaseListActivityLayoutBinding binding) { + super.configTitle(binding); + binding.title.setBackgroundColor(getResources().getColor(R.color.color_white)); + binding.title.getTitleTextView().setTextSize(TypedValue.COMPLEX_UNIT_SP, 20); + binding.title.setActionText(getString(R.string.clear_all)); + binding.title.setActionListener(view -> viewModel.clearNotify()); + // binding.title.getTitleTextView().setTypeface(Typeface.defaultFromStyle(Typeface.BOLD)); + // binding.title.setBackgroundResource(R.color.color_ededed); + } + + + protected int getEmptyStateViewRes() { + return com.netease.yunxin.kit.conversationkit.ui.R.drawable.fun_ic_conversation_empty; + } + + @Override + protected void configViewHolderFactory() { + binding.contactListView.setViewHolderFactory( + new FunContactViewHolderFactory() { + @Override + protected BaseContactViewHolder getCustomViewHolder(ViewGroup view, int viewType) { + if (viewType == IViewTypeConstant.CONTACT_VERIFY_INFO) { + FunVerifyInfoViewHolder viewHolder = new FunVerifyInfoViewHolder(view); + viewHolder.setVerifyListener( + new FunVerifyInfoViewHolder.VerifyListener() { + @Override + public void onDetails(ContactVerifyInfoBean bean) { + resultBean = bean; + launcher.launch(launchdetails()); + } + + @Override + public void onAccept(ContactVerifyInfoBean bean) { + viewModel.agree( + bean, + new FetchCallback() { + @Override + public void onSuccess(@Nullable Void param) { + resultAgreeStatus(0, 0, bean); + } + + @Override + public void onFailed(int code) { + resultAgreeStatus(-1, code, bean); + } + + @Override + public void onException(@Nullable Throwable exception) { + resultAgreeStatus(-2, 0, bean); + } + }); + + + } + + @Override + public void onReject(ContactVerifyInfoBean bean) { + viewModel.disagree( + bean, + new FetchCallback() { + @Override + public void onSuccess(@Nullable Void param) { + viewModel.setVerifyStatus(bean, SystemMessageInfoStatus.Declined); + binding.contactListView.updateContactData(bean); + } + + @Override + public void onFailed(int code) { + if (code == error_duplicate) { + viewModel.setVerifyStatus(bean, SystemMessageInfoStatus.Passed); + binding.contactListView.updateContactData(bean); + } + if (code == error_teamdismiss || code == error_joinedteam) { + showConfirDialog(code,bean); + return; + } + toastResult(false, bean.data.getInfoType(), code); + } + + @Override + public void onException(@Nullable Throwable exception) { + toastResult(false, bean.data.getInfoType(), 0); + } + }); + } + }); + return viewHolder; + } + return null; + } + }); + } + + + public Intent launchdetails() { + return new Intent(FunVerifyListActivity.this, FunVerifyDetailsActivity.class).putExtra("bean", resultBean); + } + + public void resultAgreeStatus(int status, int code, ContactVerifyInfoBean bean) { + if (status == 0) { //成功 + viewModel.setVerifyStatus(bean, SystemMessageInfoStatus.Passed); + binding.contactListView.updateContactData(bean); + if (bean.data.getInfoType() == SystemMessageInfoType.AddFriend) { + XKitRouter.withKey(RouterConstant.PATH_CHAT_SEND_TEXT_ACTION) + .withContext(FunVerifyListActivity.this) + .withParam( + RouterConstant.KEY_SESSION_ID, bean.data.getFromAccount()) + .withParam( + RouterConstant.KEY_SESSION_TYPE, + SessionTypeEnum.P2P.getValue()) + .withParam( + RouterConstant.KEY_MESSAGE_CONTENT, + getResources() + .getString(R.string.verify_agree_message_text)) + .navigate(); + } + } + if (status == -1) { //fail + if (code == error_duplicate) { + viewModel.setVerifyStatus(bean, SystemMessageInfoStatus.Passed); + binding.contactListView.updateContactData(bean); + } + if (code == error_teamdismiss || code == error_joinedteam) { + showConfirDialog(code,bean); + return; + } + + toastResult(true, bean.data.getInfoType(), code); + } + if (status == -2) { //exception + toastResult(true, bean.data.getInfoType(), 0); + } + } + + + public void showConfirDialog(int code, ContactVerifyInfoBean bean) { + String hint = getString(R.string.teamdissmiss_txt); + if (code == error_joinedteam) { + hint = getString(R.string.teamjoined_txt); + } + viewModel.setVerifyStatus(bean, SystemMessageInfoStatus.Expired); + binding.contactListView.updateContactData(bean); + ActionConfirmDialog actionConfirmDialog = new ActionConfirmDialog(this, hint, "", getString(R.string.know_txt), false); + actionConfirmDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + actionConfirmDialog.dismiss(); + } + + @Override + public void toCancel() { + + } + }); + actionConfirmDialog.show(); + } + + +} diff --git a/app/src/main/java/com/dskj/rbchat/imkit/watch/CheckImageVideoActivity.java b/app/src/main/java/com/dskj/rbchat/imkit/watch/CheckImageVideoActivity.java new file mode 100644 index 0000000..66a398a --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/imkit/watch/CheckImageVideoActivity.java @@ -0,0 +1,46 @@ +package com.dskj.rbchat.imkit.watch; + +import android.content.Context; +import android.content.Intent; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.viewpager2.widget.ViewPager2; + +import com.dskj.rbchat.base.LllChatBaseActivity; +import com.netease.nimlib.sdk.msg.model.IMMessage; +import com.netease.yunxin.kit.chatkit.ui.page.adapter.WatchImageAdapter; + +import java.util.ArrayList; +import java.util.List; + +public class CheckImageVideoActivity extends LllChatBaseActivity { + private static final String TAG = "WatchImageActivity"; + + public static final String EXT_MESSAGE_LIST_KEY = "EXT_MESSAGE_LIST_KEY"; + public static final String EXT_FIRST_DISPLAY_INDEX_KEY = "EXT_FIRST_DISPLAY_INDEX_KEY"; + + private ViewPager2 viewPager2; + private WatchImageAdapter watchImageAdapter; + + private List messages; + private int firstDisplayImageIndex = 0; + private boolean newPageSelected = false; + protected ActivityResultLauncher permissionLauncher; + + public static void launch(Context context, ArrayList list, int showIndex) { + Intent intent = new Intent(context, com.netease.yunxin.kit.chatkit.ui.page.WatchImageActivity.class); + intent.putExtra(EXT_MESSAGE_LIST_KEY, list); + intent.putExtra(EXT_FIRST_DISPLAY_INDEX_KEY, showIndex); + context.startActivity(intent); + } + + @Override + public int initNavigationBarColor() { + return 0; + } + + @Override + public int initStatusBarColor() { + return 0; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/jpush/LocalBroadcastManager.java b/app/src/main/java/com/dskj/rbchat/jpush/LocalBroadcastManager.java new file mode 100644 index 0000000..b7667b7 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/jpush/LocalBroadcastManager.java @@ -0,0 +1,261 @@ +package com.dskj.rbchat.jpush; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.net.Uri; +import android.os.Handler; +import android.os.Message; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Set; + +import cn.jpush.android.helper.Logger; + +public final class LocalBroadcastManager { + private static final String TAG = "JIGUANG-Example"; + private static final boolean DEBUG = false; + private final Context mAppContext; + private final HashMap> mReceivers = new HashMap>(); + private final HashMap> mActions = new HashMap> (); + private final ArrayList mPendingBroadcasts = new ArrayList(); + static final int MSG_EXEC_PENDING_BROADCASTS = 1; + private final Handler mHandler; + private static final Object mLock = new Object(); + private static LocalBroadcastManager mInstance; + + public static LocalBroadcastManager getInstance(Context context) { + Object var1 = mLock; + synchronized (mLock) { + if (mInstance == null) { + mInstance = new LocalBroadcastManager(context.getApplicationContext()); + } + + return mInstance; + } + } + + private LocalBroadcastManager(Context context) { + this.mAppContext = context; + this.mHandler = new Handler(context.getMainLooper()) { + public void handleMessage(Message msg) { + switch (msg.what) { + case 1: + LocalBroadcastManager.this.executePendingBroadcasts(); + break; + default: + super.handleMessage(msg); + } + + } + }; + } + + public void registerReceiver(BroadcastReceiver receiver, IntentFilter filter) { + HashMap var3 = this.mReceivers; + synchronized (this.mReceivers) { + ReceiverRecord entry = new ReceiverRecord(filter, receiver); + ArrayList filters = (ArrayList) this.mReceivers.get(receiver); + if (filters == null) { + filters = new ArrayList(1); + this.mReceivers.put(receiver, filters); + } + + filters.add(filter); + + for (int i = 0; i < filter.countActions(); ++i) { + String action = filter.getAction(i); + ArrayList entries = (ArrayList) this.mActions.get(action); + if (entries == null) { + entries = new ArrayList(1); + this.mActions.put(action, entries); + } + + entries.add(entry); + } + + } + } + + public void unregisterReceiver(BroadcastReceiver receiver) { + HashMap var2 = this.mReceivers; + synchronized (this.mReceivers) { + ArrayList filters = (ArrayList) this.mReceivers.remove(receiver); + if (filters != null) { + for (int i = 0; i < filters.size(); ++i) { + IntentFilter filter = (IntentFilter) filters.get(i); + + for (int j = 0; j < filter.countActions(); ++j) { + String action = filter.getAction(j); + ArrayList receivers = (ArrayList) this.mActions.get(action); + if (receivers != null) { + for (int k = 0; k < receivers.size(); ++k) { + if (((ReceiverRecord) receivers.get(k)).receiver == receiver) { + receivers.remove(k); + --k; + } + } + + if (receivers.size() <= 0) { + this.mActions.remove(action); + } + } + } + } + + } + } + } + + public boolean sendBroadcast(Intent intent) { + HashMap var2 = this.mReceivers; + synchronized (this.mReceivers) { + String action = intent.getAction(); + String type = intent.resolveTypeIfNeeded(this.mAppContext.getContentResolver()); + Uri data = intent.getData(); + String scheme = intent.getScheme(); + Set categories = intent.getCategories(); + boolean debug = (intent.getFlags() & 8) != 0; + if (debug) { + Logger.v("LocalBroadcastManager", "Resolving type " + type + " scheme " + scheme + " of intent " + intent); + } + + ArrayList entries = (ArrayList) this.mActions.get(intent.getAction()); + if (entries != null) { + if (debug) { + Logger.v("LocalBroadcastManager", "Action list: " + entries); + } + + ArrayList receivers = null; + + int i; + for (i = 0; i < entries.size(); ++i) { + ReceiverRecord receiver = (ReceiverRecord) entries.get(i); + if (debug) { + Logger.v("LocalBroadcastManager", "Matching against filter " + receiver.filter); + } + + if (receiver.broadcasting) { + if (debug) { + Logger.v("LocalBroadcastManager", " Filter\'s target already added"); + } + } else { + int match = receiver.filter.match(action, type, scheme, data, categories, "LocalBroadcastManager"); + if (match >= 0) { + if (debug) { + Logger.v("LocalBroadcastManager", " Filter matched! match=0x" + Integer.toHexString(match)); + } + + if (receivers == null) { + receivers = new ArrayList(); + } + + receivers.add(receiver); + receiver.broadcasting = true; + } else if (debug) { + String reason; + switch (match) { + case -4: + reason = "category"; + break; + case -3: + reason = "action"; + break; + case -2: + reason = "data"; + break; + case -1: + reason = "type"; + break; + default: + reason = "unknown reason"; + } + + Logger.v("LocalBroadcastManager", " Filter did not match: " + reason); + } + } + } + + if (receivers != null) { + for (i = 0; i < receivers.size(); ++i) { + ((ReceiverRecord) receivers.get(i)).broadcasting = false; + } + + this.mPendingBroadcasts.add(new BroadcastRecord(intent, receivers)); + if (!this.mHandler.hasMessages(1)) { + this.mHandler.sendEmptyMessage(1); + } + + return true; + } + } + + return false; + } + } + + public void sendBroadcastSync(Intent intent) { + if (this.sendBroadcast(intent)) { + this.executePendingBroadcasts(); + } + + } + + private void executePendingBroadcasts() { + while (true) { + BroadcastRecord[] brs = null; + HashMap i = this.mReceivers; + synchronized (this.mReceivers) { + int br = this.mPendingBroadcasts.size(); + if (br <= 0) { + return; + } + + brs = new BroadcastRecord[br]; + this.mPendingBroadcasts.toArray(brs); + this.mPendingBroadcasts.clear(); + } + + for (int var6 = 0; var6 < brs.length; ++var6) { + BroadcastRecord var7 = brs[var6]; + + for (int j = 0; j < var7.receivers.size(); ++j) { + ((ReceiverRecord) var7.receivers.get(j)).receiver.onReceive(this.mAppContext, var7.intent); + } + } + } + } + + private static class BroadcastRecord { + final Intent intent; + final ArrayList receivers; + + BroadcastRecord(Intent _intent, ArrayList _receivers) { + this.intent = _intent; + this.receivers = _receivers; + } + } + + private static class ReceiverRecord { + final IntentFilter filter; + final BroadcastReceiver receiver; + boolean broadcasting; + + ReceiverRecord(IntentFilter _filter, BroadcastReceiver _receiver) { + this.filter = _filter; + this.receiver = _receiver; + } + + public String toString() { + StringBuilder builder = new StringBuilder(128); + builder.append("Receiver{"); + builder.append(this.receiver); + builder.append(" filter="); + builder.append(this.filter); + builder.append("}"); + return builder.toString(); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/dskj/rbchat/jpush/PushMessageReceiver.java b/app/src/main/java/com/dskj/rbchat/jpush/PushMessageReceiver.java new file mode 100644 index 0000000..6ef09df --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/jpush/PushMessageReceiver.java @@ -0,0 +1,187 @@ +package com.dskj.rbchat.jpush; + +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.text.TextUtils; +import android.util.Log; + +import com.dskj.rbchat.main.MainActivity; +import com.dskj.rbchat.main.message.NotifyActMessageActivity; +import com.dskj.rbchat.main.message.NotifyMessageDetailsActivity; +import com.dskj.rbchat.model.NotifyExtraBean; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.play.VoiceUtils; +import com.dskj.rbchat.voom.MessageActivity; +import com.dskj.rbchat.welcome.WelcomeActivity; +import com.google.gson.JsonObject; + +import cn.jpush.android.api.CmdMessage; +import cn.jpush.android.api.CustomMessage; +import cn.jpush.android.api.JPushInterface; +import cn.jpush.android.api.JPushMessage; +import cn.jpush.android.api.NotificationMessage; +import cn.jpush.android.service.JPushMessageReceiver; + +public class PushMessageReceiver extends JPushMessageReceiver { + private static final String TAG = "PushMessageReceiver"; + public static final String MESSAGE_RECEIVED_ACTION = "com.example.jpushdemo.MESSAGE_RECEIVED_ACTION"; + public static final String KEY_MESSAGE = "message"; + public static final String KEY_EXTRAS = "extras"; + + @Override + public void onMessage(Context context, CustomMessage customMessage) { + Log.e(TAG, "[onMessage] " + customMessage); + processCustomMessage(context, customMessage); + } + + @Override + public void onNotifyMessageOpened(Context context, NotificationMessage message) { + Log.e(TAG, "[onNotifyMessageOpened] " + message); + try { + //打开自定义的Activity + if (!TextUtils.isEmpty(message.notificationExtras)) { + NotifyExtraBean bean = GsonUtils.getObjFromJSON(message.notificationExtras, NotifyExtraBean.class); + if (bean != null && (bean.getType() == 40 || bean.getType() == 41)) { + Intent i = new Intent(context, NotifyMessageDetailsActivity.class); + i.putExtra("id", bean.getPostId()); + i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); + context.startActivity(i); + return; + } + } + Intent i = new Intent(context, MainActivity.class); +// Bundle bundle = new Bundle(); +// bundle.putString(JPushInterface.EXTRA_NOTIFICATION_TITLE,message.notificationTitle); +// bundle.putString(JPushInterface.EXTRA_ALERT,message.notificationContent); +// 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); + } catch (Throwable throwable) { + throwable.printStackTrace(); + } + } + + @Override + public void onMultiActionClicked(Context context, Intent intent) { + Log.e(TAG, "[onMultiActionClicked] 用户点击了通知栏按钮"); + String nActionExtra = intent.getExtras().getString(JPushInterface.EXTRA_NOTIFICATION_ACTION_EXTRA); + + //开发者根据不同 Action 携带的 extra 字段来分配不同的动作。 + if (nActionExtra == null) { + Log.d(TAG, "ACTION_NOTIFICATION_CLICK_ACTION nActionExtra is null"); + return; + } + if (nActionExtra.equals("my_extra1")) { + Log.e(TAG, "[onMultiActionClicked] 用户点击通知栏按钮一"); + } else if (nActionExtra.equals("my_extra2")) { + Log.e(TAG, "[onMultiActionClicked] 用户点击通知栏按钮二"); + } else if (nActionExtra.equals("my_extra3")) { + Log.e(TAG, "[onMultiActionClicked] 用户点击通知栏按钮三"); + } else { + Log.e(TAG, "[onMultiActionClicked] 用户点击通知栏按钮未定义"); + } + } + + @Override + public void onNotifyMessageArrived(Context context, NotificationMessage message) { + Log.e(TAG, "[onNotifyMessageArrived] " + message + " json==" + message.notificationTargetEvent); + String extra = message.notificationExtras; + if (!TextUtils.isEmpty(extra)) { + NotifyExtraBean bean = GsonUtils.getObjFromJSON(extra, NotifyExtraBean.class); + if (bean != null) { + switch (bean.getType()) { + case 30: + case 34: //cash + VoiceUtils.with(context).Play(bean.getPostId(), 0); + break; + case 35: //礼品积分 + VoiceUtils.with(context).Play(bean.getPostId(), 1); + break; + } + } + } + } + + @Override + public void onNotifyMessageDismiss(Context context, NotificationMessage message) { + Log.e(TAG, "[onNotifyMessageDismiss] " + message); + } + + @Override + public void onRegister(Context context, String registrationId) { + Log.e(TAG, "[onRegister] " + registrationId); + } + + @Override + public void onConnected(Context context, boolean isConnected) { + Log.e(TAG, "[onConnected] " + isConnected); + } + + @Override + public void onCommandResult(Context context, CmdMessage cmdMessage) { + Log.e(TAG, "[onCommandResult] " + cmdMessage); + } + + @Override + public void onTagOperatorResult(Context context, JPushMessage jPushMessage) { + TagAliasOperatorHelper.getInstance().onTagOperatorResult(context, jPushMessage); + super.onTagOperatorResult(context, jPushMessage); + } + + @Override + public void onCheckTagOperatorResult(Context context, JPushMessage jPushMessage) { + TagAliasOperatorHelper.getInstance().onCheckTagOperatorResult(context, jPushMessage); + super.onCheckTagOperatorResult(context, jPushMessage); + } + + @Override + public void onAliasOperatorResult(Context context, JPushMessage jPushMessage) { + TagAliasOperatorHelper.getInstance().onAliasOperatorResult(context, jPushMessage); + super.onAliasOperatorResult(context, jPushMessage); + } + + @Override + public void onMobileNumberOperatorResult(Context context, JPushMessage jPushMessage) { + TagAliasOperatorHelper.getInstance().onMobileNumberOperatorResult(context, jPushMessage); + super.onMobileNumberOperatorResult(context, jPushMessage); + } + + //send msg to MainActivity + private void processCustomMessage(Context context, CustomMessage customMessage) { + + + + + /*if (MainActivity.isForeground) { + String message = customMessage.message; + String extras = customMessage.extra; + Intent msgIntent = new Intent(MESSAGE_RECEIVED_ACTION); + msgIntent.putExtra(KEY_MESSAGE, message); + if (!Utils.isEmpty(extras)) { + try { + JSONObject extraJson = new JSONObject(extras); + if (extraJson.length() > 0) { + msgIntent.putExtra(KEY_EXTRAS, extras); + } + } catch (JSONException e) { + + } + + } + LocalBroadcastManager.getInstance(context).sendBroadcast(msgIntent); + }*/ + } + + @Override + public void onNotificationSettingsCheck(Context context, boolean isOn, int source) { + super.onNotificationSettingsCheck(context, isOn, source); + Log.e(TAG, "[onNotificationSettingsCheck] isOn:" + isOn + ",source:" + source); + } + + + public void playSound() { + + } +} diff --git a/app/src/main/java/com/dskj/rbchat/jpush/TagAliasOperatorHelper.java b/app/src/main/java/com/dskj/rbchat/jpush/TagAliasOperatorHelper.java new file mode 100644 index 0000000..057e8bc --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/jpush/TagAliasOperatorHelper.java @@ -0,0 +1,339 @@ +package com.dskj.rbchat.jpush; + +import android.content.Context; +import android.os.Handler; +import android.os.Message; +import android.util.SparseArray; + +import java.util.Locale; +import java.util.Set; + +import cn.jpush.android.api.JPushInterface; +import cn.jpush.android.api.JPushMessage; +import cn.jpush.android.helper.Logger; + +/** + * 处理tagalias相关的逻辑 + * */ +public class TagAliasOperatorHelper { + private static final String TAG = "JIGUANG-TagAliasHelper"; + public static int sequence = 1; + /**增加*/ + public static final int ACTION_ADD = 1; + /**覆盖*/ + public static final int ACTION_SET = 2; + /**删除部分*/ + public static final int ACTION_DELETE = 3; + /**删除所有*/ + public static final int ACTION_CLEAN = 4; + /**查询*/ + public static final int ACTION_GET = 5; + + public static final int ACTION_CHECK = 6; + + public static final int DELAY_SEND_ACTION = 1; + + public static final int DELAY_SET_MOBILE_NUMBER_ACTION = 2; + + private Context context; + + private static TagAliasOperatorHelper mInstance; + private TagAliasOperatorHelper(){ + } + public static TagAliasOperatorHelper getInstance(){ + if(mInstance == null){ + synchronized (TagAliasOperatorHelper.class){ + if(mInstance == null){ + mInstance = new TagAliasOperatorHelper(); + } + } + } + return mInstance; + } + public void init(Context context){ + if(context != null) { + this.context = context.getApplicationContext(); + } + } + private SparseArray setActionCache = new SparseArray(); + + public Object get(int sequence){ + return setActionCache.get(sequence); + } + public Object remove(int sequence){ + return setActionCache.get(sequence); + } + public void put(int sequence,Object tagAliasBean){ + setActionCache.put(sequence,tagAliasBean); + } + private Handler delaySendHandler = new Handler(){ + @Override + public void handleMessage(Message msg) { + switch (msg.what){ + case DELAY_SEND_ACTION: + if(msg.obj !=null && msg.obj instanceof TagAliasBean){ + Logger.i(TAG,"on delay time"); + sequence++; + TagAliasBean tagAliasBean = (TagAliasBean) msg.obj; + setActionCache.put(sequence, tagAliasBean); + if(context!=null) { + handleAction(context, sequence, tagAliasBean); + }else{ + Logger.e(TAG,"#unexcepted - context was null"); + } + }else{ + Logger.w(TAG,"#unexcepted - msg obj was incorrect"); + } + break; + case DELAY_SET_MOBILE_NUMBER_ACTION: + if(msg.obj !=null && msg.obj instanceof String) { + Logger.i(TAG, "retry set mobile number"); + sequence++; + String mobileNumber = (String) msg.obj; + setActionCache.put(sequence, mobileNumber); + if(context !=null) { + handleAction(context, sequence, mobileNumber); + }else { + Logger.e(TAG, "#unexcepted - context was null"); + } + }else{ + Logger.w(TAG,"#unexcepted - msg obj was incorrect"); + } + break; + } + } + }; + public void handleAction(Context context,int sequence,String mobileNumber){ + put(sequence,mobileNumber); + Logger.d(TAG,"sequence:"+sequence+",mobileNumber:"+mobileNumber); + JPushInterface.setMobileNumber(context,sequence,mobileNumber); + } + /** + * 处理设置tag + * */ + public void handleAction(Context context,int sequence, TagAliasBean tagAliasBean){ + init(context); + if(tagAliasBean == null){ + Logger.w(TAG,"tagAliasBean was null"); + return; + } + put(sequence,tagAliasBean); + if(tagAliasBean.isAliasAction){ + switch (tagAliasBean.action){ + case ACTION_GET: + JPushInterface.getAlias(context,sequence); + break; + case ACTION_DELETE: + JPushInterface.deleteAlias(context,sequence); + break; + case ACTION_SET: + JPushInterface.setAlias(context,sequence,tagAliasBean.alias); + break; + default: + Logger.w(TAG,"unsupport alias action type"); + return; + } + }else { + switch (tagAliasBean.action) { + case ACTION_ADD: + JPushInterface.addTags(context, sequence, tagAliasBean.tags); + break; + case ACTION_SET: + JPushInterface.setTags(context, sequence, tagAliasBean.tags); + break; + case ACTION_DELETE: + JPushInterface.deleteTags(context, sequence, tagAliasBean.tags); + break; + case ACTION_CHECK: + //一次只能check一个tag + String tag = (String)tagAliasBean.tags.toArray()[0]; + JPushInterface.checkTagBindState(context,sequence,tag); + break; + case ACTION_GET: + JPushInterface.getAllTags(context, sequence); + break; + case ACTION_CLEAN: + JPushInterface.cleanTags(context, sequence); + break; + default: + Logger.w(TAG,"unsupport tag action type"); + return; + } + } + } + private boolean RetryActionIfNeeded(int errorCode,TagAliasBean tagAliasBean){ + if(!Utils.isConnected(context)){ + Logger.w(TAG,"no network"); + return false; + } + //返回的错误码为6002 超时,6014 服务器繁忙,都建议延迟重试 + if(errorCode == 6002 || errorCode == 6014){ + Logger.d(TAG,"need retry"); + if(tagAliasBean!=null){ + Message message = new Message(); + message.what = DELAY_SEND_ACTION; + message.obj = tagAliasBean; + delaySendHandler.sendMessageDelayed(message,1000*60); + String logs =getRetryStr(tagAliasBean.isAliasAction, tagAliasBean.action,errorCode); + Utils.showToast(logs, context); + return true; + } + } + return false; + } + private boolean RetrySetMObileNumberActionIfNeeded(int errorCode,String mobileNumber){ + if(!Utils.isConnected(context)){ + Logger.w(TAG,"no network"); + return false; + } + //返回的错误码为6002 超时,6024 服务器内部错误,建议稍后重试 + if(errorCode == 6002 || errorCode == 6024){ + Logger.d(TAG,"need retry"); + Message message = new Message(); + message.what = DELAY_SET_MOBILE_NUMBER_ACTION; + message.obj = mobileNumber; + delaySendHandler.sendMessageDelayed(message,1000*60); + String str = "Failed to set mobile number due to %s. Try again after 60s."; + str = String.format(Locale.ENGLISH,str,(errorCode == 6002 ? "timeout" : "server internal error”")); + Utils.showToast(str, context); + return true; + } + return false; + + } + private String getRetryStr(boolean isAliasAction,int actionType,int errorCode){ + String str = "Failed to %s %s due to %s. Try again after 60s."; + str = String.format(Locale.ENGLISH,str,getActionStr(actionType),(isAliasAction? "alias" : " tags") ,(errorCode == 6002 ? "timeout" : "server too busy")); + return str; + } + + private String getActionStr(int actionType){ + switch (actionType){ + case ACTION_ADD: + return "add"; + case ACTION_SET: + return "set"; + case ACTION_DELETE: + return "delete"; + case ACTION_GET: + return "get"; + case ACTION_CLEAN: + return "clean"; + case ACTION_CHECK: + return "check"; + } + return "unkonw operation"; + } + public void onTagOperatorResult(Context context, JPushMessage jPushMessage) { + int sequence = jPushMessage.getSequence(); + Logger.i(TAG,"action - onTagOperatorResult, sequence:"+sequence+",tags:"+jPushMessage.getTags()); + Logger.i(TAG,"tags size:"+jPushMessage.getTags().size()); + init(context); + //根据sequence从之前操作缓存中获取缓存记录 + TagAliasBean tagAliasBean = (TagAliasBean)setActionCache.get(sequence); + if(tagAliasBean == null){ +// Utils.showToast("获取缓存记录失败", context); + return; + } + if(jPushMessage.getErrorCode() == 0){ + Logger.i(TAG,"action - modify tag Success,sequence:"+sequence); + setActionCache.remove(sequence); + String logs = getActionStr(tagAliasBean.action)+" tags success"; + Logger.i(TAG,logs); + Utils.showToast(logs, context); + }else{ + String logs = "Failed to " + getActionStr(tagAliasBean.action)+" tags"; + if(jPushMessage.getErrorCode() == 6018){ + //tag数量超过限制,需要先清除一部分再add + logs += ", tags is exceed limit need to clean"; + } + logs += ", errorCode:" + jPushMessage.getErrorCode(); + Logger.e(TAG, logs); + if(!RetryActionIfNeeded(jPushMessage.getErrorCode(),tagAliasBean)) { + Utils.showToast(logs, context); + } + } + } + public void onCheckTagOperatorResult(Context context, JPushMessage jPushMessage){ + int sequence = jPushMessage.getSequence(); + Logger.i(TAG,"action - onCheckTagOperatorResult, sequence:"+sequence+",checktag:"+jPushMessage.getCheckTag()); + init(context); + //根据sequence从之前操作缓存中获取缓存记录 + TagAliasBean tagAliasBean = (TagAliasBean)setActionCache.get(sequence); + if(tagAliasBean == null){ +// Utils.showToast("获取缓存记录失败", context); + return; + } + if(jPushMessage.getErrorCode() == 0){ + Logger.i(TAG,"tagBean:"+tagAliasBean); + setActionCache.remove(sequence); + String logs = getActionStr(tagAliasBean.action)+" tag "+jPushMessage.getCheckTag() + " bind state success,state:"+jPushMessage.getTagCheckStateResult(); + Logger.i(TAG,logs); + Utils.showToast(logs, context); + }else{ + String logs = "Failed to " + getActionStr(tagAliasBean.action)+" tags, errorCode:" + jPushMessage.getErrorCode(); + Logger.e(TAG, logs); + if(!RetryActionIfNeeded(jPushMessage.getErrorCode(),tagAliasBean)) { + Utils.showToast(logs, context); + } + } + } + public void onAliasOperatorResult(Context context, JPushMessage jPushMessage) { + int sequence = jPushMessage.getSequence(); + Logger.i(TAG,"action - onAliasOperatorResult, sequence:"+sequence+",alias:"+jPushMessage.getAlias()); + init(context); + //根据sequence从之前操作缓存中获取缓存记录 + TagAliasBean tagAliasBean = (TagAliasBean)setActionCache.get(sequence); + if(tagAliasBean == null){ +// Utils.showToast("获取缓存记录失败", context); + return; + } + if(jPushMessage.getErrorCode() == 0){ + Logger.i(TAG,"action - modify alias Success,sequence:"+sequence); + setActionCache.remove(sequence); + String logs = getActionStr(tagAliasBean.action)+" alias success"; + Logger.i(TAG,logs); + Utils.showToast(logs, context); + }else{ + String logs = "Failed to " + getActionStr(tagAliasBean.action)+" alias, errorCode:" + jPushMessage.getErrorCode(); + Logger.e(TAG, logs); + if(!RetryActionIfNeeded(jPushMessage.getErrorCode(),tagAliasBean)) { + Utils.showToast(logs, context); + } + } + } + //设置手机号码回调 + public void onMobileNumberOperatorResult(Context context, JPushMessage jPushMessage) { + int sequence = jPushMessage.getSequence(); + Logger.i(TAG,"action - onMobileNumberOperatorResult, sequence:"+sequence+",mobileNumber:"+jPushMessage.getMobileNumber()); + init(context); + if(jPushMessage.getErrorCode() == 0){ + Logger.i(TAG,"action - set mobile number Success,sequence:"+sequence); + setActionCache.remove(sequence); + }else{ + String logs = "Failed to set mobile number, errorCode:" + jPushMessage.getErrorCode(); + Logger.e(TAG, logs); + if(!RetrySetMObileNumberActionIfNeeded(jPushMessage.getErrorCode(),jPushMessage.getMobileNumber())){ + Utils.showToast(logs, context); + } + } + } + public static class TagAliasBean{ + int action; + Set tags; + String alias; + boolean isAliasAction; + + @Override + public String toString() { + return "TagAliasBean{" + + "action=" + action + + ", tags=" + tags + + ", alias='" + alias + '\'' + + ", isAliasAction=" + isAliasAction + + '}'; + } + } + + +} diff --git a/app/src/main/java/com/dskj/rbchat/jpush/Utils.java b/app/src/main/java/com/dskj/rbchat/jpush/Utils.java new file mode 100644 index 0000000..88923eb --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/jpush/Utils.java @@ -0,0 +1,117 @@ +package com.dskj.rbchat.jpush; + +import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; +import android.os.Bundle; +import android.os.Looper; +import android.text.TextUtils; +import android.widget.Toast; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import cn.jpush.android.api.JPushInterface; + +public class Utils { + public static final String PREFS_NAME = "JPUSH_EXAMPLE"; + public static final String PREFS_DAYS = "JPUSH_EXAMPLE_DAYS"; + public static final String PREFS_START_TIME = "PREFS_START_TIME"; + public static final String PREFS_END_TIME = "PREFS_END_TIME"; + public static final String KEY_APP_KEY = "JPUSH_APPKEY"; + + public static boolean isEmpty(String s) { + if (null == s) + return true; + if (s.length() == 0) + return true; + if (s.trim().length() == 0) + return true; + return false; + } + /** + * 只能以 “+” 或者 数字开头;后面的内容只能包含 “-” 和 数字。 + * */ + private final static String MOBILE_NUMBER_CHARS = "^[+0-9][-0-9]{1,}$"; + public static boolean isValidMobileNumber(String s) { + if(TextUtils.isEmpty(s)) return true; + Pattern p = Pattern.compile(MOBILE_NUMBER_CHARS); + Matcher m = p.matcher(s); + return m.matches(); + } + // 校验Tag Alias 只能是数字,英文字母和中文 + public static boolean isValidTagAndAlias(String s) { + Pattern p = Pattern.compile("^[\u4E00-\u9FA50-9a-zA-Z_!@#$&*+=.|]+$"); + Matcher m = p.matcher(s); + return m.matches(); + } + + // 取得AppKey + public static String getAppKey(Context context) { + Bundle metaData = null; + String appKey = null; + try { + ApplicationInfo ai = context.getPackageManager().getApplicationInfo( + context.getPackageName(), PackageManager.GET_META_DATA); + if (null != ai) + metaData = ai.metaData; + if (null != metaData) { + appKey = metaData.getString(KEY_APP_KEY); + if ((null == appKey) || appKey.length() != 24) { + appKey = null; + } + } + } catch (NameNotFoundException e) { + + } + return appKey; + } + + // 取得版本号 + public static String GetVersion(Context context) { + try { + PackageInfo manager = context.getPackageManager().getPackageInfo( + context.getPackageName(), 0); + return manager.versionName; + } catch (NameNotFoundException e) { + return "Unknown"; + } + } + + public static void showToast(final String toast, final Context context) + { + new Thread(new Runnable() { + + @Override + public void run() { + Looper.prepare(); + Toast.makeText(context, toast, Toast.LENGTH_SHORT).show(); + Looper.loop(); + } + }).start(); + } + + public static boolean isConnected(Context context) { + ConnectivityManager conn = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkInfo info = conn.getActiveNetworkInfo(); + return (info != null && info.isConnected()); + } + + private static boolean isReadableASCII(CharSequence string){ + if (TextUtils.isEmpty(string)) return false; + try { + Pattern p = Pattern.compile("[\\x20-\\x7E]+"); + return p.matcher(string).matches(); + } catch (Throwable e){ + return true; + } + } + + public static String getDeviceId(Context context) { + return JPushInterface.getUdid(context); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/login/ChongZhiActivity.java b/app/src/main/java/com/dskj/rbchat/login/ChongZhiActivity.java new file mode 100644 index 0000000..a6a0073 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/login/ChongZhiActivity.java @@ -0,0 +1,451 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.login; + + +import android.app.Activity; +import android.content.Intent; +import android.os.Build; +import android.os.Bundle; +import android.os.CountDownTimer; +import android.os.Handler; +import android.text.Html; +import android.text.TextUtils; +import android.view.MotionEvent; +import android.view.View; +import android.view.inputmethod.InputMethodManager; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; + +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.ActivityChongzhiBinding; +import com.dskj.rbchat.databinding.ActivityWangjiBinding; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.dialog.ActionConfirmDialog1; +import com.dskj.rbchat.dialog.SelectCountryDialog; +import com.dskj.rbchat.main.mine.ChangePhoneActivity; +import com.dskj.rbchat.model.BindBean; +import com.dskj.rbchat.model.CountryBean; +import com.dskj.rbchat.model.RegisteredBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.AnimUtil; +import com.dskj.rbchat.utils.Constant; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.welcome.WelcomeActivity; +import com.netease.yunxin.kit.alog.ALog; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.dialog.LoadingDialog; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.login.LoginCallback; + +import java.util.HashMap; +import java.util.Map; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +/** + * Welcome Page is launch page + */ +public class ChongZhiActivity extends BaseActivity { + protected ActivityResultLauncher permissionLauncher; + String passwordCode = null; + + private static final String TAG = "WelcomeActivity"; + private ActivityChongzhiBinding activityWelcomeBinding; + int step = 1; + int sexType = 1; + CountryBean countryBean; + String avater = null; + + @RequiresApi(api = Build.VERSION_CODES.M) + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getWindow().setStatusBarColor(getResources().getColor(R.color.color_fcfcfc)); + getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white)); + + ALog.d(Constant.PROJECT_TAG, TAG, "onCreateView"); + IMApplication.setColdStart(true); + activityWelcomeBinding = ActivityChongzhiBinding.inflate(getLayoutInflater()); + setContentView(activityWelcomeBinding.getRoot()); + myCountDownTimer = new MyCountDownTimer(60000, 1000); + activityWelcomeBinding.aboutTitleBar.setOnBackIconClickListener(v -> { + onBackPressed(); + }); + + countryBean = DataUtils.getLocCountry(ChongZhiActivity.this); + changeArea(); + bindInfo(IMKitClient.account()); + AnimUtil.setAnimViews(activityWelcomeBinding.sendSmsTv, activityWelcomeBinding.changePassTv, + activityWelcomeBinding.nextIv, activityWelcomeBinding.changeSmsCodeTv); + activityWelcomeBinding.nextIv.setOnClickListener(v -> { + if (step == 2) { + if (TextUtils.isEmpty(passwordCode)) { + ToastX.showShortToast(R.string.dxyzmbnwk_txt); + return; + } + checkVerfyCode(); + } else if (step == 3) { + if (TextUtils.isEmpty(activityWelcomeBinding.passwordEt.getText().toString().trim())) { + ToastX.showShortToast(R.string.mimabunengweikong_txt); + return; + } + if (!DataUtils.checkPassword(activityWelcomeBinding.passwordEt.getText().toString().trim())) { + ToastX.showShortToast(R.string.qjcmmgs_txt); + return; + } + + if (activityWelcomeBinding.passwordEt.getText().toString().trim().length() < 8) { + ToastX.showShortToast(R.string.qjcmmgs_txt1); + return; + } + if (TextUtils.isEmpty(activityWelcomeBinding.passwordEt1.getText().toString().trim())) { + ToastX.showShortToast(R.string.qrmmbnwk_txt); + return; + } + + if (!activityWelcomeBinding.passwordEt.getText().toString().trim().equals(activityWelcomeBinding.passwordEt1.getText().toString().trim())) { + ToastX.showShortToast(R.string.mimaquernemimabuyizhi_txt); + return; + } + hideSoftInput(this); + phoneRegister(); + } + + }); + + activityWelcomeBinding.changePassTv.setOnClickListener(v -> { + step = 2; + changeStep(); + }); + activityWelcomeBinding.passwordEditTextCode.setOnCompleteListener(code -> { + passwordCode = code; + + }); + + + activityWelcomeBinding.sendSmsTv.setOnClickListener(v -> { + toStep2(); + }); + + + } + + BindBean bean; + + private void bindInfo(String user_uid) { + Api.getInstance().bindInfo(user_uid) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + bean = feedbackResp.data; + if (bean == null) { + return; + } + hideSoftInput(ChongZhiActivity.this); + if (!TextUtils.isEmpty(bean.getAreaCode()) && !TextUtils.isEmpty(bean.getPhone())) { + activityWelcomeBinding.sendSmsTipsTv.setText(Html.fromHtml(String.format(getString(R.string.djfsyzm_txt), + bean.getAreaCode() + " " + bean.getPhone()))); + } + new Handler().postDelayed(() -> { + step += 1; + changeStep(); + }, 500); + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); +// WidgetUtils.showToast(getActivity(), msg, WidgetUtils.ToastType.ERROR); + } + }); + } + + private void checkVerfyCode() { + Map maps = new HashMap<>(); + maps.put("verifyCode", passwordCode); + maps.put("phone", bean.getPhone()); + maps.put("areaCode", bean.getAreaCode()); + if (!TextUtils.isEmpty(IMUIKitConfig.SUBSTATIONID)) { + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + } + Api.getInstance().preCheckVerifyCode(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { +// dimessLoadingDialog(); + if (feedbackResp.data.isCorrect()) { + new Handler().postDelayed(() -> { + step += 1; + changeStep(); + }, 500); + } else { + ToastX.showShortToast(R.string.yzmbzq_txt); + } + } + + @Override + public void onError(int code, String msg) { +// dimessLoadingDialog(); + LogUtils.i("获取到的错误:" + code + "" + msg); + ToastX.showShortToast(msg); + + + } + }); + } + + + private void phoneRegister() { + + + Map maps = new HashMap<>(); + maps.put("phone", bean.getPhone()); + maps.put("areaCode", bean.getAreaCode()); + maps.put("verifyCode", passwordCode); + maps.put("newPassword", activityWelcomeBinding.passwordEt.getText().toString().trim()); + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + + Api.getInstance().smsSetPassword(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + ActionConfirmDialog1 actionConfirmDialog = new ActionConfirmDialog1(ChongZhiActivity.this, getString(R.string.genghuancheng_to_login_txt1), false); + actionConfirmDialog.setOnToActionListener(new ActionConfirmDialog1.OnToActionListener() { + @Override + public void toSumbit() { + IMKitClient.logoutIM( + + new com.netease.yunxin.kit.corekit.im.login.LoginCallback() { + @Override + public void onError(int errorCode, @NonNull String errorMsg) { + if (ChongZhiActivity.this.getApplicationContext() instanceof IMApplication) { + ((IMApplication) ChongZhiActivity.this.getApplicationContext()) + .clearActivity(ChongZhiActivity.this); + } + DataUtils.set(ChongZhiActivity.this, IMUIKitConfig.LOGIN_ACCOUNT, ""); + DataUtils.set(ChongZhiActivity.this, IMUIKitConfig.LOGIN_TOKEN, ""); + startActivity(new Intent(ChongZhiActivity.this, WelcomeActivity.class)); + finish(); + } + + @Override + public void onSuccess(@Nullable Void data) { + if (ChongZhiActivity.this.getApplicationContext() instanceof IMApplication) { + ((IMApplication) ChongZhiActivity.this.getApplicationContext()) + .clearActivity(ChongZhiActivity.this); + } + DataUtils.set(ChongZhiActivity.this, IMUIKitConfig.LOGIN_ACCOUNT, ""); + DataUtils.set(ChongZhiActivity.this, IMUIKitConfig.LOGIN_TOKEN, ""); + startActivity(new Intent(ChongZhiActivity.this, WelcomeActivity.class)); + finish(); + } + }); + } + + @Override + public void toCancel() { + + } + }); + actionConfirmDialog.show(); + } + + @Override + public void onError(int code, String msg) { +// LogUtils.i("获取到的错误:"+code+""+ msg); + ToastX.showShortToast(msg); + } + }); + + + } + + + private void toStep2() { + hideSoftInput(ChongZhiActivity.this); + Map maps = new HashMap<>(); + maps.put("phone", bean.getPhone()); + maps.put("areaCode", bean.getAreaCode()); + if (!TextUtils.isEmpty(IMUIKitConfig.SUBSTATIONID)) { + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + } + Api.getInstance().sendSmsForSetPassword(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { + myCountDownTimer.start(); + ActionConfirmDialog actionConfirmDialog = new ActionConfirmDialog(ChongZhiActivity.this, getString(R.string.yzmyfs_txt), false); + actionConfirmDialog.show(); + activityWelcomeBinding.sendSmsTipsTv.setText(Html.fromHtml(String.format(getString(R.string.djfsyzm_txt1), + bean.getAreaCode() + " " + bean.getPhone()))); + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + ToastX.showShortToast(msg); + } + }); + + + } + + + MyCountDownTimer myCountDownTimer; + + //倒计时函数 + private class MyCountDownTimer extends CountDownTimer { + + public MyCountDownTimer(long millisInFuture, long countDownInterval) { + super(millisInFuture, countDownInterval); + } + + //计时过程 + @Override + public void onTick(long l) { + //防止计时过程中重复点击 + activityWelcomeBinding.sendSmsTv.setClickable(false); +// getcodeTv.setTextColor(getResources().getColor(R.color.color_adb5bd)); + activityWelcomeBinding.sendSmsTv.setText(String.format(getString(R.string.get_code1_txt), (l / 1000))); + + } + + //计时完毕的方法 + @Override + public void onFinish() { + //重新给Button设置文字 + activityWelcomeBinding.sendSmsTv.setText(R.string.get_code_txt); + //设置可点击 + activityWelcomeBinding.sendSmsTv.setClickable(true); +// getcodeTv.setTextColor(getResources().getColor(R.color.colorAccent)); + + } + } + + + /** + * 隐藏软键盘 + */ + public void hideSoftInput(Activity activity) { + InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + if (getCurrentFocus() != null && null != imm) { + imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0); + } +// View view = activity.getCurrentFocus(); +// +// if (view != null) { +// +// InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE); +// +// inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); +// +// } + } + + + @Override + public void onBackPressed() { + if (step < 3) { + super.onBackPressed(); + } else { + step -= 1; + changeStep(); + } + } + + private void changeStep() { + switch (step) { + case 1: + activityWelcomeBinding.step2Ly.setVisibility(View.GONE); + activityWelcomeBinding.step3Ly.setVisibility(View.GONE); + activityWelcomeBinding.changeSmsCodeTv.setVisibility(View.GONE); + activityWelcomeBinding.changePassTv.setVisibility(View.GONE); + break; + case 2: + activityWelcomeBinding.step2Ly.setVisibility(View.GONE); + activityWelcomeBinding.step3Ly.setVisibility(View.VISIBLE); + activityWelcomeBinding.changeSmsCodeTv.setVisibility(View.GONE); + activityWelcomeBinding.changePassTv.setVisibility(View.GONE); + + break; + case 3: + activityWelcomeBinding.step2Ly.setVisibility(View.VISIBLE); + activityWelcomeBinding.step3Ly.setVisibility(View.GONE); + activityWelcomeBinding.changeSmsCodeTv.setVisibility(View.GONE); + activityWelcomeBinding.changePassTv.setVisibility(View.GONE); + break; + + } + } + + + private void changeArea() { + } + + private void showMainActivityAndFinish() { + ALog.d(Constant.PROJECT_TAG, TAG, "showMainActivityAndFinish"); + Intent intent = new Intent(); + intent.setClass(this, LoginActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); + this.startActivity(intent); + finish(); + } + + + public LoadingDialog loadingDialog; + + public void showLoadingDialog() { + if (loadingDialog == null) + loadingDialog = new LoadingDialog(this); + loadingDialog.show(); + } + + public void showLoadingDialog(String msg) { + if (loadingDialog == null) + loadingDialog = new LoadingDialog(this); + loadingDialog.setLoadingText(msg); + loadingDialog.show(); + } + + + public void dimessLoadingDialog() { + if (loadingDialog != null) { + loadingDialog.dismiss(); + } + + } + + public boolean onTouchEvent(MotionEvent event) { + if(null != this.getCurrentFocus()){ + /** + * 点击空白位置 隐藏软键盘 + */ + InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + return mInputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0); + } + return super .onTouchEvent(event); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/login/LoginActivity.java b/app/src/main/java/com/dskj/rbchat/login/LoginActivity.java new file mode 100644 index 0000000..39b7b56 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/login/LoginActivity.java @@ -0,0 +1,220 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.login; + + +import android.content.Intent; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.ActivityLoginBinding; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.main.MainActivity; +import com.dskj.rbchat.model.LoginBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; + +import com.dskj.rbchat.network.BaseObserver1; +import com.dskj.rbchat.utils.AnimUtil; +import com.dskj.rbchat.utils.Constant; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GetAndroidUniqueMark; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.wxapi.bean.WeiXin; +import com.dskj.rbchat.wxapi.bean.WeiXinInfo; +import com.dskj.rbchat.wxapi.bean.WeiXinToken; +import com.netease.nimlib.sdk.auth.LoginInfo; +import com.netease.yunxin.kit.alog.ALog; +import com.netease.yunxin.kit.chatkit.ui.common.RxBus; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.login.LoginCallback; +import com.tencent.mm.opensdk.modelmsg.SendAuth; +import com.tencent.mm.opensdk.openapi.IWXAPI; +import com.tencent.mm.opensdk.openapi.WXAPIFactory; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; +import com.dskj.rbchat.network.Result; +/** + * Welcome Page is launch page + */ +@Deprecated +public class LoginActivity extends BaseActivity { + + private static final String TAG = "WelcomeActivity"; + private ActivityLoginBinding activityWelcomeBinding; + + private IWXAPI wxAPI; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getWindow().setStatusBarColor(getResources().getColor(R.color.color_fcfcfc)); + getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white)); + + ALog.d(Constant.PROJECT_TAG, TAG, "onCreateView"); + IMApplication.setColdStart(true); + activityWelcomeBinding = ActivityLoginBinding.inflate(getLayoutInflater()); + setContentView(activityWelcomeBinding.getRoot()); + + activityWelcomeBinding.aboutTitleBar.setOnBackIconClickListener(v -> onBackPressed()); + wxAPI = WXAPIFactory.createWXAPI(LoginActivity.this, IMUIKitConfig.WECHAT_APPID, true); + wxAPI.registerApp(IMUIKitConfig.WECHAT_APPID); + + RxBus.getInstance().toObservable(WeiXin.class) + .subscribeOn(rx.schedulers.Schedulers.io()) + .unsubscribeOn(rx.schedulers.Schedulers.io()) + .subscribe(changeImageViewBean -> { + LogUtils.i(GsonUtils.beanToJSONString(changeImageViewBean)); + if(changeImageViewBean.getType()==1){ + getAccessToken(changeImageViewBean.getCode()); + }else{ + ToastX.showShortToast( + String.format(getResources().getString(R.string.login_fail),changeImageViewBean.getType())); + } + }); + + activityWelcomeBinding.loginBt.setOnClickListener(new View.OnClickListener() { + @Override + + public void onClick(View v) { + startActivity(new Intent(LoginActivity.this,PhoneLoginActivity.class)); + finish(); + } + }); + + activityWelcomeBinding.wechatBt.setOnClickListener(v -> { + SendAuth.Req req = new SendAuth.Req(); + req.scope = "snsapi_userinfo"; + req.state = String.valueOf(System.currentTimeMillis()); + wxAPI.sendReq(req); + }); + AnimUtil.setAnimViews(activityWelcomeBinding.loginBt,activityWelcomeBinding.wechatBt); + + } + + private void showMainActivityAndFinish() { + ALog.d(Constant.PROJECT_TAG, TAG, "showMainActivityAndFinish"); + Intent intent = new Intent(); + intent.setClass(this, MainActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); + this.startActivity(intent); + finish(); + } + + + private void loginIM(String account, String token) { + ALog.d(Constant.PROJECT_TAG, TAG, "loginIM"); + activityWelcomeBinding.getRoot().setVisibility(View.GONE); + LoginInfo loginInfo = + LoginInfo.LoginInfoBuilder.loginInfoDefault(account, token) + .withAppKey(DataUtils.readAppKey(this)) + .build(); + IMKitClient.loginIM( + loginInfo, + new LoginCallback() { + @Override + public void onError(int errorCode, @NonNull String errorMsg) { + ToastX.showShortToast( + String.format(getResources().getString(R.string.login_fail), errorCode)); +// ActionConfirmDialog actionConfirmDialog = new ActionConfirmDialog(LoginActivity.this, String.format(getResources().getString(R.string.login_fail), errorCode), false); +// actionConfirmDialog.show(); + } + + @Override + public void onSuccess(@Nullable LoginInfo data) { + + + + DataUtils.set(LoginActivity.this,IMUIKitConfig.LOGIN_ACCOUNT,account); + DataUtils.set(LoginActivity.this,IMUIKitConfig.LOGIN_TOKEN,token); + + showMainActivityAndFinish(); + } + }); + } + + + + public void getAccessToken(String code) { + + Api.getInstance().getAccessToken(IMUIKitConfig.WECHAT_APPID,IMUIKitConfig.WECHAT_SECRET,code,"authorization_code") + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver1() { + @Override + public void onSuccess(WeiXinToken result) { + if (result.getErrcode() == 0) { + getWeiXinUserInfo(result); + } + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast( msg); + } + }); + } + + private void getWeiXinUserInfo(WeiXinToken result) { + + Api.getInstance().getAccessUserInfo(result.getAccess_token(),result.getOpenid()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver1() { + @Override + public void onSuccess(WeiXinInfo o) { + doLogin2(o); + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast( msg); + } + }); + } + + private void doLogin2(WeiXinInfo weiXinInfo) { + weiXinInfo.setDeviceType(0); + weiXinInfo.setDeviceId(GetAndroidUniqueMark.getUniqueId(LoginActivity.this)); + weiXinInfo.setSubstationId(IMUIKitConfig.SUBSTATIONID); + Api.getInstance().wechatLogin(weiXinInfo) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + DataUtils.set(LoginActivity.this,"login_bean",GsonUtils.beanToJSONString(feedbackResp.data)); +// loginIM(o.data.getUser_uid(),token); + + if(TextUtils.isEmpty(feedbackResp.data.getUser().getChatToken())){ + ActionConfirmDialog actionConfirmDialog = new ActionConfirmDialog(LoginActivity.this, getString(R.string.zhbhf_jqsb_txt), false); + actionConfirmDialog.show(); + return; + } + + + loginIM(feedbackResp.data.getUser_uid(),feedbackResp.data.getUser().getChatToken()); + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast( msg); + } + }); + + } + +} diff --git a/app/src/main/java/com/dskj/rbchat/login/PhoneLoginActivity.java b/app/src/main/java/com/dskj/rbchat/login/PhoneLoginActivity.java new file mode 100644 index 0000000..f4e5ceb --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/login/PhoneLoginActivity.java @@ -0,0 +1,546 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.login; + + +import android.app.Activity; +import android.content.Intent; +import android.graphics.Color; +import android.os.Bundle; +import android.os.CountDownTimer; +import android.os.Handler; +import android.text.Html; +import android.text.SpannableStringBuilder; +import android.text.Spanned; +import android.text.TextUtils; +import android.text.method.LinkMovementMethod; +import android.view.MotionEvent; +import android.view.View; +import android.view.inputmethod.InputMethodManager; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; +import androidx.core.text.HtmlCompat; + +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.ActivityPhoneLoginBinding; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.dialog.SelectCountryDialog; +import com.dskj.rbchat.main.MainActivity; +import com.dskj.rbchat.model.CountryBean; +import com.dskj.rbchat.model.LoginBean; +import com.dskj.rbchat.model.PassWordLoginBean; +import com.dskj.rbchat.model.RegisteredBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; + +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.AnimUtil; +import com.dskj.rbchat.utils.AppUtils; +import com.dskj.rbchat.utils.Constant; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GetAndroidUniqueMark; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.netease.nimlib.sdk.auth.LoginInfo; +import com.netease.yunxin.kit.alog.ALog; +import com.netease.yunxin.kit.chatkit.ui.common.RxBus; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.activities.BrowseActivity; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.login.LoginCallback; + +import java.util.HashMap; +import java.util.Map; + +import cn.iwgang.simplifyspan.customspan.CustomClickableSpan; +import cn.iwgang.simplifyspan.other.CustomLinkMovementMethod; +import cn.iwgang.simplifyspan.unit.SpecialClickableUnit; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +/** + * Welcome Page is launch page + */ +public class PhoneLoginActivity extends BaseActivity { + + private static final String TAG = "WelcomeActivity"; + private ActivityPhoneLoginBinding activityWelcomeBinding; + int step = 1; + String passwordCode = null; + CountryBean countryBean; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getWindow().setStatusBarColor(getResources().getColor(R.color.color_fcfcfc)); + getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white)); + + ALog.d(Constant.PROJECT_TAG, TAG, "onCreateView"); + IMApplication.setColdStart(true); + activityWelcomeBinding = ActivityPhoneLoginBinding.inflate(getLayoutInflater()); + setContentView(activityWelcomeBinding.getRoot()); + myCountDownTimer = new MyCountDownTimer(60000, 1000); + + activityWelcomeBinding.aboutTitleBar.setOnBackIconClickListener(v -> { + onBackPressed(); + }); + setPrivacyContent(activityWelcomeBinding.mobileTipsTv); + + countryBean = DataUtils.getLocCountry(PhoneLoginActivity.this); + changeArea(); + activityWelcomeBinding.areaTv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + SelectCountryDialog selectCountryDialog = new SelectCountryDialog(PhoneLoginActivity.this); + selectCountryDialog.setOnToVipListener(new SelectCountryDialog.OnToTypeListener() { + @Override + public void toType(CountryBean type) { + countryBean = type; + changeArea(); + DataUtils.set(PhoneLoginActivity.this, IMUIKitConfig.LOC_COUNTRY_CODE, type.getAreaCodeName()); + } + }); + selectCountryDialog.show(); + } + }); + activityWelcomeBinding.nextIv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (AppUtils.isDoubleClick()) { + return; + } + if (step == 1) { + if (TextUtils.isEmpty(activityWelcomeBinding.phoneEt.getText().toString().trim())) { + ToastX.showShortToast(R.string.sjhbnwk_txt); + return; + } + hideSoftInput(PhoneLoginActivity.this); + checkPhone(); + + } else if (step == 2) { + if (TextUtils.isEmpty(activityWelcomeBinding.passwordEt.getText().toString().trim())) { + ToastX.showShortToast(R.string.mimabunengweikong_txt); + return; + } +// checkPhone(); + doLogin(); + } else { + if (TextUtils.isEmpty(passwordCode)) { + ToastX.showShortToast(R.string.dxyzmbnwk_txt); + return; + } + doLogin1(); + } + } + }); + activityWelcomeBinding.changeSmsCodeTv.setOnClickListener(v -> { + step = 3; + hideSoftInput(this); + activityWelcomeBinding.smsCodeTipsTv.setText(HtmlCompat.fromHtml(String.format(getString(R.string.djfsyzm_txt), + countryBean.getAreaCodeName() + " " + activityWelcomeBinding.phoneEt.getText().toString().trim()),HtmlCompat.FROM_HTML_MODE_LEGACY)); + changeStep(); + }); + + activityWelcomeBinding.changePassTv.setOnClickListener(v -> { + step = 2; + hideSoftInput(this); + changeStep(); + }); + activityWelcomeBinding.passwordEditTextCode.setOnCompleteListener(code -> { + passwordCode = code; + }); + + + activityWelcomeBinding.wangjiTv.setOnClickListener(v -> startActivity(new Intent(PhoneLoginActivity.this, WangjiActivity.class))); + + activityWelcomeBinding.sendSmsTv.setOnClickListener(v -> toStep2()); + + AnimUtil.setAnimViews(activityWelcomeBinding.sendSmsTv, activityWelcomeBinding.changePassTv, + activityWelcomeBinding.nextIv, activityWelcomeBinding.changeSmsCodeTv, activityWelcomeBinding.areaTv); + + } + + public boolean onTouchEvent(MotionEvent event) { + if (null != this.getCurrentFocus()) { + /** + * 点击空白位置 隐藏软键盘 + */ + InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + return mInputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0); + } + return super.onTouchEvent(event); + } + + private void checkPhone() { + hideSoftInput(PhoneLoginActivity.this); + Map maps = new HashMap<>(); + maps.put("phone", String.valueOf(activityWelcomeBinding.phoneEt.getText()).trim()); + maps.put("areaCode", countryBean.getAreaCodeName()); + if (!TextUtils.isEmpty(IMUIKitConfig.SUBSTATIONID)) { + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + } + Api.getInstance().registered(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { + if (feedbackResp.data.isRegistered()) { +// checkVerfyCode(); + new Handler().postDelayed(() -> { + step += 1; + changeStep(); + }, 500); + + } else { + ToastX.showShortToast(R.string.sjhwzcqxzc_txt); + } + + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + ToastX.showShortToast(msg); + } + }); + } + + + /** + * 隐藏软键盘 + */ + public void hideSoftInput(Activity activity) { + InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + if (getCurrentFocus() != null && null != imm) { + imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0); + } +// View view = activity.getCurrentFocus(); +// +// if (view != null) { +// +// InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE); +// +// inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); +// +// } + } + + private void toStep2() { + hideSoftInput(PhoneLoginActivity.this); + Map maps = new HashMap<>(); + maps.put("phone", String.valueOf(activityWelcomeBinding.phoneEt.getText()).trim()); + maps.put("areaCode", countryBean.getAreaCodeName()); + if (!TextUtils.isEmpty(IMUIKitConfig.SUBSTATIONID)) { + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + } + Api.getInstance().sendSmsForLogin(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { +// ToastX.showShortToast( feedbackResp.data); + myCountDownTimer.start(); + ActionConfirmDialog actionConfirmDialog = new ActionConfirmDialog(PhoneLoginActivity.this, getString(R.string.yzmyfs_txt), false); + actionConfirmDialog.show(); + activityWelcomeBinding.smsCodeTipsTv.setText(HtmlCompat.fromHtml(String.format(getString(R.string.djfsyzm_txt1), + countryBean.getAreaCodeName() + " " + activityWelcomeBinding.phoneEt.getText().toString().trim()),HtmlCompat.FROM_HTML_MODE_LEGACY)); + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + ToastX.showShortToast(msg); + } + }); + + + } + + MyCountDownTimer myCountDownTimer; + + //倒计时函数 + private class MyCountDownTimer extends CountDownTimer { + + public MyCountDownTimer(long millisInFuture, long countDownInterval) { + super(millisInFuture, countDownInterval); + } + + //计时过程 + @Override + public void onTick(long l) { + //防止计时过程中重复点击 + activityWelcomeBinding.sendSmsTv.setClickable(false); +// activityWelcomeBinding.sendSmsTv.setTextColor(getResources().getColor(R.color.color_adb5bd)); + activityWelcomeBinding.sendSmsTv.setText(String.format(getString(R.string.get_code1_txt), (l / 1000))); + + } + + //计时完毕的方法 + @Override + public void onFinish() { + //重新给Button设置文字 + activityWelcomeBinding.sendSmsTv.setText(R.string.get_code_txt); + //设置可点击 + activityWelcomeBinding.sendSmsTv.setClickable(true); +// activityWelcomeBinding.sendSmsTv.setTextColor(getResources().getColor(R.color.colorAccent)); + + } + } + + + private void checkPhone(boolean isPassword) { + Map maps = new HashMap<>(); + maps.put("phone", String.valueOf(activityWelcomeBinding.passwordEt.getText()).trim()); + maps.put("areaCode", String.valueOf(activityWelcomeBinding.areaTv.getText()).trim()); + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + + Api.getInstance().registered(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { + if (feedbackResp.data.isRegistered()) { + new Handler().postDelayed(() -> { + if (isPassword) { + doLogin(); + } else { + doLogin1(); + } + + }, 500); + } else { + ToastX.showShortToast(R.string.sjhswzcqxzc_txt); + } + + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + ToastX.showShortToast(msg); + + + } + }); + } + + + /** + * 实施登录的方法. + *

+ * 本方法中将判断登录用名和密码的字面合法性(比如不能为空等),然后执行真正的异步登录处理. + */ + private void doLogin() { + + hideSoftInput(PhoneLoginActivity.this); + + String uidOrMail = String.valueOf(activityWelcomeBinding.phoneEt.getText()).trim().toLowerCase(); + String loginPsw = String.valueOf(activityWelcomeBinding.passwordEt.getText()).trim(); + + PassWordLoginBean passWordLoginBean = new PassWordLoginBean(uidOrMail, loginPsw, countryBean.getAreaCodeName(), + 0, GetAndroidUniqueMark.getUniqueId(PhoneLoginActivity.this), IMUIKitConfig.SUBSTATIONID); +// showLoadingDialog("正在登录……"); + Api.getInstance().passwordLogin(passWordLoginBean) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { + if (TextUtils.isEmpty(feedbackResp.data.getUser().getChatToken())) { + ActionConfirmDialog actionConfirmDialog = new ActionConfirmDialog(PhoneLoginActivity.this, getString(R.string.zhbhf_jqsb_txt), false); + actionConfirmDialog.show(); + return; + } + feedbackResp.data.setIsBiz(feedbackResp.data.getUser().getIsBiz()); + feedbackResp.data.setAllowGiftCoin(feedbackResp.data.getUser().getAllowGiftCoin()); + DataUtils.set(PhoneLoginActivity.this, "login_bean", GsonUtils.beanToJSONString(feedbackResp.data)); + loginIM(feedbackResp.data.getUser_uid(), feedbackResp.data.getUser().getChatToken()); + + } + + @Override + public void onError(int code, String msg) { +// dimessLoadingDialog(); +// LogUtils.i("获取到的错误:" + code + "" + msg); +// WidgetUtils.showToast(LoginActivity.this, msg + "", WidgetUtils.ToastType.ERROR); + ToastX.showShortToast(msg); + + } + }); + } + + private void doLogin1() { + hideSoftInput(this); + Map maps = new HashMap<>(); + maps.put("phone", activityWelcomeBinding.phoneEt.getText().toString()); + maps.put("areaCode", countryBean.getAreaCodeName()); + maps.put("verifyCode", String.valueOf(passwordCode)); + maps.put("deviceType", 0); + maps.put("deviceId", GetAndroidUniqueMark.getUniqueId(PhoneLoginActivity.this)); + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + + Api.getInstance().smsLogin(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result feedbackResp) { + + if (TextUtils.isEmpty(feedbackResp.data.getUser().getChatToken())) { + ActionConfirmDialog actionConfirmDialog = new ActionConfirmDialog(PhoneLoginActivity.this, getString(R.string.zhbhf_jqsb_txt), false); + actionConfirmDialog.show(); + return; + } + feedbackResp.data.setIsBiz(feedbackResp.data.getUser().getIsBiz()); + feedbackResp.data.setAllowGiftCoin(feedbackResp.data.getUser().getAllowGiftCoin()); + DataUtils.set(PhoneLoginActivity.this, "login_bean", GsonUtils.beanToJSONString(feedbackResp.data)); +// loginIM(o.data.getUser_uid(), o.data.getChatToken()); + LogUtils.i("用户信息:" + feedbackResp.data.getUser_uid() + ";;" + feedbackResp.data.getUser().getChatToken()); + loginIM(feedbackResp.data.getUser_uid(), feedbackResp.data.getUser().getChatToken()); + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast(msg); + } + }); + + } + + + @Override + public void onBackPressed() { + if (step == 1) { + super.onBackPressed(); + } else { + step = 1; + changeStep(); + } + } + + private void changeStep() { + hideSoftInput(PhoneLoginActivity.this); + + switch (step) { + case 1: + activityWelcomeBinding.step1Ly.setVisibility(View.VISIBLE); + activityWelcomeBinding.step2Ly.setVisibility(View.GONE); + activityWelcomeBinding.step3Ly.setVisibility(View.GONE); + activityWelcomeBinding.changeSmsCodeTv.setVisibility(View.GONE); + activityWelcomeBinding.changePassTv.setVisibility(View.GONE); + break; + case 2: + activityWelcomeBinding.step1Ly.setVisibility(View.GONE); + activityWelcomeBinding.step2Ly.setVisibility(View.VISIBLE); + activityWelcomeBinding.step3Ly.setVisibility(View.GONE); + activityWelcomeBinding.changeSmsCodeTv.setVisibility(View.VISIBLE); + activityWelcomeBinding.changePassTv.setVisibility(View.GONE); + break; + case 3: + activityWelcomeBinding.step1Ly.setVisibility(View.GONE); + activityWelcomeBinding.step2Ly.setVisibility(View.GONE); + activityWelcomeBinding.step3Ly.setVisibility(View.VISIBLE); + activityWelcomeBinding.changeSmsCodeTv.setVisibility(View.GONE); + activityWelcomeBinding.changePassTv.setVisibility(View.VISIBLE); + break; + } + } + + private void changeArea() { + activityWelcomeBinding.areaTv.setText(countryBean.getAreaCodeName()); + } + + private void showMainActivityAndFinish() { + ALog.d(Constant.PROJECT_TAG, TAG, "showMainActivityAndFinish"); + RxBus.getInstance().post(117765); //5秒 + + Intent intent = new Intent(); + intent.setClass(this, MainActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); + this.startActivity(intent); + finish(); + } + + + private void loginIM(String account, String token) { + ALog.d(Constant.PROJECT_TAG, TAG, "loginIM"); +// activityWelcomeBinding.getRoot().setVisibility(View.GONE); + LoginInfo loginInfo = + LoginInfo.LoginInfoBuilder.loginInfoDefault(account, token) + .withAppKey(DataUtils.readAppKey(this)) + .build(); + IMKitClient.loginIM( + loginInfo, + new LoginCallback() { + @Override + public void onError(int errorCode, @NonNull String errorMsg) { + ToastX.showShortToast( + String.format(getResources().getString(R.string.login_fail), errorCode)); + } + + @Override + public void onSuccess(@Nullable LoginInfo data) { + DataUtils.set(PhoneLoginActivity.this, IMUIKitConfig.LOGIN_ACCOUNT, account); + DataUtils.set(PhoneLoginActivity.this, IMUIKitConfig.LOGIN_TOKEN, token); + + showMainActivityAndFinish(); + } + }); + } + + private void setPrivacyContent(TextView contentView) { + + SpannableStringBuilder stringBuilder = new SpannableStringBuilder(getString(R.string.denglujitongyi_txt)); + + int len = stringBuilder.length(); + + stringBuilder.append(getString(R.string.fuwuxieyi_txt)); + + SpecialClickableUnit unit = new SpecialClickableUnit(contentView, + (tv, clickableSpan) -> { + BrowseActivity.Companion.launch( + PhoneLoginActivity.this, getString(R.string.fuwuxieyi_txt), IMUIKitConfig.RBCHAT_PRIVACY_CN_URL); + }); + unit.setNormalTextColor(ContextCompat.getColor(contentView.getContext(), R.color.color_fe6881)); + unit.setPressTextColor(ContextCompat.getColor(contentView.getContext(), R.color.color_fe6881)); + unit.showUnderline(); + CustomClickableSpan customClickableSpan = new CustomClickableSpan(unit); + stringBuilder.setSpan(customClickableSpan, len, stringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + stringBuilder.append(getString(R.string.yiji_txt)); + len = stringBuilder.length(); + stringBuilder.append(getString(R.string.yinsizhengche_txt)); + SpecialClickableUnit unit1 = new SpecialClickableUnit(contentView, + (tv, clickableSpan) -> { + BrowseActivity.Companion.launch( + PhoneLoginActivity.this, getString(R.string.yinsizhengche_txt), IMUIKitConfig.RBCHAT_PRIVACY_CN_URL); + }); + unit1.setNormalTextColor(ContextCompat.getColor(contentView.getContext(), R.color.color_fe6881)); + unit1.setPressTextColor(ContextCompat.getColor(contentView.getContext(), R.color.color_fe6881)); + unit1.showUnderline(); + CustomClickableSpan customClickableSpan1 = new CustomClickableSpan(unit1); + stringBuilder.setSpan(customClickableSpan1, len, stringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + + contentView.setText(stringBuilder); + contentView.setClickable(false); + contentView.setMovementMethod(CustomLinkMovementMethod.getInstance());//不设置 没有点击事件 + contentView.setHighlightColor(Color.TRANSPARENT); //设置点击后的颜色为透明 + contentView.setMovementMethod(LinkMovementMethod.getInstance());//不设置点击会失效 + + } + +} diff --git a/app/src/main/java/com/dskj/rbchat/login/RegisterActivity.java b/app/src/main/java/com/dskj/rbchat/login/RegisterActivity.java new file mode 100644 index 0000000..86fad16 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/login/RegisterActivity.java @@ -0,0 +1,1024 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.login; + + +import static com.netease.yunxin.kit.chatkit.ui.ChatKitUIConstant.LIB_TAG; + +import android.Manifest; +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.graphics.Bitmap; +import android.graphics.Color; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.os.CountDownTimer; +import android.os.Handler; +import android.text.Html; +import android.text.SpannableStringBuilder; +import android.text.Spanned; +import android.text.TextUtils; +import android.text.method.LinkMovementMethod; +import android.view.MotionEvent; +import android.view.View; +import android.view.inputmethod.InputMethodManager; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; +import androidx.core.content.ContextCompat; +import androidx.fragment.app.Fragment; + +import com.alibaba.sdk.android.oss.ClientException; +import com.alibaba.sdk.android.oss.OSSClient; +import com.alibaba.sdk.android.oss.ServiceException; +import com.alibaba.sdk.android.oss.callback.OSSCompletedCallback; +import com.alibaba.sdk.android.oss.common.auth.OSSCredentialProvider; +import com.alibaba.sdk.android.oss.common.auth.OSSStsTokenCredentialProvider; +import com.alibaba.sdk.android.oss.model.PutObjectRequest; +import com.alibaba.sdk.android.oss.model.PutObjectResult; +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.bumptech.glide.request.RequestOptions; +import com.bumptech.glide.request.target.CustomTarget; +import com.bumptech.glide.request.transition.Transition; +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.ActivityPhoneLoginBinding; +import com.dskj.rbchat.databinding.ActivityRegisterBinding; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.dialog.SelectCountryDialog; +import com.dskj.rbchat.main.MainActivity; +import com.dskj.rbchat.model.AvaterBean; +import com.dskj.rbchat.model.CountryBean; +import com.dskj.rbchat.model.LoginBean; +import com.dskj.rbchat.model.PassWordLoginBean; +import com.dskj.rbchat.model.RegisteredBean; +import com.dskj.rbchat.model.StsCredentialsBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.AnimUtil; +import com.dskj.rbchat.utils.AppUtils; +import com.dskj.rbchat.utils.Constant; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GetAndroidUniqueMark; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.luck.picture.lib.basic.PictureSelector; +import com.luck.picture.lib.config.PictureMimeType; +import com.luck.picture.lib.config.SelectMimeType; +import com.luck.picture.lib.engine.CropEngine; +import com.luck.picture.lib.engine.CropFileEngine; +import com.luck.picture.lib.entity.LocalMedia; +import com.luck.picture.lib.interfaces.OnResultCallbackListener; +import com.luck.picture.lib.style.BottomNavBarStyle; +import com.luck.picture.lib.style.PictureSelectorStyle; +import com.luck.picture.lib.style.SelectMainStyle; +import com.luck.picture.lib.style.TitleBarStyle; +import com.luck.picture.lib.utils.DateUtils; +import com.luck.picture.lib.utils.StyleUtils; +import com.netease.nimlib.sdk.auth.LoginInfo; +import com.netease.yunxin.kit.alog.ALog; +import com.netease.yunxin.kit.chatkit.ui.common.GlideEngine; +import com.netease.yunxin.kit.chatkit.ui.common.RxBus; +import com.netease.yunxin.kit.chatkit.ui.dialog.PermissionExplainDialog; +import com.netease.yunxin.kit.chatkit.ui.page.fragment.ChatBaseFragment; +import com.netease.yunxin.kit.chatkit.ui.view.emoji.StickerManager; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.activities.BrowseActivity; +import com.netease.yunxin.kit.common.ui.dialog.LoadingDialog; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.common.utils.PermissionUtils; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.login.LoginCallback; +import com.yalantis.ucrop.UCrop; +import com.yalantis.ucrop.UCropImageEngine; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import cn.iwgang.simplifyspan.customspan.CustomClickableSpan; +import cn.iwgang.simplifyspan.other.CustomLinkMovementMethod; +import cn.iwgang.simplifyspan.unit.SpecialClickableUnit; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; +import okhttp3.MediaType; +import okhttp3.MultipartBody; +import okhttp3.RequestBody; + +/** + * Welcome Page is launch page + */ +public class RegisterActivity extends BaseActivity { + protected ActivityResultLauncher permissionLauncher; + String passwordCode = null; + + private static final String TAG = "WelcomeActivity"; + private ActivityRegisterBinding activityWelcomeBinding; + int step = 1; + int sexType = 1; + CountryBean countryBean; + String avater = null; + long lastTime =0; + PermissionExplainDialog permissionExplainDialog; + + @RequiresApi(api = Build.VERSION_CODES.M) + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getWindow().setStatusBarColor(getResources().getColor(R.color.color_white)); + getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white)); + + ALog.d(Constant.PROJECT_TAG, TAG, "onCreateView"); + IMApplication.setColdStart(true); + activityWelcomeBinding = ActivityRegisterBinding.inflate(getLayoutInflater()); + setContentView(activityWelcomeBinding.getRoot()); + myCountDownTimer = new MyCountDownTimer(60000, 1000); + + activityWelcomeBinding.aboutTitleBar.setOnBackIconClickListener(v -> { + onBackPressed(); + }); + setPrivacyContent(activityWelcomeBinding.mobileTipsTv); + + countryBean = DataUtils.getLocCountry(RegisterActivity.this); + changeArea(); + activityWelcomeBinding.areaTv.setOnClickListener(v -> { + SelectCountryDialog selectCountryDialog = new SelectCountryDialog(RegisterActivity.this); + selectCountryDialog.setOnToVipListener(new SelectCountryDialog.OnToTypeListener() { + @Override + public void toType(CountryBean type) { + countryBean = type; + changeArea(); + DataUtils.set(RegisterActivity.this, IMUIKitConfig.LOC_COUNTRY_CODE, type.getAreaCodeName()); + } + }); + selectCountryDialog.show(); + }); + activityWelcomeBinding.nextIv.setOnClickListener(v -> { + if(lastTime>0){ + if(System.currentTimeMillis()-lastTime<2000){ + return; + } + } + lastTime = System.currentTimeMillis(); + if (step < 4) { + if (step == 1) { + if (TextUtils.isEmpty(activityWelcomeBinding.phoneEt.getText().toString().trim())) { + ToastX.showShortToast(R.string.sjhbnwk_txt); + return; + } + checkPhone(); + } else if (step == 2) { + if (TextUtils.isEmpty(passwordCode)||passwordCode.length()!=4) { + ToastX.showShortToast(R.string.dxyzmbnwk_txt); + return; + } + checkVerfyCode(); + } else if (step == 3) { + if (TextUtils.isEmpty(activityWelcomeBinding.passwordEt.getText().toString().trim())) { + ToastX.showShortToast(R.string.mimabunengweikong_txt); + return; + } + + if(!DataUtils.checkPassword(activityWelcomeBinding.passwordEt.getText().toString().trim())){ + ToastX.showShortToast(R.string.qjcmmgs_txt); + return; + } + + if(activityWelcomeBinding.passwordEt.getText().toString().trim().length()<8){ + ToastX.showShortToast(R.string.qjcmmgs_txt1); + return; + } + + if (TextUtils.isEmpty(activityWelcomeBinding.passwordEt1.getText().toString().trim())) { + ToastX.showShortToast(R.string.qrmmbnwk_txt); + return; + } + if (!activityWelcomeBinding.passwordEt.getText().toString().trim().equals(activityWelcomeBinding.passwordEt1.getText().toString().trim())) { + ToastX.showShortToast(R.string.mimaquernemimabuyizhi_txt); + return; + } + hideSoftInput(this); + new Handler().postDelayed(() -> { + step += 1; + changeStep(); + }, 500); + } + + } else { + if (TextUtils.isEmpty(activityWelcomeBinding.nicknameEt.getText().toString().trim())) { + ToastX.showShortToast(R.string.nichengbunengweik_txt); + return; + } + hideSoftInput(this); + phoneRegister(); +// loginIM(account, token); + } + }); + activityWelcomeBinding.changeSmsCodeTv.setOnClickListener(v -> { + step = 3; + changeStep(); + }); + + activityWelcomeBinding.changePassTv.setOnClickListener(v -> { + step = 2; + changeStep(); + }); + activityWelcomeBinding.passwordEditTextCode.setOnCompleteListener(code -> { + passwordCode = code; + + }); + + + activityWelcomeBinding.sendSmsTv.setOnClickListener(v -> { + toStep2(); + }); + + activityWelcomeBinding.headRy.setOnClickListener(v -> { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + if (PermissionUtils.hasPermissions( + RegisterActivity.this, Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO)) { + startPickMedia(); + } else { + permissionExplainDialog = new PermissionExplainDialog(this, getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_storage_title), getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_storage_content)); + permissionExplainDialog.show(); + permissionLauncher.launch(new String[]{Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO}); + + } + } else { + if (PermissionUtils.hasPermissions( + RegisterActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE)) { + startPickMedia(); + } else { + permissionExplainDialog = new PermissionExplainDialog(this, getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_storage_title), getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_storage_content)); + permissionExplainDialog.show(); + permissionLauncher.launch(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}); + + } + } + }); + + activityWelcomeBinding.nanIv.setOnClickListener(v -> changeSex(1)); + activityWelcomeBinding.nanTv.setOnClickListener(v -> changeSex(1)); + activityWelcomeBinding.nvIv.setOnClickListener(v -> changeSex(0)); + activityWelcomeBinding.nvTv.setOnClickListener(v -> changeSex(0)); + + AnimUtil.setAnimViews(activityWelcomeBinding.sendSmsTv, activityWelcomeBinding.changePassTv, + activityWelcomeBinding.nextIv, activityWelcomeBinding.changeSmsCodeTv, activityWelcomeBinding.areaTv, + activityWelcomeBinding.headRy, activityWelcomeBinding.nanIv, activityWelcomeBinding.nvIv); + + permissionLauncher = + registerForActivityResult( + new ActivityResultContracts.RequestMultiplePermissions(), + result -> { + if (result != null) { + for (Map.Entry entry : result.entrySet()) { + String permission = entry.getKey().toString(); + boolean grant = (Boolean) entry.getValue(); + if (grant) { + if (TextUtils.equals( + permission, Manifest.permission.READ_EXTERNAL_STORAGE) || TextUtils.equals( + permission, Manifest.permission.READ_MEDIA_IMAGES) || TextUtils.equals( + permission, Manifest.permission.READ_MEDIA_VIDEO)) { + startPickMedia(); + } + } else { + if (shouldShowRequestPermissionRationale(permission)) { + ToastX.showShortToast(getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_deny_tips)); + } else { + ToastX.showShortToast(getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_storage)); + } + } + } + } + + if (permissionExplainDialog != null) { + permissionExplainDialog.dismiss(); + } + + + }); + } + + private void checkVerfyCode() { + Map maps = new HashMap<>(); + maps.put("verifyCode", passwordCode); + maps.put("phone", String.valueOf(activityWelcomeBinding.phoneEt.getText()).trim()); + maps.put("areaCode", countryBean.getAreaCodeName()); + if (!TextUtils.isEmpty(IMUIKitConfig.SUBSTATIONID)) { + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + } + Api.getInstance().preCheckVerifyCode(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { +// dimessLoadingDialog(); + if (feedbackResp.data.isCorrect()) { + new Handler().postDelayed(() -> { + step += 1; + changeStep(); + }, 500); + } else { + ToastX.showShortToast(R.string.yzmbzq_txt); + } + } + + @Override + public void onError(int code, String msg) { +// dimessLoadingDialog(); + LogUtils.i("获取到的错误:" + code + "" + msg); + ToastX.showShortToast( msg); + + + } + }); + } + + private void checkPhone() { + hideSoftInput(RegisterActivity.this); + Map maps = new HashMap<>(); + maps.put("phone", String.valueOf(activityWelcomeBinding.phoneEt.getText()).trim()); + maps.put("areaCode", countryBean.getAreaCodeName()); + if (!TextUtils.isEmpty(IMUIKitConfig.SUBSTATIONID)) { + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + } + Api.getInstance().registered(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { + if (!feedbackResp.data.isRegistered()) { +// checkVerfyCode(); + new Handler().postDelayed(() -> { + step += 1; + changeStep(); + }, 500); + + } else { + ToastX.showShortToast(R.string.yzczjdl_txt); + } + + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + ToastX.showShortToast(msg); + } + }); + } + + + private void phoneRegister() { + Map maps = new HashMap<>(); + maps.put("phone", String.valueOf(activityWelcomeBinding.phoneEt.getText()).trim()); + maps.put("areaCode", countryBean.getAreaCodeName()); + maps.put("nickname", activityWelcomeBinding.nicknameEt.getText().toString().trim()); + maps.put("password", activityWelcomeBinding.passwordEt.getText().toString().trim()); + maps.put("verifyCode", passwordCode); + if (!TextUtils.isEmpty(avater)) { + maps.put("avatar", avater); + } + maps.put("sex", sexType); + + if(!TextUtils.isEmpty(IMUIKitConfig.SUBSTATIONID)) { + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + } + Api.getInstance().phoneRegister(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result feedbackResp) { + doLogin(); + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + ToastX.showShortToast(msg); + } + }); + + + } + + /** + * 实施登录的方法. + *

+ * 本方法中将判断登录用名和密码的字面合法性(比如不能为空等),然后执行真正的异步登录处理. + * + */ + private void doLogin() { + + String uidOrMail = String.valueOf(activityWelcomeBinding.phoneEt.getText()).trim().toLowerCase(); + String loginPsw = String.valueOf(activityWelcomeBinding.passwordEt.getText()).trim(); + + PassWordLoginBean passWordLoginBean = new PassWordLoginBean(uidOrMail, loginPsw, countryBean.getAreaCodeName(), 0, + GetAndroidUniqueMark.getUniqueId(RegisterActivity.this),IMUIKitConfig.SUBSTATIONID); + if(TextUtils.isEmpty(IMUIKitConfig.SUBSTATIONID)){ + passWordLoginBean = new PassWordLoginBean(uidOrMail, loginPsw, countryBean.getAreaCodeName(), 0, + GetAndroidUniqueMark.getUniqueId(RegisterActivity.this)); + } + Api.getInstance().passwordLogin(passWordLoginBean) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + + @Override + public void onSuccess(Result feedbackResp) { + + if(TextUtils.isEmpty(feedbackResp.data.getUser().getChatToken())){ + ActionConfirmDialog actionConfirmDialog = new ActionConfirmDialog(RegisterActivity.this, getString(R.string.zhbhf_jqsb_txt), false); + actionConfirmDialog.show(); + return; + } + + DataUtils.set(RegisterActivity.this,"login_bean", GsonUtils.beanToJSONString(feedbackResp.data)); + + loginIM(feedbackResp.data.getUser_uid(),feedbackResp.data.getUser().getChatToken()); + } + + @Override + public void onError(int code, String msg) { +// dimessLoadingDialog(); + LogUtils.i("获取到的错误:" + code + "" + msg); + ToastX.showShortToast( msg); + + + } + }); + } + + +// +// AvaterBean avaterBean = null; +// +// private void updateImage(File file) { +// RequestBody imageBody = RequestBody.create(MediaType.parse("multipart/form-data"), file); +// MultipartBody.Part imageBodyPart = MultipartBody.Part.createFormData("file", file.getName(), imageBody); +// Api.getInstance().uploadUserAvatar(imageBodyPart) +// .subscribeOn(Schedulers.io()) +// .observeOn(AndroidSchedulers.mainThread()) +// .subscribe(new BaseObserver>() { +// +// @Override +// public void onSuccess(Result feedbackResp) { +// avaterBean = feedbackResp.data; +// } +// +// @Override +// public void onError(int code, String msg) { +// } +// }); +// } + + + private void toStep2() { + hideSoftInput(RegisterActivity.this); + Map maps = new HashMap<>(); + maps.put("phone", String.valueOf(activityWelcomeBinding.phoneEt.getText()).trim()); + maps.put("areaCode", countryBean.getAreaCodeName()); + if (!TextUtils.isEmpty(IMUIKitConfig.SUBSTATIONID)) { + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + } + Api.getInstance().sendSmsForRegister(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { + myCountDownTimer.start(); + ActionConfirmDialog actionConfirmDialog = new ActionConfirmDialog(RegisterActivity.this, getString(R.string.yzmyfs_txt), false); + actionConfirmDialog.show(); + activityWelcomeBinding.sendSmsTipsTv.setText(Html.fromHtml(String.format(getString(R.string.djfsyzm_txt1), + countryBean.getAreaCodeName()+" "+activityWelcomeBinding.phoneEt.getText().toString().trim()))); + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + ToastX.showShortToast(msg); + } + }); + + + } + + + MyCountDownTimer myCountDownTimer; + + //倒计时函数 + private class MyCountDownTimer extends CountDownTimer { + + public MyCountDownTimer(long millisInFuture, long countDownInterval) { + super(millisInFuture, countDownInterval); + } + + //计时过程 + @Override + public void onTick(long l) { + //防止计时过程中重复点击 + activityWelcomeBinding.sendSmsTv.setClickable(false); +// getcodeTv.setTextColor(getResources().getColor(R.color.color_adb5bd)); + activityWelcomeBinding.sendSmsTv.setText(String.format(getString(R.string.get_code1_txt), (l / 1000))); + + } + + //计时完毕的方法 + @Override + public void onFinish() { + //重新给Button设置文字 + activityWelcomeBinding.sendSmsTv.setText(R.string.get_code_txt); + //设置可点击 + activityWelcomeBinding.sendSmsTv.setClickable(true); +// getcodeTv.setTextColor(getResources().getColor(R.color.colorAccent)); + + } + } + + + /** + * 隐藏软键盘 + */ + public void hideSoftInput(Activity activity) { + InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + if (getCurrentFocus() != null && null != imm) { + imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0); + } +// View view = activity.getCurrentFocus(); +// +// if (view != null) { +// +// InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE); +// +// inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); +// +// } + } + + + private void changeSex(int i) { + sexType = i; + activityWelcomeBinding.nanIv.setImageResource(R.mipmap.nan_img_f); + activityWelcomeBinding.nvIv.setImageResource(R.mipmap.nv_img_f); + if (i == 1) { + activityWelcomeBinding.nanIv.setImageResource(R.mipmap.nan_img_t); + } else { + activityWelcomeBinding.nvIv.setImageResource(R.mipmap.nv_img_t); + } + } + + @Override + public void onBackPressed() { + if (step == 1) { + super.onBackPressed(); + } else { + step -= 1; + changeStep(); + } + } + + private void changeStep() { + switch (step) { + case 1: + activityWelcomeBinding.step1Ly.setVisibility(View.VISIBLE); + activityWelcomeBinding.step2Ly.setVisibility(View.GONE); + activityWelcomeBinding.step3Ly.setVisibility(View.GONE); + activityWelcomeBinding.step4Ly.setVisibility(View.GONE); + activityWelcomeBinding.changeSmsCodeTv.setVisibility(View.GONE); + activityWelcomeBinding.changePassTv.setVisibility(View.GONE); + break; + case 2: + activityWelcomeBinding.step1Ly.setVisibility(View.GONE); + activityWelcomeBinding.step2Ly.setVisibility(View.GONE); + activityWelcomeBinding.step3Ly.setVisibility(View.VISIBLE); + activityWelcomeBinding.step4Ly.setVisibility(View.GONE); + activityWelcomeBinding.changeSmsCodeTv.setVisibility(View.GONE); + activityWelcomeBinding.changePassTv.setVisibility(View.GONE); + activityWelcomeBinding.sendSmsTipsTv.setText(Html.fromHtml(String.format(getString(R.string.djfsyzm_txt), + countryBean.getAreaCodeName()+" "+activityWelcomeBinding.phoneEt.getText().toString().trim()))); + break; + case 3: + activityWelcomeBinding.step1Ly.setVisibility(View.GONE); + activityWelcomeBinding.step2Ly.setVisibility(View.VISIBLE); + activityWelcomeBinding.step3Ly.setVisibility(View.GONE); + activityWelcomeBinding.step4Ly.setVisibility(View.GONE); + activityWelcomeBinding.changeSmsCodeTv.setVisibility(View.GONE); + activityWelcomeBinding.changePassTv.setVisibility(View.GONE); + break; + + case 4: + activityWelcomeBinding.step1Ly.setVisibility(View.GONE); + activityWelcomeBinding.step2Ly.setVisibility(View.GONE); + activityWelcomeBinding.step3Ly.setVisibility(View.GONE); + activityWelcomeBinding.step4Ly.setVisibility(View.VISIBLE); + activityWelcomeBinding.changeSmsCodeTv.setVisibility(View.GONE); + activityWelcomeBinding.changePassTv.setVisibility(View.GONE); + break; + } + } + + PictureSelectorStyle selectorStyle; + LocalMedia localMedia = null; + + protected void startPickMedia() { +// pickMediaLauncher.launch("image/*;video/*"); + + TitleBarStyle whiteTitleBarStyle = new TitleBarStyle(); + whiteTitleBarStyle.setTitleBackgroundColor(ContextCompat.getColor(RegisterActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_white)); + whiteTitleBarStyle.setTitleDrawableRightResource(com.netease.yunxin.kit.chatkit.ui.R.drawable.ic_orange_arrow_down); + whiteTitleBarStyle.setTitleLeftBackResource(com.netease.yunxin.kit.common.ui.R.drawable.ic_back); + whiteTitleBarStyle.setTitleTextColor(ContextCompat.getColor(RegisterActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_black)); + whiteTitleBarStyle.setTitleCancelTextColor(ContextCompat.getColor(RegisterActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_53575e)); + whiteTitleBarStyle.setDisplayTitleBarLine(true); + + BottomNavBarStyle whiteBottomNavBarStyle = new BottomNavBarStyle(); + whiteBottomNavBarStyle.setBottomNarBarBackgroundColor(Color.parseColor("#FFFFFF")); + whiteBottomNavBarStyle.setBottomPreviewSelectTextColor(ContextCompat.getColor(RegisterActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_53575e)); + + whiteBottomNavBarStyle.setBottomPreviewNormalTextColor(ContextCompat.getColor(RegisterActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_9b)); + whiteBottomNavBarStyle.setBottomPreviewSelectTextColor(ContextCompat.getColor(RegisterActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.color_222222)); + whiteBottomNavBarStyle.setCompleteCountTips(false); + whiteBottomNavBarStyle.setBottomEditorTextColor(ContextCompat.getColor(RegisterActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_53575e)); + whiteBottomNavBarStyle.setBottomOriginalTextColor(ContextCompat.getColor(RegisterActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_53575e)); + + SelectMainStyle selectMainStyle = new SelectMainStyle(); + selectMainStyle.setStatusBarColor(ContextCompat.getColor(RegisterActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_white)); + selectMainStyle.setDarkStatusBarBlack(true); + selectMainStyle.setSelectNormalTextColor(ContextCompat.getColor(RegisterActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_9b)); + selectMainStyle.setSelectTextColor(ContextCompat.getColor(RegisterActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.color_222222)); + selectMainStyle.setPreviewSelectBackground(com.netease.yunxin.kit.chatkit.ui.R.drawable.ps_demo_white_preview_selector); + selectMainStyle.setSelectBackground(com.netease.yunxin.kit.chatkit.ui.R.drawable.ps_checkbox_selector); +// selectMainStyle.setSelectText(R.string.ps_done_front_num); + selectMainStyle.setMainListBackgroundColor(ContextCompat.getColor(RegisterActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_white)); + selectorStyle = new PictureSelectorStyle(); + selectorStyle.setTitleBarStyle(whiteTitleBarStyle); + selectorStyle.setBottomBarStyle(whiteBottomNavBarStyle); + selectorStyle.setSelectMainStyle(selectMainStyle); + + + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .setImageEngine(GlideEngine.createGlideEngine()) + .setCropEngine(new ImageFileCropEngine()) + .setMaxSelectNum(1) + .setSelectorUIStyle(selectorStyle) + .forResult(new OnResultCallbackListener<>() { + @Override + public void onResult(ArrayList result) { + if (result.size() > 0) { + Glide.with(RegisterActivity.this) + .load(result.get(0).getAvailablePath()) + .apply(new RequestOptions().diskCacheStrategy(DiskCacheStrategy.NONE)) + .into(activityWelcomeBinding.headIv); + localMedia = result.get(0); + toShangchuanAli(new File(result.get(0).getAvailablePath())); +// updateImage(new File(result.get(0).getAvailablePath())); + } + } + + @Override + public void onCancel() { + + } + }); + + } + + + /** + * 自定义裁剪 + */ + private class ImageFileCropEngine implements CropFileEngine { + + @Override + public void onStartCrop(Fragment fragment, Uri srcUri, Uri destinationUri, ArrayList dataSource, int requestCode) { + UCrop.Options options = buildOptions(); + UCrop uCrop = UCrop.of(srcUri, destinationUri, dataSource); + uCrop.withOptions(options); + uCrop.setImageEngine(new UCropImageEngine() { + @Override + public void loadImage(Context context, String url, ImageView imageView) { + if (!AppUtils.assertValidRequest(context)) { + return; + } + Glide.with(context).load(url).override(180, 180).into(imageView); + } + + @Override + public void loadImage(Context context, Uri url, int maxWidth, int maxHeight, OnCallbackListener call) { + Glide.with(context).asBitmap().load(url).override(maxWidth, maxHeight).into(new CustomTarget() { + @Override + public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition transition) { + if (call != null) { + call.onCall(resource); + } + } + + @Override + public void onLoadCleared(@Nullable Drawable placeholder) { + if (call != null) { + call.onCall(null); + } + } + }); + } + }); + uCrop.start(fragment.requireActivity(), fragment, requestCode); + } + } + + /** + * 配制UCrop,可根据需求自我扩展 + * + * @return + */ + private UCrop.Options buildOptions() { + UCrop.Options options = new UCrop.Options(); + options.setHideBottomControls(false); + options.setFreeStyleCropEnabled(true); + options.setShowCropFrame(true); + options.setShowCropGrid(true); + options.setCircleDimmedLayer(false); + options.withAspectRatio(1, 1); + options.setCropOutputPathDir(getSandboxPath()); + options.isCropDragSmoothToCenter(false); + options.setSkipCropMimeType(new String[]{PictureMimeType.ofGIF(), PictureMimeType.ofWEBP()}); + options.isForbidCropGifWebp(true); + options.isForbidSkipMultipleCrop(true); + options.setMaxScaleMultiplier(100); + if (selectorStyle != null && selectorStyle.getSelectMainStyle().getStatusBarColor() != 0) { + SelectMainStyle mainStyle = selectorStyle.getSelectMainStyle(); + boolean isDarkStatusBarBlack = mainStyle.isDarkStatusBarBlack(); + int statusBarColor = mainStyle.getStatusBarColor(); + options.isDarkStatusBarBlack(isDarkStatusBarBlack); + if (StyleUtils.checkStyleValidity(statusBarColor)) { + options.setStatusBarColor(statusBarColor); + options.setToolbarColor(statusBarColor); + } else { + options.setStatusBarColor(ContextCompat.getColor(RegisterActivity.this, R.color.ps_color_grey)); + options.setToolbarColor(ContextCompat.getColor(RegisterActivity.this, R.color.ps_color_grey)); + } + TitleBarStyle titleBarStyle = selectorStyle.getTitleBarStyle(); + if (StyleUtils.checkStyleValidity(titleBarStyle.getTitleTextColor())) { + options.setToolbarWidgetColor(titleBarStyle.getTitleTextColor()); + } else { + options.setToolbarWidgetColor(ContextCompat.getColor(RegisterActivity.this, R.color.ps_color_white)); + } + } else { + options.setStatusBarColor(ContextCompat.getColor(RegisterActivity.this, R.color.ps_color_grey)); + options.setToolbarColor(ContextCompat.getColor(RegisterActivity.this, R.color.ps_color_grey)); + options.setToolbarWidgetColor(ContextCompat.getColor(RegisterActivity.this, R.color.ps_color_white)); + } + return options; + } + + /** + * 创建自定义输出目录 + * + * @return + */ + private String getSandboxPath() { + File externalFilesDir = getExternalFilesDir(""); + File customFile = new File(externalFilesDir.getAbsolutePath(), "Sandbox"); + if (!customFile.exists()) { + customFile.mkdirs(); + } + return customFile.getAbsolutePath() + File.separator; + } + + + private void changeArea() { + activityWelcomeBinding.areaTv.setText(countryBean.getAreaCodeName()); + } + + private void showMainActivityAndFinish() { + ALog.d(Constant.PROJECT_TAG, TAG, "showMainActivityAndFinish"); + RxBus.getInstance().post(117765); //5秒 + + Intent intent = new Intent(); + intent.setClass(this, MainActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); + this.startActivity(intent); + finish(); + } + + + private void loginIM(String account, String token) { + ALog.d(Constant.PROJECT_TAG, TAG, "loginIM"); + activityWelcomeBinding.getRoot().setVisibility(View.GONE); + LoginInfo loginInfo = + LoginInfo.LoginInfoBuilder.loginInfoDefault(account, token) + .withAppKey(DataUtils.readAppKey(this)) + .build(); + IMKitClient.loginIM( + loginInfo, + new LoginCallback() { + @Override + public void onError(int errorCode, @NonNull String errorMsg) { + ToastX.showShortToast( + String.format(getResources().getString(R.string.login_fail), errorCode)); + } + + @Override + public void onSuccess(@Nullable LoginInfo data) { + DataUtils.set(RegisterActivity.this, IMUIKitConfig.LOGIN_ACCOUNT, account); + DataUtils.set(RegisterActivity.this, IMUIKitConfig.LOGIN_TOKEN, token); + showMainActivityAndFinish(); + } + }); + } + + private void setPrivacyContent(TextView contentView) { + + SpannableStringBuilder stringBuilder = new SpannableStringBuilder(getString(R.string.denglujitongyi_txt)); + + int len = stringBuilder.length(); + + stringBuilder.append(getString(R.string.fuwuxieyi_txt)); + + SpecialClickableUnit unit = new SpecialClickableUnit(contentView, + (tv, clickableSpan) -> { + BrowseActivity.Companion.launch( + RegisterActivity.this, getString(R.string.fuwuxieyi_txt), IMUIKitConfig.RBCHAT_SERVICE_CN_URL); + }); + unit.setNormalTextColor(ContextCompat.getColor(RegisterActivity.this, R.color.color_7f7b81)); + unit.setPressTextColor(ContextCompat.getColor(RegisterActivity.this, R.color.color_7f7b81)); + unit.showUnderline(); + CustomClickableSpan customClickableSpan = new CustomClickableSpan(unit); + stringBuilder.setSpan(customClickableSpan, len, stringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + stringBuilder.append(getString(R.string.yiji_txt)); + len = stringBuilder.length(); + stringBuilder.append(getString(R.string.yinsizhengche_txt)); + SpecialClickableUnit unit1 = new SpecialClickableUnit(contentView, + (tv, clickableSpan) -> { + BrowseActivity.Companion.launch( + RegisterActivity.this, getString(R.string.yinsizhengche_txt), IMUIKitConfig.RBCHAT_PRIVACY_CN_URL); + }); + unit1.setNormalTextColor(ContextCompat.getColor(RegisterActivity.this, R.color.color_7f7b81)); + unit1.setPressTextColor(ContextCompat.getColor(RegisterActivity.this, R.color.color_7f7b81)); + unit1.showUnderline(); + CustomClickableSpan customClickableSpan1 = new CustomClickableSpan(unit1); + stringBuilder.setSpan(customClickableSpan1, len, stringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + + contentView.setText(stringBuilder); + contentView.setClickable(false); + contentView.setMovementMethod(CustomLinkMovementMethod.getInstance());//不设置 没有点击事件 + contentView.setHighlightColor(Color.TRANSPARENT); //设置点击后的颜色为透明 + contentView.setMovementMethod(LinkMovementMethod.getInstance());//不设置点击会失效 + + } + + + + StsCredentialsBean stsCredentialsBean; + + private void toShangchuanAli(File file ) { + showLoadingDialog(); + Api.getInstance().stsCredentials() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + stsCredentialsBean = feedbackResp.data; + toAliYunOss(file); + } + + @Override + public void onError(int code, String msg) { + dimessLoadingDialog(); + } + }); + } + + + private void toAliYunOss(File file ) { + String endpoint = "https://oss-cn-hongkong.aliyuncs.com"; + String accessKeyId = stsCredentialsBean.getAccessKeyId(); + String accessKeySecret = stsCredentialsBean.getAccessKeySecret(); + String securityToken = stsCredentialsBean.getSecurityToken(); + String bucketName = IMUIKitConfig.bucketName; + + OSSCredentialProvider credentialProvider = new OSSStsTokenCredentialProvider(accessKeyId, accessKeySecret, securityToken); + OSSClient oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider); + toUpdateOss(bucketName, 0, oss, file); + + } + public static Handler handler = new Handler(); + + // + private void toUpdateOss(String bucketName, int i, OSSClient oss, File file ) { + LogUtils.i("1111111111111111111"); + String updatePathPicHead = "userAvatarFileName"; + + LogUtils.i("22222222222222222"); + + String fileName = UUID.randomUUID().toString() + "_" + file.getName(); + LogUtils.i("文件地址是啥:" + file.getAbsolutePath()); + LogUtils.i("文件地址是啥1:" + file.getPath()); + + PutObjectRequest put = new PutObjectRequest(bucketName, "media/" + updatePathPicHead + "/" + fileName, file.getAbsolutePath()); + + put.setProgressCallback((request, currentSize, totalSize) -> { + LogUtils.i("PutObject", "currentSize: " + currentSize + " totalSize: " + totalSize); + + }); + LogUtils.i("55555555555555"); + + oss.asyncPutObject(put, new OSSCompletedCallback<>() { + @Override + public void onSuccess(PutObjectRequest request, PutObjectResult result) { + LogUtils.i("PutObject", "UploadSuccess"); + LogUtils.i("ETag", result.getETag()); + LogUtils.i("RequestId", result.getRequestId()); + LogUtils.i("获取到的数据:" + GsonUtils.beanToJSONString(result)); + + handler.post(() -> { + dimessLoadingDialog(); + avater = IMUIKitConfig.OSS_URL+"media/" + updatePathPicHead + "/" + fileName; + }); + } + + @Override + public void onFailure(PutObjectRequest request, ClientException clientExcepion, ServiceException serviceException) { + dimessLoadingDialog(); + LogUtils.i("ErrorCode", clientExcepion.getMessage()); + + // 请求异常。 + if (clientExcepion != null) { + // 本地异常,如网络异常等。 + clientExcepion.printStackTrace(); + } + if (serviceException != null) { + // 服务异常。 + LogUtils.i("ErrorCode", serviceException.getErrorCode()); + LogUtils.i("RequestId", serviceException.getRequestId()); + LogUtils.i("HostId", serviceException.getHostId()); + LogUtils.i("RawMessage", serviceException.getRawMessage()); + } + } + }); +// } + } + + + + + public LoadingDialog loadingDialog; + + public void showLoadingDialog() { + if (loadingDialog == null) + loadingDialog = new LoadingDialog(this); + loadingDialog.show(); + } + + public void showLoadingDialog(String msg) { + if (loadingDialog == null) + loadingDialog = new LoadingDialog(this); + loadingDialog.setLoadingText(msg); + loadingDialog.show(); + } + + + public void dimessLoadingDialog() { + if (loadingDialog != null) { + loadingDialog.dismiss(); + } + + } + public boolean onTouchEvent(MotionEvent event) { + if(null != this.getCurrentFocus()){ + /** + * 点击空白位置 隐藏软键盘 + */ + InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + return mInputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0); + } + return super .onTouchEvent(event); + } + +} diff --git a/app/src/main/java/com/dskj/rbchat/login/RegisterActivityBf.java b/app/src/main/java/com/dskj/rbchat/login/RegisterActivityBf.java new file mode 100644 index 0000000..e0feaf1 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/login/RegisterActivityBf.java @@ -0,0 +1,1054 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.login; + + +import android.Manifest; +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.graphics.Bitmap; +import android.graphics.Color; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.os.CountDownTimer; +import android.os.Handler; +import android.text.Html; +import android.text.SpannableStringBuilder; +import android.text.Spanned; +import android.text.TextUtils; +import android.text.method.LinkMovementMethod; +import android.view.MotionEvent; +import android.view.View; +import android.view.inputmethod.InputMethodManager; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; +import androidx.core.content.ContextCompat; +import androidx.fragment.app.Fragment; + +import com.alibaba.sdk.android.oss.ClientException; +import com.alibaba.sdk.android.oss.OSSClient; +import com.alibaba.sdk.android.oss.ServiceException; +import com.alibaba.sdk.android.oss.callback.OSSCompletedCallback; +import com.alibaba.sdk.android.oss.common.auth.OSSCredentialProvider; +import com.alibaba.sdk.android.oss.common.auth.OSSStsTokenCredentialProvider; +import com.alibaba.sdk.android.oss.model.PutObjectRequest; +import com.alibaba.sdk.android.oss.model.PutObjectResult; +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.bumptech.glide.request.RequestOptions; +import com.bumptech.glide.request.target.CustomTarget; +import com.bumptech.glide.request.transition.Transition; +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.ActivityRegisterBfBinding; +import com.dskj.rbchat.databinding.ActivityRegisterBinding; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.dialog.SelectCountryDialog; +import com.dskj.rbchat.main.MainActivity; +import com.dskj.rbchat.model.CountryBean; +import com.dskj.rbchat.model.LoginBean; +import com.dskj.rbchat.model.PassWordLoginBean; +import com.dskj.rbchat.model.RegisteredBean; +import com.dskj.rbchat.model.StsCredentialsBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.AnimUtil; +import com.dskj.rbchat.utils.AppUtils; +import com.dskj.rbchat.utils.Constant; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GetAndroidUniqueMark; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.utils.TaiWanIDCardUtils; +import com.luck.picture.lib.basic.PictureSelector; +import com.luck.picture.lib.config.PictureMimeType; +import com.luck.picture.lib.config.SelectMimeType; +import com.luck.picture.lib.engine.CropFileEngine; +import com.luck.picture.lib.entity.LocalMedia; +import com.luck.picture.lib.interfaces.OnResultCallbackListener; +import com.luck.picture.lib.style.BottomNavBarStyle; +import com.luck.picture.lib.style.PictureSelectorStyle; +import com.luck.picture.lib.style.SelectMainStyle; +import com.luck.picture.lib.style.TitleBarStyle; +import com.luck.picture.lib.utils.StyleUtils; +import com.netease.nimlib.sdk.auth.LoginInfo; +import com.netease.yunxin.kit.alog.ALog; +import com.netease.yunxin.kit.chatkit.ui.common.GlideEngine; +import com.netease.yunxin.kit.chatkit.ui.dialog.PermissionExplainDialog; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.activities.BrowseActivity; +import com.netease.yunxin.kit.common.ui.dialog.LoadingDialog; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.common.utils.PermissionUtils; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.login.LoginCallback; +import com.yalantis.ucrop.UCrop; +import com.yalantis.ucrop.UCropImageEngine; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +import cn.iwgang.simplifyspan.customspan.CustomClickableSpan; +import cn.iwgang.simplifyspan.other.CustomLinkMovementMethod; +import cn.iwgang.simplifyspan.unit.SpecialClickableUnit; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +/** + * Welcome Page is launch page + */ +@Deprecated +public class RegisterActivityBf extends BaseActivity { + protected ActivityResultLauncher permissionLauncher; + String passwordCode = null; + + private static final String TAG = "WelcomeActivity"; + private ActivityRegisterBfBinding activityWelcomeBinding; + int step = 1; + int sexType = 1; + CountryBean countryBean; + String avater = null; + long lastTime =0; + PermissionExplainDialog permissionExplainDialog; + + @RequiresApi(api = Build.VERSION_CODES.M) + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getWindow().setStatusBarColor(getResources().getColor(R.color.color_white)); + getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white)); + + ALog.d(Constant.PROJECT_TAG, TAG, "onCreateView"); + IMApplication.setColdStart(true); + activityWelcomeBinding = ActivityRegisterBfBinding.inflate(getLayoutInflater()); + setContentView(activityWelcomeBinding.getRoot()); + myCountDownTimer = new MyCountDownTimer(60000, 1000); + + activityWelcomeBinding.aboutTitleBar.setOnBackIconClickListener(v -> { + onBackPressed(); + }); + setPrivacyContent(activityWelcomeBinding.mobileTipsTv); + + countryBean = DataUtils.getLocCountry(RegisterActivityBf.this); + changeArea(); + activityWelcomeBinding.areaTv.setOnClickListener(v -> { + SelectCountryDialog selectCountryDialog = new SelectCountryDialog(RegisterActivityBf.this); + selectCountryDialog.setOnToVipListener(new SelectCountryDialog.OnToTypeListener() { + @Override + public void toType(CountryBean type) { + countryBean = type; + changeArea(); + DataUtils.set(RegisterActivityBf.this, IMUIKitConfig.LOC_COUNTRY_CODE, type.getAreaCodeName()); + } + }); + selectCountryDialog.show(); + }); + activityWelcomeBinding.nextIv.setOnClickListener(v -> { + if(lastTime>0){ + if(System.currentTimeMillis()-lastTime<2000){ + return; + } + } + lastTime = System.currentTimeMillis(); + if (step < 5) { + if (step == 1) { + if (TextUtils.isEmpty(activityWelcomeBinding.phoneEt.getText().toString().trim())) { + ToastX.showShortToast(R.string.sjhbnwk_txt); + return; + } + checkPhone(); + } else if (step == 2) { + if (TextUtils.isEmpty(passwordCode)||passwordCode.length()!=4) { + ToastX.showShortToast(R.string.dxyzmbnwk_txt); + return; + } + checkVerfyCode(); + } else if (step == 3) { + if (TextUtils.isEmpty(activityWelcomeBinding.passwordEt.getText().toString().trim())) { + ToastX.showShortToast(R.string.mimabunengweikong_txt); + return; + } + + if(!DataUtils.checkPassword(activityWelcomeBinding.passwordEt.getText().toString().trim())){ + ToastX.showShortToast(R.string.qjcmmgs_txt); + return; + } + + if(activityWelcomeBinding.passwordEt.getText().toString().trim().length()<8){ + ToastX.showShortToast(R.string.qjcmmgs_txt1); + return; + } + + if (TextUtils.isEmpty(activityWelcomeBinding.passwordEt1.getText().toString().trim())) { + ToastX.showShortToast(R.string.qrmmbnwk_txt); + return; + } + if (!activityWelcomeBinding.passwordEt.getText().toString().trim().equals(activityWelcomeBinding.passwordEt1.getText().toString().trim())) { + ToastX.showShortToast(R.string.mimaquernemimabuyizhi_txt); + return; + } + hideSoftInput(this); + new Handler().postDelayed(() -> { + step += 1; + changeStep(); + }, 500); + }else if (step == 4) { + if (TextUtils.isEmpty(activityWelcomeBinding.nicknameEt.getText().toString().trim())) { + ToastX.showShortToast(R.string.nichengbunengweik_txt); + return; + } + + hideSoftInput(this); + new Handler().postDelayed(() -> { + step += 1; + changeStep(); + }, 500); + } + + } else { + if (TextUtils.isEmpty(activityWelcomeBinding.trueNameEt.getText().toString().trim())) { + ToastX.showShortToast(R.string.zhenshixingmingbunengweik_txt); + return; + } + + if (TextUtils.isEmpty(activityWelcomeBinding.cardNumberEt.getText().toString().trim())) { + ToastX.showShortToast(R.string.shenfenzbunengwiek_txt); + return; + } + + if(!TaiWanIDCardUtils.checkTaiWanIdCardNumber(activityWelcomeBinding.cardNumberEt.getText().toString().trim())){ + ToastX.showShortToast(R.string.qsrzqsfzh_txt); + + return ; + } + + hideSoftInput(this); + phoneRegister(); +// loginIM(account, token); + } + }); + activityWelcomeBinding.changeSmsCodeTv.setOnClickListener(v -> { + step = 3; + changeStep(); + }); + + activityWelcomeBinding.changePassTv.setOnClickListener(v -> { + step = 2; + changeStep(); + }); + activityWelcomeBinding.passwordEditTextCode.setOnCompleteListener(code -> { + passwordCode = code; + + }); + + + activityWelcomeBinding.sendSmsTv.setOnClickListener(v -> { + toStep2(); + }); + + activityWelcomeBinding.headRy.setOnClickListener(v -> { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + if (PermissionUtils.hasPermissions( + RegisterActivityBf.this, Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO)) { + startPickMedia(); + } else { + permissionExplainDialog = new PermissionExplainDialog(this, getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_storage_title), getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_storage_content)); + permissionExplainDialog.show(); + permissionLauncher.launch(new String[]{Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO}); + + } + } else { + if (PermissionUtils.hasPermissions( + RegisterActivityBf.this, Manifest.permission.READ_EXTERNAL_STORAGE)) { + startPickMedia(); + } else { + permissionExplainDialog = new PermissionExplainDialog(this, getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_storage_title), getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_storage_content)); + permissionExplainDialog.show(); + permissionLauncher.launch(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}); + + } + } + }); + + activityWelcomeBinding.nanIv.setOnClickListener(v -> changeSex(1)); + activityWelcomeBinding.nanTv.setOnClickListener(v -> changeSex(1)); + activityWelcomeBinding.nvIv.setOnClickListener(v -> changeSex(0)); + activityWelcomeBinding.nvTv.setOnClickListener(v -> changeSex(0)); + + AnimUtil.setAnimViews(activityWelcomeBinding.sendSmsTv, activityWelcomeBinding.changePassTv, + activityWelcomeBinding.nextIv, activityWelcomeBinding.changeSmsCodeTv, activityWelcomeBinding.areaTv, + activityWelcomeBinding.headRy, activityWelcomeBinding.nanIv, activityWelcomeBinding.nvIv); + + permissionLauncher = + registerForActivityResult( + new ActivityResultContracts.RequestMultiplePermissions(), + result -> { + if (result != null) { + for (Map.Entry entry : result.entrySet()) { + String permission = entry.getKey().toString(); + boolean grant = (Boolean) entry.getValue(); + if (grant) { + if (TextUtils.equals( + permission, Manifest.permission.READ_EXTERNAL_STORAGE) || TextUtils.equals( + permission, Manifest.permission.READ_MEDIA_IMAGES) || TextUtils.equals( + permission, Manifest.permission.READ_MEDIA_VIDEO)) { + startPickMedia(); + } + } else { + if (shouldShowRequestPermissionRationale(permission)) { + ToastX.showShortToast(getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_deny_tips)); + } else { + ToastX.showShortToast(getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_storage)); + } + } + } + } + + if (permissionExplainDialog != null) { + permissionExplainDialog.dismiss(); + } + + + }); + } + + private void checkVerfyCode() { + Map maps = new HashMap<>(); + maps.put("verifyCode", passwordCode); + maps.put("phone", String.valueOf(activityWelcomeBinding.phoneEt.getText()).trim()); + maps.put("areaCode", countryBean.getAreaCodeName()); + if (!TextUtils.isEmpty(IMUIKitConfig.SUBSTATIONID)) { + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + } + Api.getInstance().preCheckVerifyCode(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { +// dimessLoadingDialog(); + if (feedbackResp.data.isCorrect()) { + new Handler().postDelayed(() -> { + step += 1; + changeStep(); + }, 500); + } else { + ToastX.showShortToast(R.string.yzmbzq_txt); + } + } + + @Override + public void onError(int code, String msg) { +// dimessLoadingDialog(); + LogUtils.i("获取到的错误:" + code + "" + msg); + ToastX.showShortToast( msg); + + + } + }); + } + + private void checkPhone() { + hideSoftInput(RegisterActivityBf.this); + Map maps = new HashMap<>(); + maps.put("phone", String.valueOf(activityWelcomeBinding.phoneEt.getText()).trim()); + maps.put("areaCode", countryBean.getAreaCodeName()); + if (!TextUtils.isEmpty(IMUIKitConfig.SUBSTATIONID)) { + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + } + Api.getInstance().registered(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { + if (!feedbackResp.data.isRegistered()) { +// checkVerfyCode(); + new Handler().postDelayed(() -> { + step += 1; + changeStep(); + }, 500); + + } else { + ToastX.showShortToast(R.string.yzczjdl_txt); + } + + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + ToastX.showShortToast(msg); + } + }); + } + + + private void phoneRegister() { + Map maps = new HashMap<>(); + maps.put("phone", String.valueOf(activityWelcomeBinding.phoneEt.getText()).trim()); + maps.put("areaCode", countryBean.getAreaCodeName()); + maps.put("nickname", activityWelcomeBinding.nicknameEt.getText().toString().trim()); + maps.put("password", activityWelcomeBinding.passwordEt.getText().toString().trim()); + maps.put("verifyCode", passwordCode); + if (!TextUtils.isEmpty(avater)) { + maps.put("avatar", avater); + } + maps.put("sex", sexType); + maps.put("realName", activityWelcomeBinding.trueNameEt.getText().toString().trim()); + maps.put("idCard", activityWelcomeBinding.cardNumberEt.getText().toString().trim()); + + if(!TextUtils.isEmpty(IMUIKitConfig.SUBSTATIONID)) { + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + } + Api.getInstance().phoneRegister(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result feedbackResp) { + doLogin(); + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + ToastX.showShortToast(msg); + } + }); + + + } + + /** + * 实施登录的方法. + *

+ * 本方法中将判断登录用名和密码的字面合法性(比如不能为空等),然后执行真正的异步登录处理. + * + */ + private void doLogin() { + + String uidOrMail = String.valueOf(activityWelcomeBinding.phoneEt.getText()).trim().toLowerCase(); + String loginPsw = String.valueOf(activityWelcomeBinding.passwordEt.getText()).trim(); + + PassWordLoginBean passWordLoginBean = new PassWordLoginBean(uidOrMail, loginPsw, countryBean.getAreaCodeName(), 0, + GetAndroidUniqueMark.getUniqueId(RegisterActivityBf.this),IMUIKitConfig.SUBSTATIONID); + if(TextUtils.isEmpty(IMUIKitConfig.SUBSTATIONID)){ + passWordLoginBean = new PassWordLoginBean(uidOrMail, loginPsw, countryBean.getAreaCodeName(), 0, + GetAndroidUniqueMark.getUniqueId(RegisterActivityBf.this)); + } + Api.getInstance().passwordLogin(passWordLoginBean) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + + @Override + public void onSuccess(Result feedbackResp) { + + if(TextUtils.isEmpty(feedbackResp.data.getUser().getChatToken())){ + ActionConfirmDialog actionConfirmDialog = new ActionConfirmDialog(RegisterActivityBf.this, getString(R.string.zhbhf_jqsb_txt), false); + actionConfirmDialog.show(); + return; + } + + DataUtils.set(RegisterActivityBf.this,"login_bean", GsonUtils.beanToJSONString(feedbackResp.data)); + + loginIM(feedbackResp.data.getUser_uid(),feedbackResp.data.getUser().getChatToken()); + } + + @Override + public void onError(int code, String msg) { +// dimessLoadingDialog(); + LogUtils.i("获取到的错误:" + code + "" + msg); + ToastX.showShortToast( msg); + + + } + }); + } + + +// +// AvaterBean avaterBean = null; +// +// private void updateImage(File file) { +// RequestBody imageBody = RequestBody.create(MediaType.parse("multipart/form-data"), file); +// MultipartBody.Part imageBodyPart = MultipartBody.Part.createFormData("file", file.getName(), imageBody); +// Api.getInstance().uploadUserAvatar(imageBodyPart) +// .subscribeOn(Schedulers.io()) +// .observeOn(AndroidSchedulers.mainThread()) +// .subscribe(new BaseObserver>() { +// +// @Override +// public void onSuccess(Result feedbackResp) { +// avaterBean = feedbackResp.data; +// } +// +// @Override +// public void onError(int code, String msg) { +// } +// }); +// } + + + private void toStep2() { + hideSoftInput(RegisterActivityBf.this); + Map maps = new HashMap<>(); + maps.put("phone", String.valueOf(activityWelcomeBinding.phoneEt.getText()).trim()); + maps.put("areaCode", countryBean.getAreaCodeName()); + if (!TextUtils.isEmpty(IMUIKitConfig.SUBSTATIONID)) { + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + } + Api.getInstance().sendSmsForRegister(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { + myCountDownTimer.start(); + ActionConfirmDialog actionConfirmDialog = new ActionConfirmDialog(RegisterActivityBf.this, getString(R.string.yzmyfs_txt), false); + actionConfirmDialog.show(); + activityWelcomeBinding.sendSmsTipsTv.setText(Html.fromHtml(String.format(getString(R.string.djfsyzm_txt1), + countryBean.getAreaCodeName()+" "+activityWelcomeBinding.phoneEt.getText().toString().trim()))); + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + ToastX.showShortToast(msg); + } + }); + + + } + + + MyCountDownTimer myCountDownTimer; + + //倒计时函数 + private class MyCountDownTimer extends CountDownTimer { + + public MyCountDownTimer(long millisInFuture, long countDownInterval) { + super(millisInFuture, countDownInterval); + } + + //计时过程 + @Override + public void onTick(long l) { + //防止计时过程中重复点击 + activityWelcomeBinding.sendSmsTv.setClickable(false); +// getcodeTv.setTextColor(getResources().getColor(R.color.color_adb5bd)); + activityWelcomeBinding.sendSmsTv.setText(String.format(getString(R.string.get_code1_txt), (l / 1000))); + + } + + //计时完毕的方法 + @Override + public void onFinish() { + //重新给Button设置文字 + activityWelcomeBinding.sendSmsTv.setText(R.string.get_code_txt); + //设置可点击 + activityWelcomeBinding.sendSmsTv.setClickable(true); +// getcodeTv.setTextColor(getResources().getColor(R.color.colorAccent)); + + } + } + + + /** + * 隐藏软键盘 + */ + public void hideSoftInput(Activity activity) { + InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + if (getCurrentFocus() != null && null != imm) { + imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0); + } +// View view = activity.getCurrentFocus(); +// +// if (view != null) { +// +// InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE); +// +// inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); +// +// } + } + + + private void changeSex(int i) { + sexType = i; + activityWelcomeBinding.nanIv.setImageResource(R.mipmap.nan_img_f); + activityWelcomeBinding.nvIv.setImageResource(R.mipmap.nv_img_f); + if (i == 1) { + activityWelcomeBinding.nanIv.setImageResource(R.mipmap.nan_img_t); + } else { + activityWelcomeBinding.nvIv.setImageResource(R.mipmap.nv_img_t); + } + } + + @Override + public void onBackPressed() { + if (step == 1) { + super.onBackPressed(); + } else { + step -= 1; + changeStep(); + } + } + + private void changeStep() { + switch (step) { + case 1: + activityWelcomeBinding.step1Ly.setVisibility(View.VISIBLE); + activityWelcomeBinding.step2Ly.setVisibility(View.GONE); + activityWelcomeBinding.step3Ly.setVisibility(View.GONE); + activityWelcomeBinding.step4Ly.setVisibility(View.GONE); + activityWelcomeBinding.changeSmsCodeTv.setVisibility(View.GONE); + activityWelcomeBinding.changePassTv.setVisibility(View.GONE); + activityWelcomeBinding.step5Ly.setVisibility(View.GONE); + break; + case 2: + activityWelcomeBinding.step1Ly.setVisibility(View.GONE); + activityWelcomeBinding.step2Ly.setVisibility(View.GONE); + activityWelcomeBinding.step3Ly.setVisibility(View.VISIBLE); + activityWelcomeBinding.step4Ly.setVisibility(View.GONE); + activityWelcomeBinding.changeSmsCodeTv.setVisibility(View.GONE); + activityWelcomeBinding.changePassTv.setVisibility(View.GONE); + activityWelcomeBinding.sendSmsTipsTv.setText(Html.fromHtml(String.format(getString(R.string.djfsyzm_txt), + countryBean.getAreaCodeName()+" "+activityWelcomeBinding.phoneEt.getText().toString().trim()))); + activityWelcomeBinding.step5Ly.setVisibility(View.GONE); + + break; + case 3: + activityWelcomeBinding.step1Ly.setVisibility(View.GONE); + activityWelcomeBinding.step2Ly.setVisibility(View.VISIBLE); + activityWelcomeBinding.step3Ly.setVisibility(View.GONE); + activityWelcomeBinding.step4Ly.setVisibility(View.GONE); + activityWelcomeBinding.changeSmsCodeTv.setVisibility(View.GONE); + activityWelcomeBinding.changePassTv.setVisibility(View.GONE); + activityWelcomeBinding.step5Ly.setVisibility(View.GONE); + + break; + + case 4: + activityWelcomeBinding.step1Ly.setVisibility(View.GONE); + activityWelcomeBinding.step2Ly.setVisibility(View.GONE); + activityWelcomeBinding.step3Ly.setVisibility(View.GONE); + activityWelcomeBinding.step4Ly.setVisibility(View.VISIBLE); + activityWelcomeBinding.changeSmsCodeTv.setVisibility(View.GONE); + activityWelcomeBinding.changePassTv.setVisibility(View.GONE); + activityWelcomeBinding.step5Ly.setVisibility(View.GONE); + + break; + + case 5: + activityWelcomeBinding.step1Ly.setVisibility(View.GONE); + activityWelcomeBinding.step2Ly.setVisibility(View.GONE); + activityWelcomeBinding.step3Ly.setVisibility(View.GONE); + activityWelcomeBinding.step4Ly.setVisibility(View.GONE); + activityWelcomeBinding.changeSmsCodeTv.setVisibility(View.GONE); + activityWelcomeBinding.changePassTv.setVisibility(View.GONE); + activityWelcomeBinding.step5Ly.setVisibility(View.VISIBLE); + + break; + } + } + + PictureSelectorStyle selectorStyle; + LocalMedia localMedia = null; + + protected void startPickMedia() { +// pickMediaLauncher.launch("image/*;video/*"); + + TitleBarStyle whiteTitleBarStyle = new TitleBarStyle(); + whiteTitleBarStyle.setTitleBackgroundColor(ContextCompat.getColor(RegisterActivityBf.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_white)); + whiteTitleBarStyle.setTitleDrawableRightResource(com.netease.yunxin.kit.chatkit.ui.R.drawable.ic_orange_arrow_down); + whiteTitleBarStyle.setTitleLeftBackResource(com.netease.yunxin.kit.common.ui.R.drawable.ic_back); + whiteTitleBarStyle.setTitleTextColor(ContextCompat.getColor(RegisterActivityBf.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_black)); + whiteTitleBarStyle.setTitleCancelTextColor(ContextCompat.getColor(RegisterActivityBf.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_53575e)); + whiteTitleBarStyle.setDisplayTitleBarLine(true); + + BottomNavBarStyle whiteBottomNavBarStyle = new BottomNavBarStyle(); + whiteBottomNavBarStyle.setBottomNarBarBackgroundColor(Color.parseColor("#FFFFFF")); + whiteBottomNavBarStyle.setBottomPreviewSelectTextColor(ContextCompat.getColor(RegisterActivityBf.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_53575e)); + + whiteBottomNavBarStyle.setBottomPreviewNormalTextColor(ContextCompat.getColor(RegisterActivityBf.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_9b)); + whiteBottomNavBarStyle.setBottomPreviewSelectTextColor(ContextCompat.getColor(RegisterActivityBf.this, com.netease.yunxin.kit.chatkit.ui.R.color.color_222222)); + whiteBottomNavBarStyle.setCompleteCountTips(false); + whiteBottomNavBarStyle.setBottomEditorTextColor(ContextCompat.getColor(RegisterActivityBf.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_53575e)); + whiteBottomNavBarStyle.setBottomOriginalTextColor(ContextCompat.getColor(RegisterActivityBf.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_53575e)); + + SelectMainStyle selectMainStyle = new SelectMainStyle(); + selectMainStyle.setStatusBarColor(ContextCompat.getColor(RegisterActivityBf.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_white)); + selectMainStyle.setDarkStatusBarBlack(true); + selectMainStyle.setSelectNormalTextColor(ContextCompat.getColor(RegisterActivityBf.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_9b)); + selectMainStyle.setSelectTextColor(ContextCompat.getColor(RegisterActivityBf.this, com.netease.yunxin.kit.chatkit.ui.R.color.color_222222)); + selectMainStyle.setPreviewSelectBackground(com.netease.yunxin.kit.chatkit.ui.R.drawable.ps_demo_white_preview_selector); + selectMainStyle.setSelectBackground(com.netease.yunxin.kit.chatkit.ui.R.drawable.ps_checkbox_selector); +// selectMainStyle.setSelectText(R.string.ps_done_front_num); + selectMainStyle.setMainListBackgroundColor(ContextCompat.getColor(RegisterActivityBf.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_white)); + selectorStyle = new PictureSelectorStyle(); + selectorStyle.setTitleBarStyle(whiteTitleBarStyle); + selectorStyle.setBottomBarStyle(whiteBottomNavBarStyle); + selectorStyle.setSelectMainStyle(selectMainStyle); + + + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .setImageEngine(GlideEngine.createGlideEngine()) + .setCropEngine(new ImageFileCropEngine()) + .setMaxSelectNum(1) + .setSelectorUIStyle(selectorStyle) + .forResult(new OnResultCallbackListener<>() { + @Override + public void onResult(ArrayList result) { + if (result.size() > 0) { + Glide.with(RegisterActivityBf.this) + .load(result.get(0).getAvailablePath()) + .apply(new RequestOptions().diskCacheStrategy(DiskCacheStrategy.NONE)) + .into(activityWelcomeBinding.headIv); + localMedia = result.get(0); + toShangchuanAli(new File(result.get(0).getAvailablePath())); +// updateImage(new File(result.get(0).getAvailablePath())); + } + } + + @Override + public void onCancel() { + + } + }); + + } + + + /** + * 自定义裁剪 + */ + private class ImageFileCropEngine implements CropFileEngine { + + @Override + public void onStartCrop(Fragment fragment, Uri srcUri, Uri destinationUri, ArrayList dataSource, int requestCode) { + UCrop.Options options = buildOptions(); + UCrop uCrop = UCrop.of(srcUri, destinationUri, dataSource); + uCrop.withOptions(options); + uCrop.setImageEngine(new UCropImageEngine() { + @Override + public void loadImage(Context context, String url, ImageView imageView) { + if (!AppUtils.assertValidRequest(context)) { + return; + } + Glide.with(context).load(url).override(180, 180).into(imageView); + } + + @Override + public void loadImage(Context context, Uri url, int maxWidth, int maxHeight, OnCallbackListener call) { + Glide.with(context).asBitmap().load(url).override(maxWidth, maxHeight).into(new CustomTarget() { + @Override + public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition transition) { + if (call != null) { + call.onCall(resource); + } + } + + @Override + public void onLoadCleared(@Nullable Drawable placeholder) { + if (call != null) { + call.onCall(null); + } + } + }); + } + }); + uCrop.start(fragment.requireActivity(), fragment, requestCode); + } + } + + /** + * 配制UCrop,可根据需求自我扩展 + * + * @return + */ + private UCrop.Options buildOptions() { + UCrop.Options options = new UCrop.Options(); + options.setHideBottomControls(false); + options.setFreeStyleCropEnabled(true); + options.setShowCropFrame(true); + options.setShowCropGrid(true); + options.setCircleDimmedLayer(false); + options.withAspectRatio(1, 1); + options.setCropOutputPathDir(getSandboxPath()); + options.isCropDragSmoothToCenter(false); + options.setSkipCropMimeType(new String[]{PictureMimeType.ofGIF(), PictureMimeType.ofWEBP()}); + options.isForbidCropGifWebp(true); + options.isForbidSkipMultipleCrop(true); + options.setMaxScaleMultiplier(100); + if (selectorStyle != null && selectorStyle.getSelectMainStyle().getStatusBarColor() != 0) { + SelectMainStyle mainStyle = selectorStyle.getSelectMainStyle(); + boolean isDarkStatusBarBlack = mainStyle.isDarkStatusBarBlack(); + int statusBarColor = mainStyle.getStatusBarColor(); + options.isDarkStatusBarBlack(isDarkStatusBarBlack); + if (StyleUtils.checkStyleValidity(statusBarColor)) { + options.setStatusBarColor(statusBarColor); + options.setToolbarColor(statusBarColor); + } else { + options.setStatusBarColor(ContextCompat.getColor(RegisterActivityBf.this, R.color.ps_color_grey)); + options.setToolbarColor(ContextCompat.getColor(RegisterActivityBf.this, R.color.ps_color_grey)); + } + TitleBarStyle titleBarStyle = selectorStyle.getTitleBarStyle(); + if (StyleUtils.checkStyleValidity(titleBarStyle.getTitleTextColor())) { + options.setToolbarWidgetColor(titleBarStyle.getTitleTextColor()); + } else { + options.setToolbarWidgetColor(ContextCompat.getColor(RegisterActivityBf.this, R.color.ps_color_white)); + } + } else { + options.setStatusBarColor(ContextCompat.getColor(RegisterActivityBf.this, R.color.ps_color_grey)); + options.setToolbarColor(ContextCompat.getColor(RegisterActivityBf.this, R.color.ps_color_grey)); + options.setToolbarWidgetColor(ContextCompat.getColor(RegisterActivityBf.this, R.color.ps_color_white)); + } + return options; + } + + /** + * 创建自定义输出目录 + * + * @return + */ + private String getSandboxPath() { + File externalFilesDir = getExternalFilesDir(""); + File customFile = new File(externalFilesDir.getAbsolutePath(), "Sandbox"); + if (!customFile.exists()) { + customFile.mkdirs(); + } + return customFile.getAbsolutePath() + File.separator; + } + + + private void changeArea() { + activityWelcomeBinding.areaTv.setText(countryBean.getCountryName() + countryBean.getAreaCodeName()); + } + + private void showMainActivityAndFinish() { + ALog.d(Constant.PROJECT_TAG, TAG, "showMainActivityAndFinish"); + Intent intent = new Intent(); + intent.setClass(this, MainActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); + this.startActivity(intent); + finish(); + } + + + private void loginIM(String account, String token) { + ALog.d(Constant.PROJECT_TAG, TAG, "loginIM"); + activityWelcomeBinding.getRoot().setVisibility(View.GONE); + LoginInfo loginInfo = + LoginInfo.LoginInfoBuilder.loginInfoDefault(account, token) + .withAppKey(DataUtils.readAppKey(this)) + .build(); + IMKitClient.loginIM( + loginInfo, + new LoginCallback() { + @Override + public void onError(int errorCode, @NonNull String errorMsg) { + ToastX.showShortToast( + String.format(getResources().getString(R.string.login_fail), errorCode)); + } + + @Override + public void onSuccess(@Nullable LoginInfo data) { + DataUtils.set(RegisterActivityBf.this, IMUIKitConfig.LOGIN_ACCOUNT, account); + DataUtils.set(RegisterActivityBf.this, IMUIKitConfig.LOGIN_TOKEN, token); + showMainActivityAndFinish(); + } + }); + } + + private void setPrivacyContent(TextView contentView) { + + SpannableStringBuilder stringBuilder = new SpannableStringBuilder(getString(R.string.denglujitongyi_txt)); + + int len = stringBuilder.length(); + + stringBuilder.append(getString(R.string.fuwuxieyi_txt)); + + SpecialClickableUnit unit = new SpecialClickableUnit(contentView, + (tv, clickableSpan) -> { + BrowseActivity.Companion.launch( + RegisterActivityBf.this, getString(R.string.fuwuxieyi_txt), IMUIKitConfig.RBCHAT_SERVICE_CN_URL); + }); + unit.setNormalTextColor(ContextCompat.getColor(RegisterActivityBf.this, R.color.color_7f7b81)); + unit.setPressTextColor(ContextCompat.getColor(RegisterActivityBf.this, R.color.color_7f7b81)); + unit.showUnderline(); + CustomClickableSpan customClickableSpan = new CustomClickableSpan(unit); + stringBuilder.setSpan(customClickableSpan, len, stringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + stringBuilder.append(getString(R.string.yiji_txt)); + len = stringBuilder.length(); + stringBuilder.append(getString(R.string.yinsizhengche_txt)); + SpecialClickableUnit unit1 = new SpecialClickableUnit(contentView, + (tv, clickableSpan) -> { + BrowseActivity.Companion.launch( + RegisterActivityBf.this, getString(R.string.yinsizhengche_txt), IMUIKitConfig.RBCHAT_PRIVACY_CN_URL); + }); + unit1.setNormalTextColor(ContextCompat.getColor(RegisterActivityBf.this, R.color.color_7f7b81)); + unit1.setPressTextColor(ContextCompat.getColor(RegisterActivityBf.this, R.color.color_7f7b81)); + unit1.showUnderline(); + CustomClickableSpan customClickableSpan1 = new CustomClickableSpan(unit1); + stringBuilder.setSpan(customClickableSpan1, len, stringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + + contentView.setText(stringBuilder); + contentView.setClickable(false); + contentView.setMovementMethod(CustomLinkMovementMethod.getInstance());//不设置 没有点击事件 + contentView.setHighlightColor(Color.TRANSPARENT); //设置点击后的颜色为透明 + contentView.setMovementMethod(LinkMovementMethod.getInstance());//不设置点击会失效 + + } + + + + StsCredentialsBean stsCredentialsBean; + + private void toShangchuanAli(File file ) { + showLoadingDialog(); + Api.getInstance().stsCredentials() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + stsCredentialsBean = feedbackResp.data; + toAliYunOss(file); + } + + @Override + public void onError(int code, String msg) { + dimessLoadingDialog(); + } + }); + } + + + private void toAliYunOss(File file ) { + String endpoint = "https://oss-cn-hongkong.aliyuncs.com"; + String accessKeyId = stsCredentialsBean.getAccessKeyId(); + String accessKeySecret = stsCredentialsBean.getAccessKeySecret(); + String securityToken = stsCredentialsBean.getSecurityToken(); + String bucketName = IMUIKitConfig.bucketName; + + OSSCredentialProvider credentialProvider = new OSSStsTokenCredentialProvider(accessKeyId, accessKeySecret, securityToken); + OSSClient oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider); + toUpdateOss(bucketName, 0, oss, file); + + } + public static Handler handler = new Handler(); + + // + private void toUpdateOss(String bucketName, int i, OSSClient oss, File file ) { + LogUtils.i("1111111111111111111"); + String updatePathPicHead = "userAvatarFileName"; + + LogUtils.i("22222222222222222"); + + String fileName = UUID.randomUUID().toString() + "_" + file.getName(); + LogUtils.i("文件地址是啥:" + file.getAbsolutePath()); + LogUtils.i("文件地址是啥1:" + file.getPath()); + + PutObjectRequest put = new PutObjectRequest(bucketName, "media/" + updatePathPicHead + "/" + fileName, file.getAbsolutePath()); + + put.setProgressCallback((request, currentSize, totalSize) -> { + LogUtils.i("PutObject", "currentSize: " + currentSize + " totalSize: " + totalSize); + + }); + LogUtils.i("55555555555555"); + + oss.asyncPutObject(put, new OSSCompletedCallback<>() { + @Override + public void onSuccess(PutObjectRequest request, PutObjectResult result) { + LogUtils.i("PutObject", "UploadSuccess"); + LogUtils.i("ETag", result.getETag()); + LogUtils.i("RequestId", result.getRequestId()); + LogUtils.i("获取到的数据:" + GsonUtils.beanToJSONString(result)); + + handler.post(() -> { + dimessLoadingDialog(); + avater = IMUIKitConfig.OSS_URL+"media/" + updatePathPicHead + "/" + fileName; + }); + } + + @Override + public void onFailure(PutObjectRequest request, ClientException clientExcepion, ServiceException serviceException) { + dimessLoadingDialog(); + LogUtils.i("ErrorCode", clientExcepion.getMessage()); + + // 请求异常。 + if (clientExcepion != null) { + // 本地异常,如网络异常等。 + clientExcepion.printStackTrace(); + } + if (serviceException != null) { + // 服务异常。 + LogUtils.i("ErrorCode", serviceException.getErrorCode()); + LogUtils.i("RequestId", serviceException.getRequestId()); + LogUtils.i("HostId", serviceException.getHostId()); + LogUtils.i("RawMessage", serviceException.getRawMessage()); + } + } + }); +// } + } + + + + + public LoadingDialog loadingDialog; + + public void showLoadingDialog() { + if (loadingDialog == null) + loadingDialog = new LoadingDialog(this); + loadingDialog.show(); + } + + public void showLoadingDialog(String msg) { + if (loadingDialog == null) + loadingDialog = new LoadingDialog(this); + loadingDialog.setLoadingText(msg); + loadingDialog.show(); + } + + + public void dimessLoadingDialog() { + if (loadingDialog != null) { + loadingDialog.dismiss(); + } + + } + public boolean onTouchEvent(MotionEvent event) { + if(null != this.getCurrentFocus()){ + /** + * 点击空白位置 隐藏软键盘 + */ + InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + return mInputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0); + } + return super .onTouchEvent(event); + } + +} diff --git a/app/src/main/java/com/dskj/rbchat/login/WangjiActivity.java b/app/src/main/java/com/dskj/rbchat/login/WangjiActivity.java new file mode 100644 index 0000000..8a73938 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/login/WangjiActivity.java @@ -0,0 +1,559 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.login; + + +import android.Manifest; +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.graphics.Bitmap; +import android.graphics.Color; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.os.CountDownTimer; +import android.os.Handler; +import android.text.Html; +import android.text.SpannableStringBuilder; +import android.text.Spanned; +import android.text.TextUtils; +import android.text.method.LinkMovementMethod; +import android.view.MotionEvent; +import android.view.View; +import android.view.inputmethod.InputMethodManager; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; +import androidx.core.content.ContextCompat; +import androidx.fragment.app.Fragment; + +import com.alibaba.sdk.android.oss.ClientException; +import com.alibaba.sdk.android.oss.OSSClient; +import com.alibaba.sdk.android.oss.ServiceException; +import com.alibaba.sdk.android.oss.callback.OSSCompletedCallback; +import com.alibaba.sdk.android.oss.common.auth.OSSCredentialProvider; +import com.alibaba.sdk.android.oss.common.auth.OSSStsTokenCredentialProvider; +import com.alibaba.sdk.android.oss.model.PutObjectRequest; +import com.alibaba.sdk.android.oss.model.PutObjectResult; +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.bumptech.glide.request.RequestOptions; +import com.bumptech.glide.request.target.CustomTarget; +import com.bumptech.glide.request.transition.Transition; +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.ActivityRegisterBinding; +import com.dskj.rbchat.databinding.ActivityWangjiBinding; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.dialog.SelectCountryDialog; +import com.dskj.rbchat.main.MainActivity; +import com.dskj.rbchat.main.mine.ChangePasswordActivity; +import com.dskj.rbchat.model.BindBean; +import com.dskj.rbchat.model.CountryBean; +import com.dskj.rbchat.model.LoginBean; +import com.dskj.rbchat.model.PassWordLoginBean; +import com.dskj.rbchat.model.RegisteredBean; +import com.dskj.rbchat.model.StsCredentialsBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.AnimUtil; +import com.dskj.rbchat.utils.AppUtils; +import com.dskj.rbchat.utils.Constant; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GetAndroidUniqueMark; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.welcome.WelcomeActivity; +import com.luck.picture.lib.basic.PictureSelector; +import com.luck.picture.lib.config.PictureMimeType; +import com.luck.picture.lib.config.SelectMimeType; +import com.luck.picture.lib.engine.CropFileEngine; +import com.luck.picture.lib.entity.LocalMedia; +import com.luck.picture.lib.interfaces.OnResultCallbackListener; +import com.luck.picture.lib.style.BottomNavBarStyle; +import com.luck.picture.lib.style.PictureSelectorStyle; +import com.luck.picture.lib.style.SelectMainStyle; +import com.luck.picture.lib.style.TitleBarStyle; +import com.luck.picture.lib.utils.StyleUtils; +import com.netease.nimlib.sdk.auth.LoginInfo; +import com.netease.yunxin.kit.alog.ALog; +import com.netease.yunxin.kit.chatkit.ui.common.GlideEngine; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.activities.BrowseActivity; +import com.netease.yunxin.kit.common.ui.dialog.LoadingDialog; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.common.utils.PermissionUtils; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.login.LoginCallback; +import com.yalantis.ucrop.UCrop; +import com.yalantis.ucrop.UCropImageEngine; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +import cn.iwgang.simplifyspan.customspan.CustomClickableSpan; +import cn.iwgang.simplifyspan.other.CustomLinkMovementMethod; +import cn.iwgang.simplifyspan.unit.SpecialClickableUnit; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +/** + * Welcome Page is launch page + */ +public class WangjiActivity extends BaseActivity { + protected ActivityResultLauncher permissionLauncher; + String passwordCode = null; + + private static final String TAG = "WelcomeActivity"; + private ActivityWangjiBinding activityWelcomeBinding; + String account = "18975139096"; + String token = "4c155cda4391c5210f28e1dfae54d502"; + int step = 1; + int sexType = 1; + CountryBean countryBean; + String avater = null; + @RequiresApi(api = Build.VERSION_CODES.M) + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getWindow().setStatusBarColor(getResources().getColor(R.color.color_fcfcfc)); + getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white)); + + ALog.d(Constant.PROJECT_TAG, TAG, "onCreateView"); + IMApplication.setColdStart(true); + activityWelcomeBinding = ActivityWangjiBinding.inflate(getLayoutInflater()); + setContentView(activityWelcomeBinding.getRoot()); + myCountDownTimer = new MyCountDownTimer(60000, 1000); + activityWelcomeBinding.aboutTitleBar.setOnBackIconClickListener(v -> { + onBackPressed(); + }); + + countryBean = DataUtils.getLocCountry(WangjiActivity.this); + changeArea(); + activityWelcomeBinding.areaTv.setOnClickListener(v -> { + SelectCountryDialog selectCountryDialog = new SelectCountryDialog(WangjiActivity.this); + selectCountryDialog.setOnToVipListener(new SelectCountryDialog.OnToTypeListener() { + @Override + public void toType(CountryBean type) { + countryBean = type; + changeArea(); + DataUtils.set(WangjiActivity.this, IMUIKitConfig.LOC_COUNTRY_CODE, type.getAreaCodeName()); + } + }); + selectCountryDialog.show(); + }); + activityWelcomeBinding.nextIv.setOnClickListener(v -> { + if (step < 4) { + if (step == 1) { + if (TextUtils.isEmpty(activityWelcomeBinding.phoneEt.getText().toString().trim())) { + ToastX.showShortToast(R.string.sjhbnwk_txt); + return; + } + checkPhone(); + } else if (step == 2) { + if (TextUtils.isEmpty(passwordCode)) { + ToastX.showShortToast(R.string.dxyzmbnwk_txt); + return; + } + checkVerfyCode(); + } else if (step == 3) { + if (TextUtils.isEmpty(activityWelcomeBinding.passwordEt.getText().toString().trim())) { + ToastX.showShortToast(R.string.mimabunengweikong_txt); + return; + } + if(!DataUtils.checkPassword(activityWelcomeBinding.passwordEt.getText().toString().trim())){ + ToastX.showShortToast(R.string.qjcmmgs_txt); + return; + } + + if(activityWelcomeBinding.passwordEt.getText().toString().trim().length()<8){ + ToastX.showShortToast(R.string.qjcmmgs_txt1); + return; + } + + if (TextUtils.isEmpty(activityWelcomeBinding.passwordEt1.getText().toString().trim())) { + ToastX.showShortToast(R.string.qrmmbnwk_txt); + return; + } + + + if (!activityWelcomeBinding.passwordEt.getText().toString().trim().equals(activityWelcomeBinding.passwordEt1.getText().toString().trim())) { + ToastX.showShortToast(R.string.mimaquernemimabuyizhi_txt); + return; + } + hideSoftInput(this); + phoneRegister(); + } + + } + }); + + activityWelcomeBinding.changePassTv.setOnClickListener(v -> { + step = 2; + changeStep(); + }); + activityWelcomeBinding.passwordEditTextCode.setOnCompleteListener(code -> { + passwordCode = code; + + }); + + + activityWelcomeBinding.sendSmsTv.setOnClickListener(v -> { + toStep2(); + }); + + + AnimUtil.setAnimViews(activityWelcomeBinding.sendSmsTv, activityWelcomeBinding.changePassTv, + activityWelcomeBinding.nextIv, activityWelcomeBinding.changeSmsCodeTv, activityWelcomeBinding.areaTv); + + } + + BindBean bean; + private void bindInfo(String user_uid) { + Api.getInstance().bindInfo(user_uid) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + bean = feedbackResp.data; + activityWelcomeBinding.phoneEt.setText(bean.getAreaCode()+" "+bean.getPhone()); + hideSoftInput(WangjiActivity.this); + new Handler().postDelayed(() -> { + step += 1; + changeStep(); + }, 500); + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:"+code+""+ msg); +// WidgetUtils.showToast(getActivity(), msg, WidgetUtils.ToastType.ERROR); + } + }); + } + + private void checkVerfyCode() { + Map maps = new HashMap<>(); + maps.put("verifyCode", passwordCode); + maps.put("phone", String.valueOf(activityWelcomeBinding.phoneEt.getText()).trim()); + maps.put("areaCode", countryBean.getAreaCodeName()); + if (!TextUtils.isEmpty(IMUIKitConfig.SUBSTATIONID)) { + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + } + Api.getInstance().preCheckVerifyCode(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { +// dimessLoadingDialog(); + if (feedbackResp.data.isCorrect()) { + new Handler().postDelayed(() -> { + step += 1; + changeStep(); + }, 500); + } else { + ToastX.showShortToast(R.string.yzmbzq_txt); + } + } + + @Override + public void onError(int code, String msg) { +// dimessLoadingDialog(); + LogUtils.i("获取到的错误:" + code + "" + msg); + ToastX.showShortToast( msg); + + + } + }); + } + + private void checkPhone() { + hideSoftInput(WangjiActivity.this); + Map maps = new HashMap<>(); + maps.put("phone", String.valueOf(activityWelcomeBinding.phoneEt.getText()).trim()); + maps.put("areaCode", countryBean.getAreaCodeName()); + if (!TextUtils.isEmpty(IMUIKitConfig.SUBSTATIONID)) { + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + } + Api.getInstance().registered(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { + if (feedbackResp.data.isRegistered()) { +// checkVerfyCode(); + new Handler().postDelayed(() -> { + step += 1; + changeStep(); + }, 500); + + } else { + ToastX.showShortToast(R.string.sjhwzcqxzc_txt); + } + + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + ToastX.showShortToast(msg); + } + }); + } + + + private void phoneRegister() { +// Map maps = new HashMap<>(); +// maps.put("phone", String.valueOf(activityWelcomeBinding.phoneEt.getText()).trim()); +// maps.put("areaCode", countryBean.getAreaCodeName()); +// maps.put("password", activityWelcomeBinding.passwordEt.getText().toString().trim()); +// maps.put("verifyCode", passwordCode); +// if (!TextUtils.isEmpty(avater)) { +// maps.put("avatar", avater); +// } +// maps.put("sex", sexType); +// +// if(!TextUtils.isEmpty(IMUIKitConfig.SUBSTATIONID)) { +// maps.put("substationId", IMUIKitConfig.SUBSTATIONID); +// } +// Api.getInstance().phoneRegister(maps) +// .subscribeOn(Schedulers.io()) +// .observeOn(AndroidSchedulers.mainThread()) +// .subscribe(new BaseObserver<>() { +// @Override +// public void onSuccess(Result feedbackResp) { +//// doLogin(); +// } +// +// @Override +// public void onError(int code, String msg) { +// LogUtils.i("获取到的错误:" + code + "" + msg); +// ToastX.showShortToast(msg); +// } +// }); + + Map maps = new HashMap<>(); + maps.put("phone", String.valueOf(activityWelcomeBinding.phoneEt.getText()).trim()); + maps.put("areaCode", countryBean.getAreaCodeName()); + maps.put("verifyCode", passwordCode); + maps.put("newPassword", activityWelcomeBinding.passwordEt.getText().toString().trim()); + if(!TextUtils.isEmpty(IMUIKitConfig.SUBSTATIONID)) { + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + } + Api.getInstance().smsSetPassword(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + ToastX.showShortToast(R.string.zhaohuimimachenggong_txt); + finish(); + } + + @Override + public void onError(int code, String msg) { +// LogUtils.i("获取到的错误:"+code+""+ msg); + ToastX.showShortToast(msg); + } + }); + + + } + + + private void toStep2() { + hideSoftInput(WangjiActivity.this); + Map maps = new HashMap<>(); + maps.put("phone", String.valueOf(activityWelcomeBinding.phoneEt.getText()).trim()); + maps.put("areaCode", countryBean.getAreaCodeName()); + if (!TextUtils.isEmpty(IMUIKitConfig.SUBSTATIONID)) { + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + } + Api.getInstance().sendSmsForSetPassword(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { + myCountDownTimer.start(); + ActionConfirmDialog actionConfirmDialog = new ActionConfirmDialog(WangjiActivity.this, getString(R.string.yzmyfs_txt), false); + actionConfirmDialog.show(); + activityWelcomeBinding.sendSmsTipsTv.setText(Html.fromHtml(String.format(getString(R.string.djfsyzm_txt1), + countryBean.getAreaCodeName()+" "+activityWelcomeBinding.phoneEt.getText().toString().trim()))); + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + ToastX.showShortToast(msg); + } + }); + + + } + + + MyCountDownTimer myCountDownTimer; + + //倒计时函数 + private class MyCountDownTimer extends CountDownTimer { + + public MyCountDownTimer(long millisInFuture, long countDownInterval) { + super(millisInFuture, countDownInterval); + } + + //计时过程 + @Override + public void onTick(long l) { + //防止计时过程中重复点击 + activityWelcomeBinding.sendSmsTv.setClickable(false); +// getcodeTv.setTextColor(getResources().getColor(R.color.color_adb5bd)); + activityWelcomeBinding.sendSmsTv.setText(String.format(getString(R.string.get_code1_txt), (l / 1000))); + + } + + //计时完毕的方法 + @Override + public void onFinish() { + //重新给Button设置文字 + activityWelcomeBinding.sendSmsTv.setText(R.string.get_code_txt); + //设置可点击 + activityWelcomeBinding.sendSmsTv.setClickable(true); +// getcodeTv.setTextColor(getResources().getColor(R.color.colorAccent)); + + } + } + + + /** + * 隐藏软键盘 + */ + public void hideSoftInput(Activity activity) { + InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + if (getCurrentFocus() != null && null != imm) { + imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0); + } +// View view = activity.getCurrentFocus(); +// +// if (view != null) { +// +// InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE); +// +// inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); +// +// } + } + + + + @Override + public void onBackPressed() { + if (step == 1) { + super.onBackPressed(); + } else { + step -= 1; + changeStep(); + } + } + + private void changeStep() { + switch (step) { + case 1: + activityWelcomeBinding.step1Ly.setVisibility(View.VISIBLE); + activityWelcomeBinding.step2Ly.setVisibility(View.GONE); + activityWelcomeBinding.step3Ly.setVisibility(View.GONE); + activityWelcomeBinding.changeSmsCodeTv.setVisibility(View.GONE); + activityWelcomeBinding.changePassTv.setVisibility(View.GONE); + break; + case 2: + activityWelcomeBinding.step1Ly.setVisibility(View.GONE); + activityWelcomeBinding.step2Ly.setVisibility(View.GONE); + activityWelcomeBinding.step3Ly.setVisibility(View.VISIBLE); + activityWelcomeBinding.changeSmsCodeTv.setVisibility(View.GONE); + activityWelcomeBinding.changePassTv.setVisibility(View.GONE); + activityWelcomeBinding.sendSmsTipsTv.setText(Html.fromHtml(String.format(getString(R.string.djfsyzm_txt), + countryBean.getAreaCodeName()+" "+activityWelcomeBinding.phoneEt.getText().toString().trim()))); + break; + case 3: + activityWelcomeBinding.step1Ly.setVisibility(View.GONE); + activityWelcomeBinding.step2Ly.setVisibility(View.VISIBLE); + activityWelcomeBinding.step3Ly.setVisibility(View.GONE); + activityWelcomeBinding.changeSmsCodeTv.setVisibility(View.GONE); + activityWelcomeBinding.changePassTv.setVisibility(View.GONE); + break; + + } + } + + + + + private void changeArea() { + activityWelcomeBinding.areaTv.setText(countryBean.getAreaCodeName()); + } + + private void showMainActivityAndFinish() { + ALog.d(Constant.PROJECT_TAG, TAG, "showMainActivityAndFinish"); + Intent intent = new Intent(); + intent.setClass(this, LoginActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); + this.startActivity(intent); + finish(); + } + + + public LoadingDialog loadingDialog; + + public void showLoadingDialog() { + if (loadingDialog == null) + loadingDialog = new LoadingDialog(this); + loadingDialog.show(); + } + + public void showLoadingDialog(String msg) { + if (loadingDialog == null) + loadingDialog = new LoadingDialog(this); + loadingDialog.setLoadingText(msg); + loadingDialog.show(); + } + + + public void dimessLoadingDialog() { + if (loadingDialog != null) { + loadingDialog.dismiss(); + } + + } + public boolean onTouchEvent(MotionEvent event) { + if(null != this.getCurrentFocus()){ + /** + * 点击空白位置 隐藏软键盘 + */ + InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + return mInputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0); + } + return super .onTouchEvent(event); + } + +} diff --git a/app/src/main/java/com/dskj/rbchat/main/CustomCallOrderHelper.java b/app/src/main/java/com/dskj/rbchat/main/CustomCallOrderHelper.java new file mode 100644 index 0000000..e6ab59b --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/CustomCallOrderHelper.java @@ -0,0 +1,131 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.main; + +import com.netease.nimlib.sdk.avsignalling.constant.ChannelType; +import com.netease.nimlib.sdk.msg.MessageBuilder; +import com.netease.nimlib.sdk.msg.attachment.NetCallAttachment; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.nimlib.sdk.msg.model.IMMessage; +import com.netease.yunxin.kit.alog.ALog; +import com.netease.yunxin.kit.alog.ParameterMap; +import com.netease.yunxin.kit.chatkit.repo.ChatRepo; +import com.netease.yunxin.kit.common.utils.NetworkUtils; +import com.netease.yunxin.nertc.nertcvideocall.model.NERTCVideoCall; +import com.netease.yunxin.nertc.nertcvideocall.model.impl.DefaultCallOrderImpl; +import com.netease.yunxin.nertc.nertcvideocall.model.impl.state.CallState; +import com.netease.yunxin.nertc.nertcvideocall.utils.CallParams; +import com.netease.yunxin.nertc.nertcvideocall.utils.NrtcCallStatus; +import java.util.Collections; +import java.util.List; + +class CustomCallOrderHelper extends DefaultCallOrderImpl { + private static final String TAG = "CustomCallOrderHelper"; + + @Override + public void onCanceled(ChannelType channelType, String accountId, int callType) { + ALog.dApi( + TAG, + new ParameterMap("onCanceled") + .append("channelType", channelType) + .append("callType", callType) + .append("accountId", accountId) + .append("enableOrder", isEnable()) + .toValue()); + if (!isEnable()) { + return; + } + sendOrder(channelType, accountId, NrtcCallStatus.NrtcCallStatusCanceled, callType); + } + + @Override + public void onReject(ChannelType channelType, String accountId, int callType) { + ALog.dApi( + TAG, + new ParameterMap("onReject") + .append("channelType", channelType) + .append("callType", callType) + .append("accountId", accountId) + .append("enableOrder", isEnable()) + .toValue()); + if (!isEnable()) { + return; + } + sendOrder(channelType, accountId, NrtcCallStatus.NrtcCallStatusRejected, callType); + } + + @Override + public void onTimeout(ChannelType channelType, String accountId, int callType) { + ALog.dApi( + TAG, + new ParameterMap("onTimeout") + .append("channelType", channelType) + .append("callType", callType) + .append("accountId", accountId) + .append("enableOrder", isEnable()) + .toValue()); + if (!isEnable()) { + return; + } + if (NERTCVideoCall.sharedInstance().getCurrentState() == CallState.STATE_INVITED) { + return; + } + if (NetworkUtils.isConnected()) { + sendOrder(channelType, accountId, NrtcCallStatus.NrtcCallStatusTimeout, callType); + } else { + sendOrder(channelType, accountId, NrtcCallStatus.NrtcCallStatusCanceled, callType); + } + } + + @Override + public void onBusy(ChannelType channelType, String accountId, int callType) { + ALog.dApi( + TAG, + new ParameterMap("onBusy") + .append("channelType", channelType) + .append("callType", callType) + .append("accountId", accountId) + .append("enableOrder", isEnable()) + .toValue()); + if (!isEnable()) { + return; + } + sendOrder(channelType, accountId, NrtcCallStatus.NrtcCallStatusBusy, callType); + } + + public static void sendOrder( + ChannelType channelType, String accountId, int status, int callType) { + sendOrder(channelType, accountId, status, Collections.emptyList(), callType); + } + + public static void sendOrder( + ChannelType channelType, + String accountId, + int status, + List durations, + int callType) { + ALog.dApi( + TAG, + new ParameterMap("sendOrder") + .append("status", status) + .append("channelType", channelType) + .append("callType", callType) + .append("durations", durations) + .append("accountId", accountId) + .toValue()); + if (callType == CallParams.CallType.P2P) { + NetCallAttachment netCallAttachment = + new NetCallAttachment.NetCallAttachmentBuilder() + .withType(channelType != null ? channelType.getValue() : ChannelType.VIDEO.getValue()) + .withStatus(status) + .withDurations(durations) + .build(); + IMMessage message = + MessageBuilder.createNrtcNetcallMessage( + accountId, SessionTypeEnum.P2P, netCallAttachment); + ChatRepo.sendMessage(message, true, null); + } + } +} diff --git a/app/src/main/java/com/dskj/rbchat/main/FragmentAdapter.java b/app/src/main/java/com/dskj/rbchat/main/FragmentAdapter.java new file mode 100644 index 0000000..089599d --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/FragmentAdapter.java @@ -0,0 +1,61 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.main; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentActivity; +import androidx.fragment.app.FragmentManager; +import androidx.lifecycle.Lifecycle; +import androidx.viewpager.widget.PagerAdapter; +import androidx.viewpager2.adapter.FragmentStateAdapter; +import java.util.List; + +/** Fragment Adapter used in MainActivity */ +public class FragmentAdapter extends FragmentStateAdapter { + private static final String TAG = FragmentAdapter.class.getSimpleName(); + + private List fragmentList; + + public FragmentAdapter(@NonNull FragmentActivity fragmentActivity) { + super(fragmentActivity); + } + + public FragmentAdapter(@NonNull Fragment fragment) { + super(fragment); + } + + public FragmentAdapter(@NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle) { + super(fragmentManager, lifecycle); + } + + public void setFragmentList(List fragmentList) { + this.fragmentList = fragmentList; + } + + @NonNull + @Override + public Fragment createFragment(int position) { +// if (fragmentList == null || fragmentList.size() <= position) { +// return new Fragment(); +// } + return fragmentList.get(position); + } + + @Override + public int getItemCount() { + return fragmentList == null ? 0 : fragmentList.size(); + } + + @Override + public long getItemId(int position) { + return super.getItemId(position); + } + + @Override + public int getItemViewType(int position) { + return super.getItemViewType(position); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/main/MainActivity.java b/app/src/main/java/com/dskj/rbchat/main/MainActivity.java new file mode 100644 index 0000000..b8a65cc --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/MainActivity.java @@ -0,0 +1,2150 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.main; + + +import static com.luck.picture.lib.utils.DensityUtil.getNavigationBarHeight; +import static com.netease.yunxin.kit.chatkit.ui.fun.FunChatForwardSelectDialog.TAG; + +import android.Manifest; +import android.annotation.SuppressLint; +import android.app.Activity; +import android.app.Notification; +import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.Color; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.text.TextUtils; +import android.util.Log; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.BoolRes; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; +import androidx.core.app.NotificationCompat; +import androidx.core.view.WindowCompat; +import androidx.fragment.app.Fragment; +import androidx.lifecycle.ViewModelProvider; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.codersun.fingerprintcompat.AonFingerChangeCallback; +import com.codersun.fingerprintcompat.FingerManager; +import com.codersun.fingerprintcompat.SimpleFingerCheckCallback; +import com.dskj.rbchat.AppSkinConfig; +import com.dskj.rbchat.CustomConfig; +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.databinding.ActivityMainBinding; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.dialog.ActionConfirmDialog1; +import com.dskj.rbchat.dialog.PayCashDialog; +import com.dskj.rbchat.dialog.PayCashFingerDialog; +import com.dskj.rbchat.game.JsBridgeActivity; +import com.dskj.rbchat.main.authorize.AuthorizeActivity; +import com.dskj.rbchat.main.chat.ChatTabFragment; +import com.dskj.rbchat.main.home.HomeFragment; +import com.dskj.rbchat.main.mine.ChangeAccoutActionActivity; +import com.dskj.rbchat.main.mine.MineFragment; +import com.dskj.rbchat.main.mine.setting.SettingNotifyViewModel; +import com.dskj.rbchat.model.BindBean; +import com.dskj.rbchat.model.ConfigBean; +import com.dskj.rbchat.model.LoginBean; +import com.dskj.rbchat.model.UserShareBean; +import com.dskj.rbchat.model.WalletBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.pay.CollectionAndPaymentActivity; +import com.dskj.rbchat.pay.PaymentActivity; +import com.dskj.rbchat.pay.PaymentActivity1; +import com.dskj.rbchat.utils.AdaptScreenUtils; +import com.dskj.rbchat.utils.AnimUtil; +import com.dskj.rbchat.utils.CommonUtils; +import com.dskj.rbchat.utils.Constant; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.utils.QRCodeScheme; +import com.dskj.rbchat.utils.ShareDateUtils; +import com.dskj.rbchat.utils.ToolKits; +import com.dskj.rbchat.voom.VoomFragment; +import com.dskj.rbchat.wallet.SetPayPasswordActivity; +import com.dskj.rbchat.welcome.WelcomeActivity; +import com.google.android.material.bottomsheet.BottomSheetDialog; +import com.huawei.hms.hmsscankit.ScanUtilNew; +import com.huawei.hms.ml.scan.HmsScan; +import com.huawei.hms.ml.scan.HmsScanAnalyzerOptions; +import com.king.zxing.util.CodeUtils; +import com.netease.lava.nertc.sdk.NERtcOption; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.Observer; +import com.netease.nimlib.sdk.RequestCallback; +import com.netease.nimlib.sdk.ResponseCode; +import com.netease.nimlib.sdk.StatusCode; +import com.netease.nimlib.sdk.auth.AuthServiceObserver; +import com.netease.nimlib.sdk.avsignalling.constant.ChannelType; +import com.netease.nimlib.sdk.avsignalling.model.SignallingPushConfig; +import com.netease.nimlib.sdk.msg.MessageBuilder; +import com.netease.nimlib.sdk.msg.constant.MsgTypeEnum; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.nimlib.sdk.msg.model.IMMessage; +import com.netease.nimlib.sdk.team.TeamService; +import com.netease.nimlib.sdk.team.model.Team; +import com.netease.yunxin.kit.alog.ALog; +import com.netease.yunxin.kit.chatkit.model.ConversationInfo; +import com.netease.yunxin.kit.chatkit.model.IMMessageInfo; +import com.netease.yunxin.kit.chatkit.repo.ChatObserverRepo; +import com.netease.yunxin.kit.chatkit.repo.ChatRepo; +import com.netease.yunxin.kit.chatkit.repo.ContactRepo; +import com.netease.yunxin.kit.chatkit.ui.ChatKitUIConstant; +import com.netease.yunxin.kit.chatkit.ui.common.ChatDataUtils; +import com.netease.yunxin.kit.chatkit.ui.common.RxBus; +import com.netease.yunxin.kit.chatkit.ui.page.fragment.ChatBaseFragment; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.utils.AvatarColor; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.common.ui.widgets.ContactAvatarView; +import com.netease.yunxin.kit.common.utils.PermissionUtils; +import com.netease.yunxin.kit.common.utils.UriUtils; +import com.netease.yunxin.kit.contactkit.ui.contact.BaseContactFragment; +import com.netease.yunxin.kit.contactkit.ui.utils.ColorUtils; +import com.netease.yunxin.kit.conversationkit.ui.common.ConversationConstant; +import com.netease.yunxin.kit.conversationkit.ui.page.ConversationBaseFragment; +import com.netease.yunxin.kit.corekit.event.BaseEvent; +import com.netease.yunxin.kit.corekit.event.EventCenter; +import com.netease.yunxin.kit.corekit.event.EventNotify; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.model.EventObserver; +import com.netease.yunxin.kit.corekit.im.model.FriendInfo; +import com.netease.yunxin.kit.corekit.im.model.UserInfo; +import com.netease.yunxin.kit.corekit.im.provider.FetchCallbackImpl; +import com.netease.yunxin.kit.corekit.im.provider.FriendProvider; +import com.netease.yunxin.kit.corekit.im.repo.SettingRepo; +import com.netease.yunxin.kit.corekit.im.utils.RouterConstant; +import com.netease.yunxin.kit.corekit.route.XKitRouter; +import com.netease.yunxin.nertc.nertcvideocall.bean.InvitedInfo; +import com.netease.yunxin.nertc.nertcvideocall.model.NERTCVideoCall; +import com.netease.yunxin.nertc.nertcvideocall.model.PushConfigProvider; +import com.netease.yunxin.nertc.ui.CallKitNotificationConfig; +import com.netease.yunxin.nertc.ui.CallKitUI; +import com.netease.yunxin.nertc.ui.CallKitUIOptions; +import com.netease.yunxin.nertc.ui.base.AVChatSoundPlayer; +import com.netease.yunxin.nertc.ui.base.SoundHelper; +import com.netease.yunxin.nertc.ui.base.UserInfoHelper; + +import java.io.File; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import cn.jpush.android.api.JPushInterface; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; +import kotlin.Unit; +import kotlin.jvm.functions.Function1; +import rx.Subscription; + +/** + * IM Main Page include four tab , message/contact/live/profile + */ +public class MainActivity extends BaseActivity { + public static int REQUEST_CODE_FOR_QRCODE_SCAN = 1016; + + /** + * 取币用的 + */ + public static int TYPE_PAYMENT_DUIBI = 0; + + /** + * 取币用的 + */ + public static int TYPE_PAYMENT_BEAD = 2; + + + /** + * 兑换礼品柜礼物用的 + */ + public static int TYPE_PAYMENT_GIFT = 1; + + + /** + * 转账 + */ + public static final int TYPE_TRANSFER = 1; + + /** + * 付款码 + */ + public static final int TYPE_PAYMENT = 2; + + /** + * 收款码 + */ + public static final int TYPE_PAYMENT_COLLECTION = 3; + + private ActivityMainBinding activityMainBinding; + private static final int START_INDEX = 0; + private View mCurrentTab; + private BaseContactFragment mContactFragment; + private ConversationBaseFragment mConversationFragment; + + // private IndexFragment indexFragment; + private HomeFragment index2Fragment; + private ChatTabFragment chatTabFragment; + // private ChatMainFragment chatMainFragment; +// private ChatMain2Fragment chatMain2Fragment; + // private ChatTabFragment chatTabFragment; + private VoomFragment voomFragment; + private MineFragment walletFragment; + FragmentAdapter fragmentAdapter; + + BindBean bindBean; + WalletBean walletBean; + + protected ActivityResultLauncher permissionLauncher; + protected ActivityResultLauncher permissionLauncherNot; + protected ActivityResultLauncher permissionLauncher1; + + //修改语音事件 + EventNotify skinNotify = + new EventNotify<>() { + @Override + public void onNotify(@NonNull SkinEvent message) { + Intent intent = getIntent(); + finish(); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); + startActivity(intent); + } + + @NonNull + @Override + public String getEventType() { + return "skinEvent"; + } + }; + + //处理在线通知而已 + private final EventObserver> receiveMessageObserver = + new EventObserver<>() { + @Override + public void onEvent(@Nullable List event) { + if (IMApplication.getForegroundActCount() == 0) { //在前台不推送 + IMMessage messageInfo = event.get(0).getMessage(); + if (messageInfo.getMsgType() == MsgTypeEnum.tip && messageInfo.getPushPayload().containsKey("sound")) { + return; + } + if (SettingRepo.isPushNotify() && messageInfo.getMsgType() != MsgTypeEnum.nrtc_netcall) { //音视频单话就结束后会发送一条信息 + //收到私聊消息通知 + if (messageInfo.getSessionType() == SessionTypeEnum.P2P && FriendProvider.INSTANCE.isNotify(messageInfo.getFromAccount())) { + setNotifications(event); + } + + } + + } + + + } + }; + + + @RequiresApi(api = Build.VERSION_CODES.O) + private void setNotifications(List event) { + + Intent notifyIntent = new Intent(); + ComponentName launchComponent = getApplication() + .getPackageManager() + .getLaunchIntentForPackage(getApplication().getPackageName()) + .getComponent(); + notifyIntent.setComponent(launchComponent); + notifyIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); + notifyIntent.setAction(Intent.ACTION_VIEW); + notifyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 必须 + + PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notifyIntent, PendingIntent.FLAG_IMMUTABLE); + //获取本地设置消息铃声 + NotificationManager notificationManager = (NotificationManager) IMApplication.getAppContext().getSystemService(Context.NOTIFICATION_SERVICE); + + String channelID = ChatDataUtils.getMessageBell(IMKitClient.getUserInfo()); + LogUtils.d("channelId==" + channelID); + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) { + IMMessage messageInfo = event.get(0).getMessage(); + String content = ""; + if (!notifyViewModel.getPushShowNoDetail()) { + content = messageInfo.getContent(); + } else { + if (messageInfo.getSessionType() == SessionTypeEnum.Team) { + content = getString(R.string.message_notifycontent_team); + } else if (messageInfo.getSessionType() == SessionTypeEnum.P2P) { + content = getString(R.string.message_notifycontent_friend); + } else if (messageInfo.getMsgType() == MsgTypeEnum.avchat) { + content = getString(R.string.message_notifycontent_friend); + } + } + NotificationCompat.Builder builder = new NotificationCompat.Builder(this, channelID) + .setSmallIcon(R.mipmap.ic_launcher) + .setContentTitle(messageInfo.getFromNick()) + .setContentText(content) + .setContentIntent(pendingIntent) + .setAutoCancel(true) + .setPriority(NotificationCompat.PRIORITY_DEFAULT); + notificationManager.notify(0, builder.build()); + } + + } + + @RequiresApi(api = Build.VERSION_CODES.O) + public NotificationChannel createNotifyChannel(boolean message) { + String channelID = ""; + if (message) { + channelID = ChatDataUtils.getMessageBell(IMKitClient.getUserInfo()); + } else { + channelID = ChatDataUtils.getCellBell(IMKitClient.getUserInfo()); + } + LogUtils.d("channelID==" + channelID); + int rawResource = MainActivity.this.getResources().getIdentifier(channelID, "raw", getPackageName()); + Uri ringUri = Uri.parse("android.resource://com.dskj.rbchat/raw/" + rawResource); + NotificationChannel vibration = new NotificationChannel(channelID, IMApplication.getAppContext().getString(R.string.bell_default), NotificationManager.IMPORTANCE_DEFAULT); + vibration.enableLights(true); + vibration.enableVibration(true); + vibration.setSound(ringUri, Notification.AUDIO_ATTRIBUTES_DEFAULT); + return vibration; + } + + + private SettingNotifyViewModel notifyViewModel; + private Subscription mEventSubscription; + + @SuppressLint("NewApi") + @Override + protected void onCreate(Bundle savedInstanceState) { + if (Build.VERSION.SDK_INT >= 30) { + } else { + setTheme(R.style.AppThemeStart1); + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); + getWindow().setStatusBarColor(Color.TRANSPARENT); + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + getWindow().setDecorFitsSystemWindows(false); + } else { + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); + } + + super.onCreate(savedInstanceState); + ALog.d(Constant.PROJECT_TAG, "MainActivity:onCreate"); + notifyViewModel = new ViewModelProvider(this).get(SettingNotifyViewModel.class); + if (TextUtils.isEmpty(IMKitClient.account())) { + Intent intent = new Intent(this, WelcomeActivity.class); + startActivity(intent); + finish(); + return; + } + activityMainBinding = ActivityMainBinding.inflate(getLayoutInflater()); + setContentView(activityMainBinding.getRoot()); + if (Build.VERSION.SDK_INT >= 30) { + WindowCompat.setDecorFitsSystemWindows(getWindow(), false); + ViewGroup.LayoutParams layoutParams = activityMainBinding.bottomV.getLayoutParams(); + layoutParams.height = getNavigationBarHeight(this); + activityMainBinding.bottomV.setLayoutParams(layoutParams); + + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR); + } + ChatDataUtils.set(this, ChatKitUIConstant.SERVICES_LOGIN, false); + ChatKitUIConstant.isSendGiftRedPacket = DataUtils.getIsSendGiftRedPacket(); + initView(); + getServiceId(); + + ChatObserverRepo.registerReceiveMessageObserve(receiveMessageObserver); + EventCenter.registerEventNotify(skinNotify); + initNotifications(); + setConfig(); + getWallet(); + getConfig(); + permissionLauncher = + registerForActivityResult( + new ActivityResultContracts.RequestMultiplePermissions(), + result -> { + if (result != null) { + for (Map.Entry entry : result.entrySet()) { + String permission = entry.getKey().toString(); + boolean grant = (Boolean) entry.getValue(); + if (grant) { + if (TextUtils.equals(permission, Manifest.permission.CAMERA)) { + ScanUtilNew.startScan(MainActivity.this, MainActivity.REQUEST_CODE_FOR_QRCODE_SCAN, + new HmsScanAnalyzerOptions.Creator() + .setHmsScanTypes(HmsScan.ALL_SCAN_TYPE).create()); + } + } else { + if (shouldShowRequestPermissionRationale(permission)) { + + ToastX.showShortToast( + getResources().getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_deny_tips)); + + } else { + + ToastX.showShortToast(getPermissionText(permission)); + + } + } + } + } + }); + + + permissionLauncher1 = + registerForActivityResult( + new ActivityResultContracts.RequestMultiplePermissions(), + result -> { + if (result != null) { + for (Map.Entry entry : result.entrySet()) { + String permission = entry.getKey().toString(); + boolean grant = (Boolean) entry.getValue(); + if (grant) { + if (TextUtils.equals( + permission, Manifest.permission.READ_MEDIA_IMAGES) || TextUtils.equals( + permission, Manifest.permission.READ_MEDIA_VIDEO)) { + doSaveQrcode(); + } + } else { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (shouldShowRequestPermissionRationale(permission)) { + ToastX.showShortToast(getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_deny_tips)); + } else { + ToastX.showShortToast(getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_storage)); + } + } + } + } + } + }); + changeSystemLanguage(); + setAlias(); + getBlacks(); + initRing(); + SettingRepo.setMessageNotification(false); + gotoSheme(); + mEventSubscription = RxBus.getInstance().toObservable(Integer.class) + .subscribeOn(rx.schedulers.Schedulers.io()) + .unsubscribeOn(rx.schedulers.Schedulers.io()) + .subscribe(changeImageViewBean -> {//回顶部 + if (changeImageViewBean == IMUIKitConfig.CHANGE_FOLLOW_USER) { + shareDateUtils.getAllSessionList(); + } + }); + + + } + + public int getNavigationBarHeight(Context context) { + Resources resources = context.getResources(); + int resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android"); + return resources.getDimensionPixelSize(resourceId); + } + + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + LogUtils.i("111111111111111110ZZZZZZZZYYYYYYYYY:" + IMApplication.schemeUserId); + + gotoSheme(); + + } + + private void gotoSheme() { + LogUtils.i("111111111111111110ZZZZZZZZXXXXXXXXXX:" + IMApplication.schemeUserId); + + if (!TextUtils.isEmpty(IMApplication.schemeUserId)) { + LogUtils.i("111111111111111110ZZZZZZZZ:" + IMApplication.schemeUserId); + + new Handler().postDelayed(() -> { + XKitRouter.withKey(RouterConstant.PATH_USER_INFO_PAGE) + .withContext(MainActivity.this) + .withParam(RouterConstant.KEY_ACCOUNT_ID_KEY, IMApplication.schemeUserId) + .withParam("userId", IMApplication.schemeUserId) + .navigate(); + }, 100); //延迟12秒执行 + } + + if (!TextUtils.isEmpty(IMApplication.schemeTeamId)) { + LogUtils.i("1111111111111111100000:" + IMApplication.schemeTeamId); + + new Handler().postDelayed(() -> { + LogUtils.i("11111111111111111:" + IMApplication.schemeTeamId); + showQrcodeView(IMApplication.schemeTeamId); + }, 500); //延迟12秒执行 + + } else { + LogUtils.i("11111111111111111000002222222222:" + IMApplication.schemeTeamId); + + } + + if (!TextUtils.isEmpty(IMApplication.schemeSilverQrCode)) { + new Handler().postDelayed(() -> { + Intent intent2 = new Intent(MainActivity.this, JsBridgeActivity.class); + intent2.putExtra("url", IMUIKitConfig.SILVER_URL + IMApplication.schemeSilverQrCode); + intent2.putExtra("isV", false); + intent2.putExtra("isGame", false); + startActivity(intent2); + }, 100); + } + } + + + private void initRing() { + } + + public void changeWallet(WalletBean walletBean) { + this.walletBean = walletBean; + } + + protected void getBlacks() { + com.netease.yunxin.kit.chatkit.ui.network.Api.getInstance().blocks() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new com.netease.yunxin.kit.chatkit.ui.network.BaseObserver<>() { + + @Override + public void onSuccess(com.netease.yunxin.kit.chatkit.ui.network.Result> feedbackResp) { + ChatBaseFragment.blacks = feedbackResp.data; + + } + + @Override + public void onError(int code, String msg) { + + } + }); + } + + private void setAlias() { + JPushInterface.setAlias(MainActivity.this, Integer.parseInt(IMKitClient.account()), IMKitClient.account()); + } + + public void setUnReadChat(int number) { + if (number == 0) { + activityMainBinding.chatunread.setVisibility(View.GONE); + return; + } + activityMainBinding.chatunread.setVisibility(View.VISIBLE); + activityMainBinding.chatunread.setText(number > 99 ? "99+" : String.valueOf(number)); + } + + public void hideUnReadChat() { + activityMainBinding.chatunread.setVisibility(View.GONE); + } + + + /** + * 安卓13 申请通知权限 + */ + private void initNotifications() { + permissionLauncherNot = + registerForActivityResult( + new ActivityResultContracts.RequestMultiplePermissions(), + result -> { + + }); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + if (!PermissionUtils.hasPermissions( + MainActivity.this, Manifest.permission.POST_NOTIFICATIONS)) { + permissionLauncherNot.launch(new String[]{Manifest.permission.POST_NOTIFICATIONS}); + } + + } + } + + + public Comparator conversationComparator = + (bean1, bean2) -> { + int result; + if (bean1 == null) { + result = 1; + } else if (bean2 == null) { + result = -1; + } else if (bean1.isStickTop() == bean2.isStickTop()) { + long time = bean1.getTime() - bean2.getTime(); + result = time == 0L ? 0 : (time > 0 ? -1 : 1); + + } else { + result = bean1.isStickTop() ? -1 : 1; + } + ALog.d(ConversationConstant.LIB_TAG, TAG, "conversationComparator, result:" + result); + return result; + }; + + + @Override + protected void onPostResume() { + super.onPostResume(); + // 部分Android机型在页面进入onResume前启动其他页面会取消当前页面流程,避免组件初始化后立即展示来电页面将初始化的逻辑滞后 + if (!CallKitUI.INSTANCE.getInit()) { + configCallKit(); + } + } + + + public void getServiceId() { + Api.getInstance().helpCenterStaffsServiceId(IMUIKitConfig.SUBSTATIONID) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>>() { + + + @Override + public void onSuccess(Result> o) { + if (o.data != null && o.data.size() > 0) { + if (o.data.contains(IMKitClient.account())) { + ChatDataUtils.set(MainActivity.this, ChatKitUIConstant.SERVICES_LOGIN, true); + } + DataUtils.set(MainActivity.this, IMUIKitConfig.SERVICES_IDS_TAG + "_" + IMKitClient.account(), GsonUtils.beanToJSONString(o.data)); + } + } + + @Override + public void onError(int code, String msg) { + + } + }); + } + + private void initView() { + boolean isCommonSkin = + AppSkinConfig.getInstance().getAppSkinStyle() == AppSkinConfig.AppSkin.commonSkin; + ALog.d(Constant.PROJECT_TAG, "MainActivity:initView"); + loadConfig(); + List fragments = new ArrayList<>(); + shareDateUtils = new ShareDateUtils(); + shareDateUtils.getAllSessionList(); + shareDateUtils.getLocFriends(); + index2Fragment = new HomeFragment(); + chatTabFragment = new ChatTabFragment(); + voomFragment = new VoomFragment(); + walletFragment = new MineFragment(); + fragments.add(index2Fragment); + fragments.add(chatTabFragment); + fragments.add(voomFragment); + fragments.add(walletFragment); + + fragmentAdapter = new FragmentAdapter(this); + fragmentAdapter.setFragmentList(fragments); + activityMainBinding.viewPager.setUserInputEnabled(false); + activityMainBinding.viewPager.setAdapter(fragmentAdapter); + activityMainBinding.viewPager.setCurrentItem(START_INDEX, false); + activityMainBinding.viewPager.setOffscreenPageLimit(fragments.size()); + mCurrentTab = activityMainBinding.conversationBtnGroup; + resetTabSkin(isCommonSkin); + checkZhiWen(); + } + + private void checkZhiWen() { + //如果之前是已经录入了指纹的 现在没有指纹的 开启了指纹支付的 要关闭掉 + if (DataUtils.get(MainActivity.this, "hasFinger", false)) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + switch (FingerManager.checkSupport(MainActivity.this)) { + case DEVICE_UNSUPPORTED: + DataUtils.set(MainActivity.this, "hasFinger", false); + break; + case SUPPORT_WITHOUT_DATA: + DataUtils.set(MainActivity.this, "hasFinger", false); + break; + case SUPPORT: + break; + } + } + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + FingerManager.updateFingerData(MainActivity.this); + } + + } + + /** + * 一些回调通知。 + * + * @param requestCode 请求码 + * @param resultCode 结果码 + * @param data 数据 + */ + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (resultCode == RESULT_OK && data != null) { + switch (requestCode) { + // 从2维码扫描界面返回的结果回调 + case 1016: + Object obj = data.getParcelableExtra(ScanUtilNew.RESULT); + if (obj instanceof HmsScan) { + if (!TextUtils.isEmpty(((HmsScan) obj).getOriginalValue())) { + String result1 = ((HmsScan) obj).getOriginalValue(); + Log.v("LAILIAOLIAO", "行动码是啥:" + result1); + // 开始解析2维码内容并进入相应的处理逻辑 + processQRCodeScanResult(this, result1); + } + break; + } + } + } + } + + /** + * 解析2维码扫码结果并进入相应和业务逻辑处理(主要用于从2维码扫描界面扫描完成后的回调结果处理)。 + * + * @param originalQrcodeStr 扫描出的原始2维码字符串,形如"time_go_chat://add_user/400069" + */ + public void processQRCodeScanResult(Activity activity, String originalQrcodeStr) { + if (originalQrcodeStr != null) { + try { + if (originalQrcodeStr.startsWith(IMUIKitConfig.SHARE_INVCODE_START) && originalQrcodeStr.contains("userId")) { + originalQrcodeStr = originalQrcodeStr.replace(IMUIKitConfig.SHARE_INVCODE_START, "https://www.baidu.com"); + Uri uri = Uri.parse(originalQrcodeStr); + LogUtils.i("数据是啥:" + originalQrcodeStr); + String id = uri.getQueryParameter("userId"); //id 值 10943 + + XKitRouter.withKey(RouterConstant.PATH_USER_INFO_PAGE) + .withContext(activity) + .withParam(RouterConstant.KEY_ACCOUNT_ID_KEY, id) + .withParam("userId", id) + .navigate(); + } else if (originalQrcodeStr.startsWith(IMUIKitConfig.SHARE_INVCODE_START) + && originalQrcodeStr.contains("teamId")) { + originalQrcodeStr = originalQrcodeStr.replace(IMUIKitConfig.SHARE_INVCODE_START, "https://www.baidu.com"); + Uri uri = Uri.parse(originalQrcodeStr); + LogUtils.i("数据是啥:" + originalQrcodeStr); + String id = uri.getQueryParameter("teamId"); //id 值 10943 + showQrcodeView(id); + + } else if (originalQrcodeStr.startsWith(IMUIKitConfig.SHARE_INVCODE_START) + && originalQrcodeStr.contains("machineId") && originalQrcodeStr.contains("orderNo")) { + originalQrcodeStr = originalQrcodeStr.replace(IMUIKitConfig.SHARE_INVCODE_START, "https://www.baidu.com"); + Uri uri = Uri.parse(originalQrcodeStr); + LogUtils.i("数据是啥:" + originalQrcodeStr); + String machineId = uri.getQueryParameter("machineId"); //id 值 10943 + String orderNo = uri.getQueryParameter("orderNo"); //id 值 10943 + String money = uri.getQueryParameter("money"); + showGiftView(machineId, orderNo, money); + + } else if (originalQrcodeStr.startsWith(IMUIKitConfig.SHARE_INVCODE_START) && originalQrcodeStr.contains("silver_qr_code")) { + originalQrcodeStr = originalQrcodeStr.replace(IMUIKitConfig.SHARE_INVCODE_START, "https://www.baidu.com"); + Uri uri = Uri.parse(originalQrcodeStr); + String silverQrCode = uri.getQueryParameter("silver_qr_code"); // + Intent intent2 = new Intent(MainActivity.this, JsBridgeActivity.class); + intent2.putExtra("url", IMUIKitConfig.SILVER_URL + silverQrCode); + intent2.putExtra("isV", false); + intent2.putExtra("isGame", false); + startActivity(intent2); + } else { + QRCodeScheme.QRCodeData qrData = QRCodeScheme.parseCodeData(originalQrcodeStr); + // 2维码内容前缀(形如“time_go_chat://add_user/”) + LogUtils.i("行动码是啥111:" + GsonUtils.beanToJSONString(qrData)); + + String scheme = qrData.getScheme(); + // 2维码内容(形如“400069”) + String value = qrData.getValue(); + String uid = qrData.getUserId(); + if (!CommonUtils.isStringEmpty(scheme, true) && !CommonUtils.isStringEmpty(value, true)) { + LogUtils.i("行动码是啥222:" + scheme); + + switch (scheme) { + case QRCodeScheme.QR_CODE_SCHEME_ADD_USER: + XKitRouter.withKey(RouterConstant.PATH_USER_INFO_PAGE) + .withContext(activity) + .withParam(RouterConstant.KEY_ACCOUNT_ID_KEY, value) + .withParam("userId", value) + .navigate(); + break; + case QRCodeScheme.QR_CODE_PSCHEME_JOIN_GROUP: + showQrcodeView(value); + break; + case QRCodeScheme.QR_CODE_PSCHEME_LOGIN_WEB: + showShouQuan(value); + break; + case QRCodeScheme.QR_CODE_PSCHEME_PAYMENT_CODE: + Intent intent = new Intent(MainActivity.this, PaymentActivity.class); + intent.putExtra("userId", value); + startActivity(intent); + break; + case QRCodeScheme.QR_CODE_PSCHEME_PAYMENT_ATM: + + if (bindBean != null) { + if (!bindBean.getPhoneBind()) { + showDialog(); + } else if (!bindBean.getPayPasswordSet()) { + showDialogPay(); + } else { + if (DataUtils.get(MainActivity.this, "hasFinger", false)) { + showPayCashFingerDialog(value, uid, TYPE_PAYMENT_DUIBI); + } else { + showPayCashDialog(value, uid, TYPE_PAYMENT_DUIBI); + } + } + } + break; + case QRCodeScheme.QR_CODE_PSCHEME_PAYMENT_BEAD: + if (bindBean != null) { + if (!bindBean.getPhoneBind()) { + showDialog(); + } else if (!bindBean.getPayPasswordSet()) { + showDialogPay(); + } else { + if (DataUtils.get(MainActivity.this, "hasFinger", false)) { + showPayCashFingerDialog(value, uid, TYPE_PAYMENT_BEAD); + } else { + showPayCashDialog(value, uid, TYPE_PAYMENT_BEAD); + } + } + } + break; + case QRCodeScheme.QR_CODE_PSCHEME_SILVER_QR_CODE: + Intent intent2 = new Intent(MainActivity.this, JsBridgeActivity.class); + intent2.putExtra("url", IMUIKitConfig.SILVER_URL + value); + intent2.putExtra("isV", false); + intent2.putExtra("isGame", false); + startActivity(intent2); + break; + case QRCodeScheme.QR_CODE_PSCHEME_BIZ_RECEIVE: + Intent intent3 = new Intent(MainActivity.this, PaymentActivity.class); + intent3.putExtra("userId", value); + intent3.putExtra("userType", 1); + startActivity(intent3); + break; + default: + if (scheme.startsWith("http")) { + if (scheme.startsWith("https://admin.letschat2023.com/") && scheme.contains("deviceId")) { + sendMachine(scheme); + } else { + showErrCode(getString(R.string.qrcode_scan_activity_not_surpport_qrcontent)); + } + } else { + showErrCode(getString(R.string.qrcode_scan_activity_not_surpport_qrcontent)); + } + break; + } + } else { + if (scheme.startsWith("http")) { + if (scheme.startsWith("https://admin.letschat2023.com/") && scheme.contains("deviceId")) { + sendMachine(scheme); + } else { + showErrCode(getString(R.string.qrcode_scan_activity_not_surpport_qrcontent)); + } + } else { + showErrCode(getString(R.string.qrcode_scan_activity_not_surpport_qrcontent)); + + } + } + } + } catch (Exception e) { + + } + } else { + showErrCode(getString(R.string.qrcode_scan_activity_not_invalid_qrcode)); + + } + } + + private String orderNo; + + private void showGiftView(String machineId, String orderNos, String moneys) { + this.orderNo = orderNos; + LogUtils.i("进来了啊"); + if (bindBean != null) { + if (!bindBean.getPhoneBind()) { + showDialog(); + } else if (!bindBean.getPayPasswordSet()) { + showDialogPay(); + } else { + LogUtils.i("进来了啊11111"); + + if (DataUtils.get(MainActivity.this, "hasFinger", false)) { + showPayCashFingerDialog(machineId, moneys, TYPE_PAYMENT_GIFT); + } else { + LogUtils.i("进来了啊22222222"); + + showPayCashDialog(machineId, moneys, TYPE_PAYMENT_GIFT); + } + } + } + } + + private void showShouQuan(String value) { + Intent intent = new Intent(MainActivity.this, AuthorizeActivity.class); + intent.putExtra("deviceId", value); + intent.putExtra("isWebLogin", true); + startActivity(intent); + } + + PayCashDialog payDialog; + PayCashFingerDialog payCashFingerDialog; + + private void showPayCashDialog(String did, String number, int type) { + payDialog = new PayCashDialog(MainActivity.this, (Integer.parseInt(number)) + "", true, 0, walletBean, + null, 2, String.format(getString(R.string.fukuangei_txt), getString(R.string.duibiji_txt))); + if (type == TYPE_PAYMENT_GIFT) { + + payDialog = new PayCashDialog(MainActivity.this, (Integer.parseInt(number)) + "", true, 0, walletBean, + null, 2, String.format(getString(R.string.fukuangei_txt), getString(R.string.duibiji_txt2)), 1); + } else if (type == TYPE_PAYMENT_BEAD) { + payDialog = new PayCashDialog(MainActivity.this, (Integer.parseInt(number)) + "", true, 0, walletBean, + null, 2, String.format(getString(R.string.fukuangei_txt), getString(R.string.shuzhuji_txt))); + } + payDialog.setOntoAlbumListener(new PayCashDialog.OnListItemClickListener() { + @Override + public void onPayPass(String position) { + if (type == MainActivity.TYPE_PAYMENT_DUIBI) { + toChange(position, did, number, 1); + } else if (type == MainActivity.TYPE_PAYMENT_BEAD) { + toChange2(position, did, number, 1); + } else { + toChange1(position, did, number, 1); + } + } + + @RequiresApi(api = Build.VERSION_CODES.M) + @Override + public void onChangeFinger() { + showPayCashFingerDialog(did, number, type); + } + + @Override + public void dimess() { + payDialog.dismiss(); + + } + }); + payDialog.show(); + } + + private void toChange(String password, String did, String number, int type) { + Map maps = new HashMap<>(); + maps.put("amount", Integer.parseInt(number) * 100); + maps.put("payVerifyCode", type); + if (!TextUtils.isEmpty(password)) { + maps.put("payPassword", password); + } + maps.put("deviceId", did); + Api.getInstance().selfHelpATM(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver() { + @Override + public void onSuccess(Result feedbackResp) { + ToastX.showShortToast(getString(R.string.zhiufuchengg_txt)); + getWallet(); + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast(msg); + + } + }); + } + + private void showPayCashFingerDialog(String did, String number, int type) { + //Context context, String data, boolean showNumber, int payType, WalletBean walletBean, SelectPayTypeDialog.OnToTypeListener onToTypeListener, int isShowFinger + payCashFingerDialog = new PayCashFingerDialog(this, (Integer.parseInt(number)) + "", true, 0, walletBean, null, 2, + String.format(getString(R.string.fukuangei_txt), getString(R.string.duibiji_txt))); + if (type == TYPE_PAYMENT_GIFT) { + payCashFingerDialog = new PayCashFingerDialog(this, (Integer.parseInt(number)) + "", true, 0, walletBean, null, 2, + String.format(getString(R.string.fukuangei_txt), getString(R.string.duibiji_txt2)), true); + } else if (type == TYPE_PAYMENT_BEAD) { + payCashFingerDialog = new PayCashFingerDialog(this, (Integer.parseInt(number)) + "", true, 0, walletBean, null, 2, + String.format(getString(R.string.fukuangei_txt), getString(R.string.shuzhuji_txt))); + } + payCashFingerDialog.setOntoAlbumListener(new PayCashFingerDialog.OnListItemClickListener() { + @Override + public void onChangePassword() { + showPayCashDialog(did, number, type); + } + + @Override + public void toFinger() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + checkPayFinger(did, number, type); + } + } + + @Override + public void dimess() { + payCashFingerDialog.dismiss(); + } + }); + payCashFingerDialog.show(); + } + + @RequiresApi(api = Build.VERSION_CODES.M) + private void checkPayFinger(String did, String number, int type) { + + FingerManager.build().setApplication(IMApplication.getInstance()) + .setTitle(" ") + .setDes(" ") + .setNegativeText(" ") + .setFingerCheckCallback(new SimpleFingerCheckCallback() { + + @Override + public void onSucceed() { + ToastX.showShortToast("验证成功"); + payCashFingerDialog.dismiss(); + if (type == TYPE_PAYMENT_DUIBI) { + toChange(null, did, number, 2); + } else if (type == MainActivity.TYPE_PAYMENT_BEAD) { + toChange2(null, did, number, 2); + } else { + toChange1(null, did, number, 2); + } + } + + @Override + public void onError(String error) { + ToastX.showShortToast("验证失败"); + + } + + @Override + public void onCancel() { + ToastX.showShortToast("您取消了识别"); + + } + }) + .setFingerChangeCallback(new AonFingerChangeCallback() { + + @Override + protected void onFingerDataChange() { + ToastX.showShortToast("指纹数据发生了变化"); + FingerManager.updateFingerData(MainActivity.this); + new Handler().postDelayed(() -> checkPayFinger(did, number, type), 1000); + } + }) + .create() + .startListener(MainActivity.this); + } + + private void toChange1(String password, String did, String number, int type) { + Map maps = new HashMap<>(); + maps.put("amount", Long.parseLong(number) * 100); + maps.put("orderNo", orderNo); + maps.put("payVerifyCode", type); + if (!TextUtils.isEmpty(password)) { + maps.put("payPassword", password); + } + Api.getInstance().cabinet(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result feedbackResp) { + ToastX.showShortToast(getString(R.string.zhiufuchengg_txt)); + getWallet(); + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast(msg); + + } + }); + } + + private void toChange2(String password, String did, String number, int type) { + Map maps = new HashMap<>(); + maps.put("amount", Integer.parseInt(number) * 100); + maps.put("payVerifyCode", type); + if (!TextUtils.isEmpty(password)) { + maps.put("payPassword", password); + } + maps.put("deviceId", did); + Api.getInstance().danzhuPay(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver() { + @Override + public void onSuccess(Result feedbackResp) { + ToastX.showShortToast(getString(R.string.zhiufuchengg_txt)); + getWallet(); + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast(msg); + + } + }); + } + + + private void toChange3(String password, String bizId, String amount, int type) { + Map maps = new HashMap<>(); + maps.put("amount", Integer.parseInt(amount) * 100); + maps.put("payVerifyCode", type); + if (!TextUtils.isEmpty(password)) { + maps.put("payPassword", password); + } + maps.put("bizId", bizId); + Api.getInstance().transferCashPay(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver() { + @Override + public void onSuccess(Result feedbackResp) { + ToastX.showShortToast(getString(R.string.zhiufuchengg_txt)); + getWallet(); + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast(msg); + + } + }); + } + + private void showErrCode(String errorMessage) { + ActionConfirmDialog actionConfirmDialog = new ActionConfirmDialog(MainActivity.this, errorMessage, "", + getString(R.string.general_got_it), false); + actionConfirmDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + } + + @Override + public void toCancel() { + + } + }); + actionConfirmDialog.show(); + } + + + private ImageView coloseIv; + private TextView joinTitleTv; + private ContactAvatarView groupHeadIv; + private TextView joinTv; + private TextView groupNameTv; + + private void showQrcodeView(String groupId) { + BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(this, R.style.BottomSheetDialog); + + View bottomView = LayoutInflater.from(MainActivity.this).inflate(R.layout.bottom_sheet_join_group, null); + coloseIv = (ImageView) bottomView.findViewById(R.id.colose_iv); + joinTitleTv = (TextView) bottomView.findViewById(R.id.join_title_tv); + groupHeadIv = (ContactAvatarView) bottomView.findViewById(R.id.group_head_iv); + joinTv = (TextView) bottomView.findViewById(R.id.join_tv); + LogUtils.i("1111111111111111122222222222:" + IMApplication.schemeTeamId); + + Team team = NIMClient.getService(TeamService.class).queryTeamBlock(groupId); + groupNameTv = (TextView) bottomView.findViewById(R.id.group_name_tv); + if (team != null) { + LogUtils.i("11111111111111111333333333333:" + IMApplication.schemeTeamId); + + if (TextUtils.isEmpty(team.getIcon())) { + groupHeadIv.setData(com.netease.yunxin.kit.contactkit.ui.R.mipmap.ic_group_defaulthead, "head"); + } else { + groupHeadIv.setData(team.getIcon(), team.getName()); + } + groupNameTv.setText(team.getName()); + if (team.isMyTeam()) { + LogUtils.i("加入群聊成功1111111111111111111"); + joinTitleTv.setText(R.string.jinru_group_txt); + joinTv.setText(R.string.jinru_group_txt); + } else { + LogUtils.i("加入群聊成功22222222222222"); + + joinTitleTv.setText(R.string.join_group_txt); + joinTv.setText(R.string.join_group_txt); + } + joinTv.setOnClickListener(v -> { + if (team.isMyTeam()) { + bottomSheetDialog.dismiss(); + XKitRouter.withKey(RouterConstant.PATH_FUN_CHAT_TEAM_PAGE) + .withParam(RouterConstant.CHAT_KRY, team) + .withContext(MainActivity.this) + .navigate(); + LogUtils.i("加入群聊成功33333333333333"); + + } else { + NIMClient.getService(TeamService.class).applyJoinTeam(groupId, null).setCallback(new RequestCallback() { + @Override + public void onSuccess(Team team1) { + LogUtils.i("加入群聊成功4444444444444444444"); + + LogUtils.i("加入群聊成功:" + GsonUtils.beanToJSONString(team1)); + bottomSheetDialog.dismiss(); + + XKitRouter.withKey(RouterConstant.PATH_FUN_CHAT_TEAM_PAGE) + .withParam(RouterConstant.CHAT_KRY, team1) + .withContext(MainActivity.this) + .navigate(); + } + + @Override + public void onFailed(int code) { + //仅仅是申请成功,code 808 + if (code == ResponseCode.RES_TEAM_APPLY_SUCCESS) { + bottomSheetDialog.dismiss(); + + ToastX.showShortToast(R.string.dendaiqueren_txt); + } + // 已经在群里,code 809 + else if (code == ResponseCode.RES_TEAM_ALREADY_IN) { + getJoinInfo(groupId, true, bottomSheetDialog); + // 群人数已达上限 + } else if (code == ResponseCode.RES_TEAM_LIMIT) { + bottomSheetDialog.dismiss(); + + ToastX.showShortToast(R.string.team_num_limit); + } else { + bottomSheetDialog.dismiss(); + + ToastX.showShortToast("failed, error code =" + code); + + } + } + + @Override + public void onException(Throwable exception) { + // error + bottomSheetDialog.dismiss(); + + ToastX.showShortToast(exception.getMessage()); + + } + }); + } + }); + } else { + LogUtils.i("1111111111111111144444444444:" + IMApplication.schemeTeamId); + + joinTitleTv.setText(R.string.join_group_txt); + joinTv.setText(R.string.join_group_txt); + getJoinInfo(groupId, false, bottomSheetDialog); + LogUtils.i("加入群聊成功555555555555"); + + joinTv.setOnClickListener(v -> NIMClient.getService(TeamService.class).applyJoinTeam(groupId, null).setCallback(new RequestCallback() { + @Override + public void onSuccess(Team team1) { + LogUtils.i("加入群聊成功:" + GsonUtils.beanToJSONString(true)); + LogUtils.i("加入群聊成功6666666666666666"); + bottomSheetDialog.dismiss(); + XKitRouter.withKey(RouterConstant.PATH_FUN_CHAT_TEAM_PAGE) + .withParam(RouterConstant.CHAT_KRY, team1) + .withContext(MainActivity.this) + .navigate(); + } + + @Override + public void onFailed(int code) { + //仅仅是申请成功,code 808 + if (code == ResponseCode.RES_TEAM_APPLY_SUCCESS) { + bottomSheetDialog.dismiss(); + + ToastX.showShortToast(R.string.dendaiqueren_txt); + } + // 已经在群里,code 809 + else if (code == ResponseCode.RES_TEAM_ALREADY_IN) { + + getJoinInfo(groupId, true, bottomSheetDialog); + // 群人数已达上限 + } else if (code == ResponseCode.RES_TEAM_LIMIT) { + bottomSheetDialog.dismiss(); + + ToastX.showShortToast(R.string.team_num_limit); + } else { + bottomSheetDialog.dismiss(); + + ToastX.showShortToast("failed, error code =" + code); + + } + } + + @Override + public void onException(Throwable exception) { + // error + ToastX.showShortToast(exception.getMessage()); + + } + })); + + } + + + coloseIv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + bottomSheetDialog.dismiss(); + } + }); + + bottomSheetDialog.setContentView(bottomView); + bottomSheetDialog.show(); + IMApplication.schemeTeamId = null; + + bottomSheetDialog.setOnDismissListener(dialog -> getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white))); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + AdaptScreenUtils.setWhiteNavigationBar(bottomSheetDialog); + } + + } + + private void getJoinInfo(String gid, boolean b, BottomSheetDialog dialog) { + NIMClient.getService(TeamService.class).searchTeam(gid).setCallback(new RequestCallback() { + @Override + public void onSuccess(Team result) { + if (!b) { + LogUtils.i("加入群聊成功7777777777777777"); + groupHeadIv.setData(result.getIcon(), result.getName()); + groupNameTv.setText(result.getName()); + } else { + LogUtils.i("加入群聊成功88888888888888"); + dialog.dismiss(); + XKitRouter.withKey(RouterConstant.PATH_FUN_CHAT_TEAM_PAGE) + .withParam(RouterConstant.CHAT_KRY, result) + .withContext(MainActivity.this) + .navigate(); + } + + } + + @Override + public void onFailed(int code) { + dialog.dismiss(); + } + + @Override + public void onException(Throwable exception) { + dialog.dismiss(); + } + }); + } + + private void sendMachine(String scheme) { + scheme = scheme.replace("https://admin.letschat2023.com/#/downLoad", "https://www.baidu.com"); + Uri uri = Uri.parse(scheme); + LogUtils.i("数据是啥:" + scheme); + String id = uri.getQueryParameter("deviceId"); //id 值 10943 + Intent intent = new Intent(MainActivity.this, AuthorizeActivity.class); + intent.putExtra("deviceId", id); + startActivity(intent); + } + + @Override + protected void onResume() { + super.onResume(); + if (bindBean == null || (!bindBean.getPhoneBind()) || (!bindBean.getPayPasswordSet())) { + bindInfo(); + } + } + + private void bindInfo() { + Api.getInstance().bindInfo(IMKitClient.account()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + bindBean = feedbackResp.data; + LogUtils.i("获取到的数据:" + GsonUtils.beanToJSONString(bindBean)); + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + } + }); + + } + + @Override + protected void onDestroy() { + ALog.d(Constant.PROJECT_TAG, "MainActivity:onDestroy"); + EventCenter.unregisterEventNotify(skinNotify); + ChatObserverRepo.unregisterReceiveMessageObserve(receiveMessageObserver); + if (mEventSubscription != null) { + mEventSubscription.unsubscribe(); + } + super.onDestroy(); + } + + @SuppressLint("UseCompatLoadingForDrawables") + public void tabClick(View view) { + resetTabStyle(); + mCurrentTab = view; + resetTabSkin(AppSkinConfig.getInstance().getAppSkinStyle() == AppSkinConfig.AppSkin.commonSkin); + + AnimUtil.setAnimViews(1.05f, activityMainBinding.contactBtnGroup, activityMainBinding.liveBtnGroup, + activityMainBinding.myselfBtnGroup, activityMainBinding.conversationBtnGroup); + + } + + @SuppressLint("UseCompatLoadingForDrawables") + private void resetTabSkin(boolean isCommonSkin) { + if (mCurrentTab == activityMainBinding.contactBtnGroup) { + activityMainBinding.viewPager.setCurrentItem(1, false); + activityMainBinding.contact.setTextColor( + getResources().getColor(R.color.color_fe6881)); + activityMainBinding.contact.setCompoundDrawablesWithIntrinsicBounds( + null, getResources().getDrawable(R.mipmap.chat_img_t), null, null); + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR); + } else if (mCurrentTab == activityMainBinding.liveBtnGroup) { + activityMainBinding.viewPager.setCurrentItem(2, false); + activityMainBinding.live.setTextColor( + getResources().getColor(R.color.color_fe6881)); + activityMainBinding.live.setCompoundDrawablesWithIntrinsicBounds( + null, getResources().getDrawable(R.mipmap.voom_img_t), null, null); + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR | View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR); + } else if (mCurrentTab == activityMainBinding.myselfBtnGroup) { + activityMainBinding.viewPager.setCurrentItem(3, false); + activityMainBinding.mine.setTextColor(getResources().getColor(R.color.color_fe6881)); + activityMainBinding.mine.setCompoundDrawablesWithIntrinsicBounds( + null, getResources().getDrawable(R.mipmap.wo_t), null, null); + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR); + } else if (mCurrentTab == activityMainBinding.conversationBtnGroup) { + activityMainBinding.viewPager.setCurrentItem(0, false); + activityMainBinding.conversation.setTextColor( + getResources().getColor(R.color.color_fe6881)); + activityMainBinding.conversation.setCompoundDrawablesWithIntrinsicBounds( + null, getResources().getDrawable(R.mipmap.index_img_t), null, null); + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR); + + } + } + + + @SuppressLint("UseCompatLoadingForDrawables") + private void resetTabStyle() { + + activityMainBinding.conversation.setTextColor( + getResources().getColor(R.color.color_898989)); + activityMainBinding.conversation.setCompoundDrawablesWithIntrinsicBounds( + null, getResources().getDrawable(R.mipmap.index_img_f), null, null); + + activityMainBinding.contact.setTextColor(getResources().getColor(R.color.color_898989)); + activityMainBinding.contact.setCompoundDrawablesWithIntrinsicBounds( + null, getResources().getDrawable(R.mipmap.chat_img_f), null, null); + + activityMainBinding.live.setTextColor(getResources().getColor(R.color.color_898989)); + activityMainBinding.live.setCompoundDrawablesWithIntrinsicBounds( + null, getResources().getDrawable(R.mipmap.voom_img_f), null, null); + + activityMainBinding.mine.setTextColor(getResources().getColor(R.color.color_898989)); + activityMainBinding.mine.setCompoundDrawablesWithIntrinsicBounds( + null, getResources().getDrawable(R.mipmap.wo_f), null, null); + } + + public void toScan() { + if (PermissionUtils.hasPermissions( + MainActivity.this, Manifest.permission.CAMERA)) { + ScanUtilNew.startScan(MainActivity.this, MainActivity.REQUEST_CODE_FOR_QRCODE_SCAN, + new HmsScanAnalyzerOptions.Creator().setHmsScanTypes(HmsScan.ALL_SCAN_TYPE).create()); + } else { + requestCameraPermission(Manifest.permission.CAMERA); + } + } + + public void toQrcode() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + showQrcodeView(); + } + } + + public void toWalletAction(int type) { + if (bindBean != null) { + if (!bindBean.getPhoneBind()) { + showDialog(); + } else { + + if (!bindBean.getPayPasswordSet()) { + showDialogPay(); + return; + } + + if (type == TYPE_TRANSFER) { + Intent intent = new Intent(MainActivity.this, PaymentActivity1.class); + startActivity(intent); + } else if (type == TYPE_PAYMENT) { + Intent intent = new Intent(MainActivity.this, CollectionAndPaymentActivity.class); + startActivity(intent); + } else if (type == TYPE_PAYMENT_COLLECTION) { + Intent intent = new Intent(MainActivity.this, CollectionAndPaymentActivity.class); + intent.putExtra("isShoukuan", true); + startActivity(intent); + } + } + } + } + + private void showDialogPay() { + + com.netease.yunxin.kit.chatkit.ui.dialog.ActionConfirmDialog actionDialog = new com.netease.yunxin.kit.chatkit.ui.dialog.ActionConfirmDialog(MainActivity.this, + getString(com.netease.yunxin.kit.chatkit.ui.R.string.bind_phone_des_txt1), getString(com.netease.yunxin.kit.chatkit.ui.R.string.cancel_txt), getString(com.netease.yunxin.kit.chatkit.ui.R.string.to_sett_txt)); + actionDialog.setOnToActionListener(new com.netease.yunxin.kit.chatkit.ui.dialog.ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + Intent intent = new Intent(MainActivity.this, SetPayPasswordActivity.class); + startActivity(intent); + } + + @Override + public void toCancel() { + + } + }); + actionDialog.show(); + } + + private void showDialog() { + + ActionConfirmDialog actionDialog = new ActionConfirmDialog(MainActivity.this, + getString(R.string.bind_phone_des_txt), getString(R.string.nobind_txt), getString(R.string.tobind_txt)); + actionDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + Intent intent = new Intent(MainActivity.this, ChangeAccoutActionActivity.class); + intent.putExtra("type", ChangeAccoutActionActivity.TYPE_BIND_PHONE); + startActivity(intent); + } + + @Override + public void toCancel() { + + } + }); + actionDialog.show(); + } + + + public String getPermissionText(String permission) { + String text = getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_default); + if (TextUtils.equals(permission, Manifest.permission.CAMERA)) { + text = getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_camera); + } else if (TextUtils.equals(permission, Manifest.permission.READ_EXTERNAL_STORAGE)) { + text = getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_storage); + } else if (TextUtils.equals(permission, Manifest.permission.RECORD_AUDIO)) { + text = getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_audio); + } + return text; + } + + private void requestCameraPermission(String permission) { + permissionLauncher.launch(new String[]{permission}); + } + + + private void configCallKit() { + CallKitUIOptions options = new CallKitUIOptions.Builder().soundHelper(new SoundHelper() { + @Override + public boolean isEnable() { + return true; + } + + @Nullable + @Override + public Integer soundResources(@NonNull AVChatSoundPlayer.RingerTypeEnum type) { + int resId; + if (type == AVChatSoundPlayer.RingerTypeEnum.CONNECTING) { + resId = com.netease.yunxin.nertc.ui.R.raw.avchat_ring; + } else if (type == AVChatSoundPlayer.RingerTypeEnum.RING) { + resId = getResources().getIdentifier(ChatDataUtils.getCellBell(IMKitClient.getUserInfo()), "raw", getPackageName()); + } else { + //結束 + resId = R.raw.nosound; + } + return resId; + } + }).rtcAppKey(DataUtils.readAppKey(this)) + .currentUserAccId(IMKitClient.account()) + .userInfoHelper(new UserInfoHelper() { + @Override + public boolean fetchNickname(@NonNull String s, @NonNull Function1 function1) { + LogUtils.d("s===" + s + function1); + FriendInfo friendInfo = ContactRepo.getFriend(s); + if (friendInfo != null) { + function1.invoke(friendInfo.getName()); + } + return true; + } + + @Override + public boolean fetchNicknameByTeam(@NonNull String s, @NonNull String s1, @NonNull Function1 function1) { + return false; + } + + @Override + public boolean loadAvatar(@NonNull Context context, @NonNull String s, @NonNull ImageView imageView) { + return false; + } + }) + .timeOutMillisecond(30 * 1000L) + .pushConfigProvider(new PushConfigProvider() { + @Override + public SignallingPushConfig providePushConfig(InvitedInfo invitedInfo) { + return new SignallingPushConfig(true, (invitedInfo.channelType == ChannelType.AUDIO.getValue() + ? getString(R.string.incoming_call_notify_audio) + : getString(R.string.incoming_call_notify_video)), (invitedInfo.channelType == ChannelType.AUDIO.getValue() + ? getString(R.string.incoming_call_notify_audio) + : getString(R.string.incoming_call_notify_video)), + setPushPload(ContactRepo.getUserInfo(invitedInfo.currentAccId)) + ); + } + }) + // 收到被叫时若 app 在后台,在恢复到前台时是否自动唤起被叫页面,默认为 true + .resumeBGInvitation(true) + .notificationConfigFetcher(new Function1() { + @RequiresApi(api = Build.VERSION_CODES.O) + @Override + public CallKitNotificationConfig invoke(InvitedInfo invitedInfo) { + UserInfo info = ContactRepo.getUserInfo(invitedInfo.currentAccId); + String content = + (info != null ? info.getUserInfoName() : invitedInfo.currentAccId) + + (invitedInfo.channelType == ChannelType.AUDIO.getValue() + ? getString(R.string.incoming_call_notify_audio) + : getString(R.string.incoming_call_notify_video)); + String callName = ChatDataUtils.getCellBell(IMKitClient.getUserInfo()); + LogUtils.d("NotificationConfig callName==" + callName); + int rawResource = getResources().getIdentifier(callName, "raw", getPackageName()); + Uri musicUri = Uri.parse("android.resource://com.dskj.rbchat/raw/" + callName); + return new CallKitNotificationConfig(R.mipmap.ic_logo, callName, getString(R.string.message_notifycontent_avchat), content, musicUri); + } + }) + // 请求 rtc token 服务,若非安全模式则不需设置(V1.8.0版本之前需要配置,V1.8.0及之后版本无需配置) + //.rtcTokenService((uid, callback) -> requestRtcToken(appKey, uid, callback)) // 自己实现的 token 请求方法 + // 设置初始化 rtc sdk 相关配置,按照所需进行配置 + .rtcSdkOption(new NERtcOption()) + // 呼叫组件初始化 rtc 范围,true-全局初始化,false-每次通话进行初始化以及销毁 + // 全局初始化有助于更快进入首帧页面,当结合其他组件使用时存在rtc初始化冲突可设置false + .rtcInitScope(false) + .build(); + // 设置自定义话单消息发送 + NERTCVideoCall.sharedInstance().setCallOrderListener(new CustomCallOrderHelper()); +// // 若重复初始化会销毁之前的初始化实例,重新初始化 + CallKitUI.init(getApplicationContext(), options); + + NIMClient.getService(AuthServiceObserver.class).observeOnlineStatus(new Observer() { + @Override + public void onEvent(StatusCode statusCode) { + if (statusCode == StatusCode.LOGOUT) { + CallKitUI.destroy(); + } else if (statusCode.wontAutoLogin()) { + if (!isFinishing()) { + ActionConfirmDialog1 actionConfirmDialog = new ActionConfirmDialog1(MainActivity.this, getString(R.string.tcdl_tips_txt1), "", getString(R.string.general_got_it), false); + actionConfirmDialog.setOnToActionListener(new ActionConfirmDialog1.OnToActionListener() { + @Override + public void toSumbit() { + DataUtils.set(MainActivity.this, IMUIKitConfig.LOGIN_ACCOUNT, ""); + DataUtils.set(MainActivity.this, IMUIKitConfig.LOGIN_TOKEN, ""); + startActivity(new Intent(MainActivity.this, WelcomeActivity.class)); + CallKitUI.destroy(); + finish(); + } + + @Override + public void toCancel() { + DataUtils.set(MainActivity.this, IMUIKitConfig.LOGIN_ACCOUNT, ""); + DataUtils.set(MainActivity.this, IMUIKitConfig.LOGIN_TOKEN, ""); + startActivity(new Intent(MainActivity.this, WelcomeActivity.class)); + CallKitUI.destroy(); + finish(); + } + }); + actionConfirmDialog.setSureBg(R.drawable.cornor_themblue_12dp); + actionConfirmDialog.show(); + } + } + } + }, true); + } + + public Map setPushPload(UserInfo userInfo) { + Map map = new HashMap<>(); + String value = ChatDataUtils.getCellBell(userInfo); + map.put("sound", value + ".caf"); + return map; + } + + + private void loadConfig() { + CustomConfig.configContactKit(this); + CustomConfig.configConversation(this); + CustomConfig.configChatKit(this); + } + + //皮肤变更事件 + public static class SkinEvent extends BaseEvent { + @NonNull + @Override + public String getType() { + return "skinEvent"; + } + } + + private void changeSystemLanguage() { + Map maps = new HashMap<>(); + String lauguage = DataUtils.getLauguage(MainActivity.this); + maps.put("language", lauguage); + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + Api.getInstance().authUser(IMKitClient.account(), maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(); + + } + + + public void toTlt() { + if (bindBean != null) { + if (!bindBean.getPhoneBind()) { + showDialog(); + } else { + toWaWaJi(); + } + } + } + + + public void toGame(String url) { + if (bindBean != null) { + if (!bindBean.getPhoneBind()) { + showDialog(); + } else { + toGameInfo(url); + } + } + } + + private void toGameInfo(String url) { + Intent intent = new Intent(MainActivity.this, JsBridgeActivity.class); + intent.putExtra("url", url); + intent.putExtra("isGame", true); + startActivity(intent); + } + + + public void toSShop(boolean isLoc) { + if (bindBean != null) { + if (!bindBean.getPhoneBind()) { + showDialog(); + } else { + toShop(isLoc); + } + } + } + + private void toShop(boolean isLoc) { + Intent intent = new Intent(MainActivity.this, JsBridgeActivity.class); + if (isLoc) { + intent.putExtra("url", IMUIKitConfig.YINBI_PATH_LOC); + } else { + intent.putExtra("url", IMUIKitConfig.YINBI_PATH); + + } + intent.putExtra("isGame", true); + startActivity(intent); + + + } + + + private void toWaWaJi() { + Intent intent = new Intent(MainActivity.this, JsBridgeActivity.class); + intent.putExtra("url", IMUIKitConfig.WAWAJ_PATH); + intent.putExtra("isGame", true); + startActivity(intent); + + + } + + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_BACK) { + Intent intent = new Intent(Intent.ACTION_MAIN); + intent.addCategory(Intent.CATEGORY_HOME); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + return true; + } + return super.onKeyDown(keyCode, event); + } + + private void getWallet() { + Api.getInstance().walletInfo(IMKitClient.account()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + + @Override + public void onSuccess(Result feedbackResp) { + walletBean = feedbackResp.data; + RxBus.getInstance().post(walletBean); + } + + @Override + public void onError(int code, String msg) { + } + }); + + + } + + /** + * 转账开关配置 + */ + private void getConfig() { + Api.getInstance().getConfig() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + + @Override + public void onSuccess(Result> feedbackResp) { + + if (feedbackResp.data != null && feedbackResp.data.size() > 0) { + for (ConfigBean configBean : feedbackResp.data) { + if (configBean.getId() == 1) { + DataUtils.set(MainActivity.this, "transfer_cash", configBean.getVal().equals("1")); + } + if (configBean.getId() == 2) { + DataUtils.set(MainActivity.this, "transfer_jifen", configBean.getVal().equals("1")); + } + } + + + } + + } + + @Override + public void onError(int code, String msg) { + + } + }); + } + + public void setConfig() { + DataUtils.set(MainActivity.this, "transfer_cash", false); + DataUtils.set(MainActivity.this, "transfer_jifen", false); + } + + + private ImageView coloseIv1; + private LinearLayout qrcodeLy; + private ImageView qrcodeIv; + private TextView qrcodeTipsTv; + private LinearLayout qrcodeActionLy; + private TextView copyTv; + private TextView shareTv; + private TextView saveTv; + private TextView shuaxinTv; + + @RequiresApi(api = Build.VERSION_CODES.M) + private void showQrcodeView() { + BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(this, R.style.BottomSheetDialog); + + View bottomView = LayoutInflater.from(MainActivity.this).inflate(R.layout.bottom_sheet_qrcode_layout, null); + + coloseIv1 = (ImageView) bottomView.findViewById(R.id.colose_iv); + qrcodeLy = (LinearLayout) bottomView.findViewById(R.id.qrcode_ly); + qrcodeIv = (ImageView) bottomView.findViewById(R.id.qrcode_iv); + qrcodeTipsTv = (TextView) bottomView.findViewById(R.id.qrcode_tips_tv); + qrcodeActionLy = (LinearLayout) bottomView.findViewById(R.id.qrcode_action_ly); + copyTv = (TextView) bottomView.findViewById(R.id.copy_tv); + shareTv = (TextView) bottomView.findViewById(R.id.share_tv); + saveTv = (TextView) bottomView.findViewById(R.id.save_tv); + shuaxinTv = (TextView) bottomView.findViewById(R.id.shuaxin_tv); + LoginBean loginBean = DataUtils.getLocUserInfo(); + + Bitmap bitmap = CodeUtils.createQRCode(String.format(IMUIKitConfig.SHARE_INVCODE1, IMKitClient.account()), DataUtils.dip2px(this, 175.0f), null); + if (loginBean != null) { + bitmap = CodeUtils.createQRCode(String.format(IMUIKitConfig.SHARE_ADD_USER, loginBean.getUser().getInviteCode(), IMKitClient.account()), DataUtils.dip2px(this, 175.0f), null); + } + if (bitmap != null) { + qrcodeIv.setImageBitmap(bitmap); + } + + shuaxinTv.setOnClickListener(v -> ToastX.showShortToast(R.string.shuaxinchenggong_txt)); + + coloseIv1.setOnClickListener(v -> bottomSheetDialog.dismiss()); + + saveTv.setOnClickListener(v -> { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + doSaveQrcode(); + } else { + if (PermissionUtils.hasPermissions( + MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE)) { + doSaveQrcode(); + } else { + requestCameraPermission( + Manifest.permission.READ_EXTERNAL_STORAGE); + } + } + }); + + shareTv.setOnClickListener(v -> { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + showBottomShare(); + } else { + if (PermissionUtils.hasPermissions( + MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE)) { + showBottomShare(); + } else { + requestCameraPermission( + Manifest.permission.READ_EXTERNAL_STORAGE); + } + } + }); + + copyTv.setOnClickListener(v -> { + if (loginBean != null) { + LogUtils.i("数据是啥:" + GsonUtils.beanToJSONString(loginBean)); + String url = String.format(IMUIKitConfig.SHARE_INVCODE, loginBean.getUser().getInviteCode(), IMKitClient.account()); + DataUtils.copy(url, MainActivity.this); + ToastX.showShortToast(R.string.fuzhichenggong_txt); + } + }); + + bottomSheetDialog.setContentView(bottomView); + bottomSheetDialog.show(); + + bottomSheetDialog.setOnDismissListener(dialog -> getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white))); + AdaptScreenUtils.setWhiteNavigationBar(bottomSheetDialog); + } + + + /** + * 将2维码保存到系统相册。 + */ + private void doSaveQrcode() { + // 先生成bitmap对象 + Bitmap bmp = DataUtils.generateBitmap(qrcodeLy); + // bitmap对象生成成功 + if (bmp != null) { + // 保存到相册成功 + if (ToolKits.saveBmp2Gallery(MainActivity.this, bmp)) { + ToastX.showShortToast(getString(R.string.qrcode_generate_activity_qr_save_sucess)); + } else { + ToastX.showShortToast(getString(R.string.qrcode_generate_activity_qr_save_fail)); + } + } else { + Log.w("doSaveQrcode", "将2维码保存到相册时失败了,从view生成Bitmap对象失败,生成后的bmp=null!"); + ToastX.showShortToast(getString(R.string.qrcode_generate_activity_qr_generate_fail)); + } + } + + private ShareDateUtils shareDateUtils; + + + @RequiresApi(api = Build.VERSION_CODES.M) + public void showBottomShare() { + titleUsers = shareDateUtils.getConverstionShareInfo(); + titleUsersIsCheck = new ArrayList<>(); + for (UserShareBean conversationInfo : titleUsers) { + titleUsersIsCheck.add(false); + } + if (titleUsers == null || titleUsers.size() == 0) { + ToastX.showShortToast(R.string.mykfxfddx_txt); + return; + } + BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(this, R.style.BottomSheetDialog); + + View bottomView = LayoutInflater.from(MainActivity.this).inflate(R.layout.bottom_sheet_layout, null); + + + coloseIvShare = (ImageView) bottomView.findViewById(R.id.colose_iv); + recyclerShare = (RecyclerView) bottomView.findViewById(R.id.recycler); + commentEtShare = (EditText) bottomView.findViewById(R.id.comment_et); + + shareBt = (TextView) bottomView.findViewById(R.id.share_bt); + initList(); + bottomSheetDialog.setContentView(bottomView); + bottomSheetDialog.show(); + coloseIvShare.setOnClickListener(v -> bottomSheetDialog.dismiss()); + bottomSheetDialog.setOnDismissListener(dialog -> getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white))); + shareBt.setOnClickListener(v -> { + + boolean isSelect = false; + for (Boolean type : titleUsersIsCheck) { + if (type) { + isSelect = true; + } + } + if (!isSelect) { + ToastX.showShortToast(getString(R.string.qxxzyfxddx_txt)); + return; + } + doSaveQrcodeShare(bottomSheetDialog); + }); + AdaptScreenUtils.setWhiteNavigationBar(bottomSheetDialog); + + } + + private ImageView coloseIvShare; + private RecyclerView recyclerShare; + private EditText commentEtShare; + private TextView shareBt; + private LinearLayoutManager linearLayoutManager; + private com.dskj.rbchat.adapter.CommonAdapter commonAdapter; + private ArrayList titleUsers; + private ArrayList titleUsersIsCheck; + + private void initList() { + + + linearLayoutManager = new LinearLayoutManager(MainActivity.this); + linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); + recyclerShare.setLayoutManager(linearLayoutManager); + commonAdapter = new CommonAdapter<>(MainActivity.this, R.layout.item_share_list, titleUsers) { + @Override + public void convert(ViewHolder holder, UserShareBean s, int index) { + ImageView select_iv = holder.getView(R.id.select_iv); + if (titleUsersIsCheck.get(index)) { + select_iv.setImageResource(R.mipmap.dialog_item_gou); + } else { + select_iv.setImageResource(R.mipmap.dialog_item_quan); + } + + ContactAvatarView imageView = holder.getView(R.id.logo_iv); + + if (s.getTeamInfo() != null) { + if (TextUtils.isEmpty(s.getTeamInfo().getIcon())) { + imageView.setData(com.netease.yunxin.kit.conversationkit.ui.R.drawable.ic_group_defaulthead, s.getTeamInfo().getName()); + } else { + imageView.setData( + s.getTeamInfo().getIcon(), s.getTeamInfo().getName(), AvatarColor.avatarColor(s.getTeamInfo().getId())); + } + holder.setText(R.id.title_tv, s.getTeamInfo().getName()); + } else { + ColorUtils.loadAvator(s.getFriendInfo().getAvatar(), imageView); + holder.setText(R.id.title_tv, s.getFriendInfo().getName()); + + } + + holder.getView(R.id.big_bg).setOnClickListener(v -> { + titleUsersIsCheck.set(index, !titleUsersIsCheck.get(index)); + commonAdapter.notifyItemChanged(index, titleUsersIsCheck.get(index)); + LogUtils.i("0000000000"); + + changeItemButton(); + }); + } + }; + recyclerShare.setAdapter(commonAdapter); + } + + /** + * 将2维码保存到系统相册。 + */ + private void doSaveQrcodeShare(BottomSheetDialog bottomSheetDialog) { + // 先生成bitmap对象 + Bitmap bmp = DataUtils.generateBitmap(qrcodeLy); + // bitmap对象生成成功 + if (bmp != null) { + // 保存到相册成功 + + Uri fileUri = ToolKits.saveBmp2GalleryShare(MainActivity.this, bmp); + if (fileUri != null) { +// ToastX.showShortToast(getString(R.string.qrcode_generate_activity_qr_save_sucess)); + sendMessage(fileUri); + } else { + ToastX.showShortToast(getString(R.string.qrcode_generate_activity_qr_save_fail)); + } + } else { + Log.w("doSaveQrcode", "将2维码保存到相册时失败了,从view生成Bitmap对象失败,生成后的bmp=null!"); + ToastX.showShortToast(getString(R.string.qrcode_generate_activity_qr_generate_fail)); + } + bottomSheetDialog.dismiss(); + } + + Handler mHandler = new Handler(); + + private void sendMessage(Uri uri) { + mHandler.postDelayed(() -> { + File imageFile = UriUtils.uri2File(uri); + + for (int i = 0; i < titleUsersIsCheck.size(); i++) { + if (titleUsersIsCheck.get(i)) { + toShareMessage(titleUsers.get(i), imageFile); + } + } + + }, 100); + } + + private void toShareMessage(UserShareBean conversationInfo, File imageFile) { + IMMessage imageMsg = null; + if (conversationInfo.getTeamInfo() != null) { + imageMsg = MessageBuilder.createImageMessage(conversationInfo.getTeamInfo().getId(), SessionTypeEnum.Team, imageFile); + } else if (conversationInfo.getFriendInfo() != null) { + imageMsg = MessageBuilder.createImageMessage(conversationInfo.getFriendInfo().getAccount(), SessionTypeEnum.P2P, imageFile); + } + if (imageMsg != null) { + ChatRepo.sendMessage( + imageMsg, + false, + new FetchCallbackImpl() { + @Override + public void onSuccess(@Nullable Void param) { + super.onSuccess(param); + ToastX.showShortToast(R.string.qrcode_share_succ_txt); + } + + @Override + public void onFailed(int code) { + + } + }); + } + } + + private void changeItemButton() { + LogUtils.i("1111111111111111"); + boolean isSelcet = false; + for (boolean item : titleUsersIsCheck) { + if (item) { + isSelcet = true; + break; + } + } + chagnBottom(isSelcet); + + } + + + private void chagnBottom(boolean b) { + if (b) { + shareBt.setBackground(getResources().getDrawable(R.drawable.button_true_bg)); + shareBt.setEnabled(true); + } else { + shareBt.setBackground(getResources().getDrawable(R.drawable.button_false_bg_new)); + shareBt.setEnabled(false); + + } + } + +} diff --git a/app/src/main/java/com/dskj/rbchat/main/authorize/AuthorizeActivity.java b/app/src/main/java/com/dskj/rbchat/main/authorize/AuthorizeActivity.java new file mode 100644 index 0000000..a6859c7 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/authorize/AuthorizeActivity.java @@ -0,0 +1,151 @@ +package com.dskj.rbchat.main.authorize; + +import android.os.Bundle; +import android.text.TextUtils; + +import androidx.annotation.Nullable; + +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.ActivityAuthorizeBinding; + +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.LogUtils; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.utils.AvatarColor; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.model.UserInfo; +import com.netease.yunxin.kit.corekit.im.provider.FetchCallback; +import com.netease.yunxin.kit.corekit.im.repo.CommonRepo; + +import java.util.HashMap; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class AuthorizeActivity extends BaseActivity { + + private ActivityAuthorizeBinding viewBinding; + boolean isWebLogin = false; + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + getWindow().setStatusBarColor(getResources().getColor(R.color.color_fcfcfc)); + getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white)); + + super.onCreate(savedInstanceState); + viewBinding = ActivityAuthorizeBinding.inflate(getLayoutInflater()); + setContentView(viewBinding.getRoot()); + isWebLogin = getIntent().getBooleanExtra("isWebLogin",false); + if(isWebLogin){ + viewBinding.logoIv.setImageResource(R.mipmap.ic_launcher); + viewBinding.logoTv.setText(R.string.wangyeban_tmg_txt); + } + initView(); + + CommonRepo.getUserInfo( + IMKitClient.account(), + new FetchCallback() { + @Override + public void onSuccess(@Nullable UserInfo param) { + if (param != null) { + updateUI(param); + } + } + + @Override + public void onFailed(int code) { + } + + @Override + public void onException(@Nullable Throwable exception) { + } + }); + + } + + private void updateUI(UserInfo userInfo) { + String name = + TextUtils.isEmpty(userInfo.getName()) ? userInfo.getAccount() : userInfo.getName(); + LogUtils.i("头像:"+userInfo.getAvatar()); + if (TextUtils.isEmpty(userInfo.getAvatar())) { + viewBinding.cavIcon.setData( + R.mipmap.default_head_img, name, AvatarColor.avatarColor(IMKitClient.account())); + } else { + viewBinding.cavIcon.setData( + userInfo.getAvatar(), name, AvatarColor.avatarColor(IMKitClient.account())); + } + + viewBinding.userNameTv.setText(name); + } + + protected void initView() { + initListeners(); + } + + + private void deviceBind(){ + LogUtils.i("ID:"+getIntent().getStringExtra("deviceId")); + if(isWebLogin){ + HashMap map = new HashMap<>(); + Api.getInstance().qrCodeLogin(getIntent().getStringExtra("deviceId"),map) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver() { + @Override + public void onSuccess(Result feedbackResp) { + ToastX.showShortToast(getString(R.string.bangdingchengong_txt)); + finish(); + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast(msg); + + } + }); + }else{ + Api.getInstance().deviceBind(getIntent().getStringExtra("deviceId")) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver() { + @Override + public void onSuccess(Result feedbackResp) { + ToastX.showShortToast(getString(R.string.bangdingchengong_txt)); + finish(); + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast(msg); + + } + }); + } + + } + + + + @Override + protected void onResume() { + super.onResume(); + + } + + protected void initListeners() { + viewBinding.settingTitleBar.getBackImageView().setOnClickListener(v -> finish()); + viewBinding.yunxuTv.setOnClickListener(v -> { + deviceBind(); + }); + viewBinding.jujueTv.setOnClickListener(v -> finish()); + } + + @Override + protected void onStop() { + super.onStop(); + } + + +} diff --git a/app/src/main/java/com/dskj/rbchat/main/chat/AllConversationFragment.java b/app/src/main/java/com/dskj/rbchat/main/chat/AllConversationFragment.java new file mode 100644 index 0000000..b5d9f83 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/chat/AllConversationFragment.java @@ -0,0 +1,389 @@ +package com.dskj.rbchat.main.chat; + +import android.content.DialogInterface; +import android.os.Build; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.lifecycle.ViewModelProvider; + +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.utils.AdaptScreenUtils; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.google.android.material.bottomsheet.BottomSheetDialog; +import com.google.gson.reflect.TypeToken; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.yunxin.kit.alog.ALog; +import com.netease.yunxin.kit.chatkit.model.ConversationInfo; +import com.netease.yunxin.kit.chatkit.ui.fun.FunChatForwardSelectDialog; +import com.netease.yunxin.kit.common.ui.action.ActionItem; +import com.netease.yunxin.kit.common.ui.dialog.ListAlertDialog; +import com.netease.yunxin.kit.common.ui.fragments.BaseFragment; +import com.netease.yunxin.kit.common.ui.viewholder.BaseBean; +import com.netease.yunxin.kit.common.ui.viewholder.ViewHolderClickListener; +import com.netease.yunxin.kit.common.ui.viewmodel.LoadStatus; +import com.netease.yunxin.kit.conversationkit.ui.ConversationKitClient; +import com.netease.yunxin.kit.conversationkit.ui.common.ConversationConstant; +import com.netease.yunxin.kit.conversationkit.ui.databinding.FunConversationFragmentBinding; +import com.netease.yunxin.kit.conversationkit.ui.fun.FunViewHolderFactory; +import com.netease.yunxin.kit.conversationkit.ui.model.ConversationBean; +import com.netease.yunxin.kit.conversationkit.ui.page.interfaces.ILoadListener; +import com.netease.yunxin.kit.conversationkit.ui.page.viewmodel.ConversationViewModel; +import com.netease.yunxin.kit.conversationkit.ui.view.ConversationView; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.route.XKitRouter; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +@Deprecated +public class AllConversationFragment extends BaseFragment implements ILoadListener { + + private FunConversationFragmentBinding viewBinding; + private ConversationView conversationView; + protected View networkErrorView; + protected View emptyView; + public ConversationViewModel viewModel; + private ArrayList servicesIds = new ArrayList<>(); + private FunViewHolderFactory funViewHolderFactory; + + @Nullable + @Override + public View onCreateView( + @NonNull LayoutInflater inflater, + @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + viewBinding = FunConversationFragmentBinding.inflate(inflater, container, false); + initView(); + return viewBinding.getRoot(); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + viewModel = new ViewModelProvider(this).get(ConversationViewModel.class); + viewModel.setComparator(conversationComparator); + viewModel.setConversationFactory(funViewHolderFactory); + bindView(); + getServicesData(); + initData(); + } + + public Comparator conversationComparator = + (bean1, bean2) -> { + int result; + if (bean1 == null) { + result = 1; + } else if (bean2 == null) { + result = -1; + } else if (bean1.isStickTop() == bean2.isStickTop()) { + long time = bean1.getTime() - bean2.getTime(); + result = time == 0L ? 0 : (time > 0 ? -1 : 1); + + } else { + result = bean1.isStickTop() ? -1 : 1; + } + ALog.d(ConversationConstant.LIB_TAG, FunChatForwardSelectDialog.TAG, "conversationComparator, result:" + result); + return result; + }; + + + private void initData() { + viewModel + .getQueryLiveData() + .observe( + this.getViewLifecycleOwner(), + result -> { + + if (result.getLoadStatus() == LoadStatus.Success) { + if (result.getData() != null) { + conversationView.setData(removeServicesConversation(result.getData())); + } + } else if (result.getLoadStatus() == LoadStatus.Finish) { + conversationView.addData(removeServicesConversation(result.getData())); + } + if (conversationView.getDataSize() > 0) { + emptyView.setVisibility(View.GONE); + } else { + emptyView.setVisibility(View.VISIBLE); + } + + } + ); + viewModel.fetchConversation(); + + + } + + //去掉客服会话 改成添加字段 + public List removeServicesConversation(List beans) { + if (servicesIds == null || servicesIds.size() == 0) { + return beans; + } + + for (ConversationBean conversationBean : beans) { + conversationBean.isServices = false; + if (conversationBean.infoData.getSessionType() == SessionTypeEnum.P2P && servicesIds.indexOf(conversationBean.infoData.getContactId()) >= 0) { + conversationBean.isServices = true; + } + } + return beans; + } + + private void getServicesData() { + String tagString = DataUtils.get(IMApplication.getAppContext(), IMUIKitConfig.SERVICES_IDS_TAG + "_" + IMKitClient.account(), ""); + if (!TextUtils.isEmpty(tagString)) { + ArrayList strings = GsonUtils.getListFromJSON(tagString, new TypeToken>() { + }.getType()); + servicesIds.addAll(strings); + } + } + + private void initView() { +// mainActivity = (MainActivity) getActivity(); + conversationView = viewBinding.conversationView; + networkErrorView = viewBinding.errorTv; + emptyView = viewBinding.emptyLayout; + funViewHolderFactory = new FunViewHolderFactory(); + funViewHolderFactory.isSelector = false; + conversationView.setViewHolderFactory(funViewHolderFactory); + + + } + + private void bindView() { + //设置会话排序Comparator,默认按照置顶和时间优先级进行排序 + conversationView.setComparator(conversationComparator); + conversationView.setLoadMoreListener(this); + conversationView.setItemClickListener( + new ViewHolderClickListener() { + @Override + public boolean onClick(View v, BaseBean data, int position) { + boolean result = false; + if (ConversationKitClient.getConversationUIConfig() != null + && ConversationKitClient.getConversationUIConfig().itemClickListener != null + && data instanceof ConversationBean) { + result = + ConversationKitClient.getConversationUIConfig() + .itemClickListener + .onClick( + AllConversationFragment.this.getContext(), + (ConversationBean) data, + position); + } + if (!result && !TextUtils.isEmpty(data.router)) { + XKitRouter.withKey(data.router) + .withParam(data.paramKey, data.param) + .withParam("isService", ((ConversationBean) data).isServices) + .withContext(AllConversationFragment.this.requireContext()) + .navigate(); + } + return true; + } + + @Override + public boolean onAvatarClick(View v, BaseBean data, int position) { + boolean result = false; + if (ConversationKitClient.getConversationUIConfig() != null + && ConversationKitClient.getConversationUIConfig().itemClickListener != null + && data instanceof ConversationBean) { + result = + ConversationKitClient.getConversationUIConfig() + .itemClickListener + .onAvatarClick( + AllConversationFragment.this.getContext(), + (ConversationBean) data, + position); + } + if (!result) { + XKitRouter.withKey(data.router) + .withParam("isService", ((ConversationBean) data).isServices) + .withParam(data.paramKey, data.param) + .withContext(AllConversationFragment.this.requireContext()) + .navigate(); + } + return true; + } + + @Override + public boolean onLongClick(View v, BaseBean data, int position) { + boolean result = false; + if (ConversationKitClient.getConversationUIConfig() != null + && ConversationKitClient.getConversationUIConfig().itemClickListener != null + && data instanceof ConversationBean) { + result = + ConversationKitClient.getConversationUIConfig() + .itemClickListener + .onLongClick( + AllConversationFragment.this.getContext(), + (ConversationBean) data, + position); + } + if (!result) { + showBottomDialog(data); + } + return true; + } + + @Override + public boolean onAvatarLongClick(View v, BaseBean data, int position) { + boolean result = false; + if (ConversationKitClient.getConversationUIConfig() != null + && ConversationKitClient.getConversationUIConfig().itemClickListener != null + && data instanceof ConversationBean) { + result = + ConversationKitClient.getConversationUIConfig() + .itemClickListener + .onAvatarLongClick( + AllConversationFragment.this.getContext(), + (ConversationBean) data, + position); + } + if (!result) { + showBottomDialog(data); + } + return true; + } + }); + + + } + + + private void showBottomDialog(BaseBean data) { + if (data instanceof ConversationBean) { + ConversationBean dataBean = (ConversationBean) data; + BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(getActivity(), R.style.BottomSheetDialog); + + View bottomView = LayoutInflater.from(getActivity()).inflate(R.layout.bottom_sheet_layout_conversation, null); + bottomSheetDialog.setContentView(bottomView); + bottomSheetDialog.show(); + + TextView coloseIv1 = (TextView) bottomView.findViewById(R.id.colose_iv); + TextView hideTv = (TextView) bottomView.findViewById(R.id.hide_tv); + TextView deleteTv = (TextView) bottomView.findViewById(R.id.delete_tv); + + coloseIv1.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + bottomSheetDialog.dismiss(); + } + }); + + hideTv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (getParentFragment() != null) { + ((ChatMain2Fragment) getParentFragment()).viewModel.deleteConversation(1, dataBean); + } + bottomSheetDialog.dismiss(); + } + }); + deleteTv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (getParentFragment() != null) { + ((ChatMain2Fragment) getParentFragment()).viewModel.deleteConversation(2, dataBean); + } + bottomSheetDialog.dismiss(); + } + + }); + bottomSheetDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { + @Override + public void onDismiss(DialogInterface dialog) { + getActivity().getWindow().setNavigationBarColor(getResources().getColor(R.color.black)); + } + }); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + AdaptScreenUtils.setWhiteNavigationBar(bottomSheetDialog); + } + } + } + + private void showStickDialog(BaseBean data) { + if (data instanceof ConversationBean) { + ConversationBean dataBean = (ConversationBean) data; + ListAlertDialog alertDialog = new ListAlertDialog(); + alertDialog.setContent(generateDialogContent(dataBean.infoData.isStickTop())); + alertDialog.setTitleVisibility(View.GONE); + alertDialog.setDialogWidth(getResources().getDimension(com.netease.yunxin.kit.conversationkit.ui.R.dimen.alert_dialog_width)); + alertDialog.setItemClickListener( + action -> { + if (TextUtils.equals(action, ConversationConstant.Action.ACTION_DELETE)) { + viewModel.deleteConversation(2, dataBean); + } else if (TextUtils.equals(action, ConversationConstant.Action.ACTION_HIDE)) { + viewModel.deleteConversation(1, dataBean); + + } + alertDialog.dismiss(); + }); + alertDialog.show(getParentFragmentManager()); + } + } + + protected List generateDialogContent(boolean isStick) { + List contentList = new ArrayList<>(); + ActionItem hide = + new ActionItem(ConversationConstant.Action.ACTION_HIDE, 0, com.netease.yunxin.kit.conversationkit.ui.R.string.hide_title); + ActionItem delete = + new ActionItem(ConversationConstant.Action.ACTION_DELETE, 0, com.netease.yunxin.kit.conversationkit.ui.R.string.delete_title); + contentList.add(hide); + contentList.add(delete); + return contentList; + } + + public ConversationView getConversationView() { + return conversationView; + } + + public View getEmptyView() { + return emptyView; + } + + @Override + public boolean hasMore() { + viewModel.hasMore(); + return false; + } + +// public ChatMain2Fragment getChatMain2Fragment() { +// chatMain2Fragment = (ChatMain2Fragment) getParentFragment(); +// return chatMain2Fragment; +// } + + @Override + public void loadMore(Object last) { + if (last instanceof ConversationBean) { + + } + } + + + @Override + public void onStop() { + super.onStop(); + if (conversationView != null) { + conversationView.setShowTag(false); + } + } + + @Override + public void onStart() { + super.onStart(); + if (conversationView != null) { + conversationView.setShowTag(true); + } + } + +} diff --git a/app/src/main/java/com/dskj/rbchat/main/chat/ChatConversationFragment.java b/app/src/main/java/com/dskj/rbchat/main/chat/ChatConversationFragment.java new file mode 100644 index 0000000..e4cf6cf --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/chat/ChatConversationFragment.java @@ -0,0 +1,848 @@ +package com.dskj.rbchat.main.chat; + +import static com.netease.yunxin.kit.chatkit.ui.fun.view.MessageBottomLayout.TAG; +import static com.netease.yunxin.kit.conversationkit.ui.common.ConversationConstant.LIB_TAG; + +import android.content.DialogInterface; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; + +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.FragmentChatconversationBinding; +import com.dskj.rbchat.event.ConversationEditEvent; +import com.dskj.rbchat.main.MainActivity; +import com.dskj.rbchat.utils.AdaptScreenUtils; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.google.android.material.bottomsheet.BottomSheetDialog; +import com.google.gson.reflect.TypeToken; +import com.netease.nimlib.sdk.friend.model.MuteListChangedNotify; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.nimlib.sdk.msg.model.IMMessage; +import com.netease.nimlib.sdk.team.model.Team; +import com.netease.yunxin.kit.alog.ALog; +import com.netease.yunxin.kit.chatkit.model.ConversationInfo; +import com.netease.yunxin.kit.chatkit.repo.ContactRepo; +import com.netease.yunxin.kit.chatkit.ui.data.ChatDatabase; +import com.netease.yunxin.kit.chatkit.ui.data.dao.ChatDraftDataDao; +import com.netease.yunxin.kit.chatkit.ui.data.entity.ChatDraftData; +import com.netease.yunxin.kit.chatkit.ui.fun.FunChatForwardSelectDialog; +import com.netease.yunxin.kit.chatkit.ui.model.ChangeChatDraftEvent; +import com.netease.yunxin.kit.chatkit.ui.model.CleanHistoryEvent; +import com.netease.yunxin.kit.common.ui.fragments.BaseFragment; +import com.netease.yunxin.kit.common.ui.viewholder.BaseBean; +import com.netease.yunxin.kit.common.ui.viewholder.ViewHolderClickListener; +import com.netease.yunxin.kit.common.ui.viewmodel.FetchResult; +import com.netease.yunxin.kit.common.ui.viewmodel.LoadStatus; +import com.netease.yunxin.kit.conversationkit.ui.ConversationKitClient; +import com.netease.yunxin.kit.conversationkit.ui.common.ConversationConstant; +import com.netease.yunxin.kit.conversationkit.ui.common.ConversationHelper; +import com.netease.yunxin.kit.conversationkit.ui.fun.FunViewHolderFactory; +import com.netease.yunxin.kit.conversationkit.ui.model.ConversationBean; +import com.netease.yunxin.kit.conversationkit.ui.page.interfaces.ILoadListener; +import com.netease.yunxin.kit.conversationkit.ui.page.viewmodel.ConversationViewModel; +import com.netease.yunxin.kit.conversationkit.ui.view.ConversationView; +import com.netease.yunxin.kit.corekit.event.EventCenter; +import com.netease.yunxin.kit.corekit.event.EventNotify; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.model.FriendInfo; +import com.netease.yunxin.kit.corekit.im.model.UserInfo; +import com.netease.yunxin.kit.corekit.route.XKitRouter; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +//会话fragment +public class ChatConversationFragment extends BaseFragment implements ILoadListener, ViewHolderClickListener { + + public static final String TAG = "ChatConversationFragment"; + private int conversationType; //0,1,2 + private FragmentChatconversationBinding viewBinding; + private ConversationView conversationViewTop; + private ConversationView conversationViewBottom; + protected View networkErrorView; + protected View emptyView; + public ConversationViewModel viewModel; + private ArrayList servicesIds = new ArrayList<>(); + private List listFriend; + List listMyTeam; + List listJoinTeam; + private FunViewHolderFactory funViewHolderFactory; + + private Observer>> changeObserver; + private Observer> stickObserver; + private Observer>> userInfoObserver; + private Observer>> friendInfoObserver; + private Observer>> teamInfoObserver; + private Observer> muteObserver; + private Observer> addRemoveStickObserver; + private Observer>> aitObserver; + private Observer> unreadCountObserver; + private ChatDraftDataDao dataDao; + + protected final EventNotify changeDraftEvent = + new EventNotify() { + @Override + public void onNotify(@NonNull ChangeChatDraftEvent chatDraftEvent) { + updatItem(chatDraftEvent.msessionID); + } + + @NonNull + @Override + public String getEventType() { + return ChangeChatDraftEvent.EVENT_TYPE; + } + }; + + + public void updatItem(String chatId) { + List conversationBeans = conversationViewTop.getAdatper().getConversationList(); + for (ConversationBean bean : conversationBeans) { + if (bean.infoData.getContactId().equals(chatId)) { + List beans = new ArrayList<>(); + ChatDraftData draftData = dataDao.getChatData(chatId); + if (draftData != null) { + bean.setTextdraft(draftData.getContent()); + } else { + bean.setTextdraft(null); + } + beans.add(bean); + conversationViewTop.update(beans); + return; + } + } + if (conversationType == 2) { + List conversationBottomBeans = conversationViewBottom.getAdatper().getConversationList(); + for (ConversationBean bean : conversationBottomBeans) { + if (bean.infoData.getContactId().equals(chatId)) { + List beans = new ArrayList<>(); + ChatDraftData draftData = dataDao.getChatData(chatId); + if (draftData != null) { + bean.setTextdraft(draftData.getContent()); + } else { + bean.setTextdraft(null); + } + + beans.add(bean); + conversationViewBottom.update(beans); + return; + } + } + + } + + + } + + public static ChatConversationFragment newInstance(int status1) { + Bundle bundle = new Bundle(); + bundle.putInt("type", status1); + ChatConversationFragment view = new ChatConversationFragment(); + view.setArguments(bundle); + return view; + } + + + @Nullable + @Override + public View onCreateView( + @NonNull LayoutInflater inflater, + @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + viewBinding = FragmentChatconversationBinding.inflate(inflater, container, false); + conversationType = getArguments().getInt("type"); + if (conversationType == 1) { + listFriend = new ArrayList<>(); + } + if (conversationType == 2) { + listMyTeam = new ArrayList<>(); + listJoinTeam = new ArrayList<>(); + } + initView(); + return viewBinding.getRoot(); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + viewModel = new ViewModelProvider(this).get(ConversationViewModel.class); + viewModel.setComparator(conversationComparator); + viewModel.setConversationFactory(funViewHolderFactory); + if (conversationType != 2) { + getServicesData(); + } + dataDao = ChatDatabase.getInstance().getChatDraftDataDao(); + initData(); + initObserver(); + bindView(); + registerObserver(); + EventCenter.registerEventNotify(changeDraftEvent); + } + + + private void registerObserver() { + viewModel.getChangeLiveData().observeForever(changeObserver); + viewModel.getUserInfoLiveData().observeForever(userInfoObserver); + viewModel.getFriendInfoLiveData().observeForever(friendInfoObserver); + viewModel.getTeamInfoLiveData().observeForever(teamInfoObserver); + viewModel.getMuteInfoLiveData().observeForever(muteObserver); + viewModel.getAitLiveData().observeForever(aitObserver); + viewModel.getUnreadCountLiveData().observeForever(unreadCountObserver); + } + + private void unregisterObserver() { + viewModel.getChangeLiveData().removeObserver(changeObserver); + viewModel.getUserInfoLiveData().removeObserver(userInfoObserver); + viewModel.getFriendInfoLiveData().removeObserver(friendInfoObserver); + viewModel.getTeamInfoLiveData().removeObserver(teamInfoObserver); + viewModel.getMuteInfoLiveData().removeObserver(muteObserver); + viewModel.getAitLiveData().removeObserver(aitObserver); + viewModel.getUnreadCountLiveData().removeObserver(unreadCountObserver); + } + + public Comparator conversationComparator = + (bean1, bean2) -> { + int result; + if (bean1 == null) { + result = 1; + } else if (bean2 == null) { + result = -1; + } else if (bean1.isStickTop() == bean2.isStickTop()) { + long time = bean1.getTime() - bean2.getTime(); + result = time == 0L ? 0 : (time > 0 ? -1 : 1); + + } else { + result = bean1.isStickTop() ? -1 : 1; + } + ALog.d(ConversationConstant.LIB_TAG, FunChatForwardSelectDialog.TAG, "conversationComparator, result:" + result); + return result; + }; + + private void initObserver() { + changeObserver = + result -> { + if (result.getLoadStatus() == LoadStatus.Success) { + if (result.getData() == null || result.getData().size() == 0) { + return; + } + getServicesData(); + setUpdateViewData(conversationType, result.getData()); + } else if (result.getLoadStatus() == LoadStatus.Finish + && result.getType() == FetchResult.FetchType.Remove) { + ALog.d(LIB_TAG, TAG, "DeleteLiveData, Success"); + if (result.getData() == null || result.getData().size() < 1) { + conversationViewTop.removeAll(); + conversationViewBottom.removeAll(); + } else { + conversationViewTop.remove(result.getData()); + conversationViewBottom.remove(result.getData()); + } + } + + + doEmptyView(); + doCallback(); + if (conversationType == 1) { + updateFollowList(listFriend); + } + if (conversationType == 2) { + setDataNumber(); + } + + + }; + + + userInfoObserver = + result -> { + if (result.getLoadStatus() == LoadStatus.Success) { + ALog.d(LIB_TAG, TAG, "UserInfoLiveData, Success"); + if (conversationType != 2) { + conversationViewTop.updateUserInfo(result.getData()); + updateFollowList(listFriend); + } + } + }; + + friendInfoObserver = + result -> { + if (result.getLoadStatus() == LoadStatus.Success) { + ALog.d(LIB_TAG, TAG, "FriendInfoLiveData, Success"); + if (conversationType != 2) { + conversationViewTop.updateFriendInfo(result.getData()); + updateFollowList(listFriend); + } + + } + }; + teamInfoObserver = + result -> { + if (result.getLoadStatus() == LoadStatus.Success) { + ALog.d(LIB_TAG, TAG, "TeamInfoLiveData, Success"); + if (conversationType == 0) { + conversationViewTop.updateTeamInfo(result.getData()); + } else if (conversationType == 2) { + conversationViewTop.updateTeamInfoType(result.getData(), true); + conversationViewBottom.updateTeamInfoType(result.getData(), false); + } + } + }; + + muteObserver = + result -> { + if (result.getLoadStatus() == LoadStatus.Success) { + ALog.d(LIB_TAG, TAG, "MuteInfoLiveData, Success"); + conversationViewTop.updateMuteInfo(result.getData()); + conversationViewBottom.updateMuteInfo(result.getData()); + } + }; + + aitObserver = + result -> { + if (result.getLoadStatus() == LoadStatus.Finish) { + if (result.getType() == FetchResult.FetchType.Add) { + ALog.d(LIB_TAG, TAG, "AddStickLiveData, Success"); + ConversationHelper.updateAitInfo(result.getData(), true); + conversationViewTop.updateAit(result.getData()); + conversationViewBottom.updateAit(result.getData()); + + } else if (result.getType() == FetchResult.FetchType.Remove) { + ALog.d(LIB_TAG, TAG, "RemoveStickLiveData, Success"); + ConversationHelper.updateAitInfo(result.getData(), false); + conversationViewTop.updateAit(result.getData()); + conversationViewBottom.updateAit(result.getData()); + } + } + }; + + + unreadCountObserver = + result -> { + if (result.getLoadStatus() == LoadStatus.Success) { + ALog.d(LIB_TAG, TAG, "unreadCount, Success"); + if (result.getData() == null) { + ((MainActivity) getActivity()).hideUnReadChat(); + } else { + int number = result.getData(); + ((MainActivity) getActivity()).setUnReadChat(number); + ((ChatTabFragment) getParentFragment()).updateUnRead(number); + } + } + }; + } + + //更新会话 + private void updateFollowList(List listFriend) { + if (listFriend != null) { + ConversationEditEvent editEvent = new ConversationEditEvent(); + editEvent.setList(listFriend); + editEvent.setParamType(3); + EventCenter.notifyEvent(editEvent); + } + + } + + private long msgUnreadCountTime = 0; + public final long MSG_UNREAD_COUNT_INTERVAL = 1000; + private Handler conversationHandler = new Handler(); + + private void doCallback() { + long currentTime = System.currentTimeMillis(); + ALog.d(LIB_TAG, TAG, "doCallback"); + if (viewModel != null && currentTime - msgUnreadCountTime > MSG_UNREAD_COUNT_INTERVAL) { + msgUnreadCountTime = currentTime; + conversationHandler.removeCallbacks(msgUnreadCountRunnable); + viewModel.getUnreadCount(); + ALog.d(LIB_TAG, TAG, "doCallback:getUnreadCount"); + } else if (viewModel != null && conversationHandler != null) { + ALog.d(LIB_TAG, TAG, "doCallback:conversationHandler"); + conversationHandler.removeCallbacks(msgUnreadCountRunnable); + conversationHandler.postDelayed(msgUnreadCountRunnable, MSG_UNREAD_COUNT_INTERVAL); + } + } + + private Runnable msgUnreadCountRunnable = + new Runnable() { + @Override + public void run() { + if (viewModel != null) { + viewModel.getUnreadCount(); + ALog.d(LIB_TAG, TAG, "msgUnreadCountRunnable:getUnreadCount"); + } + } + }; + + + private boolean showAllMyTeam = false; + private boolean showAllJoinTeam = false; + + private void initView() { + conversationViewTop = viewBinding.conversationViewTop; + conversationViewBottom = viewBinding.conversationViewBottom; + funViewHolderFactory = new FunViewHolderFactory(); + funViewHolderFactory.isSelector = false; + conversationViewTop.setViewHolderFactory(funViewHolderFactory); + conversationViewBottom.setViewHolderFactory(funViewHolderFactory); + if (conversationType == 2) { + conversationViewTop.getAdatper().setShowAll(false); + conversationViewBottom.getAdatper().setShowAll(false); + } + emptyView = viewBinding.emptyLayout; + if (conversationType == 2) { + viewBinding.layoutMyjoin.setVisibility(View.VISIBLE); + } + viewBinding.tvMyteamspull.setOnClickListener(view -> { + showAllMyTeam = !showAllMyTeam; + if (showAllMyTeam) { + Drawable drawable = getResources().getDrawable(R.mipmap.ic_indexfm_up); + drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); + viewBinding.tvMyteamspull.setCompoundDrawables(null, null, drawable, null); + } else { + Drawable drawable = getResources().getDrawable(R.mipmap.ic_indexfm_down); + drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); + viewBinding.tvMyteamspull.setCompoundDrawables(null, null, drawable, null); + } + viewBinding.conversationViewTop.getAdatper().setShowAll(showAllMyTeam); + }); + viewBinding.tvMyjointeamspull.setOnClickListener(view -> { + showAllJoinTeam = !showAllJoinTeam; + if (showAllJoinTeam) { + Drawable drawable = getResources().getDrawable(R.mipmap.ic_indexfm_up); + drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); + viewBinding.tvMyjointeamspull.setCompoundDrawables(null, null, drawable, null); + } else { + Drawable drawable = getResources().getDrawable(R.mipmap.ic_indexfm_down); + drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); + viewBinding.tvMyjointeamspull.setCompoundDrawables(null, null, drawable, null); + } + viewBinding.conversationViewBottom.getAdatper().setShowAll(showAllJoinTeam); + }); + + } + + private void bindView() { + conversationViewTop.setComparator(conversationComparator); + conversationViewTop.setLoadMoreListener(this); + conversationViewTop.setItemClickListener(this); + conversationViewBottom.setComparator(conversationComparator); + conversationViewBottom.setLoadMoreListener(this); + conversationViewBottom.setItemClickListener(this); + } + + private void getServicesData() { + String tagString = DataUtils.get(IMApplication.getAppContext(), IMUIKitConfig.SERVICES_IDS_TAG + "_" + IMKitClient.account(), ""); + if (!TextUtils.isEmpty(tagString)) { + ArrayList strings = GsonUtils.getListFromJSON(tagString, new TypeToken>() { + }.getType()); + servicesIds.addAll(strings); + } + } + + private void initData() { + viewModel + .getQueryLiveData() + .observe( + this.getViewLifecycleOwner(), + result -> { + if (result.getLoadStatus() == LoadStatus.Success) { + if (result.getData() != null) { + setViewData(conversationType, result); + } + } else if (result.getLoadStatus() == LoadStatus.Finish) { + setAddViewData(conversationType, result); + } + if (conversationType == 2) { + setMyTeamList(); + setJoinTeamList(); + } + doEmptyView(); + }); + viewModel.fetchConversation(); + viewModel.getUnreadCount(); + } + + + public void updateChatDraftDataItem(ConversationBean conversationBean) { + ChatDraftData chatDraftData = dataDao.getChatData(conversationBean.infoData.getContactId()); + if (chatDraftData != null) { + String content = chatDraftData.getContent(); + conversationBean.setTextdraft(content); + } else { + conversationBean.setTextdraft(null); + } + } + + public void setChatDraftDataList(List conversationlist) { + for (ConversationBean bean : conversationlist) { + updateChatDraftDataItem(bean); + } + } + + /** + * 初始化设置数据 + * + * @param conversationType + * @param result + */ + public void setViewData(int conversationType, FetchResult> result) { + switch (conversationType) { + case 0: + List listconversation = updateServicesConversation(result.getData()); + conversationViewTop.setData(listconversation); + break; + case 1: + getConversationFriendTypeList(result.getData()); + conversationViewTop.setData(updateServicesConversation(listFriend)); + break; + case 2: + getConversationTeamTypeList(result.getData()); + setChatDraftDataList(listMyTeam); + setChatDraftDataList(listJoinTeam); + conversationViewTop.setData(listMyTeam); + conversationViewBottom.setData(listJoinTeam); + break; + } + } + + + /** + * 添加数据 + * + * @param conversationType + * @param result + */ + private void setAddViewData(int conversationType, FetchResult> result) { + switch (conversationType) { + case 0: + conversationViewTop.addData(updateServicesConversation(result.getData())); + break; + case 1: + getConversationFriendTypeList(result.getData()); + conversationViewTop.addData(updateServicesConversation(listFriend)); + break; + case 2: + getConversationTeamTypeList(result.getData()); + setChatDraftDataList(listMyTeam); + setChatDraftDataList(listJoinTeam); + conversationViewTop.addData(listMyTeam); + conversationViewBottom.addData(listJoinTeam); + break; + } + } + + /** + * 更新数据 + * + * @param conversationType + * @param result + */ + private void setUpdateViewData(int conversationType, List result) { + switch (conversationType) { + case 0: + conversationViewTop.update(updateServicesConversation(result)); + break; + case 1: + getConversationFriendTypeList(result); + conversationViewTop.update(updateServicesConversation(listFriend)); + break; + case 2: + getConversationTeamTypeList(result); + setChatDraftDataList(listMyTeam); + setChatDraftDataList(listJoinTeam); + conversationViewTop.update(listMyTeam); + conversationViewBottom.update(listJoinTeam); + break; + } + } + + public void setMyTeamList() { + int size = conversationViewTop.getAdatper().getConversationList().size(); + if (size == 0) { + viewBinding.layoutMycreate.setVisibility(View.GONE); + } else { + viewBinding.layoutMycreate.setVisibility(View.VISIBLE); + viewBinding.layoutConversationtitle.setVisibility(View.VISIBLE); + viewBinding.tvMyteamnumber.setText(size + ""); + } + } + + public void setJoinTeamList() { + int size = conversationViewBottom.getAdatper().getConversationList().size(); + if (size == 0) { + viewBinding.layoutMyjoin.setVisibility(View.GONE); + } else { + viewBinding.layoutMyjoin.setVisibility(View.VISIBLE); + viewBinding.tvMyjointeamnumber.setText(size + ""); + } + + } + + + //去掉客服会话 改成添加字段 + public List updateServicesConversation(List beans) { + if (servicesIds == null || servicesIds.size() == 0) { + return beans; + } + + for (ConversationBean conversationBean : beans) { + conversationBean.isServices = false; + if (conversationBean.infoData.getSessionType() == SessionTypeEnum.P2P && servicesIds.indexOf(conversationBean.infoData.getContactId()) >= 0) { + conversationBean.isServices = true; + } + //获取草稿内容 + updateChatDraftDataItem(conversationBean); + } + return beans; + } + + + public void getConversationFriendTypeList(List list) { + listFriend.clear(); + for (ConversationBean conversationBean : list) { + ConversationInfo conversationInfo = conversationBean.infoData; + if (conversationInfo.getFriendInfo() != null && ContactRepo.isFriend(conversationInfo.getContactId())) { + listFriend.add(conversationBean); + } + } + + } + + public void getConversationTeamTypeList(List list) { + listMyTeam.clear(); + listJoinTeam.clear(); + for (ConversationBean conversationBean : list) { + if (conversationBean.infoData.getTeamInfo() != null) { //不是群就是好友 也包含已删除的好友会话 + if (conversationBean.infoData.getTeamInfo().getCreator().equals(IMKitClient.account())) { + listMyTeam.add(conversationBean); + } else { + listJoinTeam.add(conversationBean); + } + } + } + + } + + private void doEmptyView() { + if (conversationType != 2) { + if (conversationViewTop.getDataSize() > 0) { + emptyView.setVisibility(View.GONE); + viewBinding.layoutOneroot.setVisibility(View.VISIBLE); + } else { + emptyView.setVisibility(View.VISIBLE); + viewBinding.layoutOneroot.setVisibility(View.GONE); + } + } else { + if (conversationViewTop.getDataSize() == 0 && conversationViewBottom.getDataSize() == 0) { + emptyView.setVisibility(View.VISIBLE); + viewBinding.layoutOneroot.setVisibility(View.GONE); + } else { + emptyView.setVisibility(View.GONE); + viewBinding.layoutOneroot.setVisibility(View.VISIBLE); + } + } + + } + + public void setDataNumber() { + int size = conversationViewTop.getAdatper().getConversationList().size(); + if (size == 0) { + viewBinding.layoutConversationtitle.setVisibility(View.GONE); + } else { + viewBinding.layoutConversationtitle.setVisibility(View.VISIBLE); + viewBinding.tvMyteamnumber.setText(size + ""); + } + int sizemyjoin = conversationViewBottom.getAdatper().getConversationList().size(); + if (sizemyjoin == 0) { + viewBinding.layoutMyjoin.setVisibility(View.GONE); + } else { + viewBinding.layoutMyjoin.setVisibility(View.VISIBLE); + viewBinding.tvMyjointeamnumber.setText(sizemyjoin + ""); + } + } + + + @Override + public boolean onClick(View view, BaseBean data, int position) { + boolean result = false; + if (ConversationKitClient.getConversationUIConfig() != null + && ConversationKitClient.getConversationUIConfig().itemClickListener != null + && data instanceof ConversationBean) { + result = + ConversationKitClient.getConversationUIConfig() + .itemClickListener + .onClick( + ChatConversationFragment.this.requireContext(), + (ConversationBean) data, + position); + } + if (!result && !TextUtils.isEmpty(data.router)) { + XKitRouter.withKey(data.router) + .withParam(data.paramKey, data.param) + .withParam("isService", ((ConversationBean) data).isServices) + .withContext(ChatConversationFragment.this.requireContext()) + .navigate(); + } + return true; + } + + @Override + public boolean onAvatarClick(View view, BaseBean data, int position) { + boolean result = false; + if (ConversationKitClient.getConversationUIConfig() != null + && ConversationKitClient.getConversationUIConfig().itemClickListener != null + && data instanceof ConversationBean) { + result = + ConversationKitClient.getConversationUIConfig() + .itemClickListener + .onAvatarClick( + ChatConversationFragment.this.getContext(), + (ConversationBean) data, + position); + } + if (!result) { + XKitRouter.withKey(data.router) + .withParam("isService", ((ConversationBean) data).isServices) + .withParam(data.paramKey, data.param) + .withContext(ChatConversationFragment.this.requireContext()) + .navigate(); + } + return true; + } + + @Override + public boolean onLongClick(View view, BaseBean data, int position) { + boolean result = false; + if (ConversationKitClient.getConversationUIConfig() != null + && ConversationKitClient.getConversationUIConfig().itemClickListener != null + && data instanceof ConversationBean) { + result = + ConversationKitClient.getConversationUIConfig() + .itemClickListener + .onLongClick( + getActivity(), + (ConversationBean) data, + position); + } + if (!result) { + showBottomDialog(data); + } + return true; + } + + @Override + public boolean onAvatarLongClick(View view, BaseBean data, int position) { + return ViewHolderClickListener.super.onAvatarLongClick(view, data, position); + } + + private void showBottomDialog(BaseBean data) { + if (data instanceof ConversationBean) { + ConversationBean dataBean = (ConversationBean) data; + BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(getActivity(), R.style.BottomSheetDialog); + + View bottomView = LayoutInflater.from(getActivity()).inflate(R.layout.bottom_sheet_layout_conversation, null); + bottomSheetDialog.setContentView(bottomView); + bottomSheetDialog.show(); + + TextView coloseIv1 = (TextView) bottomView.findViewById(R.id.colose_iv); + TextView hideTv = (TextView) bottomView.findViewById(R.id.hide_tv); + TextView deleteTv = (TextView) bottomView.findViewById(R.id.delete_tv); + + coloseIv1.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + bottomSheetDialog.dismiss(); + } + }); + + hideTv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + List list = new ArrayList<>(); + list.add(dataBean); + ((ChatTabFragment) getParentFragment()).deleteMoreConversation(1, list); + bottomSheetDialog.dismiss(); + } + }); + deleteTv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (getParentFragment() != null) { + List list = new ArrayList<>(); + list.add(dataBean); + dataDao.deleteFromId(dataBean.infoData.getContactId()); + ((ChatTabFragment) getParentFragment()).deleteMoreConversation(2, list); + } + bottomSheetDialog.dismiss(); + } + + }); + bottomSheetDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { + @Override + public void onDismiss(DialogInterface dialog) { + getActivity().getWindow().setNavigationBarColor(getResources().getColor(R.color.black)); + } + }); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + AdaptScreenUtils.setWhiteNavigationBar(bottomSheetDialog); + } + } + } + + + @Override + public boolean hasMore() { + return viewModel.hasMore(); + } + + @Override + public void loadMore(Object last) { + if (last instanceof ConversationBean) { + viewModel.loadMore((ConversationBean) last); + } + } + + + @Override + public void onStart() { + super.onStart(); + if (conversationViewTop != null) { + conversationViewTop.setShowTag(true); + } + if (conversationViewBottom != null) { + conversationViewBottom.setShowTag(true); + } + } + + @Override + public void onStop() { + super.onStop(); + if (conversationViewTop != null) { + conversationViewTop.setShowTag(false); + } + if (conversationViewBottom != null) { + conversationViewBottom.setShowTag(false); + } + } + + @Override + public void onDestroyView() { + unregisterObserver(); + EventCenter.unregisterEventNotify(changeDraftEvent); + super.onDestroyView(); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/main/chat/ChatGroupFragment.java b/app/src/main/java/com/dskj/rbchat/main/chat/ChatGroupFragment.java new file mode 100644 index 0000000..01d79ae --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/chat/ChatGroupFragment.java @@ -0,0 +1,103 @@ +package com.dskj.rbchat.main.chat; + +import android.content.Intent; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.lifecycle.ViewModelProvider; + +import com.dskj.rbchat.databinding.FragmentChatgroupBinding; +import com.netease.yunxin.kit.common.ui.fragments.BaseFragment; +import com.netease.yunxin.kit.common.ui.viewmodel.FetchResult; +import com.netease.yunxin.kit.common.ui.viewmodel.LoadStatus; +import com.netease.yunxin.kit.contactkit.ui.fun.team.FunTeamListActivity; +import com.netease.yunxin.kit.contactkit.ui.fun.view.FunContactViewHolderFactory; +import com.netease.yunxin.kit.contactkit.ui.fun.view.viewholder.FunTeamListViewHolder; +import com.netease.yunxin.kit.contactkit.ui.model.BaseContactBean; +import com.netease.yunxin.kit.contactkit.ui.model.IViewTypeConstant; +import com.netease.yunxin.kit.contactkit.ui.team.TeamListViewModel; +import com.netease.yunxin.kit.contactkit.ui.view.ContactListView; +import com.netease.yunxin.kit.contactkit.ui.view.viewholder.BaseContactViewHolder; +import com.netease.yunxin.kit.corekit.im.utils.RouterConstant; +import com.netease.yunxin.kit.corekit.route.XKitRouter; + +import java.util.List; + +public class ChatGroupFragment extends BaseFragment { + + FragmentChatgroupBinding chatgroupBinding; + TeamListViewModel viewModel; + + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + chatgroupBinding = FragmentChatgroupBinding.inflate(inflater); + initView(); + return chatgroupBinding.getRoot(); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + initData(); + } + + public void initView() { + chatgroupBinding.contactListViewGroup.setViewHolderFactory( + new FunContactViewHolderFactory() { + @Override + protected BaseContactViewHolder getCustomViewHolder(ViewGroup view, int viewType) { + if (viewType == IViewTypeConstant.CONTACT_TEAM_LIST) { + FunTeamListViewHolder viewHolder = new FunTeamListViewHolder(view); + viewHolder.setCenter(true); + viewHolder.setItemClickListener( + data -> { + XKitRouter.withKey(data.router) + .withParam(RouterConstant.CHAT_KRY, data.data) + .withContext(getActivity()) + .navigate(); + }); + return viewHolder; + } + return null; + } + }); + } + + public void initData() { + viewModel = new ViewModelProvider(this).get(TeamListViewModel.class); + viewModel.configRoutePath(RouterConstant.PATH_FUN_CHAT_TEAM_PAGE); + viewModel + .getFetchResult() + .observe( + getViewLifecycleOwner(), + result -> { + if (result.getLoadStatus() == LoadStatus.Success) { + chatgroupBinding.contactListViewGroup.clearContactData(); + chatgroupBinding.contactListViewGroup.addContactData(result.getData()); + } else if (result.getLoadStatus() == LoadStatus.Finish) { + if (result.getType() == FetchResult.FetchType.Add) { + chatgroupBinding.contactListViewGroup.addForwardContactData(result.getData()); + chatgroupBinding.contactListViewGroup.scrollToPosition(0); + } else if (result.getType() == FetchResult.FetchType.Remove) { + chatgroupBinding.contactListViewGroup.removeContactData(result.getData()); + } + } + doCallback(); + }); + viewModel.fetchTeamList(); + } + + public void doCallback() { + chatgroupBinding.emptyLayout.setVisibility(View.GONE); + List datalist = chatgroupBinding.contactListViewGroup.getAdapter().getDataList(); + if (datalist == null || datalist.size() == 0) { + chatgroupBinding.emptyLayout.setVisibility(View.VISIBLE); + } + } +} diff --git a/app/src/main/java/com/dskj/rbchat/main/chat/ChatMain2Fragment.java b/app/src/main/java/com/dskj/rbchat/main/chat/ChatMain2Fragment.java new file mode 100644 index 0000000..f67bf42 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/chat/ChatMain2Fragment.java @@ -0,0 +1,839 @@ +package com.dskj.rbchat.main.chat; + +import static com.netease.yunxin.kit.chatkit.ui.fun.view.MessageBottomLayout.TAG; +import static com.netease.yunxin.kit.contactkit.ui.selector.BaseContactSelectorActivity.DEFAULT_MAX_SELECT_COUNT; +import static com.netease.yunxin.kit.conversationkit.ui.common.ConversationConstant.LIB_TAG; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.KEY_CONTACT_SELECTOR_MAX_COUNT; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.KEY_REQUEST_SELECTOR_NAME_ENABLE; + +import android.content.Intent; +import android.graphics.Typeface; +import android.net.NetworkInfo; +import android.os.Bundle; +import android.os.Handler; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; +import androidx.viewpager2.widget.ViewPager2; + +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.FragmentChatBinding; +import com.dskj.rbchat.imkit.selector.FunContactSelectorActivity; +import com.dskj.rbchat.main.FragmentAdapter; +import com.dskj.rbchat.main.MainActivity; +import com.dskj.rbchat.main.index.add.AddFriendsActivity; +import com.dskj.rbchat.event.ConversationEditEvent; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.google.gson.reflect.TypeToken; +import com.netease.nimlib.sdk.friend.model.MuteListChangedNotify; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.nimlib.sdk.team.model.Team; +import com.netease.yunxin.kit.alog.ALog; +import com.netease.yunxin.kit.chatkit.model.ConversationInfo; +import com.netease.yunxin.kit.chatkit.repo.ContactRepo; +import com.netease.yunxin.kit.chatkit.ui.fun.FunChatForwardSelectDialog; +import com.netease.yunxin.kit.common.ui.fragments.BaseFragment; +import com.netease.yunxin.kit.common.ui.viewmodel.FetchResult; +import com.netease.yunxin.kit.common.ui.viewmodel.LoadStatus; +import com.netease.yunxin.kit.common.utils.NetworkUtils; +import com.netease.yunxin.kit.contactkit.ui.fun.search.FunSearchActivity; +import com.netease.yunxin.kit.contactkit.ui.model.ContactFriendBean; +import com.netease.yunxin.kit.conversationkit.ui.common.ConversationConstant; +import com.netease.yunxin.kit.conversationkit.ui.common.ConversationHelper; +import com.netease.yunxin.kit.conversationkit.ui.model.ConversationBean; +import com.netease.yunxin.kit.conversationkit.ui.page.interfaces.IConversationCallback; +import com.netease.yunxin.kit.conversationkit.ui.page.viewmodel.ConversationViewModel; +import com.netease.yunxin.kit.conversationkit.ui.view.ConversationView; +import com.netease.yunxin.kit.corekit.event.EventCenter; +import com.netease.yunxin.kit.corekit.event.EventNotify; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.model.FriendInfo; +import com.netease.yunxin.kit.corekit.im.model.UserInfo; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +//聊天会话View +@Deprecated +public class ChatMain2Fragment extends BaseFragment { + + FragmentChatBinding viewBinding; + AllConversationFragment allConversationFragment; + FriendConversationFragment friendConversationFragment; + TeamConversationFragment teamConversationFragment; + FollowListFragment followListFragment; + private FragmentAdapter fragmentAdapter; + + private View mCurrentTab; + private View[] tabView; + private List fragments = new ArrayList<>(); + + public ConversationViewModel viewModel; + // public ContactViewModel viewModelFriends; + private IConversationCallback conversationCallback; + public Observer>> contactFriendObserver; //联系人变更 + private Observer>> changeObserver; + private Observer> stickObserver; + private Observer>> userInfoObserver; + private Observer>> friendInfoObserver; + private Observer>> teamInfoObserver; + private Observer> muteObserver; + private Observer> addRemoveStickObserver; + private Observer>> aitObserver; + private Observer> unreadCountObserver; + private ArrayList servicesIds = new ArrayList<>(); + + private final NetworkUtils.NetworkStateListener networkStateListener = + new NetworkUtils.NetworkStateListener() { + @Override + public void onAvailable(NetworkInfo network) { + if (viewBinding != null) { + viewBinding.errorTv.setVisibility(View.GONE); + } + } + + @Override + public void onLost(NetworkInfo network) { + if (viewBinding != null) { + viewBinding.errorTv.setVisibility(View.VISIBLE); + } + + } + }; + + protected final EventNotify editConversation = + new EventNotify() { + @Override + public void onNotify(@NonNull ConversationEditEvent conversationEditEvent) { + //更新会话 + int type = conversationEditEvent.getParamType(); + if (type == 1) { + viewModel.deleteMoreConversation(1, conversationEditEvent.getList()); // 不删记录,只删除会话 + } + if (type == 2) { + viewModel.deleteMoreConversation(2, conversationEditEvent.getList()); //删除本地记录 会话框 + } + } + + @NonNull + @Override + public String getEventType() { + return ConversationEditEvent.EVENT_TYPE; + } + }; + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + viewBinding = FragmentChatBinding.inflate(inflater, container, false); + return viewBinding.getRoot(); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + viewModel = new ViewModelProvider(this).get(ConversationViewModel.class); + viewModel.setComparator(conversationComparator); +// viewModelFriends = new ViewModelProvider(this).get(ContactViewModel.class); + getServicesData(); + initView(); + // NetworkUtils.registerNetworkStatusChangedListener(networkStateListener); + EventCenter.registerEventNotify(editConversation); + initObserver(); + registerObserver(); +// initData(); + } + + + private void getServicesData() { + String tagString = DataUtils.get(IMApplication.getAppContext(), IMUIKitConfig.SERVICES_IDS_TAG + "_" + IMKitClient.account(), ""); + if (!TextUtils.isEmpty(tagString)) { + ArrayList strings = GsonUtils.getListFromJSON(tagString, new TypeToken>() { + }.getType()); + servicesIds.addAll(strings); + } + } + + + public Comparator conversationComparator = + (bean1, bean2) -> { + int result; + if (bean1 == null) { + result = 1; + } else if (bean2 == null) { + result = -1; + } else if (bean1.isStickTop() == bean2.isStickTop()) { + long time = bean1.getTime() - bean2.getTime(); + result = time == 0L ? 0 : (time > 0 ? -1 : 1); + + } else { + result = bean1.isStickTop() ? -1 : 1; + } + ALog.d(ConversationConstant.LIB_TAG, FunChatForwardSelectDialog.TAG, "conversationComparator, result:" + result); + return result; + }; + + public void initView() { + tabView = new View[]{viewBinding.layoutChatfmAll, viewBinding.layoutChatfmFriends, viewBinding.layoutChatfmGroup, viewBinding.layoutChatfmFollow}; +// fragmentAdapter.notifyDataSetChanged(); + allConversationFragment = new AllConversationFragment(); + friendConversationFragment = new FriendConversationFragment(); + teamConversationFragment = new TeamConversationFragment(); + followListFragment = new FollowListFragment(); + + fragments.add(allConversationFragment); + fragments.add(friendConversationFragment); + fragments.add(teamConversationFragment); + fragments.add(followListFragment); + + fragmentAdapter = new FragmentAdapter(this); + fragmentAdapter.setFragmentList(fragments); + viewBinding.viewpagerFmChat.setUserInputEnabled(true); + viewBinding.viewpagerFmChat.setAdapter(fragmentAdapter); + viewBinding.viewpagerFmChat.setCurrentItem(0, false); + viewBinding.viewpagerFmChat.setOffscreenPageLimit(fragments.size()); + mCurrentTab = viewBinding.layoutChatfmAll; + viewBinding.layoutChatfmAll.setOnClickListener(this::chatClick); + viewBinding.layoutChatfmFriends.setOnClickListener(this::chatClick); + viewBinding.layoutChatfmGroup.setOnClickListener(this::chatClick); + viewBinding.layoutChatfmFollow.setOnClickListener(this::chatClick); + + viewBinding.viewSettingclick.setOnClickListener(view -> { + startActivity(new Intent(getActivity(), EditChatRecordlistActivity.class)); + }); + viewBinding.viewAddclick.setOnClickListener(view -> { + startCreateGroup(); + }); + viewBinding.viewFriendgclick.setOnClickListener(view -> { + startActivity(new Intent(getActivity(), AddFriendsActivity.class)); + }); + viewBinding.viewContactclick.setOnClickListener(view -> { + startActivity(new Intent(getActivity(), ContactActivity.class)); + }); + viewBinding.layoutChatfmCommonSearch.getRoot().setOnClickListener(view -> startActivity(new Intent(getActivity(), FunSearchActivity.class)) + ); + + viewBinding.viewpagerFmChat.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() { + + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + super.onPageScrolled(position, positionOffset, positionOffsetPixels); + } + + @Override + public void onPageSelected(int position) { + super.onPageSelected(position); + resetTab(); + mCurrentTab = getCurrentTab(position); + setTabStyle(); + } + }); + viewBinding.layoutChatfmCommonSearch.ivCommonsearchScan.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + MainActivity activity = (MainActivity) getActivity(); + activity.toScan(); + + } + }); + } + + private void initData() { + viewModel + .getQueryLiveData() + .observe( + this.getViewLifecycleOwner(), + result -> { + if (getConversationView()) { + if (result.getLoadStatus() == LoadStatus.Success) { + if (result.getData() != null) { + getAllConversationFragment().getConversationView().setData(removeServicesConversation(result.getData())); + getConversationTypeList(result.getData()); + getFriendConversationFragment().getConversationView().setData(removeServicesConversation(listFriend)); + getTeamConversationFragment().getConversationViewMyTeam().setData(listMyTeam); + getTeamConversationFragment().getConversationViewJoinTeam().setData(listJoinTeam); + } +// List listdata = removeNotFriendConversationListft(result.getData()); + + } else if (result.getLoadStatus() == LoadStatus.Finish) { + getAllConversationFragment().getConversationView().addData(removeServicesConversation(result.getData())); +// getFriendConversationList(result.getData()); + getConversationTypeList(result.getData()); + getFriendConversationFragment().getConversationView().addData(removeServicesConversation(listFriend)); + getTeamConversationFragment().getConversationViewMyTeam().addData(listMyTeam); + getTeamConversationFragment().getConversationViewJoinTeam().addData(listJoinTeam); + } + doEmptyView(); + setDataNumber(); + + } + }); + viewModel.fetchConversation(); + viewModel.getUnreadCount(); + } + + //去掉客服会话 改成添加字段 + public List removeServicesConversation(List beans) { + if (servicesIds == null) { + return beans; + } + for (ConversationBean conversationBean : beans) { + conversationBean.isServices = false; + if (conversationBean.infoData.getSessionType() == SessionTypeEnum.P2P && servicesIds.indexOf(conversationBean.infoData.getContactId()) >= 0) { + conversationBean.isServices = true; + } + } + return beans; + } + + + private void initObserver() { + + changeObserver = + result -> { + if (result.getLoadStatus() == LoadStatus.Success) { + if (result.getData() == null) { + return; + } + getServicesData(); + ALog.d(LIB_TAG, TAG, "ChangeLiveData, Success"); + if (getConversationView()) { + allConversationFragment.getConversationView().update(removeServicesConversation(result.getData())); + getConversationTypeList(result.getData()); + friendConversationFragment.getConversationView().update(removeServicesConversation(listFriend)); + getTeamConversationFragment().getConversationViewMyTeam().update(listMyTeam); + getTeamConversationFragment().getConversationViewJoinTeam().update(listJoinTeam); + getFollowListFragment().updateConversation(listFriend); + + } + } else if (result.getLoadStatus() == LoadStatus.Finish + && result.getType() == FetchResult.FetchType.Remove) { + ALog.d(LIB_TAG, TAG, "DeleteLiveData, Success"); + if (result.getData() == null || result.getData().size() < 1) { + if (getConversationView()) { + allConversationFragment.getConversationView().removeAll(); + friendConversationFragment.getConversationView().removeAll(); + getTeamConversationFragment().getConversationViewMyTeam().removeAll(); + getTeamConversationFragment().getConversationViewJoinTeam().removeAll(); + getFollowListFragment().deleteAllConversation(); + } + } else { + if (getConversationView()) { + allConversationFragment.getConversationView().remove(result.getData()); + friendConversationFragment.getConversationView().remove(result.getData()); +// getConversationListft(result.getData()); +// List all = result.getData(); +// List listMyTeam = getTeamTypeConversationList(all); + getTeamConversationFragment().getConversationViewMyTeam().remove(result.getData()); + getTeamConversationFragment().getConversationViewJoinTeam().remove(result.getData()); + getFollowListFragment().updateConversation(result.getData()); + } + + } + } + setDataNumber(); + doEmptyView(); + doCallback(); + + }; + +// stickObserver = +// result -> { +// if (result.getLoadStatus() == LoadStatus.Success) { +// ALog.d(LIB_TAG, TAG, "StickLiveData, Success"); +// if (getConversationView()) { +// allConversationFragment.getConversationView().update(result.getData()); +// getConversationft(result.getData()); +// } +// +// } +// +// }; + + userInfoObserver = + result -> { + if (result.getLoadStatus() == LoadStatus.Success) { + ALog.d(LIB_TAG, TAG, "UserInfoLiveData, Success"); + if (getConversationView()) { + allConversationFragment.getConversationView().updateUserInfo(result.getData()); + friendConversationFragment.getConversationView().updateUserInfo(result.getData()); + } + + } + }; + + friendInfoObserver = + result -> { + if (result.getLoadStatus() == LoadStatus.Success) { + ALog.d(LIB_TAG, TAG, "FriendInfoLiveData, Success"); + if (getConversationView()) { + allConversationFragment.getConversationView().updateFriendInfo(result.getData()); + friendConversationFragment.getConversationView().updateFriendInfo(result.getData()); + } + + } + }; + teamInfoObserver = + result -> { + if (result.getLoadStatus() == LoadStatus.Success) { + ALog.d(LIB_TAG, TAG, "TeamInfoLiveData, Success"); + if (getConversationView()) { + allConversationFragment.getConversationView().updateTeamInfo(result.getData()); + teamConversationFragment.getConversationViewMyTeam().updateTeamInfoType(result.getData(), true); + teamConversationFragment.getConversationViewJoinTeam().updateTeamInfoType(result.getData(), false); + } + + } + }; + + muteObserver = + result -> { + if (result.getLoadStatus() == LoadStatus.Success) { + ALog.d(LIB_TAG, TAG, "MuteInfoLiveData, Success"); + if (getConversationView()) { + allConversationFragment.getConversationView().updateMuteInfo(result.getData()); + friendConversationFragment.getConversationView().updateMuteInfo(result.getData()); + teamConversationFragment.getConversationViewMyTeam().updateMuteInfo(result.getData()); + teamConversationFragment.getConversationViewJoinTeam().updateMuteInfo(result.getData()); + } + + } + }; + + aitObserver = + result -> { + if (result.getLoadStatus() == LoadStatus.Finish) { + if (result.getType() == FetchResult.FetchType.Add) { + ALog.d(LIB_TAG, TAG, "AddStickLiveData, Success"); + if (getConversationView()) { + ConversationHelper.updateAitInfo(result.getData(), true); + allConversationFragment.getConversationView().updateAit(result.getData()); + friendConversationFragment.getConversationView().updateAit(result.getData()); + teamConversationFragment.getConversationViewMyTeam().updateAit(result.getData()); + teamConversationFragment.getConversationViewJoinTeam().updateAit(result.getData()); + } + + } else if (result.getType() == FetchResult.FetchType.Remove) { + ALog.d(LIB_TAG, TAG, "RemoveStickLiveData, Success"); + if (getConversationView()) { + ConversationHelper.updateAitInfo(result.getData(), false); + allConversationFragment.getConversationView().updateAit(result.getData()); + friendConversationFragment.getConversationView().updateAit(result.getData()); + teamConversationFragment.getConversationViewMyTeam().updateAit(result.getData()); + teamConversationFragment.getConversationViewJoinTeam().updateAit(result.getData()); + } + + } + } + }; + +// addRemoveStickObserver = +// result -> { +// if (result.getLoadStatus() == LoadStatus.Finish) { +// if (result.getType() == FetchResult.FetchType.Add) { +// ALog.d(LIB_TAG, TAG, "AddStickLiveData, Success"); +// if (getConversationView()) { +// allConversationFragment.getConversationView().addStickTop(result.getData()); +// friendConversationFragment.getConversationView().addStickTop(result.getData()); +// teamConversationFragment.getConversationView().addStickTop(result.getData()); +// } +// +// } else if (result.getType() == FetchResult.FetchType.Remove) { +// ALog.d(LIB_TAG, TAG, "RemoveStickLiveData, Success"); +// if (getConversationView()) { +// allConversationFragment.getConversationView().removeStickTop(result.getData()); +// friendConversationFragment.getConversationView().removeStickTop(result.getData()); +// teamConversationFragment.getConversationView().removeStickTop(result.getData()); +// } +// +// } +// } +// }; + + unreadCountObserver = + result -> { + if (result.getLoadStatus() == LoadStatus.Success) { + ALog.d(LIB_TAG, TAG, "unreadCount, Success"); + if (result.getData() == null) { + ((MainActivity) getActivity()).hideUnReadChat(); + } else { + ((MainActivity) getActivity()).setUnReadChat(result.getData()); + } +// if (conversationCallback != null) { +// conversationCallback.updateUnreadCount( +// result.getData() == null ? 0 : result.getData()); +// } + } + }; + } + + private long msgUnreadCountTime = 0; + public final long MSG_UNREAD_COUNT_INTERVAL = 1000; + private Handler conversationHandler = new Handler(); + + private void doCallback() { + long currentTime = System.currentTimeMillis(); + ALog.d(LIB_TAG, TAG, "doCallback"); + if (viewModel != null && currentTime - msgUnreadCountTime > MSG_UNREAD_COUNT_INTERVAL) { + msgUnreadCountTime = currentTime; + conversationHandler.removeCallbacks(msgUnreadCountRunnable); + viewModel.getUnreadCount(); + ALog.d(LIB_TAG, TAG, "doCallback:getUnreadCount"); + } else if (viewModel != null && conversationHandler != null) { + ALog.d(LIB_TAG, TAG, "doCallback:conversationHandler"); + conversationHandler.removeCallbacks(msgUnreadCountRunnable); + conversationHandler.postDelayed(msgUnreadCountRunnable, MSG_UNREAD_COUNT_INTERVAL); + } + } + + private Runnable msgUnreadCountRunnable = + new Runnable() { + @Override + public void run() { + if (viewModel != null) { + viewModel.getUnreadCount(); + ALog.d(LIB_TAG, TAG, "msgUnreadCountRunnable:getUnreadCount"); + } + } + }; + + public void doEmptyView() { + if (getConversationView()) { + if (allConversationFragment.getConversationView().getDataSize() > 0) { + allConversationFragment.getEmptyView().setVisibility(View.GONE); + } else { + allConversationFragment.getEmptyView().setVisibility(View.VISIBLE); + } + if (friendConversationFragment.getConversationView().getDataSize() > 0) { + friendConversationFragment.getEmptyView().setVisibility(View.GONE); + } else { + friendConversationFragment.getEmptyView().setVisibility(View.VISIBLE); + } +// if (teamConversationFragment.getConversationView().getDataSize() > 0) { +// teamConversationFragment.getEmptyView().setVisibility(View.GONE); +// } else { +// teamConversationFragment.getEmptyView().setVisibility(View.VISIBLE); +// } + + } + } + + public void setDataNumber() { + if (getConversationView()) { + teamConversationFragment.setMyTeamList(); + teamConversationFragment.setJoinTeamList(); + teamConversationFragment.setEmptyAll(); + } + } + + public void setNetWorkView(boolean isavailable) { + if (viewBinding != null) { + if (isavailable) { + viewBinding.errorTv.setVisibility(View.GONE); + } else { + viewBinding.errorTv.setVisibility(View.VISIBLE); + } + } + } + + + List listFriend = new ArrayList<>(); + List listMyTeam = new ArrayList<>(); + List listJoinTeam = new ArrayList<>(); + List listfollow = new ArrayList<>(); + + + public void getConversationTypeList(List list) { + listFriend.clear(); + listMyTeam.clear(); + listJoinTeam.clear(); + listfollow.clear(); + for (ConversationBean conversationBean : list) { + if (conversationBean.infoData.getTeamInfo() != null) { //不是群就是好友 也包含已删除的好友会话 + if (conversationBean.infoData.getTeamInfo().getCreator().equals(IMKitClient.account())) { + listMyTeam.add(conversationBean); + } else { + listJoinTeam.add(conversationBean); + } + } else { + if (ContactRepo.isFriend(conversationBean.infoData.getContactId())) { + listFriend.add(conversationBean); + } + + } + } + + } + + public List getTeamTypeConversationList(List list) { + List listJoinTeam = new ArrayList<>(); + for (ConversationBean conversationBean : list) { + if (conversationBean.infoData.getTeamInfo() != null) { + if (conversationBean.infoData.getTeamInfo().getCreator().equals(IMKitClient.account())) { // 我创建的群 + listJoinTeam.add(conversationBean); + } + } + + } + return listJoinTeam; + } + + public List getTeamTypeTeamInfoList(List list) { + List listJoinTeam = new ArrayList<>(); + for (Team team : list) { + if (team.getCreator().equals(IMKitClient.account())) { // 我创建的群 + listJoinTeam.add(team); + } else { + if (list.indexOf(team) > 0) { + list.remove(list.indexOf(team)); + } + } + + + } + return listJoinTeam; + } + + +// public void updateConversationTypeList(List list) { +// if (listFriend.size() > 0) { +// +// for (ConversationBean conversationBean : list) { +// int index = listFriend.indexOf(conversationBean); +// if (index > 0) { +// listFriend.set(index, conversationBean); +// +// } +// } +// } +// if (listTeam.size() > 0) { +// for (ConversationBean conversationBean : list) { +// int index = listTeam.indexOf(conversationBean); +// if (index > 0) { +// listTeam.set(index, conversationBean); +// +// } +// } +// } +// +// } + +// public boolean updateFriend(List list) { +// if (listFriend.size() > 0) { +// for (ConversationBean conversationBean : list) { +// int index = listFriend.indexOf(conversationBean); +// if (index > 0) { +// listFriend.set(index, conversationBean); +// return true; +// } +// } +// } +// return false; +// } + +// public void getFriendConversationList(List list) { +// listFriend.clear(); +// for (ConversationBean conversationBean : list) { +// if (conversationBean.infoData.getFriendInfo() != null) { +// listFriend.add(conversationBean); +// } +// } +// } + +// public boolean updateTeam(List list) { +// if (listTeam.size() > 0) { +// for (ConversationBean conversationBean : list) { +// int index = listTeam.indexOf(conversationBean); +// if (index > 0) { +// listTeam.set(index, conversationBean); +// return true; +// } +// } +// } +// return false; +// } + + + public List removeNotFriendConversationListft(List list) { + for (int i = 0; i < list.size(); i++) { + if (list.get(i).infoData.getFriendInfo() == null) { + list.remove(i); + } + } + return list; + } + + public void getConversationft(ConversationBean bean) { + if (bean.infoData.getFriendInfo() != null) { + friendConversationFragment.getConversationView().update(bean); + } + if (bean.infoData.getTeamInfo() != null) { + if (bean.infoData.getTeamInfo().getCreator().equals(IMKitClient.account())) { + teamConversationFragment.getConversationViewMyTeam().update(bean); + } else { + teamConversationFragment.getConversationViewJoinTeam().update(bean); + } + + } + + } + + public boolean getConversationView() { + ConversationView AllconversationView = getAllConversationFragment().getConversationView(); + ConversationView friendConversationView = getFriendConversationFragment().getConversationView(); + ConversationView teamConversationView = getTeamConversationFragment().getConversationViewMyTeam(); + ConversationView teamJoinConversationView = getTeamConversationFragment().getConversationViewJoinTeam(); + if (AllconversationView == null) { + return false; + } + if (friendConversationView == null) { + return false; + } + if (teamConversationView == null) { + return false; + } + if (teamJoinConversationView == null) { + return false; + } + return true; + } + + private void registerObserver() { +// viewModelFriends.getContactLiveData().observeForever(contactFriendObserver); + viewModel.getChangeLiveData().observeForever(changeObserver); +// viewModel.getStickLiveData().observeForever(stickObserver); + viewModel.getUserInfoLiveData().observeForever(userInfoObserver); + viewModel.getFriendInfoLiveData().observeForever(friendInfoObserver); + viewModel.getTeamInfoLiveData().observeForever(teamInfoObserver); + viewModel.getMuteInfoLiveData().observeForever(muteObserver); +// viewModel.getAddRemoveStickLiveData().observeForever(addRemoveStickObserver); + viewModel.getAitLiveData().observeForever(aitObserver); + viewModel.getUnreadCountLiveData().observeForever(unreadCountObserver); + } + + private void unregisterObserver() { +// viewModelFriends.getContactLiveData().removeObserver(contactFriendObserver); + viewModel.getChangeLiveData().removeObserver(changeObserver); +// viewModel.getStickLiveData().removeObserver(stickObserver); + viewModel.getUserInfoLiveData().removeObserver(userInfoObserver); + viewModel.getFriendInfoLiveData().removeObserver(friendInfoObserver); + viewModel.getTeamInfoLiveData().removeObserver(teamInfoObserver); + viewModel.getMuteInfoLiveData().removeObserver(muteObserver); +// viewModel.getAddRemoveStickLiveData().removeObserver(addRemoveStickObserver); + viewModel.getAitLiveData().removeObserver(aitObserver); + viewModel.getUnreadCountLiveData().removeObserver(unreadCountObserver); + } + +// public AllConversationFragment getAllConversationFragment() { +// return allConversationFragment; +// } + + public AllConversationFragment getAllConversationFragment() { + return allConversationFragment; + } + public TeamConversationFragment getTeamConversationFragment() { + return teamConversationFragment; + } + + public FriendConversationFragment getFriendConversationFragment() { + return friendConversationFragment; + } + + public FollowListFragment getFollowListFragment() { + return followListFragment; + } + + + public void startCreateGroup() { + startActivity(new Intent(getActivity(), FunContactSelectorActivity.class).putExtra(KEY_CONTACT_SELECTOR_MAX_COUNT, DEFAULT_MAX_SELECT_COUNT).putExtra(KEY_REQUEST_SELECTOR_NAME_ENABLE, true)); + } + + public View getCurrentTab(int position) { + return tabView[position]; + } + + public void chatClick(View view) { + if (mCurrentTab != null && mCurrentTab == view) { + return; + } + resetTab(); + mCurrentTab = view; + setTabStyle(); + } + + private void resetTab() { + viewBinding.tvChatfmAll.setTextColor( + getResources().getColor(R.color.color_7f7b81)); + viewBinding.tvChatfmAll.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL)); + viewBinding.ivChatfmAllindicator.setVisibility(View.GONE); + + viewBinding.tvChatfmFriends.setTextColor( + getResources().getColor(R.color.color_7f7b81)); + viewBinding.tvChatfmFriends.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL)); + viewBinding.ivChatfmFriendindicator.setVisibility(View.GONE); + + viewBinding.tvChatfmGroup.setTextColor( + getResources().getColor(R.color.color_7f7b81)); + viewBinding.tvChatfmGroup.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL)); + viewBinding.ivChatfmGroupindicator.setVisibility(View.GONE); + + viewBinding.tvChatfmFollow.setTextColor( + getResources().getColor(R.color.color_7f7b81)); + viewBinding.tvChatfmFollow.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL)); + viewBinding.ivChatfmFollowindicator.setVisibility(View.GONE); + } + + private void setTabStyle() { + if (mCurrentTab == viewBinding.layoutChatfmAll) { + viewBinding.viewpagerFmChat.setCurrentItem(0, false); + viewBinding.tvChatfmAll.setTextColor( + getResources().getColor(R.color.color_333333)); + viewBinding.tvChatfmAll.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD)); + viewBinding.ivChatfmAllindicator.setVisibility(View.VISIBLE); + } + if (mCurrentTab == viewBinding.layoutChatfmFriends) { + viewBinding.viewpagerFmChat.setCurrentItem(1, false); + viewBinding.tvChatfmFriends.setTextColor( + getResources().getColor(R.color.color_333333)); + viewBinding.tvChatfmFriends.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD)); + viewBinding.ivChatfmFriendindicator.setVisibility(View.VISIBLE); + } + if (mCurrentTab == viewBinding.layoutChatfmGroup) { + viewBinding.viewpagerFmChat.setCurrentItem(2, false); + viewBinding.tvChatfmGroup.setTextColor( + getResources().getColor(R.color.color_333333)); + viewBinding.tvChatfmGroup.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD)); + viewBinding.ivChatfmGroupindicator.setVisibility(View.VISIBLE); + } + + if (mCurrentTab == viewBinding.layoutChatfmFollow) { + viewBinding.viewpagerFmChat.setCurrentItem(3, false); + viewBinding.tvChatfmFollow.setTextColor( + getResources().getColor(R.color.color_333333)); + viewBinding.tvChatfmFollow.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD)); + viewBinding.ivChatfmFollowindicator.setVisibility(View.VISIBLE); + + } + } + + @Override + public void onDestroyView() { + unregisterObserver(); + // NetworkUtils.unregisterNetworkStatusChangedListener(networkStateListener); + EventCenter.unregisterEventNotify(editConversation); + super.onDestroyView(); + + } + +} diff --git a/app/src/main/java/com/dskj/rbchat/main/chat/ChatMainFragment.java b/app/src/main/java/com/dskj/rbchat/main/chat/ChatMainFragment.java new file mode 100644 index 0000000..e0f9e10 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/chat/ChatMainFragment.java @@ -0,0 +1,252 @@ +package com.dskj.rbchat.main.chat; + +import static com.netease.yunxin.kit.contactkit.ui.selector.BaseContactSelectorActivity.DEFAULT_MAX_SELECT_COUNT; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.KEY_CONTACT_SELECTOR_MAX_COUNT; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.KEY_REQUEST_SELECTOR_NAME_ENABLE; + +import android.content.Intent; +import android.graphics.Typeface; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; +import androidx.viewpager2.widget.ViewPager2; + +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.FragmentChatBinding; +import com.dskj.rbchat.imkit.selector.FunContactSelectorActivity; +import com.dskj.rbchat.main.FragmentAdapter; +import com.dskj.rbchat.main.MainActivity; +import com.dskj.rbchat.utils.LogUtils; +import com.netease.yunxin.kit.alog.ALog; +import com.netease.yunxin.kit.common.ui.fragments.BaseFragment; +import com.netease.yunxin.kit.common.ui.viewmodel.FetchResult; +import com.netease.yunxin.kit.common.ui.viewmodel.LoadStatus; +import com.netease.yunxin.kit.contactkit.ui.fun.contact.FunContactFragment; +import com.netease.yunxin.kit.contactkit.ui.fun.search.FunSearchActivity; +import com.netease.yunxin.kit.conversationkit.ui.common.ConversationConstant; +import com.netease.yunxin.kit.conversationkit.ui.fun.page.FunConversationFragment; +import com.netease.yunxin.kit.conversationkit.ui.model.ConversationBean; +import com.netease.yunxin.kit.conversationkit.ui.model.DeleteConversionEvent; +import com.netease.yunxin.kit.conversationkit.ui.page.viewmodel.ConversationViewModel; +import com.netease.yunxin.kit.corekit.event.EventCenter; +import com.netease.yunxin.kit.corekit.event.EventNotify; + +import java.util.ArrayList; +import java.util.List; + +//聊天会话View +@Deprecated +public class ChatMainFragment extends BaseFragment { + + FragmentChatBinding viewBinding; + FunConversationFragment chatAllFragment; + // ChatFriendsFragment chatFriendsFragment; + FunContactFragment chatFriendsFragment; + ChatGroupFragment chatGroupFragment; + FollowListFragment followListFragment; + + private View mCurrentTab; + private View[] tabView; + protected ActivityResultLauncher permissionLauncher; + + private Observer>> changeObserver; + protected ConversationViewModel conversationViewModel; + + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + viewBinding = FragmentChatBinding.inflate(inflater, container, false); + return viewBinding.getRoot(); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + initView(); + initData(); + } + + public void initView() { + tabView = new View[]{viewBinding.layoutChatfmAll, viewBinding.layoutChatfmFriends, viewBinding.layoutChatfmGroup, viewBinding.layoutChatfmFollow}; + List fragments = new ArrayList<>(); + chatAllFragment = new FunConversationFragment(); + chatFriendsFragment = new FunContactFragment(); + chatGroupFragment = new ChatGroupFragment(); + followListFragment = new FollowListFragment(); + fragments.add(chatAllFragment); + fragments.add(chatFriendsFragment); + fragments.add(chatGroupFragment); + fragments.add(followListFragment); + FragmentAdapter fragmentAdapter = new FragmentAdapter(this); + fragmentAdapter.setFragmentList(fragments); + viewBinding.viewpagerFmChat.setUserInputEnabled(true); + viewBinding.viewpagerFmChat.setAdapter(fragmentAdapter); + viewBinding.viewpagerFmChat.setCurrentItem(0, false); + viewBinding.viewpagerFmChat.setOffscreenPageLimit(fragments.size()); + mCurrentTab = viewBinding.layoutChatfmAll; + viewBinding.layoutChatfmAll.setOnClickListener(this::chatClick); + viewBinding.layoutChatfmFriends.setOnClickListener(this::chatClick); + viewBinding.layoutChatfmGroup.setOnClickListener(this::chatClick); + viewBinding.layoutChatfmFollow.setOnClickListener(this::chatClick); + + viewBinding.viewSettingclick.setOnClickListener(view -> { + startActivity(new Intent(getActivity(), EditChatRecordlistActivity.class)); + }); + viewBinding.viewAddclick.setOnClickListener(view -> { + startCreateGroup(); + }); + viewBinding.layoutChatfmCommonSearch.getRoot().setOnClickListener(view -> startActivity(new Intent(getActivity(), FunSearchActivity.class)) + ); + + viewBinding.viewpagerFmChat.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() { + + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + super.onPageScrolled(position, positionOffset, positionOffsetPixels); + } + + @Override + public void onPageSelected(int position) { + super.onPageSelected(position); + resetTab(); + mCurrentTab = getCurrentTab(position); + setTabStyle(); + } + }); + viewBinding.layoutChatfmCommonSearch.ivCommonsearchScan.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + MainActivity activity = (MainActivity) getActivity(); + activity.toScan(); + + } + }); + } + + public void initData() { + conversationViewModel = new ViewModelProvider(this).get(ConversationViewModel.class); + changeObserver = + result -> { + if (result.getLoadStatus() == LoadStatus.Success) { + ALog.d(ConversationConstant.LIB_TAG, "TAG", "ChangeLiveData, Success"); + //更新 + assert result.getData() != null; + if (result.getData().size() > 0) { + for (ConversationBean bean : result.getData()) { + if (TextUtils.isEmpty(bean.infoData.getContent())) { + chatAllFragment.getConversationView().remove(result.getData()); + } else { + chatAllFragment.getConversationView().update(result.getData()); + } + } + } + } else if (result.getLoadStatus() == LoadStatus.Finish + && result.getType() == FetchResult.FetchType.Remove) { + //如果会话删除,重新获取好友 和 群组 + ALog.d(ConversationConstant.LIB_TAG, "TAG", "ChangeLiveData, Success"); + if (result.getData() == null || result.getData().size() < 1) { + chatAllFragment.getConversationView().removeAll(); + } else { + chatAllFragment.getConversationView().remove(result.getData()); + } + } + + }; + + } + + public void startCreateGroup() { + startActivity(new Intent(getActivity(), FunContactSelectorActivity.class).putExtra(KEY_CONTACT_SELECTOR_MAX_COUNT, DEFAULT_MAX_SELECT_COUNT).putExtra(KEY_REQUEST_SELECTOR_NAME_ENABLE, true)); + } + + public View getCurrentTab(int position) { + return tabView[position]; + } + + public void chatClick(View view) { + if (mCurrentTab != null && mCurrentTab == view) { + return; + } + resetTab(); + mCurrentTab = view; + setTabStyle(); + } + + private void resetTab() { + viewBinding.tvChatfmAll.setTextColor( + getResources().getColor(R.color.color_7f7b81)); + viewBinding.tvChatfmAll.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL)); + viewBinding.ivChatfmAllindicator.setVisibility(View.GONE); + + viewBinding.tvChatfmFriends.setTextColor( + getResources().getColor(R.color.color_7f7b81)); + viewBinding.tvChatfmFriends.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL)); + viewBinding.ivChatfmFriendindicator.setVisibility(View.GONE); + + viewBinding.tvChatfmGroup.setTextColor( + getResources().getColor(R.color.color_7f7b81)); + viewBinding.tvChatfmGroup.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL)); + viewBinding.ivChatfmGroupindicator.setVisibility(View.GONE); + + viewBinding.tvChatfmFollow.setTextColor( + getResources().getColor(R.color.color_7f7b81)); + viewBinding.tvChatfmFollow.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL)); + viewBinding.ivChatfmFollowindicator.setVisibility(View.GONE); + } + + private void setTabStyle() { + if (mCurrentTab == viewBinding.layoutChatfmAll) { + viewBinding.viewpagerFmChat.setCurrentItem(0, false); + viewBinding.tvChatfmAll.setTextColor( + getResources().getColor(R.color.color_333333)); + viewBinding.tvChatfmAll.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD)); + viewBinding.ivChatfmAllindicator.setVisibility(View.VISIBLE); + } + if (mCurrentTab == viewBinding.layoutChatfmFriends) { + viewBinding.viewpagerFmChat.setCurrentItem(1, false); + viewBinding.tvChatfmFriends.setTextColor( + getResources().getColor(R.color.color_333333)); + viewBinding.tvChatfmFriends.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD)); + viewBinding.ivChatfmFriendindicator.setVisibility(View.VISIBLE); + } + if (mCurrentTab == viewBinding.layoutChatfmGroup) { + viewBinding.viewpagerFmChat.setCurrentItem(2, false); + viewBinding.tvChatfmGroup.setTextColor( + getResources().getColor(R.color.color_333333)); + viewBinding.tvChatfmGroup.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD)); + viewBinding.ivChatfmGroupindicator.setVisibility(View.VISIBLE); + } + + if (mCurrentTab == viewBinding.layoutChatfmFollow) { + viewBinding.viewpagerFmChat.setCurrentItem(3, false); + viewBinding.tvChatfmFollow.setTextColor( + getResources().getColor(R.color.color_333333)); + viewBinding.tvChatfmFollow.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD)); + viewBinding.ivChatfmFollowindicator.setVisibility(View.VISIBLE); + + } + } + + @Override + public void onResume() { + super.onResume(); + conversationViewModel.getChangeLiveData().observeForever(changeObserver); + } + + @Override + public void onDestroy() { + super.onDestroy(); + conversationViewModel.getChangeLiveData().observeForever(changeObserver); +// EventCenter.unregisterEventNotify(updateConversionEvent); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/main/chat/ChatTabFragment.java b/app/src/main/java/com/dskj/rbchat/main/chat/ChatTabFragment.java new file mode 100644 index 0000000..277ec05 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/chat/ChatTabFragment.java @@ -0,0 +1,321 @@ +package com.dskj.rbchat.main.chat; + +import static com.netease.yunxin.kit.contactkit.ui.selector.BaseContactSelectorActivity.DEFAULT_MAX_SELECT_COUNT; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.KEY_CONTACT_SELECTOR_MAX_COUNT; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.KEY_REQUEST_SELECTOR_NAME_ENABLE; + +import android.content.Intent; +import android.graphics.Typeface; +import android.net.NetworkInfo; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.viewpager2.widget.ViewPager2; + +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.FragmentChatBinding; +import com.dskj.rbchat.imkit.selector.FunContactSelectorActivity; +import com.dskj.rbchat.main.FragmentAdapter; +import com.dskj.rbchat.main.MainActivity; +import com.dskj.rbchat.main.index.add.AddFriendsActivity; +import com.dskj.rbchat.event.ConversationEditEvent; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.google.gson.reflect.TypeToken; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.msg.MsgService; +import com.netease.yunxin.kit.alog.ALog; +import com.netease.yunxin.kit.chatkit.model.ConversationInfo; +import com.netease.yunxin.kit.chatkit.ui.fun.FunChatForwardSelectDialog; +import com.netease.yunxin.kit.common.ui.fragments.BaseFragment; +import com.netease.yunxin.kit.common.utils.NetworkUtils; +import com.netease.yunxin.kit.contactkit.ui.fun.search.FunSearchActivity; +import com.netease.yunxin.kit.conversationkit.ui.common.ConversationConstant; +import com.netease.yunxin.kit.conversationkit.ui.model.ConversationBean; +import com.netease.yunxin.kit.corekit.event.EventCenter; +import com.netease.yunxin.kit.corekit.event.EventNotify; +import com.netease.yunxin.kit.corekit.im.IMKitClient; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +//聊天会话View 把注册监听 放到childfragment 不然分屏之后不会更新数据 +public class ChatTabFragment extends BaseFragment { + + FragmentChatBinding viewBinding; + ChatConversationFragment allConversationFragment; + ChatConversationFragment friendConversationFragment; + ChatConversationFragment teamConversationFragment; + FollowListFragment followListFragment; + private FragmentAdapter fragmentAdapter; + + private View mCurrentTab; + private View[] tabView; + private List fragments = new ArrayList<>(); + +// public ConversationViewModel viewModel; + + private ArrayList servicesIds = new ArrayList<>(); + + private final NetworkUtils.NetworkStateListener networkStateListener = + new NetworkUtils.NetworkStateListener() { + @Override + public void onAvailable(NetworkInfo network) { + if (viewBinding != null) { + viewBinding.errorTv.setVisibility(View.GONE); + } + } + + @Override + public void onLost(NetworkInfo network) { + if (viewBinding != null) { + viewBinding.errorTv.setVisibility(View.VISIBLE); + } + + } + }; + + protected final EventNotify editConversation = + new EventNotify() { + @Override + public void onNotify(@NonNull ConversationEditEvent conversationEditEvent) { + //更新会话 + int type = conversationEditEvent.getParamType(); + if (type == 1) { + deleteMoreConversation(1, conversationEditEvent.getList()); + } + if (type == 2) { + deleteMoreConversation(2, conversationEditEvent.getList()); + } + if (type == 3) { + followListFragment.updateConversation(conversationEditEvent.getList()); + } + } + + @NonNull + @Override + public String getEventType() { + return ConversationEditEvent.EVENT_TYPE; + } + }; + + + public void deleteMoreConversation(int type, List list) { + for (ConversationBean conversationBean : list) { + ConversationInfo conversationInfo = conversationBean.infoData; + NIMClient.getService(MsgService.class).deleteRecentContact2(conversationInfo.getContactId(), conversationInfo.getSessionType()); //删除会话 没删聊天记录 + if (type == 2) { + NIMClient.getService(MsgService.class).clearServerHistory(conversationInfo.getContactId(), conversationInfo.getSessionType(), false); + } + } + + } + + public void updateUnRead(int number) { + if (number > 0) { + viewBinding.viewChatfmAllpoint.setVisibility(View.VISIBLE); + } else { + viewBinding.viewChatfmAllpoint.setVisibility(View.GONE); + } + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + viewBinding = FragmentChatBinding.inflate(inflater, container, false); + return viewBinding.getRoot(); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + getServicesData(); + initView(); + // NetworkUtils.registerNetworkStatusChangedListener(networkStateListener); + EventCenter.registerEventNotify(editConversation); + // initObserver(); + // registerObserver(); +// initData(); + } + + + private void getServicesData() { + String tagString = DataUtils.get(IMApplication.getAppContext(), IMUIKitConfig.SERVICES_IDS_TAG + "_" + IMKitClient.account(), ""); + if (!TextUtils.isEmpty(tagString)) { + ArrayList strings = GsonUtils.getListFromJSON(tagString, new TypeToken>() { + }.getType()); + servicesIds.addAll(strings); + } + } + + + public Comparator conversationComparator = + (bean1, bean2) -> { + int result; + if (bean1 == null) { + result = 1; + } else if (bean2 == null) { + result = -1; + } else if (bean1.isStickTop() == bean2.isStickTop()) { + long time = bean1.getTime() - bean2.getTime(); + result = time == 0L ? 0 : (time > 0 ? -1 : 1); + + } else { + result = bean1.isStickTop() ? -1 : 1; + } + ALog.d(ConversationConstant.LIB_TAG, FunChatForwardSelectDialog.TAG, "conversationComparator, result:" + result); + return result; + }; + + public void initView() { + tabView = new View[]{viewBinding.layoutChatfmAll, viewBinding.layoutChatfmFriends, viewBinding.layoutChatfmGroup, viewBinding.layoutChatfmFollow}; + fragments.add(allConversationFragment = ChatConversationFragment.newInstance(0)); + fragments.add(friendConversationFragment = ChatConversationFragment.newInstance(1)); + fragments.add(teamConversationFragment = ChatConversationFragment.newInstance(2)); + followListFragment = new FollowListFragment(); + fragments.add(followListFragment); + + + fragmentAdapter = new FragmentAdapter(this); + fragmentAdapter.setFragmentList(fragments); + viewBinding.viewpagerFmChat.setUserInputEnabled(true); + viewBinding.viewpagerFmChat.setAdapter(fragmentAdapter); + viewBinding.viewpagerFmChat.setCurrentItem(0, false); + viewBinding.viewpagerFmChat.setOffscreenPageLimit(fragments.size()); + mCurrentTab = viewBinding.layoutChatfmAll; + viewBinding.layoutChatfmAll.setOnClickListener(this::chatClick); + viewBinding.layoutChatfmFriends.setOnClickListener(this::chatClick); + viewBinding.layoutChatfmGroup.setOnClickListener(this::chatClick); + viewBinding.layoutChatfmFollow.setOnClickListener(this::chatClick); + + viewBinding.viewSettingclick.setOnClickListener(view -> { + startActivity(new Intent(getActivity(), EditChatRecordlistActivity.class)); + }); + viewBinding.viewAddclick.setOnClickListener(view -> { + startCreateGroup(); + }); + viewBinding.viewFriendgclick.setOnClickListener(view -> { + startActivity(new Intent(getActivity(), AddFriendsActivity.class)); + }); + viewBinding.viewContactclick.setOnClickListener(view -> { + startActivity(new Intent(getActivity(), ContactActivity.class)); + }); + viewBinding.layoutChatfmCommonSearch.getRoot().setOnClickListener(view -> startActivity(new Intent(getActivity(), FunSearchActivity.class)) + ); + + viewBinding.viewpagerFmChat.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() { + + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + super.onPageScrolled(position, positionOffset, positionOffsetPixels); + } + + @Override + public void onPageSelected(int position) { + super.onPageSelected(position); + resetTab(); + mCurrentTab = getCurrentTab(position); + setTabStyle(); + } + }); + viewBinding.layoutChatfmCommonSearch.ivCommonsearchScan.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + MainActivity activity = (MainActivity) getActivity(); + activity.toScan(); + + } + }); + } + + + public void startCreateGroup() { + startActivity(new Intent(getActivity(), FunContactSelectorActivity.class).putExtra(KEY_CONTACT_SELECTOR_MAX_COUNT, DEFAULT_MAX_SELECT_COUNT).putExtra(KEY_REQUEST_SELECTOR_NAME_ENABLE, true)); + } + + public View getCurrentTab(int position) { + return tabView[position]; + } + + public void chatClick(View view) { + if (mCurrentTab != null && mCurrentTab == view) { + return; + } + resetTab(); + mCurrentTab = view; + setTabStyle(); + } + + private void resetTab() { + viewBinding.tvChatfmAll.setTextColor( + getResources().getColor(R.color.color_7f7b81)); + viewBinding.tvChatfmAll.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL)); + viewBinding.ivChatfmAllindicator.setVisibility(View.INVISIBLE); + + viewBinding.tvChatfmFriends.setTextColor( + getResources().getColor(R.color.color_7f7b81)); + viewBinding.tvChatfmFriends.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL)); + viewBinding.ivChatfmFriendindicator.setVisibility(View.INVISIBLE); + + viewBinding.tvChatfmGroup.setTextColor( + getResources().getColor(R.color.color_7f7b81)); + viewBinding.tvChatfmGroup.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL)); + viewBinding.ivChatfmGroupindicator.setVisibility(View.INVISIBLE); + + viewBinding.tvChatfmFollow.setTextColor( + getResources().getColor(R.color.color_7f7b81)); + viewBinding.tvChatfmFollow.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL)); + viewBinding.ivChatfmFollowindicator.setVisibility(View.INVISIBLE); + } + + private void setTabStyle() { + if (mCurrentTab == viewBinding.layoutChatfmAll) { + viewBinding.viewpagerFmChat.setCurrentItem(0, false); + viewBinding.tvChatfmAll.setTextColor( + getResources().getColor(R.color.color_333333)); + viewBinding.tvChatfmAll.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD)); + viewBinding.ivChatfmAllindicator.setVisibility(View.VISIBLE); + } + if (mCurrentTab == viewBinding.layoutChatfmFriends) { + viewBinding.viewpagerFmChat.setCurrentItem(1, false); + viewBinding.tvChatfmFriends.setTextColor( + getResources().getColor(R.color.color_333333)); + viewBinding.tvChatfmFriends.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD)); + viewBinding.ivChatfmFriendindicator.setVisibility(View.VISIBLE); + } + if (mCurrentTab == viewBinding.layoutChatfmGroup) { + viewBinding.viewpagerFmChat.setCurrentItem(2, false); + viewBinding.tvChatfmGroup.setTextColor( + getResources().getColor(R.color.color_333333)); + viewBinding.tvChatfmGroup.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD)); + viewBinding.ivChatfmGroupindicator.setVisibility(View.VISIBLE); + } + + if (mCurrentTab == viewBinding.layoutChatfmFollow) { + viewBinding.viewpagerFmChat.setCurrentItem(3, false); + viewBinding.tvChatfmFollow.setTextColor( + getResources().getColor(R.color.color_333333)); + viewBinding.tvChatfmFollow.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD)); + viewBinding.ivChatfmFollowindicator.setVisibility(View.VISIBLE); + + } + } + + @Override + public void onDestroyView() { + // NetworkUtils.unregisterNetworkStatusChangedListener(networkStateListener); + EventCenter.unregisterEventNotify(editConversation); + super.onDestroyView(); + + } + +} diff --git a/app/src/main/java/com/dskj/rbchat/main/chat/ContactActivity.java b/app/src/main/java/com/dskj/rbchat/main/chat/ContactActivity.java new file mode 100644 index 0000000..84712dc --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/chat/ContactActivity.java @@ -0,0 +1,40 @@ +package com.dskj.rbchat.main.chat; + +import android.os.Bundle; +import android.util.TypedValue; + +import androidx.annotation.Nullable; + +import com.dskj.rbchat.R; +import com.dskj.rbchat.base.LllChatBaseActivity; +import com.dskj.rbchat.databinding.ActivityContactBinding; + + +//通讯录 +public class ContactActivity extends LllChatBaseActivity { + ActivityContactBinding viewBinding; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + getWindow().setStatusBarColor(getResources().getColor(R.color.color_white)); + getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white)); + super.onCreate(savedInstanceState); + viewBinding = ActivityContactBinding.inflate(getLayoutInflater()); + setContentView(viewBinding.getRoot()); + viewBinding.titlebar.getTitleTextView().setTextSize(TypedValue.COMPLEX_UNIT_SP, 20); + getSupportFragmentManager().beginTransaction() + .replace(R.id.fragment_container, new ContactFragment()) + .commit(); + viewBinding.titlebar.setOnBackIconClickListener(view -> onBackPressed()); + } + + @Override + public int initNavigationBarColor() { + return 0; + } + + @Override + public int initStatusBarColor() { + return 0; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/main/chat/ContactFragment.java b/app/src/main/java/com/dskj/rbchat/main/chat/ContactFragment.java new file mode 100644 index 0000000..59a89d0 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/chat/ContactFragment.java @@ -0,0 +1,988 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.main.chat; + +import static com.netease.yunxin.kit.chatkit.ui.fun.FunChatForwardSelectDialog.TAG; +import static com.netease.yunxin.kit.contactkit.ui.ContactConstant.LIB_TAG; +import static com.netease.yunxin.kit.contactkit.ui.selector.BaseContactSelectorActivity.DEFAULT_MAX_SELECT_COUNT; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.KEY_CONTACT_SELECTOR_MAX_COUNT; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.KEY_REQUEST_SELECTOR_NAME_ENABLE; + +import android.content.Context; +import android.content.Intent; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; +import androidx.recyclerview.widget.LinearLayoutManager; + +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.databinding.FragmentIndex2Binding; +import com.dskj.rbchat.imkit.selector.FunContactSelectorActivity; +import com.dskj.rbchat.imkit.verify.FunVerifyListActivity; +import com.dskj.rbchat.main.MainActivity; +import com.dskj.rbchat.main.index.AiChatActivity; +import com.dskj.rbchat.main.index.adapter.IndexContactAdapter; +import com.dskj.rbchat.main.index.add.AddFriendsActivity; +import com.dskj.rbchat.main.mine.setting.SettingNewActivity; +import com.dskj.rbchat.model.AiChatUpdateEvent; +import com.dskj.rbchat.model.AiMessageBean; +import com.dskj.rbchat.model.ListBeanResult; +import com.dskj.rbchat.model.TeamUpdateEvent; +import com.dskj.rbchat.model.UsersExistBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.AnimUtil; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.FileUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.utils.ShareDateUtils; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.msg.MessageBuilder; +import com.netease.nimlib.sdk.msg.MsgService; +import com.netease.nimlib.sdk.msg.attachment.MsgAttachment; +import com.netease.nimlib.sdk.msg.attachment.NetCallAttachment; +import com.netease.nimlib.sdk.msg.constant.MsgTypeEnum; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.nimlib.sdk.msg.model.IMMessage; +import com.netease.nimlib.sdk.msg.model.QueryDirectionEnum; +import com.netease.nimlib.sdk.msg.model.RecentContact; +import com.netease.nimlib.sdk.team.model.Team; +import com.netease.yunxin.kit.alog.ALog; +import com.netease.yunxin.kit.chatkit.model.ConversationInfo; +import com.netease.yunxin.kit.chatkit.ui.common.ChatDataUtils; +import com.netease.yunxin.kit.chatkit.ui.common.RxBus; +import com.netease.yunxin.kit.common.ui.fragments.BaseFragment; +import com.netease.yunxin.kit.common.ui.utils.AvatarColor; +import com.netease.yunxin.kit.common.ui.viewmodel.FetchResult; +import com.netease.yunxin.kit.common.ui.viewmodel.LoadStatus; +import com.netease.yunxin.kit.common.ui.widgets.ContactAvatarView; +import com.netease.yunxin.kit.contactkit.ui.contact.ContactViewModel; +import com.netease.yunxin.kit.contactkit.ui.fun.search.FunSearchActivity; +import com.netease.yunxin.kit.contactkit.ui.model.BaseContactBean; +import com.netease.yunxin.kit.contactkit.ui.model.ContactFriendBean; +import com.netease.yunxin.kit.contactkit.ui.model.ContactTeamBean; +import com.netease.yunxin.kit.contactkit.ui.model.ContactVerifyInfoBean; +import com.netease.yunxin.kit.contactkit.ui.team.TeamListViewModel; +import com.netease.yunxin.kit.contactkit.ui.utils.ColorUtils; +import com.netease.yunxin.kit.contactkit.ui.verify.VerifyViewModel; +import com.netease.yunxin.kit.conversationkit.ui.ConversationCustom; +import com.netease.yunxin.kit.conversationkit.ui.TimeConversationUtils; +import com.netease.yunxin.kit.conversationkit.ui.common.ConversationConstant; +import com.netease.yunxin.kit.conversationkit.ui.model.ConversationBean; +import com.netease.yunxin.kit.conversationkit.ui.page.viewmodel.ConversationViewModel; +import com.netease.yunxin.kit.corekit.event.EventCenter; +import com.netease.yunxin.kit.corekit.event.EventNotify; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.model.AttachmentContent; +import com.netease.yunxin.kit.corekit.im.model.UserInfo; +import com.netease.yunxin.kit.corekit.im.provider.FetchCallback; +import com.netease.yunxin.kit.corekit.im.utils.RouterConstant; +import com.netease.yunxin.kit.corekit.route.XKitRouter; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import rx.Subscription; +import rx.schedulers.Schedulers; + +//通讯录页面 特别关注,好友,群组列表 +public class ContactFragment extends BaseFragment { + + private FragmentIndex2Binding binding; + + CommonAdapter commonAdapterReadContents; + List usersExistBeans = new ArrayList<>(); + List usersExistBeansShouQi = new ArrayList<>(); + boolean isFollowShouQi = true; + + public Observer>> contactFriendObserver; //联系人变更 + public Observer>> contactGroupObserver; //群组 + public Observer>> conversationObserver; //获取会话 + public Observer>> changeConversationObserver; //会话变更 + private Observer>> verifyObserver; + private com.netease.nimlib.sdk.Observer> teamUpdateObserver; + + //联系人,会话model + public ContactViewModel viewModelFriends; + public TeamListViewModel viewModelGroup; + public ConversationViewModel conversationViewModel; +// protected VerifyViewModel verifyViewModel; + + private IndexContactAdapter teamContactAdapter; + private IndexContactAdapter friendContactAdapter; + private ActivityResultLauncher launcher; + + + protected final EventNotify teamUpdateEvent = + new EventNotify() { + @Override + public void onNotify(@NonNull TeamUpdateEvent teamUpdateEvent) { + //更新头像 + LogUtils.i("te"); + if (teamUpdateEvent.getTeam() != null) { + updateTeamContactData(teamUpdateEvent.getTeam()); + } + + } + + @NonNull + @Override + public String getEventType() { + return TeamUpdateEvent.EVENT_TYPE; + } + }; + protected final EventNotify stringUpdateEvent = + new EventNotify() { + @Override + public void onNotify(@NonNull AiChatUpdateEvent stringupdate) { + //更新头像 + if (!TextUtils.isEmpty(stringupdate.contentvalue)) { + binding.tvIndexfmAicontent.setText(stringupdate.contentvalue); + } else { + binding.tvIndexfmAicontent.setText(getString(R.string.aihint_txt)); + } + + } + + @NonNull + @Override + public String getEventType() { + return AiChatUpdateEvent.EVENT_TYPE; + } + }; +// protected final EventNotify userupdateEvent = +// new EventNotify() { +// @Override +// public void onNotify(@NonNull UserUpdateEvent stringupdate) { +// //更新用户信息 +// LogUtils.i("te"); +// refrshUser(IMKitClient.account()); +// +// } +// +// @NonNull +// @Override +// public String getEventType() { +// return UserUpdateEvent.EVENT_TYPE; +// } +// }; + + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + binding = FragmentIndex2Binding.inflate(inflater); +// verifyViewModel = new ViewModelProvider(this).get(VerifyViewModel.class); + viewModelFriends = new ViewModelProvider(this).get(ContactViewModel.class); + viewModelGroup = new ViewModelProvider(this).get(TeamListViewModel.class); + viewModelGroup.configRoutePath(RouterConstant.PATH_FUN_CHAT_TEAM_PAGE); + conversationViewModel = new ViewModelProvider(this).get(ConversationViewModel.class); + conversationViewModel.setComparator(conversationComparator); //排序 + return binding.getRoot(); + } + + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); +// launcher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { +// if (result.getResultCode() == Activity.RESULT_OK) { +// boolean update = result.getData().getBooleanExtra("update", false); +// if (update) { +// setAichatHistory(); +// } +// } +// }); + initView(); + // refrshUser(IMKitClient.account()); + EventCenter.registerEventNotify(teamUpdateEvent); + EventCenter.registerEventNotify(stringUpdateEvent); +// EventCenter.registerEventNotify(userupdateEvent); + observerData(); + registerObserver(); + } + + private void observerData() { +// conversationViewModel +// .getQueryLiveData() +// .observe( +// this.getViewLifecycleOwner(), +// result -> { +// +// if (result.getLoadStatus() == LoadStatus.Success) { +// if (result.getData() != null) { +// updateConversationListData(result.getData()); +// } +// } else if (result.getLoadStatus() == LoadStatus.Finish) { +// updateConversationListData(result.getData()); +// } +// +// } +// ); + + //会话更新监听 + conversationObserver = + result -> + { + if (result.getLoadStatus() == LoadStatus.Success) { + ALog.d(ConversationConstant.LIB_TAG, TAG, "DeleteLiveData, Success"); + if (result.getData() == null) { + return; + } + updateConversationListData(result.getData()); + } else if (result.getLoadStatus() == LoadStatus.Finish + && result.getType() == FetchResult.FetchType.Remove) { + ALog.d(ConversationConstant.LIB_TAG, TAG, "DeleteLiveData, Success"); + if (result.getData() == null) { + return; + } + updateConversationListData(result.getData()); + } + }; + + changeConversationObserver = + result -> { + if (result.getLoadStatus() == LoadStatus.Success) { + ALog.d(ConversationConstant.LIB_TAG, TAG, "ChangeLiveData, Success"); + //更新 + if (result.getData() == null) { + return; + } + + updateConversationListData(result.getData()); + updateConversation(result.getData()); + + } else if (result.getLoadStatus() == LoadStatus.Finish + && result.getType() == FetchResult.FetchType.Remove) { + //如果会话删除 + ALog.d(ConversationConstant.LIB_TAG, TAG, "ChangeLiveData, delete"); + if (result.getData() == null) { + return; + } + updateConversationListData(result.getData()); + updateConversation(result.getData()); + } + + }; + + + contactFriendObserver = + contactBeansResult -> + { + if (contactBeansResult.getLoadStatus() == LoadStatus.Success) { + ALog.d(LIB_TAG, TAG, "contactObserver, Success"); + if (contactBeansResult.getData() != null) { + // 获取好友列表 + setFriendContactData(contactBeansResult.getData()); + } + + } else if (contactBeansResult.getLoadStatus() == LoadStatus.Finish) { + if (contactBeansResult.getType() == FetchResult.FetchType.Add + && contactBeansResult.getData() != null) { + ALog.d(LIB_TAG, TAG, "contactObserver,Add"); + + // 获取好友列表 + addFriendContactData(contactBeansResult.getData()); + + } else if (contactBeansResult.getType() == FetchResult.FetchType.Remove + && contactBeansResult.getData() != null) { + ALog.d(LIB_TAG, TAG, "contactObserver,Remove"); + removeFriendContactData(contactBeansResult.getData()); + getFollow(); + + } else if (contactBeansResult.getType() == FetchResult.FetchType.Update + && contactBeansResult.getData() != null) { + ALog.d(LIB_TAG, TAG, "contactObserver,Update"); + + updateFriendContactData(contactBeansResult.getData()); + + } + } + + setFriendsNumber(); + + }; + + contactGroupObserver = groupresult -> + { + if (groupresult.getLoadStatus() == LoadStatus.Success) { + LogUtils.i("获取群"); + if (groupresult.getData() != null) { + setTeamContactData(groupresult.getData()); + } + } else if (groupresult.getLoadStatus() == LoadStatus.Finish) { + if (groupresult.getType() == FetchResult.FetchType.Add) { + LogUtils.i("新增群"); + addTeamContactData(groupresult.getData()); + } else if (groupresult.getType() == FetchResult.FetchType.Remove) { + LogUtils.i("移除群"); + removeTeamContactData(groupresult.getData()); + } + } + setTeamGroupNumber(); + }; + + viewModelFriends.fetchContactList(); + viewModelGroup.fetchTeamList(); +// conversationViewModel.fetchConversation(); + getFollow(); + } + + private boolean showAllFriends = false; + private boolean showAllTeam = false; + private Subscription mEventSubscription; + + public void initView() { + mEventSubscription = RxBus.getInstance().toObservable(Integer.class) + .subscribeOn(Schedulers.io()) + .unsubscribeOn(Schedulers.io()) + .subscribe(changeImageViewBean -> {//回顶部 + if (changeImageViewBean == IMUIKitConfig.CHANGE_FOLLOW_USER) { + LogUtils.i("更新一下数据不过分吧"); + getFollow(); + } + }); +// mainActivity = (MainActivity) getActivity(); + binding.ivIndexfmAihead.setData(R.mipmap.ic_logo, ""); + binding.avIndexfraHead.setOnClickListener(v -> startUserInfoActivity(IMKitClient.account())); + setAichatHistory(); + binding.layoutIndexfmAddfriends.setOnClickListener(view -> { + startaddFriends(); + }); + binding.ivIndexfmAddfriendtop.setOnClickListener(view -> { + startaddFriends(); + }); + binding.ivIndexfmNotifytop.setOnClickListener(view -> { + startActivity(new Intent(getActivity(), FunVerifyListActivity.class)); + binding.viewChatfmFrinedspoint.setVisibility(View.GONE); + }); + binding.layoutIndexfmAddgroup.setOnClickListener(view -> { + startCreateGroup(); + } + ); + binding.layoutIndexfmSearch.getRoot().setOnClickListener(view -> startActivity(new Intent(getActivity(), FunSearchActivity.class)) + ); + binding.ivIndexfmSettingtop.setOnClickListener(view -> { + startActivity(new Intent(getActivity(), SettingNewActivity.class)); +// MainActivity activity = (MainActivity) getActivity(); +// activity.toSetting(); + }); + + binding.layoutIndexfmSearch.ivCommonsearchScan.setOnClickListener(v -> { + MainActivity activity = (MainActivity) getActivity(); + activity.toScan(); + }); + + binding.saoyisaoTv.setOnClickListener(v -> { + MainActivity activity = (MainActivity) getActivity(); + activity.toScan(); + }); + + binding.zhuanzhangTv.setOnClickListener(v -> { + MainActivity activity = (MainActivity) getActivity(); + activity.toTlt(); + }); + + binding.wawajiLy.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + MainActivity activity = (MainActivity) getActivity(); + activity.toTlt(); + } + }); + + binding.fukuanTv.setOnClickListener(v -> { + MainActivity activity = (MainActivity) getActivity(); + activity.toSShop(false); + }); + +// binding.fukuanTv.setOnLongClickListener(new View.OnLongClickListener() { +// @Override +// public boolean onLongClick(View v) { +// MainActivity activity = (MainActivity) getActivity(); +// activity.toSShop(true); +// return false; +// } +// }); + binding.shoukuanTv.setOnClickListener(v -> { + MainActivity activity = (MainActivity) getActivity(); + activity.toQrcode(); + }); + + binding.tvIndexfmFriendspull.setOnClickListener(view -> { + + showAllFriends = !showAllFriends; + if (showAllFriends) { + Drawable drawable = getResources().getDrawable(R.mipmap.ic_indexfm_up); + drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); + binding.tvIndexfmFriendspull.setCompoundDrawables(null, null, drawable, null); + } else { + Drawable drawable = getResources().getDrawable(R.mipmap.ic_indexfm_down); + drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); + binding.tvIndexfmFriendspull.setCompoundDrawables(null, null, drawable, null); + } + friendContactAdapter.setShowAll(showAllFriends); + friendContactAdapter.notifyDataSetChanged(); + + }); + binding.tvIndexfmGrouppull.setOnClickListener(view -> { + showAllTeam = !showAllTeam; + if (showAllTeam) { + Drawable drawable = getResources().getDrawable(R.mipmap.ic_indexfm_up); + drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); + binding.tvIndexfmGrouppull.setCompoundDrawables(null, null, drawable, null); + } else { + Drawable drawable = getResources().getDrawable(R.mipmap.ic_indexfm_down); + drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); + binding.tvIndexfmGrouppull.setCompoundDrawables(null, null, drawable, null); + } + teamContactAdapter.setShowAll(showAllTeam); + teamContactAdapter.notifyDataSetChanged(); + + }); + + binding.layoutIndexfmAichat.setOnClickListener(view -> { + //launcher +// launcher.launch(new Intent(getActivity(), AiChatActivity.class)); + startActivity(new Intent(getActivity(), AiChatActivity.class)); + }); + + binding.tvIndexfmTbgzpull.setOnClickListener(v -> { + if (isFollowShouQi) { + commonAdapterReadContents.setDates(usersExistBeans); + Drawable drawable = getResources().getDrawable(R.mipmap.ic_indexfm_up); + drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); + binding.tvIndexfmTbgzpull.setCompoundDrawables(null, null, drawable, null); + } else { + commonAdapterReadContents.setDates(usersExistBeansShouQi); + Drawable drawable = getResources().getDrawable(R.mipmap.ic_indexfm_down); + drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); + binding.tvIndexfmTbgzpull.setCompoundDrawables(null, null, drawable, null); + } + isFollowShouQi = !isFollowShouQi; + + }); + + binding.contactfriends.setLayoutManager(new LinearLayoutManager(getActivity())); + binding.contactgroups.setLayoutManager(new LinearLayoutManager(getActivity())); + friendContactAdapter = new IndexContactAdapter(getActivity()); + teamContactAdapter = new IndexContactAdapter(getActivity()); + friendContactAdapter.setShowAll(showAllFriends); + teamContactAdapter.setShowAll(showAllTeam); + binding.contactfriends.setAdapter(friendContactAdapter); + binding.contactgroups.setAdapter(teamContactAdapter); + + usersExistBeans = ShareDateUtils.getFollowUsers(); + if (usersExistBeans == null) { + usersExistBeans = new ArrayList<>(); + usersExistBeansShouQi = new ArrayList<>(); + binding.tebieguanzhuLy.setVisibility(View.GONE); + } else { + if (usersExistBeans.size() > 3) { + usersExistBeansShouQi = usersExistBeans.subList(0, 3); + } else { + usersExistBeansShouQi = usersExistBeans; + } + binding.tebieguanzhuLy.setVisibility(View.VISIBLE); + } + initAdapterRed(); + + AnimUtil.setAnimViews(1.1f, binding.wawajiLy, binding.saoyisaoTv, binding.zhuanzhangTv, binding.fukuanTv, binding.shoukuanTv); + } + + public void setAichatHistory() { + String value = FileUtils.getChatData(getActivity()); + if (!TextUtils.isEmpty(value)) { + List aiMessageBean = GsonUtils.getListFromJSON(value, AiMessageBean.class); + LogUtils.i("aimessagebean-" + aiMessageBean.size()); + value = aiMessageBean.size() == 0 ? getString(R.string.aihint_txt) : aiMessageBean.get(aiMessageBean.size() - 1).getMessage(); + binding.tvIndexfmAicontent.setText(value); + } + } + + private void initAdapterRed() { + binding.contacttbgz.setLayoutManager(new LinearLayoutManager(getActivity())); + commonAdapterReadContents = new CommonAdapter<>(getActivity(), R.layout.follow_child_item1, usersExistBeansShouQi) { + @Override + public void convert(ViewHolder holder, UsersExistBean s, int index) { + LogUtils.i("执行了:" + GsonUtils.beanToJSONString(s)); + ContactAvatarView contactAvatarView = holder.getView(R.id.logo_iv); + ColorUtils.loadAvator(s.getAvatar(), contactAvatarView); +// contactAvatarView.setData( +// s.getAvatar(), s.getNickname(), AvatarColor.avatarColor(s.getUserId() + "")); +// holder.setText(R.id.item_title_tv, s.getNickname()); + TextView tvNick = holder.getView(R.id.item_title_tv); + TextView tvAlias = holder.getView(R.id.item_title_alias); + tvAlias.setVisibility(View.GONE); + tvNick.setText(s.getNickname()); + tvNick.setMaxWidth(DataUtils.dip2px(getActivity(), 180)); + if (!TextUtils.isEmpty(s.getRemark())) { + tvAlias.setVisibility(View.VISIBLE); + tvAlias.setText("(" + s.getRemark() + ")"); + tvNick.setMaxWidth(DataUtils.dip2px(getActivity(), 80)); + } +// RecentContact recentContact = NIMClient.getService(MsgService.class).queryRecentContact(s.getUserId() + "", SessionTypeEnum.P2P); //如果会话隐藏 就获取不到记录了 + IMMessage msg = MessageBuilder.createEmptyMessage(s.getUserId() + "", SessionTypeEnum.P2P, System.currentTimeMillis()); + IMMessage recentContact = getMessage(msg); + holder.getView(R.id.item_time_tv).setVisibility(View.GONE); + TextView tvMsg = holder.getView(R.id.item_msg_tv); + holder.setText(R.id.item_msg_tv, getString(R.string.nmhmylg_txt)); + if (recentContact != null) { +// if (recentContact.getUnreadCount() > 0) { +// int count = recentContact.getUnreadCount(); +// String content; +// if (count >= 100) { +// content = "99+"; +// } else { +// content = String.valueOf(count); +// } +// holder.setText(R.id.unreadTv, content); +// holder.getView(R.id.unreadTv).setVisibility(View.VISIBLE); +// } else { +// holder.getView(R.id.unreadTv).setVisibility(View.GONE); +// } + + holder.getView(R.id.item_time_tv).setVisibility(View.VISIBLE); + holder.setText(R.id.item_time_tv, TimeConversationUtils.formatMillisecond(getActivity(), recentContact.getTime())); + String content = customContentText(getActivity(), recentContact); + if (!TextUtils.isEmpty(content)) { + ConversationCustom.identifyExpression(getActivity(), tvMsg, content); + } else { + tvMsg.setText(getString(R.string.nmhmylg_txt)); + } + + // if (recentContact.getContent().equals("[自定义消息]")) { +// String bean = GsonUtils.beanToJSONString(recentContact.getAttachment()); +// try { +// JSONObject jsonObject = new JSONObject(bean); +// switch ((int) jsonObject.get("type")) { +// case 1002: +// holder.setText(R.id.item_msg_tv, getString(R.string.voom_message_txt)); +// break; +// case 1003: +// holder.setText(R.id.item_msg_tv, getString(com.netease.yunxin.kit.chatkit.ui.R.string.gerenminp_txt)); +// break; +// +// case 1004: +// holder.setText(R.id.item_msg_tv, getString(com.netease.yunxin.kit.contactkit.ui.R.string.zhuanzhang_chat_txt)); +// break; +// case 1005: +// case 1006: +// holder.setText(R.id.item_msg_tv, getString(com.netease.yunxin.kit.contactkit.ui.R.string.hongbao_chat_txt)); +// break; +// +// } +// } catch (JSONException e) { +// throw new RuntimeException(e); +// } +// +// } + } else { + holder.getView(R.id.unreadTv).setVisibility(View.GONE); + } + holder.getView(R.id.big_ly).setOnClickListener(v -> +// XKitRouter.withKey(RouterConstant.PATH_FUN_CHAT_P2P_PAGE) +// .withParam(RouterConstant.CHAT_ID_KRY, s.getUserId() + "") +// .withContext(requireActivity()) +// .navigate()); + XKitRouter.withKey(RouterConstant.PATH_FUN_USER_INFO_PAGE) + .withContext(requireActivity()) + .withParam( + "uid", + s.getUserId() + "") + .withParam("userId", s.getUserId() + "") + .withParam("isGroup", false) + .navigate()); + + } + + }; + + + binding.contacttbgz.setAdapter(commonAdapterReadContents); + + } + + public String customContentText(Context context, IMMessage message) { + if (context != null) { + MsgTypeEnum typeEnum = message.getMsgType(); + switch (typeEnum) { + case notification: + return context.getString(com.netease.yunxin.kit.conversationkit.ui.R.string.msg_type_notification); + case text: + return message.getContent(); + case audio: + return context.getString(com.netease.yunxin.kit.conversationkit.ui.R.string.msg_type_audio); + case video: + return context.getString(com.netease.yunxin.kit.conversationkit.ui.R.string.msg_type_video); + case tip: + return context.getString(com.netease.yunxin.kit.conversationkit.ui.R.string.msg_type_tip); + case image: + return context.getString(com.netease.yunxin.kit.conversationkit.ui.R.string.msg_type_image); + case file: + return context.getString(com.netease.yunxin.kit.conversationkit.ui.R.string.msg_type_file); + case location: + return context.getString(com.netease.yunxin.kit.conversationkit.ui.R.string.msg_type_location); + case nrtc_netcall: + NetCallAttachment attachment = (NetCallAttachment) message.getAttachment(); + int type = attachment.getType(); + if (type == 1) { + return context.getString(com.netease.yunxin.kit.conversationkit.ui.R.string.msg_type_rtc_audio); + } else { + return context.getString(com.netease.yunxin.kit.conversationkit.ui.R.string.msg_type_rtc_video); + } + case custom: + String result = message.getContent(); + if (message.getAttachment() instanceof AttachmentContent) { + result = ((AttachmentContent) message.getAttachment()).getContent(); + } + return TextUtils.isEmpty(result) ? context.getString(com.netease.yunxin.kit.conversationkit.ui.R.string.msg_type_custom) : result; + default: + return context.getString(com.netease.yunxin.kit.conversationkit.ui.R.string.msg_type_no_tips); + } + } + return ""; + } + + + //初始化设置好友数据 + public void setFriendContactData(List list) { + friendContactAdapter.setData(addContactFriendParam(list), 0); + } + + //初始化设置群友数据 + public void setTeamContactData(List list) { + teamContactAdapter.setData(addContactTeamParam(list), 1); + } + + public List addContactFriendParam(List list) { + List contactFriendBeans = new ArrayList<>(); + for (ContactFriendBean contactFriendBean : list) { + contactFriendBean.setTime(0); + String account = contactFriendBean.data.getAccount(); + IMMessage msg = MessageBuilder.createEmptyMessage(account, SessionTypeEnum.P2P, System.currentTimeMillis()); + getMessageData(msg, contactFriendBean); + contactFriendBeans.add(contactFriendBean); + } + return contactFriendBeans; + } + + public List addContactTeamParam(List list) { + List contactTeamBeans = new ArrayList<>(); + for (ContactTeamBean contactTeamBean : list) { + contactTeamBean.setConversationTime(0); + String account = contactTeamBean.data.getId(); + IMMessage msg = MessageBuilder.createEmptyMessage(account, SessionTypeEnum.Team, System.currentTimeMillis()); + getMessageData(msg, contactTeamBean); + contactTeamBeans.add(contactTeamBean); + } + return contactTeamBeans; + } + + public IMMessage getMessage(IMMessage message) { + List listmessage = NIMClient.getService(MsgService.class).queryMessageListExBlock(message, QueryDirectionEnum.QUERY_OLD, 1, false); + if (listmessage != null && listmessage.size() > 0) { + return listmessage.get(0); + } + return null; + } + + public void getMessageData(IMMessage msg, BaseContactBean contactBean) { + IMMessage currentMessage = getMessage(msg); + if (currentMessage != null) { //有消息 + long time = currentMessage.getTime(); + if (contactBean instanceof ContactFriendBean) { + ((ContactFriendBean) contactBean).setMsgTypeEnum(currentMessage.getMsgType()); + ((ContactFriendBean) contactBean).setMsgAttachment(currentMessage.getAttachment()); + ((ContactFriendBean) contactBean).setTime(currentMessage.getTime()); + ((ContactFriendBean) contactBean).setConversationText(currentMessage.getContent()); + } + if (contactBean instanceof ContactTeamBean) { + ((ContactTeamBean) contactBean).setConversationTime(time); + ((ContactTeamBean) contactBean).setConversationTime(currentMessage.getTime()); + ((ContactTeamBean) contactBean).setContent(currentMessage.getContent()); + ((ContactTeamBean) contactBean).setMsgAttachment(currentMessage.getAttachment()); + ((ContactTeamBean) contactBean).setMsgTypeEnum(currentMessage.getMsgType()); + ((ContactTeamBean) contactBean).setFromAccount(currentMessage.getFromAccount()); + ((ContactTeamBean) contactBean).setFromNick(currentMessage.getFromNick()); + } + } + } + + public void addFriendContactData(List list) { + friendContactAdapter.addFriendDataList(addContactFriendParam(list)); + } + + public void removeFriendContactData(List list) { + friendContactAdapter.removeDataList(list); + } + + public void updateFriendContactData(List list) { + friendContactAdapter.updateFriendDataList(list); + } + + public void setFriendsNumber() { + if (binding != null) { + int size = friendContactAdapter.getData().size(); + if (size > 0) { + binding.tvIndexfmFriendstitle.setText(getString(R.string.haoyou_txt) + " " + size); + binding.layoutIndexfmAddfriends.setVisibility(View.GONE); + } else { + binding.layoutIndexfmAddfriends.setVisibility(View.VISIBLE); + } + binding.tvIndexfmFriendspull.setVisibility(size > 3 ? View.VISIBLE : View.GONE); + } + + } + + + public void addTeamContactData(List list) { + teamContactAdapter.addTeamDataList(addContactTeamParam(list)); + } + + public void removeTeamContactData(List list) { + teamContactAdapter.removeDataList(list); + } + + public void updateTeamContactData(Team team) { + List teamBeans = teamContactAdapter.getData(); + for (int i = 0; i < teamBeans.size(); i++) { + ContactTeamBean teamBean = (ContactTeamBean) teamBeans.get(i); + if (teamBean.data.getId().equals(team.getId())) { + teamBean.data = team; + teamContactAdapter.updateTeamDataIconItem(teamBean, i); + + } + } + + } + + public void setTeamGroupNumber() { + int size = teamContactAdapter.getData().size(); + if (binding != null) { + if (size > 0) { + binding.tvIndexfmGrouptitle.setText(getString(R.string.group_text) + " " + size); + binding.layoutIndexfmAddgroup.setVisibility(View.GONE); + } else { + binding.layoutIndexfmAddgroup.setVisibility(View.VISIBLE); + } + binding.tvIndexfmGrouppull.setVisibility(size > 3 ? View.VISIBLE : View.GONE); + } + } + + //更新会话数据 + public void updateConversationListData(List list) { + for (ConversationBean conversationBean : list) { + if (conversationBean.infoData.getFriendInfo() != null) { + friendContactAdapter.updateFriendDataContentItem(conversationBean.infoData); + } + if (conversationBean.infoData.getTeamInfo() != null) { + teamContactAdapter.updateTeamDataContentItem(conversationBean.infoData); + } + } + } + + List listFollow = new ArrayList<>(); + + //更新特别关注的会话记录 + public void updateConversation(List list) { + for (ConversationBean bean : list) { + if (bean.infoData.getFriendInfo() != null) { + listFollow.clear(); + if (isFollowShouQi) { + listFollow.addAll(usersExistBeans); + } else { + listFollow.addAll(usersExistBeansShouQi); + } + for (UsersExistBean existBean : listFollow) { + if (String.valueOf(existBean.getUserId()).equals(bean.infoData.getFriendInfo().getAccount())) { + int index = listFollow.indexOf(existBean); + if (index >= 0) { + commonAdapterReadContents.notifyItemChanged(index); + break; + } + } + } + } + + } + + } + + + public void startUserInfoActivity(String userid) { + XKitRouter.withKey(RouterConstant.PATH_USER_INFO_PAGE) + .withContext(getActivity()) + .withParam(RouterConstant.KEY_ACCOUNT_ID_KEY, IMKitClient.account()) + .withParam("userId", userid) + .navigate(); + } + + public void startCreateGroup() { + startActivity(new Intent(getActivity(), FunContactSelectorActivity.class).putExtra(KEY_CONTACT_SELECTOR_MAX_COUNT, DEFAULT_MAX_SELECT_COUNT).putExtra(KEY_REQUEST_SELECTOR_NAME_ENABLE, true)); + } + + public void startaddFriends() { + startActivity(new Intent(getActivity(), AddFriendsActivity.class)); + } + + + private Comparator conversationComparator = + (bean1, bean2) -> { + int result; + if (bean1 == null) { + result = 1; + } else if (bean2 == null) { + result = -1; + } else if (bean1.isStickTop() == bean2.isStickTop()) { + long time = bean1.getTime() - bean2.getTime(); + result = time == 0L ? 0 : (time > 0 ? -1 : 1); + + } else { + result = bean1.isStickTop() ? -1 : 1; + } + ALog.d(ConversationConstant.LIB_TAG, TAG, "conversationComparator, result:" + result); + return result; + }; + + +// public void refrshUser(String account) { +// CommonRepo.getUserInfo( +// account, +// new FetchCallback() { +// @Override +// public void onSuccess(@Nullable UserInfo param) { +// if (param != null) { +// updateUI(param); +// } +// } +// +// @Override +// public void onFailed(int code) { +// ToastX.showShortToast(R.string.user_fail); +// updateUI(new UserInfo(account, account, "")); +// } +// +// @Override +// public void onException(@Nullable Throwable exception) { +// ToastX.showShortToast(R.string.user_fail); +// updateUI(new UserInfo(account, account, "")); +// } +// }); +// } + + private void updateUI(UserInfo userInfo) { + String name = + TextUtils.isEmpty(userInfo.getName()) ? userInfo.getAccount() : userInfo.getName(); + String avaterurl = userInfo.getAvatar(); + if (TextUtils.isEmpty(avaterurl)) { + binding.avIndexfraHead.setData( + R.mipmap.default_head_img, name, AvatarColor.avatarColor(IMKitClient.account())); + } else { + binding.avIndexfraHead.setData( + userInfo.getAvatar(), name, AvatarColor.avatarColor(IMKitClient.account())); + } + +// binding.tvIndexfraNick.setText(name); +// binding.tvIndexfraId.setText("CHEATID:" + IMKitClient.account()); + } + +// @Override +// public void onResume() { +// super.onResume(); +// ALog.d(Constant.PROJECT_TAG, "MineFragment:onResume"); +// refrshUser(IMKitClient.account()); +// } + + private void getFollow() { + Api.getInstance().followList() + .subscribeOn(io.reactivex.schedulers.Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result> feedbackResp) { + LogUtils.i("获取到的列表111111:" + GsonUtils.beanToJSONString(feedbackResp)); + if (feedbackResp.data != null && feedbackResp.data.getList() != null && feedbackResp.data.getList().size() > 0) { + usersExistBeans = feedbackResp.data.getList(); + DataUtils.set(getActivity(), IMUIKitConfig.FOLLOW_USER_TAG + "_" + IMKitClient.account(), GsonUtils.beanToJSONString(usersExistBeans)); + ChatDataUtils.set(getActivity(), "follow_user" + "_" + IMKitClient.account(), GsonUtils.beanToJSONString(usersExistBeans)); + + if (usersExistBeans.size() > 3) { + usersExistBeansShouQi = usersExistBeans.subList(0, 3); + } else { + usersExistBeansShouQi = usersExistBeans; + } + if (isFollowShouQi) { + commonAdapterReadContents.setDates(usersExistBeansShouQi); + } else { + commonAdapterReadContents.setDates(usersExistBeans); + } + binding.tvIndexfmTbgzpull.setVisibility(usersExistBeans.size() > 3 ? View.VISIBLE : View.GONE); + binding.tebieguanzhuLy.setVisibility(View.VISIBLE); + binding.tvIndexfmTbgztitle.setText(getActivity().getResources().getString(R.string.tebiezhuanzhu_txt) + " " + usersExistBeans.size()); + + } else { + binding.tebieguanzhuLy.setVisibility(View.GONE); + } + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + binding.tebieguanzhuLy.setVisibility(View.GONE); + + } + }); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + unregisterObserver(); + if (mEventSubscription != null) { + mEventSubscription.unsubscribe(); + } + EventCenter.unregisterEventNotify(teamUpdateEvent); + EventCenter.unregisterEventNotify(stringUpdateEvent); +// EventCenter.unregisterEventNotify(userupdateEvent); + } + + private void registerObserver() { + viewModelFriends.getContactLiveData().observeForever(contactFriendObserver); + viewModelGroup.getFetchResult().observeForever(contactGroupObserver); +// conversationViewModel.getQueryLiveData().observeForever(conversationObserver); + conversationViewModel.getChangeLiveData().observeForever(changeConversationObserver); + //verifyViewModel.getFetchResult().observeForever(verifyObserver); + } + + public void unregisterObserver() { + viewModelFriends.getContactLiveData().removeObserver(contactFriendObserver); + viewModelGroup.getFetchResult().removeObserver(contactGroupObserver); +// conversationViewModel.getQueryLiveData().removeObserver(conversationObserver); + conversationViewModel.getChangeLiveData().observeForever(changeConversationObserver); +// verifyViewModel.getFetchResult().observeForever(verifyObserver); + + } +} diff --git a/app/src/main/java/com/dskj/rbchat/main/chat/EditChatRecordlistActivity.java b/app/src/main/java/com/dskj/rbchat/main/chat/EditChatRecordlistActivity.java new file mode 100644 index 0000000..c1fe80a --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/chat/EditChatRecordlistActivity.java @@ -0,0 +1,292 @@ +package com.dskj.rbchat.main.chat; + +import static com.netease.yunxin.kit.conversationkit.ui.common.ConversationConstant.LIB_TAG; + +import android.graphics.Typeface; +import android.os.Bundle; +import android.text.TextUtils; +import android.util.TypedValue; +import android.view.View; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.annotation.Nullable; +import androidx.fragment.app.FragmentManager; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; + +import com.dskj.rbchat.R; +import com.dskj.rbchat.base.LllChatBaseActivity; +import com.dskj.rbchat.databinding.ActivityEditChatrecordBinding; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.event.ConversationEditEvent; +import com.dskj.rbchat.login.PhoneLoginActivity; +import com.dskj.rbchat.utils.LogUtils; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.msg.MsgService; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.nimlib.sdk.msg.model.IMMessage; +import com.netease.yunxin.kit.alog.ALog; +import com.netease.yunxin.kit.chatkit.model.ConversationInfo; +import com.netease.yunxin.kit.chatkit.ui.data.ChatDatabase; +import com.netease.yunxin.kit.chatkit.ui.page.viewmodel.ChatBaseViewModel; +import com.netease.yunxin.kit.common.ui.viewholder.BaseBean; +import com.netease.yunxin.kit.common.ui.viewholder.ViewHolderClickListener; +import com.netease.yunxin.kit.common.ui.viewmodel.FetchResult; +import com.netease.yunxin.kit.common.ui.viewmodel.LoadStatus; +import com.netease.yunxin.kit.conversationkit.ui.common.ConversationHelper; +import com.netease.yunxin.kit.conversationkit.ui.fun.FunViewHolderFactory; +import com.netease.yunxin.kit.conversationkit.ui.fun.page.FunConversationFragment; +import com.netease.yunxin.kit.conversationkit.ui.interfaces.IConverationSelectorListener; +import com.netease.yunxin.kit.conversationkit.ui.model.ConversationBean; +import com.netease.yunxin.kit.conversationkit.ui.page.viewmodel.ConversationViewModel; +import com.netease.yunxin.kit.conversationkit.ui.view.ConversationView; +import com.netease.yunxin.kit.corekit.event.EventCenter; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +//编辑聊天记录 +public class EditChatRecordlistActivity extends LllChatBaseActivity { + + private ActivityEditChatrecordBinding binding; + private List conversationSelectorBean = new ArrayList<>(); + // private FunConversationFragment fragment; + private ConversationView conversationView; + public ConversationViewModel conversationViewModel; + public FunViewHolderFactory conversationFactory; + private Observer>> changeObserver; + public int paramType; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = ActivityEditChatrecordBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + initView(); + initObserver(); + initData(); + registerObserver(); + } + + @Override + public int initNavigationBarColor() { + return getColor(R.color.color_fcfcfc); + } + + @Override + public int initStatusBarColor() { + return 0; + } + + private Comparator conversationComparator = + (bean1, bean2) -> { + int result; + if (bean1 == null) { + result = 1; + } else if (bean2 == null) { + result = -1; + } else if (bean1.isStickTop() == bean2.isStickTop()) { + long time = bean1.getTime() - bean2.getTime(); + result = time == 0L ? 0 : (time > 0 ? -1 : 1); + + } else { + result = bean1.isStickTop() ? -1 : 1; + } + return result; + }; + + private void initData() { + conversationViewModel = new ViewModelProvider(this).get(ConversationViewModel.class); + conversationViewModel.setComparator(conversationComparator); + conversationViewModel.setConversationFactory(conversationFactory); + conversationViewModel + .getQueryLiveData() + .observe( + this, + result -> { + if (result.getLoadStatus() == LoadStatus.Success) { + conversationView.setData(result.getData()); + } else if (result.getLoadStatus() == LoadStatus.Finish) { + conversationView.addData(result.getData()); + } + + if (conversationView.getDataSize() > 0) { + binding.emptyLayout.setVisibility(View.GONE); + } else { + binding.emptyLayout.setVisibility(View.VISIBLE); + } + + }); + conversationViewModel.fetchConversation(); + + } + + private void initView() { + binding.titleBarView.getBackImageView().setImageResource(R.mipmap.ic_dskj_back); + binding.titleBarView.getTitleTextView().setTextSize(TypedValue.COMPLEX_UNIT_SP, 20); +// binding.titleBarView.getTitleTextView().setTypeface(Typeface.defaultFromStyle(Typeface.BOLD)); + binding.titleBarView.getRightTextView().setTextColor(getResources().getColor(R.color.color_themeblue)); + binding.titleBarView.getRightTextView().setTextSize(TypedValue.COMPLEX_UNIT_SP, 16); + conversationView = binding.conversationEdit; + conversationView.setComparator(conversationComparator); +// conversationView.setLoadMoreListener(this); + conversationFactory = new FunViewHolderFactory(); + conversationFactory.isSelector = true; + conversationFactory.setOnSelectorClickListener(new IConverationSelectorListener() { + @Override + public void onSelectorClick(View view, ConversationBean data, int position) { + if (data.isSelector) { + conversationSelectorBean.add(data); + } else { + conversationSelectorBean.remove(data); + } + conversationView.updateSelector(data); + if (conversationSelectorBean.size() > 0) { + binding.tvEditrecordHide.setText(getString(R.string.hide_text) + " (" + conversationSelectorBean.size() + ")"); + binding.tvEditrecordDelete.setText(getString(R.string.delete_text) + " (" + conversationSelectorBean.size() + ")"); + } else { + binding.tvEditrecordHide.setText(getString(R.string.hide_text)); + binding.tvEditrecordDelete.setText(getString(R.string.delete_text)); + } + + } + }); + conversationView.setItemClickListener(new ViewHolderClickListener() { + @Override + public boolean onClick(View view, BaseBean data, int position) { + return false; + } + + @Override + public boolean onLongClick(View view, BaseBean data, int position) { + return false; + } + }); + conversationView.setViewHolderFactory(conversationFactory); + +// FragmentManager fragmentManager = getSupportFragmentManager(); +// fragment = FunConversationFragment.getInstance(true); +// fragmentManager +// .beginTransaction() +// .add(R.id.layout_editrecord, fragment) +// .commitAllowingStateLoss(); +// fragment.setOnItemSelectorListener(new IConverationSelectorListener() { +// @Override +// public void onSelectorClick(View view, ConversationBean data, int position) { +// if (data.isSelector) { +// conversationSelectorBean.add(data); +// } else { +// conversationSelectorBean.remove(data); +// } +// fragment.getConversationView().update(data); +// binding.tvEditrecordHide.setText(getString(R.string.hide_text, String.valueOf(conversationSelectorBean.size()))); +// binding.tvEditrecordDelete.setText(getString(R.string.delete_text, String.valueOf(conversationSelectorBean.size()))); +// } +// }); + binding.titleBarView.setOnBackIconClickListener(view -> onBackPressed()); + binding.tvEditrecordHide.setText(getString(R.string.hide_text)); + binding.tvEditrecordDelete.setText(getString(R.string.delete_text)); + binding.titleBarView.getRightTextView().setOnClickListener(view -> { + showActionConfirmDialog(0, getString(R.string.delete_unread_txt)); + }); + + binding.tvEditrecordHide.setOnClickListener(view -> { + if (conversationSelectorBean.size() > 0) { + showActionConfirmDialog(1, getString(R.string.hide_msg_txt)); + } + }); + + binding.tvEditrecordDelete.setOnClickListener(view -> { + if (conversationSelectorBean.size() > 0) { + showActionConfirmDialog(2, getString(R.string.delete_msg_txt)); + } + + }); + } + + private void initObserver() { + changeObserver = + result -> { + if (conversationView != null) { + if (result.getLoadStatus() == LoadStatus.Success) { + ALog.d(LIB_TAG, "TAG", "ChangeLiveData, Success"); + for (ConversationBean bean : result.getData()) { + if (TextUtils.isEmpty(bean.infoData.getContent())) { + result.getData().remove(bean); + } + } + if (result.getData().size() > 0) { + conversationView.update(result.getData()); + } + + } else if (result.getLoadStatus() == LoadStatus.Finish + && result.getType() == FetchResult.FetchType.Remove) { + ALog.d(LIB_TAG, "TAG", "DeleteLiveData, Success"); + if (result.getData() == null || result.getData().size() < 1) { + conversationView.removeAll(); + } else { + conversationView.remove(result.getData()); + } + ConversationEditEvent editEvent = new ConversationEditEvent(); + editEvent.setList(conversationSelectorBean); + editEvent.setParamType(paramType); + EventCenter.notifyEvent(editEvent); + conversationSelectorBean.clear(); + binding.tvEditrecordHide.setText(getString(R.string.hide_text)); + binding.tvEditrecordDelete.setText(getString(R.string.delete_text)); + + } + if (conversationView.getDataSize() > 0) { + binding.emptyLayout.setVisibility(View.GONE); + } else { + binding.emptyLayout.setVisibility(View.VISIBLE); + } + } + }; + } + + public void showActionConfirmDialog(int type, String title) { + ActionConfirmDialog actionConfirmDialog = new ActionConfirmDialog(EditChatRecordlistActivity.this, title, true); + actionConfirmDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + if (type == 0) { + conversationViewModel.cleanUnreadCount(); + } + if (type == 1) { + conversationViewModel.deleteMoreConversation(1, conversationSelectorBean); // 不删记录,只删除会话 + } + if (type == 2) { + for (ConversationBean bean : conversationSelectorBean) { + ChatDatabase.getInstance().getChatDraftDataDao().deleteFromId(bean.infoData.getContactId()); + } + conversationViewModel.deleteMoreConversation(2, conversationSelectorBean); //删除本地记录 会话框 + } + paramType = type; + + } + + @Override + public void toCancel() { + actionConfirmDialog.dismiss(); + } + }); + actionConfirmDialog.show(); + } + + private void registerObserver() { + conversationViewModel.getChangeLiveData().observeForever(changeObserver); + } + + private void unregisterObserver() { + conversationViewModel.getChangeLiveData().removeObserver(changeObserver); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + unregisterObserver(); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/main/chat/FollowListFragment.java b/app/src/main/java/com/dskj/rbchat/main/chat/FollowListFragment.java new file mode 100644 index 0000000..07515a4 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/chat/FollowListFragment.java @@ -0,0 +1,294 @@ +package com.dskj.rbchat.main.chat; + +import android.os.Bundle; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.LinearLayoutManager; + +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.databinding.FragmentFollowlistBinding; +import com.dskj.rbchat.model.ListBeanResult; +import com.dskj.rbchat.model.UsersExistBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.msg.MsgService; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.nimlib.sdk.msg.model.RecentContact; +import com.netease.yunxin.kit.chatkit.ui.common.ChatDataUtils; +import com.netease.yunxin.kit.chatkit.ui.common.RxBus; +import com.netease.yunxin.kit.chatkit.ui.data.ChatDatabase; +import com.netease.yunxin.kit.chatkit.ui.data.dao.ChatDraftDataDao; +import com.netease.yunxin.kit.chatkit.ui.data.entity.ChatDraftData; +import com.netease.yunxin.kit.chatkit.ui.model.ChangeChatDraftEvent; +import com.netease.yunxin.kit.common.ui.fragments.BaseFragment; +import com.netease.yunxin.kit.common.ui.utils.AvatarColor; +import com.netease.yunxin.kit.common.ui.widgets.ContactAvatarView; +import com.netease.yunxin.kit.contactkit.ui.utils.ColorUtils; +import com.netease.yunxin.kit.conversationkit.ui.ConversationCustom; +import com.netease.yunxin.kit.conversationkit.ui.TimeConversationUtils; +import com.netease.yunxin.kit.conversationkit.ui.model.ConversationBean; +import com.netease.yunxin.kit.corekit.event.EventCenter; +import com.netease.yunxin.kit.corekit.event.EventNotify; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.utils.RouterConstant; +import com.netease.yunxin.kit.corekit.route.XKitRouter; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.List; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +public class FollowListFragment extends BaseFragment { + + FragmentFollowlistBinding chatgroupBinding; + + CommonAdapter commonAdapterReadContents; + List usersExistBeans = new ArrayList<>(); + + //草稿更新 + protected final EventNotify changeDraftEvent = + new EventNotify() { + @Override + public void onNotify(@NonNull ChangeChatDraftEvent chatDraftEvent) { + updatItem(chatDraftEvent.msessionID); + } + + @NonNull + @Override + public String getEventType() { + return ChangeChatDraftEvent.EVENT_TYPE; + } + }; + + private void updatItem(String msessionID) { + for (int i = 0; i < usersExistBeans.size(); i++) { + if (String.valueOf(usersExistBeans.get(i).getUserId()).equals(msessionID)) { + commonAdapterReadContents.notifyItemChanged(i); + } + } + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + chatgroupBinding = FragmentFollowlistBinding.inflate(inflater); + initView(); + initRefreshLayout(); + return chatgroupBinding.getRoot(); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + initData(); + EventCenter.registerEventNotify(changeDraftEvent); + } + + public void initView() { + initAdapterRed(); + RxBus.getInstance().toObservable(Integer.class) + .subscribeOn(Schedulers.io()) + .unsubscribeOn(Schedulers.io()) + .subscribe(changeImageViewBean -> {//回顶部 + if (changeImageViewBean == IMUIKitConfig.CHANGE_FOLLOW_USER) { + LogUtils.i("更新一下数据不过分吧"); + initData(); + } + }); + } + + public void initData() { + + Api.getInstance().followList() + .subscribeOn(io.reactivex.schedulers.Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result> feedbackResp) { + //{"data":{"prePage":0,"nextPage":0,"pages":1,"total":1,"hasPreviousPage":false,"hasNextPage":false, + // "list":[{"userId":400496,"nickname":"嘿喂狗", + // "avatar":"https://letschat.oss-cn-hongkong.aliyuncs.com/media/userAvatarFileName/20231030172748.png"}]},"code":1} + if (feedbackResp.data != null && feedbackResp.data.getList() != null && feedbackResp.data.getList().size() > 0) { + chatgroupBinding.emptyLayout.setVisibility(View.GONE); + chatgroupBinding.refreshLayout.setVisibility(View.VISIBLE); + usersExistBeans = feedbackResp.data.getList(); + commonAdapterReadContents.setDates(usersExistBeans); + DataUtils.set(getActivity(), IMUIKitConfig.FOLLOW_USER_TAG + "_" + IMKitClient.account(), GsonUtils.beanToJSONString(usersExistBeans)); + ChatDataUtils.set(getActivity(), "follow_user" + "_" + IMKitClient.account(), GsonUtils.beanToJSONString(usersExistBeans)); + + } else { + chatgroupBinding.emptyLayout.setVisibility(View.VISIBLE); + chatgroupBinding.refreshLayout.setVisibility(View.GONE); + ChatDataUtils.set(getActivity(), "follow_user" + "_" + IMKitClient.account(), ""); + DataUtils.set(getActivity(), IMUIKitConfig.FOLLOW_USER_TAG + "_" + IMKitClient.account(), ""); + + } + chatgroupBinding.refreshLayout.finishRefresh(); + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + + } + }); + } + + + private void initRefreshLayout() { + chatgroupBinding.refreshLayout.setOnRefreshListener(refreshlayout -> { + initData(); + + }); + + } + + + private void initAdapterRed() { + chatgroupBinding.contactListViewGroup.setLayoutManager(new LinearLayoutManager(getActivity())); + commonAdapterReadContents = new CommonAdapter<>(getActivity(), R.layout.follow_child_item2, usersExistBeans) { + @Override + public void convert(ViewHolder holder, UsersExistBean s, int index) { + LogUtils.i("执行了:" + GsonUtils.beanToJSONString(s)); + ContactAvatarView contactAvatarView = holder.getView(R.id.logo_iv); + TextView tvMsg = holder.getView(R.id.item_msg_tv); + LinearLayout layoutDraft = holder.getView(R.id.item_chatdraft_ll); + TextView tvDraftMsg = holder.getView(R.id.item_chatdraft_tv); + ColorUtils.loadAvator(s.getAvatar(), contactAvatarView); +// contactAvatarView.setData( +// s.getAvatar(), s.getNickname(), AvatarColor.avatarColor(s.getUserId() + "")); + TextView tvNick = holder.getView(R.id.item_title_tv); + TextView tvAlias = holder.getView(R.id.item_title_alias); + tvAlias.setVisibility(View.GONE); + tvNick.setText(s.getNickname()); + tvNick.setMaxWidth(DataUtils.dip2px(getActivity(), 180)); + if (!TextUtils.isEmpty(s.getRemark())) { + tvAlias.setVisibility(View.VISIBLE); + tvAlias.setText("(" + s.getRemark() + ")"); + tvNick.setMaxWidth(DataUtils.dip2px(getActivity(), 80)); + } + // holder.setText(R.id.item_title_tv, s.getNickname()); + TextView tvUnread = holder.getView(R.id.unreadTv); + tvUnread.setVisibility(View.GONE); + RecentContact recentContact = NIMClient.getService(MsgService.class).queryRecentContact(s.getUserId() + "", SessionTypeEnum.P2P); + holder.getView(R.id.item_time_tv).setVisibility(View.GONE); + tvMsg.setText(getString(R.string.nmhmylg_txt)); + if (recentContact != null) { + holder.getView(R.id.item_time_tv).setVisibility(View.VISIBLE); + holder.setText(R.id.item_time_tv, TimeConversationUtils.formatMillisecond(getActivity(), recentContact.getTime())); + holder.setText(R.id.item_msg_tv, recentContact.getContent() + ""); + tvMsg.setText(recentContact.getContent() + ""); + if (recentContact.getUnreadCount() > 0) { + tvUnread.setText(String.valueOf(recentContact.getUnreadCount())); + tvUnread.setVisibility(View.VISIBLE); + } + if (recentContact.getContent().equals("[自定义消息]")) { + String bean = GsonUtils.beanToJSONString(recentContact.getAttachment()); + try { + JSONObject jsonObject = new JSONObject(bean); + switch ((int) jsonObject.get("type")) { + case 1002: + tvMsg.setText(getString(R.string.voom_message_txt)); + break; + case 1003: + tvMsg.setText(getString(com.netease.yunxin.kit.chatkit.ui.R.string.gerenminp_txt)); + break; + + case 1004: + tvMsg.setText(getString(com.netease.yunxin.kit.contactkit.ui.R.string.zhuanzhang_chat_txt)); + break; + case 1005: + case 1006: + tvMsg.setText(getString(com.netease.yunxin.kit.contactkit.ui.R.string.hongbao_chat_txt)); + break; + + } + } catch (JSONException e) { + throw new RuntimeException(e); + } + + } else { + ConversationCustom.identifyExpression(getActivity(), tvMsg, tvMsg.getText().toString()); + } + } + ChatDraftDataDao dataDao = ChatDatabase.getInstance().getChatDraftDataDao(); + ChatDraftData chatDraftData = dataDao.getChatData(String.valueOf(s.getUserId())); + if (chatDraftData != null) { + tvMsg.setVisibility(View.GONE); + layoutDraft.setVisibility(View.VISIBLE); + tvDraftMsg.setText(chatDraftData.getContent()); + } else { + tvMsg.setVisibility(View.VISIBLE); + layoutDraft.setVisibility(View.GONE); + } + holder.getView(R.id.big_ly).setOnClickListener(v -> + XKitRouter.withKey(RouterConstant.PATH_FUN_CHAT_P2P_PAGE) + .withParam(RouterConstant.CHAT_ID_KRY, s.getUserId() + "") + .withContext(requireActivity()) + .navigate()); +// XKitRouter.withKey(RouterConstant.PATH_FUN_USER_INFO_PAGE) +// .withContext(requireActivity()) +// .withParam( +// "uid", +// s.getUserId() + "") +// .withParam("userId", s.getUserId() + "") +// .withParam("isGroup", false) +// .navigate()); + + } + + }; + + chatgroupBinding.contactListViewGroup.setAdapter(commonAdapterReadContents); + + } + + + public void updateConversation(List list) { + for (ConversationBean bean : list) { + if (bean.infoData.getFriendInfo() != null) { + for (UsersExistBean existBean : usersExistBeans) { + if (String.valueOf(existBean.getUserId()).equals(bean.infoData.getFriendInfo().getAccount())) { + int index = usersExistBeans.indexOf(existBean); + if (index >= 0) { + commonAdapterReadContents.notifyItemChanged(index); + break; + } + } + } + } + + } + + } + + public void deleteAllConversation() { + commonAdapterReadContents.notifyDataSetChanged(); + } + + + @Override + public void onDestroyView() { + EventCenter.unregisterEventNotify(changeDraftEvent); + super.onDestroyView(); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/main/chat/FriendConversationFragment.java b/app/src/main/java/com/dskj/rbchat/main/chat/FriendConversationFragment.java new file mode 100644 index 0000000..f57677a --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/chat/FriendConversationFragment.java @@ -0,0 +1,442 @@ +package com.dskj.rbchat.main.chat; + +import static com.netease.yunxin.kit.conversationkit.ui.common.ConversationConstant.LIB_TAG; + +import android.content.DialogInterface; +import android.net.NetworkInfo; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.lifecycle.ViewModelProvider; + +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.FragmentChatBinding; +import com.dskj.rbchat.main.MainActivity; +import com.dskj.rbchat.utils.AdaptScreenUtils; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.google.android.material.bottomsheet.BottomSheetDialog; +import com.google.gson.reflect.TypeToken; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.yunxin.kit.alog.ALog; +import com.netease.yunxin.kit.chatkit.model.ConversationInfo; +import com.netease.yunxin.kit.chatkit.repo.ContactRepo; +import com.netease.yunxin.kit.chatkit.ui.fun.FunChatForwardSelectDialog; +import com.netease.yunxin.kit.common.ui.action.ActionItem; +import com.netease.yunxin.kit.common.ui.dialog.ListAlertDialog; +import com.netease.yunxin.kit.common.ui.fragments.BaseFragment; +import com.netease.yunxin.kit.common.ui.viewholder.BaseBean; +import com.netease.yunxin.kit.common.ui.viewholder.ViewHolderClickListener; +import com.netease.yunxin.kit.common.ui.viewmodel.LoadStatus; +import com.netease.yunxin.kit.common.utils.NetworkUtils; +import com.netease.yunxin.kit.conversationkit.ui.ConversationKitClient; +import com.netease.yunxin.kit.conversationkit.ui.common.ConversationConstant; +import com.netease.yunxin.kit.conversationkit.ui.databinding.FunConversationFragmentBinding; +import com.netease.yunxin.kit.conversationkit.ui.fun.FunViewHolderFactory; +import com.netease.yunxin.kit.conversationkit.ui.model.ConversationBean; +import com.netease.yunxin.kit.conversationkit.ui.page.ConversationBaseFragment; +import com.netease.yunxin.kit.conversationkit.ui.page.interfaces.ILoadListener; +import com.netease.yunxin.kit.conversationkit.ui.page.viewmodel.ConversationViewModel; +import com.netease.yunxin.kit.conversationkit.ui.view.ConversationView; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.route.XKitRouter; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + + +public class FriendConversationFragment extends BaseFragment implements ILoadListener { + + private FunConversationFragmentBinding viewBinding; + private ConversationView conversationView; + protected View networkErrorView; + protected View emptyView; + public ConversationViewModel viewModel; + private FunViewHolderFactory funViewHolderFactory; + + @Nullable + @Override + public View onCreateView( + @NonNull LayoutInflater inflater, + @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + viewBinding = FunConversationFragmentBinding.inflate(inflater, container, false); + initView(); + return viewBinding.getRoot(); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + viewModel = new ViewModelProvider(this).get(ConversationViewModel.class); + viewModel.setComparator(conversationComparator); + viewModel.setConversationFactory(funViewHolderFactory); + bindView(); + initData(); + } + + public Comparator conversationComparator = + (bean1, bean2) -> { + int result; + if (bean1 == null) { + result = 1; + } else if (bean2 == null) { + result = -1; + } else if (bean1.isStickTop() == bean2.isStickTop()) { + long time = bean1.getTime() - bean2.getTime(); + result = time == 0L ? 0 : (time > 0 ? -1 : 1); + + } else { + result = bean1.isStickTop() ? -1 : 1; + } + ALog.d(ConversationConstant.LIB_TAG, FunChatForwardSelectDialog.TAG, "conversationComparator, result:" + result); + return result; + }; + + + private void initData() { + viewModel + .getQueryLiveData() + .observe( + this.getViewLifecycleOwner(), + result -> { + if (result.getLoadStatus() == LoadStatus.Success) { + if (result.getData() != null) { + getConversationTypeList(result.getData()); + conversationView.setData(removeServicesConversation(listFriend)); + } +// + + } else if (result.getLoadStatus() == LoadStatus.Finish) { + getConversationTypeList(result.getData()); + conversationView.addData(removeServicesConversation(listFriend)); + } + if (conversationView.getDataSize() > 0) { + emptyView.setVisibility(View.GONE); + } else { + emptyView.setVisibility(View.VISIBLE); + } + + }); + viewModel.fetchConversation(); + viewModel.getUnreadCount(); + } + + List listFriend = new ArrayList<>(); + + public void getConversationTypeList(List list) { + for (ConversationBean conversationBean : list) { + ConversationInfo conversationInfo = conversationBean.infoData; + if (conversationInfo.getFriendInfo() != null && ContactRepo.isFriend(conversationInfo.getContactId())) { + listFriend.add(conversationBean); + } + } + + } + + private ArrayList servicesIds = new ArrayList<>(); + + private void getServicesData() { + String tagString = DataUtils.get(IMApplication.getAppContext(), IMUIKitConfig.SERVICES_IDS_TAG + "_" + IMKitClient.account(), ""); + if (!TextUtils.isEmpty(tagString)) { + ArrayList strings = GsonUtils.getListFromJSON(tagString, new TypeToken>() { + }.getType()); + servicesIds.addAll(strings); + } + } + + //去掉客服会话 改成添加字段 + public List removeServicesConversation(List beans) { + if (servicesIds == null) { + return beans; + } + + for (ConversationBean conversationBean : beans) { + conversationBean.isServices = false; + if (conversationBean.infoData.getSessionType() == SessionTypeEnum.P2P && servicesIds.indexOf(conversationBean.infoData.getContactId()) >= 0) { + conversationBean.isServices = true; + } + } + return beans; + } + + private void initView() { +// mainActivity = (MainActivity) getActivity(); +// chatMain2Fragment = (ChatMain2Fragment) getParentFragment(); + conversationView = viewBinding.conversationView; + networkErrorView = viewBinding.errorTv; + emptyView = viewBinding.emptyLayout; + funViewHolderFactory = new FunViewHolderFactory(); + funViewHolderFactory.isSelector = false; + conversationView.setViewHolderFactory(funViewHolderFactory); + + + } + + private void bindView() { + //设置会话排序Comparator,默认按照置顶和时间优先级进行排序 + conversationView.setComparator(conversationComparator); + conversationView.setLoadMoreListener(this); + conversationView.setItemClickListener( + new ViewHolderClickListener() { + @Override + public boolean onClick(View v, BaseBean data, int position) { + boolean result = false; + if (ConversationKitClient.getConversationUIConfig() != null + && ConversationKitClient.getConversationUIConfig().itemClickListener != null + && data instanceof ConversationBean) { + result = + ConversationKitClient.getConversationUIConfig() + .itemClickListener + .onClick( + FriendConversationFragment.this.getContext(), + (ConversationBean) data, + position); + } + if (!result && !TextUtils.isEmpty(data.router)) { + XKitRouter.withKey(data.router) + .withParam(data.paramKey, data.param) + .withContext(FriendConversationFragment.this.requireContext()) + .navigate(); + } + return true; + } + + @Override + public boolean onAvatarClick(View v, BaseBean data, int position) { + boolean result = false; + if (ConversationKitClient.getConversationUIConfig() != null + && ConversationKitClient.getConversationUIConfig().itemClickListener != null + && data instanceof ConversationBean) { + result = + ConversationKitClient.getConversationUIConfig() + .itemClickListener + .onAvatarClick( + FriendConversationFragment.this.getContext(), + (ConversationBean) data, + position); + } + if (!result) { + XKitRouter.withKey(data.router) + .withParam(data.paramKey, data.param) + .withContext(FriendConversationFragment.this.requireContext()) + .navigate(); + } + return true; + } + + @Override + public boolean onLongClick(View v, BaseBean data, int position) { + boolean result = false; + if (ConversationKitClient.getConversationUIConfig() != null + && ConversationKitClient.getConversationUIConfig().itemClickListener != null + && data instanceof ConversationBean) { + result = + ConversationKitClient.getConversationUIConfig() + .itemClickListener + .onLongClick( + FriendConversationFragment.this.getContext(), + (ConversationBean) data, + position); + } + if (!result) { + showBottomDialog(data); + } + return true; + } + + @Override + public boolean onAvatarLongClick(View v, BaseBean data, int position) { + boolean result = false; + if (ConversationKitClient.getConversationUIConfig() != null + && ConversationKitClient.getConversationUIConfig().itemClickListener != null + && data instanceof ConversationBean) { + result = + ConversationKitClient.getConversationUIConfig() + .itemClickListener + .onAvatarLongClick( + FriendConversationFragment.this.getContext(), + (ConversationBean) data, + position); + } + if (!result) { + showBottomDialog(data); + } + return true; + } + }); + + } +// List listFriend = new ArrayList<>(); +// private void initData() { +// if (chatMain2Fragment != null) { +// chatMain2Fragment.viewModel +// .getQueryLiveData() +// .observe( +// this.getViewLifecycleOwner(), +// result -> { +// if (result.getLoadStatus() == LoadStatus.Success) { +// listFriend.clear(); +// if (result.getData() != null) { +// for (ConversationBean conversationBean : result.getData()) { +// if (conversationBean.infoData.getFriendInfo() != null) { +// listFriend.add(conversationBean); +// } +// } +// conversationView.setData(listFriend); +// } +// } else if (result.getLoadStatus() == LoadStatus.Finish) { +// listFriend.clear(); +// if (result.getData() != null) { +// for (ConversationBean conversationBean : result.getData()) { +// if (conversationBean.infoData.getFriendInfo() != null) { +// listFriend.add(conversationBean); +// } +// } +// conversationView.setData(listFriend); +// } +// } +// if (conversationView.getDataSize() > 0) { +// emptyView.setVisibility(View.GONE); +// } else { +// emptyView.setVisibility(View.VISIBLE); +// } +// +// } +// ); +// chatMain2Fragment.viewModel.fetchConversation(); +// } +// } + + private void showBottomDialog(BaseBean data) { + if (data instanceof ConversationBean) { + ConversationBean dataBean = (ConversationBean) data; + BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(getActivity(), R.style.BottomSheetDialog); + + View bottomView = LayoutInflater.from(getActivity()).inflate(R.layout.bottom_sheet_layout_conversation, null); + bottomSheetDialog.setContentView(bottomView); + bottomSheetDialog.show(); + + TextView coloseIv1 = (TextView) bottomView.findViewById(R.id.colose_iv); + TextView hideTv = (TextView) bottomView.findViewById(R.id.hide_tv); + TextView deleteTv = (TextView) bottomView.findViewById(R.id.delete_tv); + + coloseIv1.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + bottomSheetDialog.dismiss(); + } + }); + + hideTv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (getParentFragment() != null) { + ((ChatMain2Fragment) getParentFragment()).viewModel.deleteConversation(1, dataBean); + } + bottomSheetDialog.dismiss(); + } + }); + deleteTv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (getParentFragment() != null) { + ((ChatMain2Fragment) getParentFragment()).viewModel.deleteConversation(2, dataBean); + } + bottomSheetDialog.dismiss(); + } + + }); + bottomSheetDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { + @Override + public void onDismiss(DialogInterface dialog) { + getActivity().getWindow().setNavigationBarColor(getResources().getColor(R.color.black)); + } + }); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + AdaptScreenUtils.setWhiteNavigationBar(bottomSheetDialog); + } + } + } + + private void showStickDialog(BaseBean data) { + if (data instanceof ConversationBean) { + ConversationBean dataBean = (ConversationBean) data; + ListAlertDialog alertDialog = new ListAlertDialog(); + alertDialog.setContent(generateDialogContent(dataBean.infoData.isStickTop())); + alertDialog.setTitleVisibility(View.GONE); + alertDialog.setDialogWidth(getResources().getDimension(com.netease.yunxin.kit.conversationkit.ui.R.dimen.alert_dialog_width)); + alertDialog.setItemClickListener( + action -> { + if (TextUtils.equals(action, ConversationConstant.Action.ACTION_DELETE)) { + viewModel.deleteConversation(2, dataBean); + } else if (TextUtils.equals(action, ConversationConstant.Action.ACTION_HIDE)) { + viewModel.deleteConversation(1, dataBean); + } + alertDialog.dismiss(); + }); + alertDialog.show(getParentFragmentManager()); + } + } + + protected List generateDialogContent(boolean isStick) { + List contentList = new ArrayList<>(); + ActionItem hide = + new ActionItem(ConversationConstant.Action.ACTION_HIDE, 0, com.netease.yunxin.kit.conversationkit.ui.R.string.hide_title); + ActionItem delete = + new ActionItem(ConversationConstant.Action.ACTION_DELETE, 0, com.netease.yunxin.kit.conversationkit.ui.R.string.delete_title); + contentList.add(hide); + contentList.add(delete); + return contentList; + } + + public ConversationView getConversationView() { + return conversationView; + } + + public View getEmptyView() { + return emptyView; + } + + @Override + public boolean hasMore() { + + viewModel.hasMore(); + return false; + } + + @Override + public void loadMore(Object last) { + if (last instanceof ConversationBean) { + viewModel.loadMore((ConversationBean) last); + } + } + + + @Override + public void onStop() { + super.onStop(); + if (conversationView != null) { + conversationView.setShowTag(false); + } + } + + @Override + public void onStart() { + super.onStart(); + if (conversationView != null) { + conversationView.setShowTag(true); + } + } +} diff --git a/app/src/main/java/com/dskj/rbchat/main/chat/TeamConversationFragment.java b/app/src/main/java/com/dskj/rbchat/main/chat/TeamConversationFragment.java new file mode 100644 index 0000000..fa9f500 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/chat/TeamConversationFragment.java @@ -0,0 +1,430 @@ +package com.dskj.rbchat.main.chat; + +import static com.netease.yunxin.kit.conversationkit.ui.common.ConversationConstant.LIB_TAG; + +import android.content.DialogInterface; +import android.graphics.drawable.Drawable; +import android.net.NetworkInfo; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.lifecycle.ViewModelProvider; + +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.FragmentChatBinding; +import com.dskj.rbchat.databinding.FragmentTeamconversationBinding; +import com.dskj.rbchat.main.MainActivity; +import com.dskj.rbchat.utils.AdaptScreenUtils; +import com.google.android.material.bottomsheet.BottomSheetDialog; +import com.netease.nimlib.sdk.team.model.Team; +import com.netease.yunxin.kit.alog.ALog; +import com.netease.yunxin.kit.chatkit.model.ConversationInfo; +import com.netease.yunxin.kit.chatkit.repo.ContactRepo; +import com.netease.yunxin.kit.chatkit.ui.fun.FunChatForwardSelectDialog; +import com.netease.yunxin.kit.common.ui.action.ActionItem; +import com.netease.yunxin.kit.common.ui.dialog.ListAlertDialog; +import com.netease.yunxin.kit.common.ui.fragments.BaseFragment; +import com.netease.yunxin.kit.common.ui.viewholder.BaseBean; +import com.netease.yunxin.kit.common.ui.viewholder.ViewHolderClickListener; +import com.netease.yunxin.kit.common.ui.viewmodel.LoadStatus; +import com.netease.yunxin.kit.common.utils.NetworkUtils; +import com.netease.yunxin.kit.conversationkit.ui.ConversationKitClient; +import com.netease.yunxin.kit.conversationkit.ui.common.ConversationConstant; +import com.netease.yunxin.kit.conversationkit.ui.databinding.FunConversationFragmentBinding; +import com.netease.yunxin.kit.conversationkit.ui.fun.FunViewHolderFactory; +import com.netease.yunxin.kit.conversationkit.ui.model.ConversationBean; +import com.netease.yunxin.kit.conversationkit.ui.page.ConversationBaseFragment; +import com.netease.yunxin.kit.conversationkit.ui.page.interfaces.ILoadListener; +import com.netease.yunxin.kit.conversationkit.ui.page.viewmodel.ConversationViewModel; +import com.netease.yunxin.kit.conversationkit.ui.view.ConversationView; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.route.XKitRouter; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + + +public class TeamConversationFragment extends BaseFragment implements ILoadListener, ViewHolderClickListener { + + private FragmentTeamconversationBinding viewBinding; + private ConversationView conversationViewMyTeam; + private ConversationView conversationViewJoinTeam; + // protected View networkErrorView; +// protected View emptyView; +// private ChatMain2Fragment chatMain2Fragment; + private LinearLayout layoutEmpty; + private LinearLayout layoutTeamRoot; + public ConversationViewModel viewModel; + private FunViewHolderFactory funViewHolderFactory; + + @Nullable + @Override + public View onCreateView( + @NonNull LayoutInflater inflater, + @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + viewBinding = FragmentTeamconversationBinding.inflate(inflater, container, false); + initView(); + return viewBinding.getRoot(); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + viewModel = new ViewModelProvider(this).get(ConversationViewModel.class); + viewModel.setComparator(conversationComparator); + viewModel.setConversationFactory(funViewHolderFactory); + bindView(); + initData(); + } + + public Comparator conversationComparator = + (bean1, bean2) -> { + int result; + if (bean1 == null) { + result = 1; + } else if (bean2 == null) { + result = -1; + } else if (bean1.isStickTop() == bean2.isStickTop()) { + long time = bean1.getTime() - bean2.getTime(); + result = time == 0L ? 0 : (time > 0 ? -1 : 1); + + } else { + result = bean1.isStickTop() ? -1 : 1; + } + ALog.d(ConversationConstant.LIB_TAG, FunChatForwardSelectDialog.TAG, "conversationComparator, result:" + result); + return result; + }; + + private void initData() { + viewModel + .getQueryLiveData() + .observe( + this.getViewLifecycleOwner(), + result -> { + if (result.getLoadStatus() == LoadStatus.Success) { + if (result.getData() != null) { + getConversationTypeList(result.getData()); + conversationViewMyTeam.setData(listMyTeam); + conversationViewJoinTeam.setData(listJoinTeam); + } + } else if (result.getLoadStatus() == LoadStatus.Finish) { + getConversationTypeList(result.getData()); + conversationViewMyTeam.addData(listMyTeam); + conversationViewJoinTeam.addData(listJoinTeam); + } + setMyTeamList(); + setJoinTeamList(); + setEmptyAll(); + }); + viewModel.fetchConversation(); + viewModel.getUnreadCount(); + } + + List listMyTeam = new ArrayList<>(); + List listJoinTeam = new ArrayList<>(); + + public void getConversationTypeList(List list) { + listMyTeam.clear(); + listJoinTeam.clear(); + for (ConversationBean conversationBean : list) { + if (conversationBean.infoData.getTeamInfo() != null) { //不是群就是好友 也包含已删除的好友会话 + if (conversationBean.infoData.getTeamInfo().getCreator().equals(IMKitClient.account())) { + listMyTeam.add(conversationBean); + } else { + listJoinTeam.add(conversationBean); + } + } + } + + } + + private boolean showAllMyTeam = false; + private boolean showAllJoinTeam = false; + + private void initView() { +// mainActivity = (MainActivity) getActivity(); +// chatMain2Fragment = (ChatMain2Fragment) getParentFragment(); + conversationViewMyTeam = viewBinding.conversationViewMyteam; + conversationViewJoinTeam = viewBinding.conversationViewMyjointeam; +// networkErrorView = viewBinding.errorTv; +// emptyView = viewBinding.emptyLayout; + funViewHolderFactory = new FunViewHolderFactory(); + funViewHolderFactory.isSelector = false; + conversationViewMyTeam.setViewHolderFactory(funViewHolderFactory); + conversationViewJoinTeam.setViewHolderFactory(funViewHolderFactory); + + + conversationViewMyTeam.getAdatper().setShowAll(false); + conversationViewJoinTeam.getAdatper().setShowAll(false); + viewBinding.tvMyteamspull.setOnClickListener(view -> { + showAllMyTeam = !showAllMyTeam; + if (showAllMyTeam) { + Drawable drawable = getResources().getDrawable(R.mipmap.ic_indexfm_up); + drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); + viewBinding.tvMyteamspull.setCompoundDrawables(null, null, drawable, null); + } else { + Drawable drawable = getResources().getDrawable(R.mipmap.ic_indexfm_down); + drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); + viewBinding.tvMyteamspull.setCompoundDrawables(null, null, drawable, null); + } + viewBinding.conversationViewMyteam.getAdatper().setShowAll(showAllMyTeam); + + + }); + viewBinding.tvMyjointeamspull.setOnClickListener(view -> { + showAllJoinTeam = !showAllJoinTeam; + if (showAllJoinTeam) { + Drawable drawable = getResources().getDrawable(R.mipmap.ic_indexfm_up); + drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); + viewBinding.tvMyjointeamspull.setCompoundDrawables(null, null, drawable, null); + } else { + Drawable drawable = getResources().getDrawable(R.mipmap.ic_indexfm_down); + drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); + viewBinding.tvMyjointeamspull.setCompoundDrawables(null, null, drawable, null); + } + viewBinding.conversationViewMyjointeam.getAdatper().setShowAll(showAllJoinTeam); + + + }); + + } + + private void bindView() { + //设置会话排序Comparator,默认按照置顶和时间优先级进行排序 + + conversationViewMyTeam.setComparator(conversationComparator); + conversationViewMyTeam.setLoadMoreListener(this); + conversationViewMyTeam.setItemClickListener(this); + conversationViewJoinTeam.setComparator(conversationComparator); + conversationViewJoinTeam.setLoadMoreListener(this); + conversationViewJoinTeam.setItemClickListener(this); + + + } + + private void showBottomDialog(BaseBean data) { + if (data instanceof ConversationBean) { + ConversationBean dataBean = (ConversationBean) data; + BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(getActivity(), R.style.BottomSheetDialog); + + View bottomView = LayoutInflater.from(getActivity()).inflate(R.layout.bottom_sheet_layout_conversation, null); + bottomSheetDialog.setContentView(bottomView); + bottomSheetDialog.show(); + + TextView coloseIv1 = (TextView) bottomView.findViewById(R.id.colose_iv); + TextView hideTv = (TextView) bottomView.findViewById(R.id.hide_tv); + TextView deleteTv = (TextView) bottomView.findViewById(R.id.delete_tv); + + coloseIv1.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + bottomSheetDialog.dismiss(); + } + }); + + hideTv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (getParentFragment() != null) { + ((ChatMain2Fragment) getParentFragment()).viewModel.deleteConversation(1, dataBean); + } + bottomSheetDialog.dismiss(); + } + }); + deleteTv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (getParentFragment() != null) { + ((ChatMain2Fragment) getParentFragment()).viewModel.deleteConversation(2, dataBean); + } + bottomSheetDialog.dismiss(); + } + + }); + bottomSheetDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { + @Override + public void onDismiss(DialogInterface dialog) { + getActivity().getWindow().setNavigationBarColor(getResources().getColor(R.color.black)); + } + }); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + AdaptScreenUtils.setWhiteNavigationBar(bottomSheetDialog); + } + } + } + + private void showStickDialog(BaseBean data) { + if (data instanceof ConversationBean) { + ConversationBean dataBean = (ConversationBean) data; + ListAlertDialog alertDialog = new ListAlertDialog(); + alertDialog.setContent(generateDialogContent(dataBean.infoData.isStickTop())); + alertDialog.setTitleVisibility(View.GONE); + alertDialog.setDialogWidth(getResources().getDimension(com.netease.yunxin.kit.conversationkit.ui.R.dimen.alert_dialog_width)); + alertDialog.setItemClickListener( + action -> { + if (TextUtils.equals(action, ConversationConstant.Action.ACTION_DELETE)) { + viewModel.deleteConversation(2, dataBean); + } else if (TextUtils.equals(action, ConversationConstant.Action.ACTION_HIDE)) { + viewModel.deleteConversation(1, dataBean); + + } + alertDialog.dismiss(); + }); + alertDialog.show(getParentFragmentManager()); + } + } + + protected List generateDialogContent(boolean isStick) { + List contentList = new ArrayList<>(); + ActionItem hide = + new ActionItem(ConversationConstant.Action.ACTION_HIDE, 0, com.netease.yunxin.kit.conversationkit.ui.R.string.hide_title); + ActionItem delete = + new ActionItem(ConversationConstant.Action.ACTION_DELETE, 0, com.netease.yunxin.kit.conversationkit.ui.R.string.delete_title); + contentList.add(hide); + contentList.add(delete); + return contentList; + } + + public ConversationView getConversationViewMyTeam() { + return conversationViewMyTeam; + } + + public ConversationView getConversationViewJoinTeam() { + return conversationViewJoinTeam; + } + + public void setMyTeamList() { + int size = conversationViewMyTeam.getAdatper().getConversationList().size(); + if (size == 0) { + viewBinding.layoutMycreate.setVisibility(View.GONE); + } else { + viewBinding.layoutMycreate.setVisibility(View.VISIBLE); + viewBinding.tvMyteamnumber.setText(size + ""); + } + + + } + + public void setJoinTeamList() { + int size = conversationViewJoinTeam.getAdatper().getConversationList().size(); + if (size == 0) { + viewBinding.layoutMyjoin.setVisibility(View.GONE); + } else { + viewBinding.layoutMyjoin.setVisibility(View.VISIBLE); + viewBinding.tvMyjointeamnumber.setText(size + ""); + } + + } + + public void setEmptyAll() { + if (viewBinding.layoutMyjoin.getVisibility() == View.GONE && viewBinding.layoutMycreate.getVisibility() == View.GONE) { + viewBinding.layoutTeamroot.setVisibility(View.GONE); + viewBinding.emptyLayout.setVisibility(View.VISIBLE); + } else { + viewBinding.layoutTeamroot.setVisibility(View.VISIBLE); + viewBinding.emptyLayout.setVisibility(View.GONE); + } + } + + + @Override + public boolean hasMore() { + viewModel.hasMore(); + return false; + } + + + @Override + public void loadMore(Object last) { + if (last instanceof ConversationBean) { + + } + } + + @Override + public void onStop() { + super.onStop(); + if (conversationViewMyTeam != null) { + conversationViewMyTeam.setShowTag(false); + } + if (conversationViewJoinTeam != null) { + conversationViewJoinTeam.setShowTag(false); + } + } + + @Override + public void onStart() { + super.onStart(); + if (conversationViewMyTeam != null) { + conversationViewMyTeam.setShowTag(true); + } + if (conversationViewJoinTeam != null) { + conversationViewJoinTeam.setShowTag(true); + } + } + + @Override + public boolean onClick(View view, BaseBean data, int position) { + boolean result = false; + if (ConversationKitClient.getConversationUIConfig() != null + && ConversationKitClient.getConversationUIConfig().itemClickListener != null + && data instanceof ConversationBean) { + result = + ConversationKitClient.getConversationUIConfig() + .itemClickListener + .onClick( + TeamConversationFragment.this.requireContext(), + (ConversationBean) data, + position); + } + if (!result && !TextUtils.isEmpty(data.router)) { + XKitRouter.withKey(data.router) + .withParam(data.paramKey, data.param) + .withContext(TeamConversationFragment.this.requireContext()) + .navigate(); + } + return true; + } + + @Override + public boolean onAvatarClick(View view, BaseBean data, int position) { + return ViewHolderClickListener.super.onAvatarClick(view, data, position); + } + + @Override + public boolean onLongClick(View view, BaseBean data, int position) { + boolean result = false; + if (ConversationKitClient.getConversationUIConfig() != null + && ConversationKitClient.getConversationUIConfig().itemClickListener != null + && data instanceof ConversationBean) { + result = + ConversationKitClient.getConversationUIConfig() + .itemClickListener + .onLongClick( + TeamConversationFragment.this.getContext(), + (ConversationBean) data, + position); + } + if (!result) { + showBottomDialog(data); + } + return true; + } + + @Override + public boolean onAvatarLongClick(View view, BaseBean data, int position) { + return ViewHolderClickListener.super.onAvatarLongClick(view, data, position); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/main/home/CustomServicesActivity.java b/app/src/main/java/com/dskj/rbchat/main/home/CustomServicesActivity.java new file mode 100644 index 0000000..96434ac --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/home/CustomServicesActivity.java @@ -0,0 +1,403 @@ +package com.dskj.rbchat.main.home; + +import static com.netease.yunxin.kit.conversationkit.ui.common.ConversationConstant.LIB_TAG; + +import android.content.DialogInterface; +import android.os.Build; +import android.os.Bundle; +import android.text.TextUtils; +import android.util.TypedValue; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; + +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.base.LllChatBaseActivity; +import com.dskj.rbchat.databinding.ActivityCustomServicesBinding; +import com.dskj.rbchat.model.StaffServiceIdBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.AdaptScreenUtils; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.google.android.material.bottomsheet.BottomSheetDialog; +import com.google.gson.reflect.TypeToken; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.yunxin.kit.alog.ALog; +import com.netease.yunxin.kit.chatkit.model.ConversationInfo; +import com.netease.yunxin.kit.chatkit.ui.fun.FunChatForwardSelectDialog; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.common.ui.viewholder.BaseBean; +import com.netease.yunxin.kit.common.ui.viewholder.ViewHolderClickListener; +import com.netease.yunxin.kit.common.ui.viewmodel.FetchResult; +import com.netease.yunxin.kit.common.ui.viewmodel.LoadStatus; +import com.netease.yunxin.kit.conversationkit.ui.ConversationKitClient; +import com.netease.yunxin.kit.conversationkit.ui.common.ConversationConstant; +import com.netease.yunxin.kit.conversationkit.ui.fun.FunViewHolderFactory; +import com.netease.yunxin.kit.conversationkit.ui.model.ConversationBean; +import com.netease.yunxin.kit.conversationkit.ui.page.viewmodel.ConversationViewModel; +import com.netease.yunxin.kit.conversationkit.ui.view.ConversationView; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.utils.RouterConstant; +import com.netease.yunxin.kit.corekit.route.XKitRouter; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +/** + * 在线客服 + */ +public class CustomServicesActivity extends LllChatBaseActivity { + + + ActivityCustomServicesBinding binding; + public ConversationViewModel viewModel; + private Observer>> changeObserver; + private ConversationView conversationView; + private List servicesIds = new ArrayList<>(); + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getWindow().setStatusBarColor(getResources().getColor(R.color.color_white)); + getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white)); + binding = ActivityCustomServicesBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + binding.titlebar.getTitleTextView().setTextSize(TypedValue.COMPLEX_UNIT_SP, 18); + binding.titlebar.setOnBackIconClickListener(view -> finish()); + + binding.tvTaomenggou.setOnClickListener(view -> jumpTochat(1)); + binding.tvTaoleding.setOnClickListener(view -> jumpTochat(2)); + binding.tvJifen.setOnClickListener(view -> jumpTochat(3)); + binding.tvHezuo.setOnClickListener(view -> jumpTochat(4)); +// getServicesData(); +// viewModel = new ViewModelProvider(this).get(ConversationViewModel.class); +// conversationView = binding.conversationView; +// initTitleBar(); +// initView(); +// initData(); +// initObserver(); +// registerObserver(); + } + + + public void jumpTochat(int type) { + Api.getInstance().helpCenterStaffServiceId(IMUIKitConfig.SUBSTATIONID, type) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + XKitRouter.withKey(RouterConstant.PATH_CHAT_P2P_PAGE) + .withParam("isService", true) + .withParam(RouterConstant.CHAT_ID_KRY, feedbackResp.data.getStaffServiceId() + "") + .withContext(CustomServicesActivity.this) + .navigate(); + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast(msg); + } + }); + } + + + @Override + public int initNavigationBarColor() { + return getColor(R.color.color_fffbfb); + } + + @Override + public int initStatusBarColor() { + return 0; + } + +// private void getServicesData() { +// String tagString = DataUtils.get(IMApplication.getAppContext(), IMUIKitConfig.SERVICES_IDS_TAG + "_" + IMKitClient.account(), ""); +// if (!TextUtils.isEmpty(tagString)) { +// ArrayList strings = GsonUtils.getListFromJSON(tagString, new TypeToken>() { +// }.getType()); +// servicesIds.clear(); +// servicesIds.addAll(strings); +// } +// } + +// private void initView() { +// FunViewHolderFactory funViewHolderFactory = new FunViewHolderFactory(); +// funViewHolderFactory.isSelector = false; +// funViewHolderFactory.setServices(true); +// binding.conversationView.setViewHolderFactory(funViewHolderFactory); +// viewModel.setConversationFactory(funViewHolderFactory); +// viewModel.setComparator(conversationComparator); +// binding.conversationView.setComparator(conversationComparator); +// binding.conversationView.setItemClickListener( +// new ViewHolderClickListener() { +// @Override +// public boolean onClick(View v, BaseBean data, int position) { +// boolean result = false; +// if (ConversationKitClient.getConversationUIConfig() != null +// && ConversationKitClient.getConversationUIConfig().itemClickListener != null +// && data instanceof ConversationBean) { +// result = +// ConversationKitClient.getConversationUIConfig() +// .itemClickListener +// .onClick( +// CustomServicesActivity.this, +// (ConversationBean) data, +// position); +// } +// if (!result && !TextUtils.isEmpty(data.router)) { +// XKitRouter.withKey(data.router) +// .withParam("isService", true) +// .withParam(data.paramKey, data.param) +// .withContext(CustomServicesActivity.this) +// .navigate(); +// } +// return true; +// } +// +// @Override +// public boolean onAvatarClick(View v, BaseBean data, int position) { +// return false; +// } +// +// @Override +// public boolean onLongClick(View v, BaseBean data, int position) { +// boolean result = false; +// if (ConversationKitClient.getConversationUIConfig() != null +// && ConversationKitClient.getConversationUIConfig().itemClickListener != null +// && data instanceof ConversationBean) { +// result = +// ConversationKitClient.getConversationUIConfig() +// .itemClickListener +// .onLongClick( +// CustomServicesActivity.this, +// (ConversationBean) data, +// position); +// } +// if (!result) { +// showBottomDialog(data); +// } +// return true; +// } +// +// @Override +// public boolean onAvatarLongClick(View v, BaseBean data, int position) { +// return false; +// } +// }); +// } + + +// public Comparator conversationComparator = +// (bean1, bean2) -> { +// int result; +// if (bean1 == null) { +// result = 1; +// } else if (bean2 == null) { +// result = -1; +// } else if (bean1.isStickTop() == bean2.isStickTop()) { +// long time = bean1.getTime() - bean2.getTime(); +// result = time == 0L ? 0 : (time > 0 ? -1 : 1); +// +// } else { +// result = bean1.isStickTop() ? -1 : 1; +// } +// ALog.d(ConversationConstant.LIB_TAG, FunChatForwardSelectDialog.TAG, "conversationComparator, result:" + result); +// return result; +// }; + +// private void showBottomDialog(BaseBean data) { +// if (data instanceof ConversationBean) { +// ConversationBean dataBean = (ConversationBean) data; +// BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(CustomServicesActivity.this, R.style.BottomSheetDialog); +// +// View bottomView = LayoutInflater.from(CustomServicesActivity.this).inflate(R.layout.bottom_sheet_layout_conversation, null); +// bottomView.findViewById(R.id.hide_tv).setVisibility(View.GONE); +// bottomSheetDialog.setContentView(bottomView); +// bottomSheetDialog.show(); +// +// TextView coloseIv1 = (TextView) bottomView.findViewById(R.id.colose_iv); +// TextView deleteTv = (TextView) bottomView.findViewById(R.id.delete_tv); +// +// coloseIv1.setOnClickListener(new View.OnClickListener() { +// @Override +// public void onClick(View v) { +// bottomSheetDialog.dismiss(); +// } +// }); +// +// deleteTv.setOnClickListener(new View.OnClickListener() { +// @Override +// public void onClick(View v) { +// +// viewModel.deleteConversation(2, dataBean); +// bottomSheetDialog.dismiss(); +// } +// +// }); +// bottomSheetDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { +// @Override +// public void onDismiss(DialogInterface dialog) { +// CustomServicesActivity.this.getWindow().setNavigationBarColor(getResources().getColor(R.color.black)); +// } +// }); +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { +// AdaptScreenUtils.setWhiteNavigationBar(bottomSheetDialog); +// } +// } +// } + +// private void initTitleBar() { +// binding.titlebar.getTitleTextView().setTextSize(TypedValue.COMPLEX_UNIT_SP, 20); +// binding.titlebar.setActionImg(R.mipmap.kefu_img); +// binding.titlebar.setOnBackIconClickListener(view -> onBackPressed()); +// binding.titlebar.setActionListener(view -> { +// Api.getInstance().helpCenterStaffServiceId(IMUIKitConfig.SUBSTATIONID) +// .subscribeOn(Schedulers.io()) +// .observeOn(AndroidSchedulers.mainThread()) +// .subscribe(new BaseObserver>() { +// @Override +// public void onSuccess(Result feedbackResp) { +// getServicesId(); +// XKitRouter.withKey(RouterConstant.PATH_CHAT_P2P_PAGE) +// .withParam("isService", true) +// .withParam(RouterConstant.CHAT_ID_KRY, feedbackResp.data.getStaffServiceId() + "") +// .withContext(CustomServicesActivity.this) +// .navigate(); +// } +// +// @Override +// public void onError(int code, String msg) { +// ToastX.showShortToast(msg); +// +// } +// }); +// }); +} + +//重新分配获取数据 +// public void getServicesId() { +// Api.getInstance().helpCenterStaffsServiceId(IMUIKitConfig.SUBSTATIONID) +// .subscribeOn(Schedulers.io()) +// .observeOn(AndroidSchedulers.mainThread()) +// .subscribe(new BaseObserver>>() { +// +// +// @Override +// public void onSuccess(Result> o) { +// if (o.data != null && o.data.size() > 0) { +// DataUtils.set(CustomServicesActivity.this, IMUIKitConfig.SERVICES_IDS_TAG + "_" + IMKitClient.account(), GsonUtils.beanToJSONString(o.data)); +// } +// } +// +// @Override +// public void onError(int code, String msg) { +// +// } +// }); +// } + +// public void initData() { +// if (servicesIds != null && servicesIds.size() > 0) { +// getAllConversation(); +// } +// } + +// private void getAllConversation() { +// viewModel +// .getQueryLiveData() +// .observe( +// this, +// result -> { +// if (result.getLoadStatus() == LoadStatus.Success) { +// conversationView.setData(matchConversation(result.getData())); +// } else if (result.getLoadStatus() == LoadStatus.Finish) { +// conversationView.addData(matchConversation(result.getData())); +// } +// if (conversationView.getDataSize() > 0) { +// binding.emptyLayout.setVisibility(View.GONE); +// } else { +// binding.emptyLayout.setVisibility(View.VISIBLE); +// } +// +// }); +// viewModel.fetchConversation(); //查询所有会话 +// } +// +// +// private void initObserver() { +// changeObserver = +// result -> { +// if (conversationView != null) { +// if (result.getLoadStatus() == LoadStatus.Success) { +// getServicesData(); +// if (servicesIds.size() == 0) { +// return; +// } +// ALog.d(LIB_TAG, "TAG", "ChangeLiveData, Success"); +// for (ConversationBean bean : result.getData()) { +// matchServices(bean); +// } +// } else if (result.getLoadStatus() == LoadStatus.Finish +// && result.getType() == FetchResult.FetchType.Remove) { +// ALog.d(LIB_TAG, "TAG", "DeleteLiveData, Success"); +// if (result.getData() == null || result.getData().size() < 1) { +// conversationView.removeAll(); +// } else { +// conversationView.remove(result.getData()); +// } +// } +// if (conversationView.getDataSize() > 0) { +// binding.emptyLayout.setVisibility(View.GONE); +// } else { +// binding.emptyLayout.setVisibility(View.VISIBLE); +// } +// } +// }; +// } +// +// public void matchServices(ConversationBean bean) { +// for (String servicesId : servicesIds) { +// if (servicesId.equals(bean.infoData.getContactId())) { +// conversationView.update(bean); +// } +// } +// } +// +// public List matchConversation(List beans) { +// List servicesConvesation = new ArrayList<>(); +// for (ConversationBean conversationBean : beans) { +// if (conversationBean.infoData.getSessionType() == SessionTypeEnum.P2P && servicesIds.contains(conversationBean.infoData.getContactId())) { +// servicesConvesation.add(conversationBean); +// } +// } +// return servicesConvesation; +// } +// +// private void registerObserver() { +// viewModel.getChangeLiveData().observeForever(changeObserver); +// } +// +// private void unregisterObserver() { +// viewModel.getChangeLiveData().removeObserver(changeObserver); +// } + +// @Override +// protected void onDestroy() { +// unregisterObserver(); +// super.onDestroy(); +// } +//} diff --git a/app/src/main/java/com/dskj/rbchat/main/home/HomeFragment.java b/app/src/main/java/com/dskj/rbchat/main/home/HomeFragment.java new file mode 100644 index 0000000..1a3ab22 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/home/HomeFragment.java @@ -0,0 +1,687 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.main.home; + +import android.content.Context; +import android.content.Intent; +import android.graphics.drawable.AnimationDrawable; +import android.os.Bundle; +import android.os.Handler; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.Animation; +import android.view.animation.AnimationUtils; +import android.widget.ImageView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.text.HtmlCompat; + +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.FragmentHomeNewBinding; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.game.JsBridgeActivity; +import com.dskj.rbchat.imkit.verify.FunVerifyListActivity; +import com.dskj.rbchat.main.MainActivity; +import com.dskj.rbchat.main.index.AiChatActivity; +import com.dskj.rbchat.main.message.NotifyMessageActivity; +import com.dskj.rbchat.main.mine.ChangeAccoutActionActivity; +import com.dskj.rbchat.model.AdBean; +import com.dskj.rbchat.model.BindBean; +import com.dskj.rbchat.model.ListBeanResult; +import com.dskj.rbchat.model.MessageBean; +import com.dskj.rbchat.model.NotifyCountBean; +import com.dskj.rbchat.model.StaffServiceIdBean; +import com.dskj.rbchat.model.UserRankBean; +import com.dskj.rbchat.model.WalletBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.AnimUtil; +import com.dskj.rbchat.utils.AppUtils; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.ImageLoader; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.wallet.GiftInfoActivity; +import com.dskj.rbchat.wallet.SetPayPasswordActivity; +import com.dskj.rbchat.wallet.TopUpActivity; +import com.dskj.rbchat.wallet.WalletInfoActivity; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.Observer; +import com.netease.nimlib.sdk.friend.model.AddFriendNotify; +import com.netease.nimlib.sdk.msg.SystemMessageObserver; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.nimlib.sdk.msg.model.SystemMessage; +import com.netease.yunxin.kit.chatkit.repo.ContactRepo; +import com.netease.yunxin.kit.chatkit.ui.common.RxBus; +import com.netease.yunxin.kit.chatkit.ui.custom.ChatConfigManager; +import com.netease.yunxin.kit.common.ui.fragments.BaseFragment; +import com.netease.yunxin.kit.common.ui.utils.AvatarColor; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.model.UserInfo; +import com.netease.yunxin.kit.corekit.im.provider.FetchCallback; +import com.netease.yunxin.kit.corekit.im.repo.CommonRepo; +import com.netease.yunxin.kit.corekit.im.repo.SettingRepo; +import com.netease.yunxin.kit.corekit.im.utils.RouterConstant; +import com.netease.yunxin.kit.corekit.route.XKitRouter; +import com.youth.banner.BannerConfig; + +import java.util.ArrayList; +import java.util.List; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class HomeFragment extends BaseFragment { + private FragmentHomeNewBinding binding; + BindBean bindBean; + WalletBean walletBean; + ArrayList list_path1 = new ArrayList<>(); + ArrayList list_title1 = new ArrayList<>(); + + @Nullable + @Override + public View onCreateView( + @NonNull LayoutInflater inflater, + @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + binding = FragmentHomeNewBinding.inflate(inflater); + + return binding.getRoot(); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + initShow(); + initData(); + initRefreshLayout(); + } + + private void initRefreshLayout() { + binding.refreshLayout.setOnRefreshListener(refreshlayout -> { + getWallet(); + getUserRank(); + }); + + } + + private void initShow() { + RxBus.getInstance().toObservable(WalletBean.class) + .subscribeOn(rx.schedulers.Schedulers.io()) + .unsubscribeOn(rx.schedulers.Schedulers.io()) + .subscribe(changeImageViewBean -> {//回顶部 + walletBean = changeImageViewBean; + changeInfo(); + }); + binding.jinbiTv.setOnClickListener(v -> { + toWalletInfo(true); + + }); + binding.jinbiTv1.setOnClickListener(v -> { + toWalletInfo(true); + + }); + + binding.hezuoshangjiaTv.setOnClickListener(v -> { + Intent intent = new Intent(getActivity(), JsBridgeActivity.class); + intent.putExtra("url", IMUIKitConfig.MERCHANT_USER_URL); + intent.putExtra("isGame", true); + startActivity(intent); + }); + + binding.tongbiTv.setOnClickListener(v -> toTongBi()); + binding.tongbiTv1.setOnClickListener(v -> toTongBi()); + + binding.yinbiTv.setOnClickListener(v -> { + toWalletInfo(false); + }); + binding.yinbiTv1.setOnClickListener(v -> { + toWalletInfo(false); + + }); + + + binding.zaixiankefuTv.setOnClickListener(v -> { + ((MainActivity) getActivity()).getServiceId(); //更新客服列表 + startActivity(new Intent(getActivity(), CustomServicesActivity.class)); + } + ); + + + binding.wawajiLy.setOnClickListener(v -> toTlt()); + binding.shoukuanTv.setOnClickListener(v -> { + MainActivity activity = (MainActivity) getActivity(); + activity.toQrcode(); + }); + binding.fukuanTv.setOnClickListener(v -> { + MainActivity activity = (MainActivity) getActivity(); + activity.toSShop(false); + }); + + binding.saoyisaoTv.setOnClickListener(v -> { + MainActivity activity = (MainActivity) getActivity(); + activity.toScan(); + }); + binding.ivIndexfmNotifytop.setOnClickListener(view -> { + notifyCount = 0; + setNotifyTotalCount(); + startActivity(new Intent(getActivity(), NotifyMessageActivity.class)); + + }); + + binding.toChuzhiTv.setOnClickListener(v -> startActivity(new Intent(getActivity(), TopUpActivity.class))); + + + binding.layoutIndexfmAichat.setOnClickListener(view -> { + //launcher + startActivity(new Intent(getActivity(), AiChatActivity.class)); + }); + binding.userLayout.setOnClickListener(v -> startUserInfoActivity(IMKitClient.account())); + + + getWallet(); + bindInfo(); + getUserRank(); + + AnimUtil.setAnimViews(binding.saoyisaoTv, binding.toChuzhiTv, + binding.shoukuanTv, binding.zaixiankefuTv, binding.ivIndexfmNotifytop, binding.fukuanTv, binding.jinbiTv, + binding.yinbiTv, binding.wawajiLy, binding.layoutIndexfmAichat, binding.userLayout); + adList(); + initObserver(); + + binding.recordLottieView.setOnClickListener(v -> { + if (binding.robitRy.getVisibility() == View.GONE) { + binding.robitRy.setBackgroundResource(R.mipmap.robit_bg1); + animateIn(); + } else { + binding.robitRy.setBackgroundResource(R.mipmap.robit_bg1); + animateOut(); + } + }); + binding.robitRy.setOnClickListener(v -> { + + }); + AnimationDrawable mLoadingAnimationDrawable = (AnimationDrawable) binding.recordLottieView.getDrawable(); + //直接就开始执行,性能不是最佳的。 + mLoadingAnimationDrawable.start(); + + } + + private void toTongBi() { + if (bindBean != null) { + if (!bindBean.getPhoneBind()) { + showDialog(); + } else { + Intent intent = new Intent(getActivity(), GiftInfoActivity.class); + startActivity(intent); + } + } + } + + private void toWalletInfo(boolean b) { + if (bindBean != null) { + if (!bindBean.getPhoneBind()) { + showDialog(); + } else { + Intent intent = new Intent(getActivity(), WalletInfoActivity.class); + intent.putExtra("isG", b); + startActivity(intent); + } + } + } + + private void initData() { + ContactRepo.registerLoginSyncObserver(syncStatus -> { + LogUtils.i("SYNCSTATUS==" + syncStatus.name()); + LogUtils.i("初始化数据:" + GsonUtils.beanToJSONString(syncStatus)); + }); + SettingRepo.getShowReadStatus( + new FetchCallback<>() { + @Override + public void onSuccess(@Nullable Boolean param) { + ChatConfigManager.showReadStatus = param; + LogUtils.i("初始化数据成功:"); + + } + + @Override + public void onFailed(int code) { + LogUtils.i("初始化数据失败:" + code); + + } + + @Override + public void onException(@Nullable Throwable exception) { + LogUtils.i("初始化数据异常:" + exception.getMessage()); + + } + }); + + } + + //app总用户数 + public void setUserRank(int total, int current) { + binding.tvUserrank.setText(HtmlCompat.fromHtml(String.format(getString(R.string.apptotal_txt), total, current), HtmlCompat.FROM_HTML_MODE_LEGACY)); + } + + private void initBanner() { + + binding.banner.setBannerStyle(BannerConfig.CIRCLE_INDICATOR); + //设置图片加载器,图片加载器在下方 + binding.banner.setImageLoader(new MyLoader()); + //设置图片网址或地址的集合 + binding.banner.setImages(list_path1); + //设置轮播的动画效果,内含多种特效,可点入方法内查找后内逐一体验 + binding.banner.setBannerAnimation(com.youth.banner.Transformer.Default); + //设置轮播图的标题集合 + binding.banner.setBannerTitles(list_title1); + //设置轮播间隔时间 + binding.banner.setDelayTime(3000); + //设置是否为自动轮播,默认是“是”。 + binding.banner.isAutoPlay(true); + //设置指示器的位置,小点点,左中右。 + binding.banner.setIndicatorGravity(BannerConfig.CENTER) + //以上内容都可写成链式布局,这是轮播图的监听。比较重要。方法在下面。 + .setOnBannerListener(position1 -> toAdClick(binding.banner.getContext(), list_path1.get(position1))) + //必须最后调用的方法,启动轮播图。 + .start(); + } + + private void toAdClick(Context context, AdBean s) { + MainActivity activity = (MainActivity) getActivity(); + activity.toGame(s.getJumpUrl()); + } + + //自定义的图片加载器 + private class MyLoader extends com.youth.banner.loader.ImageLoader { + @Override + public void displayImage(Context context, Object path, ImageView imageView) { + ImageLoader.loadCenterCropBanner(getActivity(), (AdBean) path, imageView, R.mipmap.ad2, R.mipmap.ad2); + + } + } + + public void startUserInfoActivity(String userid) { + XKitRouter.withKey(RouterConstant.PATH_USER_INFO_PAGE) + .withContext(getActivity()) + .withParam(RouterConstant.KEY_ACCOUNT_ID_KEY, IMKitClient.account()) + .withParam("userId", userid) + .navigate(); + } + + public void refrshUser(String account) { + CommonRepo.getUserInfo( + account, + new FetchCallback() { + @Override + public void onSuccess(@Nullable UserInfo param) { + if (param != null) { + updateUI(param); + } + } + + @Override + public void onFailed(int code) { + ToastX.showShortToast(R.string.user_fail); + updateUI(new UserInfo(account, account, "")); + } + + @Override + public void onException(@Nullable Throwable exception) { + ToastX.showShortToast(R.string.user_fail); + updateUI(new UserInfo(account, account, "")); + } + }); + } + + private void updateUI(UserInfo userInfo) { + String name = + TextUtils.isEmpty(userInfo.getName()) ? userInfo.getAccount() : userInfo.getName(); + String avaterurl = userInfo.getAvatar(); + if (TextUtils.isEmpty(avaterurl)) { + binding.avIndexfraHead.setData( + R.mipmap.default_head_img, name, AvatarColor.avatarColor(IMKitClient.account())); + } else { + binding.avIndexfraHead.setData( + userInfo.getAvatar(), name, AvatarColor.avatarColor(IMKitClient.account())); + } + + binding.userNameTv.setText(name); + } + + + private void toTlt() { + MainActivity activity = (MainActivity) getActivity(); + activity.toTlt(); + } + + private void showDialogPay() { + + com.netease.yunxin.kit.chatkit.ui.dialog.ActionConfirmDialog actionDialog = new com.netease.yunxin.kit.chatkit.ui.dialog.ActionConfirmDialog(getActivity(), + getString(com.netease.yunxin.kit.chatkit.ui.R.string.bind_phone_des_txt1), getString(com.netease.yunxin.kit.chatkit.ui.R.string.cancel_txt), getString(com.netease.yunxin.kit.chatkit.ui.R.string.to_sett_txt)); + actionDialog.setOnToActionListener(new com.netease.yunxin.kit.chatkit.ui.dialog.ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { +// Intent intent = new Intent(getActivity(), ChangeAccoutActionActivity.class); +// intent.putExtra("type", 5); +// startActivity(intent); + Intent intent = new Intent(getActivity(), SetPayPasswordActivity.class); + startActivity(intent); + } + + @Override + public void toCancel() { + + } + }); + actionDialog.show(); + } + + + private void showDialog() { + + ActionConfirmDialog actionDialog = new ActionConfirmDialog(getActivity(), + getString(R.string.bind_phone_des_txt), getString(R.string.nobind_txt), getString(R.string.tobind_txt)); + actionDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + Intent intent = new Intent(getActivity(), ChangeAccoutActionActivity.class); + intent.putExtra("type", ChangeAccoutActionActivity.TYPE_BIND_PHONE); + startActivity(intent); + } + + @Override + public void toCancel() { + + } + }); + actionDialog.show(); + } + + + private void adList() { + Api.getInstance().adList() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>>() { + @Override + public void onSuccess(Result> feedbackResp) { + list_path1 = (ArrayList) feedbackResp.data; + list_title1 = new ArrayList<>(); + for (AdBean adBean : list_path1) { + list_title1.add(adBean.getTitle()); + } + initBanner(); + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast(msg); + + } + }); + } + + private void getNotifiesCount() { + notifyCount = 0; + String time = DataUtils.getCurrentTimeType(DataUtils.get(getActivity(), "notify_message_time_" + IMKitClient.account(), IMUIKitConfig.NOTIFY_MESSAGE_START_TIME)); + Api.getInstance().notifiesmessageCountNew(IMKitClient.account(), time) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result feedbackResp) { + LogUtils.i("获取到的错误:" + feedbackResp + "" + feedbackResp.data); + int count = feedbackResp.data.getSystemMsgCount(); + int activityMsgCount = feedbackResp.data.getActivityMsgCount(); + int msgcount = DataUtils.get(getActivity(), "activity_message_count", 0); + if (activityMsgCount > msgcount) { + DataUtils.set(getActivity(), "activity_message_count", activityMsgCount); + } + notifyCount = count + activityMsgCount; + setNotifyTotalCount(); + } + + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); +// WidgetUtils.showToast(getActivity(), msg, WidgetUtils.ToastType.ERROR); + LogUtils.i("获取到的错误:" + code + "" + msg); + } + }); + } + + @Override + public void onResume() { + super.onResume(); + getWallet(); + getNotifiesCount(); + if (verifyCount > 0) { + getNotificationUnreadCount(); + } + if (bindBean == null || (!bindBean.getPhoneBind()) || (!bindBean.getPayPasswordSet())) { + bindInfo(); + } + refrshUser(IMKitClient.account()); + } + + + int verifyCount = 0; + int notifyCount = 0; + + private void initObserver() { + //ContactObserverRepo.registerNotificationObserver(infoObserver); + NIMClient.getService(SystemMessageObserver.class).observeReceiveSystemMsg((Observer) systemMessage -> { + LogUtils.d("systemMessage==" + systemMessage); + if (systemMessage.getAttachObject() instanceof AddFriendNotify) { + AddFriendNotify addFriendNotify = (AddFriendNotify) systemMessage.getAttachObject(); + if (addFriendNotify.getEvent() == AddFriendNotify.Event.RECV_ADD_FRIEND_DIRECT) { //如果是对方直接加你为好友 + //发送消息 + Context context = IMApplication.getAppContext(); + if (context != null) { + XKitRouter.withKey(RouterConstant.PATH_CHAT_SEND_TEXT_ACTION) + .withContext(context) + .withParam( + RouterConstant.KEY_SESSION_ID, addFriendNotify.getAccount()) + .withParam( + RouterConstant.KEY_SESSION_TYPE, + SessionTypeEnum.P2P.getValue()) + .withParam( + RouterConstant.KEY_MESSAGE_CONTENT, + context.getResources().getString(com.netease.yunxin.kit.contactkit.ui.R.string.verify_agree_message_text)) + .navigate(); + } + + } + + } + getNotificationUnreadCount(); + + + }, true); + getNotificationUnreadCount(); + } + + public void getNotificationUnreadCount() { + ContactRepo.getNotificationUnreadCount(new FetchCallback() { + @Override + public void onSuccess(@Nullable Integer integer) { + verifyCount = integer; + setNotifyTotalCount(); + + } + + @Override + public void onFailed(int i) { + + } + + @Override + public void onException(@Nullable Throwable throwable) { + + } + }); + } + + public void setNotifyTotalCount() { + int notifyTotalCount = notifyCount + verifyCount; + if (notifyTotalCount > 0) { + binding.viewChatfmFrinedspoint.setVisibility(View.VISIBLE); + binding.viewChatfmFrinedspoint.setText("" + notifyTotalCount); + } else { + binding.viewChatfmFrinedspoint.setVisibility(View.GONE); + } + } + + private void destoryObserver() { + NIMClient.getService(SystemMessageObserver.class).observeReceiveSystemMsg((Observer) systemMessage -> { + }, false); + } + + private void bindInfo() { + Api.getInstance().bindInfo(IMKitClient.account()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + bindBean = feedbackResp.data; + LogUtils.i("获取到的数据:" + GsonUtils.beanToJSONString(bindBean)); + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + } + }); + + } + + private void getWallet() { + Api.getInstance().walletInfo(IMKitClient.account()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + + @Override + public void onSuccess(Result feedbackResp) { + try { + + + walletBean = feedbackResp.data; + changeInfo(); + MainActivity mainActivity = (MainActivity) getActivity(); + mainActivity.changeWallet(walletBean); + binding.refreshLayout.finishRefresh(); + } catch (Exception e) { + + } + } + + @Override + public void onError(int code, String msg) { + binding.refreshLayout.finishRefresh(); + } + }); + + + } + + public void getUserRank() { + Api.getInstance().getUserRank() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + + @Override + public void onSuccess(Result feedbackResp) { + binding.refreshLayout.finishRefresh(); + if (feedbackResp.data != null) { + setUserRank(feedbackResp.data.getTotal(), feedbackResp.data.getCurrent()); + } + } + + @Override + public void onError(int code, String msg) { + binding.refreshLayout.finishRefresh(); + } + }); + } + + + private void changeInfo() { + if (walletBean != null) { + binding.jinbiTv.setText(AppUtils.getQian(walletBean.getGoldCoin())); + binding.yinbiTv.setText(AppUtils.getQian(walletBean.getSilverCoin())); + binding.tongbiTv.setText(AppUtils.getQian(walletBean.getGiftCoin() * 100)); + } + + } + + + @Override + public void onDestroyView() { + destoryObserver(); + super.onDestroyView(); + } + + + private void animateIn() { + Animation animation = AnimationUtils.loadAnimation(getActivity(), R.anim.in_anim); + animation.setAnimationListener(new Animation.AnimationListener() { + @Override + public void onAnimationStart(Animation animation) { + //To change body of implemented methods use File | Settings | File Templates. + binding.robitRy.setVisibility(View.VISIBLE); + new Handler().postDelayed(() -> { + binding.robitRy.setBackgroundResource(R.mipmap.robit_bg); + }, 400); //延迟12秒执行 + + } + + @Override + public void onAnimationEnd(Animation animation) { + } + + @Override + public void onAnimationRepeat(Animation animation) { + //To change body of implemented methods use File | Settings | File Templates. + } + }); + binding.robitRy.startAnimation(animation); + } + + + private void animateOut() { + Animation animation = AnimationUtils.loadAnimation(getActivity(), R.anim.out_anim); + animation.setAnimationListener(new Animation.AnimationListener() { + @Override + public void onAnimationStart(Animation animation) { + //To change body of implemented methods use File | Settings | File Templates. + } + + @Override + public void onAnimationEnd(Animation animation) { + binding.robitRy.setVisibility(View.GONE); + + } + + @Override + public void onAnimationRepeat(Animation animation) { + //To change body of implemented methods use File | Settings | File Templates. + } + }); + binding.robitRy.startAnimation(animation); + } + +} diff --git a/app/src/main/java/com/dskj/rbchat/main/index/AiChatActivity.java b/app/src/main/java/com/dskj/rbchat/main/index/AiChatActivity.java new file mode 100644 index 0000000..b9c9dc4 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/index/AiChatActivity.java @@ -0,0 +1,390 @@ +package com.dskj.rbchat.main.index; + +import static android.widget.RelativeLayout.ALIGN_PARENT_END; +import static android.widget.RelativeLayout.ALIGN_PARENT_START; + +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.text.TextUtils; +import android.util.JsonWriter; +import android.util.Log; +import android.view.View; +import android.view.ViewGroup; +import android.view.inputmethod.EditorInfo; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.LinearLayoutManager; + +import com.bumptech.glide.Glide; +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.R; +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.base.LllChatBaseActivity; +import com.dskj.rbchat.databinding.ActivityAichatBinding; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.model.AiConvertBean; +import com.dskj.rbchat.model.AiMessageBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.pay.CollectionActivity; +import com.dskj.rbchat.utils.FileUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.KeyboardUtil; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.utils.ShareDateUtils; +import com.google.android.gms.common.util.JsonUtils; +import com.google.android.gms.common.util.SharedPreferencesUtils; +import com.google.gson.JsonParser; +import com.iflytek.sparkchain.core.LLM; +import com.iflytek.sparkchain.core.LLMCallbacks; +import com.iflytek.sparkchain.core.LLMError; +import com.iflytek.sparkchain.core.LLMEvent; +import com.iflytek.sparkchain.core.LLMResult; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.msg.MsgService; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.yunxin.kit.chatkit.ui.ChatKitUIConstant; +import com.netease.yunxin.kit.common.ui.utils.ToastX; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.transform.OutputKeys; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class AiChatActivity extends LllChatBaseActivity { + + ActivityAichatBinding binding; + public LLM llm; + public CommonAdapter commonAdapter; + private StringBuilder stringBuilderContent = new StringBuilder(); + private ArrayList chatMessageBeans = new ArrayList<>(); + private boolean isAichat = false; + + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = ActivityAichatBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + llm = IMApplication.getInstance().llm; + if (llm != null) { + llm.registerLLMCallbacks(new LLMCallbacks() { + @Override + public void onLLMResult(LLMResult llmResult, Object o) { + stringBuilderContent.append(llmResult.getContent()); + int status = llmResult.getStatus(); //status 为2 + if (status == 2) { + AiChatEnd(); + } + + } + + @Override + public void onLLMEvent(LLMEvent llmEvent, Object o) { + + } + + @Override + public void onLLMError(LLMError llmError, Object o) { + + } + }); + } + + initView(); + } + + @Override + public int initNavigationBarColor() { + return 0; + } + + @Override + public int initStatusBarColor() { + return 0; + } + + public void AiChatEnd() { + //結束了對話 +// dismissLoading(); + if (!TextUtils.isEmpty(stringBuilderContent.toString())) { + runOnUiThread(() -> { +// AiMessageBean bean = new AiMessageBean(replaceContent(stringBuilderContent.toString()), true); + int size = commonAdapter.getDates().size(); + AiMessageBean bean = (AiMessageBean) commonAdapter.getDates().get(size - 1); + if (!bean.isAi()) { + String value = replaceContent(stringBuilderContent.toString()); + convertContent(value, new CallbackListener() { + @Override + public void setResult(String value) { + AiMessageBean bean = new AiMessageBean(value, true); + commonAdapter.addItems(commonAdapter.getDates().size(), bean); + } + }); + } else { + String value = replaceContent(replaceContent(stringBuilderContent.toString())); + AiMessageBean finalBean = bean; + convertContent(value, new CallbackListener() { + @Override + public void setResult(String value) { + finalBean.setMessage(value); + commonAdapter.notifyDataSetChanged(); + FileUtils.writeData(AiChatActivity.this, chatMessageBeans); + stringBuilderContent.delete(0, stringBuilderContent.toString().length()); + scrollbottom(); + binding.editInputchat.setFocusable(true); + binding.editInputchat.setFocusableInTouchMode(true); + isAichat = false; + } + }); + + } + + }); + } + } + + public void scrollbottom() { + int count = commonAdapter.getItemCount(); + binding.recyclerChat.post(() -> binding.recyclerChat.scrollToPosition(count > 0 ? count - 1 : 0)); + } + + public String replaceContent(String content) { + if (content.contains("您好,我是科大讯飞研发的认知智能大模型,我的名字叫讯飞星火认知大模型。我可以和人类进行自然交流,解答问题,高效完成各领域认知智能需求。")) { + content = getString(R.string.aiintroduct_zh_txt); + return content; + } + if (content.contains("Hello, I am iFLYTEK Spark developed by iFLYTEK, and myHello, I am iFLYTEK Spark developed by iFLYTEK, and my name is iFLYTEK Spark. I can communicate with human beings naturally, answer questions, and efficiently complete the needs of cognitive intelligence in various fields.")) { + content = getString(R.string.aiintroduct_en_txt); + return content; + } + content = content.replace("科大讯飞", "小夢"); + content = content.replace("讯飞", "小夢"); + content = content.replace("讯飞", "小夢"); + content = content.replace("科大", "小夢"); + content = content.replace("iFLYTEK Spark", "XiaoMeng"); + + return content; + } + + + private void initView() { + binding.titlebarAichat.setActionTextColor(getResources().getColor(R.color.color_themeblue)); + binding.titlebarAichat.setActionText(getString(R.string.aihistory_clean)); + binding.titlebarAichat.setActionListener(view -> { + if (!isAichat) { + ActionConfirmDialog actionConfirmDialog = new ActionConfirmDialog(this, getString(R.string.aihistory_title), true); + actionConfirmDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + commonAdapter.getDates().clear(); + chatMessageBeans.clear(); + FileUtils.writeData(AiChatActivity.this, chatMessageBeans); + commonAdapter.notifyDataSetChanged(); + } + + @Override + public void toCancel() { + + + } + }); + actionConfirmDialog.show(); + } + + }); + binding.titlebarAichat.setOnBackIconClickListener(view -> onBackPressed()); + binding.titlebarAichat.setTitle(getString(R.string.ainame_txt)); + binding.editInputchat.setOnEditorActionListener( + (v, actionId, event) -> { + if (actionId == EditorInfo.IME_ACTION_SEND) { + sendText(); + } + return true; + }); + binding.recyclerChat.setLayoutManager(new LinearLayoutManager(this)); + commonAdapter = new CommonAdapter(this, R.layout.item_chatai, chatMessageBeans) { + + private TextView tvContent; + + @Override + public void convert(ViewHolder holder, AiMessageBean s, int index) { + tvContent = holder.getView(R.id.tv_chatcontent); + tvContent.setText(s.message); + RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); + if (s.isAi) { + params.addRule(ALIGN_PARENT_START); + params.setMargins(20, 20, 100, 20); + tvContent.setBackgroundResource(com.netease.yunxin.kit.chatkit.ui.R.drawable.fun_message_receive_bg); + tvContent.setTextColor(mContext.getResources().getColor(R.color.color_333333)); + } else { + params.addRule(ALIGN_PARENT_END); + params.setMargins(100, 20, 20, 20); + tvContent.setBackgroundResource(com.netease.yunxin.kit.chatkit.ui.R.drawable.fun_message_send_bg); + tvContent.setTextColor(mContext.getResources().getColor(android.R.color.black)); + } + tvContent.setLayoutParams(params); + + } + }; + + String value = FileUtils.getChatData(AiChatActivity.this); + if (!TextUtils.isEmpty(value)) { + List aiMessageBean = GsonUtils.getListFromJSON(value, AiMessageBean.class); + LogUtils.i("aimessagebean-" + aiMessageBean.size()); + if (aiMessageBean.size() == 0) { + sendHello(); + } + chatMessageBeans.addAll(aiMessageBean); + } else { + sendHello(); + } + binding.recyclerChat.setAdapter(commonAdapter); + scrollbottom(); + } + + public void sendHello() { + AiMessageBean bean = new AiMessageBean(getString(R.string.aihint_txt), true); + commonAdapter.addItems(commonAdapter.getDates().size(), bean); + FileUtils.writeData(AiChatActivity.this, chatMessageBeans); + } + + public void sendText() { + String value = binding.editInputchat.getText().toString(); + if (!TextUtils.isEmpty(value)) { + startChat(value); + binding.editInputchat.setFocusable(false); + binding.editInputchat.setFocusableInTouchMode(false); + } else { + isAichat = false; + ToastX.showShortToast("请输入聊天内容"); + } + + } + + private void startChat(String content) { + if (llm == null) { + // Log.e(TAG, "startChat failed,please setLLMConfig before!"); + return; + } + isAichat = true; + String usrInputText = content; + //Log.d(TAG, "用户输入:" + usrInputText); +// if (usrInputText.length() >= 1) +// binding.editInputchat.append("\n输入:\n " + usrInputText + "\n"); + AiMessageBean bean = new AiMessageBean(content, false); + commonAdapter.addItems(commonAdapter.getDates().size(), bean); + FileUtils.writeData(AiChatActivity.this, chatMessageBeans); + AiMessageBean bean2 = new AiMessageBean(getString(R.string.aianswer_txt), true); + commonAdapter.addItems(commonAdapter.getDates().size(), bean2); + scrollbottom(); + KeyboardUtil.hideSoftInput(this); + String myContext = "myContext"; + binding.editInputchat.setText(""); + +// showLoading(); + int ret = llm.arun(usrInputText, myContext); + if (ret != 0) { + dismissLoading(); + //Log.e(TAG, "SparkChain failed:\n" + ret); + return; + } + } + + + private void convertContent(String content, CallbackListener callbackListener) { + Api.getInstance().convertzh(1, content, "nxmfxsiggkcw1pbl", "p7UncBBNfLmq1aoajsHB2qnfiznmiMHs") + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result o) { + if (o.code == 1 && o.data != null) { + try { + String result = o.data.getConvertContent(); + callbackListener.setResult(result); + } catch (Exception e) { + callbackListener.setResult(content); + } + + } else { + callbackListener.setResult(content); + } + } + + @Override + public void onError(int code, String msg) { + callbackListener.setResult(content); + } + }); + } + + public interface CallbackListener { + void setResult(String value); + } +// private void writeData() { +// try { +//// if (chatMessageBeans.size() > 100) { //只存100条 +//// chatMessageBeans.remove(0); +//// } +// File file = new File(getFilesDir(), chatFileName); +// String jsonString = GsonUtils.beanToJSONString(chatMessageBeans); +// FileWriter fileWriter = new FileWriter(file, false); +// BufferedWriter bufferedWriter = new BufferedWriter(fileWriter); +// bufferedWriter.write(jsonString); +// bufferedWriter.close(); +// } catch (IOException e) { +// LogUtils.i(e.getMessage()); +// } +// +// } + + +// @Override +// public void onBackPressed() { +// Intent intent = new Intent(); +// intent.putExtra("update", isUpdate); +// setResult(RESULT_OK, intent); +// finish(); +//// super.onBackPressed(); +// } + + +} + + + + + diff --git a/app/src/main/java/com/dskj/rbchat/main/index/Index2Fragment.java b/app/src/main/java/com/dskj/rbchat/main/index/Index2Fragment.java new file mode 100644 index 0000000..6021db5 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/index/Index2Fragment.java @@ -0,0 +1,888 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.main.index; + +import static com.netease.yunxin.kit.chatkit.ui.fun.FunChatForwardSelectDialog.TAG; +import static com.netease.yunxin.kit.contactkit.ui.ContactConstant.LIB_TAG; +import static com.netease.yunxin.kit.contactkit.ui.selector.BaseContactSelectorActivity.DEFAULT_MAX_SELECT_COUNT; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.KEY_CONTACT_SELECTOR_MAX_COUNT; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.KEY_REQUEST_SELECTOR_NAME_ENABLE; + +import android.app.Activity; +import android.content.Intent; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; +import androidx.recyclerview.widget.LinearLayoutManager; + +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.databinding.FragmentIndex2Binding; +import com.dskj.rbchat.imkit.selector.FunContactSelectorActivity; +import com.dskj.rbchat.imkit.verify.FunVerifyListActivity; +import com.dskj.rbchat.main.MainActivity; +import com.dskj.rbchat.main.index.adapter.IndexContactAdapter; +import com.dskj.rbchat.main.index.add.AddFriendsActivity; +import com.dskj.rbchat.main.mine.setting.SettingNewActivity; +import com.dskj.rbchat.model.AiChatUpdateEvent; +import com.dskj.rbchat.model.AiMessageBean; +import com.dskj.rbchat.model.ListBeanResult; +import com.dskj.rbchat.model.TeamUpdateEvent; +import com.dskj.rbchat.model.UserUpdateEvent; +import com.dskj.rbchat.model.UsersExistBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.pay.NfcReaderActivity; +import com.dskj.rbchat.utils.AnimUtil; +import com.dskj.rbchat.utils.Constant; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.FileUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.utils.ShareDateUtils; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.msg.MsgService; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.nimlib.sdk.msg.model.RecentContact; +import com.netease.nimlib.sdk.team.model.Team; +import com.netease.yunxin.kit.alog.ALog; +import com.netease.yunxin.kit.chatkit.model.ConversationInfo; +import com.netease.yunxin.kit.chatkit.ui.common.ChatDataUtils; +import com.netease.yunxin.kit.chatkit.ui.common.RxBus; +import com.netease.yunxin.kit.chatkit.ui.fun.FunChatForwardSelectDialog; +import com.netease.yunxin.kit.common.ui.fragments.BaseFragment; +import com.netease.yunxin.kit.common.ui.utils.AvatarColor; +import com.netease.yunxin.kit.common.ui.utils.TimeFormatUtils; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.common.ui.viewmodel.FetchResult; +import com.netease.yunxin.kit.common.ui.viewmodel.LoadStatus; +import com.netease.yunxin.kit.common.ui.widgets.ContactAvatarView; +import com.netease.yunxin.kit.contactkit.ui.contact.ContactViewModel; +import com.netease.yunxin.kit.contactkit.ui.fun.search.FunSearchActivity; +import com.netease.yunxin.kit.contactkit.ui.model.BaseContactBean; +import com.netease.yunxin.kit.contactkit.ui.model.ContactFriendBean; +import com.netease.yunxin.kit.contactkit.ui.model.ContactTeamBean; +import com.netease.yunxin.kit.contactkit.ui.model.ContactVerifyInfoBean; +import com.netease.yunxin.kit.contactkit.ui.team.TeamListViewModel; +import com.netease.yunxin.kit.contactkit.ui.utils.ColorUtils; +import com.netease.yunxin.kit.contactkit.ui.verify.VerifyViewModel; +import com.netease.yunxin.kit.conversationkit.ui.TimeConversationUtils; +import com.netease.yunxin.kit.conversationkit.ui.common.ConversationConstant; +import com.netease.yunxin.kit.conversationkit.ui.model.ConversationBean; +import com.netease.yunxin.kit.conversationkit.ui.page.viewmodel.ConversationViewModel; +import com.netease.yunxin.kit.corekit.event.EventCenter; +import com.netease.yunxin.kit.corekit.event.EventNotify; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.model.UserInfo; +import com.netease.yunxin.kit.corekit.im.provider.FetchCallback; +import com.netease.yunxin.kit.corekit.im.repo.CommonRepo; +import com.netease.yunxin.kit.corekit.im.utils.RouterConstant; +import com.netease.yunxin.kit.corekit.route.XKitRouter; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +@Deprecated +//首页 特别关注,好友,群组列表 +public class Index2Fragment extends BaseFragment { + + private FragmentIndex2Binding binding; + + CommonAdapter commonAdapterReadContents; + List usersExistBeans = new ArrayList<>(); + List usersExistBeansShouQi = new ArrayList<>(); + boolean isFollowShouQi = true; + + public androidx.lifecycle.Observer>> contactFriendObserver; //联系人变更 + public androidx.lifecycle.Observer>> contactGroupObserver; //群组 + public androidx.lifecycle.Observer>> conversationObserver; //获取会话 + public androidx.lifecycle.Observer>> changeConversationObserver; //会话变更 + private Observer>> verifyObserver; + private com.netease.nimlib.sdk.Observer> teamUpdateObserver; + + //联系人,会话model + public ContactViewModel viewModelFriends; + public TeamListViewModel viewModelGroup; + public ConversationViewModel conversationViewModel; + protected VerifyViewModel verifyViewModel; + + private IndexContactAdapter teamContactAdapter; + private IndexContactAdapter friendContactAdapter; + private ActivityResultLauncher launcher; + +// private MainActivity mainActivity; + + protected final EventNotify teamUpdateEvent = + new EventNotify() { + @Override + public void onNotify(@NonNull TeamUpdateEvent teamUpdateEvent) { + //更新头像 + LogUtils.i("te"); + if (teamUpdateEvent.getTeam() != null) { + updateTeamContactData(teamUpdateEvent.getTeam()); + } + + } + + @NonNull + @Override + public String getEventType() { + return TeamUpdateEvent.EVENT_TYPE; + } + }; + protected final EventNotify stringUpdateEvent = + new EventNotify() { + @Override + public void onNotify(@NonNull AiChatUpdateEvent stringupdate) { + //更新头像 + LogUtils.i("te"); + if (!TextUtils.isEmpty(stringupdate.contentvalue)) { + binding.tvIndexfmAicontent.setText(stringupdate.contentvalue); + } else { + binding.tvIndexfmAicontent.setText(getString(R.string.aihint_txt)); + } + + } + + @NonNull + @Override + public String getEventType() { + return AiChatUpdateEvent.EVENT_TYPE; + } + }; + protected final EventNotify userupdateEvent = + new EventNotify() { + @Override + public void onNotify(@NonNull UserUpdateEvent stringupdate) { + //更新用户信息 + LogUtils.i("te"); + refrshUser(IMKitClient.account()); + + } + + @NonNull + @Override + public String getEventType() { + return UserUpdateEvent.EVENT_TYPE; + } + }; + + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + binding = FragmentIndex2Binding.inflate(inflater); + verifyViewModel = new ViewModelProvider(this).get(VerifyViewModel.class); + viewModelFriends = new ViewModelProvider(this).get(ContactViewModel.class); + viewModelGroup = new ViewModelProvider(this).get(TeamListViewModel.class); + viewModelGroup.configRoutePath(RouterConstant.PATH_FUN_CHAT_TEAM_PAGE); + conversationViewModel = new ViewModelProvider(this).get(ConversationViewModel.class); + conversationViewModel.setComparator(conversationComparator); //排序 + return binding.getRoot(); + } + + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); +// launcher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { +// if (result.getResultCode() == Activity.RESULT_OK) { +// boolean update = result.getData().getBooleanExtra("update", false); +// if (update) { +// setAichatHistory(); +// } +// } +// }); + initView(); + refrshUser(IMKitClient.account()); + EventCenter.registerEventNotify(teamUpdateEvent); + EventCenter.registerEventNotify(stringUpdateEvent); + EventCenter.registerEventNotify(userupdateEvent); + observerData(); + registerObserver(); + } + + private void observerData() { + //获取会话 +// conversationObserver = +// result -> +// { +// if (result.getLoadStatus() == LoadStatus.Success) { +// ALog.d(ConversationConstant.LIB_TAG, TAG, "DeleteLiveData, Success"); +// if (result.getData() == null) { +// return; +// } +// +// updateConversationListData(result.getData()); +// +// +// } else if (result.getLoadStatus() == LoadStatus.Finish +// && result.getType() == FetchResult.FetchType.Remove) { +// ALog.d(ConversationConstant.LIB_TAG, TAG, "DeleteLiveData, Success"); +// if (result.getData() == null) { +// return; +// } +// updateConversationListData(result.getData()); +// } +// }; + + changeConversationObserver = + result -> { + if (result.getLoadStatus() == LoadStatus.Success) { + ALog.d(ConversationConstant.LIB_TAG, TAG, "ChangeLiveData, Success"); + //更新 + if (result.getData() == null) { + return; + } + + updateConversationListData(result.getData()); + updateConversation(result.getData()); + + } else if (result.getLoadStatus() == LoadStatus.Finish + && result.getType() == FetchResult.FetchType.Remove) { + //如果会话删除 + ALog.d(ConversationConstant.LIB_TAG, TAG, "ChangeLiveData, delete"); + if (result.getData() == null) { + return; + } + updateConversationListData(result.getData()); + updateConversation(result.getData()); + } + + }; + + + contactFriendObserver = + contactBeansResult -> + { + if (contactBeansResult.getLoadStatus() == LoadStatus.Success) { + ALog.d(LIB_TAG, TAG, "contactObserver, Success"); + if (contactBeansResult.getData() != null) { + // 获取好友列表 + setFriendContactData(contactBeansResult.getData()); + } + + } else if (contactBeansResult.getLoadStatus() == LoadStatus.Finish) { + if (contactBeansResult.getType() == FetchResult.FetchType.Add + && contactBeansResult.getData() != null) { + ALog.d(LIB_TAG, TAG, "contactObserver,Add"); + + // 获取好友列表 + addFriendContactData(contactBeansResult.getData()); + + } else if (contactBeansResult.getType() == FetchResult.FetchType.Remove + && contactBeansResult.getData() != null) { + ALog.d(LIB_TAG, TAG, "contactObserver,Remove"); + + removeFriendContactData(contactBeansResult.getData()); + + + } else if (contactBeansResult.getType() == FetchResult.FetchType.Update + && contactBeansResult.getData() != null) { + ALog.d(LIB_TAG, TAG, "contactObserver,Update"); + + updateFriendContactData(contactBeansResult.getData()); + + } + } + + setFriendsNumber(); + + }; + + contactGroupObserver = groupresult -> + { + if (groupresult.getLoadStatus() == LoadStatus.Success) { + LogUtils.i("获取群"); + if (groupresult.getData() != null) { + setTeamContactData(groupresult.getData()); + } + } else if (groupresult.getLoadStatus() == LoadStatus.Finish) { + if (groupresult.getType() == FetchResult.FetchType.Add) { + LogUtils.i("新增群"); + addTeamContactData(groupresult.getData()); + } else if (groupresult.getType() == FetchResult.FetchType.Remove) { + LogUtils.i("移除群"); + removeTeamContactData(groupresult.getData()); + } + } + setTeamGroupNumber(); + }; + + + verifyObserver = listFetchResult -> { + + if (listFetchResult.getData() != null) { + verifyViewModel.getUnreadCount(new FetchCallback() { + @Override + public void onSuccess(@Nullable Integer integer) { + if (integer > 0) { + binding.viewChatfmFrinedspoint.setVisibility(View.VISIBLE); + } else { + binding.viewChatfmFrinedspoint.setVisibility(View.GONE); + } + } + + @Override + public void onFailed(int i) { + + } + + @Override + public void onException(@Nullable Throwable throwable) { + + } + }); + } + }; + viewModelFriends.fetchContactList(); + viewModelGroup.fetchTeamList(); +// conversationViewModel.fetchConversation(); + verifyViewModel.fetchVerifyList(false); + getFollow(); + } + + private boolean showAllFriends = false; + private boolean showAllTeam = false; + + public void initView() { + RxBus.getInstance().toObservable(Integer.class) + .subscribeOn(Schedulers.io()) + .unsubscribeOn(Schedulers.io()) + .subscribe(changeImageViewBean -> {//回顶部 + if (changeImageViewBean == IMUIKitConfig.CHANGE_FOLLOW_USER) { + LogUtils.i("更新一下数据不过分吧"); + getFollow(); + } + }); +// mainActivity = (MainActivity) getActivity(); + binding.ivIndexfmAihead.setData(R.mipmap.ic_logo, ""); + binding.avIndexfraHead.setOnClickListener(v -> startUserInfoActivity(IMKitClient.account())); + setAichatHistory(); + binding.layoutIndexfmAddfriends.setOnClickListener(view -> { + startaddFriends(); + }); + binding.ivIndexfmAddfriendtop.setOnClickListener(view -> { + startaddFriends(); + }); + binding.ivIndexfmNotifytop.setOnClickListener(view -> { + startActivity(new Intent(getActivity(), FunVerifyListActivity.class)); + binding.viewChatfmFrinedspoint.setVisibility(View.GONE); + }); + binding.layoutIndexfmAddgroup.setOnClickListener(view -> { + startCreateGroup(); + } + ); + binding.layoutIndexfmSearch.getRoot().setOnClickListener(view -> startActivity(new Intent(getActivity(), FunSearchActivity.class)) + ); + binding.ivIndexfmSettingtop.setOnClickListener(view -> { + startActivity(new Intent(getActivity(), SettingNewActivity.class)); +// MainActivity activity = (MainActivity) getActivity(); +// activity.toSetting(); + }); + + binding.layoutIndexfmSearch.ivCommonsearchScan.setOnClickListener(v -> { + MainActivity activity = (MainActivity) getActivity(); + activity.toScan(); + }); + + binding.saoyisaoTv.setOnClickListener(v -> { + MainActivity activity = (MainActivity) getActivity(); + activity.toScan(); + }); + + binding.zhuanzhangTv.setOnClickListener(v -> { + MainActivity activity = (MainActivity) getActivity(); + activity.toTlt(); + }); + + binding.wawajiLy.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + MainActivity activity = (MainActivity) getActivity(); + activity.toTlt(); + } + }); + + binding.fukuanTv.setOnClickListener(v -> { + MainActivity activity = (MainActivity) getActivity(); + activity.toSShop(false); + }); + +// binding.fukuanTv.setOnLongClickListener(new View.OnLongClickListener() { +// @Override +// public boolean onLongClick(View v) { +// MainActivity activity = (MainActivity) getActivity(); +// activity.toSShop(true); +// return false; +// } +// }); + binding.shoukuanTv.setOnClickListener(v -> { + MainActivity activity = (MainActivity) getActivity(); + activity.toQrcode(); + }); + + binding.tvIndexfmFriendspull.setOnClickListener(view -> { + + showAllFriends = !showAllFriends; + if (showAllFriends) { + Drawable drawable = getResources().getDrawable(R.mipmap.ic_indexfm_up); + drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); + binding.tvIndexfmFriendspull.setCompoundDrawables(null, null, drawable, null); + } else { + Drawable drawable = getResources().getDrawable(R.mipmap.ic_indexfm_down); + drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); + binding.tvIndexfmFriendspull.setCompoundDrawables(null, null, drawable, null); + } + friendContactAdapter.setShowAll(showAllFriends); + friendContactAdapter.notifyDataSetChanged(); + + }); + binding.tvIndexfmGrouppull.setOnClickListener(view -> { + showAllTeam = !showAllTeam; + if (showAllTeam) { + Drawable drawable = getResources().getDrawable(R.mipmap.ic_indexfm_up); + drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); + binding.tvIndexfmGrouppull.setCompoundDrawables(null, null, drawable, null); + } else { + Drawable drawable = getResources().getDrawable(R.mipmap.ic_indexfm_down); + drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); + binding.tvIndexfmGrouppull.setCompoundDrawables(null, null, drawable, null); + } + teamContactAdapter.setShowAll(showAllTeam); + teamContactAdapter.notifyDataSetChanged(); + + }); + + binding.layoutIndexfmAichat.setOnClickListener(view -> { + //launcher +// launcher.launch(new Intent(getActivity(), AiChatActivity.class)); + startActivity(new Intent(getActivity(), AiChatActivity.class)); + }); + + binding.tvIndexfmTbgzpull.setOnClickListener(v -> { + if (isFollowShouQi) { + commonAdapterReadContents.setDates(usersExistBeans); + Drawable drawable = getResources().getDrawable(R.mipmap.ic_indexfm_up); + drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); + binding.tvIndexfmTbgzpull.setCompoundDrawables(null, null, drawable, null); + } else { + commonAdapterReadContents.setDates(usersExistBeansShouQi); + Drawable drawable = getResources().getDrawable(R.mipmap.ic_indexfm_down); + drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); + binding.tvIndexfmTbgzpull.setCompoundDrawables(null, null, drawable, null); + } + isFollowShouQi = !isFollowShouQi; + + }); + + binding.contactfriends.setLayoutManager(new LinearLayoutManager(getActivity())); + binding.contactgroups.setLayoutManager(new LinearLayoutManager(getActivity())); + friendContactAdapter = new IndexContactAdapter(getActivity()); + teamContactAdapter = new IndexContactAdapter(getActivity()); + friendContactAdapter.setShowAll(showAllFriends); + teamContactAdapter.setShowAll(showAllTeam); + binding.contactfriends.setAdapter(friendContactAdapter); + binding.contactgroups.setAdapter(teamContactAdapter); + + usersExistBeans = ShareDateUtils.getFollowUsers(); + if (usersExistBeans == null) { + usersExistBeans = new ArrayList<>(); + usersExistBeansShouQi = new ArrayList<>(); + binding.tebieguanzhuLy.setVisibility(View.GONE); + } else { + if (usersExistBeans.size() > 3) { + usersExistBeansShouQi = usersExistBeans.subList(0, 3); + } else { + usersExistBeansShouQi = usersExistBeans; + } + binding.tebieguanzhuLy.setVisibility(View.VISIBLE); + } + initAdapterRed(); + + AnimUtil.setAnimViews(1.1f, binding.wawajiLy, binding.saoyisaoTv, binding.zhuanzhangTv, binding.fukuanTv, binding.shoukuanTv); + } + + public void setAichatHistory() { + String value = FileUtils.getChatData(getActivity()); + if (!TextUtils.isEmpty(value)) { + List aiMessageBean = GsonUtils.getListFromJSON(value, AiMessageBean.class); + LogUtils.i("aimessagebean-" + aiMessageBean.size()); + value = aiMessageBean.size() == 0 ? getString(R.string.aihint_txt) : aiMessageBean.get(aiMessageBean.size() - 1).getMessage(); + binding.tvIndexfmAicontent.setText(value); + } + } + + private void initAdapterRed() { + binding.contacttbgz.setLayoutManager(new LinearLayoutManager(getActivity())); + commonAdapterReadContents = new CommonAdapter<>(getActivity(), R.layout.follow_child_item1, usersExistBeansShouQi) { + @Override + public void convert(ViewHolder holder, UsersExistBean s, int index) { + LogUtils.i("执行了:" + GsonUtils.beanToJSONString(s)); + ContactAvatarView contactAvatarView = holder.getView(R.id.logo_iv); + ColorUtils.loadAvator(s.getAvatar(), contactAvatarView); +// contactAvatarView.setData( +// s.getAvatar(), s.getNickname(), AvatarColor.avatarColor(s.getUserId() + "")); + holder.setText(R.id.item_title_tv, s.getNickname()); + RecentContact recentContact = NIMClient.getService(MsgService.class).queryRecentContact(s.getUserId() + "", SessionTypeEnum.P2P); + + holder.getView(R.id.item_time_tv).setVisibility(View.GONE); + holder.setText(R.id.item_msg_tv, getString(R.string.nmhmylg_txt)); + if (recentContact != null) { +// if (recentContact.getUnreadCount() > 0) { +// int count = recentContact.getUnreadCount(); +// String content; +// if (count >= 100) { +// content = "99+"; +// } else { +// content = String.valueOf(count); +// } +// holder.setText(R.id.unreadTv, content); +// holder.getView(R.id.unreadTv).setVisibility(View.VISIBLE); +// } else { +// holder.getView(R.id.unreadTv).setVisibility(View.GONE); +// } + + holder.getView(R.id.item_time_tv).setVisibility(View.VISIBLE); + holder.setText(R.id.item_time_tv, TimeConversationUtils.formatMillisecond(getActivity(), recentContact.getTime())); + holder.setText(R.id.item_msg_tv, TextUtils.isEmpty(recentContact.getContent()) ? getString(R.string.nmhmylg_txt) : recentContact.getContent()); + if (recentContact.getContent().equals("[自定义消息]")) { + String bean = GsonUtils.beanToJSONString(recentContact.getAttachment()); + try { + JSONObject jsonObject = new JSONObject(bean); + switch ((int) jsonObject.get("type")) { + case 1002: + holder.setText(R.id.item_msg_tv, getString(R.string.voom_message_txt)); + break; + case 1003: + holder.setText(R.id.item_msg_tv, getString(com.netease.yunxin.kit.chatkit.ui.R.string.gerenminp_txt)); + break; + + case 1004: + holder.setText(R.id.item_msg_tv, getString(com.netease.yunxin.kit.contactkit.ui.R.string.zhuanzhang_chat_txt)); + break; + case 1005: + case 1006: + holder.setText(R.id.item_msg_tv, getString(com.netease.yunxin.kit.contactkit.ui.R.string.hongbao_chat_txt)); + break; + + } + } catch (JSONException e) { + throw new RuntimeException(e); + } + + } + } else { + holder.getView(R.id.unreadTv).setVisibility(View.GONE); + } + holder.getView(R.id.big_ly).setOnClickListener(v -> +// XKitRouter.withKey(RouterConstant.PATH_FUN_CHAT_P2P_PAGE) +// .withParam(RouterConstant.CHAT_ID_KRY, s.getUserId() + "") +// .withContext(requireActivity()) +// .navigate()); + XKitRouter.withKey(RouterConstant.PATH_FUN_USER_INFO_PAGE) + .withContext(requireActivity()) + .withParam( + "uid", + s.getUserId() + "") + .withParam("userId", s.getUserId() + "") + .withParam("isGroup", false) + .navigate()); + + } + + }; + + + binding.contacttbgz.setAdapter(commonAdapterReadContents); + + } + + + //初始化设置好友数据 + public void setFriendContactData(List list) { + friendContactAdapter.setData(list,0); + } + + public void addFriendContactData(List list) { + friendContactAdapter.addFriendDataList(list); + } + + public void removeFriendContactData(List list) { + friendContactAdapter.removeDataList(list); + } + + public void updateFriendContactData(List list) { + friendContactAdapter.updateFriendDataList(list); + } + + public void setFriendsNumber() { + if (binding != null) { + int size = friendContactAdapter.getData().size(); + if (size > 0) { + binding.tvIndexfmFriendstitle.setText(getString(R.string.haoyou_txt) + " " + size); + binding.layoutIndexfmAddfriends.setVisibility(View.GONE); + } else { + binding.layoutIndexfmAddfriends.setVisibility(View.VISIBLE); + } + binding.tvIndexfmFriendspull.setVisibility(size > 3 ? View.VISIBLE : View.GONE); + } + + } + + + //初始化设置群友数据 + public void setTeamContactData(List list) { + teamContactAdapter.setData(list,1); + } + + public void addTeamContactData(List list) { + teamContactAdapter.addTeamDataList(list); + } + + public void removeTeamContactData(List list) { + teamContactAdapter.removeDataList(list); + } + + public void updateTeamContactData(Team team) { + List teamBeans = teamContactAdapter.getData(); + for (int i = 0; i < teamBeans.size(); i++) { + ContactTeamBean teamBean = (ContactTeamBean) teamBeans.get(i); + if (teamBean.data.getId().equals(team.getId())) { + teamBean.data = team; + teamContactAdapter.updateTeamDataIconItem(teamBean, i); + + } + } + + } + + + public void setTeamGroupNumber() { + int size = teamContactAdapter.getData().size(); + if (binding != null) { + if (size > 0) { + binding.tvIndexfmGrouptitle.setText(getString(R.string.group_text) + " " + size); + binding.layoutIndexfmAddgroup.setVisibility(View.GONE); + } else { + binding.layoutIndexfmAddgroup.setVisibility(View.VISIBLE); + } + binding.tvIndexfmGrouppull.setVisibility(size > 3 ? View.VISIBLE : View.GONE); + + } + + } + + //更新会话数据 + public void updateConversationListData(List list) { + for (ConversationBean conversationBean : list) { + if (conversationBean.infoData.getFriendInfo() != null) { + friendContactAdapter.updateFriendDataContentItem(conversationBean.infoData); + } + if (conversationBean.infoData.getTeamInfo() != null) { + teamContactAdapter.updateTeamDataContentItem(conversationBean.infoData); + } + } + } + + List listFollow = new ArrayList<>(); + + //更新特别关注的会话记录 + public void updateConversation(List list) { + for (ConversationBean bean : list) { + if (bean.infoData.getFriendInfo() != null) { + listFollow.clear(); + if (isFollowShouQi) { + listFollow.addAll(usersExistBeans); + } else { + listFollow.addAll(usersExistBeansShouQi); + } + for (UsersExistBean existBean : listFollow) { + if (String.valueOf(existBean.getUserId()).equals(bean.infoData.getFriendInfo().getAccount())) { + int index = listFollow.indexOf(existBean); + if (index >= 0) { + commonAdapterReadContents.notifyItemChanged(index); + break; + } + } + } + } + + } + + } + + + public void startUserInfoActivity(String userid) { + XKitRouter.withKey(RouterConstant.PATH_USER_INFO_PAGE) + .withContext(getActivity()) + .withParam(RouterConstant.KEY_ACCOUNT_ID_KEY, IMKitClient.account()) + .withParam("userId", userid) + .navigate(); + } + + public void startCreateGroup() { + startActivity(new Intent(getActivity(), FunContactSelectorActivity.class).putExtra(KEY_CONTACT_SELECTOR_MAX_COUNT, DEFAULT_MAX_SELECT_COUNT).putExtra(KEY_REQUEST_SELECTOR_NAME_ENABLE, true)); + } + + public void startaddFriends() { + startActivity(new Intent(getActivity(), AddFriendsActivity.class)); + } + + + private Comparator conversationComparator = + (bean1, bean2) -> { + int result; + if (bean1 == null) { + result = 1; + } else if (bean2 == null) { + result = -1; + } else if (bean1.isStickTop() == bean2.isStickTop()) { + long time = bean1.getTime() - bean2.getTime(); + result = time == 0L ? 0 : (time > 0 ? -1 : 1); + + } else { + result = bean1.isStickTop() ? -1 : 1; + } + ALog.d(ConversationConstant.LIB_TAG, TAG, "conversationComparator, result:" + result); + return result; + }; + + + public void refrshUser(String account) { + CommonRepo.getUserInfo( + account, + new FetchCallback() { + @Override + public void onSuccess(@Nullable UserInfo param) { + if (param != null) { + updateUI(param); + } + } + + @Override + public void onFailed(int code) { + ToastX.showShortToast(R.string.user_fail); + updateUI(new UserInfo(account, account, "")); + } + + @Override + public void onException(@Nullable Throwable exception) { + ToastX.showShortToast(R.string.user_fail); + updateUI(new UserInfo(account, account, "")); + } + }); + } + + private void updateUI(UserInfo userInfo) { + String name = + TextUtils.isEmpty(userInfo.getName()) ? userInfo.getAccount() : userInfo.getName(); + String avaterurl = userInfo.getAvatar(); + if (TextUtils.isEmpty(avaterurl)) { + binding.avIndexfraHead.setData( + R.mipmap.default_head_img, name, AvatarColor.avatarColor(IMKitClient.account())); + } else { + binding.avIndexfraHead.setData( + userInfo.getAvatar(), name, AvatarColor.avatarColor(IMKitClient.account())); + } + +// binding.tvIndexfraNick.setText(name); +// binding.tvIndexfraId.setText("CHEATID:" + IMKitClient.account()); + } + +// @Override +// public void onResume() { +// super.onResume(); +// ALog.d(Constant.PROJECT_TAG, "MineFragment:onResume"); +// refrshUser(IMKitClient.account()); +// } + + private void getFollow() { + Api.getInstance().followList() + .subscribeOn(io.reactivex.schedulers.Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result> feedbackResp) { + LogUtils.i("获取到的列表111111:" + GsonUtils.beanToJSONString(feedbackResp)); + if (feedbackResp.data != null && feedbackResp.data.getList() != null && feedbackResp.data.getList().size() > 0) { + usersExistBeans = feedbackResp.data.getList(); + DataUtils.set(getActivity(), IMUIKitConfig.FOLLOW_USER_TAG + "_" + IMKitClient.account(), GsonUtils.beanToJSONString(usersExistBeans)); + ChatDataUtils.set(getActivity(), "follow_user" + "_" + IMKitClient.account(), GsonUtils.beanToJSONString(usersExistBeans)); + + if (usersExistBeans.size() > 3) { + usersExistBeansShouQi = usersExistBeans.subList(0, 3); + } else { + usersExistBeansShouQi = usersExistBeans; + } + if (isFollowShouQi) { + commonAdapterReadContents.setDates(usersExistBeansShouQi); + } else { + commonAdapterReadContents.setDates(usersExistBeans); + } + binding.tvIndexfmTbgzpull.setVisibility(usersExistBeans.size() > 3 ? View.VISIBLE : View.GONE); + binding.tebieguanzhuLy.setVisibility(View.VISIBLE); + binding.tvIndexfmTbgztitle.setText(getActivity().getResources().getString(R.string.tebiezhuanzhu_txt) + " " + usersExistBeans.size()); + } else { + binding.tebieguanzhuLy.setVisibility(View.GONE); + } + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + binding.tebieguanzhuLy.setVisibility(View.GONE); + + } + }); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + unregisterObserver(); + EventCenter.unregisterEventNotify(teamUpdateEvent); + EventCenter.unregisterEventNotify(stringUpdateEvent); + EventCenter.unregisterEventNotify(userupdateEvent); + } + + private void registerObserver() { + viewModelFriends.getContactLiveData().observeForever(contactFriendObserver); + viewModelGroup.getFetchResult().observeForever(contactGroupObserver); +// conversationViewModel.getQueryLiveData().observeForever(conversationObserver); + conversationViewModel.getChangeLiveData().observeForever(changeConversationObserver); + verifyViewModel.getFetchResult().observeForever(verifyObserver); + } + + public void unregisterObserver() { + viewModelFriends.getContactLiveData().removeObserver(contactFriendObserver); + viewModelGroup.getFetchResult().removeObserver(contactGroupObserver); +// conversationViewModel.getQueryLiveData().removeObserver(conversationObserver); + conversationViewModel.getChangeLiveData().observeForever(changeConversationObserver); + verifyViewModel.getFetchResult().observeForever(verifyObserver); + + } +} diff --git a/app/src/main/java/com/dskj/rbchat/main/index/Index2FragmentBf.java b/app/src/main/java/com/dskj/rbchat/main/index/Index2FragmentBf.java new file mode 100644 index 0000000..f0d8f2f --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/index/Index2FragmentBf.java @@ -0,0 +1,875 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.main.index; + +import static com.netease.yunxin.kit.chatkit.ui.fun.FunChatForwardSelectDialog.TAG; +import static com.netease.yunxin.kit.contactkit.ui.ContactConstant.LIB_TAG; +import static com.netease.yunxin.kit.contactkit.ui.selector.BaseContactSelectorActivity.DEFAULT_MAX_SELECT_COUNT; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.KEY_CONTACT_SELECTOR_MAX_COUNT; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.KEY_REQUEST_SELECTOR_NAME_ENABLE; + +import android.content.Intent; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; +import androidx.recyclerview.widget.LinearLayoutManager; + +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.databinding.FragmentIndex2BfBinding; +import com.dskj.rbchat.databinding.FragmentIndex2Binding; +import com.dskj.rbchat.imkit.selector.FunContactSelectorActivity; +import com.dskj.rbchat.imkit.verify.FunVerifyListActivity; +import com.dskj.rbchat.main.MainActivity; +import com.dskj.rbchat.main.index.adapter.IndexContactAdapter; +import com.dskj.rbchat.main.index.add.AddFriendsActivity; +import com.dskj.rbchat.main.mine.setting.SettingNewActivity; +import com.dskj.rbchat.model.AiChatUpdateEvent; +import com.dskj.rbchat.model.AiMessageBean; +import com.dskj.rbchat.model.ListBeanResult; +import com.dskj.rbchat.model.TeamUpdateEvent; +import com.dskj.rbchat.model.UserUpdateEvent; +import com.dskj.rbchat.model.UsersExistBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.AnimUtil; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.FileUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.utils.ShareDateUtils; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.msg.MsgService; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.nimlib.sdk.msg.model.RecentContact; +import com.netease.nimlib.sdk.team.model.Team; +import com.netease.yunxin.kit.alog.ALog; +import com.netease.yunxin.kit.chatkit.model.ConversationInfo; +import com.netease.yunxin.kit.chatkit.ui.common.ChatDataUtils; +import com.netease.yunxin.kit.chatkit.ui.common.RxBus; +import com.netease.yunxin.kit.common.ui.fragments.BaseFragment; +import com.netease.yunxin.kit.common.ui.utils.AvatarColor; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.common.ui.viewmodel.FetchResult; +import com.netease.yunxin.kit.common.ui.viewmodel.LoadStatus; +import com.netease.yunxin.kit.common.ui.widgets.ContactAvatarView; +import com.netease.yunxin.kit.contactkit.ui.contact.ContactViewModel; +import com.netease.yunxin.kit.contactkit.ui.fun.search.FunSearchActivity; +import com.netease.yunxin.kit.contactkit.ui.model.BaseContactBean; +import com.netease.yunxin.kit.contactkit.ui.model.ContactFriendBean; +import com.netease.yunxin.kit.contactkit.ui.model.ContactTeamBean; +import com.netease.yunxin.kit.contactkit.ui.model.ContactVerifyInfoBean; +import com.netease.yunxin.kit.contactkit.ui.team.TeamListViewModel; +import com.netease.yunxin.kit.contactkit.ui.utils.ColorUtils; +import com.netease.yunxin.kit.contactkit.ui.verify.VerifyViewModel; +import com.netease.yunxin.kit.conversationkit.ui.TimeConversationUtils; +import com.netease.yunxin.kit.conversationkit.ui.common.ConversationConstant; +import com.netease.yunxin.kit.conversationkit.ui.model.ConversationBean; +import com.netease.yunxin.kit.conversationkit.ui.page.viewmodel.ConversationViewModel; +import com.netease.yunxin.kit.corekit.event.EventCenter; +import com.netease.yunxin.kit.corekit.event.EventNotify; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.model.UserInfo; +import com.netease.yunxin.kit.corekit.im.provider.FetchCallback; +import com.netease.yunxin.kit.corekit.im.repo.CommonRepo; +import com.netease.yunxin.kit.corekit.im.utils.RouterConstant; +import com.netease.yunxin.kit.corekit.route.XKitRouter; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +@Deprecated +//首页 特别关注,好友,群组列表 +public class Index2FragmentBf extends BaseFragment { + + private FragmentIndex2BfBinding binding; + + CommonAdapter commonAdapterReadContents; + List usersExistBeans = new ArrayList<>(); + List usersExistBeansShouQi = new ArrayList<>(); + boolean isFollowShouQi = true; + + public Observer>> contactFriendObserver; //联系人变更 + public Observer>> contactGroupObserver; //群组 + public Observer>> conversationObserver; //获取会话 + public Observer>> changeConversationObserver; //会话变更 + private Observer>> verifyObserver; + private com.netease.nimlib.sdk.Observer> teamUpdateObserver; + + //联系人,会话model + public ContactViewModel viewModelFriends; + public TeamListViewModel viewModelGroup; + public ConversationViewModel conversationViewModel; + protected VerifyViewModel verifyViewModel; + + private IndexContactAdapter teamContactAdapter; + private IndexContactAdapter friendContactAdapter; + private ActivityResultLauncher launcher; + +// private MainActivity mainActivity; + + protected final EventNotify teamUpdateEvent = + new EventNotify() { + @Override + public void onNotify(@NonNull TeamUpdateEvent teamUpdateEvent) { + //更新头像 + LogUtils.i("te"); + if (teamUpdateEvent.getTeam() != null) { + updateTeamContactData(teamUpdateEvent.getTeam()); + } + + } + + @NonNull + @Override + public String getEventType() { + return TeamUpdateEvent.EVENT_TYPE; + } + }; + protected final EventNotify stringUpdateEvent = + new EventNotify() { + @Override + public void onNotify(@NonNull AiChatUpdateEvent stringupdate) { + //更新头像 + LogUtils.i("te"); + if (!TextUtils.isEmpty(stringupdate.contentvalue)) { + binding.tvIndexfmAicontent.setText(stringupdate.contentvalue); + } else { + binding.tvIndexfmAicontent.setText(getString(R.string.aihint_txt)); + } + + } + + @NonNull + @Override + public String getEventType() { + return AiChatUpdateEvent.EVENT_TYPE; + } + }; + protected final EventNotify userupdateEvent = + new EventNotify() { + @Override + public void onNotify(@NonNull UserUpdateEvent stringupdate) { + //更新用户信息 + LogUtils.i("te"); + refrshUser(IMKitClient.account()); + + } + + @NonNull + @Override + public String getEventType() { + return UserUpdateEvent.EVENT_TYPE; + } + }; + + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + binding = FragmentIndex2BfBinding.inflate(inflater); + verifyViewModel = new ViewModelProvider(this).get(VerifyViewModel.class); + viewModelFriends = new ViewModelProvider(this).get(ContactViewModel.class); + viewModelGroup = new ViewModelProvider(this).get(TeamListViewModel.class); + viewModelGroup.configRoutePath(RouterConstant.PATH_FUN_CHAT_TEAM_PAGE); + conversationViewModel = new ViewModelProvider(this).get(ConversationViewModel.class); + conversationViewModel.setComparator(conversationComparator); //排序 + return binding.getRoot(); + } + + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); +// launcher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { +// if (result.getResultCode() == Activity.RESULT_OK) { +// boolean update = result.getData().getBooleanExtra("update", false); +// if (update) { +// setAichatHistory(); +// } +// } +// }); + initView(); + refrshUser(IMKitClient.account()); + EventCenter.registerEventNotify(teamUpdateEvent); + EventCenter.registerEventNotify(stringUpdateEvent); + EventCenter.registerEventNotify(userupdateEvent); + observerData(); + registerObserver(); + } + + private void observerData() { + //获取会话 +// conversationObserver = +// result -> +// { +// if (result.getLoadStatus() == LoadStatus.Success) { +// ALog.d(ConversationConstant.LIB_TAG, TAG, "DeleteLiveData, Success"); +// if (result.getData() == null) { +// return; +// } +// +// updateConversationListData(result.getData()); +// +// +// } else if (result.getLoadStatus() == LoadStatus.Finish +// && result.getType() == FetchResult.FetchType.Remove) { +// ALog.d(ConversationConstant.LIB_TAG, TAG, "DeleteLiveData, Success"); +// if (result.getData() == null) { +// return; +// } +// updateConversationListData(result.getData()); +// } +// }; + + changeConversationObserver = + result -> { + if (result.getLoadStatus() == LoadStatus.Success) { + ALog.d(ConversationConstant.LIB_TAG, TAG, "ChangeLiveData, Success"); + //更新 + if (result.getData() == null) { + return; + } + + updateConversationListData(result.getData()); + updateConversation(result.getData()); + + } else if (result.getLoadStatus() == LoadStatus.Finish + && result.getType() == FetchResult.FetchType.Remove) { + //如果会话删除 + ALog.d(ConversationConstant.LIB_TAG, TAG, "ChangeLiveData, delete"); + if (result.getData() == null) { + return; + } + updateConversationListData(result.getData()); + updateConversation(result.getData()); + } + + }; + + + contactFriendObserver = + contactBeansResult -> + { + if (contactBeansResult.getLoadStatus() == LoadStatus.Success) { + ALog.d(LIB_TAG, TAG, "contactObserver, Success"); + if (contactBeansResult.getData() != null) { + // 获取好友列表 + setFriendContactData(contactBeansResult.getData()); + } + + } else if (contactBeansResult.getLoadStatus() == LoadStatus.Finish) { + if (contactBeansResult.getType() == FetchResult.FetchType.Add + && contactBeansResult.getData() != null) { + ALog.d(LIB_TAG, TAG, "contactObserver,Add"); + + // 获取好友列表 + addFriendContactData(contactBeansResult.getData()); + + } else if (contactBeansResult.getType() == FetchResult.FetchType.Remove + && contactBeansResult.getData() != null) { + ALog.d(LIB_TAG, TAG, "contactObserver,Remove"); + + removeFriendContactData(contactBeansResult.getData()); + + + } else if (contactBeansResult.getType() == FetchResult.FetchType.Update + && contactBeansResult.getData() != null) { + ALog.d(LIB_TAG, TAG, "contactObserver,Update"); + + updateFriendContactData(contactBeansResult.getData()); + + } + } + + setFriendsNumber(); + + }; + + contactGroupObserver = groupresult -> + { + if (groupresult.getLoadStatus() == LoadStatus.Success) { + LogUtils.i("获取群"); + if (groupresult.getData() != null) { + setTeamContactData(groupresult.getData()); + } + } else if (groupresult.getLoadStatus() == LoadStatus.Finish) { + if (groupresult.getType() == FetchResult.FetchType.Add) { + LogUtils.i("新增群"); + addTeamContactData(groupresult.getData()); + } else if (groupresult.getType() == FetchResult.FetchType.Remove) { + LogUtils.i("移除群"); + removeTeamContactData(groupresult.getData()); + } + } + setTeamGroupNumber(); + }; + + + + verifyObserver = listFetchResult -> { + + if (listFetchResult.getData() != null) { + verifyViewModel.getUnreadCount(new FetchCallback() { + @Override + public void onSuccess(@Nullable Integer integer) { + if (integer > 0) { + binding.viewChatfmFrinedspoint.setVisibility(View.VISIBLE); + } else { + binding.viewChatfmFrinedspoint.setVisibility(View.GONE); + } + } + + @Override + public void onFailed(int i) { + + } + + @Override + public void onException(@Nullable Throwable throwable) { + + } + }); + } + }; + viewModelFriends.fetchContactList(); + viewModelGroup.fetchTeamList(); +// conversationViewModel.fetchConversation(); + verifyViewModel.fetchVerifyList(false); + getFollow(); + } + + private boolean showAllFriends = false; + private boolean showAllTeam = false; + + public void initView() { + RxBus.getInstance().toObservable(Integer.class) + .subscribeOn(Schedulers.io()) + .unsubscribeOn(Schedulers.io()) + .subscribe(changeImageViewBean -> {//回顶部 + if (changeImageViewBean == IMUIKitConfig.CHANGE_FOLLOW_USER) { + LogUtils.i("更新一下数据不过分吧"); + getFollow(); + } + }); +// mainActivity = (MainActivity) getActivity(); + binding.ivIndexfmAihead.setData(R.mipmap.ic_logo, ""); + binding.avIndexfraHead.setOnClickListener(v -> startUserInfoActivity(IMKitClient.account())); + setAichatHistory(); + binding.layoutIndexfmAddfriends.setOnClickListener(view -> { + startaddFriends(); + }); + binding.ivIndexfmAddfriendtop.setOnClickListener(view -> { + startaddFriends(); + }); + binding.ivIndexfmNotifytop.setOnClickListener(view -> { + startActivity(new Intent(getActivity(), FunVerifyListActivity.class)); + binding.viewChatfmFrinedspoint.setVisibility(View.GONE); + }); + binding.layoutIndexfmAddgroup.setOnClickListener(view -> { + startCreateGroup(); + } + ); + binding.layoutIndexfmSearch.getRoot().setOnClickListener(view -> startActivity(new Intent(getActivity(), FunSearchActivity.class)) + ); + binding.ivIndexfmSettingtop.setOnClickListener(view -> { + startActivity(new Intent(getActivity(), SettingNewActivity.class)); +// MainActivity activity = (MainActivity) getActivity(); +// activity.toSetting(); + }); + + binding.layoutIndexfmSearch.ivCommonsearchScan.setOnClickListener(v -> { + MainActivity activity = (MainActivity) getActivity(); + activity.toScan(); + }); + + binding.saoyisaoTv.setOnClickListener(v -> { + MainActivity activity = (MainActivity) getActivity(); + activity.toScan(); + }); + + binding.zhuanzhangTv.setOnClickListener(v -> { + MainActivity activity = (MainActivity) getActivity(); + activity.toWalletAction(MainActivity.TYPE_TRANSFER); + }); + + + binding.fukuanTv.setOnClickListener(v -> { + MainActivity activity = (MainActivity) getActivity(); + activity.toWalletAction(MainActivity.TYPE_PAYMENT); + }); + + + binding.shoukuanTv.setOnClickListener(v -> { + MainActivity activity = (MainActivity) getActivity(); + activity.toWalletAction(MainActivity.TYPE_PAYMENT_COLLECTION); + }); + + binding.tvIndexfmFriendspull.setOnClickListener(view -> { + + showAllFriends = !showAllFriends; + if (showAllFriends) { + Drawable drawable = getResources().getDrawable(R.mipmap.ic_indexfm_up); + drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); + binding.tvIndexfmFriendspull.setCompoundDrawables(null, null, drawable, null); + } else { + Drawable drawable = getResources().getDrawable(R.mipmap.ic_indexfm_down); + drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); + binding.tvIndexfmFriendspull.setCompoundDrawables(null, null, drawable, null); + } + friendContactAdapter.setShowAll(showAllFriends); + friendContactAdapter.notifyDataSetChanged(); + + }); + binding.tvIndexfmGrouppull.setOnClickListener(view -> { + showAllTeam = !showAllTeam; + if (showAllTeam) { + Drawable drawable = getResources().getDrawable(R.mipmap.ic_indexfm_down); + drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); + binding.tvIndexfmGrouppull.setCompoundDrawables(null, null, drawable, null); + } else { + Drawable drawable = getResources().getDrawable(R.mipmap.ic_indexfm_up); + drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); + binding.tvIndexfmGrouppull.setCompoundDrawables(null, null, drawable, null); + } + teamContactAdapter.setShowAll(showAllTeam); + teamContactAdapter.notifyDataSetChanged(); + + }); + + binding.layoutIndexfmAichat.setOnClickListener(view -> { + //launcher +// launcher.launch(new Intent(getActivity(), AiChatActivity.class)); + startActivity(new Intent(getActivity(), AiChatActivity.class)); + }); + + binding.tvIndexfmTbgzpull.setOnClickListener(v -> { + if (isFollowShouQi) { + commonAdapterReadContents.setDates(usersExistBeans); + Drawable drawable = getResources().getDrawable(R.mipmap.ic_indexfm_up); + drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); + binding.tvIndexfmTbgzpull.setCompoundDrawables(null, null, drawable, null); + } else { + commonAdapterReadContents.setDates(usersExistBeansShouQi); + Drawable drawable = getResources().getDrawable(R.mipmap.ic_indexfm_down); + drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); + binding.tvIndexfmTbgzpull.setCompoundDrawables(null, null, drawable, null); + } + isFollowShouQi = !isFollowShouQi; + + }); + + binding.contactfriends.setLayoutManager(new LinearLayoutManager(getActivity())); + binding.contactgroups.setLayoutManager(new LinearLayoutManager(getActivity())); + friendContactAdapter = new IndexContactAdapter(getActivity()); + teamContactAdapter = new IndexContactAdapter(getActivity()); + friendContactAdapter.setShowAll(showAllFriends); + teamContactAdapter.setShowAll(showAllTeam); + binding.contactfriends.setAdapter(friendContactAdapter); + binding.contactgroups.setAdapter(teamContactAdapter); + + usersExistBeans = ShareDateUtils.getFollowUsers(); + if (usersExistBeans == null) { + usersExistBeans = new ArrayList<>(); + usersExistBeansShouQi = new ArrayList<>(); + binding.tebieguanzhuLy.setVisibility(View.GONE); + } else { + if (usersExistBeans.size() > 3) { + usersExistBeansShouQi = usersExistBeans.subList(0, 3); + } else { + usersExistBeansShouQi = usersExistBeans; + } + binding.tebieguanzhuLy.setVisibility(View.VISIBLE); + } + initAdapterRed(); + + binding.taoletingTv.setOnClickListener(v -> { + MainActivity activity = (MainActivity) getActivity(); + activity.toTlt(); + }); + binding.yinbiShopTv.setOnClickListener(v -> { + MainActivity activity = (MainActivity) getActivity(); + activity.toSShop(false); + }); + + AnimUtil.setAnimViews(1.1f, binding.taoletingTv, binding.saoyisaoTv, binding.zhuanzhangTv, binding.fukuanTv, binding.yinbiShopTv, binding.shoukuanTv); + } + + public void setAichatHistory() { + String value = FileUtils.getChatData(getActivity()); + if (!TextUtils.isEmpty(value)) { + List aiMessageBean = GsonUtils.getListFromJSON(value, AiMessageBean.class); + LogUtils.i("aimessagebean-" + aiMessageBean.size()); + value = aiMessageBean.size() == 0 ? getString(R.string.aihint_txt) : aiMessageBean.get(aiMessageBean.size() - 1).getMessage(); + binding.tvIndexfmAicontent.setText(value); + } + } + + private void initAdapterRed() { + binding.contacttbgz.setLayoutManager(new LinearLayoutManager(getActivity())); + commonAdapterReadContents = new CommonAdapter<>(getActivity(), R.layout.follow_child_item1, usersExistBeansShouQi) { + @Override + public void convert(ViewHolder holder, UsersExistBean s, int index) { + LogUtils.i("执行了:" + GsonUtils.beanToJSONString(s)); + ContactAvatarView contactAvatarView = holder.getView(R.id.logo_iv); + ColorUtils.loadAvator(s.getAvatar(), contactAvatarView); +// contactAvatarView.setData( +// s.getAvatar(), s.getNickname(), AvatarColor.avatarColor(s.getUserId() + "")); + holder.setText(R.id.item_title_tv, s.getNickname()); + RecentContact recentContact = NIMClient.getService(MsgService.class).queryRecentContact(s.getUserId() + "", SessionTypeEnum.P2P); + + holder.getView(R.id.item_time_tv).setVisibility(View.GONE); + holder.setText(R.id.item_msg_tv, getString(R.string.nmhmylg_txt)); + if (recentContact != null) { +// if (recentContact.getUnreadCount() > 0) { +// int count = recentContact.getUnreadCount(); +// String content; +// if (count >= 100) { +// content = "99+"; +// } else { +// content = String.valueOf(count); +// } +// holder.setText(R.id.unreadTv, content); +// holder.getView(R.id.unreadTv).setVisibility(View.VISIBLE); +// } else { +// holder.getView(R.id.unreadTv).setVisibility(View.GONE); +// } + + holder.getView(R.id.item_time_tv).setVisibility(View.VISIBLE); + holder.setText(R.id.item_time_tv, TimeConversationUtils.formatMillisecond(getActivity(), recentContact.getTime())); + holder.setText(R.id.item_msg_tv, TextUtils.isEmpty(recentContact.getContent()) ? getString(R.string.nmhmylg_txt) : recentContact.getContent()); + if (recentContact.getContent().equals("[自定义消息]")) { + String bean = GsonUtils.beanToJSONString(recentContact.getAttachment()); + try { + JSONObject jsonObject = new JSONObject(bean); + switch ((int) jsonObject.get("type")) { + case 1002: + holder.setText(R.id.item_msg_tv, getString(R.string.voom_message_txt)); + break; + case 1003: + holder.setText(R.id.item_msg_tv, getString(com.netease.yunxin.kit.chatkit.ui.R.string.gerenminp_txt)); + break; + + case 1004: + holder.setText(R.id.item_msg_tv, getString(com.netease.yunxin.kit.contactkit.ui.R.string.zhuanzhang_chat_txt)); + break; + case 1005: + case 1006: + holder.setText(R.id.item_msg_tv, getString(com.netease.yunxin.kit.contactkit.ui.R.string.hongbao_chat_txt)); + break; + + } + } catch (JSONException e) { + throw new RuntimeException(e); + } + + } + } else { + holder.getView(R.id.unreadTv).setVisibility(View.GONE); + } + holder.getView(R.id.big_ly).setOnClickListener(v -> +// XKitRouter.withKey(RouterConstant.PATH_FUN_CHAT_P2P_PAGE) +// .withParam(RouterConstant.CHAT_ID_KRY, s.getUserId() + "") +// .withContext(requireActivity()) +// .navigate()); + XKitRouter.withKey(RouterConstant.PATH_FUN_USER_INFO_PAGE) + .withContext(requireActivity()) + .withParam( + "uid", + s.getUserId() + "") + .withParam("userId", s.getUserId() + "") + .withParam("isGroup", false) + .navigate()); + + } + + }; + + + binding.contacttbgz.setAdapter(commonAdapterReadContents); + + } + + + //初始化设置好友数据 + public void setFriendContactData(List list) { + friendContactAdapter.setData(list,0); + } + + public void addFriendContactData(List list) { + friendContactAdapter.addFriendDataList(list); + } + + public void removeFriendContactData(List list) { + friendContactAdapter.removeDataList(list); + } + + public void updateFriendContactData(List list) { + friendContactAdapter.updateFriendDataList(list); + } + + public void setFriendsNumber() { + if (binding != null) { + int size = friendContactAdapter.getData().size(); + binding.tvIndexfmFriendspull.setText(size + ""); + if (size > 0) { + binding.layoutIndexfmAddfriends.setVisibility(View.GONE); + } else { + binding.layoutIndexfmAddfriends.setVisibility(View.VISIBLE); + } + } + + } + + + //初始化设置群友数据 + public void setTeamContactData(List list) { + teamContactAdapter.setData(list,1); + } + + public void addTeamContactData(List list) { + teamContactAdapter.addTeamDataList(list); + } + + public void removeTeamContactData(List list) { + teamContactAdapter.removeDataList(list); + } + + public void updateTeamContactData(Team team) { + List teamBeans = teamContactAdapter.getData(); + for (int i = 0; i < teamBeans.size(); i++) { + ContactTeamBean teamBean = (ContactTeamBean) teamBeans.get(i); + if (teamBean.data.getId().equals(team.getId())) { + teamBean.data = team; + teamContactAdapter.updateTeamDataIconItem(teamBean, i); + + } + } + + } + + + public void setTeamGroupNumber() { + int size = teamContactAdapter.getData().size(); + if (binding != null) { + binding.tvIndexfmGrouppull.setText(size + ""); + if (size > 0) { + binding.layoutIndexfmAddgroup.setVisibility(View.GONE); + } else { + binding.layoutIndexfmAddgroup.setVisibility(View.VISIBLE); + } + } + + } + + //更新会话数据 + public void updateConversationListData(List list) { + for (ConversationBean conversationBean : list) { + if (conversationBean.infoData.getFriendInfo() != null) { + friendContactAdapter.updateFriendDataContentItem(conversationBean.infoData); + } + if (conversationBean.infoData.getTeamInfo() != null) { + teamContactAdapter.updateTeamDataContentItem(conversationBean.infoData); + } + } + } + + List listFollow = new ArrayList<>(); + + //更新特别关注的会话记录 + public void updateConversation(List list) { + for (ConversationBean bean : list) { + if (bean.infoData.getFriendInfo() != null) { + listFollow.clear(); + if (isFollowShouQi) { + listFollow.addAll(usersExistBeans); + } else { + listFollow.addAll(usersExistBeansShouQi); + } + for (UsersExistBean existBean : listFollow) { + if (String.valueOf(existBean.getUserId()).equals(bean.infoData.getFriendInfo().getAccount())) { + int index = listFollow.indexOf(existBean); + if (index >= 0) { + commonAdapterReadContents.notifyItemChanged(index); + break; + } + } + } + } + + } + + } + + + public void startUserInfoActivity(String userid) { + XKitRouter.withKey(RouterConstant.PATH_USER_INFO_PAGE) + .withContext(getActivity()) + .withParam(RouterConstant.KEY_ACCOUNT_ID_KEY, IMKitClient.account()) + .withParam("userId", userid) + .navigate(); + } + + public void startCreateGroup() { + startActivity(new Intent(getActivity(), FunContactSelectorActivity.class).putExtra(KEY_CONTACT_SELECTOR_MAX_COUNT, DEFAULT_MAX_SELECT_COUNT).putExtra(KEY_REQUEST_SELECTOR_NAME_ENABLE, true)); + } + + public void startaddFriends() { + startActivity(new Intent(getActivity(), AddFriendsActivity.class)); + } + + + private Comparator conversationComparator = + (bean1, bean2) -> { + int result; + if (bean1 == null) { + result = 1; + } else if (bean2 == null) { + result = -1; + } else if (bean1.isStickTop() == bean2.isStickTop()) { + long time = bean1.getTime() - bean2.getTime(); + result = time == 0L ? 0 : (time > 0 ? -1 : 1); + + } else { + result = bean1.isStickTop() ? -1 : 1; + } + ALog.d(ConversationConstant.LIB_TAG, TAG, "conversationComparator, result:" + result); + return result; + }; + + + public void refrshUser(String account) { + CommonRepo.getUserInfo( + account, + new FetchCallback() { + @Override + public void onSuccess(@Nullable UserInfo param) { + if (param != null) { + updateUI(param); + } + } + + @Override + public void onFailed(int code) { + ToastX.showShortToast(R.string.user_fail); + updateUI(new UserInfo(account, account, "")); + } + + @Override + public void onException(@Nullable Throwable exception) { + ToastX.showShortToast(R.string.user_fail); + updateUI(new UserInfo(account, account, "")); + } + }); + } + + private void updateUI(UserInfo userInfo) { + String name = + TextUtils.isEmpty(userInfo.getName()) ? userInfo.getAccount() : userInfo.getName(); + String avaterurl = userInfo.getAvatar(); + if (TextUtils.isEmpty(avaterurl)) { + binding.avIndexfraHead.setData( + R.mipmap.default_head_img, name, AvatarColor.avatarColor(IMKitClient.account())); + } else { + binding.avIndexfraHead.setData( + userInfo.getAvatar(), name, AvatarColor.avatarColor(IMKitClient.account())); + } + +// binding.tvIndexfraNick.setText(name); +// binding.tvIndexfraId.setText("CHEATID:" + IMKitClient.account()); + } + +// @Override +// public void onResume() { +// super.onResume(); +// ALog.d(Constant.PROJECT_TAG, "MineFragment:onResume"); +// refrshUser(IMKitClient.account()); +// } + + private void getFollow() { + Api.getInstance().followList() + .subscribeOn(io.reactivex.schedulers.Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result> feedbackResp) { + LogUtils.i("获取到的列表111111:" + GsonUtils.beanToJSONString(feedbackResp)); + if (feedbackResp.data != null && feedbackResp.data.getList() != null && feedbackResp.data.getList().size() > 0) { + usersExistBeans = feedbackResp.data.getList(); + DataUtils.set(getActivity(), IMUIKitConfig.FOLLOW_USER_TAG + "_" + IMKitClient.account(), GsonUtils.beanToJSONString(usersExistBeans)); + ChatDataUtils.set(getActivity(), "follow_user" + "_" + IMKitClient.account(), GsonUtils.beanToJSONString(usersExistBeans)); + + if (usersExistBeans.size() > 3) { + usersExistBeansShouQi = usersExistBeans.subList(0, 3); + } else { + usersExistBeansShouQi = usersExistBeans; + } + if (isFollowShouQi) { + commonAdapterReadContents.setDates(usersExistBeansShouQi); + } else { + commonAdapterReadContents.setDates(usersExistBeans); + } + binding.tebieguanzhuLy.setVisibility(View.VISIBLE); + binding.tvIndexfmTbgzpull.setText(usersExistBeans.size() + ""); + + } else { + binding.tebieguanzhuLy.setVisibility(View.GONE); + } + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + binding.tebieguanzhuLy.setVisibility(View.GONE); + + } + }); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + unregisterObserver(); + EventCenter.unregisterEventNotify(teamUpdateEvent); + EventCenter.unregisterEventNotify(stringUpdateEvent); + EventCenter.unregisterEventNotify(userupdateEvent); + } + + private void registerObserver() { + viewModelFriends.getContactLiveData().observeForever(contactFriendObserver); + viewModelGroup.getFetchResult().observeForever(contactGroupObserver); +// conversationViewModel.getQueryLiveData().observeForever(conversationObserver); + conversationViewModel.getChangeLiveData().observeForever(changeConversationObserver); + verifyViewModel.getFetchResult().observeForever(verifyObserver); + } + + public void unregisterObserver() { + viewModelFriends.getContactLiveData().removeObserver(contactFriendObserver); + viewModelGroup.getFetchResult().removeObserver(contactGroupObserver); +// conversationViewModel.getQueryLiveData().removeObserver(conversationObserver); + conversationViewModel.getChangeLiveData().observeForever(changeConversationObserver); + verifyViewModel.getFetchResult().observeForever(verifyObserver); + + } +} diff --git a/app/src/main/java/com/dskj/rbchat/main/index/IndexFragment.java b/app/src/main/java/com/dskj/rbchat/main/index/IndexFragment.java new file mode 100644 index 0000000..2159f35 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/index/IndexFragment.java @@ -0,0 +1,936 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.main.index; + +import static com.netease.yunxin.kit.chatkit.ui.fun.FunChatForwardSelectDialog.TAG; +import static com.netease.yunxin.kit.contactkit.ui.ContactConstant.LIB_TAG; +import static com.netease.yunxin.kit.contactkit.ui.selector.BaseContactSelectorActivity.DEFAULT_MAX_SELECT_COUNT; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.KEY_CONTACT_SELECTOR_MAX_COUNT; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.KEY_REQUEST_SELECTOR_NAME_ENABLE; + +import android.content.Intent; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; +import androidx.recyclerview.widget.LinearLayoutManager; + +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.databinding.FragmentIndexBinding; +import com.dskj.rbchat.imkit.selector.FunContactSelectorActivity; +import com.dskj.rbchat.imkit.verify.FunVerifyListActivity; +import com.dskj.rbchat.main.MainActivity; +import com.dskj.rbchat.main.index.add.AddFriendsActivity; +import com.dskj.rbchat.main.mine.setting.SettingNewActivity; +import com.dskj.rbchat.model.ListBeanResult; +import com.dskj.rbchat.model.UsersExistBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.Constant; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.utils.ShareDateUtils; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.friend.model.MuteListChangedNotify; +import com.netease.nimlib.sdk.msg.MsgService; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.nimlib.sdk.msg.model.RecentContact; +import com.netease.nimlib.sdk.team.model.Team; +import com.netease.yunxin.kit.alog.ALog; +import com.netease.yunxin.kit.chatkit.model.ConversationInfo; +import com.netease.yunxin.kit.chatkit.ui.common.ChatDataUtils; +import com.netease.yunxin.kit.common.ui.fragments.BaseFragment; +import com.netease.yunxin.kit.common.ui.utils.AvatarColor; +import com.netease.yunxin.kit.common.ui.utils.TimeFormatUtils; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.common.ui.viewmodel.FetchResult; +import com.netease.yunxin.kit.common.ui.viewmodel.LoadStatus; +import com.netease.yunxin.kit.common.ui.widgets.ContactAvatarView; +import com.netease.yunxin.kit.contactkit.ui.contact.ContactViewModel; +import com.netease.yunxin.kit.contactkit.ui.fun.contact.FunContactDefaultFactory; +import com.netease.yunxin.kit.contactkit.ui.fun.search.FunSearchActivity; +import com.netease.yunxin.kit.contactkit.ui.fun.view.FunContactViewHolderFactory; +import com.netease.yunxin.kit.contactkit.ui.fun.view.viewholder.FunTeamListViewHolder; +import com.netease.yunxin.kit.contactkit.ui.interfaces.ContactActions; +import com.netease.yunxin.kit.contactkit.ui.model.ContactFriendBean; +import com.netease.yunxin.kit.contactkit.ui.model.ContactTeamBean; +import com.netease.yunxin.kit.contactkit.ui.model.ContactVerifyInfoBean; +import com.netease.yunxin.kit.contactkit.ui.model.IViewTypeConstant; +import com.netease.yunxin.kit.contactkit.ui.team.TeamListViewModel; +import com.netease.yunxin.kit.contactkit.ui.verify.VerifyViewModel; +import com.netease.yunxin.kit.contactkit.ui.view.ContactListView; +import com.netease.yunxin.kit.contactkit.ui.view.viewholder.BaseContactViewHolder; +import com.netease.yunxin.kit.conversationkit.ui.common.ConversationConstant; +import com.netease.yunxin.kit.conversationkit.ui.model.ConversationBean; +import com.netease.yunxin.kit.conversationkit.ui.page.viewmodel.ConversationViewModel; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.model.FriendInfo; +import com.netease.yunxin.kit.corekit.im.model.UserInfo; +import com.netease.yunxin.kit.corekit.im.provider.FetchCallback; +import com.netease.yunxin.kit.corekit.im.repo.CommonRepo; +import com.netease.yunxin.kit.corekit.im.utils.RouterConstant; +import com.netease.yunxin.kit.corekit.route.XKitRouter; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +import io.reactivex.android.schedulers.AndroidSchedulers; + +//首页 获取好友会话,好友列表,群组会话,群组列表 +@Deprecated +public class IndexFragment extends BaseFragment { + + private FragmentIndexBinding binding; + protected ContactListView contactListViewFriend; + protected ContactListView contactListViewGroup; + protected ContactViewModel viewModelFriends; + protected TeamListViewModel viewModelGroup; + protected ConversationViewModel conversationViewModel; + protected VerifyViewModel verifyViewModel; + + // protected ConversationViewModel conversationViewModel; + protected Observer>> contactObserver; + protected Observer>> userInfoObserver; + + private Observer>> changeObserver; + private Observer>> conversationObserver; + private Observer> stickObserver; + private Observer>> userInfoConvObserver; + private Observer>> friendInfoObserver; + private Observer>> teamInfoObserver; + private Observer> muteObserver; + private Observer> addRemoveStickObserver; + private Observer>> aitObserver; + private Observer> unreadCountObserver; + private Observer>> contactGroupObserver; + CommonAdapter commonAdapterReadContents; + List usersExistBeans = new ArrayList<>(); + List usersExistBeansShouQi = new ArrayList<>(); + boolean isFollowShouQi = true; + private Observer>> verifyObserver; + + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + binding = FragmentIndexBinding.inflate(inflater); + initView(); + return binding.getRoot(); + } + + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + loaddata(); + } + + private boolean showAllFriends = false; + private boolean showAllGroup = false; + + public void initView() { + binding.ivIndexfmAihead.setData(R.mipmap.ic_logo, ""); + contactListViewFriend = binding.contactfriends; + contactListViewGroup = binding.contactgroups; + contactListViewFriend.getDecoration().setShowTagOff(false); + contactListViewFriend.setViewHolderFactory(new FunContactDefaultFactory()); + contactListViewFriend.configIndexTextBGColor(getResources().getColor(android.R.color.white)); + contactListViewGroup.setViewHolderFactory( + new FunContactViewHolderFactory() { + @Override + protected BaseContactViewHolder getCustomViewHolder(ViewGroup view, int viewType) { + if (viewType == IViewTypeConstant.CONTACT_TEAM_LIST) { + FunTeamListViewHolder viewHolder = new FunTeamListViewHolder(view); + viewHolder.setItemClickListener( + data -> { + XKitRouter.withKey(RouterConstant.PATH_FUN_CHAT_TEAM_PAGE) + .withParam(RouterConstant.CHAT_KRY, data.data) + .withContext(getActivity()) + .navigate(); + + }); + return viewHolder; + } + return null; + } + }); + + + conversationViewModel = new ViewModelProvider(this).get(ConversationViewModel.class); + conversationViewModel.setComparator(conversationComparator); //会话排序 + verifyViewModel = new ViewModelProvider(this).get(VerifyViewModel.class); + + + //好友 + viewModelFriends = new ViewModelProvider(this).get(ContactViewModel.class); + viewModelGroup = new ViewModelProvider(this).get(TeamListViewModel.class); + viewModelGroup.configRoutePath(RouterConstant.PATH_FUN_CHAT_TEAM_PAGE); +// setConversationChangeListener(result -> { +// if (result.getLoadStatus() == LoadStatus.Success) { +// assert result.getData() != null; +// for (ConversationBean bean : result.getData()) { +// if (bean.infoData.getFriendInfo() != null) { +// contactListViewFriend.insertFrindData(0, convertConvacationBean(bean.infoData)); +// } +// if (bean.infoData.getTeamInfo() != null) { +// contactListViewGroup.updateGroupData(convertConvacationListTeam(bean.infoData)); +// } +// } +// +// } else if (result.getLoadStatus() == LoadStatus.Finish +// && result.getType() == FetchResult.FetchType.Remove) { +// ALog.d(ConversationConstant.LIB_TAG, TAG, "DeleteLiveData, Success"); +// for (ConversationBean bean : result.getData()) { +// if (bean.infoData.getFriendInfo() != null) { +// List list = convertConvacationList(result.getData()); +// // contactListViewFriend.removeFriendData(list); +// } +// if (bean.infoData.getTeamInfo() != null) { +//// contactListViewGroup.removeContactData(convertConvacationListTeam(result.getData())); +//// viewModelGroup.fetchTeamList(); +// } +// } +// +// } +// }); + contactListViewFriend.getAdapter().setAll(false); + contactListViewGroup.getAdapter().setAll(false); +// conversationViewModel = new ViewModelProvider(this).get(ConversationViewModel.class); //最近会话 +// conversationViewModel.setComparator(conversationComparator); //会话排序 +// contactListViewGroup.setViewHolderFactory( +// new FunContactViewHolderFactory() { +// @Override +// protected BaseContactViewHolder getCustomViewHolder(ViewGroup view, int viewType) { +// if (viewType == IViewTypeConstant.CONTACT_TEAM_LIST) { +// FunTeamListViewHolder viewHolder = new FunTeamListViewHolder(view); +// viewHolder.setItemClickListener( +// data -> { +// XKitRouter.withKey(data.router) +// .withParam(RouterConstant.CHAT_KRY, data.data) +// .withContext(requireActivity()) +// .navigate(); +// +// }); +// return viewHolder; +// } +// return null; +// } +// }); + + binding.avIndexfraHead.setOnClickListener(v -> XKitRouter.withKey(RouterConstant.PATH_USER_INFO_PAGE) + .withContext(getActivity()) + .withParam(RouterConstant.KEY_ACCOUNT_ID_KEY, IMKitClient.account()) + .withParam("userId", IMKitClient.account()) + .navigate()); + + binding.layoutIndexfmAddfriends.setOnClickListener(view -> { + startaddFriends(); + }); + binding.ivIndexfmAddfriendtop.setOnClickListener(view -> { + startaddFriends(); + }); + binding.ivIndexfmNotifytop.setOnClickListener(view -> { + startActivity(new Intent(getActivity(), FunVerifyListActivity.class)); + binding.viewChatfmFrinedspoint.setVisibility(View.GONE); + }); + loadFriendAction(); + binding.layoutIndexfmAddgroup.setOnClickListener(view -> { + startCreateGroup(); + } + ); + binding.layoutIndexfmSearch.getRoot().setOnClickListener(view -> startActivity(new Intent(getActivity(), FunSearchActivity.class)) + ); + binding.ivIndexfmSettingtop.setOnClickListener(view -> { + startActivity(new Intent(getActivity(), SettingNewActivity.class)); +// MainActivity activity = (MainActivity) getActivity(); +// activity.toSetting(); + }); + + binding.layoutIndexfmSearch.ivCommonsearchScan.setOnClickListener(v -> { + MainActivity activity = (MainActivity) getActivity(); + activity.toScan(); + }); + + binding.saoyisaoTv.setOnClickListener(v -> { + MainActivity activity = (MainActivity) getActivity(); + activity.toScan(); + }); + + binding.zhuanzhangTv.setOnClickListener(v -> { + MainActivity activity = (MainActivity) getActivity(); + activity.toWalletAction(MainActivity.TYPE_TRANSFER); + }); + + + binding.fukuanTv.setOnClickListener(v -> { + MainActivity activity = (MainActivity) getActivity(); + activity.toWalletAction(MainActivity.TYPE_PAYMENT); + }); + + + binding.shoukuanTv.setOnClickListener(v -> { + MainActivity activity = (MainActivity) getActivity(); + activity.toWalletAction(MainActivity.TYPE_PAYMENT_COLLECTION); + }); + + binding.tvIndexfmFriendspull.setOnClickListener(view -> { +// if (friendsnumber > 1) { + showAllFriends = !showAllFriends; + contactListViewFriend.getAdapter().setAll(showAllFriends); + contactListViewFriend.getAdapter().notifyDataSetChanged(); + + if (showAllFriends) { + Drawable drawable = getResources().getDrawable(R.mipmap.ic_indexfm_down); + drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); + binding.tvIndexfmFriendspull.setCompoundDrawables(null, null, drawable, null); + } else { + Drawable drawable = getResources().getDrawable(R.mipmap.ic_indexfm_up); + drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); + binding.tvIndexfmFriendspull.setCompoundDrawables(null, null, drawable, null); + } + + +// } + }); + binding.tvIndexfmGrouppull.setOnClickListener(view -> { +// if (groupnumber > 1) { + showAllGroup = !showAllGroup; + contactListViewGroup.getAdapter().setAll(showAllGroup); + contactListViewGroup.getAdapter().notifyDataSetChanged(); + + if (showAllGroup) { + Drawable drawable = getResources().getDrawable(R.mipmap.ic_indexfm_down); + drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); + binding.tvIndexfmGrouppull.setCompoundDrawables(null, null, drawable, null); + } else { + Drawable drawable = getResources().getDrawable(R.mipmap.ic_indexfm_up); + drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); + binding.tvIndexfmGrouppull.setCompoundDrawables(null, null, drawable, null); + } +// } + }); + + binding.layoutIndexfmAichat.setOnClickListener(view -> { + startActivity(new Intent(getActivity(), AiChatActivity.class)); + }); + + binding.tvIndexfmTbgzpull.setOnClickListener(v -> { + if (isFollowShouQi) { + commonAdapterReadContents.setDates(usersExistBeans); + Drawable drawable = getResources().getDrawable(R.mipmap.ic_indexfm_down); + drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); + binding.tvIndexfmTbgzpull.setCompoundDrawables(null, null, drawable, null); + } else { + commonAdapterReadContents.setDates(usersExistBeansShouQi); + Drawable drawable = getResources().getDrawable(R.mipmap.ic_indexfm_up); + drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); + binding.tvIndexfmTbgzpull.setCompoundDrawables(null, null, drawable, null); + } + isFollowShouQi = !isFollowShouQi; + + }); + + usersExistBeans = ShareDateUtils.getFollowUsers(); + if (usersExistBeans == null) { + usersExistBeans = new ArrayList<>(); + usersExistBeansShouQi = new ArrayList<>(); + binding.tebieguanzhuLy.setVisibility(View.GONE); + } else { + if (usersExistBeans.size() > 3) { + usersExistBeansShouQi = usersExistBeans.subList(0, 3); + } else { + usersExistBeansShouQi = usersExistBeans; + } + binding.tebieguanzhuLy.setVisibility(View.VISIBLE); + } + initAdapterRed(); + } + + + private void initAdapterRed() { + binding.contacttbgz.setLayoutManager(new LinearLayoutManager(getActivity())); + commonAdapterReadContents = new CommonAdapter<>(getActivity(), R.layout.follow_child_item1, usersExistBeansShouQi) { + @Override + public void convert(ViewHolder holder, UsersExistBean s, int index) { + LogUtils.i("执行了:" + GsonUtils.beanToJSONString(s)); + ContactAvatarView contactAvatarView = holder.getView(R.id.logo_iv); + contactAvatarView.setData( + s.getAvatar(), s.getNickname(), AvatarColor.avatarColor(s.getUserId() + "")); + holder.setText(R.id.item_title_tv, s.getNickname()); + RecentContact recentContact = NIMClient.getService(MsgService.class).queryRecentContact(s.getUserId() + "", SessionTypeEnum.P2P); + + holder.getView(R.id.item_time_tv).setVisibility(View.GONE); + holder.setText(R.id.item_msg_tv, getString(R.string.nmhmylg_txt)); + if (recentContact != null) { +// if (recentContact.getUnreadCount() > 0) { +// int count = recentContact.getUnreadCount(); +// String content; +// if (count >= 100) { +// content = "99+"; +// } else { +// content = String.valueOf(count); +// } +// holder.setText(R.id.unreadTv, content); +// holder.getView(R.id.unreadTv).setVisibility(View.VISIBLE); +// } else { +// holder.getView(R.id.unreadTv).setVisibility(View.GONE); +// } + + holder.getView(R.id.item_time_tv).setVisibility(View.VISIBLE); + holder.setText(R.id.item_time_tv, TimeFormatUtils.formatMillisecond(getActivity(), recentContact.getTime())); + holder.setText(R.id.item_msg_tv, recentContact.getContent() + ""); + if (recentContact.getContent().equals("[自定义消息]")) { + String bean = GsonUtils.beanToJSONString(recentContact.getAttachment()); + try { + JSONObject jsonObject = new JSONObject(bean); + switch ((int) jsonObject.get("type")) { + case 1002: + holder.setText(R.id.item_msg_tv, getString(R.string.voom_message_txt)); + break; + case 1003: + holder.setText(R.id.item_msg_tv, getString(com.netease.yunxin.kit.chatkit.ui.R.string.gerenminp_txt)); + break; + + case 1004: + holder.setText(R.id.item_msg_tv, getString(com.netease.yunxin.kit.contactkit.ui.R.string.zhuanzhang_chat_txt)); + break; + case 1005: + case 1006: + holder.setText(R.id.item_msg_tv, getString(com.netease.yunxin.kit.contactkit.ui.R.string.hongbao_chat_txt)); + break; + + } + } catch (JSONException e) { + throw new RuntimeException(e); + } + + } + } else { + holder.getView(R.id.unreadTv).setVisibility(View.GONE); + } + holder.getView(R.id.big_ly).setOnClickListener(v -> +// XKitRouter.withKey(RouterConstant.PATH_FUN_CHAT_P2P_PAGE) +// .withParam(RouterConstant.CHAT_ID_KRY, s.getUserId() + "") +// .withContext(requireActivity()) +// .navigate()); + XKitRouter.withKey(RouterConstant.PATH_FUN_USER_INFO_PAGE) + .withContext(requireActivity()) + .withParam( + "uid", + s.getUserId()+"") + .withParam("userId", s.getUserId()+"") + .withParam("isGroup", false) + .navigate()); + + } + }; + binding.contacttbgz.setAdapter(commonAdapterReadContents); + + } + + public void startCreateGroup() { + startActivity(new Intent(getActivity(), FunContactSelectorActivity.class).putExtra(KEY_CONTACT_SELECTOR_MAX_COUNT, DEFAULT_MAX_SELECT_COUNT).putExtra(KEY_REQUEST_SELECTOR_NAME_ENABLE, true)); + } + + public void startaddFriends() { + startActivity(new Intent(getActivity(), AddFriendsActivity.class)); + } + + + public void loadFriendAction() { + ContactActions actions = new ContactActions(); + actions.addContactListener( + IViewTypeConstant.CONTACT_FRIEND, + (position, data) -> { + FriendInfo friendInfo = ((ContactFriendBean) data).data; + XKitRouter.withKey(RouterConstant.PATH_FUN_USER_INFO_PAGE) + .withContext(getActivity()) + .withParam( + "uid", + friendInfo.getAccount()) + .withParam("userId", friendInfo.getAccount()) + .withParam("isGroup", false) + .navigate(); +// XKitRouter.withKey(RouterConstant.PATH_FUN_CHAT_P2P_PAGE) +// .withParam(RouterConstant.CHAT_ID_KRY, friendInfo.getAccount()) +// .withContext(requireActivity()) +// .navigate(); + }); + contactListViewFriend.setContactAction(actions); + } + + + private Comparator conversationComparator = + (bean1, bean2) -> { + int result; + if (bean1 == null) { + result = 1; + } else if (bean2 == null) { + result = -1; + } else if (bean1.isStickTop() == bean2.isStickTop()) { + long time = bean1.getTime() - bean2.getTime(); + result = time == 0L ? 0 : (time > 0 ? -1 : 1); + + } else { + result = bean1.isStickTop() ? -1 : 1; + } + ALog.d(ConversationConstant.LIB_TAG, TAG, "conversationComparator, result:" + result); + return result; + }; + + + public void loaddata() { + conversationObserver = + result -> + { + if (result.getLoadStatus() == LoadStatus.Success) { + assert result.getData() != null; + Collections.reverse(result.getData()); + for (ConversationBean bean : result.getData()) { + if (bean.infoData.getFriendInfo() != null) { + contactListViewFriend.insertFrindData(0, convertConvacationBean(bean.infoData)); + } + if (bean.infoData.getTeamInfo() != null) { + contactListViewGroup.updateGroupData(convertConvacationListTeam(bean.infoData)); + } + } + + + } else if (result.getLoadStatus() == LoadStatus.Finish + && result.getType() == FetchResult.FetchType.Remove) { + ALog.d(ConversationConstant.LIB_TAG, TAG, "DeleteLiveData, Success"); + for (ConversationBean bean : result.getData()) { + if (bean.infoData.getFriendInfo() != null) { + List list = convertConvacationList(result.getData()); + // contactListViewFriend.removeFriendData(list); + } + if (bean.infoData.getTeamInfo() != null) { +// contactListViewGroup.removeContactData(convertConvacationListTeam(result.getData())); +// viewModelGroup.fetchTeamList(); + } + } + + } + }; + + changeObserver = + result -> { + if (result.getLoadStatus() == LoadStatus.Success) { + ALog.d(ConversationConstant.LIB_TAG, TAG, "ChangeLiveData, Success"); + //更新 + assert result.getData() != null; + for (ConversationBean bean : result.getData()) { + if (bean.infoData.getFriendInfo() != null) { + contactListViewFriend.insertFrindData(0, convertConvacationBean(bean.infoData)); + } + if (bean.infoData.getTeamInfo() != null) { + contactListViewGroup.updateGroupData(convertConvacationListTeam(bean.infoData)); + } + } + + } else if (result.getLoadStatus() == LoadStatus.Finish + && result.getType() == FetchResult.FetchType.Remove) { + //如果会话删除,重新获取好友 和 群组 + viewModelFriends.fetchContactList(); + viewModelGroup.fetchTeamList(); + } + + }; + + + contactObserver = + contactBeansResult -> + + { + if (contactBeansResult.getLoadStatus() == LoadStatus.Success) { + ALog.d(LIB_TAG, TAG, "contactObserver, Success"); + if (contactBeansResult.getData() != null) { + contactListViewFriend + .onFriendDataSourceChanged(contactBeansResult.getData()); + } + + } else if (contactBeansResult.getLoadStatus() == LoadStatus.Finish) { + if (contactBeansResult.getType() == FetchResult.FetchType.Add + && contactBeansResult.getData() != null) { + ALog.d(LIB_TAG, TAG, "contactObserver,Add"); + contactListViewFriend.addFriendData(contactBeansResult.getData()); + + } else if (contactBeansResult.getType() == FetchResult.FetchType.Remove + && contactBeansResult.getData() != null) { + ALog.d(LIB_TAG, TAG, "contactObserver,Remove"); + contactListViewFriend.removeFriendData(contactBeansResult.getData()); + + } else if (contactBeansResult.getType() == FetchResult.FetchType.Update + && contactBeansResult.getData() != null) { + ALog.d(LIB_TAG, TAG, "contactObserver,Update"); + contactListViewFriend.updateFriendData(contactBeansResult.getData()); + } + } + setContactFriendNum(); + } + + ; + + userInfoObserver = + userInfoResult -> + + { + if (userInfoResult.getLoadStatus() == LoadStatus.Finish) { +// binding.contactfriends.updateFriendData(userInfoResult.getData()); + } + } + + ; + + contactGroupObserver = groupresult -> + { + if (groupresult.getLoadStatus() == LoadStatus.Success) { + contactListViewGroup.clearContactData(); + if (groupresult.getData() != null) { + contactListViewGroup.addContactData(groupresult.getData()); + } + } else if (groupresult.getLoadStatus() == LoadStatus.Finish) { + if (groupresult.getType() == FetchResult.FetchType.Add) { + contactListViewGroup.addForwardContactData(groupresult.getData()); + } else if (groupresult.getType() == FetchResult.FetchType.Remove) { + contactListViewGroup.removeContactData(groupresult.getData()); + } + } + setContactGroupNum(); + + }; + + verifyObserver = listFetchResult -> { + + if (listFetchResult.getData() != null) { + verifyViewModel.getUnreadCount(new FetchCallback() { + @Override + public void onSuccess(@Nullable Integer integer) { + if (integer > 0) { + binding.viewChatfmFrinedspoint.setVisibility(View.VISIBLE); + } else { + binding.viewChatfmFrinedspoint.setVisibility(View.GONE); + } + } + + @Override + public void onFailed(int i) { + + } + + @Override + public void onException(@Nullable Throwable throwable) { + + } + }); + } + }; + + // stickObserver = +// result -> { +// if (result.getLoadStatus() == LoadStatus.Success) { +// ALog.d(ConversationConstant.LIB_TAG, TAG, "StickLiveData, Success"); +// conversationView.update(result.getData()); +// } +// +// }; +// +// userInfoConvObserver = +// result -> { +// if (result.getLoadStatus() == LoadStatus.Success && conversationView != null) { +// ALog.d(ConversationConstant.LIB_TAG, TAG, "UserInfoLiveData, Success"); +// conversationView.updateUserInfo(result.getData()); +// } +// }; +// +// friendInfoObserver = +// result -> { +// if (result.getLoadStatus() == LoadStatus.Success && conversationView != null) { +// ALog.d(ConversationConstant.LIB_TAG, TAG, "FriendInfoLiveData, Success"); +// conversationView.updateFriendInfo(result.getData()); +// } +// }; +// +// teamInfoObserver = +// result -> { +// if (result.getLoadStatus() == LoadStatus.Success && conversationView != null) { +// ALog.d(ConversationConstant.LIB_TAG, TAG, "TeamInfoLiveData, Success"); +// +// contactListViewGroup.updateContactData(result.getData()); +// } +// }; +// +// muteObserver = +// result -> { +// if (result.getLoadStatus() == LoadStatus.Success && conversationView != null) { +// ALog.d(ConversationConstant.LIB_TAG, TAG, "MuteInfoLiveData, Success"); +// conversationView.updateMuteInfo(result.getData()); +// } +// }; +// +// aitObserver = +// result -> { +// if (result.getLoadStatus() == LoadStatus.Finish) { +// if (result.getType() == FetchResult.FetchType.Add && conversationView != null) { +// ALog.d(ConversationConstant.LIB_TAG, TAG, "AddStickLiveData, Success"); +// ConversationHelper.updateAitInfo(result.getData(), true); +// conversationView.updateAit(result.getData()); +// } else if (result.getType() == FetchResult.FetchType.Remove +// && conversationView != null) { +// ALog.d(ConversationConstant.LIB_TAG, TAG, "RemoveStickLiveData, Success"); +// ConversationHelper.updateAitInfo(result.getData(), false); +// conversationView.updateAit(result.getData()); +// } +// } +// }; +// +// addRemoveStickObserver = +// result -> { +// if (result.getLoadStatus() == LoadStatus.Finish) { +// if (result.getType() == FetchResult.FetchType.Add && conversationView != null) { +// ALog.d(ConversationConstant.LIB_TAG, TAG, "AddStickLiveData, Success"); +// conversationView.addStickTop(result.getData()); +// } else if (result.getType() == FetchResult.FetchType.Remove +// && conversationView != null) { +// ALog.d(ConversationConstant.LIB_TAG, TAG, "RemoveStickLiveData, Success"); +// conversationView.removeStickTop(result.getData()); +// } +// } +// }; +// + unreadCountObserver = + result -> { + if (result.getLoadStatus() == LoadStatus.Success) { + ALog.d(ConversationConstant.LIB_TAG, TAG, "unreadCount, Success"); + if (result.getData() != null) { + ALog.d("result.getdata==" + result.getData()); + } +// if (conversationCallback != null) { +// conversationCallback.updateUnreadCount( +// result.getData() == null ? 0 : result.getData()); +// } + } + }; + + viewModelFriends.fetchContactList(); + viewModelGroup.fetchTeamList(); + conversationViewModel.fetchConversation(); + verifyViewModel.fetchVerifyList(false); + conversationViewModel.getUnreadCount(); + registerObserver(); + } + + int friendsnumber = 0; + + public void setContactFriendNum() { + friendsnumber = contactListViewFriend.getAdapter().getFriendList().size(); + binding.tvIndexfmFriendspull.setText(friendsnumber + ""); + if (contactListViewFriend.getAdapter().getFriendList().size() > 0) { + binding.layoutIndexfmAddfriends.setVisibility(View.GONE); + } else { + binding.layoutIndexfmAddfriends.setVisibility(View.VISIBLE); + } + } + + int groupnumber = 0; + + public void setContactGroupNum() { + groupnumber = contactListViewGroup.getAdapter().getDataList().size(); + binding.tvIndexfmGrouppull.setText(groupnumber + ""); + if (contactListViewGroup.getAdapter().getDataList().size() > 0) { + binding.layoutIndexfmAddgroup.setVisibility(View.GONE); + } else { + binding.layoutIndexfmAddgroup.setVisibility(View.VISIBLE); + } + } + + + public List convertConvacationList(List list) { + List contactFriendBeans = new ArrayList<>(); + for (ConversationBean bean : list) { + ConversationInfo conversationInfo = bean.infoData; + ContactFriendBean item = new ContactFriendBean(conversationInfo.getFriendInfo()); + item.setConversationText(conversationInfo.getContent()); + contactFriendBeans.add(item); + } + return contactFriendBeans; + } + + public ContactFriendBean convertConvacationBean(ConversationInfo bean) { + FriendInfo friendInfo = bean.getFriendInfo(); + friendInfo.setUserInfo(bean.getUserInfo()); + ContactFriendBean item = new ContactFriendBean(friendInfo); + item.setConversationTime(TimeFormatUtils.formatMillisecond(getActivity(), bean.getTime())); + item.setConversationText(TextUtils.isEmpty(bean.getContent()) ? "" : bean.getContent()); + return item; + } + + public List convertConvacationListTeam(List list) { + List contactTeamBeans = new ArrayList<>(); + for (ConversationBean bean : list) { + ConversationInfo conversationInfo = bean.infoData; + ContactTeamBean item = new ContactTeamBean(conversationInfo.getTeamInfo()); + item.setContent(conversationInfo.getContent()); + contactTeamBeans.add(item); + } + return contactTeamBeans; + } + + public ContactTeamBean convertConvacationListTeam(ConversationInfo bean) { + ContactTeamBean item = new ContactTeamBean(bean.getTeamInfo()); + item.setContent(bean.getContent()); + item.setTime(TimeFormatUtils.formatMillisecond(getActivity(), bean.getTime())); + return item; + } + + public void refrshUser(String account) { + CommonRepo.getUserInfo( + account, + new FetchCallback() { + @Override + public void onSuccess(@Nullable UserInfo param) { + if (param != null) { + updateUI(param); + } + } + + @Override + public void onFailed(int code) { + ToastX.showShortToast(R.string.user_fail); + updateUI(new UserInfo(account, account, "")); + } + + @Override + public void onException(@Nullable Throwable exception) { + ToastX.showShortToast(R.string.user_fail); + updateUI(new UserInfo(account, account, "")); + } + }); + } + + private void updateUI(UserInfo userInfo) { + String name = + TextUtils.isEmpty(userInfo.getName()) ? userInfo.getAccount() : userInfo.getName(); + binding.avIndexfraHead.setData( + userInfo.getAvatar(), name, AvatarColor.avatarColor(IMKitClient.account())); +// binding.tvIndexfraNick.setText(name); +// binding.tvIndexfraId.setText("CHEATID:" + IMKitClient.account()); + } + + @Override + public void onResume() { + super.onResume(); + ALog.d(Constant.PROJECT_TAG, "MineFragment:onResume"); + refrshUser(IMKitClient.account()); + + getFollow(); + } + + private void getFollow() { + Api.getInstance().followList() + .subscribeOn(io.reactivex.schedulers.Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result> feedbackResp) { + LogUtils.i("获取到的列表111111:" + GsonUtils.beanToJSONString(feedbackResp)); + if (feedbackResp.data != null && feedbackResp.data.getList() != null && feedbackResp.data.getList().size() > 0) { + usersExistBeans = feedbackResp.data.getList(); + DataUtils.set(getActivity(), IMUIKitConfig.FOLLOW_USER_TAG + "_" + IMKitClient.account(), GsonUtils.beanToJSONString(usersExistBeans)); + ChatDataUtils.set(getActivity(), "follow_user" + "_" + IMKitClient.account(), GsonUtils.beanToJSONString(usersExistBeans)); + + if (usersExistBeans.size() > 3) { + usersExistBeansShouQi = usersExistBeans.subList(0, 3); + } else { + usersExistBeansShouQi = usersExistBeans; + } + if (isFollowShouQi) { + commonAdapterReadContents.setDates(usersExistBeansShouQi); + } else { + commonAdapterReadContents.setDates(usersExistBeans); + } + binding.tebieguanzhuLy.setVisibility(View.VISIBLE); + binding.tvIndexfmTbgzpull.setText(usersExistBeans.size() + ""); + + } else { + ChatDataUtils.set(getActivity(), "follow_user" + "_" + IMKitClient.account(), ""); + DataUtils.set(getActivity(),IMUIKitConfig.FOLLOW_USER_TAG+"_"+ IMKitClient.account(),""); + + binding.tebieguanzhuLy.setVisibility(View.GONE); + } + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + binding.tebieguanzhuLy.setVisibility(View.GONE); + + } + }); + } + + @Override + public void onDestroy() { + super.onDestroy(); + unregisterObserver(); + } + + private void registerObserver() { + conversationViewModel.getQueryLiveData().observeForever(conversationObserver); + conversationViewModel.getChangeLiveData().observeForever(changeObserver); + viewModelFriends.getContactLiveData().observeForever(contactObserver); + viewModelFriends.getUserInfoLiveData().observeForever(userInfoObserver); + viewModelGroup.getFetchResult().observeForever(contactGroupObserver); + verifyViewModel.getFetchResult().observeForever(verifyObserver); + conversationViewModel.getUnreadCountLiveData().observeForever(unreadCountObserver); +// conversationViewModel.getStickLiveData().observeForever(stickObserver); +// conversationViewModel.getUserInfoLiveData().observeForever(userInfoConvObserver); +// conversationViewModel.getFriendInfoLiveData().observeForever(friendInfoObserver); +// conversationViewModel.getTeamInfoLiveData().observeForever(teamInfoObserver); +// conversationViewModel.getMuteInfoLiveData().observeForever(muteObserver); +// conversationViewModel.getAddRemoveStickLiveData().observeForever(addRemoveStickObserver); +// conversationViewModel.getAitLiveData().observeForever(aitObserver); + + } + + public void unregisterObserver() { + try { + conversationViewModel.getQueryLiveData().removeObserver(conversationObserver); + viewModelFriends.getContactLiveData().removeObserver(contactObserver); + viewModelFriends.getUserInfoLiveData().removeObserver(userInfoObserver); + viewModelGroup.getFetchResult().removeObserver(contactGroupObserver); + conversationViewModel.getChangeLiveData().observeForever(changeObserver); + verifyViewModel.getFetchResult().observeForever(verifyObserver); + conversationViewModel.getUnreadCountLiveData().removeObserver(unreadCountObserver); +// conversationViewModel.getStickLiveData().removeObserver(stickObserver); +// conversationViewModel.getUserInfoLiveData().removeObserver(userInfoConvObserver); +// conversationViewModel.getFriendInfoLiveData().removeObserver(friendInfoObserver); +// conversationViewModel.getTeamInfoLiveData().removeObserver(teamInfoObserver); +// conversationViewModel.getMuteInfoLiveData().removeObserver(muteObserver); +// conversationViewModel.getAddRemoveStickLiveData().removeObserver(addRemoveStickObserver); +// conversationViewModel.getAitLiveData().removeObserver(aitObserver); + } catch (Exception e) { + e.printStackTrace(); + } + + } +} diff --git a/app/src/main/java/com/dskj/rbchat/main/index/adapter/IndexContactAdapter.java b/app/src/main/java/com/dskj/rbchat/main/index/adapter/IndexContactAdapter.java new file mode 100644 index 0000000..52d5717 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/index/adapter/IndexContactAdapter.java @@ -0,0 +1,491 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.main.index.adapter; + +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.text.Spannable; +import android.text.SpannableString; +import android.text.TextUtils; +import android.text.style.ImageSpan; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; +import androidx.viewbinding.ViewBinding; + +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.ItemContactlistBinding; +import com.dskj.rbchat.databinding.TeamMembersViewHolderBinding; +import com.dskj.rbchat.utils.DataUtils; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.msg.MessageBuilder; +import com.netease.nimlib.sdk.msg.MsgService; +import com.netease.nimlib.sdk.msg.attachment.MsgAttachment; +import com.netease.nimlib.sdk.msg.attachment.NetCallAttachment; +import com.netease.nimlib.sdk.msg.constant.MsgTypeEnum; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.nimlib.sdk.msg.model.IMMessage; +import com.netease.nimlib.sdk.msg.model.QueryDirectionEnum; +import com.netease.nimlib.sdk.msg.model.RecentContact; +import com.netease.nimlib.sdk.team.model.Team; +import com.netease.yunxin.kit.chatkit.model.ConversationInfo; +import com.netease.yunxin.kit.chatkit.repo.ContactRepo; +import com.netease.yunxin.kit.common.ui.utils.AvatarColor; +import com.netease.yunxin.kit.common.ui.utils.TimeFormatUtils; +import com.netease.yunxin.kit.contactkit.ui.model.BaseContactBean; +import com.netease.yunxin.kit.contactkit.ui.model.ContactFriendBean; +import com.netease.yunxin.kit.contactkit.ui.model.ContactTeamBean; +import com.netease.yunxin.kit.contactkit.ui.utils.ColorUtils; +import com.netease.yunxin.kit.contactkit.ui.utils.GsonUtils; +import com.netease.yunxin.kit.conversationkit.ui.ConversationCustom; +import com.netease.yunxin.kit.conversationkit.ui.TimeConversationUtils; +import com.netease.yunxin.kit.conversationkit.ui.fun.viewholder.EmojiManager; +import com.netease.yunxin.kit.conversationkit.ui.fun.viewholder.FunConversationBaseViewHolder; +import com.netease.yunxin.kit.conversationkit.ui.model.ConversationBean; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.model.AttachmentContent; +import com.netease.yunxin.kit.corekit.im.model.FriendInfo; +import com.netease.yunxin.kit.corekit.im.model.UserInfo; +import com.netease.yunxin.kit.corekit.im.utils.RouterConstant; +import com.netease.yunxin.kit.corekit.route.XKitRouter; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.regex.Matcher; + +// 首页好友群组适配器 +public class IndexContactAdapter extends RecyclerView.Adapter { + + protected List dataList; + private Context mContext; + private boolean isShowAll; + + + public IndexContactAdapter(Context context) { + dataList = new ArrayList<>(); + mContext = context; + } + + + public boolean isShowAll() { + return isShowAll; + } + + public void setShowAll(boolean showAll) { + isShowAll = showAll; + } + + public void setData(List list, int type) { + dataList.clear(); + dataList.addAll(list); + if (type == 0) { + sortListByMyFriend(dataList); + } else { + sortListByMyTeam(dataList); + } + notifyDataSetChanged(); + } + + public void addFriendDataList(List list) { + if (list == null || list.isEmpty()) { + return; + } + dataList.addAll(0, list); + if (isShowAll) { + notifyItemRangeInserted(0, list.size()); + } else { + notifyDataSetChanged(); + } + + } + + public void addTeamDataList(List list) { + if (list == null || list.isEmpty()) { + return; + } + dataList.addAll(list); + sortListByMyTeam(dataList); + notifyDataSetChanged(); + + } + + //排序我的Team + public List sortListByMyTeam(List teamBeanList) { + Collections.sort(teamBeanList, teambeanComparator); + return teamBeanList; + } + + //排序我的好友 + public List sortListByMyFriend(List friendBeanList) { + Collections.sort(friendBeanList, friendbeanComparator); + return friendBeanList; + } + + + //按照我的群在前面排序 + public Comparator teambeanComparator = + (bean1, bean2) -> { + int result = 1; + if (bean1 == null) { + result = 1; + } else if (bean2 == null) { + result = -1; + } else if (bean1 instanceof ContactTeamBean && bean2 instanceof ContactTeamBean) { //群聊 + ContactTeamBean teamBean1 = (ContactTeamBean) bean1; + ContactTeamBean teamBean2 = (ContactTeamBean) bean2; + if (teamBean1.data.getCreator().equals(IMKitClient.account()) == teamBean2.data.getCreator().equals(IMKitClient.account())) { + long chattime = teamBean1.getConversationTime() - teamBean2.getConversationTime(); + return (chattime == 0L ? 0 : (chattime > 0 ? -1 : 1)); + } else if (!teamBean1.data.getCreator().equals(IMKitClient.account()) == !teamBean2.data.getCreator().equals(IMKitClient.account())) { + long chattime = teamBean1.getConversationTime() - teamBean2.getConversationTime(); + return (chattime == 0L ? 0 : (chattime > 0 ? -1 : 1)); + } else { + return teamBean1.data.getCreator().equals(IMKitClient.account()) ? -1 : 0; + } + } else { + result = -1; + } + return result; + }; + + + public Comparator friendbeanComparator = + (bean1, bean2) -> { + int result; + if (bean1 == null) { + result = 1; + } else if (bean2 == null) { + result = -1; + } else if (bean1 instanceof ContactFriendBean && bean2 instanceof ContactFriendBean) { + long time = ((ContactFriendBean) bean1).getTime() - ((ContactFriendBean) bean2).getTime(); + result = time == 0L ? 0 : (time > 0 ? -1 : 1); + } else { + return -1; + } + return result; + }; + + + public void removeDataList(List list) { + if (list == null || list.isEmpty()) { + return; + } + if (dataList == null || dataList.isEmpty()) { + return; + } + if (dataList.removeAll(list)) { + notifyDataSetChanged(); + } + } + + public void updateFriendDataList(List list) { + if (list == null || list.isEmpty()) { + return; + } + for (ContactFriendBean contactBean : list) { + int index = dataList.indexOf(contactBean); + if (index >= 0) { + dataList.set(index, contactBean); + notifyItemChanged(index); + } + } + } + + public void updateFriendDataContentItem(ConversationInfo conversationInfo) { + if (conversationInfo == null) { + return; + } + for (BaseContactBean contactBean : dataList) { + if (((ContactFriendBean) contactBean).data.getAccount().equals(conversationInfo.getFriendInfo().getAccount())) { + int index = dataList.indexOf(contactBean); +// ((ContactFriendBean) contactBean).setConversationInfo(conversationInfo.); + ((ContactFriendBean) contactBean).setMsgTypeEnum(conversationInfo.getMsgType()); + ((ContactFriendBean) contactBean).setMsgAttachment(conversationInfo.getAttachment()); + ((ContactFriendBean) contactBean).setTime(conversationInfo.getTime()); + ((ContactFriendBean) contactBean).setConversationText(conversationInfo.getContent()); + + if (index == 0) { + dataList.set(0, contactBean); + } else { + dataList.set(index, dataList.get(0)); + dataList.set(0, contactBean); + } + } + } + sortListByMyFriend(dataList); + notifyDataSetChanged(); + + } + + public void updateTeamDataContentItem(ConversationInfo conversationInfo) { + if (conversationInfo == null) { + return; + } + for (BaseContactBean contactBean : dataList) { + if (((ContactTeamBean) contactBean).data.getId().equals(conversationInfo.getTeamInfo().getId())) { + int index = dataList.indexOf(contactBean); //位置 + ((ContactTeamBean) contactBean).data = conversationInfo.getTeamInfo(); + ((ContactTeamBean) contactBean).setConversationTime(conversationInfo.getTime()); + ((ContactTeamBean) contactBean).setContent(conversationInfo.getContent()); + ((ContactTeamBean) contactBean).setMsgAttachment(conversationInfo.getAttachment()); + ((ContactTeamBean) contactBean).setMsgTypeEnum(conversationInfo.getMsgType()); + ((ContactTeamBean) contactBean).setFromAccount(conversationInfo.getFromAccount()); + ((ContactTeamBean) contactBean).setFromNick(conversationInfo.getFromNick()); + notifyItemChanged(index); + } + } + sortListByMyTeam(dataList); + notifyDataSetChanged(); + } + + public void updateTeamDataIconItem(ContactTeamBean contactTeamBean, int postion) { + if (contactTeamBean == null) { + return; + } + dataList.set(postion, contactTeamBean); + notifyItemChanged(postion); + } + + public void removeData(int position) { + dataList.remove(position); + notifyItemRemoved(position); + } + + public List getData() { + return dataList; + } + + @NonNull + @Override + public BaseContactViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return new BaseContactViewHolder(ItemContactlistBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); + } + + + @Override + public void onBindViewHolder(@NonNull BaseContactViewHolder holder, int position) { + BaseContactBean contactBean = dataList.get(position); + + if (contactBean instanceof ContactFriendBean) { + ContactFriendBean friendBean = (ContactFriendBean) contactBean; + setFriendData(friendBean, holder.binding); + } + if (contactBean instanceof ContactTeamBean) { + ContactTeamBean teamBean = (ContactTeamBean) contactBean; + setTeamData(teamBean, holder.binding); + } + + holder.binding.rootView.setOnClickListener(view -> { + if (contactBean instanceof ContactFriendBean) { + // 跳转好友用户页 + FriendInfo friendInfo = ((ContactFriendBean) contactBean).data; + XKitRouter.withKey(RouterConstant.PATH_FUN_USER_INFO_PAGE) + .withContext(mContext) + .withParam( + "uid", + friendInfo.getAccount()) + .withParam("userId", friendInfo.getAccount()) + .withParam("isGroup", false) + .navigate(); + } + if (contactBean instanceof ContactTeamBean) { + Team team = ((ContactTeamBean) contactBean).data; + XKitRouter.withKey(RouterConstant.PATH_FUN_CHAT_TEAM_PAGE) + .withParam(RouterConstant.CHAT_KRY, team) + .withContext(mContext) + .navigate(); + } + + }); + } + + + public void setFriendData(ContactFriendBean bean, ItemContactlistBinding binding) { + FriendInfo friendInfo = bean.data; + String nickName = friendInfo.getName(); + String avatarName = friendInfo.getAvatarName(); +// String conversationText = bean.getConversationText(); + binding.tvName.setEllipsize(TextUtils.TruncateAt.END); + if (TextUtils.isEmpty(friendInfo.getAlias())) { + binding.tvAlias.setVisibility(View.GONE); + binding.tvName.setText(nickName); + binding.tvName.setMaxWidth(DataUtils.dip2px(mContext, 180)); + } else { + binding.tvName.setMaxWidth(DataUtils.dip2px(mContext, 80)); + binding.tvAlias.setVisibility(View.VISIBLE); + binding.tvName.setText(avatarName); + binding.tvAlias.setText("(" + nickName + ")"); + } + binding.tvMyteamtype.setVisibility(View.GONE); + binding.messageLayout.setVisibility(View.VISIBLE); + binding.tvTime.setVisibility(View.GONE); +// binding.tvTime.setText(bean.getConversationTime()); + binding.tvHint.setText(mContext.getResources().getString(R.string.nmhmylg_txt)); + if (TextUtils.isEmpty(friendInfo.getAvatar())) { + binding.avatarView.setData(R.mipmap.default_head_img, friendInfo.getName(), 0); + } else { + binding.avatarView.setData( + friendInfo.getAvatar(), avatarName); + } + if (bean.getMsgTypeEnum() != null) { + setConversationContent2(binding.tvHint, binding.tvTime, bean); + } + + } + + public void setTeamData(ContactTeamBean bean, ItemContactlistBinding binding) { + Team teamInfo = bean.data; + binding.tvName.setText(teamInfo.getName()); +// String value = bean.getContent(); +// String time = bean.getTime(); + binding.tvHint.setText(mContext.getResources().getString(R.string.myltjl_txt)); + binding.tvTime.setVisibility(View.GONE); + binding.messageLayout.setVisibility(View.VISIBLE); + binding.tvTime.setVisibility(View.VISIBLE); + binding.tvName.setMaxWidth(DataUtils.dip2px(mContext, 180)); + if (TextUtils.isEmpty(teamInfo.getIcon())) { + binding.avatarView.setData(com.netease.yunxin.kit.contactkit.ui.R.mipmap.ic_group_defaulthead, "head", 1); + } else { + binding.avatarView.setData( + teamInfo.getIcon(), teamInfo.getName(), ColorUtils.avatarColor(teamInfo.getId())); + } + binding.tvMyteamtype.setVisibility(View.GONE); + if (teamInfo.getCreator().equals(IMKitClient.account())) { + binding.tvName.setMaxWidth(DataUtils.dip2px(mContext, 140)); + binding.tvMyteamtype.setVisibility(View.VISIBLE); + } + + if (bean.getMsgTypeEnum() != null) { + setConversationContent2(binding.tvHint, binding.tvTime, bean); + } + +// String id = teamInfo.getId(); //实时获取 +// IMMessage msg = MessageBuilder.createEmptyMessage(id, SessionTypeEnum.Team, System.currentTimeMillis()); +// setConversationContent(binding.tvHint, binding.tvTime, msg); + + } + + + public void setConversationContent2(TextView tvHint, TextView tvTime, BaseContactBean info) { + if (info != null) { //有消息 + String text = customContentText2(mContext, info); + if (!TextUtils.isEmpty(text)) { + tvHint.setText(text); + if (info instanceof ContactTeamBean) { + ContactTeamBean contactTeamBean = (ContactTeamBean) info; + String account = contactTeamBean.getFromAccount(); + String name = contactTeamBean.getFromNick(); + if (!account.equals(IMKitClient.account()) && ContactRepo.getFriend(account) != null) { + String alias = ContactRepo.getFriend(account).getAlias(); + if (ContactRepo.isFriend(account) && !TextUtils.isEmpty(alias)) { + name = alias; + } + tvHint.setText(name + ":" + text); + } + } + ConversationCustom.identifyExpression(tvHint.getContext(), tvHint, tvHint.getText().toString()); + } + tvTime.setVisibility(View.VISIBLE); + long time = (info instanceof ContactFriendBean) ? ((ContactFriendBean) info).getTime() : + ((ContactTeamBean) info).getConversationTime(); + tvTime.setText(TimeConversationUtils.formatMillisecond(mContext, time)); + } + + } + + + public String customContentText2(Context context, BaseContactBean contactBean) { + if (context != null) { + MsgTypeEnum typeEnum; + if (contactBean instanceof ContactTeamBean) { + typeEnum = ((ContactTeamBean) contactBean).getMsgTypeEnum(); + } else { + typeEnum = ((ContactFriendBean) contactBean).getMsgTypeEnum(); + } + switch (typeEnum) { + case notification: + return context.getString(com.netease.yunxin.kit.conversationkit.ui.R.string.msg_type_notification); + case text: + return (contactBean instanceof ContactTeamBean) ? ((ContactTeamBean) contactBean).getContent() : ((ContactFriendBean) contactBean).getConversationText(); + case audio: + return context.getString(com.netease.yunxin.kit.conversationkit.ui.R.string.msg_type_audio); + case video: + return context.getString(com.netease.yunxin.kit.conversationkit.ui.R.string.msg_type_video); + case tip: + return context.getString(com.netease.yunxin.kit.conversationkit.ui.R.string.msg_type_tip); + case image: + return context.getString(com.netease.yunxin.kit.conversationkit.ui.R.string.msg_type_image); + case file: + return context.getString(com.netease.yunxin.kit.conversationkit.ui.R.string.msg_type_file); + case location: + return context.getString(com.netease.yunxin.kit.conversationkit.ui.R.string.msg_type_location); + case nrtc_netcall: + NetCallAttachment attachment; + if (contactBean instanceof ContactTeamBean) { + attachment = (NetCallAttachment) ((ContactTeamBean) contactBean).getMsgAttachment(); + } else { + attachment = (NetCallAttachment) ((ContactFriendBean) contactBean).getMsgAttachment(); + } + if (attachment != null) { + int type = attachment.getType(); + if (type == 1) { + return context.getString(com.netease.yunxin.kit.conversationkit.ui.R.string.msg_type_rtc_audio); + } else { + return context.getString(com.netease.yunxin.kit.conversationkit.ui.R.string.msg_type_rtc_video); + } + } + + case custom: + String result = ""; + MsgAttachment msgAttachment; + if (contactBean instanceof ContactTeamBean) { + msgAttachment = ((ContactTeamBean) contactBean).getMsgAttachment(); + } else { + msgAttachment = ((ContactFriendBean) contactBean).getMsgAttachment(); + } + if (msgAttachment instanceof AttachmentContent) { + result = ((AttachmentContent) msgAttachment).getContent(); + } + return TextUtils.isEmpty(result) ? context.getString(com.netease.yunxin.kit.conversationkit.ui.R.string.msg_type_custom) : result; + default: + return context.getString(com.netease.yunxin.kit.conversationkit.ui.R.string.msg_type_no_tips); + } + } + return ""; + } + + + @Override + public int getItemCount() { + if (isShowAll()) { + return dataList.size(); + } else { + return Math.min(dataList.size(), 3); + } + } + + + protected class BaseContactViewHolder extends RecyclerView.ViewHolder { + + ItemContactlistBinding binding; + + public BaseContactViewHolder(@NonNull ViewBinding bind) { + super(bind.getRoot()); + this.binding = (ItemContactlistBinding) bind; + } + } +} + + diff --git a/app/src/main/java/com/dskj/rbchat/main/index/add/AddFriendsActivity.java b/app/src/main/java/com/dskj/rbchat/main/index/add/AddFriendsActivity.java new file mode 100644 index 0000000..990674a --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/index/add/AddFriendsActivity.java @@ -0,0 +1,1591 @@ +package com.dskj.rbchat.main.index.add; + +import static com.netease.yunxin.kit.chatkit.repo.ChatRepo.sendMessage; +import static com.netease.yunxin.kit.contactkit.ui.selector.BaseContactSelectorActivity.DEFAULT_MAX_SELECT_COUNT; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.KEY_CONTACT_SELECTOR_MAX_COUNT; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.KEY_REQUEST_SELECTOR_NAME_ENABLE; + +import android.Manifest; +import android.app.Activity; +import android.content.Intent; +import android.database.Cursor; +import android.graphics.Bitmap; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.provider.ContactsContract; +import android.text.TextUtils; +import android.util.Log; +import android.util.TypedValue; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; +import androidx.lifecycle.ViewModelProvider; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.codersun.fingerprintcompat.AonFingerChangeCallback; +import com.codersun.fingerprintcompat.FingerManager; +import com.codersun.fingerprintcompat.SimpleFingerCheckCallback; +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.base.LllChatBaseActivity; +import com.dskj.rbchat.databinding.ActivityAddfriendsBinding; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.dialog.PayCashDialog; +import com.dskj.rbchat.dialog.PayCashFingerDialog; +import com.dskj.rbchat.game.JsBridgeActivity; +import com.dskj.rbchat.imkit.add.FunAddFriendActivity; +import com.dskj.rbchat.imkit.selector.FunContactSelectorActivity; +import com.dskj.rbchat.imkit.verify.FunVerifyListActivity; +import com.dskj.rbchat.main.MainActivity; +import com.dskj.rbchat.main.authorize.AuthorizeActivity; +import com.dskj.rbchat.main.mine.ChangeAccoutActionActivity; +import com.dskj.rbchat.main.mine.FriendPermissionsActivity; +import com.dskj.rbchat.main.mine.UserInfoActivity; +import com.dskj.rbchat.model.BindBean; +import com.dskj.rbchat.model.CountryBean; +import com.dskj.rbchat.model.LoginBean; +import com.dskj.rbchat.model.UserShareBean; +import com.dskj.rbchat.model.UsersExistBean; +import com.dskj.rbchat.model.WalletBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.pay.PaymentActivity; +import com.dskj.rbchat.utils.AdaptScreenUtils; +import com.dskj.rbchat.utils.CommonUtils; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.utils.QRCodeScheme; +import com.dskj.rbchat.utils.ShareDateUtils; +import com.dskj.rbchat.utils.ToolKits; +import com.dskj.rbchat.wallet.SetPayPasswordActivity; +import com.google.android.material.bottomsheet.BottomSheetDialog; +import com.huawei.hms.hmsscankit.ScanUtilNew; +import com.huawei.hms.ml.scan.HmsScan; +import com.huawei.hms.ml.scan.HmsScanAnalyzerOptions; +import com.king.zxing.util.CodeUtils; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.RequestCallback; +import com.netease.nimlib.sdk.ResponseCode; +import com.netease.nimlib.sdk.msg.MessageBuilder; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.nimlib.sdk.msg.model.IMMessage; +import com.netease.nimlib.sdk.team.TeamService; +import com.netease.nimlib.sdk.team.model.Team; +import com.netease.yunxin.kit.chatkit.repo.ChatRepo; +import com.netease.yunxin.kit.chatkit.repo.ContactRepo; +import com.netease.yunxin.kit.chatkit.ui.common.RxBus; +import com.netease.yunxin.kit.common.ui.utils.AvatarColor; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.common.ui.widgets.ContactAvatarView; +import com.netease.yunxin.kit.common.utils.NetworkUtils; +import com.netease.yunxin.kit.common.utils.PermissionUtils; +import com.netease.yunxin.kit.common.utils.UriUtils; +import com.netease.yunxin.kit.contactkit.ui.fun.addfriend.FunAddFriendsBottomDialog; +import com.netease.yunxin.kit.contactkit.ui.model.ContactUserInfoBean; +import com.netease.yunxin.kit.contactkit.ui.userinfo.UserInfoViewModel; +import com.netease.yunxin.kit.contactkit.ui.utils.ColorUtils; +import com.netease.yunxin.kit.contactkit.ui.verify.VerifyViewModel; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.model.FriendInfo; +import com.netease.yunxin.kit.corekit.im.model.UserInfo; +import com.netease.yunxin.kit.corekit.im.provider.FetchCallback; +import com.netease.yunxin.kit.corekit.im.provider.FetchCallbackImpl; +import com.netease.yunxin.kit.corekit.im.utils.RouterConstant; +import com.netease.yunxin.kit.corekit.route.XKitRouter; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +/** + * 新增好友页面 + */ +public class AddFriendsActivity extends LllChatBaseActivity { + ActivityAddfriendsBinding binding; + private LoginBean loginBean; + private VerifyViewModel viewModel; + private ShareDateUtils shareDateUtils; + public static final int REQUEST_READ_EXTERNAL_STORAGE_PERMISSION_ALBUM = 3; + protected ActivityResultLauncher permissionLauncherReadContacts; + CountryBean countryBean; + private CommonAdapter commonAdapterReadContents; + protected UserInfoViewModel userinfoviewModel; + + @RequiresApi(api = Build.VERSION_CODES.M) + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white)); + + super.onCreate(savedInstanceState); + binding = ActivityAddfriendsBinding.inflate(getLayoutInflater()); + loginBean = DataUtils.getLocUserInfo(); + setContentView(binding.getRoot()); + countryBean = DataUtils.getLocCountry(AddFriendsActivity.this); + userinfoviewModel = new ViewModelProvider(this).get(UserInfoViewModel.class); + initAdapterRed(); + binding.titleBarView.getRightImageView().setImageResource(R.mipmap.ic_index_setting); + binding.titleBarView.getRightImageView().setVisibility(View.VISIBLE); + binding.titleBarView.getRightImageView().setOnClickListener(v -> startActivity(new Intent(AddFriendsActivity.this, FriendPermissionsActivity.class))); + initView(); + permissionLauncher = + registerForActivityResult( + new ActivityResultContracts.RequestMultiplePermissions(), + result -> { + if (result != null) { + for (Map.Entry entry : result.entrySet()) { + String permission = entry.getKey().toString(); + boolean grant = (Boolean) entry.getValue(); + if (grant) { + if (TextUtils.equals( + permission, Manifest.permission.READ_MEDIA_IMAGES) || TextUtils.equals( + permission, Manifest.permission.READ_MEDIA_VIDEO)) { + doSaveQrcode(); + } + + if (TextUtils.equals(permission, Manifest.permission.CAMERA)) { + ScanUtilNew.startScan(AddFriendsActivity.this, 1016, + new HmsScanAnalyzerOptions.Creator() + .setHmsScanTypes(HmsScan.ALL_SCAN_TYPE).create()); + } + } else { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (shouldShowRequestPermissionRationale(permission)) { + ToastX.showShortToast(getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_deny_tips)); + } else { + ToastX.showShortToast(getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_storage)); + } + } + } + } + } + }); + } + + @Override + public int initNavigationBarColor() { + return 0; + } + + @Override + public int initStatusBarColor() { + return 0; + } + + private void initAdapterRed() { + binding.recycler.setLayoutManager(new LinearLayoutManager(this)); + commonAdapterReadContents = new CommonAdapter<>(AddFriendsActivity.this, R.layout.kenengrenshi_child_item, usersExistBeans) { + @Override + public void convert(ViewHolder holder, UsersExistBean s, int index) { + LogUtils.i("执行了:" + GsonUtils.beanToJSONString(s)); + ContactAvatarView contactAvatarView = holder.getView(R.id.logo_iv); +// contactAvatarView.setData( +// s.getAvatar(), s.getNickname(), AvatarColor.avatarColor(s.getUserId() + "")); + ColorUtils.loadAvator(s.getAvatar(), contactAvatarView); + holder.setText(R.id.item_title_tv, s.getNickname()); + holder.getView(R.id.add_friend_iv).setOnClickListener(v -> { + FriendInfo friendInfo = new FriendInfo(s.getUserId() + "", null, null); + //account: kotlin.String, name: kotlin.String, avatar: kotlin.String? + UserInfo userInfo = new UserInfo(s.getUserId() + "", s.getNickname(), s.getAvatar()); + friendInfo.setUserInfo(userInfo); + ContactUserInfoBean contactUserInfoBean = new ContactUserInfoBean(userInfo); + contactUserInfoBean.friendInfo = friendInfo; + contactUserInfoBean.isFriend = false; + contactUserInfoBean.isBlack = false; + contactUserInfoBean.messageNotify = true; + showSendMsgDialog(userInfo, contactUserInfoBean, s.getAddFriendNeedVerify() == 1); + }); + holder.getView(R.id.big_ly).setOnClickListener(v -> XKitRouter.withKey(RouterConstant.PATH_USER_INFO_PAGE) + .withContext(AddFriendsActivity.this) + .withParam(RouterConstant.KEY_ACCOUNT_ID_KEY, s.getUserId() + "") + .withParam("userId", s.getUserId() + "") + .navigate()); + } + }; + binding.recycler.setAdapter(commonAdapterReadContents); + + } + + + @RequiresApi(api = Build.VERSION_CODES.M) + public void initView() { + binding.titleBarView.setOnBackIconClickListener(view -> onBackPressed()); + binding.titleBarView.getTitleTextView().setTextSize(TypedValue.COMPLEX_UNIT_SP, 20); +// binding.titleBarView.setActionImg(R.mipmap.ic_index_setting); +// binding.titleBarView.setRightImageViewVisible(View.VISIBLE); + binding.tvAddfriendsSearch.setOnClickListener(view -> startActivity(new Intent(this, FunAddFriendActivity.class))); + binding.viewApplylistclick.setOnClickListener(view -> startActivity(new Intent(this, FunVerifyListActivity.class))); + binding.viewCreatgroupclick.setOnClickListener(view -> startCreateGroup()); + binding.qrcodeTv.setOnClickListener(v -> showQrcodeView()); + binding.saoyisaoTv.setOnClickListener(view -> toScan()); + shareDateUtils = new ShareDateUtils(); + shareDateUtils.getAllSessionList(); + shareDateUtils.getLocFriends(); + binding.qiyongTv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + permissionLauncherReadContacts.launch(new String[]{Manifest.permission.READ_CONTACTS}); + } + }); + + if (PermissionUtils.hasPermissions( + AddFriendsActivity.this, Manifest.permission.READ_CONTACTS)) { + binding.tongxunluCly.setVisibility(View.GONE); + getContactsList(); + } else { + binding.tongxunluCly.setVisibility(View.VISIBLE); + } + + permissionLauncherReadContacts = + registerForActivityResult( + new ActivityResultContracts.RequestMultiplePermissions(), + result -> { + if (result != null) { + for (Map.Entry entry : result.entrySet()) { + String permission = entry.getKey().toString(); + boolean grant = (Boolean) entry.getValue(); + if (grant) { + if (TextUtils.equals(permission, Manifest.permission.READ_CONTACTS)) { + binding.tongxunluCly.setVisibility(View.GONE); + getContactsList(); + } + } else { + if (shouldShowRequestPermissionRationale(permission)) { + + ToastX.showShortToast( + getResources().getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_deny_tips)); + + } else { + + ToastX.showShortToast(getPermissionText(permission)); + + } + } + } + } + }); + + } + + private void toScan() { + if (PermissionUtils.hasPermissions( + AddFriendsActivity.this, Manifest.permission.CAMERA)) { + ScanUtilNew.startScan(AddFriendsActivity.this, 1016, + new HmsScanAnalyzerOptions.Creator().setHmsScanTypes(HmsScan.ALL_SCAN_TYPE).create()); + } else { + requestCameraPermission(Manifest.permission.CAMERA); + } + } + + private void getContactsList() { + readContacts(); + } + + public String getPermissionText(String permission) { + String text = getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_default); + if (TextUtils.equals(permission, Manifest.permission.CAMERA)) { + text = getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_camera); + } else if (TextUtils.equals(permission, Manifest.permission.READ_EXTERNAL_STORAGE)) { + text = getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_storage); + } else if (TextUtils.equals(permission, Manifest.permission.RECORD_AUDIO)) { + text = getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_audio); + } + return text; + } + + List contents = new ArrayList<>(); + + private void readContacts() { + contents = new ArrayList<>(); + Cursor cursor = null; + try { + cursor = getContentResolver().query( + ContactsContract.CommonDataKinds.Phone.CONTENT_URI, + null, null, null, null); + while (cursor.moveToNext()) { + int i_name = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME); + String displayName = cursor.getString(i_name); + int i_number = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER); + String number = cursor.getString(i_number); + number = number.replace(countryBean.getAreaCodeName(), "") +// .replace(countryBean.getAreaCode() + "", "") + .replace("-", "").replace(" ", ""); +// contactsList.add(displayName + "\n" + number); +// canshu += (number + ","); + if (contents.size() < 500) { + contents.add(number.trim()); + } + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (cursor != null) { + cursor.close(); + getUserExist(); + } + } + } + + List friendInfos; + List usersExistBeans = new ArrayList<>(); + + private void getUserExist() { + Api.getInstance().usersExist(contents) + .subscribeOn(io.reactivex.schedulers.Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result> feedbackResp) { + LogUtils.i("获取到的列表:" + GsonUtils.beanToJSONString(feedbackResp)); + changeBottomList(feedbackResp.data); + + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + + } + }); + } + + private void changeBottomList(List usersExists) { + friendInfos = shareDateUtils.getLocUserListInfo(); + if (friendInfos != null && friendInfos.size() == 0) { + usersExistBeans = usersExists; + } else { + for (int i = 0; i < usersExists.size(); i++) { + // 获取迭代器 + Iterator it = friendInfos.iterator(); + while (it.hasNext()) { + FriendInfo str = it.next(); + if (str.getAccount().equals(usersExists.get(i).getUserId() + "")) { + usersExists.remove(i); + break; + } + } + + } + + usersExistBeans = usersExists; + } + + if (usersExistBeans.size() > 0) { + // 获取迭代器 + Iterator it = usersExistBeans.iterator(); + while (it.hasNext()) { + UsersExistBean str = it.next(); + if ((str.getUserId() + "").equals(IMKitClient.account()) + || ContactRepo.isBlackList(str.getUserId() + "")) { + it.remove(); + } + + } + } + if (usersExistBeans.size() > 0) { + binding.recycler.setVisibility(View.VISIBLE); + binding.nodateTv.setVisibility(View.GONE); + commonAdapterReadContents.setDates(usersExistBeans); + } else { + binding.recycler.setVisibility(View.GONE); + binding.nodateTv.setVisibility(View.VISIBLE); + } + } + + + public void initData() { + //获取好友申请列表数 + viewModel = new ViewModelProvider(this).get(VerifyViewModel.class); + viewModel.getUnreadCount(new FetchCallback() { + @Override + public void onSuccess(@Nullable Integer integer) { + binding.tvAddfriendsApplynumber.setVisibility(integer > 0 ? View.VISIBLE : View.GONE); + binding.tvAddfriendsApplynumber.setText(integer + ""); + } + + @Override + public void onFailed(int i) { + + } + + @Override + public void onException(@Nullable Throwable throwable) { + + } + }); + } + + /** + * 一些回调通知。 + * + * @param requestCode 请求码 + * @param resultCode 结果码 + * @param data 数据 + */ + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (resultCode == RESULT_OK && data != null) { + switch (requestCode) { + // 从2维码扫描界面返回的结果回调 + case 1016: + Object obj = data.getParcelableExtra(ScanUtilNew.RESULT); + if (obj instanceof HmsScan) { + if (!TextUtils.isEmpty(((HmsScan) obj).getOriginalValue())) { + String result1 = ((HmsScan) obj).getOriginalValue(); +// String result = CameraScan.parseScanResult(data); +// Log.v(TAG, "2维码扫码结果:" + result); + Log.v("LAILIAOLIAO", "行动码是啥:" + result1); + + // 开始解析2维码内容并进入相应的处理逻辑 + processQRCodeScanResult(this, result1); + } + break; + } + } + } + } + + /** + * 解析2维码扫码结果并进入相应和业务逻辑处理(主要用于从2维码扫描界面扫描完成后的回调结果处理)。 + * + * @param originalQrcodeStr 扫描出的原始2维码字符串,形如"time_go_chat://add_user/400069" + */ + public void processQRCodeScanResult(Activity activity, String originalQrcodeStr) { + if (originalQrcodeStr != null) { + try { + if (originalQrcodeStr.startsWith(IMUIKitConfig.SHARE_INVCODE_START) && originalQrcodeStr.contains("userId")) { + originalQrcodeStr = originalQrcodeStr.replace(IMUIKitConfig.SHARE_INVCODE_START, "https://www.baidu.com"); + Uri uri = Uri.parse(originalQrcodeStr); + LogUtils.i("数据是啥:" + originalQrcodeStr); + String id = uri.getQueryParameter("userId"); //id 值 10943 + + XKitRouter.withKey(RouterConstant.PATH_USER_INFO_PAGE) + .withContext(activity) + .withParam(RouterConstant.KEY_ACCOUNT_ID_KEY, id) + .withParam("userId", id) + .navigate(); + } else if (originalQrcodeStr.startsWith(IMUIKitConfig.SHARE_INVCODE_START) && originalQrcodeStr.contains("teamId")) { + originalQrcodeStr = originalQrcodeStr.replace(IMUIKitConfig.SHARE_INVCODE_START, "https://www.baidu.com"); + Uri uri = Uri.parse(originalQrcodeStr); + LogUtils.i("数据是啥:" + originalQrcodeStr); + String id = uri.getQueryParameter("teamId"); //id 值 10943 + showQrcodeView(id); + + } else if (originalQrcodeStr.startsWith(IMUIKitConfig.SHARE_INVCODE_START) && originalQrcodeStr.contains("machineId") && originalQrcodeStr.contains("orderNo")) { + originalQrcodeStr = originalQrcodeStr.replace(IMUIKitConfig.SHARE_INVCODE_START, "https://www.baidu.com"); + Uri uri = Uri.parse(originalQrcodeStr); + LogUtils.i("数据是啥:" + originalQrcodeStr); + String machineId = uri.getQueryParameter("machineId"); //id 值 10943 + String orderNo = uri.getQueryParameter("orderNo"); //id 值 10943 + String money = uri.getQueryParameter("money"); + showGiftView(machineId, orderNo, money); + + } else if (originalQrcodeStr.startsWith(IMUIKitConfig.SHARE_INVCODE_START) && originalQrcodeStr.contains("silver_qr_code")) { + originalQrcodeStr = originalQrcodeStr.replace(IMUIKitConfig.SHARE_INVCODE_START, "https://www.baidu.com"); + Uri uri = Uri.parse(originalQrcodeStr); + String silverQrCode = uri.getQueryParameter("silver_qr_code"); // + Intent intent2 = new Intent(AddFriendsActivity.this, JsBridgeActivity.class); + intent2.putExtra("url", IMUIKitConfig.SILVER_URL + silverQrCode); + intent2.putExtra("isV", false); + intent2.putExtra("isGame", false); + startActivity(intent2); + } else { + QRCodeScheme.QRCodeData qrData = QRCodeScheme.parseCodeData(originalQrcodeStr); + // 2维码内容前缀(形如“time_go_chat://add_user/”) + LogUtils.i("行动码是啥111:" + GsonUtils.beanToJSONString(qrData)); + + String scheme = qrData.getScheme(); + // 2维码内容(形如“400069”) + String value = qrData.getValue(); + String uid = qrData.getUserId(); + if (!CommonUtils.isStringEmpty(scheme, true) && !CommonUtils.isStringEmpty(value, true)) { + LogUtils.i("行动码是啥222:" + scheme); + + switch (scheme) { + case QRCodeScheme.QR_CODE_SCHEME_ADD_USER: +// QueryFriendInfo.gotoWatchUserInfo(activity, value, null); +// if (value.equals(IMKitClient.account())) { +// activityMainBinding.myselfBtnGroup.performClick(); +// return; +// } + + XKitRouter.withKey(RouterConstant.PATH_USER_INFO_PAGE) + .withContext(activity) + .withParam(RouterConstant.KEY_ACCOUNT_ID_KEY, value) + .withParam("userId", value) + .navigate(); + +// Intent intent = new Intent(AddFriendsActivity.this, UserInfoActivity.class); +// intent.putExtra("uid",value); +// startActivity(intent); + break; + case QRCodeScheme.QR_CODE_PSCHEME_JOIN_GROUP: +// activity.startActivity(IntentFactory.createJoinGroupIntent(activity, value)); +// ToastX.showShortToast("这里是要跳加入群聊的逻辑"); + showQrcodeView(value); + break; + case QRCodeScheme.QR_CODE_PSCHEME_LOGIN_WEB: + showShouQuan(value); + break; + case QRCodeScheme.QR_CODE_PSCHEME_PAYMENT_CODE: + Intent intent = new Intent(AddFriendsActivity.this, PaymentActivity.class); + intent.putExtra("userId", value); + startActivity(intent); + break; + +// case QRCodeScheme.QR_CODE_PSCHEME_PAYMENT_OUTER_CODE: +// Intent intent1 = new Intent(AddFriendsActivity.this, CollectionActivity.class); +// intent1.putExtra("code", value); +// intent1.putExtra("uid", uid); +// startActivity(intent1); +// break; + case QRCodeScheme.QR_CODE_PSCHEME_PAYMENT_ATM: + if (DataUtils.get(AddFriendsActivity.this, "hasFinger", false)) { + showPayCashFingerDialog(value, uid, MainActivity.TYPE_PAYMENT_DUIBI); + } else { + showPayCashDialog(value, uid, MainActivity.TYPE_PAYMENT_DUIBI); + } + break; + case QRCodeScheme.QR_CODE_PSCHEME_PAYMENT_BEAD: + if (DataUtils.get(AddFriendsActivity.this, "hasFinger", false)) { + showPayCashFingerDialog(value, uid, MainActivity.TYPE_PAYMENT_BEAD); + } else { + showPayCashDialog(value, uid, MainActivity.TYPE_PAYMENT_BEAD); + } + break; + + case QRCodeScheme.QR_CODE_PSCHEME_SILVER_QR_CODE: + Intent intent2 = new Intent(AddFriendsActivity.this, JsBridgeActivity.class); + intent2.putExtra("url", IMUIKitConfig.SILVER_URL + value); + intent2.putExtra("isV", false); + intent2.putExtra("isGame", true); + startActivity(intent2); + break; + case QRCodeScheme.QR_CODE_PSCHEME_BIZ_RECEIVE: + Intent intent3 = new Intent(AddFriendsActivity.this, PaymentActivity.class); + intent3.putExtra("userId", value); + intent3.putExtra("userType", 1); + startActivity(intent3); + break; + + default: + if (scheme.startsWith("http")) { + if (scheme.startsWith("https://admin.letschat2023.com/") && scheme.contains("deviceId")) { + sendMachine(scheme); + } else { +// activity.startActivity(IntentFactory.createCommonWebActivity2Intent(activity, scheme, "", true)); + showErrCode(getString(R.string.qrcode_scan_activity_not_surpport_qrcontent)); + + } + } else { +// ToastX.showLongToast(getString(R.string.qrcode_scan_activity_not_surpport_qrcontent)); + //Context context, String content, String cancel, String sure,boolean showCancel + showErrCode(getString(R.string.qrcode_scan_activity_not_surpport_qrcontent)); + } + break; + } + } else { + if (scheme.startsWith("http")) { + if (scheme.startsWith("https://admin.letschat2023.com/") && scheme.contains("deviceId")) { + sendMachine(scheme); + } else { +// activity.startActivity(IntentFactory.createCommonWebActivity2Intent(activity, scheme, "", true)); + showErrCode(getString(R.string.qrcode_scan_activity_not_surpport_qrcontent)); + + } + } else { +// ToastX.showLongToast(getString(R.string.qrcode_scan_activity_not_surpport_qrcontent)); + showErrCode(getString(R.string.qrcode_scan_activity_not_surpport_qrcontent)); + + } + } + } + } catch (Exception e) { + + } + } else { +// ToastX.showLongToast(R.string.); + showErrCode(getString(R.string.qrcode_scan_activity_not_invalid_qrcode)); + + } + } + + private String orderNo; + + private void showGiftView(String machineId, String orderNos, String moneys) { + this.orderNo = orderNos; + LogUtils.i("进来了啊"); + + if (bindBean != null) { + if (!bindBean.getPhoneBind()) { + showDialog(); + } else if (!bindBean.getPayPasswordSet()) { + showDialogPay(); + } else { + LogUtils.i("进来了啊11111"); + + if (DataUtils.get(AddFriendsActivity.this, "hasFinger", false)) { + showPayCashFingerDialog(machineId, moneys, MainActivity.TYPE_PAYMENT_GIFT); + } else { + LogUtils.i("进来了啊22222222"); + + showPayCashDialog(machineId, moneys, MainActivity.TYPE_PAYMENT_GIFT); + } + } + } + } + + + private void showDialogPay() { + + com.netease.yunxin.kit.chatkit.ui.dialog.ActionConfirmDialog actionDialog = new com.netease.yunxin.kit.chatkit.ui.dialog.ActionConfirmDialog(AddFriendsActivity.this, + getString(com.netease.yunxin.kit.chatkit.ui.R.string.bind_phone_des_txt1), getString(com.netease.yunxin.kit.chatkit.ui.R.string.cancel_txt), getString(com.netease.yunxin.kit.chatkit.ui.R.string.to_sett_txt)); + actionDialog.setOnToActionListener(new com.netease.yunxin.kit.chatkit.ui.dialog.ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { +// Intent intent = new Intent(UserInfoActivity.this, ChangeAccoutActionActivity.class); +// intent.putExtra("type", 5); +// startActivity(intent); + Intent intent = new Intent(AddFriendsActivity.this, SetPayPasswordActivity.class); + startActivity(intent); + } + + @Override + public void toCancel() { + + } + }); + actionDialog.show(); + } + + private void showDialog() { + + ActionConfirmDialog actionDialog = new ActionConfirmDialog(AddFriendsActivity.this, + getString(R.string.bind_phone_des_txt), getString(R.string.nobind_txt), getString(R.string.tobind_txt)); + actionDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + Intent intent = new Intent(AddFriendsActivity.this, ChangeAccoutActionActivity.class); + intent.putExtra("type", ChangeAccoutActionActivity.TYPE_BIND_PHONE); + startActivity(intent); + } + + @Override + public void toCancel() { + + } + }); + actionDialog.show(); + } + + private void showShouQuan(String value) { + Intent intent = new Intent(AddFriendsActivity.this, AuthorizeActivity.class); + intent.putExtra("deviceId", value); + intent.putExtra("isWebLogin", true); + startActivity(intent); + } + + PayCashDialog payDialog; + PayCashFingerDialog payCashFingerDialog; + + BindBean bindBean; + WalletBean walletBean; + + private void showPayCashDialog(String did, String number, int type) { + payDialog = new PayCashDialog(AddFriendsActivity.this, (Integer.parseInt(number)) + "", true, 0, walletBean, + null, 2, String.format(getString(R.string.fukuangei_txt), getString(R.string.duibiji_txt))); + if (type == MainActivity.TYPE_PAYMENT_GIFT) { + LogUtils.i("进来了啊33333332222222222"); + + payDialog = new PayCashDialog(AddFriendsActivity.this, (Integer.parseInt(number)) + "", true, 0, walletBean, + null, 2, String.format(getString(R.string.fukuangei_txt), getString(R.string.duibiji_txt2)), 1); + } else if (type == MainActivity.TYPE_PAYMENT_BEAD) { + payDialog = new PayCashDialog(AddFriendsActivity.this, (Integer.parseInt(number)) + "", true, 0, walletBean, + null, 2, String.format(getString(R.string.fukuangei_txt), getString(R.string.shuzhuji_txt))); + } + payDialog.setOntoAlbumListener(new PayCashDialog.OnListItemClickListener() { + @Override + public void onPayPass(String position) { + if (type == MainActivity.TYPE_PAYMENT_DUIBI) { + toChange(position, did, number, 1); + } else if (type == MainActivity.TYPE_PAYMENT_BEAD) { + toChange2(position, did, number, 1); + } else { + toChange1(position, did, number, 1); + } + } + + @RequiresApi(api = Build.VERSION_CODES.M) + @Override + public void onChangeFinger() { + showPayCashFingerDialog(did, number, type); + } + + @Override + public void dimess() { + payDialog.dismiss(); + + } + }); + payDialog.show(); + } + + private void getWallet() { + Api.getInstance().walletInfo(IMKitClient.account()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { + walletBean = feedbackResp.data; + RxBus.getInstance().post(walletBean); + } + + @Override + public void onError(int code, String msg) { +// WidgetUtils.showToast(getActivity(), msg, WidgetUtils.ToastType.ERROR); + + } + }); + + + } + + private void toChange(String password, String did, String number, int type) { + Map maps = new HashMap<>(); + maps.put("amount", Integer.parseInt(number) * 100); + maps.put("payVerifyCode", type); + if (!TextUtils.isEmpty(password)) { + maps.put("payPassword", password); + } + maps.put("deviceId", did); + Api.getInstance().selfHelpATM(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver() { + @Override + public void onSuccess(Result feedbackResp) { + ToastX.showShortToast(getString(R.string.zhiufuchengg_txt)); + getWallet(); + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast(msg); + + } + }); + } + + private void showPayCashFingerDialog(String did, String number, int type) { + //Context context, String data, boolean showNumber, int payType, WalletBean walletBean, SelectPayTypeDialog.OnToTypeListener onToTypeListener, int isShowFinger + payCashFingerDialog = new PayCashFingerDialog(this, (Integer.parseInt(number)) + "", true, 0, walletBean, null, 2, + String.format(getString(R.string.fukuangei_txt), getString(R.string.duibiji_txt))); + if (type == MainActivity.TYPE_PAYMENT_GIFT) { + payCashFingerDialog = new PayCashFingerDialog(this, (Integer.parseInt(number)) + "", true, 0, walletBean, null, 2, + String.format(getString(R.string.fukuangei_txt), getString(R.string.duibiji_txt2)), true); + } else if (type == MainActivity.TYPE_PAYMENT_BEAD) { + payCashFingerDialog = new PayCashFingerDialog(this, (Integer.parseInt(number)) + "", true, 0, walletBean, null, 2, + String.format(getString(R.string.fukuangei_txt), getString(R.string.shuzhuji_txt))); + } + payCashFingerDialog.setOntoAlbumListener(new PayCashFingerDialog.OnListItemClickListener() { + @Override + public void onChangePassword() { + showPayCashDialog(did, number, type); + } + + @Override + public void toFinger() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + checkPayFinger(did, number, type); + } + } + + @Override + public void dimess() { + payCashFingerDialog.dismiss(); + } + }); + payCashFingerDialog.show(); + } + + @RequiresApi(api = Build.VERSION_CODES.M) + private void checkPayFinger(String did, String number, int type) { + + FingerManager.build().setApplication(IMApplication.getInstance()) + .setTitle(" ") + .setDes(" ") + .setNegativeText(" ") + .setFingerCheckCallback(new SimpleFingerCheckCallback() { + + @Override + public void onSucceed() { + ToastX.showShortToast("验证成功"); + payCashFingerDialog.dismiss(); + if (type == MainActivity.TYPE_PAYMENT_DUIBI) { + toChange(null, did, number, 2); + } else if (type == MainActivity.TYPE_PAYMENT_BEAD) { + toChange2(null, did, number, 2); + } else { + toChange1(null, did, number, 2); + } + } + + @Override + public void onError(String error) { + ToastX.showShortToast("验证失败"); + + } + + @Override + public void onCancel() { + ToastX.showShortToast("您取消了识别"); + + } + }) + .setFingerChangeCallback(new AonFingerChangeCallback() { + + @Override + protected void onFingerDataChange() { + ToastX.showShortToast("指纹数据发生了变化"); + FingerManager.updateFingerData(AddFriendsActivity.this); + new Handler().postDelayed(() -> checkPayFinger(did, number, type), 1000); + } + }) + .create() + .startListener(AddFriendsActivity.this); + } + + + private void toChange1(String password, String did, String number, int type) { + Map maps = new HashMap<>(); + maps.put("amount", Long.parseLong(number) * 100); + maps.put("orderNo", orderNo); + maps.put("payVerifyCode", type); + if (!TextUtils.isEmpty(password)) { + maps.put("payPassword", password); + } + Api.getInstance().cabinet(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver() { + @Override + public void onSuccess(Result feedbackResp) { + ToastX.showShortToast(getString(R.string.zhiufuchengg_txt)); + getWallet(); + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast(msg); + + } + }); + } + + private void toChange2(String password, String did, String number, int type) { + Map maps = new HashMap<>(); + maps.put("amount", Integer.parseInt(number) * 100); + maps.put("payVerifyCode", type); + if (!TextUtils.isEmpty(password)) { + maps.put("payPassword", password); + } + maps.put("deviceId", did); + Api.getInstance().danzhuPay(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver() { + @Override + public void onSuccess(Result feedbackResp) { + ToastX.showShortToast(getString(R.string.zhiufuchengg_txt)); + getWallet(); + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast(msg); + + } + }); + } + + + private void showErrCode(String errorMessage) { + ActionConfirmDialog actionConfirmDialog = new ActionConfirmDialog(AddFriendsActivity.this, errorMessage, "", + getString(R.string.general_got_it), false); + actionConfirmDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + } + + @Override + public void toCancel() { + + } + }); + actionConfirmDialog.show(); + } + + + private ImageView coloseIv; + private TextView joinTitleTv; + private ContactAvatarView groupHeadIv; + private TextView joinTv; + private TextView groupNameTv; + + private void showQrcodeView(String groupId) { + BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(this, R.style.BottomSheetDialog); + + View bottomView = LayoutInflater.from(AddFriendsActivity.this).inflate(R.layout.bottom_sheet_join_group, null); + coloseIv = (ImageView) bottomView.findViewById(R.id.colose_iv); + joinTitleTv = (TextView) bottomView.findViewById(R.id.join_title_tv); + groupHeadIv = (ContactAvatarView) bottomView.findViewById(R.id.group_head_iv); + joinTv = (TextView) bottomView.findViewById(R.id.join_tv); + Team team = NIMClient.getService(TeamService.class).queryTeamBlock(groupId); + groupNameTv = (TextView) bottomView.findViewById(R.id.group_name_tv); + if (team != null) { + if (TextUtils.isEmpty(team.getIcon())) { + groupHeadIv.setData(com.netease.yunxin.kit.contactkit.ui.R.mipmap.ic_group_defaulthead, "head"); + } else { + groupHeadIv.setData(team.getIcon(), team.getName()); + } + groupNameTv.setText(team.getName()); + if (team.isMyTeam()) { + LogUtils.i("加入群聊成功1111111111111111111"); + joinTitleTv.setText(R.string.jinru_group_txt); + joinTv.setText(R.string.jinru_group_txt); + } else { + LogUtils.i("加入群聊成功22222222222222"); + + joinTitleTv.setText(R.string.join_group_txt); + joinTv.setText(R.string.join_group_txt); + } + joinTv.setOnClickListener(v -> { + if (team.isMyTeam()) { + bottomSheetDialog.dismiss(); + XKitRouter.withKey(RouterConstant.PATH_FUN_CHAT_TEAM_PAGE) + .withParam(RouterConstant.CHAT_KRY, team) + .withContext(AddFriendsActivity.this) + .navigate(); + LogUtils.i("加入群聊成功33333333333333"); + + } else { + NIMClient.getService(TeamService.class).applyJoinTeam(groupId, null).setCallback(new RequestCallback() { + @Override + public void onSuccess(Team team1) { + LogUtils.i("加入群聊成功4444444444444444444"); + + LogUtils.i("加入群聊成功:" + GsonUtils.beanToJSONString(team1)); + bottomSheetDialog.dismiss(); + + XKitRouter.withKey(RouterConstant.PATH_FUN_CHAT_TEAM_PAGE) + .withParam(RouterConstant.CHAT_KRY, team1) + .withContext(AddFriendsActivity.this) + .navigate(); + } + + @Override + public void onFailed(int code) { + //仅仅是申请成功,code 808 + if (code == ResponseCode.RES_TEAM_APPLY_SUCCESS) { + bottomSheetDialog.dismiss(); + + ToastX.showShortToast(R.string.dendaiqueren_txt); + } + // 已经在群里,code 809 + else if (code == ResponseCode.RES_TEAM_ALREADY_IN) { + getJoinInfo(groupId, true, bottomSheetDialog); + // 群人数已达上限 + } else if (code == ResponseCode.RES_TEAM_LIMIT) { + bottomSheetDialog.dismiss(); + + ToastX.showShortToast(R.string.team_num_limit); + } else { + bottomSheetDialog.dismiss(); + + ToastX.showShortToast("failed, error code =" + code); + + } + } + + @Override + public void onException(Throwable exception) { + // error + bottomSheetDialog.dismiss(); + + ToastX.showShortToast(exception.getMessage()); + + } + }); + } + }); + } else { + joinTitleTv.setText(R.string.join_group_txt); + joinTv.setText(R.string.join_group_txt); + getJoinInfo(groupId, false, bottomSheetDialog); + LogUtils.i("加入群聊成功555555555555"); + + joinTv.setOnClickListener(v -> NIMClient.getService(TeamService.class).applyJoinTeam(groupId, null).setCallback(new RequestCallback() { + @Override + public void onSuccess(Team team1) { + LogUtils.i("加入群聊成功:" + GsonUtils.beanToJSONString(true)); + LogUtils.i("加入群聊成功6666666666666666"); + bottomSheetDialog.dismiss(); + XKitRouter.withKey(RouterConstant.PATH_FUN_CHAT_TEAM_PAGE) + .withParam(RouterConstant.CHAT_KRY, team1) + .withContext(AddFriendsActivity.this) + .navigate(); + } + + @Override + public void onFailed(int code) { + //仅仅是申请成功,code 808 + if (code == ResponseCode.RES_TEAM_APPLY_SUCCESS) { + bottomSheetDialog.dismiss(); + + ToastX.showShortToast(R.string.dendaiqueren_txt); + } + // 已经在群里,code 809 + else if (code == ResponseCode.RES_TEAM_ALREADY_IN) { + + getJoinInfo(groupId, true, bottomSheetDialog); + // 群人数已达上限 + } else if (code == ResponseCode.RES_TEAM_LIMIT) { + bottomSheetDialog.dismiss(); + + ToastX.showShortToast(R.string.team_num_limit); + } else { + bottomSheetDialog.dismiss(); + + ToastX.showShortToast("failed, error code =" + code); + + } + } + + @Override + public void onException(Throwable exception) { + // error + ToastX.showShortToast(exception.getMessage()); + + } + })); + + } + + + coloseIv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + bottomSheetDialog.dismiss(); + } + }); + + bottomSheetDialog.setContentView(bottomView); + bottomSheetDialog.show(); + + bottomSheetDialog.setOnDismissListener(dialog -> getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white))); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + AdaptScreenUtils.setWhiteNavigationBar(bottomSheetDialog); + } + + } + + private void getJoinInfo(String gid, boolean b, BottomSheetDialog dialog) { + NIMClient.getService(TeamService.class).searchTeam(gid).setCallback(new RequestCallback() { + @Override + public void onSuccess(Team result) { + if (!b) { + LogUtils.i("加入群聊成功7777777777777777"); + groupHeadIv.setData(result.getIcon(), result.getName()); + groupNameTv.setText(result.getName()); + } else { + LogUtils.i("加入群聊成功88888888888888"); + dialog.dismiss(); + XKitRouter.withKey(RouterConstant.PATH_FUN_CHAT_TEAM_PAGE) + .withParam(RouterConstant.CHAT_KRY, result) + .withContext(AddFriendsActivity.this) + .navigate(); + } + + } + + @Override + public void onFailed(int code) { + dialog.dismiss(); + } + + @Override + public void onException(Throwable exception) { + dialog.dismiss(); + } + }); + } + + private void sendMachine(String scheme) { + scheme = scheme.replace("https://admin.letschat2023.com/#/downLoad", "https://www.baidu.com"); + Uri uri = Uri.parse(scheme); + LogUtils.i("数据是啥:" + scheme); + String id = uri.getQueryParameter("deviceId"); //id 值 10943 +// String[] did = scheme.split("deviceId="); +// LogUtils.i("数据是啥:"+did[1]); +// if(did.length>1) { + Intent intent = new Intent(AddFriendsActivity.this, AuthorizeActivity.class); + intent.putExtra("deviceId", id); + startActivity(intent); +// } + } + + + @Override + protected void onResume() { + super.onResume(); + initData(); + if (bindBean == null || (!bindBean.getPhoneBind()) || (!bindBean.getPayPasswordSet())) { + bindInfo(); + } + getWallet(); + } + + private void bindInfo() { + Api.getInstance().bindInfo(IMKitClient.account()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + bindBean = feedbackResp.data; + LogUtils.i("获取到的数据:" + GsonUtils.beanToJSONString(bindBean)); + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + } + }); + + } + + private ImageView coloseIv2; + private LinearLayout qrcodeLy; + private ImageView qrcodeIv; + private TextView qrcodeTipsTv; + private LinearLayout qrcodeActionLy; + private TextView copyTv; + private TextView shareTv; + private TextView saveTv; + private TextView shuaxinTv; + + @RequiresApi(api = Build.VERSION_CODES.M) + private void showQrcodeView() { + BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(this, R.style.BottomSheetDialog); + + View bottomView = LayoutInflater.from(AddFriendsActivity.this).inflate(R.layout.bottom_sheet_qrcode_layout, null); + + coloseIv2 = (ImageView) bottomView.findViewById(R.id.colose_iv); + qrcodeLy = (LinearLayout) bottomView.findViewById(R.id.qrcode_ly); + qrcodeIv = (ImageView) bottomView.findViewById(R.id.qrcode_iv); + qrcodeTipsTv = (TextView) bottomView.findViewById(R.id.qrcode_tips_tv); + qrcodeActionLy = (LinearLayout) bottomView.findViewById(R.id.qrcode_action_ly); + copyTv = (TextView) bottomView.findViewById(R.id.copy_tv); + shareTv = (TextView) bottomView.findViewById(R.id.share_tv); + saveTv = (TextView) bottomView.findViewById(R.id.save_tv); + shuaxinTv = (TextView) bottomView.findViewById(R.id.shuaxin_tv); + + LoginBean loginBean = DataUtils.getLocUserInfo(); + Bitmap bitmap = CodeUtils.createQRCode(String.format(IMUIKitConfig.SHARE_INVCODE1, IMKitClient.account()), DataUtils.dip2px(this, 175.0f), null); + if (loginBean != null) { + bitmap = CodeUtils.createQRCode(String.format(IMUIKitConfig.SHARE_ADD_USER, loginBean.getUser().getInviteCode(), IMKitClient.account()), DataUtils.dip2px(this, 175.0f), null); + } + if (bitmap != null) { + qrcodeIv.setImageBitmap(bitmap); + } + + shuaxinTv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + ToastX.showShortToast(R.string.shuaxinchenggong_txt); + } + }); + + coloseIv2.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + bottomSheetDialog.dismiss(); + } + }); + + saveTv.setOnClickListener(v -> { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { +// if (PermissionUtils.hasPermissions( +// AddFriendsActivity.this, Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO)) { +// doSaveQrcode(); +// } else { +// requestCameraPermission( +// ); +// } + doSaveQrcode(); + } else { + if (PermissionUtils.hasPermissions( + AddFriendsActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE)) { + doSaveQrcode(); + } else { + requestCameraPermission( + Manifest.permission.READ_EXTERNAL_STORAGE); + } + } + }); + + shareTv.setOnClickListener(v -> { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { +// if (PermissionUtils.hasPermissions( +// AddFriendsActivity.this, Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO)) { +// showBottomShare(); +// } else { +// requestCameraPermission( +// ); +// } + showBottomShare(); + } else { + if (PermissionUtils.hasPermissions( + AddFriendsActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE)) { + showBottomShare(); + } else { + requestCameraPermission( + Manifest.permission.READ_EXTERNAL_STORAGE); + } + } + }); + + copyTv.setOnClickListener(v -> { + if (loginBean != null) { + LogUtils.i("数据是啥:" + GsonUtils.beanToJSONString(loginBean)); + String url = String.format(IMUIKitConfig.SHARE_INVCODE, loginBean.getUser().getInviteCode(), IMKitClient.account()); + DataUtils.copy(url, AddFriendsActivity.this); + ToastX.showShortToast(R.string.fuzhichenggong_txt); + } + }); + + bottomSheetDialog.setContentView(bottomView); + bottomSheetDialog.show(); + + bottomSheetDialog.setOnDismissListener(dialog -> getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white))); + AdaptScreenUtils.setWhiteNavigationBar(bottomSheetDialog); + } + + private void requestCameraPermission(String permission) { + permissionLauncher.launch(new String[]{permission}); + } + + protected ActivityResultLauncher permissionLauncher; + + private void requestCameraPermission() { + permissionLauncher.launch(new String[]{Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO}); + } + + @RequiresApi(api = Build.VERSION_CODES.M) + public void showBottomShare() { + titleUsers = shareDateUtils.getConverstionShareInfo(); + titleUsersIsCheck = new ArrayList<>(); + for (UserShareBean conversationInfo : titleUsers) { + titleUsersIsCheck.add(false); + } + if (titleUsers == null || titleUsers.size() == 0) { + ToastX.showShortToast(R.string.mykfxfddx_txt); + return; + } + BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(this, R.style.BottomSheetDialog); + + View bottomView = LayoutInflater.from(AddFriendsActivity.this).inflate(R.layout.bottom_sheet_layout, null); + + + coloseIvShare = (ImageView) bottomView.findViewById(R.id.colose_iv); + recyclerShare = (RecyclerView) bottomView.findViewById(R.id.recycler); + commentEtShare = (EditText) bottomView.findViewById(R.id.comment_et); + + shareBt = (TextView) bottomView.findViewById(R.id.share_bt); + initList(); + bottomSheetDialog.setContentView(bottomView); + bottomSheetDialog.show(); + coloseIvShare.setOnClickListener(v -> bottomSheetDialog.dismiss()); + bottomSheetDialog.setOnDismissListener(dialog -> getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white))); + shareBt.setOnClickListener(v -> { + + boolean isSelect = false; + for (Boolean type : titleUsersIsCheck) { + if (type) { + isSelect = true; + } + } + if (!isSelect) { + ToastX.showShortToast(getString(R.string.qxxzyfxddx_txt)); + return; + } + doSaveQrcodeShare(bottomSheetDialog); + }); + AdaptScreenUtils.setWhiteNavigationBar(bottomSheetDialog); + + } + + private ImageView coloseIvShare; + private RecyclerView recyclerShare; + private EditText commentEtShare; + private TextView shareBt; + private LinearLayoutManager linearLayoutManager; + private CommonAdapter commonAdapter; + private ArrayList titleUsers; + private ArrayList titleUsersIsCheck; + + private void initList() { + + + linearLayoutManager = new LinearLayoutManager(AddFriendsActivity.this); + linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); + recyclerShare.setLayoutManager(linearLayoutManager); + commonAdapter = new CommonAdapter<>(AddFriendsActivity.this, R.layout.item_share_list, titleUsers) { + @Override + public void convert(ViewHolder holder, UserShareBean s, int index) { + ImageView select_iv = holder.getView(R.id.select_iv); + if (titleUsersIsCheck.get(index)) { + select_iv.setImageResource(R.mipmap.dialog_item_gou); + } else { + select_iv.setImageResource(R.mipmap.dialog_item_quan); + } + + ContactAvatarView imageView = holder.getView(R.id.logo_iv); + + if (s.getTeamInfo() != null) { + if (TextUtils.isEmpty(s.getTeamInfo().getIcon())) { + imageView.setData(com.netease.yunxin.kit.conversationkit.ui.R.drawable.ic_group_defaulthead, s.getTeamInfo().getName()); + } else { + imageView.setData( + s.getTeamInfo().getIcon(), s.getTeamInfo().getName(), AvatarColor.avatarColor(s.getTeamInfo().getId())); + } + holder.setText(R.id.title_tv, s.getTeamInfo().getName()); + } else { + ColorUtils.loadAvator(s.getFriendInfo().getAvatar(), imageView); +// imageView.setData( +// s.getFriendInfo().getAvatar(), s.getFriendInfo().getName(), AvatarColor.avatarColor(s.getFriendInfo().getAccount())); + holder.setText(R.id.title_tv, s.getFriendInfo().getName()); + + } + + holder.getView(R.id.big_bg).setOnClickListener(v -> { + titleUsersIsCheck.set(index, !titleUsersIsCheck.get(index)); + commonAdapter.notifyItemChanged(index, titleUsersIsCheck.get(index)); + LogUtils.i("0000000000"); + + changeItemButton(); + }); + } + }; + recyclerShare.setAdapter(commonAdapter); + } + + private void changeItemButton() { + LogUtils.i("1111111111111111"); + boolean isSelcet = false; + for (boolean item : titleUsersIsCheck) { + if (item) { + isSelcet = true; + break; + } + } + chagnBottom(isSelcet); + + } + + private void chagnBottom(boolean b) { + LogUtils.i("22222222222:" + b); + + if (b) { + shareBt.setBackground(getResources().getDrawable(R.drawable.button_true_bg)); + shareBt.setEnabled(true); + } else { + shareBt.setBackground(getResources().getDrawable(R.drawable.button_false_bg_new)); + shareBt.setEnabled(false); + + } + } + + /** + * 将2维码保存到系统相册。 + */ + private void doSaveQrcode() { + // 先生成bitmap对象 + Bitmap bmp = DataUtils.generateBitmap(qrcodeLy); + // bitmap对象生成成功 + if (bmp != null) { + // 保存到相册成功 + if (ToolKits.saveBmp2Gallery(AddFriendsActivity.this, bmp)) { + ToastX.showShortToast(getString(R.string.qrcode_generate_activity_qr_save_sucess)); + } else { + ToastX.showShortToast(getString(R.string.qrcode_generate_activity_qr_save_fail)); + } + } else { + Log.w("doSaveQrcode", "将2维码保存到相册时失败了,从view生成Bitmap对象失败,生成后的bmp=null!"); + ToastX.showShortToast(getString(R.string.qrcode_generate_activity_qr_generate_fail)); + } + } + + + /** + * 将2维码保存到系统相册。 + */ + private void doSaveQrcodeShare(BottomSheetDialog bottomSheetDialog) { + // 先生成bitmap对象 + Bitmap bmp = DataUtils.generateBitmap(qrcodeLy); + // bitmap对象生成成功 + if (bmp != null) { + // 保存到相册成功 + + Uri fileUri = ToolKits.saveBmp2GalleryShare(AddFriendsActivity.this, bmp); + if (fileUri != null) { +// ToastX.showShortToast(getString(R.string.qrcode_generate_activity_qr_save_sucess)); + sendMessage(fileUri); + } else { + ToastX.showShortToast(getString(R.string.qrcode_generate_activity_qr_save_fail)); + } + } else { + Log.w("doSaveQrcode", "将2维码保存到相册时失败了,从view生成Bitmap对象失败,生成后的bmp=null!"); + ToastX.showShortToast(getString(R.string.qrcode_generate_activity_qr_generate_fail)); + } + bottomSheetDialog.dismiss(); + } + + Handler mHandler = new Handler(); + + private void sendMessage(Uri uri) { + mHandler.postDelayed(() -> { + File imageFile = UriUtils.uri2File(uri); + + for (int i = 0; i < titleUsersIsCheck.size(); i++) { + if (titleUsersIsCheck.get(i)) { + toShareMessage(titleUsers.get(i), imageFile); + } + } + + }, 100); + } + + private void toShareMessage(UserShareBean conversationInfo, File imageFile) { + IMMessage imageMsg = null; + if (conversationInfo.getTeamInfo() != null) { + imageMsg = MessageBuilder.createImageMessage(conversationInfo.getTeamInfo().getId(), SessionTypeEnum.Team, imageFile); + } else if (conversationInfo.getFriendInfo() != null) { + imageMsg = MessageBuilder.createImageMessage(conversationInfo.getFriendInfo().getAccount(), SessionTypeEnum.P2P, imageFile); + } + if (imageMsg != null) { + ChatRepo.sendMessage( + imageMsg, + false, + new FetchCallbackImpl() { + @Override + public void onSuccess(@Nullable Void param) { + super.onSuccess(param); + ToastX.showShortToast(R.string.qrcode_share_succ_txt); + } + + @Override + public void onFailed(int code) { + + } + }); + } + } + + + public void startCreateGroup() { + startActivity(new Intent(this, FunContactSelectorActivity.class).putExtra(KEY_CONTACT_SELECTOR_MAX_COUNT, DEFAULT_MAX_SELECT_COUNT).putExtra(KEY_REQUEST_SELECTOR_NAME_ENABLE, true)); + } + + + FunAddFriendsBottomDialog addFriendsBottomDialog; + + public void showSendMsgDialog(UserInfo userInfo, ContactUserInfoBean contactUserInfoBean, + boolean isVerify) { + addFriendsBottomDialog = new FunAddFriendsBottomDialog(this) + .configUser(userInfo.getName(), userInfo.getAvatar()); + addFriendsBottomDialog.show( + () -> { + if (!NetworkUtils.isConnected()) { + Toast.makeText(this, com.netease.yunxin.kit.contactkit.ui.R.string.contact_network_error_tip, Toast.LENGTH_SHORT).show(); + return; + } + //发送 + String account = ""; + if (contactUserInfoBean.data == null) { + if (contactUserInfoBean.friendInfo != null) { + account = contactUserInfoBean.friendInfo.getAccount(); + } + } else { + account = contactUserInfoBean.data.getAccount(); + } + addfriend(account, addFriendsBottomDialog.getVerifyMsg(), isVerify); + finish(); + }); + + } + + public void addfriend(String account, String verifymsg, boolean isVerify) { + userinfoviewModel.addFriendVerifyMsg( + account, + verifymsg, + isVerify, + new FetchCallback() { + @Override + public void onSuccess(@Nullable Void param) { + Toast.makeText( + AddFriendsActivity.this, + getResources().getString(com.netease.yunxin.kit.contactkit.ui.R.string.add_friend_operate_success), + Toast.LENGTH_SHORT) + .show(); + } + + @Override + public void onFailed(int code) { + String tips = getResources().getString(com.netease.yunxin.kit.contactkit.ui.R.string.add_friend_operate_fail); + Toast.makeText( + AddFriendsActivity.this, + String.format(tips, String.valueOf(code)), + Toast.LENGTH_SHORT) + .show(); + } + + @Override + public void onException(@Nullable Throwable exception) { + String tips = getResources().getString(com.netease.yunxin.kit.contactkit.ui.R.string.add_friend_operate_fail); + Toast.makeText( + AddFriendsActivity.this, + String.format(tips, exception.getMessage()), + Toast.LENGTH_SHORT) + .show(); + } + }); + } + + +} diff --git a/app/src/main/java/com/dskj/rbchat/main/message/NotifyActMessageActivity.java b/app/src/main/java/com/dskj/rbchat/main/message/NotifyActMessageActivity.java new file mode 100644 index 0000000..391bb60 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/message/NotifyActMessageActivity.java @@ -0,0 +1,202 @@ +package com.dskj.rbchat.main.message; + +import android.app.NotificationManager; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.text.Html; +import android.text.TextUtils; +import android.util.TypedValue; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.appcompat.widget.AppCompatImageView; +import androidx.recyclerview.widget.LinearLayoutManager; + +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.base.LllChatBaseActivity; +import com.dskj.rbchat.databinding.ActivityMessageActBinding; +import com.dskj.rbchat.databinding.ActivityMessageBinding; +import com.dskj.rbchat.model.ActivityMsgBean; +import com.dskj.rbchat.model.DongTaiActionBean; +import com.dskj.rbchat.model.ListBeanResult; +import com.dskj.rbchat.model.MessageBean; +import com.dskj.rbchat.model.SendOrderBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.wallet.TopUpActivity; +import com.dskj.rbchat.widget.CircleImageView; +import com.netease.yunxin.kit.common.ui.activities.BrowseActivity; +import com.netease.yunxin.kit.common.ui.utils.TimeFormatUtils; +import com.netease.yunxin.kit.common.ui.widgets.ContactAvatarView; +import com.netease.yunxin.kit.corekit.im.IMKitClient; + +import java.util.ArrayList; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +/** + * 活动通知列表 + */ +public class NotifyActMessageActivity extends LllChatBaseActivity { + @Override + public int initNavigationBarColor() { + return getColor(R.color.color_f7f7f7); + } + + @Override + public int initStatusBarColor() { + return getColor(R.color.color_fffbfb); + } + + private ActivityMessageActBinding binding; + LinearLayoutManager linearLayoutManager; + private CommonAdapter commonAdapter; + int page = 1; + private ArrayList messageBeans = new ArrayList<>(); + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = ActivityMessageActBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + binding.aboutTitleBar.getTitleTextView().setTextSize(TypedValue.COMPLEX_UNIT_SP, 20); + binding.aboutTitleBar.setOnBackIconClickListener(view -> finish()); + initRefreshLayout(); + initList(); + getActivityMsgList(); + closeNotify(); + } + + //关闭通知栏 + public void closeNotify() { + NotificationManager notificationManager = (NotificationManager) IMApplication.getAppContext().getSystemService(Context.NOTIFICATION_SERVICE); + notificationManager.cancelAll(); + } + + private void initRefreshLayout() { + binding.refreshLayout.setOnRefreshListener(refreshlayout -> { + page = 1; + binding.refreshLayout.setVisibility(View.VISIBLE); + binding.nodateLy.setVisibility(View.GONE); + binding.refreshLayout.setEnableLoadMore(true); + getActivityMsgList(); + + }); + binding.refreshLayout.setOnLoadMoreListener(refreshLayout -> { + page += 1; + getActivityMsgList(); + + }); + } + + private void initList() { + linearLayoutManager = new LinearLayoutManager(NotifyActMessageActivity.this); + + binding.recyclerview.setLayoutManager(linearLayoutManager); + commonAdapter = new CommonAdapter(NotifyActMessageActivity.this, R.layout.item_activitymessage_list, messageBeans) { + @Override + public void convert(ViewHolder holder, ActivityMsgBean.ListDTO ss, int index) { + + AppCompatImageView compatImageView = holder.getView(R.id.iv_icon); + if (ss.getType() == 40) { + compatImageView.setImageResource(R.mipmap.ic_activitymessage_item); + } + if (ss.getType() == 41) { + compatImageView.setImageResource(R.mipmap.ic_othermessage_item); + } + holder.setText(R.id.tv_msg_title, ss.getTitle()); + holder.setText(R.id.tv_msg_time, ss.getPublishTime()); + TextView tv = holder.getView(R.id.tv_msg_content); + tv.setText(Html.fromHtml(ss.getContent())); + ContactAvatarView contactAvatarView = holder.getView(R.id.iv_msg_img); + contactAvatarView.setVisibility(TextUtils.isEmpty(ss.getCoverImg()) ? View.GONE : View.VISIBLE); + contactAvatarView.setData(ss.getCoverImg(), ""); + + holder.getView(R.id.big_bg).setOnClickListener(v -> { + startToWeb(ss.getId()); + }); + + } + }; + binding.recyclerview.setAdapter(commonAdapter); + } + + private void getActivityMsgList() { + Api.getInstance().activitymessage(IMKitClient.account(), page, 30, "") + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result feedbackResp) { + changeDate(feedbackResp.data); + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); +// WidgetUtils.showToast(getActivity(), msg, WidgetUtils.ToastType.ERROR); + LogUtils.i("获取到的错误:" + code + "" + msg); + binding.refreshLayout.finishRefresh(); + binding.refreshLayout.finishLoadMore(); + changeView(false); + } + }); + } + + private void changeDate(ActivityMsgBean data) { + if (data.getList() != null) { + if (page == 1) { + messageBeans = (ArrayList) data.getList(); + commonAdapter.setDates(messageBeans); + } else { + commonAdapter.addDates(data.getList()); + messageBeans = (ArrayList) commonAdapter.getDates(); + } + + } + binding.refreshLayout.finishRefresh(); + binding.refreshLayout.finishLoadMore(); + if (messageBeans.size() == data.getTotal()) { + binding.refreshLayout.finishLoadMoreWithNoMoreData(); + } + changeView(true); + } + + private void changeView(boolean isNodate) { + if (messageBeans == null || (messageBeans.size() == 0)) { + binding.nodateLy.setVisibility(View.VISIBLE); + binding.refreshLayout.setVisibility(View.GONE); + if (isNodate) { + binding.nodateTv.setText(getString(R.string.nodate_txt)); + binding.nodateIv.setImageResource(R.mipmap.pyq_nodate); + } else { + binding.nodateTv.setText(getString(R.string.net_error_txt)); + binding.nodateIv.setImageResource(R.mipmap.pyq_nodate); + + } + + } else { + binding.refreshLayout.setVisibility(View.VISIBLE); + binding.nodateLy.setVisibility(View.GONE); + } + binding.nodateLy.setOnClickListener(view -> { + binding.refreshLayout.autoRefresh(); + }); + } + + private void startToWeb(String id) { + startActivity(new Intent(NotifyActMessageActivity.this, NotifyMessageDetailsActivity.class).putExtra("id", id)); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/main/message/NotifyMessageActivity.java b/app/src/main/java/com/dskj/rbchat/main/message/NotifyMessageActivity.java new file mode 100644 index 0000000..e7b571f --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/message/NotifyMessageActivity.java @@ -0,0 +1,273 @@ +package com.dskj.rbchat.main.message; + +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.text.TextUtils; +import android.util.TypedValue; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.LinearLayoutManager; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.bumptech.glide.request.RequestOptions; +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.base.LllChatBaseActivity; +import com.dskj.rbchat.databinding.ActivityMessageBinding; +import com.dskj.rbchat.imkit.verify.FunVerifyListActivity; +import com.dskj.rbchat.model.AlbumBean; +import com.dskj.rbchat.model.CirPushMessage; +import com.dskj.rbchat.model.DongTaiActionBean; +import com.dskj.rbchat.model.ListBeanResult; +import com.dskj.rbchat.model.MessageBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.voom.MessageActivity; +import com.dskj.rbchat.widget.CircleImageView; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.Observer; +import com.netease.nimlib.sdk.friend.model.AddFriendNotify; +import com.netease.nimlib.sdk.msg.SystemMessageObserver; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.nimlib.sdk.msg.model.SystemMessage; +import com.netease.yunxin.kit.chatkit.repo.ContactRepo; +import com.netease.yunxin.kit.common.ui.utils.TimeFormatUtils; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.model.FriendInfo; +import com.netease.yunxin.kit.corekit.im.provider.FetchCallback; +import com.netease.yunxin.kit.corekit.im.utils.RouterConstant; +import com.netease.yunxin.kit.corekit.route.XKitRouter; + +import java.util.ArrayList; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +/** + * 通知消息列表 + */ +public class NotifyMessageActivity extends LllChatBaseActivity { + + ActivityMessageBinding binding; + LinearLayoutManager linearLayoutManager; + private CommonAdapter commonAdapter; + private ArrayList messageBeans = new ArrayList<>(); + int page = 1; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = ActivityMessageBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + binding.aboutTitleBar.getTitleTextView().setTextSize(TypedValue.COMPLEX_UNIT_SP, 20); + binding.aboutTitleBar.setOnBackIconClickListener(view -> finish()); + binding.layoutItem.setVisibility(View.VISIBLE); + initList(); + initRefreshLayout(); + getNotifies(); + getActivityMsgCount(); + initObserver(); + binding.ivVerify.setOnClickListener(view -> { + toEnterVerify(); + }); + binding.tvContent.setOnClickListener(view -> { + toEnterVerify(); + }); + + binding.ivActivity.setOnClickListener(v -> { + toEnterActivity(); + }); + binding.tvActivity.setOnClickListener(v -> { + toEnterActivity(); + }); + + } + + + private void toEnterVerify() { + startActivity(new Intent(NotifyMessageActivity.this, FunVerifyListActivity.class)); + overridePendingTransition(0, 0); + } + + private void toEnterActivity() { + DataUtils.set(this, "activity_message_count", 0); + startActivity(new Intent(NotifyMessageActivity.this, NotifyActMessageActivity.class)); + overridePendingTransition(0, 0); + } + + private void initRefreshLayout() { + binding.refreshLayout.setOnRefreshListener(refreshlayout -> { + page = 1; + binding.refreshLayout.setVisibility(View.VISIBLE); + binding.nodateLy.setVisibility(View.GONE); + binding.refreshLayout.setEnableLoadMore(true); + getNotifies(); + + }); + binding.refreshLayout.setOnLoadMoreListener(refreshLayout -> { + page += 1; + getNotifies(); + + }); + } + + private void initList() { + linearLayoutManager = new LinearLayoutManager(NotifyMessageActivity.this); + + binding.recyclerview.setLayoutManager(linearLayoutManager); + commonAdapter = new CommonAdapter(NotifyMessageActivity.this, R.layout.item_message_list, messageBeans) { + @Override + public void convert(ViewHolder holder, MessageBean ss, int index) { + CircleImageView dongtaiPortrait = holder.getView(R.id.item_head_civ); + LinearLayout big_item = holder.getView(R.id.big_item); + big_item.setVisibility(View.GONE); + dongtaiPortrait.setImageResource(R.mipmap.ic_xitongtongzhi); + holder.setText(R.id.item_title_tv, getString(R.string.xitongtongzhi_txt)); + holder.setText(R.id.item_time_tv, ss.getHistoryTime()); + if (!TextUtils.isEmpty(ss.getHistoryTime())) { + holder.setText(R.id.item_time_tv, TimeFormatUtils.formatMillisecond(NotifyMessageActivity.this, DataUtils.dateToStamp(ss.getHistoryTime()))); + } + DongTaiActionBean dongTaiActionBean = GsonUtils.getObjFromJSON(ss.getHistoryContent(), DongTaiActionBean.class); + if (dongTaiActionBean != null) { + holder.setText(R.id.conent_tv, dongTaiActionBean.getContent()); + holder.setText(R.id.item_title_tv, dongTaiActionBean.getTitle()); + } + + } + }; + binding.recyclerview.setAdapter(commonAdapter); + } + + private void getNotifies() { +// String time = DataUtils.getCurrentTimeType(IMUIKitConfig.NOTIFY_MESSAGE_START_TIME); + Api.getInstance().notifiesmessage(IMKitClient.account(), page, 30, "") + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result> feedbackResp) { + DataUtils.set(NotifyMessageActivity.this, "notify_message_time_" + IMKitClient.account(), System.currentTimeMillis()); + changeDate(feedbackResp.data); + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); +// WidgetUtils.showToast(getActivity(), msg, WidgetUtils.ToastType.ERROR); + LogUtils.i("获取到的错误:" + code + "" + msg); + binding.refreshLayout.finishRefresh(); + binding.refreshLayout.finishLoadMore(); + changeView(false); + } + }); + } + + private void changeDate(ListBeanResult data) { + if (data.getList() != null) { + if (page == 1) { + messageBeans = (ArrayList) data.getList(); + commonAdapter.setDates(messageBeans); + } else { + commonAdapter.addDates(data.getList()); + messageBeans = (ArrayList) commonAdapter.getDates(); + } + + } + binding.refreshLayout.finishRefresh(); + binding.refreshLayout.finishLoadMore(); + if (messageBeans.size() == data.getTotal()) { + binding.refreshLayout.finishLoadMoreWithNoMoreData(); + } + changeView(true); + } + + private void changeView(boolean isNodate) { + if (messageBeans == null || (messageBeans.size() == 0)) { + binding.nodateLy.setVisibility(View.VISIBLE); + binding.refreshLayout.setVisibility(View.GONE); + if (isNodate) { + binding.nodateTv.setText(getString(R.string.nodate_txt)); + binding.nodateIv.setImageResource(R.mipmap.pyq_nodate); + } else { + binding.nodateTv.setText(getString(R.string.net_error_txt)); + binding.nodateIv.setImageResource(R.mipmap.pyq_nodate); + + } + + } else { + binding.refreshLayout.setVisibility(View.VISIBLE); + binding.nodateLy.setVisibility(View.GONE); + } + binding.nodateLy.setOnClickListener(view -> { + binding.refreshLayout.autoRefresh(); + }); + } + + private void initObserver() { + getNotificationUnreadCount(); + } + + public void getNotificationUnreadCount() { + ContactRepo.getNotificationUnreadCount(new FetchCallback() { + @Override + public void onSuccess(@Nullable Integer integer) { + binding.tvVerifycount.setVisibility(integer > 0 ? View.VISIBLE : View.GONE); + binding.tvVerifycount.setText(integer > 99 ? "99+" : String.valueOf(integer)); + } + + @Override + public void onFailed(int i) { + + } + + @Override + public void onException(@Nullable Throwable throwable) { + + } + }); + } + + public void getActivityMsgCount() { + binding.tvActivitycount.setVisibility(View.GONE); + int activityMsgCount = DataUtils.get(this, "activity_message_count", 0); + if (activityMsgCount > 0) { + binding.tvActivitycount.setVisibility(View.VISIBLE); + binding.tvActivitycount.setText(activityMsgCount > 99 ? "99+" : activityMsgCount + ""); + } + } + + @Override + protected void onResume() { + super.onResume(); + if (binding.tvVerifycount.getVisibility() == View.VISIBLE) { + getNotificationUnreadCount(); + } + if (binding.tvActivitycount.getVisibility() == View.VISIBLE) { + getActivityMsgCount(); + } + } + + @Override + public int initNavigationBarColor() { + return getColor(R.color.color_f7f7f7); + } + + @Override + public int initStatusBarColor() { + return getColor(R.color.color_fffbfb); + } + + +} diff --git a/app/src/main/java/com/dskj/rbchat/main/message/NotifyMessageDetailsActivity.java b/app/src/main/java/com/dskj/rbchat/main/message/NotifyMessageDetailsActivity.java new file mode 100644 index 0000000..7b99b6a --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/message/NotifyMessageDetailsActivity.java @@ -0,0 +1,116 @@ +package com.dskj.rbchat.main.message; + +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.util.TypedValue; +import android.view.View; +import android.webkit.WebResourceRequest; +import android.webkit.WebSettings; +import android.webkit.WebView; +import android.webkit.WebViewClient; + +import androidx.annotation.Nullable; + +import com.dskj.rbchat.R; +import com.dskj.rbchat.base.LllChatBaseActivity; +import com.dskj.rbchat.databinding.ActivityMessageActBinding; +import com.dskj.rbchat.databinding.ActivityMessageActDetailsBinding; +import com.dskj.rbchat.model.ActivityMsgBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.LogUtils; +import com.netease.yunxin.kit.corekit.im.IMKitClient; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class NotifyMessageDetailsActivity extends LllChatBaseActivity { + @Override + public int initNavigationBarColor() { + return getColor(R.color.color_white); + } + + @Override + public int initStatusBarColor() { + return getColor(R.color.color_fffbfb); + } + + ActivityMessageActDetailsBinding binding; + private String id; + + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = ActivityMessageActDetailsBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + binding.aboutTitleBar.getTitleTextView().setTextSize(TypedValue.COMPLEX_UNIT_SP, 20); + binding.aboutTitleBar.setOnBackIconClickListener(view -> finish()); + id = getIntent().getStringExtra("id"); + WebSettings webSettings = binding.webivew.getSettings(); + //自适应 +// webSettings.setUseWideViewPort(true); +// webSettings.setLoadWithOverviewMode(true); + webSettings.setJavaScriptEnabled(true); + binding.webivew.setWebViewClient(new WebViewClient() { + + @Override + public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { + String url = request.getUrl().toString(); + if (url.startsWith("http") || url.startsWith("https")) { + Intent intent = new Intent(); + intent.setAction(Intent.ACTION_VIEW); + intent.setData(Uri.parse(url)); + startActivity(intent); + return true; + } + return false; + } + + @Override + public void onPageFinished(WebView view, String url) { + super.onPageFinished(view, url); +// int w = View.MeasureSpec.makeMeasureSpec(0, +// View.MeasureSpec.UNSPECIFIED); +// int h = View.MeasureSpec.makeMeasureSpec(0, +// View.MeasureSpec.UNSPECIFIED); +// // 重新测量 +// binding.webivew.measure(w, h); + upsetImage(); + } + }); + getDeatils(); + + } + + private void upsetImage() { + binding.webivew.loadUrl("javascript:(function(){" + + "var objs = document.getElementsByTagName('img'); " + + "for(var i=0;i() { + @Override + public void onSuccess(Result feedbackResp) { + binding.webivew.loadDataWithBaseURL("", feedbackResp.data.getContent(), "text/html", "UTF-8", ""); + } + + @Override + public void onError(int code, String msg) { + + } + }); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/main/mine/AccountAndSecurityActivity.java b/app/src/main/java/com/dskj/rbchat/main/mine/AccountAndSecurityActivity.java new file mode 100644 index 0000000..c4ae182 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/mine/AccountAndSecurityActivity.java @@ -0,0 +1,356 @@ +package com.dskj.rbchat.main.mine; + +import android.content.Intent; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.login.ChongZhiActivity; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.BaseObserver1; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.welcome.WelcomeActivity; +import com.dskj.rbchat.wxapi.bean.WeiXin; +import com.dskj.rbchat.wxapi.bean.WeiXinInfo; +import com.dskj.rbchat.wxapi.bean.WeiXinToken; +import com.netease.yunxin.kit.chatkit.ui.common.RxBus; +import com.netease.yunxin.kit.chatkit.ui.data.ChatDatabase; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.tencent.mm.opensdk.modelmsg.SendAuth; +import com.tencent.mm.opensdk.openapi.IWXAPI; +import com.tencent.mm.opensdk.openapi.WXAPIFactory; + +import com.dskj.rbchat.databinding.ActivitySecurityBinding; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; +import com.dskj.rbchat.model.BindBean; +import com.dskj.rbchat.model.LoginBean; +public class AccountAndSecurityActivity extends BaseActivity { + + BindBean bean; + private IWXAPI wxAPI; + LoginBean loginBean; + private ActivitySecurityBinding viewBinding; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + getWindow().setStatusBarColor(getResources().getColor(R.color.color_white)); + getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white)); + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR|View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR); + + super.onCreate(savedInstanceState); + viewBinding = ActivitySecurityBinding.inflate(getLayoutInflater()); + setContentView(viewBinding.getRoot()); + initView(); + RxBus.getInstance().toObservable(WeiXin.class) + .subscribeOn(rx.schedulers.Schedulers.io()) + .unsubscribeOn(rx.schedulers.Schedulers.io()) + .subscribe(changeImageViewBean -> { + LogUtils.i(GsonUtils.beanToJSONString(changeImageViewBean)); + if(changeImageViewBean.getType()==1){ + getAccessToken(changeImageViewBean.getCode()); + }else{ + ToastX.showShortToast( + String.format(getResources().getString(R.string.login_fail),changeImageViewBean.getType())); + } + }); + + getUserInfo(IMKitClient.account()); + + + viewBinding.tvLogout.setOnClickListener(v -> { + ActionConfirmDialog actionConfirmDialog = new ActionConfirmDialog(AccountAndSecurityActivity.this, getString(R.string.tcdl_tips_txt), true); + actionConfirmDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + IMKitClient.logoutIM( + + new com.netease.yunxin.kit.corekit.im.login.LoginCallback() { + @Override + public void onError(int errorCode, @NonNull String errorMsg) { + Toast.makeText( + AccountAndSecurityActivity.this, + "error code is " + errorCode + ", message is " + errorMsg, + Toast.LENGTH_SHORT) + .show(); + } + + @Override + public void onSuccess(@Nullable Void data) { + if (AccountAndSecurityActivity.this.getApplicationContext() instanceof IMApplication) { + ((IMApplication)AccountAndSecurityActivity.this.getApplicationContext()) + .clearActivity(AccountAndSecurityActivity.this); + } + DataUtils.set(AccountAndSecurityActivity.this, IMUIKitConfig.LOGIN_ACCOUNT, ""); + DataUtils.set(AccountAndSecurityActivity.this, IMUIKitConfig.LOGIN_TOKEN, ""); + ChatDatabase.chatDatabase = null; + startActivity(new Intent(AccountAndSecurityActivity.this, WelcomeActivity.class)); + finish(); + } + }); + } + + @Override + public void toCancel() { + + } + }); + actionConfirmDialog.show(); + }); + } + + protected void initView() { + + wxAPI = WXAPIFactory.createWXAPI(this, IMUIKitConfig.WECHAT_APPID,true); + wxAPI.registerApp(IMUIKitConfig.WECHAT_APPID); + initListeners(); + } + + + + public void getAccessToken(String code) { + + Api.getInstance().getAccessToken(IMUIKitConfig.WECHAT_APPID,IMUIKitConfig.WECHAT_SECRET,code,"authorization_code") + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver1() { + @Override + public void onSuccess(WeiXinToken result) { + if (result.getErrcode() == 0) { + getWeiXinUserInfo(result); + } + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast( msg); + } + }); + } + + private void getWeiXinUserInfo(WeiXinToken result) { + + Api.getInstance().getAccessUserInfo(result.getAccess_token(),result.getOpenid()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver1() { + @Override + public void onSuccess(WeiXinInfo o) { + bindWechat(o); + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast( msg); + } + }); + } + + + + @Override + protected void onResume() { + super.onResume(); + loginBean = DataUtils.getLocUserInfo(); + if(loginBean!=null) { + if(TextUtils.isEmpty(loginBean.getNwId())){ + viewBinding.accoutTv.setText(getString(R.string.weishezhi_txt)); + }else{ + viewBinding.accoutTv.setText(loginBean.getNwId()); + } + +// viewBinding.accoutTv.setText(loginBean.getUser_uid()+""); + bindInfo(loginBean.getUser_uid()); + } + } + + protected void initListeners() { + viewBinding.settingTitleBar.setOnBackIconClickListener(v -> onBackPressed()); + + viewBinding.zhmmBt.setOnClickListener(v -> { + if(bean!=null) { + if(bean.getPhoneBind()== false){ + showDialog(); + }else{ +// Intent intent = new Intent(AccountAndSecurityActivity.this,ChangeAccoutActionActivity.class); +// intent.putExtra("type",ChangeAccoutActionActivity.TYPE_CHANGE_PASSWORD); +// startActivity(intent); +// startActivity(new Intent(this,ChangePasswordActivity.class)); + Intent intent = new Intent(this, ChongZhiActivity.class); + startActivity(intent); + + } + } + + }); + + viewBinding.bindPhoneBt.setOnClickListener(v -> { + if(bean!=null&&bean.getPhoneBind()== false) { + Intent intent = new Intent(AccountAndSecurityActivity.this, ChangeAccoutActionActivity.class); + intent.putExtra("type", ChangeAccoutActionActivity.TYPE_BIND_PHONE); + startActivity(intent); + }else{ + startActivity(new Intent(this,ChangePhoneActivity.class)); + } + }); + + viewBinding.bindWechatBt.setOnClickListener(v -> { + if(bean!=null&&bean.getWechatBind()== false){ + SendAuth.Req req = new SendAuth.Req(); + req.scope = "snsapi_userinfo"; + req.state = String.valueOf(System.currentTimeMillis()); + wxAPI.sendReq(req); + }else{ + ToastX.showShortToast(R.string.yibind_wechat_txt); + + } + }); + viewBinding.accoutBt.setOnClickListener(v ->{ + startActivityForResult(new Intent(AccountAndSecurityActivity.this,SettingAccoutIdActivity.class),888); + } ); + + + } + + + private void showDialog() { + + ActionConfirmDialog actionDialog = new ActionConfirmDialog( + AccountAndSecurityActivity.this, + getString(R.string.qxbdsjhmhzjxmmsz_txt), + getString(R.string.general_cancel), + getString(R.string.tobind_txt)); + actionDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + Intent intent = new Intent(AccountAndSecurityActivity.this, ChangeAccoutActionActivity.class); + intent.putExtra("type", ChangeAccoutActionActivity.TYPE_BIND_PHONE); + startActivity(intent); + } + @Override + public void toCancel() { + + } + }); + actionDialog.show(); + + } + + @Override + protected void onStop() { + super.onStop(); +// EventBus.getDefault().unregister(this);//注册 +// + } + + + private void bindWechat(WeiXinInfo obj) { + if(obj!=null&&loginBean!=null){ + obj.setUserId(loginBean.getUser_uid()); + obj.setSubstationId(IMUIKitConfig.SUBSTATIONID); + Api.getInstance().bindWechat(obj) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver() { + @Override + public void onSuccess(Result feedbackResp) { + + ToastX.showShortToast(R.string.wechat_bind_succ_txt); + bindInfo(loginBean.getUser_uid()); + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast( msg); + } + }); + } + } + + + private void bindInfo(String user_uid) { + Api.getInstance().bindInfo(user_uid) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + bean = feedbackResp.data; + //只有这是个参数允许切换 +// viewBinding.bindWechatTv.setText(feedbackResp.data.getWechatBind()?getString(R.string.yibangding_txt):getString(R.string.weibangding_txt)); + viewBinding.bindPhoneTv.setText(feedbackResp.data.getPhoneBind()?(feedbackResp.data.getAreaCode()+feedbackResp.data.getPhone()):getString(R.string.weibangding_txt)); + + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:"+code+""+ msg); +// WidgetUtils.showToast(getActivity(), msg, WidgetUtils.ToastType.ERROR); + } + }); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if(requestCode == 888 && resultCode == RESULT_OK){ + if(loginBean!=null) { + getUserInfo(loginBean.getUser_uid()); + } + } + } + + + private void getUserInfo(String user_uid) { + + Api.getInstance().userInfo(user_uid) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + + LoginBean loginBean = DataUtils.getLocUserInfo(); + + if (loginBean != null) { + //只有这是个参数允许切换 + loginBean.setNwId(feedbackResp.data.getNwId()); + loginBean.setNwIdSetTime(feedbackResp.data.getNwIdSetTime()); + loginBean.getUser().setNwId(feedbackResp.data.getNwId()); + loginBean.getUser().setNwIdSetTime(feedbackResp.data.getNwIdSetTime()); + DataUtils.set(AccountAndSecurityActivity.this, "login_bean", GsonUtils.beanToJSONString(loginBean)); + + if(TextUtils.isEmpty(loginBean.getNwId())){ + viewBinding.accoutTv.setText(getString(R.string.weishezhi_txt)); + }else{ + viewBinding.accoutTv.setText(loginBean.getNwId()); + } + + } + + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); +// WidgetUtils.showToast(getActivity(), msg, WidgetUtils.ToastType.ERROR); + } + }); + + + } +} diff --git a/app/src/main/java/com/dskj/rbchat/main/mine/ChangeAccoutActionActivity.java b/app/src/main/java/com/dskj/rbchat/main/mine/ChangeAccoutActionActivity.java new file mode 100644 index 0000000..fd78545 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/mine/ChangeAccoutActionActivity.java @@ -0,0 +1,959 @@ +package com.dskj.rbchat.main.mine; + +import android.app.Activity; +import android.content.Intent; +import android.os.Build; +import android.os.Bundle; +import android.os.CountDownTimer; +import android.text.InputType; +import android.text.TextUtils; +import android.text.method.HideReturnsTransformationMethod; +import android.text.method.PasswordTransformationMethod; +import android.util.Log; +import android.view.MotionEvent; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +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 android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; +import androidx.cardview.widget.CardView; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; + +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.custom.PasswordEditText; +import com.dskj.rbchat.databinding.ActivityChangeAccoutActionBinding; +import com.dskj.rbchat.databinding.ActivitySetAccoutIdBinding; +import com.dskj.rbchat.dialog.SelectCountryDialog; +import com.dskj.rbchat.login.LoginActivity; +import com.dskj.rbchat.login.RegisterActivity; +import com.dskj.rbchat.model.BindBean; +import com.dskj.rbchat.model.CountryBean; +import com.dskj.rbchat.model.LoginBean; +import com.dskj.rbchat.model.RegisteredBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.utils.ToolKits; + +import com.dskj.rbchat.welcome.WelcomeActivity; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.dialog.LoadingDialog; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.corekit.im.IMKitClient; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class ChangeAccoutActionActivity extends BaseActivity { + + /** + * 绑定手机号 + */ + public static final int TYPE_BIND_PHONE = 1; + /** + * 更改绑定手机号 + */ + public static final int TYPE_CHANGE_BIND_PHONE = 2; + /** + * 设置密码 + */ + public static final int TYPE_CHANGE_PASSWORD = 3; + /** + * 找回密码 + */ + public static final int TYPE_FIND_PASSWORD = 4; + /** + * 设置支付密码 + */ + public static final int TYPE_CHANGE_PAY_PASSWORD = 5; +// CommonAdapter commonAdapter; + + private boolean isShowPass = false; + LoginBean loginBean; + BindBean bean; + private int type = 3; + CountryBean countryBean; + ActivityChangeAccoutActionBinding binding; + String passwordCode = ""; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = ActivityChangeAccoutActionBinding.inflate(getLayoutInflater()); + + setContentView(binding.getRoot()); + + Window window = getWindow(); + window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + window.setStatusBarColor(ContextCompat.getColor(this, R.color.color_white)); + window.setNavigationBarColor(getResources().getColor(R.color.color_white)); + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR|View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR); + + loginBean = DataUtils.getLocUserInfo(); + initView(); + } + + protected void initView() { + binding.settingTitleBar.getBackImageView().setOnClickListener(v -> finish()); + + countryBean = DataUtils.getLocCountry(ChangeAccoutActionActivity.this); + + type = getIntent().getIntExtra("type", TYPE_CHANGE_PASSWORD); + + myCountDownTimer = new MyCountDownTimer(60000, 1000); + + +// commonAdapter.setDates(titles); + binding.areaTv.setText(countryBean.getCountryName() + countryBean.getAreaCodeName()); + binding.phoneTv.setText(countryBean.getAreaCodeName()); + binding.nameAreaTv.setText(countryBean.getCountryName() + "" + countryBean.getAreaCodeName()); + changTitle(); + + binding.getcodeTv.setOnClickListener(v -> { + if (type == TYPE_FIND_PASSWORD) { + LogUtils.i("1111111111111111"); + if (String.valueOf(binding.loginFormUidEdit.getText()).trim().length() <= 0) { + ToastX.showShortToast(R.string.login_form_validate_login_name_empty); + return; + } + LogUtils.i("22222222222222222"); + + } + getVerifyCode(); + }); + + binding.passwordEditTextCode.setOnCompleteListener(code -> passwordCode = code); + + binding.areaTv.setOnClickListener(v -> { + SelectCountryDialog selectCountryDialog = new SelectCountryDialog(ChangeAccoutActionActivity.this); + selectCountryDialog.setOnToVipListener(new SelectCountryDialog.OnToTypeListener() { + @Override + public void toType(CountryBean type) { + countryBean = type; + changeArea(); + DataUtils.set(ChangeAccoutActionActivity.this, IMUIKitConfig.LOC_COUNTRY_CODE, type.getAreaCodeName()); + } + }); + selectCountryDialog.show(); + }); + //未看到设置areaCard 可见 +// binding.bigRy.setOnClickListener(v -> { +// if (binding.areaCard.getVisibility() == View.VISIBLE) { +// binding.areaCard.setVisibility(View.GONE); +// } +// }); + + + if (type == TYPE_CHANGE_PASSWORD || type == TYPE_CHANGE_PAY_PASSWORD || type == TYPE_CHANGE_BIND_PHONE || type == TYPE_BIND_PHONE) { + loginBean = DataUtils.getLocUserInfo(); + if (loginBean != null) { + bindInfo(loginBean.getUser_uid()); + } + } + showType(); + + binding.sumbitBt.setOnClickListener(v -> { + hideSoftInput(ChangeAccoutActionActivity.this); + if (type == TYPE_CHANGE_PASSWORD) { + if (binding.step1Ly.getVisibility() == View.VISIBLE) { + if (TextUtils.isEmpty(binding.passwordEditText.getText().toString().trim())) { + ToastX.showShortToast(R.string.vcode_hint_txt); + + return; + } + + if (binding.passwordEditText.getText().toString().trim().length() != 4) { + ToastX.showShortToast(R.string.qsrswyzm_txt); + return; + } + + if (bean != null) { + showLoadingDialog(); + preCheckVerifyCodeLoc(bean.getPhone(), bean.getAreaCode()); + } + } else if (binding.step2Ly.getVisibility() == View.VISIBLE) { + if (TextUtils.isEmpty(binding.passwordText.getText().toString().trim())) { + ToastX.showShortToast(R.string.qsrswyzm_txt); + return; + } + toChangePassword(); + } else if (binding.succIv.getVisibility() == View.VISIBLE) { + IMKitClient.logoutIM( + new com.netease.yunxin.kit.corekit.im.login.LoginCallback() { + @Override + public void onError(int errorCode, @NonNull String errorMsg) { + Toast.makeText( + ChangeAccoutActionActivity.this, + "error code is " + errorCode + ", message is " + errorMsg, + Toast.LENGTH_SHORT) + .show(); + } + + @Override + public void onSuccess(@Nullable Void data) { + if (ChangeAccoutActionActivity.this.getApplicationContext() instanceof IMApplication) { + ((IMApplication) ChangeAccoutActionActivity.this.getApplicationContext()) + .clearActivity(ChangeAccoutActionActivity.this); + } + DataUtils.set(ChangeAccoutActionActivity.this, IMUIKitConfig.LOGIN_ACCOUNT, ""); + DataUtils.set(ChangeAccoutActionActivity.this, IMUIKitConfig.LOGIN_TOKEN, ""); + startActivity(new Intent(ChangeAccoutActionActivity.this, WelcomeActivity.class)); + finish(); + } + }); + } + } else if (type == TYPE_CHANGE_PAY_PASSWORD) { + if (binding.step1Ly.getVisibility() == View.VISIBLE) { + if (TextUtils.isEmpty(binding.passwordEditText.getText().toString().trim())) { + ToastX.showShortToast(R.string.vcode_hint_txt); + + return; + } + if (binding.passwordEditText.getText().toString().trim().length() != 4) { + ToastX.showShortToast(R.string.qsrswyzm_txt); + + return; + } + if (bean != null) { + showLoadingDialog(); + preCheckVerifyCodeLoc(bean.getPhone(), bean.getAreaCode()); + } + + } else if (binding.step2Ly.getVisibility() == View.VISIBLE) { + if (TextUtils.isEmpty(passwordCode) || passwordCode.length() != 6) { + ToastX.showShortToast(R.string.login_form_validate_login_psw_length_less_six); + + return; + } + toChangePasswordPay(); + } else if (binding.succIv.getVisibility() == View.VISIBLE) { + onBackPressed(); + } + } else if (type == TYPE_FIND_PASSWORD) { + if (binding.step1Ly.getVisibility() == View.VISIBLE) { + + if (String.valueOf(binding.loginFormUidEdit.getText()).trim().length() <= 0) { +// loginFormUidEdit.setError("请先输入手机号"); + ToastX.showShortToast(R.string.login_form_hint_loginname); + + return; + } + + if (TextUtils.isEmpty(binding.passwordEditText.getText().toString().trim())) { + ToastX.showShortToast(R.string.vcode_hint_txt); + + return; + } + if (binding.passwordEditText.getText().toString().trim().length() != 4) { + ToastX.showShortToast(R.string.qsrswyzm_txt); + + return; + } + checkPhone(); + + } else if (binding.step2Ly.getVisibility() == View.VISIBLE) { + if (TextUtils.isEmpty(binding.passwordText.getText().toString().trim())) { + ToastX.showShortToast(R.string.password_hint_txt); + + return; + } + toChangePasswordFind(); + } else if (binding.succIv.getVisibility() == View.VISIBLE) { + startActivity(new Intent(this, LoginActivity.class)); + finish(); + } + } else if (type == TYPE_CHANGE_BIND_PHONE || type == TYPE_BIND_PHONE) { + if (binding.step1Ly.getVisibility() == View.VISIBLE) { + if (String.valueOf(binding.loginFormUidEdit.getText()).trim().length() <= 0) { +// loginFormUidEdit.setError("请先输入手机号"); + ToastX.showShortToast(R.string.login_form_hint_loginname); + + return; + } + + if (TextUtils.isEmpty(binding.passwordEditText.getText().toString().trim())) { + ToastX.showShortToast(R.string.vcode_hint_txt); + return; + } + + if (binding.passwordEditText.getText().toString().trim().length() != 4) { + ToastX.showShortToast(R.string.qsrswyzm_txt); + + return; + } + + if (type == TYPE_BIND_PHONE) { + bindPhone(); + } else { + changeBindPhone(); + } + + + } else if (binding.succIv.getVisibility() == View.VISIBLE) { + if (type == TYPE_CHANGE_BIND_PHONE) { + setResult(RESULT_OK); + } + finish(); + } + } + }); + + + } + + public LoadingDialog loadingDialog; + + public void showLoadingDialog() { + if (loadingDialog == null) + loadingDialog = new LoadingDialog(this); + loadingDialog.show(); + } + + public void showLoadingDialog(String msg) { + if (loadingDialog == null) + loadingDialog = new LoadingDialog(this); + loadingDialog.setLoadingText(msg); + loadingDialog.show(); + } + + + public void dimessLoadingDialog() { + if (loadingDialog != null) { + loadingDialog.dismiss(); + } + + } + + + /** + * 隐藏软键盘 + */ + public void hideSoftInput(Activity activity) { + InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + if (getCurrentFocus() != null && null != imm) { + imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0); + } +// View view = activity.getCurrentFocus(); +// +// if (view != null) { +// +// InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE); +// +// inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); +// +// } + } + + private void changeArea() { + binding.areaTv.setText(countryBean.getAreaCodeName()); + binding.phoneTv.setText(countryBean.getAreaCodeName()); + binding.nameAreaTv.setText(countryBean.getCountryName() + "" + countryBean.getAreaCodeName()); + } + + + private void checkPhone() { + Map maps = new HashMap<>(); + maps.put("phone", String.valueOf(binding.loginFormUidEdit.getText()).trim()); + maps.put("areaCode", countryBean.getAreaCodeName()); + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + + showLoadingDialog(); + Api.getInstance().registered(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { + if (feedbackResp.data.isRegistered()) { + + preCheckVerifyCode(String.valueOf(binding.loginFormUidEdit.getText()).trim(), countryBean.getAreaCodeName()); + + } else { + ToastX.showShortToast(R.string.zhbcz_txt); + + } + + } + + @Override + public void onError(int code, String msg) { + dimessLoadingDialog(); + LogUtils.i("获取到的错误:" + code + "" + msg); + ToastX.showShortToast(msg); + + + } + }); + } + + + private void preCheckVerifyCode(String phone, String areaCode) { + Map maps = new HashMap<>(); + maps.put("verifyCode", String.valueOf(binding.passwordEditText.getText()).trim()); + maps.put("phone", phone); + maps.put("areaCode", areaCode); + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + + Api.getInstance().preCheckVerifyCode(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { + dimessLoadingDialog(); + if (feedbackResp.data.isCorrect()) { + binding.step1Ly.setVisibility(View.GONE); + binding.step2Ly.setVisibility(View.VISIBLE); + } else { + ToastX.showShortToast(R.string.yzmbzq_txt); + } + } + + @Override + public void onError(int code, String msg) { + dimessLoadingDialog(); + LogUtils.i("获取到的错误:" + code + "" + msg); + ToastX.showShortToast(msg); + + + } + }); + } + + + private void preCheckVerifyCodeLoc(String phone, String areaCode) { + Map maps = new HashMap<>(); + maps.put("verifyCode", String.valueOf(binding.passwordEditText.getText()).trim()); + maps.put("phone", phone); + maps.put("areaCode", areaCode); + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + + Api.getInstance().preCheckVerifyCode(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { + dimessLoadingDialog(); + if (feedbackResp.data.isCorrect()) { + binding.step1Ly.setVisibility(View.GONE); + binding.step2Ly.setVisibility(View.VISIBLE); + if (type == TYPE_CHANGE_PAY_PASSWORD) { + binding.passwordLy.setVisibility(View.GONE); + binding.passwordEditTextCode.setVisibility(View.VISIBLE); + binding.lineStep2V.setVisibility(View.GONE); + } + } else { + ToastX.showShortToast(R.string.yzmbzq_txt); + } + } + + @Override + public void onError(int code, String msg) { + dimessLoadingDialog(); + LogUtils.i("获取到的错误:" + code + "" + msg); + ToastX.showShortToast(msg); + + + } + }); + } + + + private void changeBindPhone() { + + Map maps = new HashMap<>(); + + boolean isCodeChange = getIntent().getBooleanExtra("isCode", true); + if (isCodeChange) { + maps.put("phone", getIntent().getStringExtra("phone")); + maps.put("areaCode", getIntent().getStringExtra("area")); + maps.put("newPhone", binding.loginFormUidEdit.getText().toString().trim()); + maps.put("newAreaCode", countryBean.getAreaCodeName()); + maps.put("changeVerifyCode", getIntent().getStringExtra("password")); + maps.put("bindVerifyCode", binding.passwordEditText.getText().toString().trim()); + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + + Api.getInstance().smsChangeBindPhone(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver() { + @Override + public void onSuccess(Result feedbackResp) { + binding.step1Ly.setVisibility(View.GONE); + binding.succIv.setVisibility(View.VISIBLE); + setSuccessText(true); + binding.sumbitBt.setText(getString(R.string.general_back)); + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast(msg); + } + }); + } else { + maps.put("userId", loginBean.getUser_uid()); + maps.put("newPhone", binding.loginFormUidEdit.getText().toString().trim()); + maps.put("newAreaCode", countryBean.getAreaCodeName()); + maps.put("password", getIntent().getStringExtra("password")); + maps.put("bindVerifyCode", binding.passwordEditText.getText().toString().trim()); + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + + Api.getInstance().passwordChangeBindPhone(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver() { + @Override + public void onSuccess(Result feedbackResp) { + binding.step1Ly.setVisibility(View.GONE); + binding.succIv.setVisibility(View.VISIBLE); + setSuccessText(true); + binding.sumbitBt.setText(R.string.general_back); + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast(msg); + } + }); + } + + } + + private void setSuccessText(boolean isShow) { + binding.succTv.setVisibility(View.VISIBLE); + if (type == TYPE_BIND_PHONE) { + binding.succTv.setText(R.string.bangdingchengong_txt); + } else if (type == TYPE_CHANGE_BIND_PHONE) { + binding.succTv.setText(R.string.bangdingchengong_txt); + } else if (type == TYPE_CHANGE_PASSWORD) { + binding.succTv.setText(R.string.xgmmcg_txt); + + } else if (type == TYPE_FIND_PASSWORD) { + binding.succTv.setText(getString(R.string.zhmmcc_txt)); + + } else if (type == TYPE_CHANGE_PAY_PASSWORD) { + binding.succTv.setText(getString(R.string.szzfmmcg_txt)); + + } + + + } + + private void bindPhone() { + Map maps = new HashMap<>(); + maps.put("userUid", loginBean.getUser_uid()); + maps.put("phone", binding.loginFormUidEdit.getText().toString().trim()); + maps.put("areaCode", countryBean.getAreaCodeName()); + maps.put("verifyCode", binding.passwordEditText.getText().toString().trim()); + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + + Api.getInstance().bindPhone(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver() { + @Override + public void onSuccess(Result feedbackResp) { + binding.step1Ly.setVisibility(View.GONE); + binding.succIv.setVisibility(View.VISIBLE); + setSuccessText(true); + + binding.sumbitBt.setText(R.string.general_back); + } + + @Override + public void onError(int code, String msg) { +// LogUtils.i("获取到的错误:"+code+""+ msg); + ToastX.showShortToast(msg); + } + }); + } + + private void toChangePasswordFind() { + Map maps = new HashMap<>(); + maps.put("phone", binding.loginFormUidEdit.getText().toString().trim()); + maps.put("areaCode", countryBean.getAreaCodeName()); + maps.put("verifyCode", binding.passwordEditText.getText().toString().trim()); + maps.put("newPassword", binding.passwordText.getText().toString().trim()); + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + + Api.getInstance().smsSetPassword(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + binding.step2Ly.setVisibility(View.GONE); + binding.succIv.setVisibility(View.VISIBLE); + setSuccessText(true); +// PreferencesToolkits.saveDefaultLoginName(ChangeAccoutActionActivity.this +// , new LoginInfoToSave(loginFormUidEdit.getText().toString().trim(), passwordText.getText().toString().trim(), areaTv.getText().toString(), 0)); + + binding.sumbitBt.setText(R.string.general_back); + } + + @Override + public void onError(int code, String msg) { +// LogUtils.i("获取到的错误:"+code+""+ msg); + ToastX.showShortToast(msg); + } + }); + } + + private void toChangePasswordPay() { + if (bean != null) { + Map maps = new HashMap<>(); + maps.put("phone", bean.getPhone()); + maps.put("areaCode", bean.getAreaCode()); + maps.put("verifyCode", binding.passwordEditText.getText().toString().trim()); + maps.put("payPassword", passwordCode); + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + + Api.getInstance().setPayPasswordByVerifyCode(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + binding.step2Ly.setVisibility(View.GONE); + binding.succIv.setVisibility(View.VISIBLE); + setSuccessText(true); + + binding.sumbitBt.setText(R.string.general_back); + } + + @Override + public void onError(int code, String msg) { +// LogUtils.i("获取到的错误:"+code+""+ msg); + ToastX.showShortToast(msg); + } + }); + } + } + + private void toChangePassword() { + Map maps = new HashMap<>(); + maps.put("phone", bean.getPhone()); + maps.put("areaCode", bean.getAreaCode()); + maps.put("verifyCode", binding.passwordEditText.getText().toString().trim()); + maps.put("newPassword", binding.passwordText.getText().toString().trim()); + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + + Api.getInstance().smsSetPassword(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + binding.step2Ly.setVisibility(View.GONE); + binding.succIv.setVisibility(View.VISIBLE); + setSuccessText(true); + + binding.sumbitBt.setText(R.string.general_back); +// PreferencesToolkits.saveDefaultLoginName(ChangeAccoutActionActivity.this +// , new LoginInfoToSave(bean.getPhone(), passwordText.getText().toString().trim(), bean.getAreaCode(), 0)); + + } + + @Override + public void onError(int code, String msg) { +// LogUtils.i("获取到的错误:"+code+""+ msg); + ToastX.showShortToast(msg); + } + }); + } + + + @Override + public void onBackPressed() { + if (type == TYPE_CHANGE_PASSWORD) { + if (binding.succIv.getVisibility() == View.VISIBLE) { + IMKitClient.logoutIM( + new com.netease.yunxin.kit.corekit.im.login.LoginCallback() { + @Override + public void onError(int errorCode, @NonNull String errorMsg) { + Toast.makeText( + ChangeAccoutActionActivity.this, + "error code is " + errorCode + ", message is " + errorMsg, + Toast.LENGTH_SHORT) + .show(); + } + + @Override + public void onSuccess(@Nullable Void data) { + if (ChangeAccoutActionActivity.this.getApplicationContext() instanceof IMApplication) { + ((IMApplication) ChangeAccoutActionActivity.this.getApplicationContext()) + .clearActivity(ChangeAccoutActionActivity.this); + } + DataUtils.set(ChangeAccoutActionActivity.this, IMUIKitConfig.LOGIN_ACCOUNT, ""); + DataUtils.set(ChangeAccoutActionActivity.this, IMUIKitConfig.LOGIN_TOKEN, ""); + startActivity(new Intent(ChangeAccoutActionActivity.this, WelcomeActivity.class)); + finish(); + } + }); + } else if (binding.step2Ly.getVisibility() == View.VISIBLE) { + binding.step2Ly.setVisibility(View.GONE); + binding.step1Ly.setVisibility(View.VISIBLE); + } else { + super.onBackPressed(); + } + } else if (type == TYPE_CHANGE_PAY_PASSWORD) { + if (binding.step2Ly.getVisibility() == View.VISIBLE) { + binding.step2Ly.setVisibility(View.GONE); + binding.step1Ly.setVisibility(View.VISIBLE); + } else { + super.onBackPressed(); + } + } else if (type == TYPE_FIND_PASSWORD) { + if (binding.succIv.getVisibility() == View.VISIBLE) { + startActivity(new Intent(this, LoginActivity.class)); + + finish(); + } else if (binding.step2Ly.getVisibility() == View.VISIBLE) { + binding.step2Ly.setVisibility(View.GONE); + binding.step1Ly.setVisibility(View.VISIBLE); + } else { + startActivity(new Intent(this, LoginActivity.class)); + finish(); + } + } else if (type == TYPE_BIND_PHONE || type == TYPE_CHANGE_BIND_PHONE) { + if (type == TYPE_CHANGE_BIND_PHONE) { + setResult(RESULT_OK); + } + super.onBackPressed(); + } + } + + @Override + protected void onDestroy() { + super.onDestroy(); + } + + private void bindInfo(String user_uid) { + Api.getInstance().bindInfo(user_uid) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + bean = feedbackResp.data; + binding.phoneTv.setText(feedbackResp.data.getAreaCode() + feedbackResp.data.getPhone()); + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); +// WidgetUtils.showToast(getActivity(), msg, WidgetUtils.ToastType.ERROR); + } + }); + } + + private void showType() { +// if (isShowPass) { +//// binding.passShowIv.setImageResource(R.drawable.yanjing_open); +// binding.passwordText.setTransformationMethod(HideReturnsTransformationMethod.getInstance()); +// binding.passwordText.setTransformationMethod(HideReturnsTransformationMethod.getInstance()); +// } else { +// passShowIv.setImageResource(R.drawable.yanjing_hide); +// passwordText.setTransformationMethod(PasswordTransformationMethod.getInstance()); +// +// } +// passwordText.setSelection(passwordText.getText().length()); + } + + + MyCountDownTimer myCountDownTimer; + + //倒计时函数 + private class MyCountDownTimer extends CountDownTimer { + + public MyCountDownTimer(long millisInFuture, long countDownInterval) { + super(millisInFuture, countDownInterval); + } + + //计时过程 + @Override + public void onTick(long l) { + //防止计时过程中重复点击 + binding.getcodeTv.setClickable(false); + binding.getcodeTv.setTextColor(getResources().getColor(R.color.color_themeblue)); + binding.getcodeTv.setText(String.format(getString(R.string.get_code1_txt), (l / 1000))); + + } + + //计时完毕的方法 + @Override + public void onFinish() { + //重新给Button设置文字 + binding.getcodeTv.setText(R.string.get_code_txt); + //设置可点击 + binding.getcodeTv.setClickable(true); + binding.getcodeTv.setTextColor(getResources().getColor(R.color.color_themeblue)); + + } + } + + + /** + * 获取验证码 + */ + private void getVerifyCode() { + hideSoftInput(this); + getCode(); + } + + private void getCode() { + if (type == TYPE_CHANGE_PASSWORD || type == TYPE_FIND_PASSWORD) { + Map maps = new HashMap<>(); + maps.put("phone", type == TYPE_CHANGE_PASSWORD ? bean.getPhone() : binding.loginFormUidEdit.getText().toString().trim()); + maps.put("areaCode", type == TYPE_CHANGE_PASSWORD ? bean.getAreaCode() : countryBean.getAreaCodeName()); + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + + Api.getInstance().sendSmsForSetPassword(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { + myCountDownTimer.start(); + ToastX.showShortToast(feedbackResp.data); + + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + ToastX.showShortToast(msg); + } + }); + } else if (type == TYPE_BIND_PHONE || type == TYPE_CHANGE_BIND_PHONE) { + Map maps = new HashMap<>(); + maps.put("phone", binding.loginFormUidEdit.getText().toString().trim()); + maps.put("areaCode", countryBean.getAreaCodeName()); + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + + Api.getInstance().sendSmsForBindPhone(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { + myCountDownTimer.start(); + ToastX.showShortToast(feedbackResp.data); + + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + ToastX.showShortToast(msg); + } + }); + } else if (type == TYPE_CHANGE_PAY_PASSWORD) { + if (bean != null) { + Map maps = new HashMap<>(); + maps.put("phone", bean.getPhone()); + maps.put("areaCode", bean.getAreaCode()); + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + + Api.getInstance().sendSmsForSetPayPassword(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { + myCountDownTimer.start(); + ToastX.showShortToast(feedbackResp.data); + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + ToastX.showShortToast(msg); + } + }); + } + } + + + } + + public void setTitles(String titleId) { + binding.settingTitleBar.getTitleTextView().setText(titleId); + } + + private void changTitle() { + switch (type) { + case TYPE_BIND_PHONE: + case TYPE_CHANGE_BIND_PHONE: + setTitles(getString(R.string.bind_phone_txt)); + binding.phoneLy.setVisibility(View.VISIBLE); +// line1.setVisibility(View.VISIBLE); + binding.phoneTv.setVisibility(View.GONE); + break; + case TYPE_CHANGE_PASSWORD: + setTitle(getString(R.string.set_pass_txt)); + binding.phoneLy.setVisibility(View.GONE); +// line1.setVisibility(View.GONE); + binding.phoneTv.setVisibility(View.VISIBLE); + break; + case TYPE_FIND_PASSWORD: + setTitle(getString(R.string.zhaohuimima_txt)); + binding.phoneLy.setVisibility(View.VISIBLE); +// line1.setVisibility(View.VISIBLE); + binding.phoneTv.setVisibility(View.GONE); + break; + case TYPE_CHANGE_PAY_PASSWORD: + setTitle(getString(R.string.set_pay_pass_txt)); + binding.phoneLy.setVisibility(View.GONE); +// line1.setVisibility(View.GONE); + binding.phoneTv.setVisibility(View.VISIBLE); + binding.passwordText.setInputType(InputType.TYPE_CLASS_NUMBER); + binding.titleStep2Tv.setText(R.string.qszzfmm_txt); + binding.passwordText.setHint(R.string.qszlwszzfmm_txt); + break; + } + } + public boolean onTouchEvent(MotionEvent event) { + if(null != this.getCurrentFocus()){ + /** + * 点击空白位置 隐藏软键盘 + */ + InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + return mInputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0); + } + return super .onTouchEvent(event); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/main/mine/ChangePasswordActivity.java b/app/src/main/java/com/dskj/rbchat/main/mine/ChangePasswordActivity.java new file mode 100644 index 0000000..4936b50 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/mine/ChangePasswordActivity.java @@ -0,0 +1,438 @@ +package com.dskj.rbchat.main.mine; + +import android.app.Activity; +import android.content.Intent; +import android.os.Bundle; +import android.os.CountDownTimer; +import android.os.Handler; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.view.MotionEvent; +import android.view.View; +import android.view.inputmethod.InputMethodManager; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; + +import com.dskj.rbchat.databinding.ActivityActivityChangeBinding; +import com.dskj.rbchat.model.BindBean; +import com.dskj.rbchat.model.LoginBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.welcome.WelcomeActivity; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.corekit.im.IMKitClient; + +import java.util.HashMap; +import java.util.Map; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class ChangePasswordActivity extends BaseActivity { + + LoginBean loginBean; + + + private ActivityActivityChangeBinding viewBinding; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + getWindow().setStatusBarColor(getResources().getColor(R.color.color_white)); + getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white)); + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR|View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR); + + super.onCreate(savedInstanceState); + viewBinding = ActivityActivityChangeBinding.inflate(getLayoutInflater()); + setContentView(viewBinding.getRoot()); + initView(); + + initListeners(); + } + protected void initView() { + + viewBinding.loginFormUidEdit.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) { + changeBtStatus(); + } + + @Override + public void afterTextChanged(Editable s) { + + } + }); + + viewBinding.passwordEditText.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) { + changeBtStatus(); + + } + + @Override + public void afterTextChanged(Editable s) { + + } + }); + + viewBinding.passwordText.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) { + changeBtStatus(); + + } + + @Override + public void afterTextChanged(Editable s) { + + } + }); + + myCountDownTimer = new MyCountDownTimer(60000, 1000); + loginBean = DataUtils.getLocUserInfo(); + if(loginBean!=null) { + bindInfo(loginBean.getUser_uid()); + } + + Handler handler = new Handler(); + handler.postDelayed(new Runnable() { + @Override + public void run() { + viewBinding.passwordText.setFocusable(true);//设置输入框可聚焦 + viewBinding.passwordText.setFocusableInTouchMode(true);//设置触摸聚焦 + viewBinding.passwordText.requestFocus();//请求聚焦 + viewBinding.passwordText.findFocus();//获取焦点 + + } + }, 300); + + } + + private void changeBtStatus() { + + if( viewBinding.phoneLy.getVisibility() == View.VISIBLE){ + if(!TextUtils.isEmpty( viewBinding.loginFormUidEdit.getText().toString().trim()) + &&!TextUtils.isEmpty( viewBinding.passwordEditText.getText().toString().trim()) + && viewBinding.passwordEditText.getText().toString().trim().length()==4 + &&!TextUtils.isEmpty( viewBinding.passwordText.getText().toString().trim())){ + viewBinding.sumbitBt.setBackgroundResource(R.drawable.logout_btn2); + }else{ + viewBinding.sumbitBt.setBackgroundResource(R.drawable.input_bg1); + } + }else{ + viewBinding.sumbitBt.setBackgroundResource(R.drawable.logout_btn2); + } + } + + @Override + protected void onResume() { + super.onResume(); + + } + private boolean isShowPass = false; + + protected void initListeners() { + viewBinding.settingTitleBar.getBackImageView().setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(viewBinding.passwordLy.getVisibility() == View.VISIBLE){ + finish(); + }else{ + IMKitClient.logoutIM( + new com.netease.yunxin.kit.corekit.im.login.LoginCallback() { + @Override + public void onError(int errorCode, @NonNull String errorMsg) { + Toast.makeText( + ChangePasswordActivity.this, + "error code is " + errorCode + ", message is " + errorMsg, + Toast.LENGTH_SHORT) + .show(); + } + + @Override + public void onSuccess(@Nullable Void data) { + if (ChangePasswordActivity.this.getApplicationContext() instanceof IMApplication) { + ((IMApplication) ChangePasswordActivity.this.getApplicationContext()) + .clearActivity(ChangePasswordActivity.this); + } + DataUtils.set(ChangePasswordActivity.this, IMUIKitConfig.LOGIN_ACCOUNT, ""); + DataUtils.set(ChangePasswordActivity.this, IMUIKitConfig.LOGIN_TOKEN, ""); + startActivity(new Intent(ChangePasswordActivity.this, WelcomeActivity.class)); + finish(); + } + }); + } + } + }); + + + viewBinding.sumbitBt.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if( viewBinding.phoneLy.getVisibility() == View.VISIBLE) { + if (String.valueOf( viewBinding.loginFormUidEdit.getText()).trim().length() <= 0) { +// loginFormUidEdit.setError("请先输入手机号"); + ToastX.showShortToast(getString(R.string.login_form_hint_loginname)); + + return; + } + + if (String.valueOf( viewBinding.passwordEditText.getText()).trim().length() <= 0) { +// passwordEditText.setError("请先输入验证码"); + ToastX.showShortToast(getString(R.string.vcode_hint_txt)); + + return; + } + + if (String.valueOf( viewBinding.passwordEditText.getText()).trim().length() != 4) { +// passwordEditText.setError("请输入四位数验证码"); + ToastX.showShortToast(getString(R.string.qsrswyzm_txt)); + return; + } + + if (String.valueOf( viewBinding.passwordText.getText()).trim().length() <=0) { +// passwordEditText.setError("请输入四位数验证码"); + ToastX.showShortToast(getString(R.string.password_hint_txt)); + + return; + } + + toChangePasswordFind(); + + }else{ + IMKitClient.logoutIM( + new com.netease.yunxin.kit.corekit.im.login.LoginCallback() { + @Override + public void onError(int errorCode, @NonNull String errorMsg) { + Toast.makeText( + ChangePasswordActivity.this, + "error code is " + errorCode + ", message is " + errorMsg, + Toast.LENGTH_SHORT) + .show(); + } + + @Override + public void onSuccess(@Nullable Void data) { + if (ChangePasswordActivity.this.getApplicationContext() instanceof IMApplication) { + ((IMApplication) ChangePasswordActivity.this.getApplicationContext()) + .clearActivity(ChangePasswordActivity.this); + } + DataUtils.set(ChangePasswordActivity.this, IMUIKitConfig.LOGIN_ACCOUNT, ""); + DataUtils.set(ChangePasswordActivity.this, IMUIKitConfig.LOGIN_TOKEN, ""); + startActivity(new Intent(ChangePasswordActivity.this, WelcomeActivity.class)); + finish(); + } + }); + } + } + }); + + viewBinding.getcodeTv.setOnClickListener(v -> { + getVerifyCode(); + }); + } + + + + + private void toChangePasswordFind() { + if(bean!=null) { + Map maps = new HashMap<>(); + maps.put("phone", bean.getPhone()); + maps.put("areaCode", bean.getAreaCode()); + maps.put("verifyCode",viewBinding. passwordEditText.getText().toString().trim()); + maps.put("newPassword", viewBinding. passwordText.getText().toString().trim()); + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + + Api.getInstance().smsSetPassword(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + showStep(2); +// PreferencesToolkits.saveDefaultLoginName(ChangePasswordActivity.this +// , new LoginInfoToSave(bean.getPhone(), passwordText.getText().toString().trim(), bean.getAreaCode(), 0)); + + } + + @Override + public void onError(int code, String msg) { +// LogUtils.i("获取到的错误:"+code+""+ msg); + ToastX.showShortToast(msg); + } + }); + } + } + + /** + * 获取验证码 + * + */ + private void getVerifyCode() { + hideSoftInput(this); + toStep2(); + } + + BindBean bean; + private void bindInfo(String user_uid) { + Api.getInstance().bindInfo(user_uid) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + bean = feedbackResp.data; + viewBinding.areaTv.setText(feedbackResp.data.getAreaCode()); + viewBinding.loginFormUidEdit.setText(feedbackResp.data.getPhone()); + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:"+code+""+ msg); +// WidgetUtils.showToast(getActivity(), msg, WidgetUtils.ToastType.ERROR); + } + }); + } + + + private void showStep(int i) { + if(i==1){ + viewBinding.phoneLy.setVisibility(View.VISIBLE); + viewBinding.codeLy.setVisibility(View.VISIBLE); + viewBinding.passwordLy.setVisibility(View.VISIBLE); + viewBinding.succIv.setVisibility(View.GONE); +// setTitle(getString(R.string.forget_password_title)); + viewBinding.settingTitleBar.getTitleTextView().setText(getString(R.string.forget_password_title)); + viewBinding.sumbitBt.setText(getString(R.string.sure_txt)); + changeBtStatus(); + }else{ + viewBinding. phoneLy.setVisibility(View.GONE); + viewBinding.codeLy.setVisibility(View.GONE); + viewBinding. passwordLy.setVisibility(View.GONE); + viewBinding.succIv.setVisibility(View.VISIBLE); +// setTitle(R.string.forget_password_title); + viewBinding.settingTitleBar.getTitleTextView().setText(getString(R.string.forget_password_title)); + + viewBinding.sumbitBt.setText(getString(R.string.video_call_out_over)); + changeBtStatus(); + + } + } + /** + * 隐藏软键盘 + */ + public void hideSoftInput(Activity activity) { + InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + if (getCurrentFocus() != null && null != imm) { + imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0); + } +// View view = activity.getCurrentFocus(); +// +// if (view != null) { +// +// InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE); +// +// inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); +// +// } + } + + private void toStep2() { + hideSoftInput(ChangePasswordActivity.this); + Map maps = new HashMap<>(); + maps.put("phone", String.valueOf(viewBinding.loginFormUidEdit.getText()).trim()); + maps.put("areaCode", String.valueOf(viewBinding.areaTv.getText()).trim()); + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + + Api.getInstance().sendSmsForSetPassword(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { + ToastX.showShortToast(feedbackResp.data); + + myCountDownTimer.start(); + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + ToastX.showShortToast(msg); + + } + }); + + + } + + MyCountDownTimer myCountDownTimer; + + //倒计时函数 + private class MyCountDownTimer extends CountDownTimer { + + public MyCountDownTimer(long millisInFuture, long countDownInterval) { + super(millisInFuture, countDownInterval); + } + + //计时过程 + @Override + public void onTick(long l) { + //防止计时过程中重复点击 + viewBinding.getcodeTv.setClickable(false); + viewBinding.getcodeTv.setTextColor(getResources().getColor(R.color.color_themeblue)); + viewBinding.getcodeTv.setText(String.format(getString(R.string.get_code1_txt), (l / 1000))); + + } + + //计时完毕的方法 + @Override + public void onFinish() { + //重新给Button设置文字 + viewBinding.getcodeTv.setText(R.string.get_code_txt); + //设置可点击 + viewBinding.getcodeTv.setClickable(true); + viewBinding.getcodeTv.setTextColor(getResources().getColor(R.color.color_themeblue)); + + } + } + public boolean onTouchEvent(MotionEvent event) { + if(null != this.getCurrentFocus()){ + /** + * 点击空白位置 隐藏软键盘 + */ + InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + return mInputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0); + } + return super .onTouchEvent(event); + } + +} diff --git a/app/src/main/java/com/dskj/rbchat/main/mine/ChangePhoneActivity.java b/app/src/main/java/com/dskj/rbchat/main/mine/ChangePhoneActivity.java new file mode 100644 index 0000000..a6e8b76 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/mine/ChangePhoneActivity.java @@ -0,0 +1,546 @@ +package com.dskj.rbchat.main.mine; + +import android.app.Activity; +import android.content.Intent; +import android.os.Bundle; +import android.os.CountDownTimer; +import android.text.Editable; +import android.text.Html; +import android.text.InputType; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.view.MotionEvent; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.view.inputmethod.InputMethodManager; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; + +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.custom.PasswordEditText; +import com.dskj.rbchat.databinding.ActivityChangeAccoutActionBinding; +import com.dskj.rbchat.databinding.ActivityChangePhoneBinding; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.dialog.ActionConfirmDialog1; +import com.dskj.rbchat.dialog.SelectCountryDialog; +import com.dskj.rbchat.login.LoginActivity; +import com.dskj.rbchat.login.PhoneLoginActivity; +import com.dskj.rbchat.login.WangjiActivity; +import com.dskj.rbchat.model.BindBean; +import com.dskj.rbchat.model.CountryBean; +import com.dskj.rbchat.model.LoginBean; +import com.dskj.rbchat.model.RegisteredBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.KeyboardUtil; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.welcome.WelcomeActivity; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.dialog.LoadingDialog; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.corekit.im.IMKitClient; + +import java.util.HashMap; +import java.util.Map; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class ChangePhoneActivity extends BaseActivity { + + ActivityChangePhoneBinding binding; + BindBean bean; + int step = 1; + String passwordOld = ""; + String passwordNew = ""; + CountryBean countryBean; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = ActivityChangePhoneBinding.inflate(getLayoutInflater()); + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR | View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR); + + setContentView(binding.getRoot()); + + initView(); + } + + private void bindInfo(String user_uid) { + Api.getInstance().bindInfo(user_uid) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + bean = feedbackResp.data; + //只有这是个参数允许切换 +// viewBinding.bindWechatTv.setText(feedbackResp.data.getWechatBind()?getString(R.string.yibangding_txt):getString(R.string.weibangding_txt)); + binding.phoneTv.setText(feedbackResp.data.getAreaCode() + feedbackResp.data.getPhone()); + binding.sendSmsTipsTv.setText(Html.fromHtml(String.format(getString(R.string.djfsyzm_txt), + bean.getAreaCode() + " " + bean.getPhone()))); + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); +// WidgetUtils.showToast(getActivity(), msg, WidgetUtils.ToastType.ERROR); + } + }); + } + + protected void initView() { + binding.settingTitleBar.getBackImageView().setOnClickListener(v -> finish()); + + binding.passwordEditTextCode.setOnCompleteListener(new PasswordEditText.onCompletionListener() { + @Override + public void onCompletion(String code) { + passwordOld = code; + if (TextUtils.isEmpty(passwordOld) || passwordOld.length() < 4) { + setSubmitBackground(false); + } else { + setSubmitBackground(true); + + } + + } + }); + + binding.passwordEditTextCode1.setOnCompleteListener(new PasswordEditText.onCompletionListener() { + @Override + public void onCompletion(String code) { + passwordNew = code; + if (TextUtils.isEmpty(passwordNew) || passwordNew.length() < 4) { + // binding.sumbitBt.setBackgroundResource(R.drawable.logout_btn_sl_88); + setSubmitBackground(false); + } else { + // binding.sumbitBt.setBackgroundResource(R.drawable.logout_btn2); + setSubmitBackground(true); + + } + } + }); + binding.sendSmsTv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (bean != null) { + toStep2(); + } + } + }); + + binding.phoneEt.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) { + if (TextUtils.isEmpty(binding.phoneEt.getText().toString().trim())) { + setSubmitBackground(false); + } else { +// binding.sumbitBt.setBackgroundResource(com.netease.yunxin.kit.contactkit.ui.R.drawable.fun_themeblue_btn_bg); + setSubmitBackground(true); + } + } + + @Override + public void afterTextChanged(Editable s) { + + } + }); + + binding.sendSmsTv1.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + toStep4(); + + } + }); + + bindInfo(IMKitClient.account()); + binding.sumbitBt.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (step == 1) { + step += 1; + changeShow(step); + } else if (step == 2) { + if (TextUtils.isEmpty(passwordOld)) { + ToastX.showShortToast(getString(R.string.dxyzmbnwk_txt)); + return; + } + preCheckVerifyCodeLoc(); + + } else if (step == 3) { + if (TextUtils.isEmpty(binding.phoneTv.getText().toString().trim())) { + ToastX.showShortToast(getString(R.string.sjhbnwk_txt)); + return; + } + step += 1; + changeShow(step); + } else if (step == 4) { + if (TextUtils.isEmpty(passwordNew)) { + ToastX.showShortToast(getString(R.string.dxyzmbnwk_txt)); + return; + } + if (bean != null) { + toChangePhone(); + } + } + } + }); + + countryBean = DataUtils.getLocCountry(ChangePhoneActivity.this); + changeArea(); + + binding.areaTv.setOnClickListener(v -> { + SelectCountryDialog selectCountryDialog = new SelectCountryDialog(ChangePhoneActivity.this); + selectCountryDialog.setOnToVipListener(type -> { + countryBean = type; + changeArea(); + DataUtils.set(ChangePhoneActivity.this, IMUIKitConfig.LOC_COUNTRY_CODE, type.getAreaCodeName()); + }); + selectCountryDialog.show(); + }); + myCountDownTimer = new MyCountDownTimer(60000, 1000); + myCountDownTimer1 = new MyCountDownTimer1(60000, 1000); + + } + + private void toStep2() { + KeyboardUtil.hideSoftInput(ChangePhoneActivity.this); + Map maps = new HashMap<>(); + maps.put("phone", bean.getPhone()); + maps.put("areaCode", bean.getAreaCode()); + if (!TextUtils.isEmpty(IMUIKitConfig.SUBSTATIONID)) { + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + } + Api.getInstance().sendSmsForChangeBindPhone(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { + myCountDownTimer.start(); + ActionConfirmDialog actionConfirmDialog = new ActionConfirmDialog(ChangePhoneActivity.this, getString(R.string.yzmyfs_txt), false); + actionConfirmDialog.show(); + binding.sendSmsTipsTv.setText(Html.fromHtml(String.format(getString(R.string.djfsyzm_txt1), + bean.getAreaCode() + " " + bean.getPhone()))); + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + ToastX.showShortToast(msg); + } + }); + + + } + + private void toStep4() { + KeyboardUtil.hideSoftInput(ChangePhoneActivity.this); + Map maps = new HashMap<>(); + maps.put("phone", binding.phoneEt.getText().toString().trim()); + maps.put("areaCode", countryBean.getAreaCodeName()); + if (!TextUtils.isEmpty(IMUIKitConfig.SUBSTATIONID)) { + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + } + Api.getInstance().sendSmsForBindPhone(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { + myCountDownTimer1.start(); + ActionConfirmDialog actionConfirmDialog = new ActionConfirmDialog(ChangePhoneActivity.this, getString(R.string.yzmyfs_txt), false); + actionConfirmDialog.show(); + binding.sendSmsTipsTv1.setText(Html.fromHtml(String.format(getString(R.string.djfsyzm_txt1), + countryBean.getAreaCodeName() + " " + binding.phoneEt.getText().toString().trim()))); + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + ToastX.showShortToast(msg); + } + }); + + + } + + MyCountDownTimer myCountDownTimer; + MyCountDownTimer1 myCountDownTimer1; + + //倒计时函数 + private class MyCountDownTimer extends CountDownTimer { + + public MyCountDownTimer(long millisInFuture, long countDownInterval) { + super(millisInFuture, countDownInterval); + } + + //计时过程 + @Override + public void onTick(long l) { + //防止计时过程中重复点击 + binding.sendSmsTv.setClickable(false); + binding.sendSmsTv.setTextColor(getResources().getColor(R.color.color_themeblue)); + binding.sendSmsTv.setText(String.format(getString(R.string.get_code1_txt), (l / 1000))); + + } + + //计时完毕的方法 + @Override + public void onFinish() { + //重新给Button设置文字 + binding.sendSmsTv.setText(R.string.get_code_txt); + //设置可点击 + binding.sendSmsTv.setClickable(true); + binding.sendSmsTv.setTextColor(getResources().getColor(R.color.color_themeblue)); + + } + } + + + //倒计时函数 + private class MyCountDownTimer1 extends CountDownTimer { + + public MyCountDownTimer1(long millisInFuture, long countDownInterval) { + super(millisInFuture, countDownInterval); + } + + //计时过程 + @Override + public void onTick(long l) { + //防止计时过程中重复点击 + binding.sendSmsTv1.setClickable(false); + binding.sendSmsTv1.setTextColor(getResources().getColor(R.color.color_themeblue)); + binding.sendSmsTv1.setText(String.format(getString(R.string.get_code1_txt), (l / 1000))); + + } + + //计时完毕的方法 + @Override + public void onFinish() { + //重新给Button设置文字 + binding.sendSmsTv1.setText(R.string.get_code_txt); + //设置可点击 + binding.sendSmsTv1.setClickable(true); + binding.sendSmsTv1.setTextColor(getResources().getColor(R.color.color_themeblue)); + + } + } + + private void preCheckVerifyCodeLoc() { + KeyboardUtil.hideSoftInput(this); + if (bean != null) { + Map maps = new HashMap<>(); + maps.put("verifyCode", passwordOld); + maps.put("phone", bean.getPhone()); + maps.put("areaCode", bean.getAreaCode()); + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + Api.getInstance().preCheckVerifyCode(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { + if (feedbackResp.data.isCorrect()) { + step += 1; + changeShow(step); + } else { + ToastX.showShortToast(getString(R.string.yzmbzq_txt)); + } + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + ToastX.showShortToast(msg); + + + } + }); + } + } + + + private void changeArea() { + binding.areaTv.setText(countryBean.getAreaCodeName()); + + } + + private void toChangePhone() { + Map maps = new HashMap<>(); + + maps.put("phone", bean.getPhone()); + maps.put("areaCode", bean.getAreaCode()); + maps.put("newPhone", binding.phoneEt.getText().toString().trim()); + maps.put("newAreaCode", countryBean.getAreaCodeName()); + maps.put("changeVerifyCode", passwordOld); + maps.put("bindVerifyCode", passwordNew); + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + + Api.getInstance().smsChangeBindPhone(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver() { + @Override + public void onSuccess(Result feedbackResp) { + ActionConfirmDialog1 actionConfirmDialog = new ActionConfirmDialog1(ChangePhoneActivity.this, getString(R.string.genghuancheng_to_login_txt), false); + actionConfirmDialog.setOnToActionListener(new ActionConfirmDialog1.OnToActionListener() { + @Override + public void toSumbit() { + myCountDownTimer.cancel(); + myCountDownTimer1.cancel(); + IMKitClient.logoutIM( + + new com.netease.yunxin.kit.corekit.im.login.LoginCallback() { + @Override + public void onError(int errorCode, @NonNull String errorMsg) { + if (getApplicationContext() instanceof IMApplication) { + ((IMApplication) getApplicationContext()) + .clearActivity(ChangePhoneActivity.this); + } + DataUtils.set(ChangePhoneActivity.this, IMUIKitConfig.LOGIN_ACCOUNT, ""); + DataUtils.set(ChangePhoneActivity.this, IMUIKitConfig.LOGIN_TOKEN, ""); + startActivity(new Intent(ChangePhoneActivity.this, WelcomeActivity.class)); + finish(); + } + + @Override + public void onSuccess(@Nullable Void data) { + if (getApplicationContext() instanceof IMApplication) { + ((IMApplication) getApplicationContext()) + .clearActivity(ChangePhoneActivity.this); + } + DataUtils.set(ChangePhoneActivity.this, IMUIKitConfig.LOGIN_ACCOUNT, ""); + DataUtils.set(ChangePhoneActivity.this, IMUIKitConfig.LOGIN_TOKEN, ""); + startActivity(new Intent(ChangePhoneActivity.this, WelcomeActivity.class)); + finish(); + } + }); + } + + @Override + public void toCancel() { + + } + }); + actionConfirmDialog.show(); + } + + @Override + public void onError(int code, String msg) { + ActionConfirmDialog1 actionConfirmDialog = new ActionConfirmDialog1(ChangePhoneActivity.this, msg, "", + getString(R.string.general_got_it), false); + actionConfirmDialog.setOnToActionListener(new ActionConfirmDialog1.OnToActionListener() { + @Override + public void toSumbit() { + + } + + @Override + public void toCancel() { + + } + }); + actionConfirmDialog.show(); + } + }); + } + + private void changeShow(int step) { + binding.step1.setVisibility(View.GONE); + binding.step2.setVisibility(View.GONE); + binding.step3.setVisibility(View.GONE); + binding.step4.setVisibility(View.GONE); + switch (step) { + case 1: + binding.step1.setVisibility(View.VISIBLE); + binding.sumbitBt.setText(getString(R.string.genghuanshoujihao_txt)); + binding.settingTitleBar.getTitleTextView().setText(getString(R.string.gengaibangdingshoujihao_txt)); + break; + case 2: + binding.step2.setVisibility(View.VISIBLE); + binding.sumbitBt.setText(getString(R.string.next_txt)); + binding.settingTitleBar.getTitleTextView().setText(getString(R.string.sfrz_txt)); + if (TextUtils.isEmpty(passwordOld)) { +// binding.sumbitBt.setBackgroundResource(com.netease.yunxin.kit.contactkit.ui.R.drawable.fun_themeblue_alpha70_btn_bg); + setSubmitBackground(false); + } else { +// binding.sumbitBt.setBackgroundResource(com.netease.yunxin.kit.contactkit.ui.R.drawable.fun_themeblue_btn_bg); + setSubmitBackground(true); + } + break; + case 3: + binding.settingTitleBar.getTitleTextView().setText(getString(R.string.gengaibangdingshoujihao_txt)); + + binding.step3.setVisibility(View.VISIBLE); + binding.sumbitBt.setText(getString(R.string.next_txt)); + if (bean != null) { + binding.mobileTipsTv.setText(String.format(getString(R.string.xiugai_tips_txt), bean.getAreaCode() + " " + bean.getPhone())); + } + + if (TextUtils.isEmpty(binding.phoneEt.getText().toString().trim())) { +// binding.sumbitBt.setBackgroundResource(com.netease.yunxin.kit.contactkit.ui.R.drawable.fun_themeblue_alpha70_btn_bg); + setSubmitBackground(false); + } else { +// binding.sumbitBt.setBackgroundResource(com.netease.yunxin.kit.contactkit.ui.R.drawable.fun_themeblue_btn_bg); + setSubmitBackground(true); + } + + break; + case 4: + binding.settingTitleBar.getTitleTextView().setText(getString(R.string.sfrz_txt)); + + binding.step4.setVisibility(View.VISIBLE); + binding.sumbitBt.setText(getString(R.string.sure_txt)); + binding.sendSmsTipsTv1.setText(Html.fromHtml(String.format(getString(R.string.djfsyzm_txt), + countryBean.getAreaCodeName() + " " + binding.phoneEt.getText().toString().trim()))); + if (TextUtils.isEmpty(passwordNew)) { + setSubmitBackground(false); + // binding.sumbitBt.setBackgroundResource(com.netease.yunxin.kit.contactkit.ui.R.drawable.fun_themeblue_alpha70_btn_bg); + } else { + // binding.sumbitBt.setBackgroundResource(com.netease.yunxin.kit.contactkit.ui.R.drawable.fun_themeblue_btn_bg); + setSubmitBackground(true); + } + break; + + } + } + + public void setSubmitBackground(boolean isEnable) { + binding.sumbitBt.setBackgroundResource(isEnable ? com.netease.yunxin.kit.contactkit.ui.R.drawable.fun_themeblue_btn_bg : com.netease.yunxin.kit.contactkit.ui.R.drawable.fun_themeblue_alpha70_btn_bg); + } + + public boolean onTouchEvent(MotionEvent event) { + if (null != this.getCurrentFocus()) { + /** + * 点击空白位置 隐藏软键盘 + */ + InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + return mInputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0); + } + return super.onTouchEvent(event); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + } + +} diff --git a/app/src/main/java/com/dskj/rbchat/main/mine/EditFriendUserInfoActivity.java b/app/src/main/java/com/dskj/rbchat/main/mine/EditFriendUserInfoActivity.java new file mode 100644 index 0000000..be56745 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/mine/EditFriendUserInfoActivity.java @@ -0,0 +1,228 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.main.mine; + +import android.content.Context; +import android.content.Intent; +import android.content.res.ColorStateList; +import android.os.Build; +import android.os.Bundle; +import android.os.Parcelable; +import android.text.Editable; +import android.text.InputFilter; +import android.text.InputType; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; +import android.view.inputmethod.InputMethodManager; +import android.widget.Toast; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; + +import com.dskj.rbchat.AppSkinConfig; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.ActivityEditFriendnicknameBinding; +import com.dskj.rbchat.databinding.ActivityEditNicknameBinding; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.ApiService; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.Constant; +import com.dskj.rbchat.utils.LogUtils; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.friend.FriendService; +import com.netease.nimlib.sdk.friend.constant.FriendFieldEnum; +import com.netease.nimlib.sdk.friend.model.Friend; +import com.netease.yunxin.kit.chatkit.repo.ContactRepo; +import com.netease.yunxin.kit.chatkit.ui.common.ChatUserCache; +import com.netease.yunxin.kit.chatkit.ui.common.RxBus; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.common.utils.SizeUtils; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.model.FriendInfo; +import com.netease.yunxin.kit.corekit.im.model.UserField; +import com.netease.yunxin.kit.corekit.im.model.UserInfo; +import com.netease.yunxin.kit.corekit.im.provider.FetchCallback; +import com.netease.yunxin.kit.corekit.im.repo.CommonRepo; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +/** + * 好友备注 + */ +public class EditFriendUserInfoActivity extends BaseActivity { + private ActivityEditFriendnicknameBinding binding; + private FriendInfo friendInfo; + private int inputMaxNumber = 20; + private static final String extra = "accId"; + private static final String isFollow = "isFollow"; + private int isFollowValue; + + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = ActivityEditFriendnicknameBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + Window window = getWindow(); + window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + window.setStatusBarColor(ContextCompat.getColor(this, R.color.color_white)); + window.setNavigationBarColor(ContextCompat.getColor(this, R.color.color_white)); + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR | View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR); + + String account = getIntent().getStringExtra(extra); + isFollowValue = getIntent().getIntExtra(isFollow, 0); + binding.ivBack.setOnClickListener(v -> finish()); + ContactRepo.fetchFriend(account, new FetchCallback() { + @Override + public void onSuccess(@Nullable FriendInfo info) { + friendInfo = info; + binding.nicknameTv.setText(info.getUserInfo().getName()); + binding.etNickname.setText(info.getAlias()); + binding.etNickname.setSelection(info.getAlias().length()); + } + + @Override + public void onFailed(int i) { + + } + + @Override + public void onException(@Nullable Throwable throwable) { + + } + }); + binding.tvDone.setOnClickListener( + v -> { + ContactRepo.updateAlias(friendInfo.getAccount(), binding.etNickname.getText().toString()); + Api.getInstance().addRemark(friendInfo.getAccount(), binding.etNickname.getText().toString()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result feedbackResp) { + if (isFollowValue == 1) { + RxBus.getInstance().post(IMUIKitConfig.CHANGE_FOLLOW_USER); + } + ToastX.showShortToast(getString(R.string.xiugaichenggong_txt)); + setResult(RESULT_OK); + finish(); + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + ToastX.showShortToast(msg); + } + }); + + + }); + + binding.etNickname.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) { + + if (TextUtils.isEmpty(binding.etNickname.getText().toString().trim())) { + binding.numberTv.setText("0/" + inputMaxNumber); + changeDone(false); + } else { + binding.numberTv.setText((binding.etNickname.getText().toString().trim().length()) + "/" + inputMaxNumber); + changeDone(true); + + } + + + } + + @Override + public void afterTextChanged(Editable s) { + // if (TextUtils.isEmpty(String.valueOf(s))) { + // binding.ivClear.setVisibility(View.GONE); + // binding.tvDone.setEnabled(false); + // binding.tvDone.setAlpha(0.5f); + // } else { + // binding.ivClear.setVisibility(View.VISIBLE); + // binding.tvDone.setEnabled(true); + // binding.tvDone.setAlpha(1f); + // } + } + }); + + binding.etNickname.requestFocus(); + + binding.ivClear.setOnClickListener(v -> binding.etNickname.setText(null)); + if (AppSkinConfig.getInstance().getAppSkinStyle() == AppSkinConfig.AppSkin.commonSkin) { + setCommonSkin(); + } + } + + private void changeDone(boolean b) { + if (b) { + binding.tvDone.setBackgroundTintList(null); + binding.tvDone.setEnabled(true); + binding.ivClear.setVisibility(View.VISIBLE); + } else { + binding.tvDone.setBackgroundTintList(ColorStateList.valueOf(getColor(com.netease.yunxin.kit.contactkit.ui.R.color.color_6d80ff_alpha70))); + binding.tvDone.setEnabled(false); +// binding.tvDone.setBackgroundResource(R.drawable.logout_btn_g); + binding.ivClear.setVisibility(View.GONE); + + } + } + + + private void setCommonSkin() { + changeStatusBarColor(R.color.color_ededed); + binding.clyRoot.setBackgroundResource(R.color.color_ededed); + binding.tvDone.setTextColor(getResources().getColor(R.color.color_58be6b)); + + binding.etNickname.setBackgroundResource(R.color.color_white); + ViewGroup.MarginLayoutParams layoutParamsS = + (ViewGroup.MarginLayoutParams) binding.etNickname.getLayoutParams(); + layoutParamsS.setMargins(0, SizeUtils.dp2px(6), 0, 0); + binding.etNickname.setLayoutParams(layoutParamsS); + } + + + public static void launch( + Context context, String accId, int isFollowValue, @NonNull ActivityResultLauncher launcher) { + Intent intent = new Intent(context, EditFriendUserInfoActivity.class); + intent.putExtra(extra, accId); + intent.putExtra(isFollow, isFollowValue); + launcher.launch(intent); + } + + public boolean onTouchEvent(MotionEvent event) { + if (null != this.getCurrentFocus()) { + /** + * 点击空白位置 隐藏软键盘 + */ + InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + return mInputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0); + } + return super.onTouchEvent(event); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/main/mine/EditUserInfoActivity.java b/app/src/main/java/com/dskj/rbchat/main/mine/EditUserInfoActivity.java new file mode 100644 index 0000000..52e04d8 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/mine/EditUserInfoActivity.java @@ -0,0 +1,316 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.main.mine; + +import android.content.Context; +import android.content.Intent; +import android.content.res.ColorStateList; +import android.os.Bundle; +import android.text.Editable; +import android.text.InputFilter; +import android.text.InputType; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; +import android.view.inputmethod.InputMethodManager; +import android.widget.Toast; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; + +import com.dskj.rbchat.AppSkinConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.ActivityEditNicknameBinding; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.Constant; +import com.dskj.rbchat.utils.Constant; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.utils.ToastUtils; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.common.utils.SizeUtils; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.model.UserField; +import com.netease.yunxin.kit.corekit.im.model.UserInfo; +import com.netease.yunxin.kit.corekit.im.provider.FetchCallback; +import com.netease.yunxin.kit.corekit.im.repo.CommonRepo; + +import java.util.HashMap; +import java.util.Map; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class EditUserInfoActivity extends BaseActivity { + private ActivityEditNicknameBinding binding; + private String editType = Constant.EDIT_NAME; + private UserField userField = UserField.Name; + private UserInfo userInfo; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = ActivityEditNicknameBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + Window window = getWindow(); + window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + window.setStatusBarColor(ContextCompat.getColor(this, R.color.color_white)); + window.setNavigationBarColor(ContextCompat.getColor(this, R.color.color_white)); + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR | View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR); + + if (getIntent().getStringExtra(Constant.EDIT_TYPE) != null) { + editType = getIntent().getStringExtra(Constant.EDIT_TYPE); + } + loadData(); + binding.ivBack.setOnClickListener(v -> finish()); + binding.tvDone.setOnClickListener( + v -> { + + if (userField == UserField.Name) { + changeUserNickName(); + } else { + Map map = new HashMap<>(1); + String result = binding.etNickname.getText().toString(); + if (userField == UserField.Name && TextUtils.isEmpty(result)) { + result = userInfo.getAccount(); + } + map.put(userField, result); + CommonRepo.updateUserInfo( + map, + new FetchCallback() { + @Override + public void onSuccess(@Nullable Void param) { + loadData(); + setResult(RESULT_OK); + finish(); + } + + @Override + public void onFailed(int code) { + if (code == Constant.NETWORK_ERROR_CODE) { + Toast.makeText( + getApplicationContext(), + getString(R.string.network_error), + Toast.LENGTH_SHORT) + .show(); + } else { + Toast.makeText( + getApplicationContext(), + getString(R.string.request_fail) + code, + Toast.LENGTH_SHORT) + .show(); + } + } + + @Override + public void onException(@Nullable Throwable exception) { + Toast.makeText( + getApplicationContext(), + getString(R.string.request_fail), + Toast.LENGTH_SHORT) + .show(); + } + }); + } + }); + + binding.etNickname.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) { + if (userField == UserField.Name) { + if (TextUtils.isEmpty(binding.etNickname.getText().toString().trim())) { + binding.numberTv.setText("0/15"); + changeDone(false); + } else { + binding.numberTv.setText((binding.etNickname.getText().toString().trim().length()) + "/15"); + changeDone(true); + + } + } else { + if (userField == UserField.Signature) { + if (TextUtils.isEmpty(binding.etNickname.getText().toString().trim())) { + binding.numberTv.setText("0/50"); + changeDone(false); + } else { + binding.numberTv.setText((binding.etNickname.getText().toString().trim().length()) + "/50"); + changeDone(true); + + } + } + } + + } + + @Override + public void afterTextChanged(Editable s) { + // if (TextUtils.isEmpty(String.valueOf(s))) { + // binding.ivClear.setVisibility(View.GONE); + // binding.tvDone.setEnabled(false); + // binding.tvDone.setAlpha(0.5f); + // } else { + // binding.ivClear.setVisibility(View.VISIBLE); + // binding.tvDone.setEnabled(true); + // binding.tvDone.setAlpha(1f); + // } + } + }); + + binding.etNickname.requestFocus(); + + binding.ivClear.setOnClickListener(v -> binding.etNickname.setText(null)); + if (AppSkinConfig.getInstance().getAppSkinStyle() == AppSkinConfig.AppSkin.commonSkin) { + setCommonSkin(); + } + } + + private void changeDone(boolean b) { + if (b) { + binding.tvDone.setBackgroundTintList(null); + binding.tvDone.setEnabled(true); +// binding.tvDone.setBackgroundResource(R.mipmap.start_login); + } else { + binding.tvDone.setBackgroundTintList(ColorStateList.valueOf(getColor(com.netease.yunxin.kit.contactkit.ui.R.color.color_6d80ff_alpha70))); + binding.tvDone.setEnabled(false); +// binding.tvDone.setBackgroundResource(R.drawable.logout_btn_g); + + } + } + + private void changeUserNickName() { + String nickName = binding.etNickname.getText().toString(); + if (TextUtils.isEmpty(nickName)) { + return; + } + Map maps = new HashMap<>(); + maps.put("nickname", binding.etNickname.getText().toString()); + + Api.getInstance().authUser(IMKitClient.account(), maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver() { + @Override + public void onSuccess(Result feedbackResp) { + loadData(); + setResult(RESULT_OK); + finish(); + } + + @Override + public void onError(int code, String msg) { +// WidgetUtils.showToast(UserActivity.this, msg, WidgetUtils.ToastType.ERROR); + ToastX.showShortToast(msg); + //loadData(); +// setResult(RESULT_OK); +// finish(); + } + }); + } + + private void setCommonSkin() { + changeStatusBarColor(R.color.color_ededed); + binding.clyRoot.setBackgroundResource(R.color.color_ededed); + binding.tvDone.setTextColor(getResources().getColor(R.color.color_58be6b)); + + binding.etNickname.setBackgroundResource(R.color.color_white); + ViewGroup.MarginLayoutParams layoutParamsS = + (ViewGroup.MarginLayoutParams) binding.etNickname.getLayoutParams(); + layoutParamsS.setMargins(0, SizeUtils.dp2px(6), 0, 0); + binding.etNickname.setLayoutParams(layoutParamsS); + } + + private void loadData() { + String account = IMKitClient.account(); + if (TextUtils.isEmpty(account)) { + finish(); + return; + } + CommonRepo.getUserInfo( + account, + new FetchCallback() { + @Override + public void onSuccess(@Nullable UserInfo param) { + updateView(param); + } + + @Override + public void onFailed(int code) { + ToastX.showShortToast(R.string.user_fail); + updateView(new UserInfo(account, account, "")); + } + + @Override + public void onException(@Nullable Throwable exception) { + ToastX.showShortToast(R.string.user_fail); + updateView(new UserInfo(account, account, "")); + } + }); + } + + private void updateView(UserInfo user) { + this.userInfo = user; + String remoteInfo = ""; + if (TextUtils.equals(Constant.EDIT_NAME, editType)) { + remoteInfo = userInfo.getName(); + userField = UserField.Name; + binding.etNickname.setFilters(new InputFilter[]{new InputFilter.LengthFilter(15)}); + binding.tvTitle.setText(R.string.user_info_nickname); + } else if (TextUtils.equals(Constant.EDIT_SIGN, editType)) { + remoteInfo = userInfo.getSignature(); + userField = UserField.Signature; + binding.etNickname.setHint(getString(R.string.qsrmz_hint_txt1)); + binding.etNickname.setFilters(new InputFilter[]{new InputFilter.LengthFilter(50)}); + binding.tvTitle.setText(R.string.user_info_sign); + binding.titleLeftName.setText(R.string.user_info_sign); + } else if (TextUtils.equals(Constant.EDIT_EMAIL, editType)) { + remoteInfo = userInfo.getEmail(); + userField = UserField.Email; + binding.etNickname.setFilters(new InputFilter[]{new InputFilter.LengthFilter(30)}); + binding.etNickname.setInputType(InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS); + binding.tvTitle.setText(R.string.user_info_email); + } else if (TextUtils.equals(Constant.EDIT_PHONE, editType)) { + remoteInfo = userInfo.getMobile(); + userField = UserField.Mobile; + binding.etNickname.setFilters(new InputFilter[]{new InputFilter.LengthFilter(11)}); + binding.etNickname.setInputType(InputType.TYPE_CLASS_PHONE); + binding.tvTitle.setText(R.string.user_info_phone); + } + + binding.etNickname.setText(remoteInfo); + if (!TextUtils.isEmpty(remoteInfo)) { + binding.etNickname.setSelection(remoteInfo.length()); + } + } + + public static void launch( + Context context, String type, @NonNull ActivityResultLauncher launcher) { + Intent intent = new Intent(context, EditUserInfoActivity.class); + intent.putExtra(Constant.EDIT_TYPE, type); + launcher.launch(intent); + } + + public boolean onTouchEvent(MotionEvent event) { + if (null != this.getCurrentFocus()) { + /** + * 点击空白位置 隐藏软键盘 + */ + InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + return mInputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0); + } + return super.onTouchEvent(event); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/main/mine/FriendPermissionsActivity.java b/app/src/main/java/com/dskj/rbchat/main/mine/FriendPermissionsActivity.java new file mode 100644 index 0000000..bd842ed --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/mine/FriendPermissionsActivity.java @@ -0,0 +1,152 @@ +package com.dskj.rbchat.main.mine; + +import android.os.Bundle; +import android.view.View; + +import androidx.annotation.Nullable; +import androidx.appcompat.widget.SwitchCompat; + +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; + +import com.dskj.rbchat.databinding.FriendPermissionsActivityBinding; +import com.dskj.rbchat.model.LoginBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; + +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.utils.RouterConstant; +import com.netease.yunxin.kit.corekit.route.XKitRouter; + +import java.util.HashMap; +import java.util.Map; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class FriendPermissionsActivity extends BaseActivity { + private FriendPermissionsActivityBinding viewBinding; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + getWindow().setStatusBarColor(getResources().getColor(R.color.color_white)); + getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white)); + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR|View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR); + + super.onCreate(savedInstanceState); + viewBinding = FriendPermissionsActivityBinding.inflate(getLayoutInflater()); + setContentView(viewBinding.getRoot()); + initView(); + } + protected void initView() { + // 养成良好习惯:首先设置主layout,确保后绪的操作中使用到的组件都可以被find到 + getUserInfo(IMKitClient.account()); + viewBinding.settingTitleBar.setOnBackIconClickListener(v -> onBackPressed()); + + viewBinding.yanzhengSwitch.setOnClickListener(v -> changeButton(viewBinding.yanzhengSwitch)); + + viewBinding.moshengSwitch.setOnClickListener(v -> changeButton(viewBinding.moshengSwitch)); + + viewBinding.shoujihaoSwitch.setOnClickListener(v -> changeButton(viewBinding.shoujihaoSwitch)); + + viewBinding.idSwitch.setOnClickListener(v -> changeButton(viewBinding.idSwitch)); + + viewBinding.groupAddSwitch.setOnClickListener(v -> changeButton(viewBinding.groupAddSwitch)); + + viewBinding.blackTv.setOnClickListener(v -> XKitRouter.withKey(RouterConstant.PATH_FUN_MY_BLACK_PAGE) + .withContext(FriendPermissionsActivity.this) + .navigate()); + + } + + + private void getUserInfo(String user_uid) { + Api.getInstance().userInfo(user_uid) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result feedbackResp) { + changeIndex(feedbackResp.data); + + + LoginBean loginBean = DataUtils.getLocUserInfo(); + + if (loginBean != null) { + //只有这是个参数允许切换 + loginBean.setAddFriendNeedVerify(feedbackResp.data.getAddFriendNeedVerify()); + loginBean.setAllowAddFriendByGroup(feedbackResp.data.getAllowAddFriendByGroup()); + loginBean.setAllowSearchById(feedbackResp.data.getAllowSearchById()); + loginBean.setAllowSearchByPhone(feedbackResp.data.getAllowSearchByPhone()); + loginBean.setAllowStrangerChat(feedbackResp.data.getAllowStrangerChat()); + loginBean.setForbidQCoin(feedbackResp.data.getForbidQCoin()); + loginBean.setForbidQCoinTransferEnvelope(feedbackResp.data.getForbidQCoinTransferEnvelope()); + + loginBean.getUser().setAddFriendNeedVerify(feedbackResp.data.getAddFriendNeedVerify()); + loginBean.getUser().setAllowAddFriendByGroup(feedbackResp.data.getAllowAddFriendByGroup()); + loginBean.getUser().setAllowSearchById(feedbackResp.data.getAllowSearchById()); + loginBean.getUser().setAllowSearchByPhone(feedbackResp.data.getAllowSearchByPhone()); + loginBean.getUser().setAllowStrangerChat(feedbackResp.data.getAllowStrangerChat()); + loginBean.getUser().setForbidQCoin(feedbackResp.data.getForbidQCoin()); + loginBean.getUser().setForbidQCoinTransferEnvelope(feedbackResp.data.getForbidQCoinTransferEnvelope()); + DataUtils.set(FriendPermissionsActivity.this, "login_bean", GsonUtils.beanToJSONString(loginBean)); + + } + + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + } + }); + + + } + + private void changeIndex(LoginBean data) { + viewBinding.yanzhengSwitch.setChecked(data.getAddFriendNeedVerify()==1); + viewBinding.moshengSwitch.setChecked(data.getAllowStrangerChat()==1); + viewBinding.shoujihaoSwitch.setChecked(data.getAllowSearchByPhone()==1); + viewBinding.idSwitch.setChecked(data.getAllowSearchById()==1); + viewBinding.groupAddSwitch.setChecked(data.getAllowAddFriendByGroup()==1); + } + + private void changeButton(SwitchCompat checkBox){ + Map maps = new HashMap<>(); + if(checkBox == viewBinding.yanzhengSwitch){ + maps.put("addFriendNeedVerify",checkBox.isChecked()?1:0); + }else if(checkBox == viewBinding.moshengSwitch){ + maps.put("allowStrangerChat",checkBox.isChecked()?1:0); + }if(checkBox == viewBinding.shoujihaoSwitch){ + maps.put("allowSearchByPhone",checkBox.isChecked()?1:0); + }if(checkBox == viewBinding.idSwitch){ + maps.put("allowSearchById",checkBox.isChecked()?1:0); + }if(checkBox == viewBinding.groupAddSwitch){ + maps.put("allowAddFriendByGroup",checkBox.isChecked()?1:0); + } + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + + Api.getInstance().authUser(IMKitClient.account(),maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver() { + @Override + public void onSuccess(Result feedbackResp) { + getUserInfo(IMKitClient.account()); + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:"+code+""+ msg); + } + }); + } + + +} diff --git a/app/src/main/java/com/dskj/rbchat/main/mine/Help1Activity.java b/app/src/main/java/com/dskj/rbchat/main/mine/Help1Activity.java new file mode 100644 index 0000000..2f0caaa --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/mine/Help1Activity.java @@ -0,0 +1,338 @@ +package com.dskj.rbchat.main.mine; + +import android.content.Intent; +import android.os.Bundle; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.view.MotionEvent; +import android.view.View; +import android.view.inputmethod.InputMethodManager; +import android.widget.Button; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.lifecycle.ViewModelProvider; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.bumptech.glide.Glide; +import com.dskj.rbchat.BuildConfig; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; + +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.databinding.ActivityHelpBinding; +import com.dskj.rbchat.databinding.ActivityMineSettingBinding; +import com.dskj.rbchat.main.mine.setting.SettingViewModel; +import com.dskj.rbchat.model.QuesBean; +import com.dskj.rbchat.model.QuesListBean; +import com.dskj.rbchat.model.StaffServiceIdBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.ApiService; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.GsonUtils; + +import com.dskj.rbchat.widget.CircleImageView; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.scwang.smart.refresh.layout.SmartRefreshLayout; + +import java.util.ArrayList; +import java.util.List; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class Help1Activity extends BaseActivity { + List quesBeans = new ArrayList<>(); + List tuijians = new ArrayList<>(); + List selects = new ArrayList<>(); + private ActivityHelpBinding viewBinding; + + + CommonAdapter commonAdapter; + CommonAdapter commonAdapter1; + CommonAdapter commonAdapter2; + + List quesListBeans = new ArrayList<>(); + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + getWindow().setStatusBarColor(getResources().getColor(R.color.color_fcfcfc)); + getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white)); + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR|View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR); + + super.onCreate(savedInstanceState); + viewBinding = ActivityHelpBinding.inflate(getLayoutInflater()); + setContentView(viewBinding.getRoot()); + initView(); + } + + + protected void initView() { + + initList(); + initRefreshLayout(); + toKefu(); + + viewBinding.settingTitleBar.setOnBackIconClickListener(v -> onBackPressed()); + + viewBinding.searchEt.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) { + changView(); + } + + @Override + public void afterTextChanged(Editable s) { + + } + }); + + } + + private void changView() { + if(TextUtils.isEmpty(viewBinding.searchEt.getText().toString().trim())){ + viewBinding.recyclerviewSelectT.setVisibility(View.GONE); + viewBinding.refreshLayout.setVisibility(View.VISIBLE); + }else{ + viewBinding.recyclerviewSelectT.setVisibility(View.VISIBLE); + viewBinding.refreshLayout.setVisibility(View.GONE); + selects.clear(); + for (int i = 0;i0){ + viewBinding. recyclerviewSelect.setVisibility(View.VISIBLE); + viewBinding.noDateSly.setVisibility(View.GONE); + }else{ + viewBinding.recyclerviewSelect.setVisibility(View.GONE); + viewBinding.noDateSly.setVisibility(View.VISIBLE); + } + } + } + + private void initList() { +// int loc = PreferencesToolkits.getNew(MyApplication.getInstance2(),"locale",1); +// if(loc<2) { + GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 4); + viewBinding. recyclerviewt.setLayoutManager(gridLayoutManager); + commonAdapter1 = new CommonAdapter(this, R.layout.item_help_list_t, quesListBeans) { + @Override + public void convert(ViewHolder holder, QuesListBean s, int index) { + holder.setText(R.id.item_tv, s.getTitle()); + CircleImageView imageView = holder.getView(R.id.item_iv); + String urls = ApiService.URL + s.getPicture(); + Glide.with(Help1Activity.this) + .load(urls).placeholder(R.mipmap.ic_logo).error(R.mipmap.ic_logo) + .into(imageView); + holder.getView(R.id.item_ry).setOnClickListener(v -> { + Intent intent = new Intent(Help1Activity.this, HelpActivity.class); + intent.putExtra("bean", GsonUtils.beanToJSONString(s.getQuestions())); + intent.putExtra("title", s.getTitle()); + startActivity(intent); + }); + } + }; + viewBinding.recyclerviewt.setAdapter(commonAdapter1); +// }else{ +// LinearLayoutManager gridLayoutManager = new LinearLayoutManager(this); +// recyclerviewt.setLayoutManager(gridLayoutManager); +// commonAdapter1 = new CommonAdapter(this, R.layout.item_help_list_t1, quesListBeans) { +// @Override +// public void convert(ViewHolder holder, QuesListBean s, int index) { +// holder.setText(R.id.item_tv, s.getTitle()); +// ImageView imageView = holder.getView(R.id.item_iv); +// String urls = ApiService.URL1 + s.getPicture(); +// Glide.with(Help1Activity.this) +// .load(urls).placeholder(R.drawable.alarm_guanfang_cir).error(R.drawable.alarm_guanfang_cir) +// .into(imageView); +// holder.getView(R.id.item_ry).setOnClickListener(v -> { +// Intent intent = new Intent(Help1Activity.this, HelpActivity.class); +// intent.putExtra("bean", GsonUtils.beanToJSONString(s.getQuestions())); +// intent.putExtra("title", s.getTitle()); +// startActivity(intent); +// }); +// } +// }; +// recyclerviewt.setAdapter(commonAdapter1); +// } + + LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); + viewBinding.recyclerview.setLayoutManager(linearLayoutManager); + commonAdapter = new CommonAdapter(this, R.layout.item_help_list, tuijians) { + @Override + public void convert(ViewHolder holder, QuesBean s, int index) { + holder.setText(R.id.item_title_tv,s.getTitle()); + holder.getView(R.id.item_ry).setOnClickListener(v -> { + viewBinding.refreshLayout.setVisibility(View.GONE); + viewBinding.nodateLy.setVisibility(View.VISIBLE); + viewBinding.searchLy.setVisibility(View.GONE); + changeDate(s); + }); + } + }; + viewBinding.recyclerview.setAdapter(commonAdapter); + + LinearLayoutManager linearLayoutManager1 = new LinearLayoutManager(this); + viewBinding.recyclerviewSelect.setLayoutManager(linearLayoutManager1); + commonAdapter2 = new CommonAdapter(this, R.layout.item_help_list, selects) { + @Override + public void convert(ViewHolder holder, QuesBean s, int index) { + holder.setText(R.id.item_title_tv,s.getTitle()); + holder.getView(R.id.item_ry).setOnClickListener(v -> { + viewBinding.recyclerviewSelectT.setVisibility(View.GONE); + viewBinding.nodateLy.setVisibility(View.VISIBLE); + viewBinding.searchLy.setVisibility(View.GONE); + changeDate(s); + }); + } + }; + viewBinding.recyclerviewSelect.setAdapter(commonAdapter2); + } + + private void changeDate(QuesBean s) { + viewBinding. nodateTv.setText(s.getTitle()+""); + viewBinding.nodateTv1.setText(s.getAnswer()+""); + viewTime(s.getQuestionId()); + } + + private void viewTime(Integer questionId) { + Api.getInstance().viewTime(questionId+"") + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver() { + @Override + public void onSuccess(Result feedbackResp) { + + } + + @Override + public void onError(int code, String msg) { + + } + }); + } + + @Override + public void onBackPressed() { + if(viewBinding.nodateLy.getVisibility() == View.VISIBLE){ + if(TextUtils.isEmpty(viewBinding.searchEt.getText().toString().trim())) { + viewBinding.refreshLayout.setVisibility(View.VISIBLE); + viewBinding.recyclerviewSelectT.setVisibility(View.GONE); + viewBinding.searchLy.setVisibility(View.VISIBLE); + viewBinding.nodateLy.setVisibility(View.GONE); + }else{ + viewBinding.refreshLayout.setVisibility(View.GONE); + viewBinding.recyclerviewSelectT.setVisibility(View.VISIBLE); + viewBinding.searchLy.setVisibility(View.VISIBLE); + viewBinding.nodateLy.setVisibility(View.GONE); + } + }else{ + if(!TextUtils.isEmpty(viewBinding.searchEt.getText().toString().trim())){ + viewBinding.searchEt.setText(""); + }else{ + super.onBackPressed(); + + } + } + } + + private void initRefreshLayout() { + viewBinding.refreshLayout.setEnableLoadMore(false); + viewBinding.refreshLayout.setOnRefreshListener(refreshlayout -> { + viewBinding.refreshLayout.setVisibility(View.VISIBLE); + viewBinding.nodateLy.setVisibility(View.GONE); + viewBinding.refreshLayout.setEnableLoadMore(true); + toKefu(); + }); + + } + + public void toKefu1() { + Api.getInstance().helpCenterStaffServiceId(IMUIKitConfig.SUBSTATIONID,1) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + toRengongCallTop(feedbackResp.data.getStaffServiceId(),feedbackResp.data.getStaffServiceNickname()); + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast( msg); +// toRengongCall(400227); + + } + }); + } + + + public void toRengongCallTop(Integer staffServiceId,String name) { +// Intent i = IntentFactory.createTempChatIntent(Help1Activity.this, staffServiceId+"", name); +// i.putExtra(AbstractChattingActivity.INTENT_KEY_HIGHLIGHT_ONECE_MSG$FINGERPRINT, ""); +// startActivity(i); + } + + public void toKefu() { + Api.getInstance().questions() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>>() { + @Override + public void onSuccess(Result> feedbackResp) { + quesListBeans = feedbackResp.data; + quesBeans.clear(); + tuijians.clear(); + if(feedbackResp!=null&&feedbackResp.data.size()!=0){ + for (int i = 0;i0){ + quesBeans.addAll(feedbackResp.data.get(i).getQuestions()); + } + } + } + + for (int i =0;i quesBeans = new ArrayList<>(); + private ActivityGelpBinding viewBinding; + + CommonAdapter commonAdapter; + boolean isFirst = true; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + getWindow().setStatusBarColor(getResources().getColor(R.color.color_fcfcfc)); + getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white)); + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR|View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR); + + super.onCreate(savedInstanceState); + viewBinding = ActivityGelpBinding.inflate(getLayoutInflater()); + setContentView(viewBinding.getRoot()); + initView(); + } + + protected void initView() { + + quesBeans = GsonUtils.getListFromJSON(getIntent().getStringExtra("bean"), QuesBean.class); + initList(); + if (quesBeans != null && quesBeans.size() > 0) { + viewBinding.recyclerview.setVisibility(View.VISIBLE); + viewBinding.nodateLy1.setVisibility(View.GONE); + } else { + viewBinding.recyclerview.setVisibility(View.GONE); + viewBinding.nodateLy1.setVisibility(View.VISIBLE); + } + +// if(quesBeans!=null){ +// setTitle(getIntent().getStringExtra("title")); +// } + viewBinding.settingTitleBar.getTitleTextView().setText(getIntent().getStringExtra("title")); + viewBinding.settingTitleBar.setOnBackIconClickListener(v -> onBackPressed()); + + } + + private void initList() { + LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); + viewBinding.recyclerview.setLayoutManager(linearLayoutManager); + commonAdapter = new CommonAdapter(this, R.layout.item_help_list, quesBeans) { + @Override + public void convert(ViewHolder holder, QuesBean s, int index) { + holder.setText(R.id.item_title_tv, s.getTitle()); + holder.getView(R.id.item_ry).setOnClickListener(v -> { + viewBinding.recyclerview.setVisibility(View.GONE); + viewBinding.nodateLy.setVisibility(View.VISIBLE); + isFirst = false; + changeDate(s); + }); + } + }; + viewBinding.recyclerview.setAdapter(commonAdapter); + } + + private void changeDate(QuesBean s) { + viewBinding.nodateTv.setText(s.getTitle() + ""); + viewBinding.nodateTv1.setText(s.getAnswer() + ""); + viewTime(s.getQuestionId()); + } + + private void viewTime(Integer questionId) { + Api.getInstance().viewTime(questionId + "") + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver() { + @Override + public void onSuccess(Result feedbackResp) { + + } + + @Override + public void onError(int code, String msg) { + + } + }); + } + + @Override + public void onBackPressed() { + if (viewBinding.nodateLy.getVisibility() == View.VISIBLE) { + viewBinding.recyclerview.setVisibility(View.VISIBLE); + viewBinding.nodateLy.setVisibility(View.GONE); + + } else { + super.onBackPressed(); + } + } + + public boolean onTouchEvent(MotionEvent event) { + if(null != this.getCurrentFocus()){ + /** + * 点击空白位置 隐藏软键盘 + */ + InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + return mInputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0); + } + return super .onTouchEvent(event); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/main/mine/MineFragment.java b/app/src/main/java/com/dskj/rbchat/main/mine/MineFragment.java new file mode 100644 index 0000000..25ce2f3 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/mine/MineFragment.java @@ -0,0 +1,555 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.main.mine; + +import android.app.Activity; +import android.content.Intent; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.provider.MediaStore; +import android.text.TextUtils; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Toast; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContract; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; +import androidx.core.app.ActivityOptionsCompat; + +import com.dskj.rbchat.AppSkinConfig; +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.about.AboutActivity; +import com.dskj.rbchat.databinding.FragmentMineBinding; +import com.dskj.rbchat.databinding.FragmentMineNewBinding; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.game.JsBridgeActivity; +import com.dskj.rbchat.login.PhoneLoginActivity; +import com.dskj.rbchat.main.MainActivity; +import com.dskj.rbchat.main.mine.photo.UserPhotoListActivity; +import com.dskj.rbchat.main.mine.setting.SettingActivity; +import com.dskj.rbchat.main.mine.setting.SettingNotifyActivity; +import com.dskj.rbchat.model.BindBean; +import com.dskj.rbchat.model.VersionBean; +import com.dskj.rbchat.model.WalletBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.pay.CollectionAndPaymentActivity; +import com.dskj.rbchat.utils.AdaptScreenUtils; +import com.dskj.rbchat.utils.AppUtils; +import com.dskj.rbchat.utils.Constant; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.wallet.GiftInfoActivity; +import com.dskj.rbchat.wallet.PaySettingActivity; +import com.dskj.rbchat.wallet.WalletInfoActivity; +import com.dskj.rbchat.welcome.WelcomeActivity; +//import com.king.app.updater.AppUpdater; +import com.netease.yunxin.kit.alog.ALog; +import com.netease.yunxin.kit.chatkit.ui.common.ChatDataUtils; +import com.netease.yunxin.kit.chatkit.ui.data.ChatDatabase; +import com.netease.yunxin.kit.common.ui.activities.BrowseActivity; +import com.netease.yunxin.kit.common.ui.fragments.BaseFragment; +import com.netease.yunxin.kit.common.ui.utils.AvatarColor; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.common.utils.SizeUtils; +import com.netease.yunxin.kit.corekit.event.EventCenter; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.model.UserInfo; +import com.netease.yunxin.kit.corekit.im.provider.FetchCallback; +import com.netease.yunxin.kit.corekit.im.repo.CommonRepo; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.dskj.rbchat.dialog.SelectLanguageDialog; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class MineFragment extends BaseFragment { + private FragmentMineNewBinding binding; + private ActivityResultLauncher launcher; + BindBean bindBean; + WalletBean walletBean; + + @Nullable + @Override + public View onCreateView( + @NonNull LayoutInflater inflater, + @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + ALog.d(Constant.PROJECT_TAG, "MineFragment:onCreateView"); + binding = FragmentMineNewBinding.inflate(inflater); + return binding.getRoot(); + } + + @RequiresApi(api = Build.VERSION_CODES.M) + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + ALog.d(Constant.PROJECT_TAG, "MineFragment:onViewCreated"); + + launcher = + registerForActivityResult( + new ActivityResultContracts.StartActivityForResult(), + result -> { + if (result.getResultCode() == Activity.RESULT_OK) { + refreshUserInfo(IMKitClient.account()); +// + Intent intent = result.getData(); + for (int i = 0; i < intent.getClipData().getItemCount(); i++) { + Uri uri = intent.getClipData().getItemAt(i).getUri(); + Log.d("选择图片", "multiple current Uri:" + uri); + // Do stuff with each photo/video URI. + } + + + } + }); + + binding.paySettingTv.setOnClickListener(v -> { + if (bindBean != null) { + if (!bindBean.getPhoneBind()) { + showDialog(); + } else { + startActivity(new Intent(getActivity(), PaySettingActivity.class)); + } + } + }); + binding.myphotoTv.setOnClickListener(view1 -> { + startActivity(new Intent(getActivity(), UserPhotoListActivity.class).putExtra("userId", IMKitClient.account())); + }); + + binding.jinbiTv.setOnClickListener(v -> { + toWalletInfo(true); + + }); + binding.jinbiTv1.setOnClickListener(v -> { + toWalletInfo(true); + + }); + binding.yinbiTv.setOnClickListener(v -> { + toWalletInfo(false); + + }); + binding.yinbiTv1.setOnClickListener(v -> { + toWalletInfo(false); + + }); + binding.tongbiTv.setOnClickListener(v -> { + toTongBi(); + + }); + binding.tongbiTv1.setOnClickListener(v -> { + toTongBi(); + + }); + + binding.tvName.setOnClickListener( + v -> { + UserInfoActivity.launch( + getContext(), + new ActivityResultLauncher() { + @Override + public void launch(Intent input, @Nullable ActivityOptionsCompat options) { + startActivity(input); + } + + @Override + public void unregister() { + } + + @NonNull + @Override + public ActivityResultContract getContract() { + return null; + } + }); + }); +// binding.tvAccount.setText(getString(R.string.tab_mine_account, IMKitClient.account())); + + binding.newMessageTv.setOnClickListener(v -> startActivity(new Intent(getActivity(), SettingNotifyActivity.class))); + + binding.helpTv.setOnClickListener(v -> startActivity(new Intent(getActivity(), Help1Activity.class))); + + binding.safeTv.setOnClickListener(v -> startActivity(new Intent(getActivity(), AccountAndSecurityActivity.class))); + + binding.yuyanLl.setOnClickListener(v -> { + selectLanguage(); + }); + + binding.yuyanTv.setOnClickListener(v -> { + selectLanguage(); + }); + binding.privateTv.setOnClickListener(v -> BrowseActivity.Companion.launch( + getActivity(), getString(R.string.yinsizhengche_txt), IMUIKitConfig.RBCHAT_PRIVACY_CN_URL)); + + try { + binding.versionDescTv.setText("v" + DataUtils.getVersionName(getActivity())); + } catch (Exception e) { + throw new RuntimeException(e); + } +// binding.cavIcon.setOnClickListener(v -> startActivity(new Intent(getActivity(), CollectionAndPaymentActivity.class))); + + binding.tvLogout.setOnClickListener(v -> { + ActionConfirmDialog actionConfirmDialog = new ActionConfirmDialog(getActivity(), getString(R.string.tcdl_tips_txt), true); + actionConfirmDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + IMKitClient.logoutIM( + + new com.netease.yunxin.kit.corekit.im.login.LoginCallback() { + @Override + public void onError(int errorCode, @NonNull String errorMsg) { + Toast.makeText( + getActivity(), + "error code is " + errorCode + ", message is " + errorMsg, + Toast.LENGTH_SHORT) + .show(); + } + + @Override + public void onSuccess(@Nullable Void data) { + if (getActivity().getApplicationContext() instanceof IMApplication) { + ((IMApplication) getActivity().getApplicationContext()) + .clearActivity(getActivity()); + } + DataUtils.set(getActivity(), IMUIKitConfig.LOGIN_ACCOUNT, ""); + DataUtils.set(getActivity(), IMUIKitConfig.LOGIN_TOKEN, ""); + ChatDatabase.chatDatabase = null; + startActivity(new Intent(getActivity(), WelcomeActivity.class)); + getActivity().finish(); + } + }); + } + + @Override + public void toCancel() { + + } + }); + actionConfirmDialog.show(); + }); + + binding.friendTv.setOnClickListener(v -> startActivity(new Intent(getActivity(), FriendPermissionsActivity.class))); + + binding.toMerchantTv.setOnClickListener(v -> { + Intent intent = new Intent(getActivity(), JsBridgeActivity.class); + intent.putExtra("url", IMUIKitConfig.MERCHANT_URL); + intent.putExtra("isGame", true); + startActivity(intent); + }); +// binding.versionTv.setOnClickListener((View.OnClickListener) v -> getVersion()); + + + } + + private void toWalletInfo(boolean b) { + if (bindBean != null) { + if (!bindBean.getPhoneBind()) { + showDialog(); + } else { + Intent intent = new Intent(getActivity(), WalletInfoActivity.class); + intent.putExtra("isG", b); + startActivity(intent); + } + } + } + + private void toTongBi() { + if (bindBean != null) { + if (!bindBean.getPhoneBind()) { + showDialog(); + } else { + Intent intent = new Intent(getActivity(), GiftInfoActivity.class); + startActivity(intent); + } + } + } + + private void showDialog() { + + ActionConfirmDialog actionDialog = new ActionConfirmDialog(getActivity(), + getString(R.string.bind_phone_des_txt), getString(R.string.nobind_txt), getString(R.string.tobind_txt)); + actionDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + Intent intent = new Intent(getActivity(), ChangeAccoutActionActivity.class); + intent.putExtra("type", ChangeAccoutActionActivity.TYPE_BIND_PHONE); + startActivity(intent); + } + + @Override + public void toCancel() { + + } + }); + actionDialog.show(); + } + + private void selectLanguage() { + SelectLanguageDialog selectLanguageDialog = new SelectLanguageDialog(getActivity()); + selectLanguageDialog.setOnToVipListener(type -> { + changeLoc(type); + chagneSysLanguage(type); + IMApplication.getInstance().initFooter(); + }); + selectLanguageDialog.show(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + AdaptScreenUtils.setWhiteNavigationBar(selectLanguageDialog); + } + } + + VersionBean versionBean; + + private void getVersion() { + try { + Api.getInstance().version(0, DataUtils.getVersionCode(getActivity()), IMUIKitConfig.SUBSTATIONID) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result> feedbackResp) { + if (feedbackResp.data != null && feedbackResp.data.size() > 0) { + versionBean = feedbackResp.data.get(0); + try { + if (versionBean.getVersionNumber() > DataUtils.getVersionCode(getActivity())) { + + ActionConfirmDialog actionDialog = new ActionConfirmDialog(getActivity(), + getDownloadText(versionBean), getString(R.string.xiacigengxin_txt), + getString(R.string.login_form_have_latest_version_update_now)); + actionDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + checkUpdate(versionBean.getDownloadAddress()); + } + + @Override + public void toCancel() { + + } + }); + actionDialog.show(); + } else { + ToastX.showShortToast(getString(R.string.dqyszxbb_txt)); + } + } catch (Exception e) { + e.printStackTrace(); + } + } else { + ToastX.showShortToast(getString(R.string.dqyszxbb_txt)); + + } + + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + ToastX.showShortToast(msg); + + } + }); + } catch (Exception e) { + e.printStackTrace(); + } + } + + private void checkUpdate(String url) { + +// new AppUpdater(getActivity(), url).start(); + + + } + + + private String getDownloadText(VersionBean versionBean) { + String name = ""; + int loc = DataUtils.get(getActivity(), "locale", 1); + switch (loc) { + case 1: + name = versionBean.getUpgradeHintZhCn(); + break; + case 2: + name = versionBean.getUpgradeHintEnUs(); + break; + case 3: + name = versionBean.getUpgradeHintJaJp(); + break; + default: + name = versionBean.getUpgradeHintZhTw(); + break; + + } + return name; + } + + private void chagneSysLanguage(int loc) { + Map maps = new HashMap<>(); + String lauguage = DataUtils.getLauguage(getActivity(), loc); + maps.put("language", lauguage); + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + Api.getInstance().authUser(IMKitClient.account(), maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(); + EventCenter.notifyEvent(new MainActivity.SkinEvent()); + } + + + private void refreshUserInfo(String account) { + if (AppSkinConfig.getInstance().getAppSkinStyle() == AppSkinConfig.AppSkin.commonSkin) { + int cornerRadius = SizeUtils.dp2px(4); + binding.cavIcon.setCornerRadius(cornerRadius); + } + List userInfoList = new ArrayList<>(); + userInfoList.add(account); + CommonRepo.getUserInfo( + account, + new FetchCallback() { + @Override + public void onSuccess(@Nullable UserInfo param) { + if (param != null) { + updateUI(param); + } + } + + @Override + public void onFailed(int code) { + ToastX.showShortToast(R.string.user_fail); + updateUI(new UserInfo(account, account, "")); + } + + @Override + public void onException(@Nullable Throwable exception) { + ToastX.showShortToast(R.string.user_fail); + updateUI(new UserInfo(account, account, "")); + } + }); + } + + private void updateUI(UserInfo userInfo) { + String name = + TextUtils.isEmpty(userInfo.getName()) ? userInfo.getAccount() : userInfo.getName(); + LogUtils.i("头像:" + userInfo.getAvatar()); + String avatarUrl = userInfo.getAvatar(); + if (TextUtils.isEmpty(avatarUrl)) { + binding.cavIcon.setData(R.mipmap.default_head_img + , name, 0); + } else { + binding.cavIcon.setData(avatarUrl + , name, AvatarColor.avatarColor(IMKitClient.account())); + } + + binding.tvName.setText(name); + } + + @Override + public void onResume() { + super.onResume(); + ALog.d(Constant.PROJECT_TAG, "MineFragment:onResume"); + if (DataUtils.getIsMerchant()) { + binding.layoutActionLy.setVisibility(View.VISIBLE); + } else { + binding.layoutActionLy.setVisibility(View.GONE); + } + String account = IMKitClient.account(); + if (TextUtils.isEmpty(account)) { + return; + } + refreshUserInfo(account); + + changeLoc(DataUtils.get(getActivity(), "locale", 3)); + if (bindBean == null || (!bindBean.getPhoneBind()) || (!bindBean.getPayPasswordSet())) { + bindInfo(); + } + getWallet(); + + + } + + private void getWallet() { + Api.getInstance().walletInfo(IMKitClient.account()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { + try { + walletBean = feedbackResp.data; + changeInfo(); + MainActivity mainActivity = (MainActivity) getActivity(); + mainActivity.changeWallet(walletBean); + } catch (Exception e) { + + } + } + + @Override + public void onError(int code, String msg) { + } + }); + + + } + + private void changeInfo() { + if (walletBean != null) { + binding.jinbiTv.setText(AppUtils.getQian(walletBean.getGoldCoin())); + binding.yinbiTv.setText(AppUtils.getQian(walletBean.getSilverCoin())); + binding.tongbiTv.setText(AppUtils.getQian(walletBean.getGiftCoin() * 100)); + } + } + + private void changeLoc(int type) { + switch (type) { + case 0: + binding.yuyanDescTv.setText(getString(R.string.ftzw_txt)); + break; + case 1: + binding.yuyanDescTv.setText(getString(R.string.jtzw_txt)); + break; + case 2: + binding.yuyanDescTv.setText(getString(R.string.yinyu_txt)); + break; + case 3: + binding.yuyanDescTv.setText(getString(R.string.riyu_txt)); + break; + } + } + + private void bindInfo() { + Api.getInstance().bindInfo(IMKitClient.account()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + bindBean = feedbackResp.data; + LogUtils.i("获取到的数据:" + GsonUtils.beanToJSONString(bindBean)); + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + } + }); + + } +} diff --git a/app/src/main/java/com/dskj/rbchat/main/mine/MineFragmentBf.java b/app/src/main/java/com/dskj/rbchat/main/mine/MineFragmentBf.java new file mode 100644 index 0000000..aaef18a --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/mine/MineFragmentBf.java @@ -0,0 +1,180 @@ +//// Copyright (c) 2022 NetEase, Inc. All rights reserved. +//// Use of this source code is governed by a MIT license that can be +//// found in the LICENSE file. +// +//package com.dskj.rbchat.main.mine; +// +//import android.app.Activity; +//import android.content.Intent; +//import android.net.Uri; +//import android.os.Bundle; +//import android.text.TextUtils; +//import android.util.Log; +//import android.view.LayoutInflater; +//import android.view.View; +//import android.view.ViewGroup; +// +//import androidx.activity.result.ActivityResultLauncher; +//import androidx.activity.result.contract.ActivityResultContract; +//import androidx.activity.result.contract.ActivityResultContracts; +//import androidx.annotation.NonNull; +//import androidx.annotation.Nullable; +//import androidx.core.app.ActivityOptionsCompat; +// +//import com.dskj.rbchat.AppSkinConfig; +//import com.dskj.rbchat.R; +//import com.dskj.rbchat.about.AboutActivity; +//import com.dskj.rbchat.databinding.FragmentMineBinding; +//import com.dskj.rbchat.main.mine.setting.SettingActivity; +//import com.dskj.rbchat.utils.Constant; +//import com.dskj.rbchat.utils.LogUtils; +//import com.netease.yunxin.kit.alog.ALog; +//import com.netease.yunxin.kit.common.ui.fragments.BaseFragment; +//import com.netease.yunxin.kit.common.ui.utils.AvatarColor; +//import com.netease.yunxin.kit.common.ui.utils.ToastX; +//import com.netease.yunxin.kit.common.utils.SizeUtils; +//import com.netease.yunxin.kit.corekit.im.IMKitClient; +//import com.netease.yunxin.kit.corekit.im.model.UserInfo; +//import com.netease.yunxin.kit.corekit.im.provider.FetchCallback; +//import com.netease.yunxin.kit.corekit.im.repo.CommonRepo; +// +//import java.util.ArrayList; +//import java.util.List; +// +//@Deprecated +//public class MineFragmentBf extends BaseFragment { +// private FragmentMineBinding binding; +// private ActivityResultLauncher launcher; +// +// @Nullable +// @Override +// public View onCreateView( +// @NonNull LayoutInflater inflater, +// @Nullable ViewGroup container, +// @Nullable Bundle savedInstanceState) { +// ALog.d(Constant.PROJECT_TAG, "MineFragment:onCreateView"); +// binding = FragmentMineBinding.inflate(inflater); +// return binding.getRoot(); +// } +// +// @Override +// public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { +// super.onViewCreated(view, savedInstanceState); +// ALog.d(Constant.PROJECT_TAG, "MineFragment:onViewCreated"); +// +// launcher = +// registerForActivityResult( +// new ActivityResultContracts.StartActivityForResult(), +// result -> { +// if (result.getResultCode() == Activity.RESULT_OK) { +// refreshUserInfo(IMKitClient.account()); +//// +// Intent intent = result.getData(); +// for (int i = 0; i < intent.getClipData().getItemCount(); i++) { +// Uri uri = intent.getClipData().getItemAt(i).getUri(); +// Log.d("选择图片", "multiple current Uri:" + uri); +// // Do stuff with each photo/video URI. +// } +// +// +// } +// }); +// +// binding.aboutLl.setOnClickListener( +// v -> { +// //图片选择器多选 +//// if (Build.VERSION.SDK_INT >= 33) { +//// +//// final int maxNumPhotosAndVideos = 9; +//// Intent intent = new Intent(MediaStore.ACTION_PICK_IMAGES); +////// intent.setType("video/*");//仅选择视频 +//// intent.setType("image/*");//仅选择图片 +//// intent.putExtra(MediaStore.EXTRA_PICK_IMAGES_MAX, maxNumPhotosAndVideos); +//// launcher.launch(intent); +//// }else{ +// Intent intent = new Intent(getContext(), AboutActivity.class); +// startActivity(intent); +//// } +// +// +// }); +// +// binding.userInfoClick.setOnClickListener( +// v -> { +// MineInfoActivity.launch( +// getContext(), +// new ActivityResultLauncher() { +// @Override +// public void launch(Intent input, @Nullable ActivityOptionsCompat options) { +// startActivity(input); +// } +// +// @Override +// public void unregister() {} +// +// @NonNull +// @Override +// public ActivityResultContract getContract() { +// return null; +// } +// }); +// }); +// binding.collectLl.setOnClickListener(v -> ToastX.showShortToast(R.string.not_usable)); +// +// binding.settingLl.setOnClickListener( +// v -> startActivity(new Intent(getContext(), SettingActivity.class))); +// binding.tvAccount.setText(getString(R.string.tab_mine_account, IMKitClient.account())); +// } +// +// private void refreshUserInfo(String account) { +// if (AppSkinConfig.getInstance().getAppSkinStyle() == AppSkinConfig.AppSkin.commonSkin) { +// int cornerRadius = SizeUtils.dp2px(4); +// binding.cavIcon.setCornerRadius(cornerRadius); +// } +// List userInfoList = new ArrayList<>(); +// userInfoList.add(account); +// CommonRepo.getUserInfo( +// account, +// new FetchCallback() { +// @Override +// public void onSuccess(@Nullable UserInfo param) { +// if (param != null) { +// updateUI(param); +// } +// } +// +// @Override +// public void onFailed(int code) { +// ToastX.showShortToast(R.string.user_fail); +// updateUI(new UserInfo(account, account, "")); +// } +// +// @Override +// public void onException(@Nullable Throwable exception) { +// ToastX.showShortToast(R.string.user_fail); +// updateUI(new UserInfo(account, account, "")); +// } +// }); +// } +// +// private void updateUI(UserInfo userInfo) { +// String name = +// TextUtils.isEmpty(userInfo.getName()) ? userInfo.getAccount() : userInfo.getName(); +// LogUtils.i("头像:"+userInfo.getAvatar()); +// binding.cavIcon.setData( +// userInfo.getAvatar(), name, AvatarColor.avatarColor(IMKitClient.account())); +// binding.tvName.setText(name); +// } +// +// @Override +// public void onResume() { +// super.onResume(); +// ALog.d(Constant.PROJECT_TAG, "MineFragment:onResume"); +// +// String account = IMKitClient.account(); +// if (TextUtils.isEmpty(account)) { +// return; +// } +// refreshUserInfo(account); +// } +//} diff --git a/app/src/main/java/com/dskj/rbchat/main/mine/MineInfoActivity.java b/app/src/main/java/com/dskj/rbchat/main/mine/MineInfoActivity.java new file mode 100644 index 0000000..1da42f5 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/mine/MineInfoActivity.java @@ -0,0 +1,376 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.main.mine; + +import android.content.ClipData; +import android.content.ClipboardManager; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; +import android.widget.Toast; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; +import com.netease.nimlib.sdk.uinfo.constant.GenderEnum; +import com.dskj.rbchat.AppSkinConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.ActivityMineInfoBinding; +import com.dskj.rbchat.utils.Constant; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.photo.BasePhotoChoiceDialog; +import com.netease.yunxin.kit.common.ui.photo.PhotoChoiceDialog; +import com.netease.yunxin.kit.common.ui.utils.AvatarColor; +import com.netease.yunxin.kit.common.ui.utils.CommonCallback; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.common.ui.widgets.datepicker.CustomDatePicker; +import com.netease.yunxin.kit.common.ui.widgets.datepicker.DateFormatUtils; +import com.netease.yunxin.kit.common.utils.NetworkUtils; +import com.netease.yunxin.kit.common.utils.SizeUtils; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.model.UserField; +import com.netease.yunxin.kit.corekit.im.model.UserInfo; +import com.netease.yunxin.kit.corekit.im.provider.FetchCallback; +import com.netease.yunxin.kit.corekit.im.repo.CommonRepo; +import com.netease.yunxin.kit.teamkit.ui.fun.dialog.FunPhotoChoiceDialog; +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +public class MineInfoActivity extends BaseActivity { + private ActivityMineInfoBinding binding; + private ActivityResultLauncher launcher; + private UserInfo userInfo; + private int resultCode = RESULT_CANCELED; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = ActivityMineInfoBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + Window window = getWindow(); + window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + window.setStatusBarColor(ContextCompat.getColor(this, R.color.color_e9eff5)); + + launcher = + registerForActivityResult( + new ActivityResultContracts.StartActivityForResult(), + result -> { + if (result.getData() != null + && TextUtils.equals( + result.getData().getStringExtra(Constant.EDIT_TYPE), Constant.EDIT_SEXUAL)) { + int select = result.getData().getIntExtra(Constant.SELECTED_INDEX, -1); + if (select >= 0) { + updateUserInfo(UserField.Gender, select + 1); + } + + } else if (result.getResultCode() == RESULT_OK) { + loadData(IMKitClient.account()); + } + if (resultCode == RESULT_OK) { + return; + } + resultCode = result.getResultCode(); + }); + + initView(); + loadData(IMKitClient.account()); + } + + private void initView() { + binding.cavAvatar.setOnClickListener(v -> choicePhoto()); + binding.flName.setOnClickListener( + v -> EditUserInfoActivity.launch(getApplicationContext(), Constant.EDIT_NAME, launcher)); + binding.flEmail.setOnClickListener( + v -> EditUserInfoActivity.launch(getApplicationContext(), Constant.EDIT_EMAIL, launcher)); + binding.flPhone.setOnClickListener( + v -> EditUserInfoActivity.launch(getApplicationContext(), Constant.EDIT_PHONE, launcher)); + binding.flSign.setOnClickListener( + v -> EditUserInfoActivity.launch(getApplicationContext(), Constant.EDIT_SIGN, launcher)); + binding.ivBack.setOnClickListener(v -> finish()); + binding.flBirthday.setOnClickListener(v -> showTimerPicker(userInfo.getBirthday())); + + binding.ivAccountCopy.setOnClickListener(v -> copyAccount()); + binding.tvAccount.setOnClickListener(v -> copyAccount()); + + binding.flSexual.setOnClickListener( + v -> { + ArrayList content = new ArrayList<>(); + content.add(getResources().getString(R.string.sexual_male)); + content.add(getResources().getString(R.string.sexual_female)); + int selectIndex = -1; + if (userInfo.getGenderEnum() == GenderEnum.MALE) { + selectIndex = 0; + } else if (userInfo.getGenderEnum() == GenderEnum.FEMALE) { + selectIndex = 1; + } + TypeSelectActivity.launch( + MineInfoActivity.this, + getResources().getString(R.string.user_info_sexual), + content, + selectIndex, + launcher); + }); + if (AppSkinConfig.getInstance().getAppSkinStyle() == AppSkinConfig.AppSkin.commonSkin) { + setCommonSkin(); + } + } + + private void setCommonSkin() { + int cornerRadius = SizeUtils.dp2px(4); + binding.cavAvatar.setCornerRadius(cornerRadius); + + changeStatusBarColor(R.color.fun_page_bg_color); + + binding.clRoot.setBackgroundResource(R.color.fun_page_bg_color); + + binding.llUserInfo.setBackgroundResource(R.color.color_white); + ViewGroup.MarginLayoutParams layoutParamsN = + (ViewGroup.MarginLayoutParams) binding.llUserInfo.getLayoutParams(); + layoutParamsN.setMargins(0, SizeUtils.dp2px(4), 0, 0); + binding.llUserInfo.setLayoutParams(layoutParamsN); + + binding.flSign.setBackgroundResource(R.color.color_white); + ViewGroup.MarginLayoutParams layoutParamsS = + (ViewGroup.MarginLayoutParams) binding.flSign.getLayoutParams(); + layoutParamsS.setMargins(0, SizeUtils.dp2px(6), 0, 0); + binding.flSign.setLayoutParams(layoutParamsS); + } + + private void loadData(String account) { + CommonRepo.getUserInfo( + account, + new FetchCallback() { + @Override + public void onSuccess(@Nullable UserInfo param) { + refreshUserInfo(param); + } + + @Override + public void onFailed(int code) { + ToastX.showShortToast(R.string.user_fail); + refreshUserInfo(new UserInfo(account, account, "")); + } + + @Override + public void onException(@Nullable Throwable exception) { + ToastX.showShortToast(R.string.user_fail); + refreshUserInfo(new UserInfo(account, account, "")); + } + }); + } + + private void copyAccount() { + ClipboardManager cmb = + (ClipboardManager) + IMKitClient.getApplicationContext().getSystemService(Context.CLIPBOARD_SERVICE); + ClipData clipData = null; + if (userInfo != null) { + clipData = ClipData.newPlainText(null, userInfo.getAccount()); + } + cmb.setPrimaryClip(clipData); + ToastX.showShortToast(R.string.action_copy_success); + } + + private void choicePhoto() { + BasePhotoChoiceDialog choiceDialog; + if (AppSkinConfig.getInstance().getAppSkinStyle() == AppSkinConfig.AppSkin.commonSkin) { + choiceDialog = new FunPhotoChoiceDialog(this); + } else { + choiceDialog = new PhotoChoiceDialog(this); + } + choiceDialog.show( + new CommonCallback() { + @Override + public void onSuccess(@Nullable File param) { + if (NetworkUtils.isConnected()) { + CommonRepo.uploadImage( + param, + new FetchCallback() { + @Override + public void onSuccess(@Nullable String urlParam) { + Map map = new HashMap<>(1); + map.put(UserField.Avatar, urlParam); + CommonRepo.updateUserInfo( + map, + new FetchCallback() { + @Override + public void onSuccess(@Nullable Void param) { + resultCode = RESULT_OK; + loadData(IMKitClient.account()); + } + + @Override + public void onFailed(int code) { + Toast.makeText( + getApplicationContext(), + getString(R.string.request_fail), + Toast.LENGTH_SHORT) + .show(); + } + + @Override + public void onException(@Nullable Throwable exception) { + Toast.makeText( + getApplicationContext(), + getString(R.string.request_fail), + Toast.LENGTH_SHORT) + .show(); + } + }); + } + + @Override + public void onFailed(int code) { + Toast.makeText( + getApplicationContext(), + getString(R.string.request_fail), + Toast.LENGTH_SHORT) + .show(); + } + + @Override + public void onException(@Nullable Throwable exception) { + Toast.makeText( + getApplicationContext(), + getString(R.string.request_fail), + Toast.LENGTH_SHORT) + .show(); + } + }); + } else { + Toast.makeText( + getApplicationContext(), + getString(R.string.network_error), + Toast.LENGTH_SHORT) + .show(); + } + } + + @Override + public void onFailed(int code) { + Toast.makeText( + getApplicationContext(), getString(R.string.request_fail), Toast.LENGTH_SHORT) + .show(); + } + + @Override + public void onException(@Nullable Throwable exception) { + Toast.makeText( + getApplicationContext(), getString(R.string.request_fail), Toast.LENGTH_SHORT) + .show(); + } + }); + } + + private void refreshUserInfo(UserInfo userInfo) { + if (userInfo == null) { + return; + } + this.userInfo = userInfo; + binding.cavAvatar.setData( + userInfo.getAvatar(), + userInfo.getName() == null ? "" : userInfo.getName(), + AvatarColor.avatarColor(IMKitClient.account())); + binding.tvName.setText(userInfo.getName()); + int sexualValue = R.string.sexual_unknown; + if (userInfo.getGenderEnum() == GenderEnum.MALE) { + sexualValue = R.string.sexual_male; + } else if (userInfo.getGenderEnum() == GenderEnum.FEMALE) { + sexualValue = R.string.sexual_female; + } + binding.tvAccount.setText(userInfo.getAccount()); + binding.tvSexual.setText(sexualValue); + binding.tvBirthday.setText(userInfo.getBirthday()); + binding.tvPhone.setText(userInfo.getMobile()); + binding.tvEmail.setText(userInfo.getEmail()); + binding.tvSign.setText(userInfo.getSignature()); + } + + private void showTimerPicker(String date) { + String beginTime = "1900-01-01 00:00"; + String endTime = DateFormatUtils.long2Str(System.currentTimeMillis(), true); + + if (TextUtils.isEmpty(date)) { + date = endTime; + } + // 通过日期字符串初始化日期,格式请用:yyyy-MM-dd HH:mm + CustomDatePicker mTimerPicker = + new CustomDatePicker( + this, + new CustomDatePicker.Callback() { + @Override + public void onTimeSelected(long timestamp) { + updateUserInfo(UserField.Birthday, DateFormatUtils.long2Str(timestamp, false)); + } + }, + beginTime, + endTime); + // 允许点击屏幕或物理返回键关闭 + mTimerPicker.setCancelable(true); + // 显示时和分 + mTimerPicker.setCanShowPreciseTime(false); + // 允许循环滚动 + mTimerPicker.setScrollLoop(false); + // 允许滚动动画 + mTimerPicker.setCanShowAnim(false); + mTimerPicker.show(date); + } + + private void updateUserInfo(UserField field, Object value) { + Map map = new HashMap<>(1); + map.put(field, value); + CommonRepo.updateUserInfo( + map, + new FetchCallback() { + @Override + public void onSuccess(@Nullable Void param) { + resultCode = RESULT_OK; + // binding.tvBirthday.setText(birthday); + loadData(IMKitClient.account()); + } + + @Override + public void onFailed(int code) { + if (code == Constant.NETWORK_ERROR_CODE) { + Toast.makeText( + getApplicationContext(), + getString(R.string.network_error), + Toast.LENGTH_SHORT) + .show(); + } else { + Toast.makeText( + getApplicationContext(), getString(R.string.request_fail), Toast.LENGTH_SHORT) + .show(); + } + } + + @Override + public void onException(@Nullable Throwable exception) { + Toast.makeText( + getApplicationContext(), getString(R.string.request_fail), Toast.LENGTH_SHORT) + .show(); + } + }); + } + + @Override + public void finish() { + setResult(resultCode); + super.finish(); + } + + public static void launch(Context context, @NonNull ActivityResultLauncher launcher) { + Intent intent = new Intent(context, MineInfoActivity.class); + launcher.launch(intent); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/main/mine/SettingAccoutIdActivity.java b/app/src/main/java/com/dskj/rbchat/main/mine/SettingAccoutIdActivity.java new file mode 100644 index 0000000..d013674 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/mine/SettingAccoutIdActivity.java @@ -0,0 +1,258 @@ +package com.dskj.rbchat.main.mine; + +import android.content.res.ColorStateList; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.view.MotionEvent; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.view.inputmethod.InputMethodManager; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.annotation.RequiresApi; +import androidx.core.content.ContextCompat; + +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; + +import com.dskj.rbchat.databinding.ActivityHeadUserEditBinding; +import com.dskj.rbchat.databinding.ActivitySetAccoutIdBinding; +import com.dskj.rbchat.model.LoginBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; + +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.corekit.im.IMKitClient; + +import java.util.Calendar; +import java.util.HashMap; +import java.util.Map; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class SettingAccoutIdActivity extends BaseActivity { + + ActivitySetAccoutIdBinding binding; + + LoginBean loginBean; + + @RequiresApi(api = Build.VERSION_CODES.M) + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = ActivitySetAccoutIdBinding.inflate(getLayoutInflater()); + + setContentView(binding.getRoot()); + + Window window = getWindow(); + window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + window.setStatusBarColor(ContextCompat.getColor(this, R.color.color_white)); + window.setNavigationBarColor(getResources().getColor(R.color.color_white)); + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR|View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR); + + loginBean = DataUtils.getLocUserInfo(); + initView(); + initListeners(); + } + + protected void initView() { + loginBean = DataUtils.getLocUserInfo(); + if(loginBean!=null) { + showChange(loginBean); + getUserInfo(loginBean); + } + + } + + private void changeButton() { + if(binding.editText.getText().toString().trim().length()>4){ + binding.sumbitBt.setBackgroundTintList(null); + binding.sumbitBt.setEnabled(true); + }else{ + binding.sumbitBt.setBackgroundTintList(ColorStateList.valueOf(getColor(R.color.color_themeblue_alpha70))); + binding.sumbitBt.setEnabled(false); + } + } + + private void getUserInfo(LoginBean loginBean) { + + Api.getInstance().userInfo(loginBean.getUser_uid()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + + LoginBean loginBean = DataUtils.getLocUserInfo(); + + if (loginBean != null) { + //只有这是个参数允许切换 + + loginBean.setNwId(feedbackResp.data.getNwId()); + loginBean.setNwIdSetTime(feedbackResp.data.getNwIdSetTime()); + loginBean.getUser().setNwId(feedbackResp.data.getNwId()); + loginBean.getUser().setNwIdSetTime(feedbackResp.data.getNwIdSetTime()); + DataUtils.set(SettingAccoutIdActivity.this, "login_bean", GsonUtils.beanToJSONString(loginBean)); + + showChange(loginBean); + + } + + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); +// WidgetUtils.showToast(getActivity(), msg, WidgetUtils.ToastType.ERROR); + } + }); + + + } + + + private void showChange(LoginBean loginBean) { + if(TextUtils.isEmpty(loginBean.getNwId())){ + binding.step1Ly.setVisibility(View.VISIBLE); + binding. step2Ly.setVisibility(View.GONE); + LogUtils.i("00000000000000000"); + + }else{ + if(!TextUtils.isEmpty(loginBean.getNwIdSetTime())) { + long time = DataUtils.dateToStamp(loginBean.getNwIdSetTime()); + LogUtils.i("111111111111111:"+System.currentTimeMillis()+";;"+time+";;"+(long)(30*24*60*60*1000l)); + if (System.currentTimeMillis()-time>(long)(30*24*60*60*1000l)){ + binding. step1Ly.setVisibility(View.VISIBLE); + binding.step2Ly.setVisibility(View.GONE); + LogUtils.i("222222222222222"); + + }else{ + LogUtils.i("3333333333333333333"); + + binding.step1Ly.setVisibility(View.GONE); + binding.step2Ly.setVisibility(View.VISIBLE); + Calendar calendar = Calendar.getInstance(); + calendar.setTimeInMillis(time+(long)(30*24*60*60*1000l)); + int year = calendar.get(Calendar.YEAR); + int month = calendar.get(Calendar.MONTH) + 1; // 月份从0开始,所以要加1 + int day = calendar.get(Calendar.DAY_OF_MONTH); +// if(month==12){ +// year+=1; +// month = 1; +// }else{ +// month+=1; +// } + binding.tips3Tv.setText(String.format(getString(R.string.zsbnxg1_txt),year+"",month+"",day+"")); + } + }else{ + binding. step1Ly.setVisibility(View.VISIBLE); + binding.step2Ly.setVisibility(View.GONE); + } + } + + } + + @Override + protected void onResume() { + super.onResume(); + + } + + protected void initListeners() { + binding.settingTitleBar.setOnBackIconClickListener(v -> onBackPressed()); + + binding.sumbitBt.setOnClickListener(v -> { + if(TextUtils.isEmpty( binding.editText.getText().toString())|| binding.editText.getText().toString().trim().length()<5){ + ToastX.showShortToast(getString(R.string.qszacc_hint_txt)); + + return; + } + changeUserInfo(); + }); + + binding.editText.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) { + binding.numberTv.setText( binding.editText.getText().toString().trim().length()+"/15"); + changeButton(); + + } + + @Override + public void afterTextChanged(Editable s) { + + } + }); + + binding.sumbitBt1.setOnClickListener(v -> finish()); + } + + private void changeUserInfo() { + Map maps = new HashMap<>(); + maps.put("nwId", binding.editText.getText().toString().trim()); + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + + Api.getInstance().authUser(IMKitClient.account(),maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver() { + @Override + public void onSuccess(Result feedbackResp) { + ToastX.showShortToast(getString(R.string.yhzlxgcg_txt)); + setResult(RESULT_OK); + finish(); + + } + + @Override + public void onError(int code, String msg) { + binding.showErrorTv.setText(msg); + binding.showErrorTv.setVisibility(View.VISIBLE); + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + binding.showErrorTv.setVisibility(View.INVISIBLE); + } + }, 3000); + + } + }); + } + + + @Override + protected void onStop() { + super.onStop(); + + } + public boolean onTouchEvent(MotionEvent event) { + if(null != this.getCurrentFocus()){ + /** + * 点击空白位置 隐藏软键盘 + */ + InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + return mInputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0); + } + return super .onTouchEvent(event); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/main/mine/TypeSelectActivity.java b/app/src/main/java/com/dskj/rbchat/main/mine/TypeSelectActivity.java new file mode 100644 index 0000000..05e7c5e --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/mine/TypeSelectActivity.java @@ -0,0 +1,123 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.main.mine; + +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.ViewGroup; +import android.widget.RadioButton; +import android.widget.RadioGroup; +import androidx.activity.result.ActivityResultLauncher; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.content.res.AppCompatResources; +import com.dskj.rbchat.AppSkinConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.TypeSelectActivityBinding; +import com.dskj.rbchat.utils.Constant; +import com.netease.yunxin.kit.alog.ALog; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.utils.SizeUtils; +import java.util.ArrayList; + +/** channel type select page choice list should be transfer by intent */ +public class TypeSelectActivity extends BaseActivity { + + private static final String TAG = "TypeSelectActivity"; + private TypeSelectActivityBinding viewBinding; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + ALog.d(TAG, "onCreate"); + changeStatusBarColor(R.color.color_eff1f4); + viewBinding = TypeSelectActivityBinding.inflate(LayoutInflater.from(this)); + setContentView(viewBinding.getRoot()); + initView(); + } + + private void initView() { + String title = getIntent().getStringExtra(Constant.TITLE); + int selected = getIntent().getIntExtra(Constant.SELECTED_INDEX, -1); + ArrayList groupList = getIntent().getStringArrayListExtra(Constant.CHOICE_LIST); + viewBinding.typeSelectTitleBar.setTitle(title); + if (groupList != null && groupList.size() > 0) { + RadioGroup.LayoutParams layoutParams = + new RadioGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + (int) getResources().getDimension(R.dimen.dp_50)); + for (int index = 0; index < groupList.size(); index++) { + RadioButton radioButton = createRadioButton(index, groupList.get(index)); + if (index == selected) { + radioButton.setChecked(true); + } + ALog.d(TAG, "initView", "group:" + groupList.get(index)); + viewBinding.typeRadioGroup.addView(radioButton, index, layoutParams); + } + } + + viewBinding.typeSelectTitleBar.setOnBackIconClickListener( + view -> { + back(); + }); + + if (AppSkinConfig.getInstance().getAppSkinStyle() == AppSkinConfig.AppSkin.commonSkin) { + setCommonSkin(); + } + } + + private void setCommonSkin() { + changeStatusBarColor(R.color.color_ededed); + viewBinding.llyRoot.setBackgroundResource(R.color.color_ededed); + + viewBinding.rfLayout.setBackgroundResource(R.color.color_white); + ViewGroup.MarginLayoutParams layoutParamsS = + (ViewGroup.MarginLayoutParams) viewBinding.rfLayout.getLayoutParams(); + layoutParamsS.setMargins(0, SizeUtils.dp2px(6), 0, 0); + viewBinding.rfLayout.setLayoutParams(layoutParamsS); + } + + @Override + public void onBackPressed() { + back(); + super.onBackPressed(); + } + + private void back() { + int checkedId = viewBinding.typeRadioGroup.getCheckedRadioButtonId(); + Intent intent = new Intent(); + intent.putExtra(Constant.EDIT_TYPE, Constant.EDIT_SEXUAL); + intent.putExtra(Constant.SELECTED_INDEX, checkedId); + setResult(RESULT_OK, intent); + ALog.d(TAG, "onBackPressed", "page back:" + checkedId); + finish(); + } + + private RadioButton createRadioButton(int index, String title) { + RadioButton radioButton = new RadioButton(this); + radioButton.setId(index); + radioButton.setButtonDrawable(null); + radioButton.setBackgroundResource(R.color.transparent); + radioButton.setText(title); + radioButton.setCompoundDrawablesWithIntrinsicBounds( + null, null, AppCompatResources.getDrawable(this, R.drawable.app_radio_button_select), null); + return radioButton; + } + + public static void launch( + Context context, + String title, + ArrayList groupList, + int select, + @NonNull ActivityResultLauncher launcher) { + Intent intent = new Intent(context, TypeSelectActivity.class); + intent.putExtra(Constant.TITLE, title); + intent.putExtra(Constant.CHOICE_LIST, groupList); + intent.putExtra(Constant.SELECTED_INDEX, select); + launcher.launch(intent); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/main/mine/UnBindPhoneActivity.java b/app/src/main/java/com/dskj/rbchat/main/mine/UnBindPhoneActivity.java new file mode 100644 index 0000000..20a0241 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/mine/UnBindPhoneActivity.java @@ -0,0 +1,393 @@ +package com.dskj.rbchat.main.mine; + +import android.app.Activity; +import android.content.Intent; +import android.os.Bundle; +import android.os.CountDownTimer; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.view.MotionEvent; +import android.view.View; +import android.view.inputmethod.InputMethodManager; + +import androidx.annotation.Nullable; + +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; + +import com.dskj.rbchat.databinding.ActivityUnbindPhoneBinding; +import com.dskj.rbchat.model.BindBean; +import com.dskj.rbchat.model.LoginBean; +import com.dskj.rbchat.model.RegisteredBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.dialog.LoadingDialog; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.corekit.im.IMKitClient; + +import java.util.HashMap; +import java.util.Map; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class UnBindPhoneActivity extends BaseActivity { + + private boolean isShowPass = false; + LoginBean loginBean; + BindBean bean; + boolean isCodeUnbind = true; + private ActivityUnbindPhoneBinding viewBinding; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + getWindow().setStatusBarColor(getResources().getColor(R.color.color_white)); + getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white)); + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR|View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR); + + super.onCreate(savedInstanceState); + viewBinding = ActivityUnbindPhoneBinding.inflate(getLayoutInflater()); + setContentView(viewBinding.getRoot()); + initView(); + + } + protected void initView( ) { + + viewBinding.settingTitleBar.setOnBackIconClickListener(v -> onBackPressed()); + + myCountDownTimer = new MyCountDownTimer(60000,1000); + + + viewBinding.getcodeTv.setOnClickListener(v -> { + getVerifyCode(); + }); + + + loginBean = DataUtils.getLocUserInfo(); + if (loginBean != null) { + bindInfo(IMKitClient.account()); + } + + viewBinding.sumbitBt.setOnClickListener(v -> { + hideSoftInput(UnBindPhoneActivity.this); + bindPhone(); + }); + viewBinding.toPassLy.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + viewBinding.toCodeLy.setVisibility(View.VISIBLE); + viewBinding.toPassLy.setVisibility(View.GONE); + viewBinding.step1Ly.setVisibility(View.GONE); + viewBinding.passwordLy.setVisibility(View.VISIBLE); + isCodeUnbind = false; + changeNextStatus(); + } + }); + + viewBinding.toCodeTv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + viewBinding.toCodeLy.setVisibility(View.GONE); + viewBinding.toPassLy.setVisibility(View.VISIBLE); + viewBinding.step1Ly.setVisibility(View.VISIBLE); + viewBinding.passwordLy.setVisibility(View.GONE); + isCodeUnbind = true; + changeNextStatus(); + } + }); + viewBinding.passwordEditText.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) { + changeNextStatus(); + } + + @Override + public void afterTextChanged(Editable s) { + + } + }); + viewBinding.passwordText.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) { + changeNextStatus(); + } + + @Override + public void afterTextChanged(Editable s) { + + } + }); + } + + private void changeNextStatus() { + if (isCodeUnbind) { + if(!TextUtils.isEmpty(viewBinding.passwordEditText.getText().toString().trim())&&viewBinding.passwordEditText.getText().toString().trim().length()==4){ + viewBinding.sumbitBt.setBackgroundResource(R.drawable.logout_btn2); + }else{ + viewBinding.sumbitBt.setBackgroundResource(R.drawable.input_bg1); + } + }else{ + if(!TextUtils.isEmpty(viewBinding.passwordText.getText().toString().trim())){ + viewBinding.sumbitBt.setBackgroundResource(R.drawable.logout_btn2); + }else{ + viewBinding.sumbitBt.setBackgroundResource(R.drawable.input_bg1); + } + } + } + + private void bindPhone() { + if(bean!=null) { + if (isCodeUnbind) { + if (TextUtils.isEmpty(viewBinding.passwordEditText.getText().toString().trim())) { + ToastX.showShortToast(getString(R.string.vcode_hint_txt)); + return; + } + + if (viewBinding.passwordEditText.getText().toString().trim().length()!=4) { + ToastX.showShortToast(getString(R.string.qsrswyzm_txt)); + return; + } + preCheckVerifyCodeLoc(); + + } else { + if (TextUtils.isEmpty(viewBinding.passwordText.getText().toString().trim())) { + ToastX.showShortToast(getString(R.string.password_hint_txt)); + return; + } + toNext(); + + } + + } + + } + + private void toNext() { + + Intent intent = new Intent(UnBindPhoneActivity.this, ChangeAccoutActionActivity.class); + intent.putExtra("type", ChangeAccoutActionActivity.TYPE_CHANGE_BIND_PHONE); + intent.putExtra("isCode", isCodeUnbind); + intent.putExtra("password", isCodeUnbind ? viewBinding.passwordEditText.getText().toString().trim() : viewBinding.passwordText.getText().toString().trim()); + intent.putExtra("area", bean.getAreaCode()); + intent.putExtra("phone", bean.getPhone()); + startActivityForResult(intent,777); + } + + private void preCheckVerifyCodeLoc() { + if(bean!=null) { + Map maps = new HashMap<>(); + maps.put("verifyCode", String.valueOf(viewBinding.passwordEditText.getText()).trim()); + maps.put("phone", bean.getPhone()); + maps.put("areaCode", bean.getAreaCode()); + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + + showLoadingDialog(); + Api.getInstance().preCheckVerifyCode(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { + dimessLoadingDialog(); + if (feedbackResp.data.isCorrect()) { + toNext(); + } else { + ToastX.showShortToast(getString(R.string.yzmbzq_txt)); + } + } + + @Override + public void onError(int code, String msg) { + dimessLoadingDialog(); + LogUtils.i("获取到的错误:" + code + "" + msg); + ToastX.showShortToast(msg); + + + } + }); + } + } + public LoadingDialog loadingDialog; + + public void showLoadingDialog() { + if (loadingDialog == null) + loadingDialog = new LoadingDialog(this); + loadingDialog.show(); + } + + public void showLoadingDialog(String msg) { + if (loadingDialog == null) + loadingDialog = new LoadingDialog(this); + loadingDialog.setLoadingText(msg); + loadingDialog.show(); + } + + + public void dimessLoadingDialog() { + if (loadingDialog != null) { + loadingDialog.dismiss(); + } + + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if(requestCode == 777 && resultCode == RESULT_OK){ + finish(); + } + } + + @Override + public void onBackPressed() { + super.onBackPressed(); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + } + + private void bindInfo(String user_uid) { + Api.getInstance().bindInfo(user_uid) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + bean = feedbackResp.data; + viewBinding.phoneTv.setText(String.format(getString(R.string.dxyzmjfz_txt),(feedbackResp.data.getAreaCode()+feedbackResp.data.getPhone()))); + viewBinding.areaTv.setText(feedbackResp.data.getAreaCode()); + viewBinding.loginFormUidEdit.setText(feedbackResp.data.getPhone()); + + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:"+code+""+ msg); +// WidgetUtils.showToast(getActivity(), msg, WidgetUtils.ToastType.ERROR); + } + }); + } + + + + + MyCountDownTimer myCountDownTimer; + + //倒计时函数 + private class MyCountDownTimer extends CountDownTimer { + + public MyCountDownTimer(long millisInFuture, long countDownInterval) { + super(millisInFuture, countDownInterval); + } + + //计时过程 + @Override + public void onTick(long l) { + //防止计时过程中重复点击 + viewBinding.getcodeTv.setClickable(false); + viewBinding.getcodeTv.setTextColor(getResources().getColor(R.color.color_themeblue)); + viewBinding.getcodeTv.setText(String.format(getString(R.string.get_code1_txt),(l/1000))); + + } + + //计时完毕的方法 + @Override + public void onFinish() { + //重新给Button设置文字 + viewBinding.getcodeTv.setText(R.string.get_code_txt); + //设置可点击 + viewBinding.getcodeTv.setClickable(true); + viewBinding.getcodeTv.setTextColor(getResources().getColor(R.color.color_themeblue)); + + } + } + + + /** + * 获取验证码 + * + */ + private void getVerifyCode() { + hideSoftInput(this); + myCountDownTimer.start(); + getCode(); + } + + private void getCode() { + + hideSoftInput(UnBindPhoneActivity.this); + if (bean != null) { + Map maps = new HashMap<>(); + maps.put("phone", bean.getPhone()); + maps.put("areaCode",bean.getAreaCode()); + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + + Api.getInstance().sendSmsForChangeBindPhone(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { + ToastX.showShortToast(feedbackResp.data); + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + ToastX.showShortToast(msg); + } + }); + } + + } + + /** + * 隐藏软键盘 + */ + public void hideSoftInput(Activity activity) { + InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + if (getCurrentFocus() != null && null != imm) { + imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0); + } +// View view = activity.getCurrentFocus(); +// +// if (view != null) { +// +// InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE); +// +// inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); +// +// } + } + + public boolean onTouchEvent(MotionEvent event) { + if(null != this.getCurrentFocus()){ + /** + * 点击空白位置 隐藏软键盘 + */ + InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + return mInputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0); + } + return super .onTouchEvent(event); + } + +} diff --git a/app/src/main/java/com/dskj/rbchat/main/mine/UserHeadEditActivity.java b/app/src/main/java/com/dskj/rbchat/main/mine/UserHeadEditActivity.java new file mode 100644 index 0000000..b3f68e3 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/mine/UserHeadEditActivity.java @@ -0,0 +1,798 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.main.mine; + +import static com.netease.yunxin.kit.chatkit.ui.ChatKitUIConstant.LIB_TAG; +import static com.netease.yunxin.kit.chatkit.ui.common.ChatUserCache.getUserInfo; + +import android.Manifest; +import android.content.ClipData; +import android.content.ClipboardManager; +import android.content.Context; +import android.content.Intent; +import android.graphics.Bitmap; +import android.graphics.Color; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.text.TextUtils; +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.EditText; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.alibaba.sdk.android.oss.ClientException; +import com.alibaba.sdk.android.oss.OSSClient; +import com.alibaba.sdk.android.oss.ServiceException; +import com.alibaba.sdk.android.oss.callback.OSSCompletedCallback; +import com.alibaba.sdk.android.oss.common.auth.OSSCredentialProvider; +import com.alibaba.sdk.android.oss.common.auth.OSSStsTokenCredentialProvider; +import com.alibaba.sdk.android.oss.model.PutObjectRequest; +import com.alibaba.sdk.android.oss.model.PutObjectResult; +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.bumptech.glide.request.RequestOptions; +import com.dskj.rbchat.AppSkinConfig; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.databinding.ActivityHeadUserEditBinding; +import com.dskj.rbchat.databinding.ActivityLocUserInfoBinding; +import com.dskj.rbchat.login.LoginActivity; +import com.dskj.rbchat.login.RegisterActivity; +import com.dskj.rbchat.model.LoginBean; +import com.dskj.rbchat.model.StsCredentialsBean; +import com.dskj.rbchat.model.UserUpdateEvent; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.Constant; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.utils.ToolKits; +import com.google.android.material.bottomsheet.BottomSheetDialog; +import com.king.zxing.util.CodeUtils; +import com.luck.picture.lib.basic.PictureSelector; +import com.luck.picture.lib.config.SelectMimeType; +import com.luck.picture.lib.entity.LocalMedia; +import com.luck.picture.lib.interfaces.OnResultCallbackListener; +import com.luck.picture.lib.style.BottomNavBarStyle; +import com.luck.picture.lib.style.PictureSelectorStyle; +import com.luck.picture.lib.style.SelectMainStyle; +import com.luck.picture.lib.style.TitleBarStyle; +import com.netease.nimlib.sdk.msg.MessageBuilder; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.nimlib.sdk.msg.model.IMMessage; +import com.netease.nimlib.sdk.uinfo.constant.GenderEnum; +import com.netease.yunxin.kit.alog.ALog; +import com.netease.yunxin.kit.chatkit.repo.ChatRepo; +import com.netease.yunxin.kit.chatkit.ui.common.GlideEngine; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.dialog.LoadingDialog; +import com.netease.yunxin.kit.common.ui.photo.BasePhotoChoiceDialog; +import com.netease.yunxin.kit.common.ui.photo.PhotoChoiceDialog; +import com.netease.yunxin.kit.common.ui.photo.PhotoPicker; +import com.netease.yunxin.kit.common.ui.utils.AvatarColor; +import com.netease.yunxin.kit.common.ui.utils.CommonCallback; +import com.netease.yunxin.kit.common.ui.utils.Permission; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.common.ui.widgets.datepicker.CustomDatePicker; +import com.netease.yunxin.kit.common.ui.widgets.datepicker.DateFormatUtils; +import com.netease.yunxin.kit.common.utils.NetworkUtils; +import com.netease.yunxin.kit.common.utils.PermissionUtils; +import com.netease.yunxin.kit.common.utils.SizeUtils; +import com.netease.yunxin.kit.common.utils.UriUtils; +import com.netease.yunxin.kit.contactkit.ui.utils.ColorUtils; +import com.netease.yunxin.kit.corekit.event.EventCenter; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.model.UserField; +import com.netease.yunxin.kit.corekit.im.model.UserInfo; +import com.netease.yunxin.kit.corekit.im.provider.FetchCallback; +import com.netease.yunxin.kit.corekit.im.provider.FetchCallbackImpl; +import com.netease.yunxin.kit.corekit.im.repo.CommonRepo; +import com.netease.yunxin.kit.teamkit.ui.fun.dialog.FunPhotoChoiceDialog; + +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; +import okhttp3.MediaType; +import okhttp3.MultipartBody; +import okhttp3.RequestBody; + +public class UserHeadEditActivity extends BaseActivity implements CommonCallback { + private ActivityHeadUserEditBinding binding; + private ActivityResultLauncher launcher; + private UserInfo userInfo; + private int resultCode = RESULT_CANCELED; + private LoginBean loginBean; + protected ActivityResultLauncher permissionLauncher; + + @RequiresApi(api = Build.VERSION_CODES.M) + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = ActivityHeadUserEditBinding.inflate(getLayoutInflater()); + + setContentView(binding.getRoot()); + + Window window = getWindow(); + window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + window.setStatusBarColor(ContextCompat.getColor(this, R.color.color_white)); + window.setNavigationBarColor(getResources().getColor(R.color.color_white)); + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR|View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR); + + loginBean = DataUtils.getLocUserInfo(); + + + initView(); + loadData(IMKitClient.account()); + if (loginBean != null) { + if (!TextUtils.isEmpty(loginBean.getUser().getPostHomepageBackground())) { + String pram = loginBean.getUser().getPostHomepageBackground(); + String url = IMUIKitConfig.OSS_URL + pram; + Glide.with(UserHeadEditActivity.this) + .load(url) + .into(binding.forbgIv); + } + } + + initClip(); + } + + + + private void initClip() { + + try { + getWindow().getDecorView().post(() -> { + //获取剪切板内容 + ClipboardManager mClipboardManager = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); + if (mClipboardManager.hasPrimaryClip()) { + try { + ClipData clipData = mClipboardManager.getPrimaryClip(); + for (int i = 0; i < clipData.getItemCount(); i++) { + ClipData.Item item = clipData.getItemAt(i); + if (item != null) { + String text = item.getText().toString(); + if (text.startsWith("http")&&text.endsWith(".gif")) { + toPush(text,true); + } + } + } + } catch (NullPointerException e) { + e.printStackTrace(); + } + } + }); + + } catch (Exception e) { + e.printStackTrace(); +// ToastUtils.showToast("启动:获取剪贴板异常"); + + } + } + + + + + @RequiresApi(api = Build.VERSION_CODES.M) + private void initView() { + + launcher = + registerForActivityResult( + new ActivityResultContracts.StartActivityForResult(), + result -> { + if (result.getData() != null + && TextUtils.equals( + result.getData().getStringExtra(Constant.EDIT_TYPE), Constant.EDIT_SEXUAL)) { + int select = result.getData().getIntExtra(Constant.SELECTED_INDEX, -1); + if (select >= 0) { + updateUserInfo(UserField.Gender, select + 1); + } + + } else if (result.getResultCode() == RESULT_OK) { + loadData(IMKitClient.account()); + } + if (resultCode == RESULT_OK) { + return; + } + resultCode = result.getResultCode(); + }); + + binding.toPhotoRy.setOnClickListener(v -> choicePhoto(true, false)); + binding.flCamera.setOnClickListener(v -> choicePhoto(false, false)); + binding.settingTitleBar.setOnBackIconClickListener(v -> onBackPressed()); + binding.toPhotoRy1.setOnClickListener(v -> choicePhoto(true, true)); + binding.flCamera1.setOnClickListener(v -> choicePhoto(false, true)); + permissionLauncher = + registerForActivityResult( + new ActivityResultContracts.RequestMultiplePermissions(), + result -> { + if (result != null) { + for (Map.Entry entry : result.entrySet()) { + String permission = entry.getKey().toString(); + boolean grant = (Boolean) entry.getValue(); + if (grant) { + if (TextUtils.equals( + permission, Manifest.permission.READ_EXTERNAL_STORAGE) || TextUtils.equals( + permission, Manifest.permission.READ_MEDIA_IMAGES) || TextUtils.equals( + permission, Manifest.permission.READ_MEDIA_VIDEO)) { + startPickMedia(isBackageB); + } + } else { + if (shouldShowRequestPermissionRationale(permission)) { + ToastX.showShortToast(getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_deny_tips)); + } else { + ToastX.showShortToast(getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_storage)); + } + } + } + } + }); + if (AppSkinConfig.getInstance().getAppSkinStyle() == AppSkinConfig.AppSkin.commonSkin) { + setCommonSkin(); + } + } + + + StsCredentialsBean stsCredentialsBean; + + private void toShangchuanAli(File file, boolean isHead) { + showLoadingDialog(); + Api.getInstance().stsCredentials() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + stsCredentialsBean = feedbackResp.data; + toAliYunOss(file, isHead); + } + + @Override + public void onError(int code, String msg) { + dimessLoadingDialog(); + } + }); + } + + public LoadingDialog loadingDialog; + + public void showLoadingDialog() { + if (loadingDialog == null) + loadingDialog = new LoadingDialog(this); + loadingDialog.show(); + } + + public void showLoadingDialog(String msg) { + if (loadingDialog == null) + loadingDialog = new LoadingDialog(this); + loadingDialog.setLoadingText(msg); + loadingDialog.show(); + } + + + public void dimessLoadingDialog() { + if (loadingDialog != null) { + loadingDialog.dismiss(); + } + + } + + + private void toAliYunOss(File file, boolean isHead) { + String endpoint = "https://oss-cn-hongkong.aliyuncs.com"; + String accessKeyId = stsCredentialsBean.getAccessKeyId(); + String accessKeySecret = stsCredentialsBean.getAccessKeySecret(); + String securityToken = stsCredentialsBean.getSecurityToken(); + String bucketName = IMUIKitConfig.bucketName; + + OSSCredentialProvider credentialProvider = new OSSStsTokenCredentialProvider(accessKeyId, accessKeySecret, securityToken); + OSSClient oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider); + toUpdateOss(bucketName, 0, oss, file, isHead); + + } + + public static Handler handler = new Handler(); + + // + private void toUpdateOss(String bucketName, int i, OSSClient oss, File file, boolean isHead) { + LogUtils.i("1111111111111111111"); + String updatePathPic = "postHomepageBackground"; + String updatePathPicHead = "userAvatarFileName"; + + LogUtils.i("22222222222222222"); + + String fileName = UUID.randomUUID().toString() + "_" + file.getName(); + LogUtils.i("文件地址是啥:" + file.getAbsolutePath()); + LogUtils.i("文件地址是啥1:" + file.getPath()); + + PutObjectRequest put = new PutObjectRequest(bucketName, "media/" + updatePathPic + "/" + fileName, file.getAbsolutePath()); + if (isHead) { + put = new PutObjectRequest(bucketName, "media/" + updatePathPicHead + "/" + fileName, file.getAbsolutePath()); + } + put.setProgressCallback((request, currentSize, totalSize) -> { + LogUtils.i("PutObject", "currentSize: " + currentSize + " totalSize: " + totalSize); + + }); + LogUtils.i("55555555555555"); + + oss.asyncPutObject(put, new OSSCompletedCallback<>() { + @Override + public void onSuccess(PutObjectRequest request, PutObjectResult result) { + LogUtils.i("PutObject", "UploadSuccess"); + LogUtils.i("ETag", result.getETag()); + LogUtils.i("RequestId", result.getRequestId()); + LogUtils.i("获取到的数据:" + GsonUtils.beanToJSONString(result)); + + handler.post(() -> { + if (isHead) { + toPush(IMUIKitConfig.OSS_URL + "media/" + updatePathPicHead + "/" + fileName, isHead); + } else { + LogUtils.i("地址是啥:"+IMUIKitConfig.OSS_URL+"media/" + updatePathPic + "/" + fileName); + toPush("media/" + updatePathPic + "/" + fileName, isHead); + + } + }); + } + + @Override + public void onFailure(PutObjectRequest request, ClientException clientExcepion, ServiceException serviceException) { + dimessLoadingDialog(); + LogUtils.i("ErrorCode", clientExcepion.getMessage()); + + // 请求异常。 + if (clientExcepion != null) { + // 本地异常,如网络异常等。 + clientExcepion.printStackTrace(); + } + if (serviceException != null) { + // 服务异常。 + LogUtils.i("ErrorCode", serviceException.getErrorCode()); + LogUtils.i("RequestId", serviceException.getRequestId()); + LogUtils.i("HostId", serviceException.getHostId()); + LogUtils.i("RawMessage", serviceException.getRawMessage()); + } + } + }); +// } + } + + private void toPush(String fileName, boolean isHead) { + Map maps = new HashMap<>(); + if (isHead) { + maps.put("userAvatarFileName", fileName); + } else { + maps.put("postHomepageBackground", fileName); + } + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + + Api.getInstance().authUser(IMKitClient.account(), maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result feedbackResp) { + dimessLoadingDialog(); + getUserInfo(IMKitClient.account()); + if (isHead) { + EventCenter.notifyEvent(new UserUpdateEvent()); + } + } + + @Override + public void onError(int code, String msg) { + dimessLoadingDialog(); + ToastX.showShortToast(msg); + } + }); + } + + + private void setCommonSkin() { + int cornerRadius = SizeUtils.dp2px(4); + binding.cavAvatar.setCornerRadius(cornerRadius); + + changeStatusBarColor(R.color.fun_page_bg_color); + + binding.clRoot.setBackgroundResource(R.color.fun_page_bg_color); + + binding.llUserInfo.setBackgroundResource(R.color.color_white); + ViewGroup.MarginLayoutParams layoutParamsN = + (ViewGroup.MarginLayoutParams) binding.llUserInfo.getLayoutParams(); + layoutParamsN.setMargins(0, SizeUtils.dp2px(4), 0, 0); + binding.llUserInfo.setLayoutParams(layoutParamsN); + + } + + private void loadData(String account) { + CommonRepo.getUserInfo( + account, + new FetchCallback() { + @Override + public void onSuccess(@Nullable UserInfo param) { + refreshUserInfo(param); + } + + @Override + public void onFailed(int code) { + ToastX.showShortToast(R.string.user_fail); + refreshUserInfo(new UserInfo(account, account, "")); + } + + @Override + public void onException(@Nullable Throwable exception) { + ToastX.showShortToast(R.string.user_fail); + refreshUserInfo(new UserInfo(account, account, "")); + } + }); + } + + private void copyAccount() { + ClipboardManager cmb = + (ClipboardManager) + IMKitClient.getApplicationContext().getSystemService(Context.CLIPBOARD_SERVICE); + ClipData clipData = null; + if (userInfo != null) { + clipData = ClipData.newPlainText(null, userInfo.getAccount()); + } + cmb.setPrimaryClip(clipData); + ToastX.showShortToast(R.string.action_copy_success); + } + + boolean isBackageB = false; + + private void choicePhoto(boolean isPhoto, boolean isBg) { + this.isBackageB = isBg; + if (!isPhoto) { + if (PermissionUtils.hasPermissions(UserHeadEditActivity.this, new String[]{"android.permission.CAMERA"})) { + toXiangji(isBg); + } else { + Permission.requirePermissions(UserHeadEditActivity.this, new String[]{"android.permission.CAMERA"}).request(new Permission.PermissionCallback() { + public void onGranted(List permissionsGranted) { + if (permissionsGranted.containsAll(Arrays.asList(new String[]{"android.permission.CAMERA"}))) { + toXiangji(isBg); + } else { + ToastX.showShortToast(R.string.dialog_permission_tips); + } + + } + + public void onDenial(List permissionsDenial, List permissionDenialForever) { + ToastX.showShortToast(R.string.dialog_permission_tips); + } + + public void onException(Exception exception) { + ToastX.showShortToast(R.string.dialog_permission_tips); + } + }); + } + } else { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + if (PermissionUtils.hasPermissions( + UserHeadEditActivity.this, Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO)) { + startPickMedia(isBg); + } else { + permissionLauncher.launch(new String[]{Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO}); + + } + } else { + if (PermissionUtils.hasPermissions( + UserHeadEditActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE)) { + startPickMedia(isBg); + } else { + permissionLauncher.launch(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}); + + } + } + } + + + } + + private void startPickMedia(boolean isBg) { + if(!isBg){ + PhotoPicker.getInstance().getAPhotoFromAlbumCropAndUpload(UserHeadEditActivity.this, this); + }else{ + TitleBarStyle whiteTitleBarStyle = new TitleBarStyle(); + whiteTitleBarStyle.setTitleBackgroundColor(ContextCompat.getColor(UserHeadEditActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_white)); + whiteTitleBarStyle.setTitleDrawableRightResource(com.netease.yunxin.kit.chatkit.ui.R.drawable.ic_orange_arrow_down); + whiteTitleBarStyle.setTitleLeftBackResource(com.netease.yunxin.kit.common.ui.R.drawable.ic_back); + whiteTitleBarStyle.setTitleTextColor(ContextCompat.getColor(UserHeadEditActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_black)); + whiteTitleBarStyle.setTitleCancelTextColor(ContextCompat.getColor(UserHeadEditActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_53575e)); + whiteTitleBarStyle.setDisplayTitleBarLine(true); + + BottomNavBarStyle whiteBottomNavBarStyle = new BottomNavBarStyle(); + // whiteBottomNavBarStyle.setBottomPreviewSelectText(getResources().getString(R.string.chat_team_ait_all)); + whiteBottomNavBarStyle.setBottomNarBarBackgroundColor(Color.parseColor("#FFFFFF")); + whiteBottomNavBarStyle.setBottomPreviewSelectTextColor(ContextCompat.getColor(UserHeadEditActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_53575e)); + + whiteBottomNavBarStyle.setBottomPreviewNormalTextColor(ContextCompat.getColor(UserHeadEditActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_9b)); + whiteBottomNavBarStyle.setBottomPreviewSelectTextColor(ContextCompat.getColor(UserHeadEditActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.color_222222)); + whiteBottomNavBarStyle.setCompleteCountTips(false); + + whiteBottomNavBarStyle.setBottomEditorTextColor(ContextCompat.getColor(UserHeadEditActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_53575e)); + whiteBottomNavBarStyle.setBottomOriginalTextColor(ContextCompat.getColor(UserHeadEditActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_53575e)); + + SelectMainStyle selectMainStyle = new SelectMainStyle(); + selectMainStyle.setStatusBarColor(ContextCompat.getColor(UserHeadEditActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_white)); + selectMainStyle.setDarkStatusBarBlack(true); + selectMainStyle.setSelectNormalTextColor(ContextCompat.getColor(UserHeadEditActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_9b)); + selectMainStyle.setSelectTextColor(ContextCompat.getColor(UserHeadEditActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.color_222222)); + selectMainStyle.setPreviewSelectBackground(com.netease.yunxin.kit.chatkit.ui.R.drawable.ps_demo_white_preview_selector); + selectMainStyle.setSelectBackground(com.netease.yunxin.kit.chatkit.ui.R.drawable.ps_checkbox_selector); +// selectMainStyle.setSelectText(R.string.ps_done_front_num); + selectMainStyle.setMainListBackgroundColor(ContextCompat.getColor(UserHeadEditActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_white)); + PictureSelectorStyle selectorStyle = new PictureSelectorStyle(); + selectorStyle.setTitleBarStyle(whiteTitleBarStyle); + selectorStyle.setBottomBarStyle(whiteBottomNavBarStyle); + selectorStyle.setSelectMainStyle(selectMainStyle); + + + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .setImageEngine(GlideEngine.createGlideEngine()) + .setMaxSelectNum(1) +// .setMaxVideoSelectNum(9) + .setSelectorUIStyle(selectorStyle) + .forResult(new OnResultCallbackListener() { + @Override + public void onResult(ArrayList result) { + for (int i = 0; i < result.size(); ++i) { +// Uri uri = Uri.parse(result.get(i).getAvailablePath()); + LogUtils.i("地址是啥:"+result.get(i).getRealPath()); + File file = new File(result.get(i).getRealPath()); + toUpdateBg(file,false); + } + } + + @Override + public void onCancel() { + + } + }); + + } + + } + + private void toUpdate(File file) { + if (NetworkUtils.isConnected()) { + CommonRepo.uploadImage( + file, + new FetchCallback() { + @Override + public void onSuccess(@Nullable String urlParam) { + Map map = new HashMap<>(1); + map.put(UserField.Avatar, urlParam); + CommonRepo.updateUserInfo( + map, + new FetchCallback() { + @Override + public void onSuccess(@Nullable Void param) { + resultCode = RESULT_OK; + loadData(IMKitClient.account()); + } + + @Override + public void onFailed(int code) { + Toast.makeText( + getApplicationContext(), + getString(R.string.request_fail), + Toast.LENGTH_SHORT) + .show(); + } + + @Override + public void onException(@Nullable Throwable exception) { + Toast.makeText( + getApplicationContext(), + getString(R.string.request_fail), + Toast.LENGTH_SHORT) + .show(); + } + }); + } + + @Override + public void onFailed(int code) { + Toast.makeText( + getApplicationContext(), + getString(R.string.request_fail), + Toast.LENGTH_SHORT) + .show(); + } + + @Override + public void onException(@Nullable Throwable exception) { + Toast.makeText( + getApplicationContext(), + getString(R.string.request_fail), + Toast.LENGTH_SHORT) + .show(); + } + }); + } else { + Toast.makeText( + getApplicationContext(), + getString(R.string.network_error), + Toast.LENGTH_SHORT) + .show(); + } + } + + + private void refreshUserInfo(UserInfo userInfo) { + if (userInfo == null) { + return; + } + this.userInfo = userInfo; + ColorUtils.loadAvator(userInfo.getAvatar(), binding.cavAvatar); +// binding.cavAvatar.setData( +// userInfo.getAvatar(), +// userInfo.getName() == null ? "" : userInfo.getName(), +// AvatarColor.avatarColor(IMKitClient.account())); + + } + + + private void updateUserInfo(UserField field, Object value) { + Map map = new HashMap<>(1); + map.put(field, value); + CommonRepo.updateUserInfo( + map, + new FetchCallback() { + @Override + public void onSuccess(@Nullable Void param) { + resultCode = RESULT_OK; + // binding.tvBirthday.setText(birthday); + loadData(IMKitClient.account()); + } + + @Override + public void onFailed(int code) { + if (code == Constant.NETWORK_ERROR_CODE) { + Toast.makeText( + getApplicationContext(), + getString(R.string.network_error), + Toast.LENGTH_SHORT) + .show(); + } else { + Toast.makeText( + getApplicationContext(), getString(R.string.request_fail), Toast.LENGTH_SHORT) + .show(); + } + } + + @Override + public void onException(@Nullable Throwable exception) { + Toast.makeText( + getApplicationContext(), getString(R.string.request_fail), Toast.LENGTH_SHORT) + .show(); + } + }); + } + + @Override + public void onBackPressed() { + setResult(resultCode); + super.onBackPressed(); + } + + @Override + public void finish() { + setResult(resultCode); + super.finish(); + } + + public static void launch(Context context, @NonNull ActivityResultLauncher launcher) { + Intent intent = new Intent(context, UserHeadEditActivity.class); + launcher.launch(intent); + } + + + private void toXiangji(boolean isBg) { +// if(!isBg){ + PhotoPicker.getInstance().takePhotoCorpAndUpload(UserHeadEditActivity.this, this); +// }else{ +//// PhotoPicker.getInstance().takePhoto(UserHeadEditActivity.this,this); +// pickMediaLauncher.launch("image/*;video/*"); +// } + } + + private void toUpdateBg(File file, boolean isHead) { + if (!isHead) { + Glide.with(UserHeadEditActivity.this) + .load(file.getAbsolutePath()) + .into(binding.forbgIv); + } else { +// Glide.with(UserHeadEditActivity.this) +// .load(file.getAbsolutePath()) +// .into(binding.cavAvatar); + ColorUtils.loadAvator(file.getAbsolutePath(), binding.cavAvatar); +// binding.cavAvatar.setData( +// file.getAbsolutePath(), +// userInfo.getName() == null ? "" : userInfo.getName(), +// AvatarColor.avatarColor(IMKitClient.account())); + } + toShangchuanAli(file, isHead); + } + + @Override + public void onException(@Nullable Throwable throwable) { + + } + + @Override + public void onFailed(int i) { + + } + + @Override + public void onSuccess(@Nullable File file) { + if (!isBackageB) { +// toUpdate(file); + toUpdateBg(file, true); + } else { + toUpdateBg(file, false); + } + } + + private void getUserInfo(String user_uid) { + + Api.getInstance().userInfo(user_uid) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + + if (loginBean != null) { + loginBean.getUser().setPostHomepageBackground(feedbackResp.data.getPostHomepageBackground()); + loginBean.setPostHomepageBackground(feedbackResp.data.getPostHomepageBackground()); + } + DataUtils.set(UserHeadEditActivity.this, "login_bean", GsonUtils.beanToJSONString(loginBean)); + + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); +// WidgetUtils.showToast(getActivity(), msg, WidgetUtils.ToastType.ERROR); + } + }); + + + } + + +} diff --git a/app/src/main/java/com/dskj/rbchat/main/mine/UserInfoActivity.java b/app/src/main/java/com/dskj/rbchat/main/mine/UserInfoActivity.java new file mode 100644 index 0000000..92955d3 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/mine/UserInfoActivity.java @@ -0,0 +1,1806 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.main.mine; + +import android.Manifest; +import android.app.Activity; +import android.content.ClipData; +import android.content.ClipboardManager; +import android.content.Context; +import android.content.Intent; +import android.graphics.Bitmap; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.text.TextUtils; +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.EditText; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContract; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; +import androidx.appcompat.widget.AppCompatButton; +import androidx.appcompat.widget.SwitchCompat; +import androidx.core.app.ActivityOptionsCompat; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.bumptech.glide.Glide; +import com.codersun.fingerprintcompat.AonFingerChangeCallback; +import com.codersun.fingerprintcompat.FingerManager; +import com.codersun.fingerprintcompat.SimpleFingerCheckCallback; +import com.dskj.rbchat.AppSkinConfig; +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.custom.CustomDatePickerNew; +import com.dskj.rbchat.databinding.ActivityLocUserInfoBinding; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.dialog.PayCashDialog; +import com.dskj.rbchat.dialog.PayCashFingerDialog; +import com.dskj.rbchat.dialog.SelectSexDialog; +import com.dskj.rbchat.game.JsBridgeActivity; +import com.dskj.rbchat.main.MainActivity; +import com.dskj.rbchat.main.authorize.AuthorizeActivity; +import com.dskj.rbchat.main.index.add.AddFriendsActivity; +import com.dskj.rbchat.model.BindBean; +import com.dskj.rbchat.model.LoginBean; +import com.dskj.rbchat.model.UserShareBean; +import com.dskj.rbchat.model.WalletBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.pay.CollectionActivity; +import com.dskj.rbchat.pay.PaymentActivity; +import com.dskj.rbchat.utils.AdaptScreenUtils; +import com.dskj.rbchat.utils.CommonUtils; +import com.dskj.rbchat.utils.Constant; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.utils.QRCodeScheme; +import com.dskj.rbchat.utils.ShareDateUtils; +import com.dskj.rbchat.utils.ToolKits; +import com.dskj.rbchat.wallet.SetPayPasswordActivity; +import com.google.android.material.bottomsheet.BottomSheetDialog; +import com.huawei.hms.hmsscankit.ScanUtilNew; +import com.huawei.hms.ml.scan.HmsScan; +import com.huawei.hms.ml.scan.HmsScanAnalyzerOptions; +import com.king.zxing.util.CodeUtils; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.RequestCallback; +import com.netease.nimlib.sdk.ResponseCode; +import com.netease.nimlib.sdk.msg.MessageBuilder; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.nimlib.sdk.msg.model.IMMessage; +import com.netease.nimlib.sdk.team.TeamService; +import com.netease.nimlib.sdk.team.model.Team; +import com.netease.nimlib.sdk.uinfo.UserService; +import com.netease.nimlib.sdk.uinfo.constant.GenderEnum; +import com.netease.nimlib.sdk.uinfo.model.NimUserInfo; +import com.netease.yunxin.kit.chatkit.repo.ChatRepo; +import com.netease.yunxin.kit.chatkit.ui.common.RxBus; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.photo.BasePhotoChoiceDialog; +import com.netease.yunxin.kit.common.ui.photo.PhotoChoiceDialog; +import com.netease.yunxin.kit.common.ui.utils.AvatarColor; +import com.netease.yunxin.kit.common.ui.utils.CommonCallback; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.common.ui.widgets.ContactAvatarView; +import com.netease.yunxin.kit.common.ui.widgets.datepicker.CustomDatePicker; +import com.netease.yunxin.kit.common.ui.widgets.datepicker.DateFormatUtils; +import com.netease.yunxin.kit.common.utils.NetworkUtils; +import com.netease.yunxin.kit.common.utils.PermissionUtils; +import com.netease.yunxin.kit.common.utils.SizeUtils; +import com.netease.yunxin.kit.common.utils.UriUtils; +import com.netease.yunxin.kit.contactkit.ui.utils.ColorUtils; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.model.UserField; +import com.netease.yunxin.kit.corekit.im.model.UserInfo; +import com.netease.yunxin.kit.corekit.im.provider.FetchCallback; +import com.netease.yunxin.kit.corekit.im.provider.FetchCallbackImpl; +import com.netease.yunxin.kit.corekit.im.repo.CommonRepo; +import com.netease.yunxin.kit.corekit.im.utils.RouterConstant; +import com.netease.yunxin.kit.corekit.route.XKitRouter; +import com.netease.yunxin.kit.teamkit.ui.fun.dialog.FunPhotoChoiceDialog; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import cc.shinichi.library.ImagePreview; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class UserInfoActivity extends BaseActivity { + private ActivityLocUserInfoBinding binding; + private ActivityResultLauncher launcher; + private UserInfo userInfo; + private int resultCode = RESULT_CANCELED; + private LoginBean loginBean; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = ActivityLocUserInfoBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + Window window = getWindow(); + window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + window.setStatusBarColor(ContextCompat.getColor(this, R.color.color_white)); + window.setNavigationBarColor(getResources().getColor(R.color.color_white)); + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR | View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR); + + loginBean = DataUtils.getLocUserInfo(); + + launcher = + registerForActivityResult( + new ActivityResultContracts.StartActivityForResult(), + result -> { + if (result.getData() != null + && TextUtils.equals( + result.getData().getStringExtra(Constant.EDIT_TYPE), Constant.EDIT_SEXUAL)) { + int select = result.getData().getIntExtra(Constant.SELECTED_INDEX, -1); + if (select >= 0) { + updateUserInfo(UserField.Gender, select + 1); + } + + } else if (result.getResultCode() == RESULT_OK) { + loadData(IMKitClient.account()); + } + if (resultCode == RESULT_OK) { + return; + } + resultCode = result.getResultCode(); + }); + + permissionLauncher = + registerForActivityResult( + new ActivityResultContracts.RequestMultiplePermissions(), + result -> { + if (result != null) { + for (Map.Entry entry : result.entrySet()) { + String permission = entry.getKey().toString(); + boolean grant = (Boolean) entry.getValue(); + if (grant) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + showBottomShare(); + } + } + } + } + }); + + permissionLauncher1 = + registerForActivityResult( + new ActivityResultContracts.RequestMultiplePermissions(), + result -> { + if (result != null) { + for (Map.Entry entry : result.entrySet()) { + String permission = entry.getKey().toString(); + boolean grant = (Boolean) entry.getValue(); + if (grant) { + ScanUtilNew.startScan(UserInfoActivity.this, MainActivity.REQUEST_CODE_FOR_QRCODE_SCAN, + new HmsScanAnalyzerOptions.Creator().setHmsScanTypes(HmsScan.ALL_SCAN_TYPE).create()); + } + } + } + }); + + initView(); + shareDateUtils = new ShareDateUtils(); + shareDateUtils.getAllSessionList(); + } + + + /** + * 一些回调通知。 + * + * @param requestCode 请求码 + * @param resultCode 结果码 + * @param data 数据 + */ + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (resultCode == RESULT_OK && data != null) { + switch (requestCode) { + // 从2维码扫描界面返回的结果回调 + case 1016: + Object obj = data.getParcelableExtra(ScanUtilNew.RESULT); + if (obj instanceof HmsScan) { + if (!TextUtils.isEmpty(((HmsScan) obj).getOriginalValue())) { + String result1 = ((HmsScan) obj).getOriginalValue(); +// String result = CameraScan.parseScanResult(data); +// Log.v(TAG, "2维码扫码结果:" + result); + Log.v("LAILIAOLIAO", "行动码是啥:" + result1); + + // 开始解析2维码内容并进入相应的处理逻辑 + processQRCodeScanResult(this, result1); + } + break; + } + case 888: + getUserInfo(IMKitClient.account()); + break; + } + } + } + + /** + * 解析2维码扫码结果并进入相应和业务逻辑处理(主要用于从2维码扫描界面扫描完成后的回调结果处理)。 + * + * @param originalQrcodeStr 扫描出的原始2维码字符串,形如"time_go_chat://add_user/400069" + */ + public void processQRCodeScanResult(Activity activity, String originalQrcodeStr) { + if (originalQrcodeStr != null) { + try { + if (originalQrcodeStr.startsWith(IMUIKitConfig.SHARE_INVCODE_START) && originalQrcodeStr.contains("userId")) { + originalQrcodeStr = originalQrcodeStr.replace(IMUIKitConfig.SHARE_INVCODE_START, "https://www.baidu.com"); + Uri uri = Uri.parse(originalQrcodeStr); + LogUtils.i("数据是啥:" + originalQrcodeStr); + String id = uri.getQueryParameter("userId"); //id 值 10943 + + XKitRouter.withKey(RouterConstant.PATH_USER_INFO_PAGE) + .withContext(activity) + .withParam(RouterConstant.KEY_ACCOUNT_ID_KEY, id) + .withParam("userId", id) + .navigate(); + } else if (originalQrcodeStr.startsWith(IMUIKitConfig.SHARE_INVCODE_START) && originalQrcodeStr.contains("teamId")) { + originalQrcodeStr = originalQrcodeStr.replace(IMUIKitConfig.SHARE_INVCODE_START, "https://www.baidu.com"); + Uri uri = Uri.parse(originalQrcodeStr); + LogUtils.i("数据是啥:" + originalQrcodeStr); + String id = uri.getQueryParameter("teamId"); //id 值 10943 + showQrcodeView(id); + + } else if (originalQrcodeStr.startsWith(IMUIKitConfig.SHARE_INVCODE_START) && originalQrcodeStr.contains("machineId") && originalQrcodeStr.contains("orderNo")) { + originalQrcodeStr = originalQrcodeStr.replace(IMUIKitConfig.SHARE_INVCODE_START, "https://www.baidu.com"); + Uri uri = Uri.parse(originalQrcodeStr); + LogUtils.i("数据是啥:" + originalQrcodeStr); + String machineId = uri.getQueryParameter("machineId"); //id 值 10943 + String orderNo = uri.getQueryParameter("orderNo"); //id 值 10943 + String money = uri.getQueryParameter("money"); + showGiftView(machineId, orderNo, money); + + } else if (originalQrcodeStr.startsWith(IMUIKitConfig.SHARE_INVCODE_START) && originalQrcodeStr.contains("silver_qr_code")) { + originalQrcodeStr = originalQrcodeStr.replace(IMUIKitConfig.SHARE_INVCODE_START, "https://www.baidu.com"); + Uri uri = Uri.parse(originalQrcodeStr); + String silverQrCode = uri.getQueryParameter("silver_qr_code"); // + Intent intent2 = new Intent(UserInfoActivity.this, JsBridgeActivity.class); + intent2.putExtra("url", IMUIKitConfig.SILVER_URL + silverQrCode); + intent2.putExtra("isV", false); + intent2.putExtra("isGame", false); + startActivity(intent2); + } else { + QRCodeScheme.QRCodeData qrData = QRCodeScheme.parseCodeData(originalQrcodeStr); + // 2维码内容前缀(形如“time_go_chat://add_user/”) + LogUtils.i("行动码是啥111:" + GsonUtils.beanToJSONString(qrData)); + + String scheme = qrData.getScheme(); + // 2维码内容(形如“400069”) + String value = qrData.getValue(); + String uid = qrData.getUserId(); + + if (!CommonUtils.isStringEmpty(scheme, true) && !CommonUtils.isStringEmpty(value, true)) { + LogUtils.i("行动码是啥222:" + scheme); + + switch (scheme) { + case QRCodeScheme.QR_CODE_SCHEME_ADD_USER: +// QueryFriendInfo.gotoWatchUserInfo(activity, value, null); +// if (value.equals(IMKitClient.account())) { +// activityMainBinding.myselfBtnGroup.performClick(); +// return; +// } + + XKitRouter.withKey(RouterConstant.PATH_USER_INFO_PAGE) + .withContext(activity) + .withParam(RouterConstant.KEY_ACCOUNT_ID_KEY, value) + .withParam("userId", value) + .navigate(); + +// Intent intent = new Intent(UserInfoActivity.this, UserInfoActivity.class); +// intent.putExtra("uid",value); +// startActivity(intent); + break; + case QRCodeScheme.QR_CODE_PSCHEME_JOIN_GROUP: +// activity.startActivity(IntentFactory.createJoinGroupIntent(activity, value)); +// ToastX.showShortToast("这里是要跳加入群聊的逻辑"); + showQrcodeView(value); + break; + case QRCodeScheme.QR_CODE_PSCHEME_LOGIN_WEB: + showShouQuan(value); + break; + case QRCodeScheme.QR_CODE_PSCHEME_PAYMENT_CODE: + Intent intent = new Intent(UserInfoActivity.this, PaymentActivity.class); + intent.putExtra("userId", value); + startActivity(intent); + break; + case QRCodeScheme.QR_CODE_PSCHEME_PAYMENT_ATM: + + if (bean != null) { + if (!bean.getPhoneBind()) { + showDialog(); + } else if (!bean.getPayPasswordSet()) { + showDialogPay(); + } else { + if (DataUtils.get(UserInfoActivity.this, "hasFinger", false)) { + showPayCashFingerDialog(value, uid, MainActivity.TYPE_PAYMENT_DUIBI); + } else { + showPayCashDialog(value, uid, MainActivity.TYPE_PAYMENT_DUIBI); + } + } + } + break; + case QRCodeScheme.QR_CODE_PSCHEME_PAYMENT_BEAD: + if (DataUtils.get(UserInfoActivity.this, "hasFinger", false)) { + showPayCashFingerDialog(value, uid, MainActivity.TYPE_PAYMENT_BEAD); + } else { + showPayCashDialog(value, uid, MainActivity.TYPE_PAYMENT_BEAD); + } + break; + + case QRCodeScheme.QR_CODE_PSCHEME_SILVER_QR_CODE: + Intent intent2 = new Intent(UserInfoActivity.this, JsBridgeActivity.class); + intent2.putExtra("url", IMUIKitConfig.SILVER_URL + value); + intent2.putExtra("isV", false); + intent2.putExtra("isGame", true); + startActivity(intent2); + break; + case QRCodeScheme.QR_CODE_PSCHEME_BIZ_RECEIVE: + Intent intent3 = new Intent(UserInfoActivity.this, PaymentActivity.class); + intent3.putExtra("userId", value); + intent3.putExtra("userType", 1); + startActivity(intent3); + break; +// case QRCodeScheme.QR_CODE_PSCHEME_PAYMENT_OUTER_CODE: +// Intent intent1 = new Intent(UserInfoActivity.this, CollectionActivity.class); +// intent1.putExtra("code", value); +// startActivity(intent1); +// break; + default: + if (scheme.startsWith("http")) { + if (scheme.startsWith("https://admin.letschat2023.com/") && scheme.contains("deviceId")) { + sendMachine(scheme); + } else { +// activity.startActivity(IntentFactory.createCommonWebActivity2Intent(activity, scheme, "", true)); + showErrCode(getString(R.string.qrcode_scan_activity_not_surpport_qrcontent)); + + } + } else { +// ToastX.showLongToast(getString(R.string.qrcode_scan_activity_not_surpport_qrcontent)); + //Context context, String content, String cancel, String sure,boolean showCancel + showErrCode(getString(R.string.qrcode_scan_activity_not_surpport_qrcontent)); + } + break; + } + } else { + if (scheme.startsWith("http")) { + if (scheme.startsWith("https://admin.letschat2023.com/") && scheme.contains("deviceId")) { + sendMachine(scheme); + } else { +// activity.startActivity(IntentFactory.createCommonWebActivity2Intent(activity, scheme, "", true)); + showErrCode(getString(R.string.qrcode_scan_activity_not_surpport_qrcontent)); + + } + } else { +// ToastX.showLongToast(getString(R.string.qrcode_scan_activity_not_surpport_qrcontent)); + showErrCode(getString(R.string.qrcode_scan_activity_not_surpport_qrcontent)); + + } + } + } + } catch (Exception e) { + + } + } else { +// ToastX.showLongToast(R.string.); + showErrCode(getString(R.string.qrcode_scan_activity_not_invalid_qrcode)); + + } + } + + PayCashDialog payDialog; + PayCashFingerDialog payCashFingerDialog; + + private void showPayCashDialog(String did, String number, int type) { + payDialog = new PayCashDialog(UserInfoActivity.this, (Integer.parseInt(number)) + "", true, 0, walletBean, + null, 2, String.format(getString(R.string.fukuangei_txt), getString(R.string.duibiji_txt))); + if (type == MainActivity.TYPE_PAYMENT_GIFT) { + payDialog = new PayCashDialog(UserInfoActivity.this, (Integer.parseInt(number)) + "", true, 0, walletBean, + null, 2, String.format(getString(R.string.fukuangei_txt), getString(R.string.duibiji_txt2)), 1); + } else if (type == MainActivity.TYPE_PAYMENT_BEAD) { + payDialog = new PayCashDialog(UserInfoActivity.this, (Integer.parseInt(number)) + "", true, 0, walletBean, + null, 2, String.format(getString(R.string.fukuangei_txt), getString(R.string.shuzhuji_txt))); + } + payDialog.setOntoAlbumListener(new PayCashDialog.OnListItemClickListener() { + @Override + public void onPayPass(String position) { + if (type == MainActivity.TYPE_PAYMENT_DUIBI) { + toChange(position, did, number, 1); + } else if (type == MainActivity.TYPE_PAYMENT_BEAD) { + toChange2(position, did, number, 1); + } else { + toChange1(position, did, number, 1); + } + } + + @RequiresApi(api = Build.VERSION_CODES.M) + @Override + public void onChangeFinger() { + showPayCashFingerDialog(did, number, type); + } + + @Override + public void dimess() { + payDialog.dismiss(); + + } + }); + payDialog.show(); + } + + private void toChange(String password, String did, String number, int type) { + Map maps = new HashMap<>(); + maps.put("amount", Integer.parseInt(number) * 100); + maps.put("payVerifyCode", type); + if (!TextUtils.isEmpty(password)) { + maps.put("payPassword", password); + } + maps.put("deviceId", did); + Api.getInstance().selfHelpATM(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver() { + @Override + public void onSuccess(Result feedbackResp) { + ToastX.showShortToast(getString(R.string.zhiufuchengg_txt)); + getWallet(); + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast(msg); + + } + }); + } + + private void toChange2(String password, String did, String number, int type) { + Map maps = new HashMap<>(); + maps.put("amount", Integer.parseInt(number) * 100); + maps.put("payVerifyCode", type); + if (!TextUtils.isEmpty(password)) { + maps.put("payPassword", password); + } + maps.put("deviceId", did); + Api.getInstance().danzhuPay(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver() { + @Override + public void onSuccess(Result feedbackResp) { + ToastX.showShortToast(getString(R.string.zhiufuchengg_txt)); + getWallet(); + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast(msg); + + } + }); + } + + + WalletBean walletBean; + + private void getWallet() { + Api.getInstance().walletInfo(IMKitClient.account()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { + walletBean = feedbackResp.data; + RxBus.getInstance().post(walletBean); + } + + @Override + public void onError(int code, String msg) { +// WidgetUtils.showToast(getActivity(), msg, WidgetUtils.ToastType.ERROR); + + } + }); + + + } + + private void showPayCashFingerDialog(String did, String number, int type) { + //Context context, String data, boolean showNumber, int payType, WalletBean walletBean, SelectPayTypeDialog.OnToTypeListener onToTypeListener, int isShowFinger + payCashFingerDialog = new PayCashFingerDialog(this, (Integer.parseInt(number)) + "", true, 0, walletBean, null, 2, + String.format(getString(R.string.fukuangei_txt), getString(R.string.duibiji_txt))); + if (type == MainActivity.TYPE_PAYMENT_GIFT) { + payCashFingerDialog = new PayCashFingerDialog(this, (Integer.parseInt(number)) + "", true, 0, walletBean, null, 2, + String.format(getString(R.string.fukuangei_txt), getString(R.string.duibiji_txt2)), true); + } else if (type == MainActivity.TYPE_PAYMENT_BEAD) { + payCashFingerDialog = new PayCashFingerDialog(this, (Integer.parseInt(number)) + "", true, 0, walletBean, null, 2, + String.format(getString(R.string.fukuangei_txt), getString(R.string.shuzhuji_txt))); + } + payCashFingerDialog.setOntoAlbumListener(new PayCashFingerDialog.OnListItemClickListener() { + @Override + public void onChangePassword() { + showPayCashDialog(did, number, type); + } + + @Override + public void toFinger() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + checkPayFinger(did, number, type); + } + } + + @Override + public void dimess() { + payCashFingerDialog.dismiss(); + } + }); + payCashFingerDialog.show(); + } + + @RequiresApi(api = Build.VERSION_CODES.M) + private void checkPayFinger(String did, String number, int type) { + + FingerManager.build().setApplication(IMApplication.getInstance()) + .setTitle(" ") + .setDes(" ") + .setNegativeText(" ") + .setFingerCheckCallback(new SimpleFingerCheckCallback() { + + @Override + public void onSucceed() { + ToastX.showShortToast("验证成功"); + payCashFingerDialog.dismiss(); + if (type == MainActivity.TYPE_PAYMENT_DUIBI) { + toChange(null, did, number, 2); + } else if (type == MainActivity.TYPE_PAYMENT_BEAD) { + toChange2(null, did, number, 2); + } else { + toChange1(null, did, number, 2); + } + } + + @Override + public void onError(String error) { + ToastX.showShortToast("验证失败"); + + } + + @Override + public void onCancel() { + ToastX.showShortToast("您取消了识别"); + + } + }) + .setFingerChangeCallback(new AonFingerChangeCallback() { + + @Override + protected void onFingerDataChange() { + ToastX.showShortToast("指纹数据发生了变化"); + FingerManager.updateFingerData(UserInfoActivity.this); + new Handler().postDelayed(() -> checkPayFinger(did, number, type), 1000); + } + }) + .create() + .startListener(UserInfoActivity.this); + } + + private void toChange1(String password, String did, String number, int type) { + Map maps = new HashMap<>(); + maps.put("amount", Long.parseLong(number) * 100); + maps.put("orderNo", orderNo); + maps.put("payVerifyCode", type); + if (!TextUtils.isEmpty(password)) { + maps.put("payPassword", password); + } + Api.getInstance().cabinet(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver() { + @Override + public void onSuccess(Result feedbackResp) { + ToastX.showShortToast(getString(R.string.zhiufuchengg_txt)); + getWallet(); + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast(msg); + + } + }); + } + + private void showDialogPay() { + + com.netease.yunxin.kit.chatkit.ui.dialog.ActionConfirmDialog actionDialog = new com.netease.yunxin.kit.chatkit.ui.dialog.ActionConfirmDialog(UserInfoActivity.this, + getString(com.netease.yunxin.kit.chatkit.ui.R.string.bind_phone_des_txt1), getString(com.netease.yunxin.kit.chatkit.ui.R.string.cancel_txt), getString(com.netease.yunxin.kit.chatkit.ui.R.string.to_sett_txt)); + actionDialog.setOnToActionListener(new com.netease.yunxin.kit.chatkit.ui.dialog.ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { +// Intent intent = new Intent(UserInfoActivity.this, ChangeAccoutActionActivity.class); +// intent.putExtra("type", 5); +// startActivity(intent); + Intent intent = new Intent(UserInfoActivity.this, SetPayPasswordActivity.class); + startActivity(intent); + } + + @Override + public void toCancel() { + + } + }); + actionDialog.show(); + } + + private void showDialog() { + + ActionConfirmDialog actionDialog = new ActionConfirmDialog(UserInfoActivity.this, + getString(R.string.bind_phone_des_txt), getString(R.string.nobind_txt), getString(R.string.tobind_txt)); + actionDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + Intent intent = new Intent(UserInfoActivity.this, ChangeAccoutActionActivity.class); + intent.putExtra("type", ChangeAccoutActionActivity.TYPE_BIND_PHONE); + startActivity(intent); + } + + @Override + public void toCancel() { + + } + }); + actionDialog.show(); + } + + + private String orderNo; + + private void showGiftView(String machineId, String orderNos, String moneys) { + this.orderNo = orderNos; + if (bean != null) { + if (!bean.getPhoneBind()) { + showDialog(); + } else if (!bean.getPayPasswordSet()) { + showDialogPay(); + } else { + if (DataUtils.get(UserInfoActivity.this, "hasFinger", false)) { + showPayCashFingerDialog(machineId, moneys, MainActivity.TYPE_PAYMENT_GIFT); + } else { + showPayCashDialog(machineId, moneys, MainActivity.TYPE_PAYMENT_GIFT); + } + } + } + } + + + private void showShouQuan(String value) { + Intent intent = new Intent(UserInfoActivity.this, AuthorizeActivity.class); + intent.putExtra("deviceId", value); + intent.putExtra("isWebLogin", true); + startActivity(intent); + } + + private void sendMachine(String scheme) { + scheme = scheme.replace("https://admin.letschat2023.com/#/downLoad", "https://www.baidu.com"); + Uri uri = Uri.parse(scheme); + LogUtils.i("数据是啥:" + scheme); + String id = uri.getQueryParameter("deviceId"); //id 值 10943 + Intent intent = new Intent(UserInfoActivity.this, AuthorizeActivity.class); + intent.putExtra("deviceId", id); + startActivity(intent); + + + } + + private void showErrCode(String errorMessage) { + ActionConfirmDialog actionConfirmDialog = new ActionConfirmDialog(UserInfoActivity.this, errorMessage, "", + getString(R.string.general_got_it), false); + actionConfirmDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + } + + @Override + public void toCancel() { + + } + }); + actionConfirmDialog.show(); + } + + private void initView() { +// binding.cavAvatar.setOnClickListener(v -> choicePhoto()); + binding.settingTitleBar.setOnBackIconClickListener(v -> onBackPressed()); + + binding.flName.setOnClickListener( + v -> EditUserInfoActivity.launch(getApplicationContext(), Constant.EDIT_NAME, launcher)); + binding.flEmail.setOnClickListener( + v -> EditUserInfoActivity.launch(getApplicationContext(), Constant.EDIT_EMAIL, launcher)); + binding.flPhone.setOnClickListener( + v -> { + if (bean != null && bean.getPhoneBind() == false) { + Intent intent = new Intent(UserInfoActivity.this, ChangeAccoutActionActivity.class); + intent.putExtra("type", ChangeAccoutActionActivity.TYPE_BIND_PHONE); + startActivity(intent); + } else { + startActivity(new Intent(this, ChangePhoneActivity.class)); + } + }); + binding.flSign.setOnClickListener( + v -> EditUserInfoActivity.launch(getApplicationContext(), Constant.EDIT_SIGN, launcher)); +// binding.ivBack.setOnClickListener(v -> finish()); + binding.flBirthday.setOnClickListener(v -> showTimerPicker(userInfo.getBirthday())); + + binding.ivAccountCopy.setOnClickListener(v -> copyAccount()); +// binding.tvAccount.setOnClickListener(v -> copyAccount()); + binding.cardView.setOnClickListener(v -> { + if (loginBean != null && loginBean.getUser() != null && !TextUtils.isEmpty(loginBean.getUser().getPostHomepageBackground())) { + List urls = new ArrayList<>(); + String url = IMUIKitConfig.OSS_URL + loginBean.getUser().getPostHomepageBackground(); + urls.add(url); + ImagePreview + .getInstance() + // 上下文,必须是activity,不需要担心内存泄漏,本框架已经处理好; + .setContext(this) + // 设置从第几张开始看(索引从0开始) + .setIndex(0) + .setIndicatorShapeResId(0) + // 2:直接传url List + .setImageList(urls) + + // 开启预览 + .start(); + + } + }); + binding.cavAvatar.setOnClickListener(v -> { + if (loginBean != null && loginBean.getUser() != null && !TextUtils.isEmpty(loginBean.getUser().getUserAvatarFileName())) { + List urls = new ArrayList<>(); + if (userInfo != null) { + urls.add(userInfo.getAvatar()); + } +// urls.add(loginBean.getUser().getUserAvatarFileName()); + ImagePreview + .getInstance() + // 上下文,必须是activity,不需要担心内存泄漏,本框架已经处理好; + .setContext(this) + // 设置从第几张开始看(索引从0开始) + .setIndex(0) + .setIndicatorShapeResId(0) + // 2:直接传url List + .setImageList(urls) + + // 开启预览 + .start(); + } + }); + binding.flSexual.setOnClickListener( + v -> { +// ArrayList content = new ArrayList<>(); +// content.add(getResources().getString(R.string.sexual_male)); +// content.add(getResources().getString(R.string.sexual_female)); + int selectIndex = -1; + if (userInfo.getGenderEnum() == GenderEnum.MALE) { + selectIndex = 0; + } else if (userInfo.getGenderEnum() == GenderEnum.FEMALE) { + selectIndex = 1; + } +// TypeSelectActivity.launch( +// UserInfoActivity.this, +// getResources().getString(R.string.user_info_sexual), +// content, +// selectIndex, +// launcher); + SelectSexDialog selectSexDialog = new SelectSexDialog(UserInfoActivity.this, selectIndex); + selectSexDialog.setOnToVipListener(new SelectSexDialog.OnToTypeListener() { + @Override + public void toType(int type) { + updateUserInfo(UserField.Gender, type + 1); + } + }); + selectSexDialog.show(); + }); + + binding.qrcodeFy.setOnClickListener(v -> { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + showQrcodeView(); + } + }); + + binding.editheadFy.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + toEditHead(); + + } + }); + + if (AppSkinConfig.getInstance().getAppSkinStyle() == AppSkinConfig.AppSkin.commonSkin) { + setCommonSkin(); + } + getUserInfo(IMKitClient.account()); + binding.flidAddSc.setOnClickListener(v -> changeButton(binding.flidAddSc)); + binding.flAccount.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startActivityForResult(new Intent(UserInfoActivity.this, SettingAccoutIdActivity.class), 888); + } + }); + } + + private void changeButton(SwitchCompat checkBox) { + Map maps = new HashMap<>(); + maps.put("allowSearchById", checkBox.isChecked() ? 1 : 0); + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + + Api.getInstance().authUser(IMKitClient.account(), maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver() { + @Override + public void onSuccess(Result feedbackResp) { + getUserInfo(IMKitClient.account()); + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + } + }); + } + + BindBean bean; + + private void bindInfo(String user_uid) { + Api.getInstance().bindInfo(user_uid) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + bean = feedbackResp.data; + //只有这是个参数允许切换 + binding.tvPhone.setText(bean.getAreaCode() + "" + bean.getPhone()); + + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); +// WidgetUtils.showToast(getActivity(), msg, WidgetUtils.ToastType.ERROR); + } + }); + } + + private void toEditHead() { + UserHeadEditActivity.launch( + UserInfoActivity.this, + new ActivityResultLauncher() { + @Override + public void launch(Intent input, @Nullable ActivityOptionsCompat options) { + startActivity(input); + } + + @Override + public void unregister() { + } + + @NonNull + @Override + public ActivityResultContract getContract() { + return null; + } + }); + + } + + + private void setCommonSkin() { + int cornerRadius = SizeUtils.dp2px(4); + binding.cavAvatar.setCornerRadius(cornerRadius); + + changeStatusBarColor(R.color.fun_page_bg_color); + + binding.clRoot.setBackgroundResource(R.color.fun_page_bg_color); + + binding.llUserInfo.setBackgroundResource(R.color.color_white); + ViewGroup.MarginLayoutParams layoutParamsN = + (ViewGroup.MarginLayoutParams) binding.llUserInfo.getLayoutParams(); + layoutParamsN.setMargins(0, SizeUtils.dp2px(4), 0, 0); + binding.llUserInfo.setLayoutParams(layoutParamsN); + + binding.flSign.setBackgroundResource(R.color.color_white); + ViewGroup.MarginLayoutParams layoutParamsS = + (ViewGroup.MarginLayoutParams) binding.flSign.getLayoutParams(); + layoutParamsS.setMargins(0, SizeUtils.dp2px(6), 0, 0); + binding.flSign.setLayoutParams(layoutParamsS); + + } + + @Override + protected void onResume() { + super.onResume(); + loginBean = DataUtils.getLocUserInfo(); + if (loginBean != null) { + if (!TextUtils.isEmpty(loginBean.getUser().getPostHomepageBackground())) { + String pram = loginBean.getUser().getPostHomepageBackground(); + String url = IMUIKitConfig.OSS_URL + pram; + Glide.with(UserInfoActivity.this) + .load(url) + .into(binding.forbgIv); + } + } + loadData(IMKitClient.account()); + bindInfo(IMKitClient.account()); + getWallet(); + } + + LoginBean locUser; + + private void getUserInfo(String user_uid) { + Api.getInstance().userInfo(user_uid) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result feedbackResp) { + locUser = feedbackResp.data; + changeIndex(feedbackResp.data); + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + } + }); + + + } + + private void changeIndex(LoginBean data) { + binding.flidAddSc.setChecked(data.getAllowSearchById() == 1); + if (data != null && !TextUtils.isEmpty(data.getNwId())) { + binding.tvAccountTip.setText(data.getNwId()); + } else { + binding.tvAccountTip.setText(""); + } + } + + private void loadData(String account) { + CommonRepo.getUserInfo( + account, + new FetchCallback() { + @Override + public void onSuccess(@Nullable UserInfo param) { + refreshUserInfo(param); + } + + @Override + public void onFailed(int code) { + ToastX.showShortToast(R.string.user_fail); + refreshUserInfo(new UserInfo(account, account, "")); + } + + @Override + public void onException(@Nullable Throwable exception) { + ToastX.showShortToast(R.string.user_fail); + refreshUserInfo(new UserInfo(account, account, "")); + } + }); + } + + private void copyAccount() { + ClipboardManager cmb = + (ClipboardManager) + IMKitClient.getApplicationContext().getSystemService(Context.CLIPBOARD_SERVICE); + ClipData clipData = null; +// if(loginBean!=null&&!TextUtils.isEmpty(loginBean.getNwId())){ +// clipData = ClipData.newPlainText(null, loginBean.getNwId()); +// }else{ +// if (userInfo != null) { +// clipData = ClipData.newPlainText(null, userInfo.getAccount()); +// } +// } + if (locUser != null) { + clipData = ClipData.newPlainText(null, locUser.getNwId()); + cmb.setPrimaryClip(clipData); + ToastX.showShortToast(R.string.action_copy_success); + } + + } + + private void choicePhoto() { + BasePhotoChoiceDialog choiceDialog; + if (AppSkinConfig.getInstance().getAppSkinStyle() == AppSkinConfig.AppSkin.commonSkin) { + choiceDialog = new FunPhotoChoiceDialog(this); + } else { + choiceDialog = new PhotoChoiceDialog(this); + } + choiceDialog.show( + new CommonCallback() { + @Override + public void onSuccess(@Nullable File param) { + if (NetworkUtils.isConnected()) { + CommonRepo.uploadImage( + param, + new FetchCallback() { + @Override + public void onSuccess(@Nullable String urlParam) { + Map map = new HashMap<>(1); + map.put(UserField.Avatar, urlParam); + CommonRepo.updateUserInfo( + map, + new FetchCallback() { + @Override + public void onSuccess(@Nullable Void param) { + resultCode = RESULT_OK; + loadData(IMKitClient.account()); + } + + @Override + public void onFailed(int code) { + Toast.makeText( + getApplicationContext(), + getString(R.string.request_fail), + Toast.LENGTH_SHORT) + .show(); + } + + @Override + public void onException(@Nullable Throwable exception) { + Toast.makeText( + getApplicationContext(), + getString(R.string.request_fail), + Toast.LENGTH_SHORT) + .show(); + } + }); + } + + @Override + public void onFailed(int code) { + Toast.makeText( + getApplicationContext(), + getString(R.string.request_fail), + Toast.LENGTH_SHORT) + .show(); + } + + @Override + public void onException(@Nullable Throwable exception) { + Toast.makeText( + getApplicationContext(), + getString(R.string.request_fail), + Toast.LENGTH_SHORT) + .show(); + } + }); + } else { + Toast.makeText( + getApplicationContext(), + getString(R.string.network_error), + Toast.LENGTH_SHORT) + .show(); + } + } + + @Override + public void onFailed(int code) { + Toast.makeText( + getApplicationContext(), getString(R.string.request_fail), Toast.LENGTH_SHORT) + .show(); + } + + @Override + public void onException(@Nullable Throwable exception) { + Toast.makeText( + getApplicationContext(), getString(R.string.request_fail), Toast.LENGTH_SHORT) + .show(); + } + }); + } + + String shengri; + + private void refreshUserInfo(UserInfo userInfo) { + if (userInfo == null) { + return; + } + this.userInfo = userInfo; + String avatarUrl = userInfo.getAvatar(); + if (TextUtils.isEmpty(avatarUrl)) { + binding.cavAvatar.setData( + R.mipmap.default_head_img, "", 0); + } else { + binding.cavAvatar.setData( + userInfo.getAvatar(), "", + AvatarColor.avatarColor(IMKitClient.account())); + } + + binding.tvName.setText(userInfo.getName()); + int sexualValue = R.string.sexual_unknown; + if (userInfo.getGenderEnum() == GenderEnum.MALE) { + sexualValue = R.string.sexual_male; + } else if (userInfo.getGenderEnum() == GenderEnum.FEMALE) { + sexualValue = R.string.sexual_female; + } +// binding.tvAccount.setText(userInfo.getAccount()); + + if (locUser != null && !TextUtils.isEmpty(locUser.getNwId())) { + binding.tvAccountTip.setText(locUser.getNwId()); + } else { + binding.tvAccountTip.setText(""); + } + binding.tvSexual.setText(sexualValue); + binding.tvBirthday.setText(userInfo.getBirthday()); + shengri = userInfo.getBirthday(); + binding.tvPhone.setText(userInfo.getMobile().replace("-", "")); + binding.tvEmail.setText(userInfo.getEmail()); + binding.tvSign.setText(userInfo.getSignature()); + } + + private void showTimerPicker(String date) { + String beginTime = "1900-01-01 00:00"; + String endTime = DateFormatUtils.long2Str(System.currentTimeMillis(), true); + shengri = date; + if (TextUtils.isEmpty(date)) { + date = endTime; + } + // 通过日期字符串初始化日期,格式请用:yyyy-MM-dd HH:mm + CustomDatePickerNew mTimerPicker = + new CustomDatePickerNew( + this, + new CustomDatePicker.Callback() { + @Override + public void onTimeSelected(long timestamp) { + updateUserInfo(UserField.Birthday, DateFormatUtils.long2Str(timestamp, false)); + } + }, + beginTime, + endTime, shengri); + // 允许点击屏幕或物理返回键关闭 + mTimerPicker.setCancelable(true); + // 显示时和分 + mTimerPicker.setCanShowPreciseTime(false); + // 允许循环滚动 + mTimerPicker.setScrollLoop(false); + // 允许滚动动画 + mTimerPicker.setCanShowAnim(false); + mTimerPicker.show(date); + } + + private void updateUserInfo(UserField field, Object value) { + Map map = new HashMap<>(1); + map.put(field, value); + CommonRepo.updateUserInfo( + map, + new FetchCallback() { + @Override + public void onSuccess(@Nullable Void param) { + resultCode = RESULT_OK; + // binding.tvBirthday.setText(birthday); + loadData(IMKitClient.account()); + } + + @Override + public void onFailed(int code) { + if (code == Constant.NETWORK_ERROR_CODE) { + Toast.makeText( + getApplicationContext(), + getString(R.string.network_error), + Toast.LENGTH_SHORT) + .show(); + } else { + Toast.makeText( + getApplicationContext(), getString(R.string.request_fail), Toast.LENGTH_SHORT) + .show(); + } + } + + @Override + public void onException(@Nullable Throwable exception) { + Toast.makeText( + getApplicationContext(), getString(R.string.request_fail), Toast.LENGTH_SHORT) + .show(); + } + }); + } + + @Override + public void finish() { + setResult(resultCode); + super.finish(); + } + + public static void launch(Context context, @NonNull ActivityResultLauncher launcher) { + Intent intent = new Intent(context, UserInfoActivity.class); + launcher.launch(intent); + } + + + private ImageView coloseIv; + private LinearLayout qrcodeLy; + private ImageView qrcodeIv; + private TextView qrcodeTipsTv; + private LinearLayout qrcodeActionLy; + private TextView copyTv; + private TextView shareTv; + private TextView saveTv; + private TextView shuaxinTv; + private AppCompatButton saomiaoBt; + + @RequiresApi(api = Build.VERSION_CODES.M) + private void showQrcodeView() { + BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(this, R.style.BottomSheetDialog); + + View bottomView = LayoutInflater.from(UserInfoActivity.this).inflate(R.layout.bottom_sheet_qrcode_layout1, null); + + coloseIv = (ImageView) bottomView.findViewById(R.id.colose_iv); + qrcodeLy = (LinearLayout) bottomView.findViewById(R.id.qrcode_ly); + qrcodeIv = (ImageView) bottomView.findViewById(R.id.qrcode_iv); + qrcodeTipsTv = (TextView) bottomView.findViewById(R.id.qrcode_tips_tv); + qrcodeActionLy = (LinearLayout) bottomView.findViewById(R.id.qrcode_action_ly); + copyTv = (TextView) bottomView.findViewById(R.id.copy_tv); + shareTv = (TextView) bottomView.findViewById(R.id.share_tv); + saveTv = (TextView) bottomView.findViewById(R.id.save_tv); + shuaxinTv = (TextView) bottomView.findViewById(R.id.shuaxin_tv); + saomiaoBt = (AppCompatButton) bottomView.findViewById(R.id.saomiao_bt); + LoginBean loginBean = DataUtils.getLocUserInfo(); + Bitmap bitmap = CodeUtils.createQRCode(String.format(IMUIKitConfig.SHARE_INVCODE1, IMKitClient.account()), DataUtils.dip2px(this, 175.0f), null); + if (loginBean != null) { + bitmap = CodeUtils.createQRCode(String.format(IMUIKitConfig.SHARE_ADD_USER, loginBean.getUser().getInviteCode(), IMKitClient.account()), DataUtils.dip2px(this, 175.0f), null); + } + if (bitmap != null) { + qrcodeIv.setImageBitmap(bitmap); + } + + shuaxinTv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + ToastX.showShortToast(R.string.shuaxinchenggong_txt); + } + }); + coloseIv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + bottomSheetDialog.dismiss(); + } + }); + saveTv.setOnClickListener(v -> { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { +// if (PermissionUtils.hasPermissions( +// UserInfoActivity.this, Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO)) { +// doSaveQrcode(); +// } else { +// requestCameraPermission( +// ); +// } + doSaveQrcode(); + } else { + if (PermissionUtils.hasPermissions( + UserInfoActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE)) { + doSaveQrcode(); + } else { + requestCameraPermission( + Manifest.permission.READ_EXTERNAL_STORAGE); + } + } + }); + + shareTv.setOnClickListener(v -> { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { +// if (PermissionUtils.hasPermissions( +// UserInfoActivity.this, Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO)) { +// showBottomShare(); +// } else { +// requestCameraPermission(); +// } + showBottomShare(); + } else { + if (PermissionUtils.hasPermissions( + UserInfoActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE)) { + showBottomShare(); + } else { + requestCameraPermission( + Manifest.permission.READ_EXTERNAL_STORAGE); + } + } + }); + + copyTv.setOnClickListener(v -> { + if (loginBean != null) { + LogUtils.i("数据是啥:" + GsonUtils.beanToJSONString(loginBean)); + String url = String.format(IMUIKitConfig.SHARE_INVCODE, loginBean.getUser().getInviteCode(), IMKitClient.account()); + DataUtils.copy(url, UserInfoActivity.this); + ToastX.showShortToast(R.string.fuzhichenggong_txt); + } + }); + saomiaoBt.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + bottomSheetDialog.dismiss(); + toScan(); + } + }); + + + bottomSheetDialog.setContentView(bottomView); + bottomSheetDialog.show(); + + bottomSheetDialog.setOnDismissListener(dialog -> getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white))); + AdaptScreenUtils.setWhiteNavigationBar(bottomSheetDialog); + + } + + public void toScan() { + if (PermissionUtils.hasPermissions( + UserInfoActivity.this, Manifest.permission.CAMERA)) { + ScanUtilNew.startScan(UserInfoActivity.this, MainActivity.REQUEST_CODE_FOR_QRCODE_SCAN, + new HmsScanAnalyzerOptions.Creator().setHmsScanTypes(HmsScan.ALL_SCAN_TYPE).create()); + } else { + + permissionLauncher1.launch(new String[]{Manifest.permission.CAMERA}); + + } + } + + @RequiresApi(api = Build.VERSION_CODES.M) + public void showBottomShare() { + + titleUsers = shareDateUtils.getConverstionShareInfo(); + titleUsersIsCheck = new ArrayList<>(); + for (UserShareBean conversationInfo : titleUsers) { + titleUsersIsCheck.add(false); + } + + + LogUtils.i("获取数据:" + GsonUtils.beanToJSONString(titleUsers)); + if (titleUsers == null || titleUsers.size() == 0) { + ToastX.showShortToast(R.string.mykfxfddx_txt); + return; + } + + BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(this, R.style.BottomSheetDialog); + + View bottomView = LayoutInflater.from(UserInfoActivity.this).inflate(R.layout.bottom_sheet_layout, null); + + + coloseIvShare = (ImageView) bottomView.findViewById(R.id.colose_iv); + recyclerShare = (RecyclerView) bottomView.findViewById(R.id.recycler); + commentEtShare = (EditText) bottomView.findViewById(R.id.comment_et); + + shareBt = (TextView) bottomView.findViewById(R.id.share_bt); + initList(); + bottomSheetDialog.setContentView(bottomView); + bottomSheetDialog.show(); + coloseIvShare.setOnClickListener(v -> bottomSheetDialog.dismiss()); + shareBt.setOnClickListener(v -> { + + boolean isSelect = false; + for (Boolean type : titleUsersIsCheck) { + if (type) { + isSelect = true; + } + } + if (!isSelect) { + ToastX.showShortToast(getString(R.string.qxxzyfxddx_txt)); + return; + } + doSaveQrcodeShare(bottomSheetDialog); + }); + bottomSheetDialog.setOnDismissListener(dialog -> getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white))); + AdaptScreenUtils.setWhiteNavigationBar(bottomSheetDialog); + } + + private ImageView coloseIvShare; + private RecyclerView recyclerShare; + private EditText commentEtShare; + private TextView shareBt; + private LinearLayoutManager linearLayoutManager; + private CommonAdapter commonAdapter; + private ArrayList titleUsers; + private ArrayList titleUsersIsCheck; + ShareDateUtils shareDateUtils; + + private void initList() { + + + linearLayoutManager = new LinearLayoutManager(UserInfoActivity.this); + linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); + recyclerShare.setLayoutManager(linearLayoutManager); + commonAdapter = new CommonAdapter<>(UserInfoActivity.this, R.layout.item_share_list, titleUsers) { + @Override + public void convert(ViewHolder holder, UserShareBean s, int index) { + ImageView select_iv = holder.getView(R.id.select_iv); + if (titleUsersIsCheck.get(index)) { + select_iv.setImageResource(R.mipmap.dialog_item_gou); + } else { + select_iv.setImageResource(R.mipmap.dialog_item_quan); + } + + ContactAvatarView imageView = holder.getView(R.id.logo_iv); + + if (s.getTeamInfo() != null) { + if (TextUtils.isEmpty(s.getTeamInfo().getIcon())) { + imageView.setData(com.netease.yunxin.kit.conversationkit.ui.R.drawable.ic_group_defaulthead, s.getTeamInfo().getName()); + } else { + imageView.setData( + s.getTeamInfo().getIcon(), s.getTeamInfo().getName(), AvatarColor.avatarColor(s.getTeamInfo().getId())); + } + holder.setText(R.id.title_tv, s.getTeamInfo().getName()); + } else { + NimUserInfo user = NIMClient.getService(UserService.class).getUserInfo(s.getFriendInfo().getAccount()); + if (user != null) { + ColorUtils.loadAvator(user.getAvatar(), imageView); +// imageView.setData( +// user.getAvatar(), user.getName(), AvatarColor.avatarColor(user.getAccount())); + holder.setText(R.id.title_tv, user.getName()); + } + + } + + + holder.getView(R.id.big_bg).setOnClickListener(v -> { + titleUsersIsCheck.set(index, !titleUsersIsCheck.get(index)); + commonAdapter.notifyItemChanged(index, titleUsersIsCheck.get(index)); + LogUtils.i("0000000000"); + + changeItemButton(); + }); + } + }; + recyclerShare.setAdapter(commonAdapter); + } + + + private void requestCameraPermission(String permission) { + permissionLauncher.launch(new String[]{permission}); + } + + protected ActivityResultLauncher permissionLauncher; + protected ActivityResultLauncher permissionLauncher1; + + private void requestCameraPermission() { + permissionLauncher.launch(new String[]{Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO}); + } + + private void changeItemButton() { + LogUtils.i("1111111111111111"); + boolean isSelcet = false; + for (boolean item : titleUsersIsCheck) { + if (item) { + isSelcet = true; + break; + } + } + chagnBottom(isSelcet); + + } + + private void chagnBottom(boolean b) { + LogUtils.i("22222222222:" + b); + + if (b) { + shareBt.setBackground(getResources().getDrawable(R.drawable.button_true_bg)); + shareBt.setEnabled(true); + } else { + shareBt.setBackground(getResources().getDrawable(R.drawable.button_false_bg_new)); + shareBt.setEnabled(false); + + } + } + + /** + * 将2维码保存到系统相册。 + */ + private void doSaveQrcode() { + // 先生成bitmap对象 + Bitmap bmp = DataUtils.generateBitmap(qrcodeLy); + // bitmap对象生成成功 + if (bmp != null) { + // 保存到相册成功 + if (ToolKits.saveBmp2Gallery(UserInfoActivity.this, bmp)) { + ToastX.showShortToast(getString(R.string.qrcode_generate_activity_qr_save_sucess)); + } else { + ToastX.showShortToast(getString(R.string.qrcode_generate_activity_qr_save_fail)); + } + } else { + Log.w("doSaveQrcode", "将2维码保存到相册时失败了,从view生成Bitmap对象失败,生成后的bmp=null!"); + ToastX.showShortToast(getString(R.string.qrcode_generate_activity_qr_generate_fail)); + } + } + + + /** + * 将2维码保存到系统相册。 + */ + private void doSaveQrcodeShare(BottomSheetDialog bottomSheetDialog) { + // 先生成bitmap对象 + Bitmap bmp = DataUtils.generateBitmap(qrcodeLy); + // bitmap对象生成成功 + if (bmp != null) { + // 保存到相册成功 + + Uri fileUri = ToolKits.saveBmp2GalleryShare(UserInfoActivity.this, bmp); + if (fileUri != null) { +// ToastX.showShortToast(getString(R.string.qrcode_generate_activity_qr_save_sucess)); + sendMessage(fileUri); + } else { + ToastX.showShortToast(getString(R.string.qrcode_generate_activity_qr_save_fail)); + } + } else { + Log.w("doSaveQrcode", "将2维码保存到相册时失败了,从view生成Bitmap对象失败,生成后的bmp=null!"); + ToastX.showShortToast(getString(R.string.qrcode_generate_activity_qr_generate_fail)); + } + bottomSheetDialog.dismiss(); + } + + Handler mHandler = new Handler(); + + private void sendMessage(Uri uri) { + + mHandler.postDelayed(() -> { + File imageFile = UriUtils.uri2File(uri); + + for (int i = 0; i < titleUsersIsCheck.size(); i++) { + if (titleUsersIsCheck.get(i)) { + toShareMessage(titleUsers.get(i), imageFile); + } + } + + }, 100); + + } + + + private void toShareMessage(UserShareBean conversationInfo, File imageFile) { + IMMessage imageMsg = null; + if (conversationInfo.getTeamInfo() != null) { + imageMsg = MessageBuilder.createImageMessage(conversationInfo.getTeamInfo().getId(), SessionTypeEnum.Team, imageFile); + } else if (conversationInfo.getFriendInfo() != null) { + imageMsg = MessageBuilder.createImageMessage(conversationInfo.getFriendInfo().getAccount(), SessionTypeEnum.P2P, imageFile); + } + if (imageMsg != null) { + ChatRepo.sendMessage( + imageMsg, + false, + new FetchCallbackImpl() { + @Override + public void onSuccess(@Nullable Void param) { + super.onSuccess(param); + ToastX.showShortToast(R.string.qrcode_share_succ_txt); + } + + @Override + public void onFailed(int code) { + + } + }); + } + } + + + private ImageView coloseIv1; + private TextView joinTitleTv; + private ContactAvatarView groupHeadIv; + private TextView joinTv; + private TextView groupNameTv; + + private void showQrcodeView(String groupId) { + BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(this, R.style.BottomSheetDialog); + + View bottomView = LayoutInflater.from(UserInfoActivity.this).inflate(R.layout.bottom_sheet_join_group, null); + coloseIv1 = (ImageView) bottomView.findViewById(R.id.colose_iv); + joinTitleTv = (TextView) bottomView.findViewById(R.id.join_title_tv); + groupHeadIv = (ContactAvatarView) bottomView.findViewById(R.id.group_head_iv); + joinTv = (TextView) bottomView.findViewById(R.id.join_tv); + groupNameTv = (TextView) bottomView.findViewById(R.id.group_name_tv); + Team team = NIMClient.getService(TeamService.class).queryTeamBlock(groupId); + if (team != null) { + groupHeadIv.setData(team.getIcon(), team.getName()); + groupNameTv.setText(team.getName()); + if (team.isMyTeam()) { + LogUtils.i("加入群聊成功1111111111111111111"); + joinTitleTv.setText(R.string.jinru_group_txt); + joinTv.setText(R.string.jinru_group_txt); + } else { + LogUtils.i("加入群聊成功22222222222222"); + + joinTitleTv.setText(R.string.join_group_txt); + joinTv.setText(R.string.join_group_txt); + } + joinTv.setOnClickListener(v -> { + if (team.isMyTeam()) { + bottomSheetDialog.dismiss(); + XKitRouter.withKey(RouterConstant.PATH_FUN_CHAT_TEAM_PAGE) + .withParam(RouterConstant.CHAT_KRY, team) + .withContext(UserInfoActivity.this) + .navigate(); + LogUtils.i("加入群聊成功33333333333333"); + + } else { + NIMClient.getService(TeamService.class).applyJoinTeam(groupId, null).setCallback(new RequestCallback() { + @Override + public void onSuccess(Team team1) { + LogUtils.i("加入群聊成功4444444444444444444"); + + LogUtils.i("加入群聊成功:" + GsonUtils.beanToJSONString(team1)); + bottomSheetDialog.dismiss(); + + XKitRouter.withKey(RouterConstant.PATH_FUN_CHAT_TEAM_PAGE) + .withParam(RouterConstant.CHAT_KRY, team1) + .withContext(UserInfoActivity.this) + .navigate(); + } + + @Override + public void onFailed(int code) { + //仅仅是申请成功,code 808 + if (code == ResponseCode.RES_TEAM_APPLY_SUCCESS) { + bottomSheetDialog.dismiss(); + + ToastX.showShortToast(R.string.dendaiqueren_txt); + } + // 已经在群里,code 809 + else if (code == ResponseCode.RES_TEAM_ALREADY_IN) { + bottomSheetDialog.dismiss(); + getJoinInfo(groupId, true); + // 群人数已达上限 + } else if (code == ResponseCode.RES_TEAM_LIMIT) { + bottomSheetDialog.dismiss(); + + ToastX.showShortToast(R.string.team_num_limit); + } else { + bottomSheetDialog.dismiss(); + + ToastX.showShortToast("failed, error code =" + code); + + } + } + + @Override + public void onException(Throwable exception) { + // error + bottomSheetDialog.dismiss(); + + ToastX.showShortToast(exception.getMessage()); + + } + }); + } + }); + } else { + joinTitleTv.setText(R.string.join_group_txt); + joinTv.setText(R.string.join_group_txt); + getJoinInfo(groupId, false); + LogUtils.i("加入群聊成功555555555555"); + + joinTv.setOnClickListener(v -> NIMClient.getService(TeamService.class).applyJoinTeam(groupId, null).setCallback(new RequestCallback() { + @Override + public void onSuccess(Team team1) { + LogUtils.i("加入群聊成功:" + GsonUtils.beanToJSONString(true)); + LogUtils.i("加入群聊成功6666666666666666"); + + XKitRouter.withKey(RouterConstant.PATH_FUN_CHAT_TEAM_PAGE) + .withParam(RouterConstant.CHAT_KRY, team1) + .withContext(UserInfoActivity.this) + .navigate(); + } + + @Override + public void onFailed(int code) { + //仅仅是申请成功,code 808 + if (code == ResponseCode.RES_TEAM_APPLY_SUCCESS) { + bottomSheetDialog.dismiss(); + + ToastX.showShortToast(R.string.dendaiqueren_txt); + } + // 已经在群里,code 809 + else if (code == ResponseCode.RES_TEAM_ALREADY_IN) { + bottomSheetDialog.dismiss(); + + getJoinInfo(groupId, true); + // 群人数已达上限 + } else if (code == ResponseCode.RES_TEAM_LIMIT) { + bottomSheetDialog.dismiss(); + + ToastX.showShortToast(R.string.team_num_limit); + } else { + bottomSheetDialog.dismiss(); + + ToastX.showShortToast("failed, error code =" + code); + + } + } + + @Override + public void onException(Throwable exception) { + // error + ToastX.showShortToast(exception.getMessage()); + + } + })); + + } + + + coloseIv1.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + bottomSheetDialog.dismiss(); + } + }); + + bottomSheetDialog.setContentView(bottomView); + bottomSheetDialog.show(); + + bottomSheetDialog.setOnDismissListener(dialog -> getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white))); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + AdaptScreenUtils.setWhiteNavigationBar(bottomSheetDialog); + } + + } + + private void getJoinInfo(String gid, boolean b) { + NIMClient.getService(TeamService.class).searchTeam(gid).setCallback(new RequestCallback() { + @Override + public void onSuccess(Team result) { + if (!b) { + LogUtils.i("加入群聊成功7777777777777777"); + groupHeadIv.setData(result.getIcon(), result.getName()); + groupNameTv.setText(result.getName()); + } else { + LogUtils.i("加入群聊成功88888888888888"); + + XKitRouter.withKey(RouterConstant.PATH_FUN_CHAT_TEAM_PAGE) + .withParam(RouterConstant.CHAT_KRY, result) + .withContext(UserInfoActivity.this) + .navigate(); + } + + } + + @Override + public void onFailed(int code) { + + } + + @Override + public void onException(Throwable exception) { + + } + }); + } + +} diff --git a/app/src/main/java/com/dskj/rbchat/main/mine/photo/AddPhotoActivity.java b/app/src/main/java/com/dskj/rbchat/main/mine/photo/AddPhotoActivity.java new file mode 100644 index 0000000..d0661a2 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/mine/photo/AddPhotoActivity.java @@ -0,0 +1,589 @@ +package com.dskj.rbchat.main.mine.photo; + +import android.Manifest; +import android.content.res.ColorStateList; +import android.graphics.Rect; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.view.View; +import android.widget.ImageView; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.ItemTouchHelper; +import androidx.recyclerview.widget.RecyclerView; + +import com.alibaba.sdk.android.oss.ClientException; +import com.alibaba.sdk.android.oss.OSSClient; +import com.alibaba.sdk.android.oss.ServiceException; +import com.alibaba.sdk.android.oss.callback.OSSCompletedCallback; +import com.alibaba.sdk.android.oss.common.auth.OSSCredentialProvider; +import com.alibaba.sdk.android.oss.common.auth.OSSStsTokenCredentialProvider; +import com.alibaba.sdk.android.oss.model.PutObjectRequest; +import com.alibaba.sdk.android.oss.model.PutObjectResult; +import com.bumptech.glide.Glide; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.base.LllChatBaseActivity; +import com.dskj.rbchat.databinding.ActivityAddphotosBinding; +import com.dskj.rbchat.dialog.SelectPhotoTypeDialog; +import com.dskj.rbchat.model.StsCredentialsBean; +import com.dskj.rbchat.model.UserAlbumBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.AdaptScreenUtils; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.ItemDragTouchHelperCallback; +import com.dskj.rbchat.utils.LogUtils; +import com.google.gson.Gson; +import com.luck.picture.lib.basic.PictureSelector; +import com.luck.picture.lib.config.SelectMimeType; +import com.luck.picture.lib.entity.LocalMedia; +import com.luck.picture.lib.interfaces.OnResultCallbackListener; +import com.luck.picture.lib.style.BottomNavBarStyle; +import com.luck.picture.lib.style.PictureSelectorStyle; +import com.luck.picture.lib.style.SelectMainStyle; +import com.luck.picture.lib.style.TitleBarStyle; +import com.netease.yunxin.kit.chatkit.ui.common.GlideEngine; +import com.netease.yunxin.kit.chatkit.ui.dialog.PermissionExplainDialog; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.common.utils.PermissionUtils; +import com.netease.yunxin.kit.common.utils.SizeUtils; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; +import okhttp3.MediaType; +import okhttp3.RequestBody; + +/** + * 创建相册 + */ +public class AddPhotoActivity extends LllChatBaseActivity implements TextWatcher { + + ActivityAddphotosBinding binding; + List uris = new ArrayList<>(); + List uriStrings = new ArrayList<>(); + List localMedias = new ArrayList<>(); + List outputStrings = new ArrayList<>(); + protected ActivityResultLauncher permissionLauncher; + CommonAdapter commonAdapter; + + + @Override + public int initNavigationBarColor() { + return getColor(R.color.color_white); + } + + @Override + public int initStatusBarColor() { + return getColor(R.color.color_titlebar); + } + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = ActivityAddphotosBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + binding.addphotoTitleBar.setOnBackIconClickListener(view -> finish()); + initAdapter(); + permissionLauncher = + registerForActivityResult( + new ActivityResultContracts.RequestMultiplePermissions(), + result -> { + if (result != null) { + for (Map.Entry entry : result.entrySet()) { + String permission = entry.getKey().toString(); + boolean grant = (Boolean) entry.getValue(); + if (grant) { + if (TextUtils.equals( + permission, Manifest.permission.READ_EXTERNAL_STORAGE) || TextUtils.equals( + permission, Manifest.permission.READ_MEDIA_IMAGES) || TextUtils.equals( + permission, Manifest.permission.READ_MEDIA_VIDEO)) { + startPickMedia(); + } + } else { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (shouldShowRequestPermissionRationale(permission)) { + ToastX.showShortToast(getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_deny_tips)); + } else { + ToastX.showShortToast(getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_storage)); + } + } + } + } + } + if (permissionExplainDialog != null) { + permissionExplainDialog.dismiss(); + } + }); + binding.editUserphotoMingcheng.addTextChangedListener(this); + + binding.editUserphotoMima.addTextChangedListener(this); + + binding.tvUserphotoCreate.setOnClickListener(view -> { + createPhoto(); + }); + binding.llUserphototype.setOnClickListener(view -> { + selectPhotoType(); + }); + + + } + + boolean isPush = false; + + //创建相册 + public void createPhoto() { + if (TextUtils.isEmpty(binding.editUserphotoMingcheng.getText().toString())) { + ToastX.showShortToast(R.string.userphoto_create_toast); + return; + } + + if (isPush) { + return; + } + + isPush = true; + toShangchuanAli(); + } + + StsCredentialsBean stsCredentialsBean; + + private void toShangchuanAli() { + showLoading(); + if (uriStrings.size() == 1) { + toSubmit(); + return; + } + Api.getInstance().stsCredentials() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + stsCredentialsBean = feedbackResp.data; + toAliYunOss(); + } + + @Override + public void onError(int code, String msg) { + dismissLoading(); + } + }); + } + + private void toAliYunOss() { + String endpoint = "https://oss-cn-hongkong.aliyuncs.com"; + String accessKeyId = stsCredentialsBean.getAccessKeyId(); + String accessKeySecret = stsCredentialsBean.getAccessKeySecret(); + String securityToken = stsCredentialsBean.getSecurityToken(); + String bucketName = IMUIKitConfig.bucketName; + OSSCredentialProvider credentialProvider = new OSSStsTokenCredentialProvider(accessKeyId, accessKeySecret, securityToken); + OSSClient oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider); + toUpdateOss(bucketName, 0, oss); + + } + + private void toUpdateOss(String bucketName, int i, OSSClient oss) { + String picPath = "user_album"; + String data = DataUtils.getCurrentTimeTypeNoline(System.currentTimeMillis()); + if (i < uris.size()) { + +// File file = new File(uriStrings.get(i)); + String fileName = System.currentTimeMillis() + "_" + localMedias.get(i).getFileName(); + LogUtils.i("上传文件是啥:" + GsonUtils.beanToJSONString(localMedias.get(i))); + LogUtils.i("上传文件是啥:" + fileName); + + // 构造上传请求。 + PutObjectRequest put = new PutObjectRequest(bucketName, "media/" + picPath + "/" + data + "/" + fileName, localMedias.get(i).getRealPath()); + put.setProgressCallback((request, currentSize, totalSize) -> { + LogUtils.i("PutObject", "currentSize: " + currentSize + " totalSize: " + totalSize); +// if(isVideo){ +// showLoadingDialog(("正在上传"+(currentSize*100)/totalSize)+"%"); +// } + }); + + //OSSAsyncTask task = + oss.asyncPutObject(put, new OSSCompletedCallback<>() { + @Override + public void onSuccess(PutObjectRequest request, PutObjectResult result) { + LogUtils.i("PutObject", "UploadSuccess"); + LogUtils.i("ETag", result.getETag()); + LogUtils.i("RequestId", result.getRequestId()); + LogUtils.i("获取到的数据:" + GsonUtils.beanToJSONString(result)); + outputStrings.add(IMUIKitConfig.OSS_URL + "media/" + picPath + "/" + data + "/" + fileName); + //https://shenqi777.oss-cn-hongkong.aliyuncs.com/qtalk/pic_output/20230914/null_false53.jpg + if (i == uris.size() - 1) { + toSubmit(); + } else { + toUpdateOss(bucketName, i + 1, oss); + } + } + + @Override + public void onFailure(PutObjectRequest request, ClientException clientExcepion, ServiceException serviceException) { + dismissLoading(); + LogUtils.i("ErrorCode", clientExcepion.getMessage()); + + // 请求异常。 + if (clientExcepion != null) { + // 本地异常,如网络异常等。 + clientExcepion.printStackTrace(); + } + if (serviceException != null) { + // 服务异常。 + LogUtils.i("ErrorCode", serviceException.getErrorCode()); + LogUtils.i("RequestId", serviceException.getRequestId()); + LogUtils.i("HostId", serviceException.getHostId()); + LogUtils.i("RawMessage", serviceException.getRawMessage()); + } + } + }); + } + } + + public void toSubmit() { + UserAlbumBean.UserAlbum userAlbum = new UserAlbumBean.UserAlbum(); + userAlbum.setName(binding.editUserphotoMingcheng.getText().toString()); + userAlbum.setType(photoType); + String password = binding.editUserphotoMima.getText().toString(); + if (!TextUtils.isEmpty(password)) { + userAlbum.setPassword(password); + } + if (outputStrings.size() > 0) { + userAlbum.setFiles(outputStrings); + } + + Api.getInstance().createAlbums(userAlbum) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver() { + @Override + public void onSuccess(Result o) { + LogUtils.d("DDDD"); + dismissLoading(); + ToastX.showShortToast(getString(R.string.userphoto_create_toastsuccess)); + setResult(RESULT_OK); + finish(); + } + + @Override + public void onError(int code, String msg) { + dismissLoading(); + } + }); + } + + private int photoType = 1; + + private void selectPhotoType() { + SelectPhotoTypeDialog selectPhotoTypeDialog = new SelectPhotoTypeDialog(this, photoType); + selectPhotoTypeDialog.setOnToVipListener(type -> { + photoType = type; + binding.llUserphotoSetpwsd.setVisibility(View.GONE); + switchPhotoType(); + + changeSumbit(); + }); + selectPhotoTypeDialog.show(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + AdaptScreenUtils.setWhiteNavigationBar(selectPhotoTypeDialog); + } + } + + private void switchPhotoType() { + switch (photoType) { + case 1: + binding.tvUserphotoType.setText(getResources().getString(com.netease.yunxin.kit.chatkit.ui.R.string.userphoto_create_xiangbugongkai)); + break; + case 2: + binding.tvUserphotoType.setText(getResources().getString(com.netease.yunxin.kit.chatkit.ui.R.string.userphoto_create_xiangbuhaoyou)); + break; + case 3: + binding.tvUserphotoType.setText(getResources().getString(com.netease.yunxin.kit.chatkit.ui.R.string.userphoto_create_xiangbusimi)); + break; + } + if (photoType == 3) { + binding.llUserphotoSetpwsd.setVisibility(View.VISIBLE); + } else { + binding.editUserphotoMima.setText(""); + binding.llUserphotoSetpwsd.setVisibility(View.GONE); + } + + } + + private void requestCameraPermission(String permission) { + permissionExplainDialog = new PermissionExplainDialog(this, getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_storage_title), getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_storage_content)); + permissionExplainDialog.show(); + permissionLauncher.launch(new String[]{permission}); + } + + PermissionExplainDialog permissionExplainDialog; + + private void requestCameraPermission() { + permissionExplainDialog = new PermissionExplainDialog(this, getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_storage_title), getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_storage_content)); + permissionExplainDialog.show(); + permissionLauncher.launch(new String[]{Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO}); + } + + protected void startPickMedia() { + + PictureSelectorStyle selectorStyle = new PictureSelectorStyle(); + TitleBarStyle blueTitleBarStyle = new TitleBarStyle(); + blueTitleBarStyle.setTitleDrawableRightResource(com.netease.yunxin.kit.chatkit.ui.R.drawable.ic_orange_arrow_down); + blueTitleBarStyle.setTitleLeftBackResource(com.netease.yunxin.kit.common.ui.R.drawable.ic_back); + blueTitleBarStyle.setTitleBackgroundColor(ContextCompat.getColor(AddPhotoActivity.this, R.color.color_fffbfb)); + blueTitleBarStyle.setHideCancelButton(true); + blueTitleBarStyle.setTitleTextColor(ContextCompat.getColor(AddPhotoActivity.this, R.color.color_3d3d3d)); + + BottomNavBarStyle numberBlueBottomNavBarStyle = new BottomNavBarStyle(); + numberBlueBottomNavBarStyle.setBottomPreviewNormalTextColor(ContextCompat.getColor(AddPhotoActivity.this, com.luck.picture.lib.R.color.ps_color_9b)); + numberBlueBottomNavBarStyle.setBottomPreviewSelectTextColor(ContextCompat.getColor(AddPhotoActivity.this, R.color.color_themepink)); + numberBlueBottomNavBarStyle.setBottomNarBarBackgroundColor(ContextCompat.getColor(AddPhotoActivity.this, R.color.ps_color_white)); + numberBlueBottomNavBarStyle.setBottomSelectNumResources(R.drawable.ps_demo_pink_num_selected); + numberBlueBottomNavBarStyle.setBottomEditorTextColor(ContextCompat.getColor(AddPhotoActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_53575e)); + numberBlueBottomNavBarStyle.setBottomOriginalTextColor(ContextCompat.getColor(AddPhotoActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_53575e)); + + SelectMainStyle numberPinkSelectMainStyle = new SelectMainStyle(); + numberPinkSelectMainStyle.setStatusBarColor(ContextCompat.getColor(AddPhotoActivity.this, R.color.color_fffbfb)); + numberPinkSelectMainStyle.setSelectNumberStyle(true); + numberPinkSelectMainStyle.setPreviewSelectNumberStyle(true); + numberPinkSelectMainStyle.setSelectBackground(R.drawable.ps_demo_pink_num_selector); + numberPinkSelectMainStyle.setMainListBackgroundColor(ContextCompat.getColor(AddPhotoActivity.this, R.color.ps_color_white)); + numberPinkSelectMainStyle.setPreviewSelectBackground(R.drawable.ps_demo_pink_num_selected); + numberPinkSelectMainStyle.setSelectNormalTextColor(ContextCompat.getColor(AddPhotoActivity.this, R.color.color_white)); + numberPinkSelectMainStyle.setSelectTextColor(ContextCompat.getColor(AddPhotoActivity.this, R.color.color_themepink)); + numberPinkSelectMainStyle.setSelectText(R.string.ps_completed); + + selectorStyle.setTitleBarStyle(blueTitleBarStyle); + selectorStyle.setBottomBarStyle(numberBlueBottomNavBarStyle); + selectorStyle.setSelectMainStyle(numberPinkSelectMainStyle); + + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .setImageEngine(GlideEngine.createGlideEngine()) + .setMaxSelectNum(9) +// .setMaxVideoSelectNum(9) + .setSelectorUIStyle(selectorStyle) + .forResult(new OnResultCallbackListener<>() { + @Override + public void onResult(ArrayList result) { + + if (uriStrings.size() > 1) { + uriStrings.remove(0); +// uriStrings.addAll(Matisse.obtainPathResult(data)); +// uris.addAll(Matisse.obtainResult(data)); + localMedias.addAll(result); + for (int i = 0; i < result.size(); ++i) { + Uri uri = Uri.parse(result.get(i).getAvailablePath()); + uris.add(uri); + uriStrings.add(result.get(i).getAvailablePath()); + } + } else { + uris.clear(); + uriStrings.clear(); + localMedias = result; + for (int i = 0; i < result.size(); ++i) { + Uri uri = Uri.parse(result.get(i).getAvailablePath()); + uris.add(uri); + uriStrings.add(result.get(i).getAvailablePath()); + } + } + + getList(uriStrings); + + commonAdapter.setDates(uriStrings); + changeSumbit(); + + } + + @Override + public void onCancel() { + + } + }); + + } + + + private List getList(List list) { + if (list == null) { + list = new ArrayList<>(); + } + list.add(0, "add"); + return list; + } + + private void initAdapter() { + + uriStrings = getList(uriStrings); + + binding.recycler.setLayoutManager(new GridLayoutManager(this, 3)); + binding.recycler.addItemDecoration(getItemDecoration()); + commonAdapter = new CommonAdapter(this, R.layout.item_add_photo, uriStrings) { + @Override + public void convert(ViewHolder holder, String s, int index) { + final String s1 = s; + ImageView iv = holder.getView(R.id.item_image_iv); + ImageView ivClose = holder.getView(R.id.colose_iv); + if (uriStrings.get(index).equals("add")) { + iv.setImageResource(R.mipmap.ic_addphoto); + ivClose.setVisibility(View.GONE); + } else { + ivClose.setVisibility(View.VISIBLE); + Glide.with(AddPhotoActivity.this).load(uriStrings.get(index)).into(iv); + } + holder.getView(R.id.item_image_iv).setOnClickListener(v -> { + if (uriStrings.get(index).equals("add")) { + addPic(); + } else { +// //查看图片 +// int indess = index; +// for (int i = 0; i < uris.size(); i++) { +// if (uriStrings.get(i).equals(s1)) { +// indess = i; +// } +// } +// showListImage(uriStrings.subList(0, uris.size()), indess); + } + }); + holder.getView(R.id.colose_iv).setOnClickListener(v -> { + uris.remove(index - 1); + uriStrings.remove(index); + localMedias.remove(index - 1); + changeSumbit(); + setDates(uriStrings); + + }); + } + }; + binding.recycler.setAdapter(commonAdapter); + // 适配器添加拖拽回调 + ItemTouchHelper.Callback callback = new ItemDragTouchHelperCallback(commonAdapter); + ItemTouchHelper itemTouchHelper = new ItemTouchHelper(callback); + // 为recyclerView添加拖拽功能 + itemTouchHelper.attachToRecyclerView(binding.recycler); + + } + + private void addPic() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + if (PermissionUtils.hasPermissions( + AddPhotoActivity.this, Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO)) { + startPickMedia(); + } else { + requestCameraPermission(); + } + } else { + if (PermissionUtils.hasPermissions( + AddPhotoActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE)) { + startPickMedia(); + } else { + requestCameraPermission( + Manifest.permission.READ_EXTERNAL_STORAGE); + } + } + + } + + + private void changeSumbit() { + int visible = binding.llUserphotoSetpwsd.getVisibility(); + String mingcheng = binding.editUserphotoMingcheng.getText().toString().trim(); + String mima = binding.editUserphotoMima.getText().toString().trim(); + if ((!TextUtils.isEmpty(mingcheng) + && visible == View.GONE) || + (!TextUtils.isEmpty(mingcheng) && (visible == View.VISIBLE && !TextUtils.isEmpty(mima)))) { + changeCreate(true); + } else { + changeCreate(false); + } + + } + + private void changeCreate(boolean b) { + if (b) { + binding.tvUserphotoCreate.setBackgroundTintList(null); + binding.tvUserphotoCreate.setEnabled(true); + } else { + binding.tvUserphotoCreate.setBackgroundTintList(ColorStateList.valueOf(getColor(R.color.color_themeblue_alpha70))); + binding.tvUserphotoCreate.setEnabled(false); + } + } + + public RecyclerView.ItemDecoration getItemDecoration() { + return new RecyclerView.ItemDecoration() { + final int padding = SizeUtils.dp2px(6); + + @Override + public void getItemOffsets( + @NonNull Rect outRect, + @NonNull View view, + @NonNull RecyclerView parent, + @NonNull RecyclerView.State state) { + GridLayoutManager manager = (GridLayoutManager) parent.getLayoutManager(); + int childSize = parent.getChildCount(); + int span = manager.getSpanCount(); + //为了Item大小均匀,将设定分割线平均分给左右两边Item各一半 + int offset = padding / 2; + //得到View的位置 + int childPosition = parent.getChildAdapterPosition(view); + //第一排,顶部不画 + if (childPosition < span) { + //最左边的,左边不画 + if (childPosition % span == 0) { + outRect.set(0, 0, offset, 0); + //最右边,右边不画 + } else if (childPosition % span == span - 1) { + outRect.set(offset, 0, 0, 0); + } else { + outRect.set(offset, 0, offset, 0); + } + } else { + //上下的分割线,就从第二排开始,每个区域的顶部直接添加设定大小,不用再均分了 + if (childPosition % span == 0) { + outRect.set(0, padding, offset, 0); + } else if (childPosition % span == span - 1) { + outRect.set(offset, padding, 0, 0); + } else { + outRect.set(offset, padding, offset, 0); + } + } + } + }; + } + + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void afterTextChanged(Editable editable) { + if (!TextUtils.isEmpty(editable.toString())) { + changeSumbit(); + } + } +} diff --git a/app/src/main/java/com/dskj/rbchat/main/mine/photo/EditPhotoActivity.java b/app/src/main/java/com/dskj/rbchat/main/mine/photo/EditPhotoActivity.java new file mode 100644 index 0000000..50403cc --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/mine/photo/EditPhotoActivity.java @@ -0,0 +1,278 @@ +package com.dskj.rbchat.main.mine.photo; + +import android.Manifest; +import android.content.Intent; +import android.content.res.ColorStateList; +import android.graphics.Rect; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.text.Editable; +import android.text.InputFilter; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.view.View; +import android.widget.ImageView; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.ItemTouchHelper; +import androidx.recyclerview.widget.RecyclerView; + +import com.alibaba.sdk.android.oss.ClientException; +import com.alibaba.sdk.android.oss.OSSClient; +import com.alibaba.sdk.android.oss.ServiceException; +import com.alibaba.sdk.android.oss.callback.OSSCompletedCallback; +import com.alibaba.sdk.android.oss.common.auth.OSSCredentialProvider; +import com.alibaba.sdk.android.oss.common.auth.OSSStsTokenCredentialProvider; +import com.alibaba.sdk.android.oss.model.PutObjectRequest; +import com.alibaba.sdk.android.oss.model.PutObjectResult; +import com.bumptech.glide.Glide; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.base.LllChatBaseActivity; +import com.dskj.rbchat.databinding.ActivityAddphotosBinding; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.dialog.SelectPhotoTypeDialog; +import com.dskj.rbchat.event.UserAlbumsUpdateEvent; +import com.dskj.rbchat.model.StsCredentialsBean; +import com.dskj.rbchat.model.UserAlbumBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.AdaptScreenUtils; +import com.dskj.rbchat.utils.CharInputFilter; +import com.dskj.rbchat.utils.LogUtils; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.corekit.event.EventCenter; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +/** + * 编辑相册 + */ +public class EditPhotoActivity extends LllChatBaseActivity { + + ActivityAddphotosBinding binding; + private UserAlbumBean.UserAlbum userAlbum; + private String coverFileId = ""; + private ActivityResultLauncher launcher; + + @Override + public int initNavigationBarColor() { + return getColor(R.color.color_white); + } + + @Override + public int initStatusBarColor() { + return getColor(R.color.color_titlebar); + } + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = ActivityAddphotosBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + userAlbum = (UserAlbumBean.UserAlbum) getIntent().getSerializableExtra("albumbean"); + if (userAlbum != null) { + initView(); + } + + launcher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { + if (result.getResultCode() == RESULT_OK) { + coverFileId = result.getData().getStringExtra("coverId"); + if (!TextUtils.isEmpty(coverFileId)) { + String url = result.getData().getStringExtra("url"); + binding.cavCover.setData(url, "cover", 0); + } + } + }); + + + } + + private void initView() { + binding.addphotoTitleBar.setTitle(getString(R.string.userphoto_edit_album)); + binding.tvUserphotoCreate.setText(getString(R.string.save_txt)); + binding.tvUserphotoCreate.setBackgroundTintList(null); + binding.tvUserphotoCreate.setEnabled(true); + binding.llAddphoto.setVisibility(View.GONE); + binding.llUserphotocover.setVisibility(View.VISIBLE); + binding.lineCover.setVisibility(View.VISIBLE); + binding.btnEditphotoDelete.setVisibility(View.VISIBLE); + binding.editUserphotoMingcheng.setText(userAlbum.getName()); + binding.editUserphotoMima.setFilters(new InputFilter[]{new CharInputFilter(Pattern.compile("[\\u4e00-\\u9fa5]"))}); + if (TextUtils.isEmpty(userAlbum.getCoverImg())) { + binding.cavCover.setData(R.mipmap.ic_useralbum_img, "cover", 0); + } else { + binding.cavCover.setData(userAlbum.getCoverImg(), "cover", 0); + } + photoType = userAlbum.getType(); + switchPhotoType(); + binding.addphotoTitleBar.setOnBackIconClickListener(view -> finish()); + //保存 + binding.tvUserphotoCreate.setOnClickListener(view -> { + String name = binding.editUserphotoMingcheng.getText().toString(); + if (TextUtils.isEmpty(name)) { + ToastX.showShortToast(getString(R.string.userphoto_editname_toast)); + return; + } + doSave(); + }); + + binding.llUserphotocover.setOnClickListener(view -> { + launcher.launch(new Intent(EditPhotoActivity.this, UserSelectPhotoActivity.class).putExtra("albumId", userAlbum.getId())); + }); + //设置相册类型 + binding.llUserphototype.setOnClickListener(view -> { + selectPhotoType(); + }); + + + //删除 + binding.btnEditphotoDelete.setOnClickListener(view -> { + doDelete(); + }); + } + + + private int photoType = 1; + + private void selectPhotoType() { + SelectPhotoTypeDialog selectPhotoTypeDialog = new SelectPhotoTypeDialog(this, photoType); + selectPhotoTypeDialog.setOnToVipListener(type -> { + photoType = type; + binding.llUserphotoSetpwsd.setVisibility(View.GONE); + switchPhotoType(); + + }); + selectPhotoTypeDialog.show(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + AdaptScreenUtils.setWhiteNavigationBar(selectPhotoTypeDialog); + } + } + + private void switchPhotoType() { + switch (photoType) { + case 1: + binding.tvUserphotoType.setText(getResources().getString(com.netease.yunxin.kit.chatkit.ui.R.string.userphoto_create_xiangbugongkai)); + break; + case 2: + binding.tvUserphotoType.setText(getResources().getString(com.netease.yunxin.kit.chatkit.ui.R.string.userphoto_create_xiangbuhaoyou)); + break; + case 3: + binding.tvUserphotoType.setText(getResources().getString(com.netease.yunxin.kit.chatkit.ui.R.string.userphoto_create_xiangbusimi)); + break; + } + if (photoType == 3) { + binding.llUserphotoSetpwsd.setVisibility(View.VISIBLE); + binding.editUserphotoMima.setText(userAlbum.getPassword()); + } else { + binding.editUserphotoMima.setText(""); + binding.llUserphotoSetpwsd.setVisibility(View.GONE); + } + + } + + + private void doSave() { + if (!TextUtils.isEmpty(coverFileId)) { + toSetCover(userAlbum.getId()); + } + toEdit(userAlbum.getId()); + } + + private void doDelete() { + ActionConfirmDialog actionConfirmDialog = new ActionConfirmDialog(EditPhotoActivity.this, getString(R.string.userphoto_dialog_deletecontent1, userAlbum.getName()), getString(R.string.cancel_txt), getString(R.string.sure_txt)); + actionConfirmDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + toDelete(userAlbum.getId()); + } + + @Override + public void toCancel() { + + } + }); + actionConfirmDialog.show(); + + } + + private void toDelete(int albumId) { + Api.getInstance().deleteAlbums(albumId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result o) { + LogUtils.d("o===" + o.data); + setResult(101); + finish(); + + } + + @Override + public void onError(int code, String msg) { + LogUtils.d("error o===" + msg); + } + }); + } + + private void toEdit(int albumId) { + userAlbum.setType(photoType); + userAlbum.setPassword(binding.editUserphotoMima.getText().toString()); + userAlbum.setName(binding.editUserphotoMingcheng.getText().toString()); + Api.getInstance().editAlbums(albumId, userAlbum) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result o) { + LogUtils.d("o===" + o.data); + setResult(RESULT_OK); + finish(); + + } + + @Override + public void onError(int code, String msg) { + LogUtils.d("error o===" + msg); + } + }); + } + + private void toSetCover(int albumId) { + Map maps = new HashMap<>(); + maps.put("fileId", coverFileId); + Api.getInstance().setAlbumsCover(albumId, maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver() { + @Override + public void onSuccess(Result o) { + LogUtils.d("o===" + o.data); +// EventCenter.notifyEvent(new UserAlbumsUpdateEvent()); + } + + @Override + public void onError(int code, String msg) { + LogUtils.d("error o===" + msg); + } + }); + } + +} diff --git a/app/src/main/java/com/dskj/rbchat/main/mine/photo/UserPhotoDetailsActivity.java b/app/src/main/java/com/dskj/rbchat/main/mine/photo/UserPhotoDetailsActivity.java new file mode 100644 index 0000000..4cdbbac --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/mine/photo/UserPhotoDetailsActivity.java @@ -0,0 +1,1101 @@ +package com.dskj.rbchat.main.mine.photo; + +import android.Manifest; +import android.app.Activity; +import android.content.Intent; +import android.graphics.Color; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.text.TextUtils; +import android.util.TypedValue; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.EditText; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.activity.result.ActivityResult; +import androidx.activity.result.ActivityResultCallback; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; +import androidx.appcompat.widget.AppCompatImageView; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.alibaba.sdk.android.oss.ClientException; +import com.alibaba.sdk.android.oss.OSSClient; +import com.alibaba.sdk.android.oss.ServiceException; +import com.alibaba.sdk.android.oss.callback.OSSCompletedCallback; +import com.alibaba.sdk.android.oss.common.auth.OSSCredentialProvider; +import com.alibaba.sdk.android.oss.common.auth.OSSStsTokenCredentialProvider; +import com.alibaba.sdk.android.oss.model.PutObjectRequest; +import com.alibaba.sdk.android.oss.model.PutObjectResult; +import com.bumptech.glide.Glide; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.base.LllChatBaseActivity; +import com.dskj.rbchat.databinding.ActivityUserphotosBinding; +import com.dskj.rbchat.databinding.ActivityUserphotosDetailsBinding; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.dialog.ActionInputConfirmDialog; +import com.dskj.rbchat.dialog.SelectPhotosMoveDialog; +import com.dskj.rbchat.event.UserAlbumsUpdateEvent; +import com.dskj.rbchat.model.AlbumBean; +import com.dskj.rbchat.model.AlbumItemBean; +import com.dskj.rbchat.model.HisChatShowBean; +import com.dskj.rbchat.model.StsCredentialsBean; +import com.dskj.rbchat.model.UserAlbumBean; +import com.dskj.rbchat.model.UserShareBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.AdaptScreenUtils; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.utils.ShareDateUtils; +import com.dskj.rbchat.voom.TiktokActivity; +import com.dskj.rbchat.welcome.WelcomeActivity; +import com.dskj.rbchat.widget.CircleImageView; +import com.google.android.material.bottomsheet.BottomSheetDialog; +import com.luck.picture.lib.basic.PictureSelector; +import com.luck.picture.lib.config.SelectMimeType; +import com.luck.picture.lib.entity.LocalMedia; +import com.luck.picture.lib.interfaces.OnResultCallbackListener; +import com.luck.picture.lib.style.BottomNavBarStyle; +import com.luck.picture.lib.style.PictureSelectorStyle; +import com.luck.picture.lib.style.SelectMainStyle; +import com.luck.picture.lib.style.TitleBarStyle; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.msg.MessageBuilder; +import com.netease.nimlib.sdk.msg.attachment.FileAttachment; +import com.netease.nimlib.sdk.msg.constant.MsgTypeEnum; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.nimlib.sdk.msg.model.IMMessage; +import com.netease.nimlib.sdk.uinfo.UserService; +import com.netease.nimlib.sdk.uinfo.model.NimUserInfo; +import com.netease.yunxin.kit.chatkit.model.IMMessageInfo; +import com.netease.yunxin.kit.chatkit.repo.ChatRepo; +import com.netease.yunxin.kit.chatkit.repo.ContactRepo; +import com.netease.yunxin.kit.chatkit.ui.common.ChatUtils; +import com.netease.yunxin.kit.chatkit.ui.common.GlideEngine; +import com.netease.yunxin.kit.chatkit.ui.custom.StickerAttachment; +import com.netease.yunxin.kit.chatkit.ui.custom.UserAlbumsAttachment; +import com.netease.yunxin.kit.chatkit.ui.dialog.PermissionExplainDialog; +import com.netease.yunxin.kit.chatkit.ui.interfaces.IWathBaseBottomClickListenr; +import com.netease.yunxin.kit.common.ui.utils.TimeFormatUtils; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.common.ui.widgets.ContactAvatarView; +import com.netease.yunxin.kit.common.utils.PermissionUtils; +import com.netease.yunxin.kit.contactkit.ui.utils.ColorUtils; +import com.netease.yunxin.kit.corekit.event.EventCenter; +import com.netease.yunxin.kit.corekit.event.EventNotify; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.model.FriendInfo; +import com.netease.yunxin.kit.corekit.im.model.UserInfo; +import com.netease.yunxin.kit.corekit.im.provider.FetchCallback; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +/** + * 用户相册详情 + */ +public class UserPhotoDetailsActivity extends LllChatBaseActivity { + + ActivityUserphotosDetailsBinding binding; + CommonAdapter rootAdapter; + private int albumId; + private UserAlbumBean userAlbum; + private int pageSize = 1; + private List listdata = new ArrayList<>(); + private ArrayList urlList = new ArrayList<>(); + private boolean isMe = false; + protected ActivityResultLauncher permissionLauncher; + private ActivityResultLauncher launcher; + private String password; + private String userId; + private boolean isShowToast = false; + + @Override + public int initNavigationBarColor() { + return getColor(R.color.color_white); + } + + @Override + public int initStatusBarColor() { + return getColor(R.color.color_titlebar); + } + + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = ActivityUserphotosDetailsBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + albumId = getIntent().getIntExtra("albumId", 0); + password = getIntent().getStringExtra("password"); + userId = getIntent().getStringExtra("userId"); + isMe = IMKitClient.account().equals(userId); + showLoading(); + initTitle(); + getDataList(); + initRefreshLayout(); + initListView(); + launcher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback() { + @Override + public void onActivityResult(ActivityResult result) { + if (result.getResultCode() == RESULT_OK) { + //刷新 + EventCenter.notifyEvent(new UserAlbumsUpdateEvent()); + isMe = true; + pageSize = 1; + getDataList(); + } + if (result.getResultCode() == 101) { + //删除相册 + EventCenter.notifyEvent(new UserAlbumsUpdateEvent()); + finish(); + } + } + }); + shareDateUtils = new ShareDateUtils(); + shareDateUtils.getAllSessionList(); + permissionLauncher = + registerForActivityResult( + new ActivityResultContracts.RequestMultiplePermissions(), + result -> { + if (result != null) { + for (Map.Entry entry : result.entrySet()) { + String permission = entry.getKey().toString(); + boolean grant = (Boolean) entry.getValue(); + if (grant) { + if (TextUtils.equals( + permission, Manifest.permission.READ_EXTERNAL_STORAGE) || TextUtils.equals( + permission, Manifest.permission.READ_MEDIA_IMAGES) || TextUtils.equals( + permission, Manifest.permission.READ_MEDIA_VIDEO)) { + startPickMedia(); + } + } else { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (shouldShowRequestPermissionRationale(permission)) { + ToastX.showShortToast(getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_deny_tips)); + } else { + ToastX.showShortToast(getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_storage)); + } + } + } + } + } + if (permissionExplainDialog != null) { + permissionExplainDialog.dismiss(); + } + }); + + } + + private void initTitle() { + binding.userphotoTitleBar.setOnBackIconClickListener(view -> { + if (binding.userphotoTitleBar.getBackImageView().getVisibility() == View.VISIBLE) { + finish(); + } else { + binding.userphotoTitleBar.setBackIconVisible(View.VISIBLE); + binding.userphotoTitleBar.setLeftTextViewVisible(View.GONE); + binding.layoutOperatorBottom.setVisibility(View.GONE); + binding.layoutEditphotoBottom.setVisibility(View.VISIBLE); + binding.layoutOperatorBottom.setVisibility(View.GONE); + binding.btnEditphotoAdd.setVisibility(View.VISIBLE); + selectAlbumId.clear(); + setTitleValue(0); + setSelector(false); + } + }); + binding.userphotoTitleBar.getTitleTextView().setTextSize(TypedValue.COMPLEX_UNIT_SP, 20); + binding.userphotoTitleBar.setLeftTextViewVisible(View.GONE); + binding.userphotoTitleBar.setBackIconVisible(View.VISIBLE); + } + + public void setTitleView() { + binding.userphotoTitleBar.setTitle(userAlbum.getUserAlbum().getName()); + if (isMe) { + binding.btnEditphotoAdd.setVisibility(View.VISIBLE); + binding.layoutEditphotoBottom.setVisibility(View.VISIBLE); + binding.layoutOperatorBottom.setVisibility(View.GONE); + binding.tvEditphotoEdit.setOnClickListener(view -> { + userAlbum.getUserAlbum().setCoverImg(userAlbum.getCoverImg()); + launcher.launch(new Intent(UserPhotoDetailsActivity.this, EditPhotoActivity.class).putExtra("albumbean", userAlbum.getUserAlbum())); + }); + binding.tvEditphotoManager.setOnClickListener(view -> { + if (isSelector) { + return; + } + binding.userphotoTitleBar.setLeftText(R.string.cancel_txt); + binding.btnEditphotoAdd.setVisibility(View.GONE); + binding.layoutOperatorBottom.setVisibility(View.VISIBLE); + binding.layoutEditphotoBottom.setVisibility(View.GONE); + setTitleValue(1); + setSelector(true); + }); + binding.tvEditphotoShare.setOnClickListener(view -> { + toShareAction(userAlbum); + }); + binding.tvEditphotoDelete.setOnClickListener(view -> { + if (selectAlbumId.size() == 0) { + ToastX.showShortToast(getString(R.string.userphoto_edit_deletetoast)); + return; + } + doDeletePhtots(); + + }); + binding.tvEditphotoMove.setOnClickListener(view -> { + if (selectAlbumId.size() == 0) { + ToastX.showShortToast(getString(R.string.userphoto_edit_movetoast)); + return; + } + doMovePhotos(); + }); + binding.btnEditphotoAdd.setOnClickListener(view -> { + doAddPhotos(); + }); + + //获取我的所有相簿 + getAllAlbums(); + } + } + + + public void setTitleValue(int type) { + switch (type) { + case 0: //初始化 + binding.userphotoTitleBar.setTitle(userAlbum.getUserAlbum().getName()); + break; + case 1: + binding.userphotoTitleBar.setTitle(getString(R.string.userphoto_edit_manager)); + break; + case 2: + binding.userphotoTitleBar.setTitle(getString(R.string.userphoto_edit_add, selectAlbumId.size())); + } + } + + + private CommonAdapter commonitemAdapter; + private List selectAlbumId = new ArrayList<>(); + boolean isSelector = false; + + public void setSelector(boolean selector) { + isSelector = selector; + rootAdapter.notifyDataSetChanged(); + } + + public void initListView() { + binding.recyclerPhotos.setLayoutManager(new LinearLayoutManager(this)); + rootAdapter = new CommonAdapter<>(this, R.layout.chat_his_child_itemtop, listdata) { + + @Override + public void convert(ViewHolder holder, AlbumItemBean itemBean, int index) { + TextView tvTitle = holder.getView(R.id.title_tv); + TextView tvSelector = holder.getView(R.id.title_selector_tv); + tvTitle.setText(itemBean.getTime()); + tvTitle.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + tvTitle.setTextColor(getColor(R.color.color_383838)); + RecyclerView recyclerView = holder.getView(R.id.item_recyclerview); + recyclerView.setVisibility(View.VISIBLE); + tvSelector.setVisibility(View.GONE); + List items = itemBean.getAlbumItems(); + updatetvSelectedValue(tvSelector, index); + if (isSelector) { + tvSelector.setVisibility(View.VISIBLE); + } else { + setAllSelecterStatus(false, items); + } + tvSelector.setOnClickListener(view -> { //全选 or 全不选 + tvSelector.setEnabled(false); + setAllSelecterStatus(tvSelector.getText().toString().equals(getString(R.string.userphoto_edit_selected)), items); + rootAdapter.notifyItemChanged(index); + tvSelector.setEnabled(true); + }); + recyclerView.setLayoutManager(new GridLayoutManager(UserPhotoDetailsActivity.this, 4)); + commonitemAdapter = new CommonAdapter<>(UserPhotoDetailsActivity.this, R.layout.chat_his_child_item1, items) { + @Override + public void convert(ViewHolder holder, AlbumItemBean.AlbumItem item, int itemindex) { + + CircleImageView circleImageView = holder.getView(R.id.item_civ); + ImageView ivselected = holder.getView(R.id.item_iv_selector); + ivselected.setVisibility(View.GONE); + if (isSelector) { + ivselected.setVisibility(View.VISIBLE); + ivselected.setImageResource(item.isSelected ? R.mipmap.dialog_gou_t : R.drawable.cornor_stroke_unselect); + } + if (!TextUtils.isEmpty(item.getFileUrl())) { + Glide.with(UserPhotoDetailsActivity.this) + .load(item.getFileUrl()) + .into(circleImageView); + } else { + Glide.with(UserPhotoDetailsActivity.this) + .load("") + .error(R.color.color_f4f4f4) + .into(circleImageView); + } + holder.getView(R.id.big_ly).setOnClickListener(v -> { + if (isSelector) { + item.setSelected(!item.isSelected()); + notifyItemChanged(itemindex); + if (item.isSelected()) { + selectAlbumId.add(item.getId()); + } else { + selectAlbumId.remove(selectAlbumId.indexOf(item.getId())); + } + updatetvSelectedValue(tvSelector, index); + } else { + // 跳转图片详情 + toDetails(item); + } + + }); + } + }; + recyclerView.setAdapter(commonitemAdapter); + } + }; + binding.recyclerPhotos.setAdapter(rootAdapter); + + } + + public void toDetails(AlbumItemBean.AlbumItem data) { + int index = 0; + for (int i = 0; i < urlList.size(); ++i) { + if (data.equals(urlList.get(i))) { + index = i; + } + } + launcher.launch(new Intent(UserPhotoDetailsActivity.this, WatchImagesActivity.class).putExtra("position", index) + .putExtra("userId", userId).putExtra("listData", urlList)); + } + + + //更新text + private void updatetvSelectedValue(TextView textView, int index) { + AlbumItemBean itemBean = listdata.get(index); + textView.setText(getString(R.string.userphoto_edit_selected)); + for (AlbumItemBean.AlbumItem albumItem : itemBean.getAlbumItems()) { + if (albumItem.isSelected()) { + textView.setText(getString(R.string.userphoto_edit_selected_cancel)); + break; + } + } + if (!isSelector) { + return; + } + if (selectAlbumId.size() > 0) { + setTitleValue(2); + } else { + setTitleValue(1); + } + + } + + //设置全选 全不选 + private void setAllSelecterStatus(boolean isSelector, List items) { + for (AlbumItemBean.AlbumItem item : items) { + item.setSelected(isSelector); + if (isSelector) { + selectAlbumId.add(item.getId()); + } else { + int index = selectAlbumId.indexOf(item.getId()); + if (index >= 0) { + selectAlbumId.remove(index); + } + + } + } + } + + private void initRefreshLayout() { + binding.refreshLayout.setEnableRefresh(false); + binding.refreshLayout.setEnableLoadMore(false); +// binding.refreshLayout.setOnRefreshListener(refreshlayout -> { +// pageSize = 1; +// binding.refreshLayout.setVisibility(View.VISIBLE); +// binding.refreshLayout.setEnableLoadMore(true); +// // getDateList(); +// +// +// }); +// binding.refreshLayout.setOnLoadMoreListener(refreshLayout -> { +// pageSize += 1; +// // getDateList(); +// }); + } + + + private void getDataList() { + Map objectMap = new HashMap<>(); + if (!TextUtils.isEmpty(password)) { + objectMap.put("password", password); + } + Api.getInstance().getAlbums(albumId, objectMap) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result o) { + LogUtils.d("o===" + o.data); + userAlbum = o.data; + if (o.data.getUserAlbum() != null) { + userId = o.data.getUserAlbum().getUserId(); + } + setTitleView(); +// if (pageSize == 1) { +// listdata.clear(); +// +// +// } + listdata.clear(); + urlList.clear(); + dismissLoading(); + isShowToast = false; + password = ""; + + if (o.data.getUserAlbum() != null && o.data.getUserAlbum().getType() == 2 && !ContactRepo.isFriend(userId) && !isMe) { + showDialogNotFriend(); + return; + } + if (o.data.getFiles() != null) { + forMap(o.data.getFiles()); + rootAdapter.notifyDataSetChanged(); + } + + + } + + @Override + public void onError(int code, String msg) { + dismissLoading(); + binding.userphotoTitleBar.setTitle(getString(R.string.userphoto_title, "TA")); + if (code == 40101) { + if (isShowToast) { + ToastX.showShortToast(getString(R.string.userphoto_jiesuoalbum_toast)); + } + showDialogInputPwd(); + return; + } + ToastX.showShortToast(msg); + + } + }); + } + + public void showDialogNotFriend() { + //输入密码 + ActionConfirmDialog actionConfirmDialog = new ActionConfirmDialog(this, getString(R.string.userphoto_dialog_notfriendtitle), false); + actionConfirmDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + UserPhotoDetailsActivity.this.finish(); + } + + @Override + public void toCancel() { + + } + }); + + actionConfirmDialog.show(); + } + + + public void showDialogInputPwd() { + //输入密码 + ActionInputConfirmDialog inputConfirmDialog = new ActionInputConfirmDialog(this, getString(R.string.userphoto_jiesuoalbum_title), getString(R.string.cancel_txt), getString(R.string.userphoto_jiesuoalbum_confirm)); + + inputConfirmDialog.setOnToActionListener(new ActionInputConfirmDialog.OnToActionListener() { + + @Override + public void toSumbit(String value) { + if (TextUtils.isEmpty(value)) { + ToastX.showShortToast(getString(R.string.userphoto_jiesuoalbum_hint)); + return; + } + isShowToast = true; + password = value; + getDataList(); + + } + + @Override + public void toCancel() { + + } + }); + inputConfirmDialog.show(); + } + + + public void forMap(Map> map) { + Set keys = map.keySet(); + if (!keys.isEmpty()) { + for (String time : keys) { + AlbumItemBean itemBean = new AlbumItemBean(); + itemBean.setTime(time); + itemBean.setAlbumItems(map.get(time)); + listdata.add(itemBean); + urlList.addAll(itemBean.getAlbumItems()); + } + } + } + + private void update() { + selectAlbumId.clear(); + isSelector = false; + setTitleValue(0); + getDataList(); + EventCenter.notifyEvent(new UserAlbumsUpdateEvent()); + } + + private List userAlbumBeans = new ArrayList<>(); + + private void getAllAlbums() { + Api.getInstance().getUserAlbums(IMKitClient.account()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>>() { + @Override + public void onSuccess(Result> o) { + if (o.data.size() > 0) { + userAlbumBeans.clear(); + userAlbumBeans.addAll(removeCurrent(o.data)); + } + + + } + + @Override + public void onError(int code, String msg) { + + } + }); + } + + private List removeCurrent(List list) { + for (int i = 0; i < list.size(); i++) { + if (list.get(i).getUserAlbum().getId() == albumId) { + list.remove(i); + } + } + return list; + } + + private void doMovePhotos() { + SelectPhotosMoveDialog selectPhotosMoveDialog = new SelectPhotosMoveDialog(this, userAlbumBeans); + selectPhotosMoveDialog.setOnToMoveListener(new SelectPhotosMoveDialog.OnToMoveListener() { + @Override + public void toMove(int position) { + toMovePic(userAlbumBeans.get(position).getUserAlbum().getId()); + } + }); + selectPhotosMoveDialog.show(); + } + + public void toMovePic(int id) { + showLoading(); + Map params = new HashMap<>(); + params.put("albumId", id); + params.put("fileIds", selectAlbumId); + Api.getInstance().movePhotos(params) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver() { + @Override + public void onSuccess(Result feedbackResp) { + update(); + } + + @Override + public void onError(int code, String msg) { + dismissLoading(); + } + }); + } + + private void doDeletePhtots() { + ActionConfirmDialog actionConfirmDialog = new ActionConfirmDialog(UserPhotoDetailsActivity.this, getString(R.string.userphoto_dialog_deletecontent), getString(R.string.cancel_txt), getString(R.string.sure_txt)); + actionConfirmDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + toDeletePic(); + } + + @Override + public void toCancel() { + + } + }); + actionConfirmDialog.show(); + } + + public void toDeletePic() { + showLoading(); + Map params = new HashMap<>(); + params.put("fileIds", selectAlbumId); + Api.getInstance().deleteAlbumsPic(params) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver() { + @Override + public void onSuccess(Result feedbackResp) { + update(); + } + + @Override + public void onError(int code, String msg) { + dismissLoading(); + } + }); + } + + //添加相片 + private void doAddPhotos() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + if (PermissionUtils.hasPermissions( + UserPhotoDetailsActivity.this, Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO)) { + startPickMedia(); + } else { + requestCameraPermission(); + } + } else { + if (PermissionUtils.hasPermissions( + UserPhotoDetailsActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE)) { + startPickMedia(); + } else { + requestCameraPermission(Manifest.permission.READ_EXTERNAL_STORAGE); + } + } + + + } + + private void requestCameraPermission(String permission) { + permissionExplainDialog = new PermissionExplainDialog(this, getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_storage_title), getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_storage_content)); + permissionExplainDialog.show(); + permissionLauncher.launch(new String[]{permission}); + } + + PermissionExplainDialog permissionExplainDialog; + + private void requestCameraPermission() { + permissionExplainDialog = new PermissionExplainDialog(this, getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_storage_title), getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_storage_content)); + permissionExplainDialog.show(); + permissionLauncher.launch(new String[]{Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO}); + } + + List uriStrings = new ArrayList<>(); + StsCredentialsBean stsCredentialsBean; + List localMedias = new ArrayList<>(); + List outputStrings = new ArrayList<>(); + + protected void startPickMedia() { + PictureSelectorStyle selectorStyle = new PictureSelectorStyle(); + TitleBarStyle blueTitleBarStyle = new TitleBarStyle(); + blueTitleBarStyle.setTitleDrawableRightResource(com.netease.yunxin.kit.chatkit.ui.R.drawable.ic_orange_arrow_down); + blueTitleBarStyle.setTitleLeftBackResource(com.netease.yunxin.kit.common.ui.R.drawable.ic_back); + blueTitleBarStyle.setTitleBackgroundColor(ContextCompat.getColor(UserPhotoDetailsActivity.this, R.color.color_fffbfb)); + blueTitleBarStyle.setHideCancelButton(true); + blueTitleBarStyle.setTitleTextColor(ContextCompat.getColor(UserPhotoDetailsActivity.this, R.color.color_3d3d3d)); + + BottomNavBarStyle numberBlueBottomNavBarStyle = new BottomNavBarStyle(); + numberBlueBottomNavBarStyle.setBottomPreviewNormalTextColor(ContextCompat.getColor(UserPhotoDetailsActivity.this, com.luck.picture.lib.R.color.ps_color_9b)); + numberBlueBottomNavBarStyle.setBottomPreviewSelectTextColor(ContextCompat.getColor(UserPhotoDetailsActivity.this, R.color.color_themepink)); + numberBlueBottomNavBarStyle.setBottomNarBarBackgroundColor(ContextCompat.getColor(UserPhotoDetailsActivity.this, R.color.ps_color_white)); + numberBlueBottomNavBarStyle.setBottomSelectNumResources(R.drawable.ps_demo_pink_num_selected); + numberBlueBottomNavBarStyle.setBottomEditorTextColor(ContextCompat.getColor(UserPhotoDetailsActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_53575e)); + numberBlueBottomNavBarStyle.setBottomOriginalTextColor(ContextCompat.getColor(UserPhotoDetailsActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_53575e)); + + SelectMainStyle numberPinkSelectMainStyle = new SelectMainStyle(); + numberPinkSelectMainStyle.setStatusBarColor(ContextCompat.getColor(UserPhotoDetailsActivity.this, R.color.color_fffbfb)); + numberPinkSelectMainStyle.setSelectNumberStyle(true); + numberPinkSelectMainStyle.setPreviewSelectNumberStyle(true); + numberPinkSelectMainStyle.setSelectBackground(R.drawable.ps_demo_pink_num_selector); + numberPinkSelectMainStyle.setMainListBackgroundColor(ContextCompat.getColor(UserPhotoDetailsActivity.this, R.color.ps_color_white)); + numberPinkSelectMainStyle.setPreviewSelectBackground(R.drawable.ps_demo_pink_num_selected); + numberPinkSelectMainStyle.setSelectNormalTextColor(ContextCompat.getColor(UserPhotoDetailsActivity.this, R.color.color_white)); + numberPinkSelectMainStyle.setSelectTextColor(ContextCompat.getColor(UserPhotoDetailsActivity.this, R.color.color_themepink)); + numberPinkSelectMainStyle.setSelectText(R.string.ps_completed); + + selectorStyle.setTitleBarStyle(blueTitleBarStyle); + selectorStyle.setBottomBarStyle(numberBlueBottomNavBarStyle); + selectorStyle.setSelectMainStyle(numberPinkSelectMainStyle); + + PictureSelector.create(this) + .openGallery(SelectMimeType.ofImage()) + .setImageEngine(GlideEngine.createGlideEngine()) + .setMaxSelectNum(9) +// .setMaxVideoSelectNum(9) + .setSelectorUIStyle(selectorStyle) + .forResult(new OnResultCallbackListener<>() { + @Override + public void onResult(ArrayList result) { + uriStrings.clear(); + localMedias.clear(); + localMedias.addAll(result); + for (int i = 0; i < result.size(); ++i) { + uriStrings.add(result.get(i).getAvailablePath()); + } + if (uriStrings.size() > 0) { + onSubmitPic(); + } + + } + + @Override + public void onCancel() { + + } + }); + + } + + + public void onSubmitPic() { + showLoading(); + Api.getInstance().stsCredentials() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + stsCredentialsBean = feedbackResp.data; + toAliYunOss(); + } + + @Override + public void onError(int code, String msg) { + dismissLoading(); + } + }); + } + + private void toAliYunOss() { + String endpoint = "https://oss-cn-hongkong.aliyuncs.com"; + String accessKeyId = stsCredentialsBean.getAccessKeyId(); + String accessKeySecret = stsCredentialsBean.getAccessKeySecret(); + String securityToken = stsCredentialsBean.getSecurityToken(); + String bucketName = IMUIKitConfig.bucketName; + OSSCredentialProvider credentialProvider = new OSSStsTokenCredentialProvider(accessKeyId, accessKeySecret, securityToken); + OSSClient oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider); + toUpdateOss(bucketName, 0, oss); + + } + + + private void toUpdateOss(String bucketName, int i, OSSClient oss) { + String picPath = "user_album"; + String data = DataUtils.getCurrentTimeTypeNoline(System.currentTimeMillis()); + if (i < uriStrings.size()) { + +// File file = new File(uriStrings.get(i)); + String fileName = System.currentTimeMillis() + "_" + localMedias.get(i).getFileName(); + LogUtils.i("上传文件是啥:" + GsonUtils.beanToJSONString(localMedias.get(i))); + LogUtils.i("上传文件是啥:" + fileName); + + // 构造上传请求。 + PutObjectRequest put = new PutObjectRequest(bucketName, "media/" + picPath + "/" + data + "/" + fileName, localMedias.get(i).getRealPath()); + put.setProgressCallback((request, currentSize, totalSize) -> { + LogUtils.i("PutObject", "currentSize: " + currentSize + " totalSize: " + totalSize); +// if(isVideo){ +// showLoadingDialog(("正在上传"+(currentSize*100)/totalSize)+"%"); +// } + }); + + //OSSAsyncTask task = + oss.asyncPutObject(put, new OSSCompletedCallback<>() { + @Override + public void onSuccess(PutObjectRequest request, PutObjectResult result) { + LogUtils.i("PutObject", "UploadSuccess"); + LogUtils.i("ETag", result.getETag()); + LogUtils.i("RequestId", result.getRequestId()); + LogUtils.i("获取到的数据:" + GsonUtils.beanToJSONString(result)); + outputStrings.add(IMUIKitConfig.OSS_URL + "media/" + picPath + "/" + data + "/" + fileName); + //https://shenqi777.oss-cn-hongkong.aliyuncs.com/qtalk/pic_output/20230914/null_false53.jpg + if (i == uriStrings.size() - 1) { + toAddPhotos(); + } else { + toUpdateOss(bucketName, i + 1, oss); + } + } + + @Override + public void onFailure(PutObjectRequest request, ClientException clientExcepion, ServiceException serviceException) { + dismissLoading(); + LogUtils.i("ErrorCode", clientExcepion.getMessage()); + + // 请求异常。 + if (clientExcepion != null) { + // 本地异常,如网络异常等。 + clientExcepion.printStackTrace(); + } + if (serviceException != null) { + // 服务异常。 + LogUtils.i("ErrorCode", serviceException.getErrorCode()); + LogUtils.i("RequestId", serviceException.getRequestId()); + LogUtils.i("HostId", serviceException.getHostId()); + LogUtils.i("RawMessage", serviceException.getRawMessage()); + } + } + }); + } + } + + + public void toAddPhotos() { + UserAlbumBean.UserAlbum userAlbum1 = new UserAlbumBean.UserAlbum(); + userAlbum1.setName(userAlbum.getUserAlbum().getName()); + userAlbum1.setType(userAlbum.getUserAlbum().getType()); + userAlbum1.setPassword(userAlbum.getUserAlbum().getPassword()); + if (outputStrings.size() > 0) { + userAlbum1.setFiles(outputStrings); + } + Map map = new HashMap<>(); + map.put("albumId", userAlbum.getUserAlbum().getId()); + map.put("files", outputStrings); + Api.getInstance().addPhotos(map) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver() { + @Override + public void onSuccess(Result o) { + LogUtils.d("DDDD"); + dismissLoading(); + outputStrings.clear(); + uriStrings.clear(); + getDataList(); + EventCenter.notifyEvent(new UserAlbumsUpdateEvent()); + } + + @Override + public void onError(int code, String msg) { + LogUtils.d("onError DDDD"); + dismissLoading(); + } + }); + } + + private ShareDateUtils shareDateUtils; + private ArrayList titleUsers; + private ArrayList titleUsersIsCheck; + + private ImageView coloseIvShare; + private RecyclerView recyclerShare; + private EditText commentEtShare; + private TextView shareBt; + private LinearLayoutManager linearLayoutManager; + private CommonAdapter commonAdapter; + + @RequiresApi(api = Build.VERSION_CODES.M) + private void toShareAction(UserAlbumBean albumBean) { + + titleUsers = shareDateUtils.getConverstionShareInfo(); + titleUsersIsCheck = new ArrayList<>(); + for (UserShareBean conversationInfo : titleUsers) { + titleUsersIsCheck.add(false); + } + if (titleUsers == null || titleUsers.size() == 0) { + ToastX.showShortToast(R.string.mykfxfddx_txt); + return; + } + BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(this, R.style.BottomSheetDialog); + + View bottomView = LayoutInflater.from(UserPhotoDetailsActivity.this).inflate(R.layout.bottom_sheet_layout, null); + + + coloseIvShare = (ImageView) bottomView.findViewById(R.id.colose_iv); + recyclerShare = (RecyclerView) bottomView.findViewById(R.id.recycler); + commentEtShare = (EditText) bottomView.findViewById(R.id.comment_et); + + shareBt = (TextView) bottomView.findViewById(R.id.share_bt); + initList(); + bottomSheetDialog.setContentView(bottomView); + bottomSheetDialog.show(); + + bottomSheetDialog.setOnDismissListener(dialog -> getWindow().setNavigationBarColor(getResources().getColor(R.color.black))); + coloseIvShare.setOnClickListener(v -> bottomSheetDialog.dismiss()); + shareBt.setOnClickListener(v -> { + + boolean isSelect = false; + for (Boolean type : titleUsersIsCheck) { + if (type) { + isSelect = true; + } + } + if (!isSelect) { + ToastX.showShortToast(getString(R.string.qxxzyfxddx_txt)); + return; + } + + + UserAlbumBean.UserAlbum userAlbum1 = albumBean.getUserAlbum(); + UserAlbumsAttachment customerAttachment = new UserAlbumsAttachment(userAlbum1.getId(), + userAlbum1.getUserId(), userAlbum1.getName(), + userAlbum1.getType(), userAlbum1.getPassword(), albumBean.getFileCount(), albumBean.getCoverImg()); + LogUtils.i("获取到的数据:" + GsonUtils.beanToJSONString(customerAttachment)); + //创建IMMessage,其中sessionId代表会话ID,sessionType会话类型,content代表消息内容,customerAttachment自定义消息 + for (int i = 0; i < titleUsersIsCheck.size(); i++) { + if (titleUsersIsCheck.get(i)) { + toShareMessage(titleUsers.get(i), userAlbum1.getName(), customerAttachment, bottomSheetDialog, commentEtShare.getText().toString().trim()); + } + } + + }); + AdaptScreenUtils.setWhiteNavigationBar(bottomSheetDialog); + + } + + private void initList() { + + linearLayoutManager = new LinearLayoutManager(UserPhotoDetailsActivity.this); + linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); + recyclerShare.setLayoutManager(linearLayoutManager); + commonAdapter = new CommonAdapter<>(UserPhotoDetailsActivity.this, R.layout.item_share_list, titleUsers) { + @Override + public void convert(ViewHolder holder, UserShareBean s, int index) { + ImageView select_iv = holder.getView(R.id.select_iv); + + ContactAvatarView imageView = holder.getView(R.id.logo_iv); + + if (s.getTeamInfo() != null) { + ColorUtils.loadGroupAvator(s.getTeamInfo().getIcon(), imageView); +// imageView.setData( +// s.getTeamInfo().getIcon(), s.getTeamInfo().getName(), AvatarColor.avatarColor(s.getTeamInfo().getId())); + holder.setText(R.id.title_tv, s.getTeamInfo().getName()); + } else { + LogUtils.i("用户信息:" + GsonUtils.beanToJSONString(s.getFriendInfo())); + + FriendInfo friendInfo = s.getFriendInfo(); + NimUserInfo user = NIMClient.getService(UserService.class).getUserInfo(friendInfo.getAccount()); + if (user != null) { + holder.setText(R.id.title_tv, user.getName()); + ColorUtils.loadAvator(user.getAvatar(), imageView); +// imageView.setData( +// user.getAvatar(), user.getName(), AvatarColor.avatarColor(user.getAccount())); + } + } + + + if (titleUsersIsCheck.get(index)) { + select_iv.setImageResource(R.mipmap.dialog_item_gou); + } else { + select_iv.setImageResource(R.mipmap.dialog_item_quan); + } + holder.getView(R.id.big_bg).setOnClickListener(v -> { + titleUsersIsCheck.set(index, !titleUsersIsCheck.get(index)); + commonAdapter.notifyItemChanged(index, titleUsersIsCheck.get(index)); + LogUtils.i("0000000000"); + + changeItemButton(); + }); + } + }; + recyclerShare.setAdapter(commonAdapter); + } + + private void changeItemButton() { + LogUtils.i("1111111111111111"); + boolean isSelcet = false; + for (boolean item : titleUsersIsCheck) { + if (item) { + isSelcet = true; + break; + } + } + chagnBottom(isSelcet); + + } + + private void chagnBottom(boolean b) { + LogUtils.i("22222222222:" + b); + + if (b) { + shareBt.setBackground(getResources().getDrawable(R.drawable.button_true_bg)); + shareBt.setEnabled(true); + } else { + shareBt.setBackground(getResources().getDrawable(R.drawable.button_false_bg_new)); + shareBt.setEnabled(false); + + } + } + + //分享相册消息 + private void toShareMessage(UserShareBean conversationInfo, String content, UserAlbumsAttachment customerAttachment, BottomSheetDialog bottomSheetDialog, String fujiaTxt) { + IMMessage customMessage = null; + if (conversationInfo.getTeamInfo() != null) { + customMessage = MessageBuilder.createCustomMessage(conversationInfo.getTeamInfo().getId(), SessionTypeEnum.Team, content, customerAttachment); + } else if (conversationInfo.getFriendInfo() != null) { + customMessage = MessageBuilder.createCustomMessage(conversationInfo.getFriendInfo().getAccount(), SessionTypeEnum.P2P, content, customerAttachment); + } + LogUtils.i("发送消息结构体:" + GsonUtils.beanToJSONString(customerAttachment)); + + + if (customMessage != null) { + ChatRepo.sendMessage(customMessage, false, new FetchCallback() { + @Override + public void onSuccess(@Nullable Void unused) { + ToastX.showShortToast(getString(R.string.message_share_success)); + bottomSheetDialog.dismiss(); + } + + @Override + public void onFailed(int i) { + bottomSheetDialog.dismiss(); + } + + @Override + public void onException(@Nullable Throwable throwable) { + bottomSheetDialog.dismiss(); + } + }); + } + + + if (!TextUtils.isEmpty(fujiaTxt)) { + IMMessage textMessage = null; + if (conversationInfo.getTeamInfo() != null) { + textMessage = MessageBuilder.createTextMessage(conversationInfo.getTeamInfo().getId(), SessionTypeEnum.Team, fujiaTxt); + } else if (conversationInfo.getFriendInfo() != null) { + textMessage = MessageBuilder.createTextMessage(conversationInfo.getFriendInfo().getAccount(), SessionTypeEnum.P2P, fujiaTxt); + } + ChatRepo.sendMessage(textMessage, false, new FetchCallback() { + @Override + public void onSuccess(@Nullable Void unused) { + + } + + @Override + public void onFailed(int i) { + bottomSheetDialog.dismiss(); + } + + @Override + public void onException(@Nullable Throwable throwable) { + } + }); + } + + } + +} diff --git a/app/src/main/java/com/dskj/rbchat/main/mine/photo/UserPhotoListActivity.java b/app/src/main/java/com/dskj/rbchat/main/mine/photo/UserPhotoListActivity.java new file mode 100644 index 0000000..63349fe --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/mine/photo/UserPhotoListActivity.java @@ -0,0 +1,345 @@ +package com.dskj.rbchat.main.mine.photo; + +import android.Manifest; +import android.content.Intent; +import android.content.res.ColorStateList; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Rect; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.provider.Settings; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.util.TypedValue; +import android.view.View; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.activity.result.ActivityResult; +import androidx.activity.result.ActivityResultCallback; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContract; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.widget.AppCompatImageView; +import androidx.core.app.ActivityOptionsCompat; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.ItemTouchHelper; +import androidx.recyclerview.widget.RecyclerView; + +import com.bumptech.glide.Glide; + +import com.bumptech.glide.request.RequestOptions; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.base.LllChatBaseActivity; +import com.dskj.rbchat.databinding.ActivityUserphotosBinding; + +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.dialog.ActionInputConfirmDialog; +import com.dskj.rbchat.dialog.SelectPhotoTypeDialog; +import com.dskj.rbchat.event.UserAlbumsUpdateEvent; +import com.dskj.rbchat.main.MainActivity; +import com.dskj.rbchat.model.AlbumBean; +import com.dskj.rbchat.model.UserAlbumBean; +import com.dskj.rbchat.model.WalletBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.ApiService; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.AdaptScreenUtils; +import com.dskj.rbchat.utils.AnimUtil; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.ItemDragTouchHelperCallback; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.voom.PushActivity; +import com.dskj.rbchat.voom.TiktokActivity; +import com.dskj.rbchat.widget.CircleImageView; +import com.dskj.rbchat.widget.GridItemDecoration; +import com.luck.picture.lib.basic.PictureSelector; +import com.luck.picture.lib.config.SelectMimeType; +import com.luck.picture.lib.entity.LocalMedia; +import com.luck.picture.lib.interfaces.OnResultCallbackListener; +import com.luck.picture.lib.style.BottomNavBarStyle; +import com.luck.picture.lib.style.PictureSelectorStyle; +import com.luck.picture.lib.style.SelectMainStyle; +import com.luck.picture.lib.style.TitleBarStyle; +import com.netease.yunxin.kit.chatkit.repo.ContactRepo; +import com.netease.yunxin.kit.chatkit.ui.common.GlideEngine; +import com.netease.yunxin.kit.chatkit.ui.dialog.PermissionExplainDialog; +import com.netease.yunxin.kit.common.ui.utils.ToastUtils; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.common.utils.PermissionUtils; +import com.netease.yunxin.kit.common.utils.SizeUtils; +import com.netease.yunxin.kit.corekit.event.EventCenter; +import com.netease.yunxin.kit.corekit.event.EventNotify; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.model.FriendInfo; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; +import jp.wasabeef.glide.transformations.BlurTransformation; + + +/** + * 用户相册 + */ +public class UserPhotoListActivity extends LllChatBaseActivity { + + ActivityUserphotosBinding binding; + CommonAdapter commonAdapter; + private String userId; + private String userName; + private int pageSize = 1; + private List userAlbumBeans = new ArrayList<>(); + private boolean isMe; + private ActivityResultLauncher launcher; + + EventNotify updateNotify = + new EventNotify<>() { + @Override + public void onNotify(@NonNull UserAlbumsUpdateEvent event) { + isMe = true; + getUserAlbum(); + } + + @NonNull + @Override + public String getEventType() { + return UserAlbumsUpdateEvent.EVENT_TYPE; + } + }; + + @Override + public int initNavigationBarColor() { + return getColor(R.color.color_white); + } + + @Override + public int initStatusBarColor() { + return getColor(R.color.color_titlebar); + } + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = ActivityUserphotosBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + EventCenter.registerEventNotify(updateNotify); + binding.userphotoTitleBar.setOnBackIconClickListener(view -> finish()); + userId = getIntent().getStringExtra("userId"); + userName = getIntent().getStringExtra("userName"); + isMe = IMKitClient.account().equals(userId); + launcher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback() { + @Override + public void onActivityResult(ActivityResult result) { + if (result.getResultCode() == RESULT_OK) { + //刷新 + isMe = true; + pageSize = 1; + getUserAlbum(); + } + } + }); + setTitleView(); + initListView(); + initRefreshLayout(); + getUserAlbum(); + } + + public void setTitleView() { + binding.userphotoTitleBar.getTitleTextView().setTextSize(TypedValue.COMPLEX_UNIT_SP, 20); + binding.userphotoTitleBar.setTitle(getString(R.string.userphoto_title, isMe ? getString(R.string.wo_txt) : userName)); + if (isMe) { + binding.userphotoTitleBar.setRightTextViewVisible(View.VISIBLE); + TextView textView = binding.userphotoTitleBar.getRightTextView(); + textView.setText(getString(R.string.userphoto_create_titile)); + textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14); + textView.setTextColor(getColor(R.color.color_themepink)); + textView.setOnClickListener(view -> { + launcher.launch(new Intent(this, AddPhotoActivity.class)); + }); + } + } + + + public void initListView() { + //Pattern r = Pattern.compile(pattern); + // Matcher m = r.matcher(str); + GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 2); + binding.recyclerPhotos.setLayoutManager(gridLayoutManager); + commonAdapter = new CommonAdapter(this, R.layout.item_useralbum_list, userAlbumBeans) { + @Override + public void convert(ViewHolder holder, UserAlbumBean s, int index) { + TextView tvAdd = holder.getView(R.id.tv_useralbum_add); + AppCompatImageView ivalbum = holder.getView(R.id.iv_useralbum_img); + TextView tvNumber = holder.getView(R.id.tv_useralbum_number); + AppCompatImageView ivType = holder.getView(R.id.iv_useralbum_type); + TextView tvTitle = holder.getView(R.id.tv_useralbum_title); + FrameLayout layoutPwd = holder.getView(R.id.layout_useralbum_inputpwd); + ivType.setVisibility(View.GONE); + tvAdd.setVisibility(View.GONE); + layoutPwd.setVisibility(View.GONE); + tvNumber.setVisibility(View.VISIBLE); + ivalbum.setImageResource(0); + if (index == 0 && isMe) { + tvAdd.setVisibility(View.VISIBLE); + tvNumber.setVisibility(View.GONE); + ivalbum.setBackgroundColor(Color.parseColor("#EEEEEE")); + tvTitle.setText(""); + } else { + tvTitle.setText(s.getUserAlbum().getName()); + tvNumber.setText(s.getFileCount() + ""); + layoutPwd.setVisibility(s.getUserAlbum().getType() == 3 && !isMe ? View.VISIBLE : View.GONE); + tvNumber.setVisibility(s.getUserAlbum().getType() == 3 && !isMe ? View.GONE : View.VISIBLE); + if (s.getUserAlbum().getType() == 3 && !isMe) { + Glide.with(UserPhotoListActivity.this) + .load(s.getLastFile()) + .apply(RequestOptions.bitmapTransform(new BlurTransformation(25, 2))) //RequestOptions对glide加载的图片进行配置 + .into(ivalbum); + } else { + Glide.with(UserPhotoListActivity.this).load(s.getLastFile()).into(ivalbum); + } + if (isMe) { + ivType.setVisibility(View.VISIBLE); + switch (s.getUserAlbum().getType()) { + case 1: + ivType.setBackgroundResource(R.mipmap.ic_useralbum_public); + break; + case 2: + ivType.setBackgroundResource(R.mipmap.ic_useralbum_friend); + break; + case 3: + ivType.setBackgroundResource(R.mipmap.ic_useralbum_private); + break; + } + } + } + + layoutPwd.setOnClickListener(view -> { + // + showDialogInputPwd(s); + }); + ivalbum.setOnClickListener(view -> { + if (index == 0 && isMe) { + launcher.launch(new Intent(UserPhotoListActivity.this, AddPhotoActivity.class)); + } else { + startPhotoDetails(s); + } + }); + } + + + }; + binding.recyclerPhotos.setAdapter(commonAdapter); + + } + + private void initRefreshLayout() { + binding.refreshLayout.setEnableLoadMore(false); + binding.refreshLayout.setEnableRefresh(false); +// binding.refreshLayout.setOnRefreshListener(refreshlayout -> { +// pageSize = 1; +// binding.refreshLayout.setVisibility(View.VISIBLE); +// binding.refreshLayout.setEnableLoadMore(true); +// getUserAlbum(); +// +// +// }); +// binding.refreshLayout.setOnLoadMoreListener(refreshLayout -> { +// pageSize += 1; +// getUserAlbum(); +// }); + } + + public void getUserAlbum() { + Api.getInstance().getUserAlbums(userId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>>() { + @Override + public void onSuccess(Result> o) { + LogUtils.d("OOOO==" + o.data); + binding.refreshLayout.finishRefresh(); + binding.refreshLayout.finishLoadMore(); + userAlbumBeans.clear(); + if (isMe) { + userAlbumBeans.add(new UserAlbumBean()); + } + userAlbumBeans.addAll(o.data); +// if (o.data.size() > 0) { +// if (pageSize == 1) { +// userAlbumBeans.clear(); +// userAlbumBeans.add(new UserAlbumBean()); +// } +// } + commonAdapter.notifyDataSetChanged(); + } + + @Override + public void onError(int code, String msg) { + if (isMe) { + userAlbumBeans.add(new UserAlbumBean()); + } + } + }); + } + + public void startPhotoDetails(UserAlbumBean s) { + startActivity(new Intent(UserPhotoListActivity.this, UserPhotoDetailsActivity.class) + .putExtra("albumId", s.getUserAlbum().getId()) + .putExtra("password", s.getUserAlbum().getPassword()) + .putExtra("userId", s.getUserAlbum().getUserId())); + + } + + public void showDialogInputPwd(UserAlbumBean userAlbumBean) { + //输入密码 + ActionInputConfirmDialog inputConfirmDialog = new ActionInputConfirmDialog(this, getString(R.string.userphoto_jiesuoalbum_title), getString(R.string.cancel_txt), getString(R.string.userphoto_jiesuoalbum_confirm)); + + inputConfirmDialog.setOnToActionListener(new ActionInputConfirmDialog.OnToActionListener() { + + @Override + public void toSumbit(String value) { + if (TextUtils.isEmpty(value)) { + ToastX.showShortToast(getString(R.string.userphoto_jiesuoalbum_hint)); + return; + } + if (value.trim().equals(userAlbumBean.getUserAlbum().getPassword().trim())) { + startPhotoDetails(userAlbumBean); + } else { + ToastX.showShortToast(getString(R.string.userphoto_jiesuoalbum_toast)); + } + + } + + @Override + public void toCancel() { + + } + }); + inputConfirmDialog.show(); + } + + @Override + protected void onDestroy() { + EventCenter.unregisterEventNotify(updateNotify); + super.onDestroy(); + + } +} diff --git a/app/src/main/java/com/dskj/rbchat/main/mine/photo/UserSelectPhotoActivity.java b/app/src/main/java/com/dskj/rbchat/main/mine/photo/UserSelectPhotoActivity.java new file mode 100644 index 0000000..4558285 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/mine/photo/UserSelectPhotoActivity.java @@ -0,0 +1,240 @@ +package com.dskj.rbchat.main.mine.photo; + +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.KEY_TEAM_ICON; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.KEY_TEAM_NAME; +import static com.netease.yunxin.kit.corekit.im.utils.RouterConstant.REQUEST_CONTACT_SELECTOR_KEY; + +import android.Manifest; +import android.content.Intent; +import android.os.Build; +import android.os.Bundle; +import android.text.TextUtils; +import android.util.TypedValue; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.alibaba.sdk.android.oss.ClientException; +import com.alibaba.sdk.android.oss.OSSClient; +import com.alibaba.sdk.android.oss.ServiceException; +import com.alibaba.sdk.android.oss.callback.OSSCompletedCallback; +import com.alibaba.sdk.android.oss.common.auth.OSSCredentialProvider; +import com.alibaba.sdk.android.oss.common.auth.OSSStsTokenCredentialProvider; +import com.alibaba.sdk.android.oss.model.PutObjectRequest; +import com.alibaba.sdk.android.oss.model.PutObjectResult; +import com.bumptech.glide.Glide; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.base.LllChatBaseActivity; +import com.dskj.rbchat.databinding.ActivityUserphotosDetailsBinding; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.model.AlbumItemBean; +import com.dskj.rbchat.model.StsCredentialsBean; +import com.dskj.rbchat.model.UserAlbumBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.widget.CircleImageView; +import com.luck.picture.lib.basic.PictureSelector; +import com.luck.picture.lib.config.SelectMimeType; +import com.luck.picture.lib.entity.LocalMedia; +import com.luck.picture.lib.interfaces.OnResultCallbackListener; +import com.luck.picture.lib.style.BottomNavBarStyle; +import com.luck.picture.lib.style.PictureSelectorStyle; +import com.luck.picture.lib.style.SelectMainStyle; +import com.luck.picture.lib.style.TitleBarStyle; +import com.netease.yunxin.kit.chatkit.ui.common.GlideEngine; +import com.netease.yunxin.kit.chatkit.ui.dialog.PermissionExplainDialog; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.common.utils.PermissionUtils; +import com.netease.yunxin.kit.contactkit.ui.ContactConstant; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.utils.RouterConstant; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +/** + * 选择封面 + */ +public class UserSelectPhotoActivity extends LllChatBaseActivity { + + ActivityUserphotosDetailsBinding binding; + CommonAdapter rootAdapter; + private int albumId; + private int pageSize = 1; + private List listdata = new ArrayList<>(); + + @Override + public int initNavigationBarColor() { + return getColor(R.color.color_white); + } + + @Override + public int initStatusBarColor() { + return getColor(R.color.color_titlebar); + } + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + binding = ActivityUserphotosDetailsBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + binding.userphotoTitleBar.setOnBackIconClickListener(view -> finish()); + albumId = getIntent().getIntExtra("albumId", 0); + setTitleView(); + initListView(); + initRefreshLayout(); + getDataList(); + + + } + + public void setTitleView() { + binding.userphotoTitleBar.setOnBackIconClickListener(view -> onBackPressed()); + binding.userphotoTitleBar.getTitleTextView().setTextSize(TypedValue.COMPLEX_UNIT_SP, 20); + binding.userphotoTitleBar.setTitle(getString(R.string.userphoto_cover_title)); + } + + + private CommonAdapter commonitemAdapter; + + + public void initListView() { + binding.recyclerPhotos.setLayoutManager(new LinearLayoutManager(this)); + rootAdapter = new CommonAdapter<>(this, R.layout.chat_his_child_itemtop, listdata) { + + @Override + public void convert(ViewHolder holder, AlbumItemBean itemBean, int index) { + TextView tvTitle = holder.getView(R.id.title_tv); + TextView tvSelector = holder.getView(R.id.title_selector_tv); + tvTitle.setText(itemBean.getTime()); + tvTitle.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + tvTitle.setTextColor(getColor(R.color.color_383838)); + RecyclerView recyclerView = holder.getView(R.id.item_recyclerview); + recyclerView.setVisibility(View.VISIBLE); + tvSelector.setVisibility(View.GONE); + List items = itemBean.getAlbumItems(); + recyclerView.setLayoutManager(new GridLayoutManager(UserSelectPhotoActivity.this, 4)); + commonitemAdapter = new CommonAdapter<>(UserSelectPhotoActivity.this, R.layout.chat_his_child_item1, items) { + @Override + public void convert(ViewHolder holder, AlbumItemBean.AlbumItem item, int itemindex) { + + CircleImageView circleImageView = holder.getView(R.id.item_civ); + ImageView ivselected = holder.getView(R.id.item_iv_selector); + ivselected.setVisibility(View.GONE); + if (!TextUtils.isEmpty(item.getFileUrl())) { + Glide.with(UserSelectPhotoActivity.this) + .load(item.getFileUrl()) + .into(circleImageView); + } else { + Glide.with(UserSelectPhotoActivity.this) + .load("") + .error(R.color.color_f4f4f4) + .into(circleImageView); + } + holder.getView(R.id.big_ly).setOnClickListener(v -> { + //跳转 + toResult(item.getId(), item.getFileUrl()); + }); + } + }; + recyclerView.setAdapter(commonitemAdapter); + } + }; + binding.recyclerPhotos.setAdapter(rootAdapter); + + } + + + private void initRefreshLayout() { + binding.refreshLayout.setEnableRefresh(false); + binding.refreshLayout.setEnableLoadMore(false); +// binding.refreshLayout.setOnRefreshListener(refreshlayout -> { +// pageSize = 1; +// binding.refreshLayout.setVisibility(View.VISIBLE); +// binding.refreshLayout.setEnableLoadMore(true); +// // getDateList(); +// +// +// }); +// binding.refreshLayout.setOnLoadMoreListener(refreshLayout -> { +// pageSize += 1; +// // getDateList(); +// }); + } + + + private void getDataList() { + Map objectMap = new HashMap<>(); + Api.getInstance().getAlbums(albumId,objectMap) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result o) { + if (pageSize == 1) { + listdata.clear(); + } + if (o.data.getFiles() != null) { + forMap(o.data.getFiles()); + rootAdapter.notifyDataSetChanged(); + } + + } + + @Override + public void onError(int code, String msg) { + LogUtils.d("error o===" + msg); + } + }); + } + + + public void forMap(Map> map) { + Set keys = map.keySet(); + if (!keys.isEmpty()) { + for (String time : keys) { + AlbumItemBean itemBean = new AlbumItemBean(); + itemBean.setTime(time); + itemBean.setAlbumItems(map.get(time)); + listdata.add(itemBean); + } + } + } + + + public void toResult(String id, String url) { + Intent result = new Intent(); + result.putExtra("coverId", id); + result.putExtra("url", url); + setResult(RESULT_OK, result); + finish(); + } + + + @Override + public void onBackPressed() { + super.onBackPressed(); + toResult("", ""); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/main/mine/photo/WatchImagesActivity.java b/app/src/main/java/com/dskj/rbchat/main/mine/photo/WatchImagesActivity.java new file mode 100644 index 0000000..07982fc --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/mine/photo/WatchImagesActivity.java @@ -0,0 +1,492 @@ +package com.dskj.rbchat.main.mine.photo; + +import android.content.Intent; +import android.graphics.Bitmap; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.text.TextUtils; +import android.util.Log; +import android.util.TypedValue; +import android.view.LayoutInflater; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; +import androidx.appcompat.app.ActionBar; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.OrientationHelper; +import androidx.recyclerview.widget.RecyclerView; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.target.CustomTarget; +import com.bumptech.glide.request.transition.Transition; +import com.dskj.rbchat.R; +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.base.LllChatBaseActivity; +import com.dskj.rbchat.databinding.ActivityWatchPhotosBinding; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.event.UserAlbumsUpdateEvent; +import com.dskj.rbchat.main.MainActivity; +import com.dskj.rbchat.model.AlbumItemBean; +import com.dskj.rbchat.model.UserAlbumBean; +import com.dskj.rbchat.model.UserShareBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.AdaptScreenUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.ShareDateUtils; +import com.dskj.rbchat.utils.ToolKits; +import com.dskj.rbchat.widget.CircleImageView; +import com.google.android.material.bottomsheet.BottomSheetDialog; +import com.luck.picture.lib.photoview.PhotoView; +import com.netease.nim.highavailable.LogUtils; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.msg.MessageBuilder; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.nimlib.sdk.msg.model.IMMessage; +import com.netease.nimlib.sdk.uinfo.UserService; +import com.netease.nimlib.sdk.uinfo.model.NimUserInfo; +import com.netease.yunxin.kit.chatkit.repo.ChatRepo; +import com.netease.yunxin.kit.chatkit.ui.custom.UserAlbumsAttachment; +import com.netease.yunxin.kit.chatkit.ui.page.adapter.WatchMediaAdapter; +import com.netease.yunxin.kit.chatkit.ui.view.ViewPagerLayoutManager; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.common.ui.widgets.ContactAvatarView; +import com.netease.yunxin.kit.common.utils.UriUtils; +import com.netease.yunxin.kit.contactkit.ui.utils.ColorUtils; +import com.netease.yunxin.kit.corekit.event.EventCenter; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.model.FriendInfo; +import com.netease.yunxin.kit.corekit.im.provider.FetchCallback; +import com.netease.yunxin.kit.corekit.im.provider.FetchCallbackImpl; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class WatchImagesActivity extends LllChatBaseActivity { + + ActivityWatchPhotosBinding binding; + private ViewPagerLayoutManager mLayoutManager; + private CommonAdapter mAdapter; + int firstDisplayImageIndex; + private String userId; + private boolean isMe; + private List listData; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); +// this.requestWindowFeature(Window.FEATURE_NO_TITLE); +// this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, +// WindowManager.LayoutParams.FLAG_FULLSCREEN); +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { +// getWindow().setDecorFitsSystemWindows(false); +// } else { +// getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); +// } + this.requestWindowFeature(Window.FEATURE_NO_TITLE); + this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, + WindowManager.LayoutParams.FLAG_FULLSCREEN); + binding = ActivityWatchPhotosBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + firstDisplayImageIndex = getIntent().getIntExtra("position", 0); + listData = (List) getIntent().getSerializableExtra("listData"); + userId = getIntent().getStringExtra("userId"); + binding.ivBack.setOnClickListener(view -> finish()); + isMe = userId.equals(IMKitClient.account()); + binding.ivLeft.setImageResource(isMe ? R.mipmap.ic_albums_download : R.mipmap.ic_albums_share); + binding.ivRight.setImageResource(isMe ? R.mipmap.ic_albums_delete : R.mipmap.ic_albums_download); + initListData(); + binding.recyclerPhotos.scrollToPosition(firstDisplayImageIndex); + binding.recyclerPhotos.addOnScrollListener(new RecyclerView.OnScrollListener() { + @Override + public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) { + super.onScrollStateChanged(recyclerView, newState); + if (newState == RecyclerView.SCROLL_STATE_IDLE) { + firstDisplayImageIndex = mLayoutManager.findFirstVisibleItemPosition(); + LogUtils.d("VideoPlayer", "position===" + firstDisplayImageIndex); + } + } + + @Override + public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { + super.onScrolled(recyclerView, dx, dy); + } + }); + shareDateUtils = new ShareDateUtils(); + shareDateUtils.getAllSessionList(); + binding.ivLeft.setOnClickListener(v -> { + if (isMe) { + downloadImage(); + } else { + onShareImage(); + } + }); + binding.ivRight.setOnClickListener(v -> { + if (isMe) { + onDeleteImage(); + } else { + downloadImage(); + } + }); + } + + @Override + public int initNavigationBarColor() { + return getColor(com.netease.yunxin.kit.common.ui.R.color.color_black); + } + + @Override + public int initStatusBarColor() { + return 0; + } + +// @Override +// public void onWindowFocusChanged(boolean hasFocus) { +// super.onWindowFocusChanged(hasFocus); +// if (hasFocus) { +// hideSystemUI(); +// } +// } +// +// private void hideSystemUI() { +// View decorView = getWindow().getDecorView(); +// decorView.setSystemUiVisibility( +// View.SYSTEM_UI_FLAG_IMMERSIVE +// // Set the content to appear under the system bars so that the +// // content doesn't resize when the system bars hide and show. +// | View.SYSTEM_UI_FLAG_LAYOUT_STABLE +// | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION +// | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN +// // Hide the nav bar and status bar +// | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION +// | View.SYSTEM_UI_FLAG_FULLSCREEN); +// } + + private void downloadImage() { + Glide.with(WatchImagesActivity.this).asBitmap().load(listData.get(firstDisplayImageIndex).getFileUrl()).into(new CustomTarget() { + @Override + public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition transition) { + if (resource != null) { + // 保存到相册成功 + if (ToolKits.saveBmp2Gallery(WatchImagesActivity.this, resource)) { + ToastX.showShortToast(com.netease.yunxin.kit.chatkit.ui.R.string.chat_message_image_save); + } else { + ToastX.showShortToast(com.netease.yunxin.kit.chatkit.ui.R.string.chat_message_image_save_fail); + } + } else { + ToastX.showShortToast(com.netease.yunxin.kit.chatkit.ui.R.string.chat_message_image_save_fail); + } + + } + + @Override + public void onLoadCleared(@Nullable Drawable placeholder) { + + } + }); + } + + private void onShareImage() { + toShareAction(listData.get(firstDisplayImageIndex)); + } + + private void onDeleteImage() { + ActionConfirmDialog actionConfirmDialog = new ActionConfirmDialog(WatchImagesActivity.this, getString(R.string.userphoto_dialog_deletecontent2), getString(R.string.cancel_txt), getString(R.string.sure_txt)); + actionConfirmDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + toDeletePic(); + } + + @Override + public void toCancel() { + + } + }); + actionConfirmDialog.show(); + } + + private List selectAlbumId = new ArrayList<>(); + + private void toDeletePic() { + showLoading(); + selectAlbumId.clear(); + selectAlbumId.add(listData.get(firstDisplayImageIndex).getId()); + Map params = new HashMap<>(); + params.put("fileIds", selectAlbumId); + Api.getInstance().deleteAlbumsPic(params) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver() { + @Override + public void onSuccess(Result feedbackResp) { + dismissLoading(); + setResult(RESULT_OK); + finish(); + } + + @Override + public void onError(int code, String msg) { + dismissLoading(); + } + }); + } + + private void initListData() { + mLayoutManager = new ViewPagerLayoutManager(this, OrientationHelper.HORIZONTAL); + mAdapter = new CommonAdapter<>(this, R.layout.item_watch_images, listData) { + + @Override + public void convert(ViewHolder holder, AlbumItemBean.AlbumItem itemBean, int index) { + PhotoView photoView = holder.getView(R.id.watch_image_view); + Glide.with(WatchImagesActivity.this).load(itemBean.getFileUrl()).into(photoView); + photoView.setOnClickListener(view -> WatchImagesActivity.this.finish()); + } + }; + binding.recyclerPhotos.setLayoutManager(mLayoutManager); + binding.recyclerPhotos.setAdapter(mAdapter); + } + + + private ShareDateUtils shareDateUtils; + private ArrayList titleUsers; + private ArrayList titleUsersIsCheck; + + private ImageView coloseIvShare; + private RecyclerView recyclerShare; + private EditText commentEtShare; + private TextView shareBt; + private LinearLayoutManager linearLayoutManager; + private CommonAdapter commonAdapter; + + @RequiresApi(api = Build.VERSION_CODES.M) + private void toShareAction(AlbumItemBean.AlbumItem albumItem) { + + titleUsers = shareDateUtils.getConverstionShareInfo(); + titleUsersIsCheck = new ArrayList<>(); + for (UserShareBean conversationInfo : titleUsers) { + titleUsersIsCheck.add(false); + } + if (titleUsers == null || titleUsers.size() == 0) { + ToastX.showShortToast(R.string.mykfxfddx_txt); + return; + } + BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(this, R.style.BottomSheetDialog); + + View bottomView = LayoutInflater.from(WatchImagesActivity.this).inflate(R.layout.bottom_sheet_layout, null); + + + coloseIvShare = (ImageView) bottomView.findViewById(R.id.colose_iv); + recyclerShare = (RecyclerView) bottomView.findViewById(R.id.recycler); + commentEtShare = (EditText) bottomView.findViewById(R.id.comment_et); + + shareBt = (TextView) bottomView.findViewById(R.id.share_bt); + initList(); + bottomSheetDialog.setContentView(bottomView); + bottomSheetDialog.show(); + + bottomSheetDialog.setOnDismissListener(dialog -> getWindow().setNavigationBarColor(getResources().getColor(R.color.black))); + coloseIvShare.setOnClickListener(v -> bottomSheetDialog.dismiss()); + shareBt.setOnClickListener(v -> { + + boolean isSelect = false; + for (Boolean type : titleUsersIsCheck) { + if (type) { + isSelect = true; + } + } + if (!isSelect) { + ToastX.showShortToast(getString(R.string.qxxzyfxddx_txt)); + return; + } + + Glide.with(WatchImagesActivity.this).asBitmap().load(albumItem.getFileUrl()).into(new CustomTarget() { + @Override + public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition transition) { + if (resource != null) { + Uri fileUri = ToolKits.saveBmp2GalleryShare(WatchImagesActivity.this, resource); + if (fileUri != null) { + sendMessage(fileUri, bottomSheetDialog); + } else { + ToastX.showShortToast(getString(R.string.message_share_fail)); + } + } + bottomSheetDialog.dismiss(); + } + + @Override + public void onLoadCleared(@Nullable Drawable placeholder) { + + } + }); + + + }); + AdaptScreenUtils.setWhiteNavigationBar(bottomSheetDialog); + + } + + Handler mHandler = new Handler(); + + private void sendMessage(Uri uri, BottomSheetDialog bottomSheetDialog) { + mHandler.postDelayed(() -> { + File imageFile = UriUtils.uri2File(uri); + + for (int i = 0; i < titleUsersIsCheck.size(); i++) { + if (titleUsersIsCheck.get(i)) { + toShareMessage(titleUsers.get(i), imageFile, bottomSheetDialog, commentEtShare.getText().toString().trim()); + + } + } + + }, 100); + } + + private void initList() { + + linearLayoutManager = new LinearLayoutManager(WatchImagesActivity.this); + linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); + recyclerShare.setLayoutManager(linearLayoutManager); + commonAdapter = new CommonAdapter<>(WatchImagesActivity.this, R.layout.item_share_list, titleUsers) { + @Override + public void convert(ViewHolder holder, UserShareBean s, int index) { + ImageView select_iv = holder.getView(R.id.select_iv); + + ContactAvatarView imageView = holder.getView(R.id.logo_iv); + + if (s.getTeamInfo() != null) { + ColorUtils.loadGroupAvator(s.getTeamInfo().getIcon(), imageView); +// imageView.setData( +// s.getTeamInfo().getIcon(), s.getTeamInfo().getName(), AvatarColor.avatarColor(s.getTeamInfo().getId())); + holder.setText(R.id.title_tv, s.getTeamInfo().getName()); + } else { + com.dskj.rbchat.utils.LogUtils.i("用户信息:" + GsonUtils.beanToJSONString(s.getFriendInfo())); + + FriendInfo friendInfo = s.getFriendInfo(); + NimUserInfo user = NIMClient.getService(UserService.class).getUserInfo(friendInfo.getAccount()); + if (user != null) { + holder.setText(R.id.title_tv, user.getName()); + ColorUtils.loadAvator(user.getAvatar(), imageView); +// imageView.setData( +// user.getAvatar(), user.getName(), AvatarColor.avatarColor(user.getAccount())); + } + } + + + if (titleUsersIsCheck.get(index)) { + select_iv.setImageResource(R.mipmap.dialog_item_gou); + } else { + select_iv.setImageResource(R.mipmap.dialog_item_quan); + } + holder.getView(R.id.big_bg).setOnClickListener(v -> { + titleUsersIsCheck.set(index, !titleUsersIsCheck.get(index)); + commonAdapter.notifyItemChanged(index, titleUsersIsCheck.get(index)); + com.dskj.rbchat.utils.LogUtils.i("0000000000"); + + changeItemButton(); + }); + } + }; + recyclerShare.setAdapter(commonAdapter); + } + + private void changeItemButton() { + com.dskj.rbchat.utils.LogUtils.i("1111111111111111"); + boolean isSelcet = false; + for (boolean item : titleUsersIsCheck) { + if (item) { + isSelcet = true; + break; + } + } + chagnBottom(isSelcet); + + } + + private void chagnBottom(boolean b) { + com.dskj.rbchat.utils.LogUtils.i("22222222222:" + b); + + if (b) { + shareBt.setBackground(getResources().getDrawable(R.drawable.button_true_bg)); + shareBt.setEnabled(true); + } else { + shareBt.setBackground(getResources().getDrawable(R.drawable.button_false_bg_new)); + shareBt.setEnabled(false); + + } + } + + //分享图片消息 + private void toShareMessage(UserShareBean conversationInfo, File imageFile, BottomSheetDialog bottomSheetDialog, String fujiaTxt) { + IMMessage imageMsg = null; + if (conversationInfo.getTeamInfo() != null) { + imageMsg = MessageBuilder.createImageMessage(conversationInfo.getTeamInfo().getId(), SessionTypeEnum.Team, imageFile); + } else if (conversationInfo.getFriendInfo() != null) { + imageMsg = MessageBuilder.createImageMessage(conversationInfo.getFriendInfo().getAccount(), SessionTypeEnum.P2P, imageFile); + } + if (imageMsg != null) { + ChatRepo.sendMessage( + imageMsg, + false, + new FetchCallbackImpl() { + @Override + public void onSuccess(@Nullable Void param) { + super.onSuccess(param); + ToastX.showShortToast(R.string.message_share_success); + } + + @Override + public void onFailed(int code) { + + } + }); + } + + if (!TextUtils.isEmpty(fujiaTxt)) { + IMMessage textMessage = null; + if (conversationInfo.getTeamInfo() != null) { + textMessage = MessageBuilder.createTextMessage(conversationInfo.getTeamInfo().getId(), SessionTypeEnum.Team, fujiaTxt); + } else if (conversationInfo.getFriendInfo() != null) { + textMessage = MessageBuilder.createTextMessage(conversationInfo.getFriendInfo().getAccount(), SessionTypeEnum.P2P, fujiaTxt); + } + ChatRepo.sendMessage(textMessage, false, new FetchCallback() { + @Override + public void onSuccess(@Nullable Void unused) { + + } + + @Override + public void onFailed(int i) { + bottomSheetDialog.dismiss(); + } + + @Override + public void onException(@Nullable Throwable throwable) { + } + }); + } + + } + +} diff --git a/app/src/main/java/com/dskj/rbchat/main/mine/setting/ClearCacheActivity.java b/app/src/main/java/com/dskj/rbchat/main/mine/setting/ClearCacheActivity.java new file mode 100644 index 0000000..7a225a3 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/mine/setting/ClearCacheActivity.java @@ -0,0 +1,63 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.main.mine.setting; + +import android.os.Bundle; +import androidx.annotation.Nullable; +import androidx.lifecycle.ViewModelProvider; +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.ActivityClearCacheBinding; +import com.dskj.rbchat.utils.DataUtils; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.common.ui.viewmodel.LoadStatus; + +public class ClearCacheActivity extends BaseActivity { + + private ActivityClearCacheBinding viewBinding; + private ClearCacheViewModel viewModel; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + changeStatusBarColor(R.color.color_e9eff5); + viewBinding = ActivityClearCacheBinding.inflate(getLayoutInflater()); + viewModel = new ViewModelProvider(this).get(ClearCacheViewModel.class); + setContentView(viewBinding.getRoot()); + initView(); + } + + @Override + protected void onResume() { + super.onResume(); + viewModel.getSdkCacheSize(); + } + + private void initView() { + viewBinding.clearSdkFl.setOnClickListener( + v -> { + viewModel.clearSDKCache(); + viewBinding.clearSdkSizeTv.setText(getString(R.string.cache_size_null_text)); + }); + viewBinding.clearMessageFl.setOnClickListener( + v -> { + viewModel.clearMessageCache(); + ToastX.showShortToast(R.string.clear_message_tips); + }); + viewModel + .getSdkCacheLiveData() + .observe( + this, + result -> { + if (result.getLoadStatus() == LoadStatus.Success) { + long size = result.getData() != null ? result.getData() : 0; + String text = + String.format(getString(R.string.cache_size_text), DataUtils.getSizeToM(size)); + viewBinding.clearSdkSizeTv.setText(text); + } + }); + viewBinding.settingTitleBar.setOnBackIconClickListener(v -> onBackPressed()); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/main/mine/setting/ClearCacheViewModel.java b/app/src/main/java/com/dskj/rbchat/main/mine/setting/ClearCacheViewModel.java new file mode 100644 index 0000000..6ecd7b6 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/mine/setting/ClearCacheViewModel.java @@ -0,0 +1,74 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.main.mine.setting; + +import androidx.annotation.Nullable; +import androidx.lifecycle.MutableLiveData; +import com.netease.nimlib.sdk.misc.DirCacheFileType; +import com.netease.yunxin.kit.common.ui.viewmodel.BaseViewModel; +import com.netease.yunxin.kit.common.ui.viewmodel.FetchResult; +import com.netease.yunxin.kit.common.ui.viewmodel.LoadStatus; +import com.netease.yunxin.kit.corekit.im.provider.FetchCallback; +import com.netease.yunxin.kit.corekit.im.repo.MiscRepo; +import java.util.ArrayList; +import java.util.List; + +public class ClearCacheViewModel extends BaseViewModel { + + private final MutableLiveData> sdkCacheLiveData = new MutableLiveData<>(); + + public MutableLiveData> getSdkCacheLiveData() { + return sdkCacheLiveData; + } + + public void getSdkCacheSize() { + MiscRepo.INSTANCE.getCacheSize( + getSDKFileType(), + new FetchCallback() { + @Override + public void onSuccess(@Nullable Long param) { + FetchResult fetchResult = new FetchResult(LoadStatus.Success); + fetchResult.setData(param); + sdkCacheLiveData.postValue(fetchResult); + } + + @Override + public void onFailed(int code) {} + + @Override + public void onException(@Nullable Throwable exception) {} + }); + } + + public void clearSDKCache() { + + MiscRepo.INSTANCE.clearCacheSize( + getSDKFileType(), + new FetchCallback() { + @Override + public void onSuccess(@Nullable Void param) {} + + @Override + public void onFailed(int code) {} + + @Override + public void onException(@Nullable Throwable exception) {} + }); + } + + public void clearMessageCache() { + MiscRepo.INSTANCE.clearMessageCache(); + } + + private List getSDKFileType() { + List types = new ArrayList<>(); + types.add(DirCacheFileType.AUDIO); + types.add(DirCacheFileType.THUMB); + types.add(DirCacheFileType.IMAGE); + types.add(DirCacheFileType.VIDEO); + types.add(DirCacheFileType.OTHER); + return types; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/main/mine/setting/SettingActivity.java b/app/src/main/java/com/dskj/rbchat/main/mine/setting/SettingActivity.java new file mode 100644 index 0000000..eef4a56 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/mine/setting/SettingActivity.java @@ -0,0 +1,144 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.main.mine.setting; + +import android.content.Intent; +import android.os.Bundle; +import android.view.ViewGroup; +import android.widget.Toast; + +import androidx.annotation.DrawableRes; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.lifecycle.ViewModelProvider; + +import com.dskj.rbchat.AppSkinConfig; +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.ActivityMineSettingBinding; +import com.dskj.rbchat.login.LoginActivity; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.welcome.WelcomeActivity; +import com.netease.yunxin.kit.chatkit.ui.custom.ChatConfigManager; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.utils.SizeUtils; +import com.netease.yunxin.kit.corekit.im.IMKitClient; + +public class SettingActivity extends BaseActivity { + + private ActivityMineSettingBinding viewBinding; + private SettingViewModel viewModel; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + changeStatusBarColor(R.color.color_e9eff5); + super.onCreate(savedInstanceState); + viewBinding = ActivityMineSettingBinding.inflate(getLayoutInflater()); + viewModel = new ViewModelProvider(this).get(SettingViewModel.class); + setContentView(viewBinding.getRoot()); + initView(); + } + + private void initView() { + // delete alias + + // show read and unread status + viewBinding.messageReadSc.setChecked(viewModel.getShowReadStatus()); + viewBinding.messageReadSc.setOnClickListener( + v -> { + boolean checked = viewBinding.messageReadSc.isChecked(); + viewModel.setShowReadStatus(checked); + ChatConfigManager.showReadStatus = checked; + }); + + //audio play mode AUDIO_PLAY_EARPIECE or AUDIO_PLAY_OUTSIDE + viewBinding.playModeSc.setChecked(viewModel.getAudioPlayMode()); + viewBinding.playModeSc.setOnClickListener( + v -> { + boolean checked = viewBinding.playModeSc.isChecked(); + viewModel.setAudioPlayMode(checked); + }); + + viewBinding.notifyFl.setOnClickListener( + v -> startActivity(new Intent(SettingActivity.this, SettingNotifyActivity.class))); + + viewBinding.skinFl.setOnClickListener( + v -> startActivity(new Intent(SettingActivity.this, SkinActivity.class))); + + viewBinding.clearFl.setOnClickListener( + v -> startActivity(new Intent(SettingActivity.this, ClearCacheActivity.class))); + + viewBinding.tvLogout.setOnClickListener( + v -> { + // logout your own account here + //... + IMKitClient.logoutIM( + new com.netease.yunxin.kit.corekit.im.login.LoginCallback() { + @Override + public void onError(int errorCode, @NonNull String errorMsg) { + Toast.makeText( + SettingActivity.this, + "error code is " + errorCode + ", message is " + errorMsg, + Toast.LENGTH_SHORT) + .show(); + } + + @Override + public void onSuccess(@Nullable Void data) { + if (getApplicationContext() instanceof IMApplication) { + ((IMApplication) getApplicationContext()) + .clearActivity(SettingActivity.this); + } + DataUtils.set(SettingActivity.this, IMUIKitConfig.LOGIN_ACCOUNT, ""); + DataUtils.set(SettingActivity.this, IMUIKitConfig.LOGIN_TOKEN, ""); + startActivity(new Intent(SettingActivity.this, WelcomeActivity.class)); + finish(); + } + }); + }); + + viewBinding.settingTitleBar.setOnBackIconClickListener(v -> onBackPressed()); + if (AppSkinConfig.getInstance().getAppSkinStyle() == AppSkinConfig.AppSkin.commonSkin) { + changeStatusBarColor(R.color.fun_page_bg_color); + viewBinding.clRoot.setBackgroundResource(R.color.fun_page_bg_color); + viewBinding.nextGroupLl.setBackgroundResource(R.color.color_white); + ViewGroup.MarginLayoutParams layoutParams = + (ViewGroup.MarginLayoutParams) viewBinding.nextGroupLl.getLayoutParams(); + layoutParams.setMargins(0, 0, 0, 0); + viewBinding.nextGroupLl.setLayoutParams(layoutParams); + + viewBinding.notifyMessageLl.setBackgroundResource(R.color.color_white); + ViewGroup.MarginLayoutParams layoutParamsN = + (ViewGroup.MarginLayoutParams) viewBinding.notifyMessageLl.getLayoutParams(); + layoutParamsN.setMargins(0, SizeUtils.dp2px(6), 0, 0); + viewBinding.notifyMessageLl.setLayoutParams(layoutParamsN); + + viewBinding.tvLogout.setBackgroundResource(R.color.color_white); + ViewGroup.MarginLayoutParams layoutParamsL = + (ViewGroup.MarginLayoutParams) viewBinding.tvLogout.getLayoutParams(); + layoutParamsL.setMargins(0, SizeUtils.dp2px(6), 0, 0); + viewBinding.tvLogout.setLayoutParams(layoutParamsL); + + updateCommonView( + R.drawable.fun_setting_bg_switch_thumb_selector, + R.drawable.fun_setting_bg_switch_track_selector); + } + } + + @Override + protected void onResume() { + super.onResume(); + } + + private void updateCommonView(@DrawableRes int thumbRes, @DrawableRes int trackRes) { + + viewBinding.messageReadSc.setThumbResource(thumbRes); + viewBinding.messageReadSc.setTrackResource(trackRes); + + viewBinding.playModeSc.setThumbResource(thumbRes); + viewBinding.playModeSc.setTrackResource(trackRes); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/main/mine/setting/SettingNewActivity.java b/app/src/main/java/com/dskj/rbchat/main/mine/setting/SettingNewActivity.java new file mode 100644 index 0000000..7f4412c --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/mine/setting/SettingNewActivity.java @@ -0,0 +1,75 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.main.mine.setting; + +import android.content.Intent; +import android.os.Bundle; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Toast; + +import androidx.annotation.DrawableRes; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.lifecycle.ViewModelProvider; + +import com.dskj.rbchat.AppSkinConfig; +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.ActivityMineSettingBinding; +import com.dskj.rbchat.databinding.ActivitySettingBinding; +import com.dskj.rbchat.main.mine.MineFragment; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.welcome.WelcomeActivity; +import com.google.android.gms.maps.CameraUpdateFactory; +import com.google.android.gms.maps.GoogleMap; +import com.google.android.gms.maps.MapFragment; +import com.google.android.gms.maps.OnMapReadyCallback; +import com.google.android.gms.maps.model.LatLng; +import com.google.android.gms.maps.model.MarkerOptions; +import com.netease.yunxin.kit.chatkit.ui.custom.ChatConfigManager; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.utils.SizeUtils; +import com.netease.yunxin.kit.corekit.im.IMKitClient; + +public class SettingNewActivity extends BaseActivity implements OnMapReadyCallback { + + private ActivitySettingBinding viewBinding; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + getWindow().setStatusBarColor(getResources().getColor(R.color.color_white)); + getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white)); + super.onCreate(savedInstanceState); + viewBinding = ActivitySettingBinding.inflate(getLayoutInflater()); + setContentView(viewBinding.getRoot()); + initView(); + } + + private void initView() { + viewBinding.settingTitleBar.getBackImageView().setOnClickListener(v -> finish()); + + MapFragment mapFragment = (MapFragment) getFragmentManager() + .findFragmentById(R.id.mapview); + mapFragment.getMapAsync(this); + + + } + + + @Override + public void onMapReady(@NonNull GoogleMap googleMap) { + LatLng sydney = new LatLng(-33.867, 151.206); + + googleMap.setMyLocationEnabled(true); + googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, 13)); + + googleMap.addMarker(new MarkerOptions() + .title("Sydney") + .snippet("The most populous city in Australia.") + .position(sydney)); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/main/mine/setting/SettingNotifyActivity.java b/app/src/main/java/com/dskj/rbchat/main/mine/setting/SettingNotifyActivity.java new file mode 100644 index 0000000..aa15598 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/mine/setting/SettingNotifyActivity.java @@ -0,0 +1,156 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.main.mine.setting; + +import android.app.Service; +import android.content.Intent; +import android.os.Build; +import android.os.Bundle; +import android.os.VibrationEffect; +import android.os.Vibrator; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; +import androidx.lifecycle.ViewModelProvider; + +import com.dskj.rbchat.AppSkinConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.ActivityMineSettingNotifyBinding; +import com.dskj.rbchat.utils.GsonUtils; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.viewmodel.LoadStatus; +import com.netease.yunxin.kit.common.utils.SizeUtils; +import com.netease.yunxin.kit.corekit.im.IMKitClient; + +public class SettingNotifyActivity extends BaseActivity { + + private ActivityMineSettingNotifyBinding viewBinding; + private SettingNotifyViewModel viewModel; +// private IMUserExtension userExtension; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + changeStatusBarColor(R.color.color_f7f7f7); + getWindow().setNavigationBarColor(getResources().getColor(R.color.color_f7f7f7)); + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR|View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR); + +// String extension = IMKitClient.getUserInfo().getExtension(); +// userExtension = GsonUtils.getObjFromJSON(extension, IMUserExtension.class); + super.onCreate(savedInstanceState); + viewBinding = ActivityMineSettingNotifyBinding.inflate(getLayoutInflater()); + viewModel = new ViewModelProvider(this).get(SettingNotifyViewModel.class); + setContentView(viewBinding.getRoot()); + + viewModel + .getNotifyDetailLiveData() + .observe( + this, + result -> { + if (result.getLoadStatus() == LoadStatus.Error && result.getData() != null) { + viewBinding.notifyShowInfoSc.setChecked(!result.getData()); + } + }); + + viewModel + .getToggleNotificationLiveData() + .observe( + this, + result -> { + if (result.getLoadStatus() == LoadStatus.Error && result.getData() != null) { + viewBinding.notifySc.setChecked(!result.getData()); + } + }); + } + + @Override + protected void onResume() { + super.onResume(); + initView(); + } + + @RequiresApi(api = Build.VERSION_CODES.O) + private void initView() { + viewBinding.notifySc.setChecked(viewModel.getToggleNotification()); + viewBinding.notifySc.setOnClickListener( + v -> { + viewModel.setToggleNotification(viewBinding.notifySc.isChecked()); +// userExtension.setNotify(!userExtension.isNotify()); +// AppUtils.updateUserExtension(GsonUtils.beanToJSONString(userExtension)); + } + ); + viewBinding.notifyRingSc.setChecked(viewModel.getRingToggle()); + viewBinding.notifyRingSc.setOnClickListener( + v -> viewModel.setRingToggle(viewBinding.notifyRingSc.isChecked())); + viewBinding.notifyShakeSc.setChecked(viewModel.getVibrateToggle()); + viewBinding.notifyShakeSc.setOnClickListener(view -> { + viewModel.setVibrateToggle(viewBinding.notifyShakeSc.isChecked()); + closeOpenVibrator(viewBinding.notifyShakeSc.isChecked()); + }); + viewBinding.notifyShowInfoSc.setChecked(!viewModel.getPushShowNoDetail()); + viewBinding.notifyShowInfoSc.setOnClickListener( + v -> viewModel.setPushShowNoDetail(!viewBinding.notifyShowInfoSc.isChecked())); + viewBinding.settingTitleBar.setOnBackIconClickListener(v -> onBackPressed()); + if (AppSkinConfig.getInstance().getAppSkinStyle() == AppSkinConfig.AppSkin.commonSkin) { + updateCommonView(); + } + viewBinding.messageringTv.setOnClickListener(view -> startActivity(new Intent(SettingNotifyActivity.this, SettingNotifyRingActivity.class).putExtra("type", 0))); + viewBinding.callringTv.setOnClickListener(view -> startActivity(new Intent(SettingNotifyActivity.this, SettingNotifyRingActivity.class).putExtra("type", 1))); + + } + + + + + private void closeOpenVibrator(boolean ischeck) { + Vibrator vibrator = (Vibrator) this.getSystemService(Service.VIBRATOR_SERVICE); + if (ischeck) { + VibrationEffect effect = null; + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) { + effect = VibrationEffect.createOneShot(500, VibrationEffect.DEFAULT_AMPLITUDE); + } + vibrator.vibrate(effect); + } else { + vibrator.cancel(); + } + } + + + private void updateCommonView() { + changeStatusBarColor(R.color.color_ededed); + viewBinding.clRoot.setBackgroundResource(R.color.color_ededed); + + viewBinding.notifyLl.setBackgroundResource(R.color.color_white); + ViewGroup.MarginLayoutParams layoutParamsN = + (ViewGroup.MarginLayoutParams) viewBinding.notifyLl.getLayoutParams(); + layoutParamsN.setMargins(0, SizeUtils.dp2px(4), 0, 0); + viewBinding.notifyLl.setLayoutParams(layoutParamsN); + + viewBinding.notifyModeLl.setBackgroundResource(R.color.color_white); + ViewGroup.MarginLayoutParams layoutParamsM = + (ViewGroup.MarginLayoutParams) viewBinding.notifyModeLl.getLayoutParams(); + layoutParamsM.setMargins(0, SizeUtils.dp2px(4), 0, 0); + viewBinding.notifyModeLl.setLayoutParams(layoutParamsM); + + viewBinding.pushModeLl.setBackgroundResource(R.color.color_white); + ViewGroup.MarginLayoutParams layoutParamsP = + (ViewGroup.MarginLayoutParams) viewBinding.pushModeLl.getLayoutParams(); + layoutParamsP.setMargins(0, SizeUtils.dp2px(4), 0, 0); + viewBinding.pushModeLl.setLayoutParams(layoutParamsP); + + viewBinding.notifySc.setThumbResource(R.drawable.fun_setting_bg_switch_thumb_selector); + viewBinding.notifySc.setTrackResource(R.drawable.fun_setting_bg_switch_track_selector); + + viewBinding.notifyRingSc.setThumbResource(R.drawable.fun_setting_bg_switch_thumb_selector); + viewBinding.notifyRingSc.setTrackResource(R.drawable.fun_setting_bg_switch_track_selector); + + viewBinding.notifyShakeSc.setThumbResource(R.drawable.fun_setting_bg_switch_thumb_selector); + viewBinding.notifyShakeSc.setTrackResource(R.drawable.fun_setting_bg_switch_track_selector); + + viewBinding.notifyShowInfoSc.setThumbResource(R.drawable.fun_setting_bg_switch_thumb_selector); + viewBinding.notifyShowInfoSc.setTrackResource(R.drawable.fun_setting_bg_switch_track_selector); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/main/mine/setting/SettingNotifyRingActivity.java b/app/src/main/java/com/dskj/rbchat/main/mine/setting/SettingNotifyRingActivity.java new file mode 100644 index 0000000..7bf220f --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/mine/setting/SettingNotifyRingActivity.java @@ -0,0 +1,189 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.main.mine.setting; + +import android.content.Context; +import android.media.AudioManager; +import android.media.MediaPlayer; +import android.net.Uri; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.LinearLayoutManager; + +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.databinding.ActivityRingSetBinding; +import com.dskj.rbchat.utils.AppUtils; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.netease.yunxin.kit.chatkit.ui.model.IMUserExtension; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.corekit.im.IMKitClient; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class SettingNotifyRingActivity extends BaseActivity { + + private ActivityRingSetBinding viewBinding; + private int type; + private String title; + private CommonAdapter ringAdapter; + private List listring = new ArrayList(); + private int selector; + private IMUserExtension userExtension; + private String[] messageBellName = new String[]{"xxmoren", "xxdaqi", "xxhuopo", "xxjianduan", "xxkeai", "xxliushui", "xxqingkuai", "xxqingcui", "xxquwei"}; + private String[] callBellName = new String[]{"lsmoren", "lsjincou", "lsjingdian", "lsqingcui", "lsqingxin", "lsshenmi", "lsyoumei", "lsyouxian", "lsyueer"}; + + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + changeStatusBarColor(R.color.color_f7f7f7); + getWindow().setNavigationBarColor(getResources().getColor(R.color.color_f7f7f7)); + super.onCreate(savedInstanceState); + viewBinding = ActivityRingSetBinding.inflate(getLayoutInflater()); + setContentView(viewBinding.getRoot()); + type = getIntent().getIntExtra("type", 0); + if (!TextUtils.isEmpty(IMKitClient.getUserInfo().getExtension())) { + userExtension = GsonUtils.getObjFromJSON(IMKitClient.getUserInfo().getExtension(), IMUserExtension.class); + } else { + userExtension = new IMUserExtension("xxmoren.caf", "lsmoren.caf"); + } + initView(); + } + + + private void initView() { + if (type == 0) { + title = getResources().getString(R.string.setting_notify_push_message); + listring.add(getString(R.string.bell_default)); + listring.add(getString(R.string.bell_generous)); + listring.add(getString(R.string.bell_lively)); + listring.add(getString(R.string.bell_brief)); + listring.add(getString(R.string.bell_loveliness)); + listring.add(getString(R.string.bell_flowingwater)); + listring.add(getString(R.string.bell_brisk)); + listring.add(getString(R.string.bell_clear)); + listring.add(getString(R.string.bell_interest)); + +// selector = DataUtils.get(this, IMUIKitConfig.RING_MESSAGE_TAG + "_" + IMKitClient.account(), 0); + String messageBell = userExtension.getMessageBell(); + if (TextUtils.isEmpty(messageBell)) { + selector = 0; + } else { + selector = Arrays.asList(messageBellName).indexOf(messageBell.substring(0, messageBell.indexOf("."))); + } + } else { + title = getResources().getString(R.string.setting_notify_push_call); + listring.add(getString(R.string.bell_default)); + listring.add(getString(R.string.bell_compact)); + listring.add(getString(R.string.bell_classic)); + listring.add(getString(R.string.bell_clear)); + listring.add(getString(R.string.bell_fresh)); + listring.add(getString(R.string.bell_mysterious)); + listring.add(getString(R.string.bell_graceful)); + listring.add(getString(R.string.bell_leisure)); + listring.add(getString(R.string.bell_euphonic)); + +// selector = DataUtils.get(this, IMUIKitConfig.RING_CALL_TAG + "_" + IMKitClient.account(), 0); + String callBell = userExtension.getCallBell(); + if (TextUtils.isEmpty(callBell)) { + selector = 0; + } else { + selector = Arrays.asList(callBellName).indexOf(callBell.substring(0, callBell.indexOf("."))); + } + } + + viewBinding.settingRingTitleBar.setTitle(title).setOnBackIconClickListener(view -> onBackPressed()); + viewBinding.recyclerviewRingset.setLayoutManager(new LinearLayoutManager(this)); + ringAdapter = new CommonAdapter<>(this, R.layout.ring_child_item, listring) { + + @Override + public void convert(ViewHolder holder, String s, int index) { + + TextView tvring = holder.getView(R.id.tv_ringtitle); + tvring.setText(s); + ImageView ivSelected = holder.getView(R.id.iv_ringselected); + ivSelected.setVisibility(View.GONE); + View line = holder.getView(R.id.line_ring); + line.setVisibility(View.VISIBLE); + if (selector == index) { + ivSelected.setVisibility(View.VISIBLE); + } + holder.getView(R.id.layout_ringroot).setOnClickListener(view -> { + selector = index; + notifyDataSetChanged(); + if (type == 0) { + // DataUtils.set(getApplication(), IMUIKitConfig.RING_MESSAGE_TAG + "_" + IMKitClient.account(), selector); + userExtension.setMessageBell(messageBellName[selector] + ".caf"); + playRing(messageBellName[selector]); + } else { +// DataUtils.set(getApplication(), IMUIKitConfig.RING_CALL_TAG + "_" + IMKitClient.account(), selector); + userExtension.setCallBell(callBellName[selector] + ".caf"); + playRing(callBellName[selector]); + } + AppUtils.updateUserExtension(GsonUtils.beanToJSONString(userExtension)); + }); + + if (index == listring.size() - 1) { + line.setVisibility(View.GONE); + } + + } + }; + + viewBinding.recyclerviewRingset.setAdapter(ringAdapter); + } + + MediaPlayer mMediaPlayer; + + /** + * 播放铃声 + */ + public void playRing(String name) { + try { + //用于获取手机 默认提示音(RingtoneManager.TYPE_NOTIFICATION) 的Uri + Uri ringUri = Uri.parse("android.resource://com.dskj.rbchat/raw/" + name); + if (mMediaPlayer == null) { + mMediaPlayer = new MediaPlayer(); + } + mMediaPlayer.reset(); + mMediaPlayer.setDataSource(SettingNotifyRingActivity.this, ringUri); + mMediaPlayer.setAudioStreamType(AudioManager.STREAM_NOTIFICATION); + mMediaPlayer.setLooping(false); + mMediaPlayer.prepare(); + mMediaPlayer.start(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + protected void onPause() { + if (mMediaPlayer != null && mMediaPlayer.isPlaying()) { + mMediaPlayer.stop(); + } + super.onPause(); + + } + + @Override + protected void onDestroy() { + if (mMediaPlayer != null) { + mMediaPlayer.release(); + } + mMediaPlayer = null; + super.onDestroy(); + + } +} diff --git a/app/src/main/java/com/dskj/rbchat/main/mine/setting/SettingNotifyViewModel.java b/app/src/main/java/com/dskj/rbchat/main/mine/setting/SettingNotifyViewModel.java new file mode 100644 index 0000000..f3d6563 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/mine/setting/SettingNotifyViewModel.java @@ -0,0 +1,126 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.main.mine.setting; + +import androidx.annotation.Nullable; +import androidx.lifecycle.MutableLiveData; +import com.dskj.rbchat.R; +import com.dskj.rbchat.utils.LogUtils; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.common.ui.viewmodel.BaseViewModel; +import com.netease.yunxin.kit.common.ui.viewmodel.FetchResult; +import com.netease.yunxin.kit.common.ui.viewmodel.LoadStatus; +import com.netease.yunxin.kit.corekit.im.provider.FetchCallback; +import com.netease.yunxin.kit.corekit.im.repo.SettingRepo; + +public class SettingNotifyViewModel extends BaseViewModel { + + private final MutableLiveData> notifyDetailLiveData = + new MutableLiveData<>(); + private final MutableLiveData> toggleNotificationLiveDataLiveData = + new MutableLiveData<>(); + + public MutableLiveData> getNotifyDetailLiveData() { + return notifyDetailLiveData; + } + + public MutableLiveData> getToggleNotificationLiveData() { + return toggleNotificationLiveDataLiveData; + } + + public boolean getToggleNotification() { + return SettingRepo.isPushNotify(); + } + + public void setToggleNotification(boolean value) { +// SettingRepo.setMessageNotification(value); + SettingRepo.setPushNotify( + value, + new FetchCallback() { + @Override + public void onSuccess(@Nullable Void param) { + ToastX.showShortToast(R.string.setting_success); + FetchResult fetchResult = new FetchResult<>(LoadStatus.Success); + fetchResult.setData(value); + toggleNotificationLiveDataLiveData.postValue(fetchResult); + } + + @Override + public void onFailed(int code) { + LogUtils.i("失败原因:"+code); + ToastX.showShortToast(R.string.setting_fail); + FetchResult fetchResult = new FetchResult<>(LoadStatus.Error); + fetchResult.setData(value); + toggleNotificationLiveDataLiveData.postValue(fetchResult); + } + + @Override + public void onException(@Nullable Throwable exception) { + ToastX.showShortToast(R.string.setting_fail); + FetchResult fetchResult = new FetchResult<>(LoadStatus.Error); + fetchResult.setData(value); + toggleNotificationLiveDataLiveData.postValue(fetchResult); + } + }); + } + + public boolean getRingToggle() { + return SettingRepo.getRingMode(); + } + + public void setRingToggle(boolean ring) { + SettingRepo.setRingMode(ring); + } + + public boolean getVibrateToggle() { + return SettingRepo.getVibrateMode(); + } + + public void setVibrateToggle(boolean mode) { + SettingRepo.setVibrateMode(mode); + } + + public boolean getMultiPortPushOpen() { + return SettingRepo.getMultiPortPushMode(); + } + + public void setMultiPortPushOpen(boolean mode) { + SettingRepo.setMultiPortPushMode(mode); + } + + public boolean getPushShowNoDetail() { + return !SettingRepo.getPushShowDetail(); + } + + public void setPushShowNoDetail(boolean mode) { + SettingRepo.setPushShowDetail( + mode, + new FetchCallback() { + @Override + public void onSuccess(@Nullable Void param) { + ToastX.showShortToast(R.string.setting_success); + FetchResult fetchResult = new FetchResult<>(LoadStatus.Success); + fetchResult.setData(mode); + notifyDetailLiveData.postValue(fetchResult); + } + + @Override + public void onFailed(int code) { + ToastX.showShortToast(R.string.setting_fail); + FetchResult fetchResult = new FetchResult<>(LoadStatus.Error); + fetchResult.setData(mode); + notifyDetailLiveData.postValue(fetchResult); + } + + @Override + public void onException(@Nullable Throwable exception) { + ToastX.showShortToast(R.string.setting_fail); + FetchResult fetchResult = new FetchResult<>(LoadStatus.Error); + fetchResult.setData(mode); + notifyDetailLiveData.postValue(fetchResult); + } + }); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/main/mine/setting/SettingViewModel.java b/app/src/main/java/com/dskj/rbchat/main/mine/setting/SettingViewModel.java new file mode 100644 index 0000000..c9cdc3a --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/mine/setting/SettingViewModel.java @@ -0,0 +1,27 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.main.mine.setting; + +import com.netease.yunxin.kit.common.ui.viewmodel.BaseViewModel; +import com.netease.yunxin.kit.corekit.im.repo.SettingRepo; + +public class SettingViewModel extends BaseViewModel { + + public boolean getShowReadStatus() { + return SettingRepo.getShowReadStatus(); + } + + public void setShowReadStatus(boolean delete) { + SettingRepo.setShowReadStatus(delete); + } + + public boolean getAudioPlayMode() { + return SettingRepo.getHandsetMode(); + } + + public void setAudioPlayMode(boolean mode) { + SettingRepo.setHandsetMode(mode); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/main/mine/setting/SkinActivity.java b/app/src/main/java/com/dskj/rbchat/main/mine/setting/SkinActivity.java new file mode 100644 index 0000000..111ce98 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/main/mine/setting/SkinActivity.java @@ -0,0 +1,52 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.main.mine.setting; + +import android.os.Bundle; +import androidx.annotation.Nullable; +import com.dskj.rbchat.AppSkinConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.ActivitySkinSettingBinding; +import com.dskj.rbchat.main.MainActivity; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.corekit.event.EventCenter; + +public class SkinActivity extends BaseActivity { + + private ActivitySkinSettingBinding viewBinding; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + changeStatusBarColor(R.color.color_ededed); + super.onCreate(savedInstanceState); + viewBinding = ActivitySkinSettingBinding.inflate(getLayoutInflater()); + setContentView(viewBinding.getRoot()); + initView(); + } + + private void initView() { + AppSkinConfig.AppSkin skin = AppSkinConfig.getInstance().getAppSkinStyle(); + setRadioSelected(skin); + viewBinding.rgSkin.setOnCheckedChangeListener( + (group, checkedId) -> { + if (checkedId == viewBinding.rbBaseSkin.getId()) { + AppSkinConfig.getInstance().setAppSkinStyle(AppSkinConfig.AppSkin.baseSkin); + } else if (checkedId == viewBinding.rbCommonSkin.getId()) { + AppSkinConfig.getInstance().setAppSkinStyle(AppSkinConfig.AppSkin.commonSkin); + } + EventCenter.notifyEvent(new MainActivity.SkinEvent()); + finish(); + }); + viewBinding.settingTitleBar.setOnBackIconClickListener(v -> onBackPressed()); + } + + private void setRadioSelected(AppSkinConfig.AppSkin skin) { + if (skin == AppSkinConfig.AppSkin.baseSkin) { + viewBinding.rbBaseSkin.setChecked(true); + } else if (skin == AppSkinConfig.AppSkin.commonSkin) { + viewBinding.rbCommonSkin.setChecked(true); + } + } +} diff --git a/app/src/main/java/com/dskj/rbchat/map/LocationPageActivity1.java b/app/src/main/java/com/dskj/rbchat/map/LocationPageActivity1.java new file mode 100644 index 0000000..b311158 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/map/LocationPageActivity1.java @@ -0,0 +1,497 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.map; + +import static com.netease.yunxin.kit.chatkit.ui.ChatKitUIConstant.LIB_TAG; + +import android.Manifest; +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Color; +import android.location.Location; +import android.location.LocationListener; +import android.location.LocationManager; +import android.net.NetworkInfo; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.view.KeyEvent; +import android.view.MotionEvent; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.view.inputmethod.EditorInfo; +import android.view.inputmethod.InputMethodManager; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.LinearLayoutManager; + +import com.bumptech.glide.Glide; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.databinding.ActivityLocation1Binding; +import com.dskj.rbchat.model.AdBean; +import com.dskj.rbchat.model.BillBean; +import com.dskj.rbchat.model.NearbySearchBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.BaseObserverNew; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.network.ResultNew; +import com.dskj.rbchat.utils.AppUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.KeyboardUtil; +import com.dskj.rbchat.utils.LogUtils; +import com.google.android.gms.common.ConnectionResult; +import com.google.android.gms.common.api.GoogleApiClient; +import com.google.android.gms.location.LocationRequest; +import com.google.android.gms.location.LocationServices; +import com.google.android.gms.maps.CameraUpdateFactory; +import com.google.android.gms.maps.GoogleMap; +import com.google.android.gms.maps.MapFragment; +import com.google.android.gms.maps.OnMapReadyCallback; +import com.google.android.gms.maps.model.BitmapDescriptorFactory; +import com.google.android.gms.maps.model.LatLng; +import com.google.android.gms.maps.model.Marker; +import com.google.android.gms.maps.model.MarkerOptions; +import com.netease.nimlib.sdk.msg.attachment.LocationAttachment; +import com.netease.nimlib.sdk.msg.model.IMMessage; +import com.netease.yunxin.kit.alog.ALog; +import com.netease.yunxin.kit.chatkit.map.ChatLocationBean; +import com.netease.yunxin.kit.chatkit.map.ILocationSearchCallback; +import com.netease.yunxin.kit.chatkit.map.IPageMapProvider; +import com.netease.yunxin.kit.chatkit.map.MapMode; +import com.netease.yunxin.kit.chatkit.ui.ActivityWorkaround; +import com.netease.yunxin.kit.chatkit.ui.ChatKitClient; +import com.netease.yunxin.kit.chatkit.ui.R; +import com.netease.yunxin.kit.chatkit.ui.databinding.ActivityLocationBinding; +import com.netease.yunxin.kit.chatkit.ui.page.LocationPageActivity; +import com.netease.yunxin.kit.chatkit.ui.page.adapter.SearchLocationAdapter; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.utils.TimeFormatUtils; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.common.utils.KeyboardUtils; +import com.netease.yunxin.kit.common.utils.LocationUtils; +import com.netease.yunxin.kit.common.utils.NetworkUtils; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class LocationPageActivity1 extends BaseActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener { + private static final String TAG = "LocationPageActivity"; + private GoogleMap mMap; + GoogleApiClient mGoogleApiClient; + LocationRequest mLocationRequest; + CommonAdapter commonAdapter; + public static final String SEND_LOCATION_RESULT = "SEND_LOCATION_RESULT"; + public static final String LAUNCH_TYPE = "LOCATION_LAUNCH_TYPE"; + public static final String LAUNCH_LOCATION_MESSAGE = "LAUNCH_LOCATION_MESSAGE"; + public static final int LAUNCH_SEND = 0; + public static final int LAUNCH_DETAIL = 1; + ActivityLocation1Binding binding; + int selectPosition = -1; + NearbySearchBean nearbySearchBean; + List nearbySearchBeans = new ArrayList<>(); + private SearchLocationAdapter adapter; + int launchType = LAUNCH_SEND; + IMMessage message; + private IPageMapProvider pageMapProvider; + LatLng sydney; + LatLng locLatLng; + Marker marker ; + public static void launch(Context context, int type, IMMessage message) { + Intent intent = new Intent(context, LocationPageActivity1.class); + intent.putExtra(LAUNCH_TYPE, type); + intent.putExtra(LAUNCH_LOCATION_MESSAGE, message); + context.startActivity(intent); + } + + private void initData(Intent intent) { + launchType = intent.getIntExtra(LAUNCH_TYPE, LAUNCH_SEND); + message = (IMMessage) intent.getSerializableExtra(LAUNCH_LOCATION_MESSAGE); + } + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white)); + binding = ActivityLocation1Binding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + initData(getIntent()); + + + MapFragment mapFragment = (MapFragment) getFragmentManager() + .findFragmentById(com.dskj.rbchat.R.id.mapview); + mapFragment.getMapAsync(LocationPageActivity1.this); + binding.mapViewCancel.setOnClickListener(v -> finish()); + binding.mapDetailBack.setOnClickListener(v -> finish()); + binding.mapViewSend.setOnClickListener( + v -> { + if (!NetworkUtils.isConnected()) { + return; + } + if (nearbySearchBean == null) { + Toast.makeText(this, R.string.chat_location_send_empty, Toast.LENGTH_LONG).show(); + return; + } + Intent result = new Intent(); + ChatLocationBean mSelectLoc = new ChatLocationBean(); + mSelectLoc.setCity(""); + mSelectLoc.setAddress(nearbySearchBean.getVicinity()); + mSelectLoc.setLat(nearbySearchBean.getGeometry().getLocation().getLat()); + mSelectLoc.setLng(nearbySearchBean.getGeometry().getLocation().getLng()); + mSelectLoc.setTitle(nearbySearchBean.getName()); + result.putExtra(SEND_LOCATION_RESULT, mSelectLoc); + setResult(RESULT_OK, result); + finish(); + }); + + if (launchType == LAUNCH_DETAIL) { + binding.mapViewTop.setVisibility(View.GONE); + binding.topVv.setVisibility(View.GONE); + binding.mapDetailBack.setVisibility(View.VISIBLE); + binding.locationSearchBar.setVisibility(View.GONE); + binding.locationSearchList.setVisibility(View.GONE); + binding.detailRy.setVisibility(View.VISIBLE); + pageMapProvider = ChatKitClient.getPageMapProvider(); + LocationAttachment attachment = (LocationAttachment) message.getAttachment(); + binding.mapDetailTitle.setText(message.getContent() + ""); + binding.mapDetailAddress.setText(attachment.getAddress() + ""); + + binding.detailRy.setOnClickListener(v -> { + if (pageMapProvider != null) { + pageMapProvider.jumpOutMap( + LocationPageActivity1.this, + message.getContent() + "", + attachment.getLatitude(), + attachment.getLongitude()); + } + }); + + renderForDetail(); + } else { + initAdapter(); + } + + + binding.locationSearch.setOnEditorActionListener((v, actionId, event) -> { + if (actionId == EditorInfo.IME_ACTION_SEARCH) { + search(binding.locationSearch.getText().toString()); + KeyboardUtil.hideSoftInput(LocationPageActivity1.this); + } + return false; + }); + + + } + + + private void renderForDetail() { + + } + + private void initAdapter() { + + LinearLayoutManager linearLayoutManager = new LinearLayoutManager(LocationPageActivity1.this); + binding.locationSearchList.setLayoutManager(linearLayoutManager); + commonAdapter = new CommonAdapter(LocationPageActivity1.this, R.layout.search_location_view_holder, nearbySearchBeans) { + @Override + public void convert(ViewHolder holder, NearbySearchBean s, int index) { + holder.setText(R.id.location_title, s.getName()); + holder.setText(R.id.location_desc, s.getVicinity()); + String desc = s.getVicinity(); + if(locLatLng!=null) { + float distance = gps2m(locLatLng.latitude,locLatLng.longitude,s.getGeometry().getLocation().getLat(),s.getGeometry().getLocation().getLng()); + if (distance > 0&&distance<1000) { + desc = getString(R.string.chat_message_location_distance, Math.ceil(distance), desc); + holder.setText(R.id.location_desc, desc); + + } + } + + if (selectPosition == index) { + holder.getView(R.id.location_selected).setVisibility(View.VISIBLE); + } else { + holder.getView(R.id.location_selected).setVisibility(View.GONE); + } + holder.itemView.setOnClickListener( + v -> { + LogUtils.i("数据是啥:" + GsonUtils.beanToJSONString(s)); + + nearbySearchBean = s; + selectPosition = index; + notifyDataSetChanged(); + if (mMap != null) { + sydney = new LatLng(s.getGeometry().getLocation().getLat(), s.getGeometry().getLocation().getLng()); + mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, 13)); + if(marker!=null){ + marker.remove(); + } + Bitmap bitmap = BitmapFactory.decodeResource(getResources(),com.netease.yunxin.kit.locationkit.R.drawable.ic_location_marker).copy(Bitmap.Config.ARGB_8888,true); + //ic_location_marker + marker = mMap.addMarker(new MarkerOptions() + .title(s.getName() + "") + .icon(BitmapDescriptorFactory.fromResource(com.netease.yunxin.kit.locationkit.R.drawable.ic_location_marker)) + .snippet(s.getVicinity()+"") + .position(sydney)); + } + + }); + } + }; + binding.locationSearchList.setAdapter(commonAdapter); + } + + // 计算两点距离 + private final double EARTH_RADIUS = 6378137.0; + private float gps2m(double lat_a, double lng_a, double lat_b, double lng_b) { + double radLat1 = (lat_a * Math.PI / 180.0); + double radLat2 = (lat_b * Math.PI / 180.0); + double a = radLat1 - radLat2; + double b = (lng_a - lng_b) * Math.PI / 180.0; + double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + + Math.cos(radLat1) * Math.cos(radLat2) + * Math.pow(Math.sin(b / 2), 2))); + s = s * EARTH_RADIUS; + s = Math.round(s * 10000) / 10000; + return (float) s; + } + + + @Override + public void overridePendingTransition(int enterAnim, int exitAnim) { + super.overridePendingTransition(0, 0); + } + + @Override + public void finish() { + super.finish(); + overridePendingTransition(0, 0); + } + + + @Override + public void onMapReady(@NonNull GoogleMap googleMap) { + mMap = googleMap; + mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); + buildGoogleApiClient(); + mMap.setMyLocationEnabled(true); + + +// mMap.addMarker(new MarkerOptions() +// .title("Sydney") +// .snippet("The most populous city in Australia.") +// .position(sydney)); + if (launchType == LAUNCH_SEND) { + getLocationPermission(); + } else { + LocationAttachment attachment = (LocationAttachment) message.getAttachment(); + sydney = new LatLng(attachment.getLatitude(), attachment.getLongitude()); + mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, 15)); + if(marker!=null){ + marker.remove(); + } + marker = mMap.addMarker(new MarkerOptions() + .icon(BitmapDescriptorFactory.fromResource(com.netease.yunxin.kit.locationkit.R.drawable.ic_location_marker)) + .title(message.getContent() + "") + .snippet(attachment.getAddress()) + .position(sydney)); + } + } + + + /** + * Prompts the user for permission to use the device location. + */ + private void getLocationPermission() { + /* + * Request location permission, so that we can get the location of the + * device. The result of the permission request is handled by a callback, + * onRequestPermissionsResult. + */ + if (ContextCompat.checkSelfPermission(this.getApplicationContext(), + android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { + requestLocationUpdate(); + } else { + ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, 1); + } + } + + /** + * Handles the result of the request for location permissions. + */ + @SuppressLint("MissingSuperCall") + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) { + if (requestCode == 1) { + requestLocationUpdate(); + } + } + + + private void requestLocationUpdate() { + + LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); + boolean enabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); + if (enabled) { + locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 2000L, 10f, new LocationListener() { + @Override + public void onLocationChanged(@NonNull Location location) { + if (location == null) { + Toast.makeText(LocationPageActivity1.this, "未有定位", Toast.LENGTH_SHORT).show(); + return; + } + LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); + if(latLng!=null) { + sydney = new LatLng(location.getLatitude(), location.getLongitude()); + locLatLng = new LatLng(location.getLatitude(), location.getLongitude()); + mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, 13)); + search(""); + } + + } + }); + } + } + + private void search(String s) { + selectPosition = -1; + if(sydney ==null){ + return; + } + if(TextUtils.isEmpty(s)) { + Api.getInstance().nearbysearch(sydney.latitude + "," + sydney.longitude, "10000", "", + "true", IMUIKitConfig.API_KEY) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserverNew<>() { + @Override + public void onSuccess(ResultNew> o) { + changeInfo(o.results); + + } + + @Override + public void onError(int code, String msg) { + + } + }); + }else{ + Api.getInstance().nearbysearch(sydney.latitude + "," + sydney.longitude, "10000", "", + "true", IMUIKitConfig.API_KEY,s) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserverNew<>() { + @Override + public void onSuccess(ResultNew> o) { + changeInfo(o.results); + + + } + + @Override + public void onError(int code, String msg) { + + } + }); + } + } + + /** + * 筛选掉不符合的数据 + * @param results + */ + private void changeInfo(List results) { + nearbySearchBeans = results; + commonAdapter.setDates(nearbySearchBeans); + } + + protected synchronized void buildGoogleApiClient() { + mGoogleApiClient = new GoogleApiClient.Builder(this) + .addConnectionCallbacks(this) + .addOnConnectionFailedListener(this) + .addApi(LocationServices.API) + .build(); + mGoogleApiClient.connect(); + } + +// +// @Override +// public void onLocationChanged(@NonNull Location location) { +// if(mMap!=null){ +// LatLng sydney = new LatLng(location.getLatitude(), location.getLongitude()); +// mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, 13)); +// } +// LogUtils.i("地点是啥:"+location.getLongitude()+";"+location.getLatitude()+";"+ GsonUtils.beanToJSONString(location)); +// Api.getInstance().nearbysearch(location.getLatitude()+","+location.getLongitude(),"10000","","true",getString(com.dskj.rbchat.R.string.google_map_key)) +// .subscribeOn(Schedulers.io()) +// .observeOn(AndroidSchedulers.mainThread()) +// .subscribe(new BaseObserver() { +// @Override +// public void onSuccess(Result feedbackResp) { +// +// } +// +// @Override +// public void onError(int code, String msg) { +// ToastX.showShortToast(msg+""); +// +// } +// }); +// } + + @Override + public void onConnected(@Nullable Bundle bundle) { +// mLocationRequest = new LocationRequest(); +// mLocationRequest.setInterval(1000); +// mLocationRequest.setFastestInterval(1000); +// mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); +// if (ContextCompat.checkSelfPermission(this, +// Manifest.permission.ACCESS_FINE_LOCATION) +// == PackageManager.PERMISSION_GRANTED) { +// LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); +// } + + } + + @Override + public void onConnectionSuspended(int i) { + + } + + @Override + public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { + + } + public boolean onTouchEvent(MotionEvent event) { + if(null != this.getCurrentFocus()){ + /** + * 点击空白位置 隐藏软键盘 + */ + InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + return mInputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0); + } + return super .onTouchEvent(event); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/ActivityMsgBean.java b/app/src/main/java/com/dskj/rbchat/model/ActivityMsgBean.java new file mode 100644 index 0000000..17787b1 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/ActivityMsgBean.java @@ -0,0 +1,131 @@ +package com.dskj.rbchat.model; + +import java.util.List; + + +public class ActivityMsgBean { + + private int total; + private List list; + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + + public List getList() { + return list; + } + + public void setList(List list) { + this.list = list; + } + + + public static class ListDTO { + + private String id; + + private int type; + + private String title; + + private String content; + + private String coverImg; + + private int sendMode; + + private String sendUsers; + + private String createTime; + + private String publishTime; + + private int status; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getCoverImg() { + return coverImg; + } + + public void setCoverImg(String coverImg) { + this.coverImg = coverImg; + } + + public int getSendMode() { + return sendMode; + } + + public void setSendMode(int sendMode) { + this.sendMode = sendMode; + } + + public String getSendUsers() { + return sendUsers; + } + + public void setSendUsers(String sendUsers) { + this.sendUsers = sendUsers; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getPublishTime() { + return publishTime; + } + + public void setPublishTime(String publishTime) { + this.publishTime = publishTime; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/AdBean.java b/app/src/main/java/com/dskj/rbchat/model/AdBean.java new file mode 100644 index 0000000..42f935c --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/AdBean.java @@ -0,0 +1,69 @@ +package com.dskj.rbchat.model; + + +public class AdBean { + + private Integer id; + private String title; + private String imgUrl; + private String jumpUrl; + private String createTime; + private Integer sort; + private Integer status; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public String getJumpUrl() { + return jumpUrl; + } + + public void setJumpUrl(String jumpUrl) { + this.jumpUrl = jumpUrl; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public Integer getSort() { + return sort; + } + + public void setSort(Integer sort) { + this.sort = sort; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/AddFriendBean.java b/app/src/main/java/com/dskj/rbchat/model/AddFriendBean.java new file mode 100644 index 0000000..7e7732f --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/AddFriendBean.java @@ -0,0 +1,9 @@ +package com.dskj.rbchat.model; + +public class AddFriendBean { + public String user_uid; + + public AddFriendBean(String user_uid) { + this.user_uid = user_uid; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/AfterCountBean.java b/app/src/main/java/com/dskj/rbchat/model/AfterCountBean.java new file mode 100644 index 0000000..0e2651e --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/AfterCountBean.java @@ -0,0 +1,14 @@ +package com.dskj.rbchat.model; + + +public class AfterCountBean { + private Integer count; + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/AiChatUpdateEvent.java b/app/src/main/java/com/dskj/rbchat/model/AiChatUpdateEvent.java new file mode 100644 index 0000000..493f55f --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/AiChatUpdateEvent.java @@ -0,0 +1,24 @@ +package com.dskj.rbchat.model; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.netease.nimlib.sdk.team.model.Team; +import com.netease.yunxin.kit.corekit.event.BaseEvent; + +public class AiChatUpdateEvent extends BaseEvent { + + public static final String EVENT_TYPE = "AiChatUpdateEvent"; + public String contentvalue; + + + public AiChatUpdateEvent(String contentvalue) { + this.contentvalue = contentvalue; + } + + @NonNull + @Override + public String getType() { + return EVENT_TYPE; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/dskj/rbchat/model/AiConvertBean.java b/app/src/main/java/com/dskj/rbchat/model/AiConvertBean.java new file mode 100644 index 0000000..905d404 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/AiConvertBean.java @@ -0,0 +1,23 @@ +package com.dskj.rbchat.model; + +public class AiConvertBean { + + public String originContent; + public String convertContent; + + public String getOriginContent() { + return originContent; + } + + public void setOriginContent(String originContent) { + this.originContent = originContent; + } + + public String getConvertContent() { + return convertContent; + } + + public void setConvertContent(String convertContent) { + this.convertContent = convertContent; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/AiMessageBean.java b/app/src/main/java/com/dskj/rbchat/model/AiMessageBean.java new file mode 100644 index 0000000..eef4839 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/AiMessageBean.java @@ -0,0 +1,31 @@ +package com.dskj.rbchat.model; + +import androidx.annotation.NonNull; + +public class AiMessageBean { + + public String message; + public boolean isAi; + + + public AiMessageBean(String message, boolean isAi) { + this.message = message; + this.isAi = isAi; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isAi() { + return isAi; + } + + public void setAi(boolean ai) { + isAi = ai; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/AlbumBean.java b/app/src/main/java/com/dskj/rbchat/model/AlbumBean.java new file mode 100644 index 0000000..2ed202a --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/AlbumBean.java @@ -0,0 +1,244 @@ +package com.dskj.rbchat.model; + +import java.io.Serializable; +import java.util.List; + + +public class AlbumBean implements Serializable { + + private String postId; + private Integer userId; + private Integer type; + private Integer visible; + private String createTime; + private String text; + private String picture1; + private String picture2; + private String picture3; + private String picture4; + private String picture5; + private String picture6; + private String picture7; + private String picture8; + private String picture9; + private String video; + private Double longitude; + private Double latitude; + private String positionName; + private String positionSubName; + private String userNickname; + private String userAvatar; + private List comments; + private List likes; + private List assets; + private Integer isDelete = 0; + + //0 常规 1 删除 2 通知更新数据 + public Integer getIsDelete() { + return isDelete; + } + + public void setIsDelete(Integer isDelete) { + this.isDelete = isDelete; + } + + public List getAssets() { + return assets; + } + + public void setAssets(List assets) { + this.assets = assets; + } + + public String getPostId() { + return postId; + } + + public void setPostId(String postId) { + this.postId = postId; + } + + public Integer getUserId() { + return userId; + } + + public void setUserId(Integer userId) { + this.userId = userId; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public Integer getVisible() { + return visible; + } + + public void setVisible(Integer visible) { + this.visible = visible; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + public String getPicture1() { + return picture1; + } + + public void setPicture1(String picture1) { + this.picture1 = picture1; + } + + public String getPicture2() { + return picture2; + } + + public void setPicture2(String picture2) { + this.picture2 = picture2; + } + + public String getPicture3() { + return picture3; + } + + public void setPicture3(String picture3) { + this.picture3 = picture3; + } + + public String getPicture4() { + return picture4; + } + + public void setPicture4(String picture4) { + this.picture4 = picture4; + } + + public String getPicture5() { + return picture5; + } + + public void setPicture5(String picture5) { + this.picture5 = picture5; + } + + public String getPicture6() { + return picture6; + } + + public void setPicture6(String picture6) { + this.picture6 = picture6; + } + + public String getPicture7() { + return picture7; + } + + public void setPicture7(String picture7) { + this.picture7 = picture7; + } + + public String getPicture8() { + return picture8; + } + + public void setPicture8(String picture8) { + this.picture8 = picture8; + } + + public String getPicture9() { + return picture9; + } + + public void setPicture9(String picture9) { + this.picture9 = picture9; + } + + public String getVideo() { + return video; + } + + public void setVideo(String video) { + this.video = video; + } + + 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 getPositionName() { + return positionName; + } + + public void setPositionName(String positionName) { + this.positionName = positionName; + } + + public String getPositionSubName() { + return positionSubName; + } + + public void setPositionSubName(String positionSubName) { + this.positionSubName = positionSubName; + } + + public String getUserNickname() { + return userNickname; + } + + public void setUserNickname(String userNickname) { + this.userNickname = userNickname; + } + + public String getUserAvatar() { + return userAvatar; + } + + public void setUserAvatar(String userAvatar) { + this.userAvatar = userAvatar; + } + + public List getComments() { + return comments; + } + + public void setComments(List comments) { + this.comments = comments; + } + + public List getLikes() { + return likes; + } + + public void setLikes(List likes) { + this.likes = likes; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/AlbumItemBean.java b/app/src/main/java/com/dskj/rbchat/model/AlbumItemBean.java new file mode 100644 index 0000000..00b6d46 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/AlbumItemBean.java @@ -0,0 +1,102 @@ +package com.dskj.rbchat.model; + +import java.io.Serializable; +import java.util.List; + +public class AlbumItemBean { + + public String time; + public List albumItems; + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public List getAlbumItems() { + return albumItems; + } + + public void setAlbumItems(List albumItems) { + this.albumItems = albumItems; + } + + public static class AlbumItem implements Serializable { + public String id; + public String albumId; + public String fileUrl; + public int type; + public int status; + public String recordDate; + public String createTime; + public boolean isSelected = false; + + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getAlbumId() { + return albumId; + } + + public void setAlbumId(String albumId) { + this.albumId = albumId; + } + + public String getFileUrl() { + return fileUrl; + } + + public void setFileUrl(String fileUrl) { + this.fileUrl = fileUrl; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + + public String getRecordDate() { + return recordDate; + } + + public void setRecordDate(String recordDate) { + this.recordDate = recordDate; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public boolean isSelected() { + return isSelected; + } + + public void setSelected(boolean selected) { + isSelected = selected; + } + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/AuthorizeBean.java b/app/src/main/java/com/dskj/rbchat/model/AuthorizeBean.java new file mode 100644 index 0000000..d5d621b --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/AuthorizeBean.java @@ -0,0 +1,15 @@ +package com.dskj.rbchat.model; + + +public class AuthorizeBean { + + private String authorizeCode; + + public String getAuthorizeCode() { + return authorizeCode; + } + + public void setAuthorizeCode(String authorizeCode) { + this.authorizeCode = authorizeCode; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/AvaterBean.java b/app/src/main/java/com/dskj/rbchat/model/AvaterBean.java new file mode 100644 index 0000000..d5becf2 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/AvaterBean.java @@ -0,0 +1,15 @@ +package com.dskj.rbchat.model; + + +public class AvaterBean { + + private String avatarFilename; + + public String getAvatarFilename() { + return avatarFilename; + } + + public void setAvatarFilename(String avatarFilename) { + this.avatarFilename = avatarFilename; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/BankBean.java b/app/src/main/java/com/dskj/rbchat/model/BankBean.java new file mode 100644 index 0000000..37108f8 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/BankBean.java @@ -0,0 +1,52 @@ +package com.dskj.rbchat.model; + + +public class BankBean { + + + private Integer id; + private String bankName; + private String abbreviation; + private String logo; + private String background; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getBankName() { + return bankName; + } + + public void setBankName(String bankName) { + this.bankName = bankName; + } + + public String getAbbreviation() { + return abbreviation; + } + + public void setAbbreviation(String abbreviation) { + this.abbreviation = abbreviation; + } + + public String getLogo() { + return logo; + } + + public void setLogo(String logo) { + this.logo = logo; + } + + public String getBackground() { + return background; + } + + public void setBackground(String background) { + this.background = background; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/BankListBean.java b/app/src/main/java/com/dskj/rbchat/model/BankListBean.java new file mode 100644 index 0000000..8facaae --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/BankListBean.java @@ -0,0 +1,85 @@ +package com.dskj.rbchat.model; + +public class BankListBean { + + private Integer id; + private Integer bankId; + private Integer userId; + private Integer type; + private String number; + private String cardholderName; + private String createTime; + private BankBean bank; + + public BankListBean() { + } + + public BankListBean(Integer id) { + this.id = id; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Integer getBankId() { + return bankId; + } + + public void setBankId(Integer bankId) { + this.bankId = bankId; + } + + public Integer getUserId() { + return userId; + } + + public void setUserId(Integer userId) { + this.userId = userId; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getNumber() { + return number; + } + + public void setNumber(String number) { + this.number = number; + } + + public String getCardholderName() { + return cardholderName; + } + + public void setCardholderName(String cardholderName) { + this.cardholderName = cardholderName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public BankBean getBank() { + return bank; + } + + public void setBank(BankBean bank) { + this.bank = bank; + } +} + diff --git a/app/src/main/java/com/dskj/rbchat/model/BillBean.java b/app/src/main/java/com/dskj/rbchat/model/BillBean.java new file mode 100644 index 0000000..2b5913a --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/BillBean.java @@ -0,0 +1,187 @@ +package com.dskj.rbchat.model; + + + +public class BillBean { + + private Long id; + private Integer walletId; + private Integer type; + private Long amount; + private Long balance; + private String createTime; + private String createTimestamp; + private Long convertCoinId; + private Integer isTimeout; + private String toGroupId; + private Long groupRedEnvelopeId; + private long privateRedEnvelopeId; + private Integer fromUserId; + private Integer toUserId; + private String fromGroupId; + private String fromUserNickname; + private WithdrawCashBean withdrawCashRecord; + private OauthAppBean oauthApp; + private TaskBean dailyTask; + private String coinModifyRemark; + + public String getCoinModifyRemark() { + return coinModifyRemark; + } + + public void setCoinModifyRemark(String coinModifyRemark) { + this.coinModifyRemark = coinModifyRemark; + } + + public String getCreateTimestamp() { + return createTimestamp; + } + + public void setCreateTimestamp(String createTimestamp) { + this.createTimestamp = createTimestamp; + } + + public TaskBean getDailyTask() { + return dailyTask; + } + + public void setDailyTask(TaskBean dailyTask) { + this.dailyTask = dailyTask; + } + + public OauthAppBean getOauthApp() { + return oauthApp; + } + + public void setOauthApp(OauthAppBean oauthApp) { + this.oauthApp = oauthApp; + } + + public WithdrawCashBean getWithdrawCashRecord() { + return withdrawCashRecord; + } + + public void setWithdrawCashRecord(WithdrawCashBean withdrawCashRecord) { + this.withdrawCashRecord = withdrawCashRecord; + } + + public String getFromUserNickname() { + return fromUserNickname; + } + + public void setFromUserNickname(String fromUserNickname) { + this.fromUserNickname = fromUserNickname; + } + + public String getFromGroupId() { + return fromGroupId; + } + + public void setFromGroupId(String fromGroupId) { + this.fromGroupId = fromGroupId; + } + + public Integer getToUserId() { + return toUserId; + } + + public void setToUserId(Integer toUserId) { + this.toUserId = toUserId; + } + + public Integer getFromUserId() { + return fromUserId; + } + + public void setFromUserId(Integer fromUserId) { + this.fromUserId = fromUserId; + } + + public Integer getIsTimeout() { + return isTimeout; + } + + public void setIsTimeout(Integer isTimeout) { + this.isTimeout = isTimeout; + } + + public String getToGroupId() { + return toGroupId; + } + + public void setToGroupId(String toGroupId) { + this.toGroupId = toGroupId; + } + + public Long getGroupRedEnvelopeId() { + return groupRedEnvelopeId; + } + + public void setGroupRedEnvelopeId(Long groupRedEnvelopeId) { + this.groupRedEnvelopeId = groupRedEnvelopeId; + } + + public long getPrivateRedEnvelopeId() { + return privateRedEnvelopeId; + } + + public void setPrivateRedEnvelopeId(long privateRedEnvelopeId) { + this.privateRedEnvelopeId = privateRedEnvelopeId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Integer getWalletId() { + return walletId; + } + + public void setWalletId(Integer walletId) { + this.walletId = walletId; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public Long getAmount() { + return amount; + } + + public void setAmount(Long amount) { + this.amount = amount; + } + + public Long getBalance() { + return balance; + } + + public void setBalance(Long balance) { + this.balance = balance; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public Long getConvertCoinId() { + return convertCoinId; + } + + public void setConvertCoinId(Long convertCoinId) { + this.convertCoinId = convertCoinId; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/BindBean.java b/app/src/main/java/com/dskj/rbchat/model/BindBean.java new file mode 100644 index 0000000..dbd4b70 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/BindBean.java @@ -0,0 +1,82 @@ +package com.dskj.rbchat.model; + + +import java.io.Serializable; + +public class BindBean implements Serializable { + + private Boolean wechatBind; + private Boolean phoneBind; + private Boolean passwordSet; + private Boolean payPasswordSet; + private String areaCode; + private String phone; + private BindUserBean wechatUser; + private boolean allowSilverCoin; + + public BindUserBean getWechatUser() { + return wechatUser; + } + + public boolean isAllowSilverCoin() { + return allowSilverCoin; + } + + public void setAllowSilverCoin(boolean allowSilverCoin) { + this.allowSilverCoin = allowSilverCoin; + } + + public void setWechatUser(BindUserBean wechatUser) { + this.wechatUser = wechatUser; + } + + public Boolean getWechatBind() { + return wechatBind; + } + + public void setWechatBind(Boolean wechatBind) { + this.wechatBind = wechatBind; + } + + public Boolean getPhoneBind() { + return phoneBind; + } + + public void setPhoneBind(Boolean phoneBind) { + this.phoneBind = phoneBind; + } + + public Boolean getPasswordSet() { + return passwordSet; + } + + public void setPasswordSet(Boolean passwordSet) { + this.passwordSet = passwordSet; + } + + public Boolean getPayPasswordSet() { + return payPasswordSet; + } + + public void setPayPasswordSet(Boolean payPasswordSet) { + this.payPasswordSet = payPasswordSet; + } + + public String getAreaCode() { + return areaCode; + } + + public void setAreaCode(String areaCode) { + this.areaCode = areaCode; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + +} diff --git a/app/src/main/java/com/dskj/rbchat/model/BindUserBean.java b/app/src/main/java/com/dskj/rbchat/model/BindUserBean.java new file mode 100644 index 0000000..25100aa --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/BindUserBean.java @@ -0,0 +1,80 @@ +package com.dskj.rbchat.model; + + +import java.io.Serializable; + +public class BindUserBean implements Serializable { + + private Integer id; + private Integer userId; + private String openid; + private String nickname; + private Integer sex; + private String headimgurl; + private String unionid; + private String extra; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Integer getUserId() { + return userId; + } + + public void setUserId(Integer userId) { + this.userId = userId; + } + + public String getOpenid() { + return openid; + } + + public void setOpenid(String openid) { + this.openid = openid; + } + + public String getNickname() { + return nickname; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } + + public Integer getSex() { + return sex; + } + + public void setSex(Integer sex) { + this.sex = sex; + } + + public String getHeadimgurl() { + return headimgurl; + } + + public void setHeadimgurl(String headimgurl) { + this.headimgurl = headimgurl; + } + + public String getUnionid() { + return unionid; + } + + public void setUnionid(String unionid) { + this.unionid = unionid; + } + + public String getExtra() { + return extra; + } + + public void setExtra(String extra) { + this.extra = extra; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/CallBean.java b/app/src/main/java/com/dskj/rbchat/model/CallBean.java new file mode 100644 index 0000000..aee56b1 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/CallBean.java @@ -0,0 +1,43 @@ +package com.dskj.rbchat.model; + +public class CallBean { + /**0 语音消息 1 视频消息*/ + private int type; + /**0 发送者取消 1 接受者拒绝 2 已接通 3 未接听*/ + private int status; + /**通话时长*/ + private int time; + + public CallBean() { + } + + public CallBean(int type, int status, int time) { + this.type = type; + this.status = status; + this.time = time; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + + public int getTime() { + return time; + } + + public void setTime(int time) { + this.time = time; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/ChargingBean.java b/app/src/main/java/com/dskj/rbchat/model/ChargingBean.java new file mode 100644 index 0000000..52d7529 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/ChargingBean.java @@ -0,0 +1,24 @@ +package com.dskj.rbchat.model; + + +public class ChargingBean { + + private Boolean charging; + private Long recordId; + + public Long getRecordId() { + return recordId; + } + + public void setRecordId(Long recordId) { + this.recordId = recordId; + } + + public Boolean getCharging() { + return charging; + } + + public void setCharging(Boolean charging) { + this.charging = charging; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/CirPushMessage.java b/app/src/main/java/com/dskj/rbchat/model/CirPushMessage.java new file mode 100644 index 0000000..a3efaef --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/CirPushMessage.java @@ -0,0 +1,254 @@ +package com.dskj.rbchat.model; + + +public class CirPushMessage { + private Long id; + private String likeId; + private Long postId; + private Integer userId; + private String createTime; + private String createTimestamp; + private String userNickname; + private String userAvatar; + private Boolean isFriend; + private AlbumBean post; + private String postString; + private String postUserNickname; + private String postUserAvatar; + private String commentId; + private Long replyCommentId; + private Integer replyUserId; + private String text; + private Boolean isOtherReply; + private String replyUserNickname; + private String replyUserAvatar; + /** + * 16 点赞 17 评论消息 18 回复消息 + */ + private Integer messageType = 16; + private Boolean isRead; + + public CirPushMessage(Long id, String likeId, Long postId, Integer userId, + String createTime, String userNickname, String userAvatar, + Boolean isFriend, String postString, String postUserNickname, + String postUserAvatar, String commentId, Long replyCommentId, + Integer replyUserId, String text, Boolean isOtherReply, + String replyUserNickname, String replyUserAvatar, Integer messageType, + Boolean isRead) { + this.id = id; + this.likeId = likeId; + this.postId = postId; + this.userId = userId; + this.createTime = createTime; + this.userNickname = userNickname; + this.userAvatar = userAvatar; + this.isFriend = isFriend; + this.postString = postString; + this.postUserNickname = postUserNickname; + this.postUserAvatar = postUserAvatar; + this.commentId = commentId; + this.replyCommentId = replyCommentId; + this.replyUserId = replyUserId; + this.text = text; + this.isOtherReply = isOtherReply; + this.replyUserNickname = replyUserNickname; + this.replyUserAvatar = replyUserAvatar; + this.messageType = messageType; + this.isRead = isRead; + } + + public String getCreateTimestamp() { + return createTimestamp; + } + + public void setCreateTimestamp(String createTimestamp) { + this.createTimestamp = createTimestamp; + } + + public CirPushMessage() { + } + + public String getPostString() { + return postString; + } + + public void setPostString(String postString) { + this.postString = postString; + } + + public String getLikeId() { + return likeId; + } + + public void setLikeId(String likeId) { + this.likeId = likeId; + } + + public Long getPostId() { + return postId; + } + + public void setPostId(Long postId) { + this.postId = postId; + } + + public Integer getUserId() { + return userId; + } + + public void setUserId(Integer userId) { + this.userId = userId; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getUserNickname() { + return userNickname; + } + + public void setUserNickname(String userNickname) { + this.userNickname = userNickname; + } + + public String getUserAvatar() { + return userAvatar; + } + + public void setUserAvatar(String userAvatar) { + this.userAvatar = userAvatar; + } + + public Boolean getFriend() { + return isFriend; + } + + public void setFriend(Boolean friend) { + isFriend = friend; + } + + public AlbumBean getPost() { + return post; + } + + public void setPost(AlbumBean post) { + this.post = post; + } + + public String getPostUserNickname() { + return postUserNickname; + } + + public void setPostUserNickname(String postUserNickname) { + this.postUserNickname = postUserNickname; + } + + public String getPostUserAvatar() { + return postUserAvatar; + } + + public void setPostUserAvatar(String postUserAvatar) { + this.postUserAvatar = postUserAvatar; + } + + public String getCommentId() { + return commentId; + } + + public void setCommentId(String commentId) { + this.commentId = commentId; + } + + public Long getReplyCommentId() { + return replyCommentId; + } + + public void setReplyCommentId(Long replyCommentId) { + this.replyCommentId = replyCommentId; + } + + public Integer getReplyUserId() { + return replyUserId; + } + + public void setReplyUserId(Integer replyUserId) { + this.replyUserId = replyUserId; + } + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + public Boolean getOtherReply() { + return isOtherReply; + } + + public void setOtherReply(Boolean otherReply) { + isOtherReply = otherReply; + } + + public String getReplyUserNickname() { + return replyUserNickname; + } + + public void setReplyUserNickname(String replyUserNickname) { + this.replyUserNickname = replyUserNickname; + } + + public String getReplyUserAvatar() { + return replyUserAvatar; + } + + public void setReplyUserAvatar(String replyUserAvatar) { + this.replyUserAvatar = replyUserAvatar; + } + + public Integer getMessageType() { + return messageType; + } + + public void setMessageType(Integer messageType) { + this.messageType = messageType; + } + + public Long getId() { + return this.id; + } + + public void setId(Long id) { + this.id = id; + } + + public Boolean getIsFriend() { + return this.isFriend; + } + + public void setIsFriend(Boolean isFriend) { + this.isFriend = isFriend; + } + + public Boolean getIsOtherReply() { + return this.isOtherReply; + } + + public void setIsOtherReply(Boolean isOtherReply) { + this.isOtherReply = isOtherReply; + } + + public Boolean getIsRead() { + return this.isRead; + } + + public void setIsRead(Boolean isRead) { + this.isRead = isRead; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/CircleShareBean.java b/app/src/main/java/com/dskj/rbchat/model/CircleShareBean.java new file mode 100644 index 0000000..c7c72ca --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/CircleShareBean.java @@ -0,0 +1,9 @@ +package com.dskj.rbchat.model; + +import com.netease.yunxin.kit.chatkit.ui.custom.StickerAttachment; + +public class CircleShareBean { + public int type; + public StickerAttachment data; + +} diff --git a/app/src/main/java/com/dskj/rbchat/model/CommentBean.java b/app/src/main/java/com/dskj/rbchat/model/CommentBean.java new file mode 100644 index 0000000..fbf30a4 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/CommentBean.java @@ -0,0 +1,89 @@ +package com.dskj.rbchat.model; + + +import java.io.Serializable; + +public class CommentBean implements Serializable { + + private String commentId; + private Long postId; + private Integer userId; + private Long replyCommentId; + private Integer replyUserId; + private String text; + private String createTime; + private String userNickname; + private String userAvatar; + + public String getCommentId() { + return commentId; + } + + public void setCommentId(String commentId) { + this.commentId = commentId; + } + + public Long getPostId() { + return postId; + } + + public void setPostId(Long postId) { + this.postId = postId; + } + + public Integer getUserId() { + return userId; + } + + public void setUserId(Integer userId) { + this.userId = userId; + } + + public Long getReplyCommentId() { + return replyCommentId; + } + + public void setReplyCommentId(Long replyCommentId) { + this.replyCommentId = replyCommentId; + } + + public Integer getReplyUserId() { + return replyUserId; + } + + public void setReplyUserId(Integer replyUserId) { + this.replyUserId = replyUserId; + } + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getUserNickname() { + return userNickname; + } + + public void setUserNickname(String userNickname) { + this.userNickname = userNickname; + } + + public String getUserAvatar() { + return userAvatar; + } + + public void setUserAvatar(String userAvatar) { + this.userAvatar = userAvatar; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/ConfigBean.java b/app/src/main/java/com/dskj/rbchat/model/ConfigBean.java new file mode 100644 index 0000000..e50c4ef --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/ConfigBean.java @@ -0,0 +1,45 @@ +package com.dskj.rbchat.model; + +/** + * 配置开关 + */ + +public class ConfigBean { + + private int id; + private String title; + private String val; + private String status; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getVal() { + return val; + } + + public void setVal(String val) { + this.val = val; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/CountryBean.java b/app/src/main/java/com/dskj/rbchat/model/CountryBean.java new file mode 100644 index 0000000..fe9d091 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/CountryBean.java @@ -0,0 +1,83 @@ +package com.dskj.rbchat.model; + +import android.content.Context; +import android.text.TextUtils; + +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.List; + +public class CountryBean { + // private Integer areaCode; + private String areaCodeName; + + private String countryName; + + public CountryBean() { + } + + public CountryBean(String areaCodeName, String countryName) { + this.areaCodeName = areaCodeName; + this.countryName = countryName; + } + + // public CountryBean(Integer areaCode, String areaCodeName, String countryName) { +// this.areaCode = areaCode; +// this.areaCodeName = areaCodeName; +// this.countryName = countryName; +// } + + public String getAreaCodeName() { + return areaCodeName; + } + + public void setAreaCodeName(String areaCodeName) { + this.areaCodeName = areaCodeName; + } + +// public Integer getAreaCode() { +// return areaCode; +// } +// +// public void setAreaCode(Integer areaCode) { +// this.areaCode = areaCode; +// } + + public String getCountryName() { + return countryName; + } + + public void setCountryName(String countryName) { + this.countryName = countryName; + } + + + + + +// /** +// * 本地默认国家地区 +// * @param context +// * @return +// */ +// public static CountryBean getLocCountry(Context context){ +// int areaCode = DataUtils.get(context, IMUIKitConfig.LOC_COUNTRY_CODE,886); +// List countryBeans = getCountry(context); +// for ( CountryBean country:countryBeans) { +// if(country.areaCode ==areaCode){ +// return country; +// } +// } +// return new CountryBean(886,"+886",context.getString(R.string.taiwan_txt)); +// } + + +} diff --git a/app/src/main/java/com/dskj/rbchat/model/CreditsConfBean.java b/app/src/main/java/com/dskj/rbchat/model/CreditsConfBean.java new file mode 100644 index 0000000..a5ee222 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/CreditsConfBean.java @@ -0,0 +1,124 @@ +package com.dskj.rbchat.model; + + +public class CreditsConfBean { + + private Integer creditsValid; + private Float creditsToQCoinRate; + private Integer creditsToQCoinLimitMin; + private Integer creditsToQCoinLimitMultiple; + private Integer inviteCreditsValid; + private String inviteAdvertisementPicture; + private Integer inviteCreditsOnce; + private Integer inviteCreditsLimitTime; + private Integer creditsTaskValid; + private String inviteAdvertisementPictureZhCn; + private String inviteAdvertisementPictureZhTw; + private String inviteAdvertisementPictureJaJp; + private String inviteAdvertisementPictureEnUs; + + public String getInviteAdvertisementPictureZhCn() { + return inviteAdvertisementPictureZhCn; + } + + public void setInviteAdvertisementPictureZhCn(String inviteAdvertisementPictureZhCn) { + this.inviteAdvertisementPictureZhCn = inviteAdvertisementPictureZhCn; + } + + public String getInviteAdvertisementPictureZhTw() { + return inviteAdvertisementPictureZhTw; + } + + public void setInviteAdvertisementPictureZhTw(String inviteAdvertisementPictureZhTw) { + this.inviteAdvertisementPictureZhTw = inviteAdvertisementPictureZhTw; + } + + public String getInviteAdvertisementPictureJaJp() { + return inviteAdvertisementPictureJaJp; + } + + public void setInviteAdvertisementPictureJaJp(String inviteAdvertisementPictureJaJp) { + this.inviteAdvertisementPictureJaJp = inviteAdvertisementPictureJaJp; + } + + public String getInviteAdvertisementPictureEnUs() { + return inviteAdvertisementPictureEnUs; + } + + public void setInviteAdvertisementPictureEnUs(String inviteAdvertisementPictureEnUs) { + this.inviteAdvertisementPictureEnUs = inviteAdvertisementPictureEnUs; + } + + public Integer getCreditsValid() { + return creditsValid; + } + + public void setCreditsValid(Integer creditsValid) { + this.creditsValid = creditsValid; + } + + public Float getCreditsToQCoinRate() { + return creditsToQCoinRate; + } + + public void setCreditsToQCoinRate(Float creditsToQCoinRate) { + + this.creditsToQCoinRate = creditsToQCoinRate; + } + + public Integer getCreditsToQCoinLimitMin() { + return creditsToQCoinLimitMin; + } + + public void setCreditsToQCoinLimitMin(Integer creditsToQCoinLimitMin) { + this.creditsToQCoinLimitMin = creditsToQCoinLimitMin; + } + + public Integer getCreditsToQCoinLimitMultiple() { + return creditsToQCoinLimitMultiple; + } + + public void setCreditsToQCoinLimitMultiple(Integer creditsToQCoinLimitMultiple) { + this.creditsToQCoinLimitMultiple = creditsToQCoinLimitMultiple; + } + + public Integer getInviteCreditsValid() { + return inviteCreditsValid; + } + + public void setInviteCreditsValid(Integer inviteCreditsValid) { + this.inviteCreditsValid = inviteCreditsValid; + } + + public String getInviteAdvertisementPicture() { + return inviteAdvertisementPicture; + } + + public void setInviteAdvertisementPicture(String inviteAdvertisementPicture) { + this.inviteAdvertisementPicture = inviteAdvertisementPicture; + } + + public Integer getInviteCreditsOnce() { + return inviteCreditsOnce; + } + + public void setInviteCreditsOnce(Integer inviteCreditsOnce) { + this.inviteCreditsOnce = inviteCreditsOnce; + } + + public Integer getInviteCreditsLimitTime() { + return inviteCreditsLimitTime; + } + + public void setInviteCreditsLimitTime(Integer inviteCreditsLimitTime) { + this.inviteCreditsLimitTime = inviteCreditsLimitTime; + } + + public Integer getCreditsTaskValid() { + return creditsTaskValid; + } + + public void setCreditsTaskValid(Integer creditsTaskValid) { + this.creditsTaskValid = creditsTaskValid; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/DongTaiActionBean.java b/app/src/main/java/com/dskj/rbchat/model/DongTaiActionBean.java new file mode 100644 index 0000000..3f5e1a3 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/DongTaiActionBean.java @@ -0,0 +1,33 @@ +package com.dskj.rbchat.model; + + +public class DongTaiActionBean { + + private String title; + private String content; + private String href; + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getHref() { + return href; + } + + public void setHref(String href) { + this.href = href; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/EditMessageBean.java b/app/src/main/java/com/dskj/rbchat/model/EditMessageBean.java new file mode 100644 index 0000000..99f5bfa --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/EditMessageBean.java @@ -0,0 +1,85 @@ +package com.dskj.rbchat.model; + +import java.io.Serializable; + +public class EditMessageBean implements Serializable { + private Integer type; + + private String fingerPrint; + + private String beforeContent; + + private String afterContent; + + private Integer fromUserId; + + private Integer toUserId; + + private String toGroupId; + + public EditMessageBean(Integer type, String fingerPrint, String beforeContent, String afterContent, Integer fromUserId, Integer toUserId, String toGroupId) { + this.type = type; + this.fingerPrint = fingerPrint; + this.beforeContent = beforeContent; + this.afterContent = afterContent; + this.fromUserId = fromUserId; + this.toUserId = toUserId; + this.toGroupId = toGroupId; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getFingerPrint() { + return fingerPrint; + } + + public void setFingerPrint(String fingerPrint) { + this.fingerPrint = fingerPrint; + } + + public String getBeforeContent() { + return beforeContent; + } + + public void setBeforeContent(String beforeContent) { + this.beforeContent = beforeContent; + } + + public String getAfterContent() { + return afterContent; + } + + public void setAfterContent(String afterContent) { + this.afterContent = afterContent; + } + + public Integer getFromUserId() { + return fromUserId; + } + + public void setFromUserId(Integer fromUserId) { + this.fromUserId = fromUserId; + } + + public Integer getToUserId() { + return toUserId; + } + + public void setToUserId(Integer toUserId) { + this.toUserId = toUserId; + } + + public String getToGroupId() { + return toGroupId; + } + + public void setToGroupId(String toGroupId) { + this.toGroupId = toGroupId; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/ExchangeConfBean.java b/app/src/main/java/com/dskj/rbchat/model/ExchangeConfBean.java new file mode 100644 index 0000000..a743646 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/ExchangeConfBean.java @@ -0,0 +1,73 @@ +package com.dskj.rbchat.model; + +import java.util.List; + +public class ExchangeConfBean { + + private int exchangeRatio; + private int minAmount; + private int maxAmount; + private List amountItems; + + public int getExchangeRatio() { + return exchangeRatio; + } + + public void setExchangeRatio(int exchangeRatio) { + this.exchangeRatio = exchangeRatio; + } + + public int getMinAmount() { + return minAmount; + } + + public void setMinAmount(int minAmount) { + this.minAmount = minAmount; + } + + public int getMaxAmount() { + return maxAmount; + } + + public void setMaxAmount(int maxAmount) { + this.maxAmount = maxAmount; + } + + public List getAmountItems() { + return amountItems; + } + + public void setAmountItems(List amountItems) { + this.amountItems = amountItems; + } + + public static class AmountItemsDTO { + private int seqNo; + private int goldAmount; + private int ntAmount; + + public int getSeqNo() { + return seqNo; + } + + public void setSeqNo(int seqNo) { + this.seqNo = seqNo; + } + + public int getGoldAmount() { + return goldAmount; + } + + public void setGoldAmount(int goldAmount) { + this.goldAmount = goldAmount; + } + + public int getNtAmount() { + return ntAmount; + } + + public void setNtAmount(int ntAmount) { + this.ntAmount = ntAmount; + } + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/ExplorePostPinglunBean.java b/app/src/main/java/com/dskj/rbchat/model/ExplorePostPinglunBean.java new file mode 100644 index 0000000..74e2c91 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/ExplorePostPinglunBean.java @@ -0,0 +1,95 @@ +package com.dskj.rbchat.model; + +public class ExplorePostPinglunBean { + + private String altnickname; + private String altuserid; + private String content; + private long creattime; + private int friendid; + private int id; + private int userid; + private String usernickname; + private LoginBean replyUser; //@的人 回复人信息 + private LoginBean commentsUser; // 评论人信息,,commentuser回复repleyuser + + public String getAltnickname() { + return altnickname; + } + + public void setAltnickname(String altnickname) { + this.altnickname = altnickname; + } + + public String getAltuserid() { + return altuserid; + } + + public void setAltuserid(String altuserid) { + this.altuserid = altuserid; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public long getCreattime() { + return creattime; + } + + public void setCreattime(long creattime) { + this.creattime = creattime; + } + + public int getFriendid() { + return friendid; + } + + public void setFriendid(int friendid) { + this.friendid = friendid; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public int getUserid() { + return userid; + } + + public void setUserid(int userid) { + this.userid = userid; + } + + public String getUsernickname() { + return usernickname; + } + + public void setUsernickname(String usernickname) { + this.usernickname = usernickname; + } + + public LoginBean getReplyUser() { + return replyUser; + } + + public void setReplyUser(LoginBean replyUser) { + this.replyUser = replyUser; + } + + public LoginBean getCommentsUser() { + return commentsUser; + } + + public void setCommentsUser(LoginBean commentsUser) { + this.commentsUser = commentsUser; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/ForBiddenInfoBean.java b/app/src/main/java/com/dskj/rbchat/model/ForBiddenInfoBean.java new file mode 100644 index 0000000..92cd947 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/ForBiddenInfoBean.java @@ -0,0 +1,24 @@ +package com.dskj.rbchat.model; + + +public class ForBiddenInfoBean { + + private Boolean forbiddenJoinGroup; + private Boolean forbiddenGroupChat; + + public Boolean getForbiddenJoinGroup() { + return forbiddenJoinGroup; + } + + public void setForbiddenJoinGroup(Boolean forbiddenJoinGroup) { + this.forbiddenJoinGroup = forbiddenJoinGroup; + } + + public Boolean getForbiddenGroupChat() { + return forbiddenGroupChat; + } + + public void setForbiddenGroupChat(Boolean forbiddenGroupChat) { + this.forbiddenGroupChat = forbiddenGroupChat; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/FukuanResultBean.java b/app/src/main/java/com/dskj/rbchat/model/FukuanResultBean.java new file mode 100644 index 0000000..34c3346 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/FukuanResultBean.java @@ -0,0 +1,51 @@ +package com.dskj.rbchat.model; + + +public class FukuanResultBean { + + private String nickname; + private Integer amount; + private String payTime; + private Integer status; + private String remark; + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getNickname() { + return nickname; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } + + public Integer getAmount() { + return amount; + } + + public void setAmount(Integer amount) { + this.amount = amount; + } + + public String getPayTime() { + return payTime; + } + + public void setPayTime(String payTime) { + this.payTime = payTime; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/GameBean.java b/app/src/main/java/com/dskj/rbchat/model/GameBean.java new file mode 100644 index 0000000..ae2f2e5 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/GameBean.java @@ -0,0 +1,251 @@ +package com.dskj.rbchat.model; + + + + +public class GameBean { + private Integer gameId; + private String gameName; + private String advertisingPicture; + private String gameIcon; + private String gameUrl; + private Integer viewTime; + private String createTime; + private String createTimestamp; + private Integer isRecommend; + private Integer isValid; + private Integer gameType; + private Integer oauthAppId; + private OauthAppDTO oauthApp; + private VideoGameDTO videoGame; + private GameSubswitchDTO gameSubswitch; + + public Integer getGameId() { + return gameId; + } + + public void setGameId(Integer gameId) { + this.gameId = gameId; + } + + public String getGameName() { + return gameName; + } + + public void setGameName(String gameName) { + this.gameName = gameName; + } + + public String getAdvertisingPicture() { + return advertisingPicture; + } + + public void setAdvertisingPicture(String advertisingPicture) { + this.advertisingPicture = advertisingPicture; + } + + public String getGameIcon() { + return gameIcon; + } + + public void setGameIcon(String gameIcon) { + this.gameIcon = gameIcon; + } + + public String getGameUrl() { + return gameUrl; + } + + public void setGameUrl(String gameUrl) { + this.gameUrl = gameUrl; + } + + public Integer getViewTime() { + return viewTime; + } + + public void setViewTime(Integer viewTime) { + this.viewTime = viewTime; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getCreateTimestamp() { + return createTimestamp; + } + + public void setCreateTimestamp(String createTimestamp) { + this.createTimestamp = createTimestamp; + } + + public Integer getIsRecommend() { + return isRecommend; + } + + public void setIsRecommend(Integer isRecommend) { + this.isRecommend = isRecommend; + } + + public Integer getIsValid() { + return isValid; + } + + public void setIsValid(Integer isValid) { + this.isValid = isValid; + } + + public Integer getGameType() { + return gameType; + } + + public void setGameType(Integer gameType) { + this.gameType = gameType; + } + + public Integer getOauthAppId() { + return oauthAppId; + } + + public void setOauthAppId(Integer oauthAppId) { + this.oauthAppId = oauthAppId; + } + + public OauthAppDTO getOauthApp() { + return oauthApp; + } + + public void setOauthApp(OauthAppDTO oauthApp) { + this.oauthApp = oauthApp; + } + + public VideoGameDTO getVideoGame() { + return videoGame; + } + + public void setVideoGame(VideoGameDTO videoGame) { + this.videoGame = videoGame; + } + + public GameSubswitchDTO getGameSubswitch() { + return gameSubswitch; + } + + public void setGameSubswitch(GameSubswitchDTO gameSubswitch) { + this.gameSubswitch = gameSubswitch; + } + + public static class OauthAppDTO { + private Integer id; + private String appId; + private String appName; + private String oauthChargeCallbackUrl; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getAppId() { + return appId; + } + + public void setAppId(String appId) { + this.appId = appId; + } + + public String getAppName() { + return appName; + } + + public void setAppName(String appName) { + this.appName = appName; + } + + public String getOauthChargeCallbackUrl() { + return oauthChargeCallbackUrl; + } + + public void setOauthChargeCallbackUrl(String oauthChargeCallbackUrl) { + this.oauthChargeCallbackUrl = oauthChargeCallbackUrl; + } + } + + + public static class VideoGameDTO { + private Integer videoGameId; + private String videoGameName; + + public Integer getVideoGameId() { + return videoGameId; + } + + public void setVideoGameId(Integer videoGameId) { + this.videoGameId = videoGameId; + } + + public String getVideoGameName() { + return videoGameName; + } + + public void setVideoGameName(String videoGameName) { + this.videoGameName = videoGameName; + } + } + + public static class GameSubswitchDTO { + private Integer id; + private Integer gameId; + private Long substationId; + private Integer isValid; + private Integer isRecommend; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Integer getGameId() { + return gameId; + } + + public void setGameId(Integer gameId) { + this.gameId = gameId; + } + + public Long getSubstationId() { + return substationId; + } + + public void setSubstationId(Long substationId) { + this.substationId = substationId; + } + + public Integer getIsValid() { + return isValid; + } + + public void setIsValid(Integer isValid) { + this.isValid = isValid; + } + + public Integer getIsRecommend() { + return isRecommend; + } + + public void setIsRecommend(Integer isRecommend) { + this.isRecommend = isRecommend; + } + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/GroupActionBean.java b/app/src/main/java/com/dskj/rbchat/model/GroupActionBean.java new file mode 100644 index 0000000..e092cca --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/GroupActionBean.java @@ -0,0 +1,124 @@ +package com.dskj.rbchat.model; + + +public class GroupActionBean { + + private Integer maxMemberCount; + private Integer createUserUid; + private String createTime; + + private Integer avatarIncludeCnt; + private Integer isMute; + private String gname; + private String gid; + private Integer gownerUserUid; + private Integer gmemberCount; + private Integer gstatus; + private Integer forbidAddFriendInGroup; + private int role; + private Integer isEphemeral; + + public Integer getIsEphemeral() { + return isEphemeral; + } + + public void setIsEphemeral(Integer isEphemeral) { + this.isEphemeral = isEphemeral; + } + + public int getRole() { + return role; + } + + public void setRole(int role) { + this.role = role; + } + + public Integer getForbidAddFriendInGroup() { + return forbidAddFriendInGroup; + } + + public void setForbidAddFriendInGroup(Integer forbidAddFriendInGroup) { + this.forbidAddFriendInGroup = forbidAddFriendInGroup; + } + + public Integer getMaxMemberCount() { + return maxMemberCount; + } + + public void setMaxMemberCount(Integer maxMemberCount) { + this.maxMemberCount = maxMemberCount; + } + + public Integer getCreateUserUid() { + return createUserUid; + } + + public void setCreateUserUid(Integer createUserUid) { + this.createUserUid = createUserUid; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public Integer getAvatarIncludeCnt() { + return avatarIncludeCnt; + } + + public void setAvatarIncludeCnt(Integer avatarIncludeCnt) { + this.avatarIncludeCnt = avatarIncludeCnt; + } + + public Integer getIsMute() { + return isMute; + } + + public void setIsMute(Integer isMute) { + this.isMute = isMute; + } + + public String getGname() { + return gname; + } + + public void setGname(String gname) { + this.gname = gname; + } + + public String getGid() { + return gid; + } + + public void setGid(String gid) { + this.gid = gid; + } + + public Integer getGownerUserUid() { + return gownerUserUid; + } + + public void setGownerUserUid(Integer gownerUserUid) { + this.gownerUserUid = gownerUserUid; + } + + public Integer getGmemberCount() { + return gmemberCount; + } + + public void setGmemberCount(Integer gmemberCount) { + this.gmemberCount = gmemberCount; + } + + public Integer getGstatus() { + return gstatus; + } + + public void setGstatus(Integer gstatus) { + this.gstatus = gstatus; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/GroupAtMessageBean.java b/app/src/main/java/com/dskj/rbchat/model/GroupAtMessageBean.java new file mode 100644 index 0000000..4d4b914 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/GroupAtMessageBean.java @@ -0,0 +1,104 @@ +package com.dskj.rbchat.model; + +import java.util.List; + + +public class GroupAtMessageBean { + + private String content; + private List user; + private String showContent; + private String showAlarm; + private boolean isAtMe; + + public boolean isAtMe() { + return isAtMe; + } + + public void setAtMe(boolean atMe) { + isAtMe = atMe; + } + + public String getShowContent() { + return showContent; + } + + public void setShowContent(String showContent) { + this.showContent = showContent; + } + + public String getShowAlarm() { + return showAlarm; + } + + public void setShowAlarm(String showAlarm) { + this.showAlarm = showAlarm; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public List getUser() { + return user; + } + + public void setUser(List user) { + this.user = user; + } + + public static class UserDTO { + private Integer userId; + private String nickName; + private String remark; + private String nicknameIngroup; + + public UserDTO(Integer userId, String nickName, String remark, String nicknameIngroup) { + this.userId = userId; + this.nickName = nickName; + this.remark = remark; + this.nicknameIngroup = nicknameIngroup; + } + + public UserDTO(Integer userId, String nickName) { + this.userId = userId; + this.nickName = nickName; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getNicknameIngroup() { + return nicknameIngroup; + } + + public void setNicknameIngroup(String nicknameIngroup) { + this.nicknameIngroup = nicknameIngroup; + } + + public Integer getUserId() { + return userId; + } + + public void setUserId(Integer userId) { + this.userId = userId; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/GroupBeanResult.java b/app/src/main/java/com/dskj/rbchat/model/GroupBeanResult.java new file mode 100644 index 0000000..6308e0d --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/GroupBeanResult.java @@ -0,0 +1,33 @@ +package com.dskj.rbchat.model; + +import java.util.List; + +public class GroupBeanResult { + private List joinedGroups; + private List createdGroups; + private List managedGroups; + + public List getJoinedGroups() { + return joinedGroups; + } + + public void setJoinedGroups(List joinedGroups) { + this.joinedGroups = joinedGroups; + } + + public List getCreatedGroups() { + return createdGroups; + } + + public void setCreatedGroups(List createdGroups) { + this.createdGroups = createdGroups; + } + + public List getManagedGroups() { + return managedGroups; + } + + public void setManagedGroups(List managedGroups) { + this.managedGroups = managedGroups; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/GroupListBean.java b/app/src/main/java/com/dskj/rbchat/model/GroupListBean.java new file mode 100644 index 0000000..5ba0681 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/GroupListBean.java @@ -0,0 +1,186 @@ +package com.dskj.rbchat.model; + + +public class GroupListBean { + + private Integer maxMemberCount; + private Integer createUserUid; + private String createTime; + private Object forbidUserUid; + private Object forbidTime; + private Object firbidCause; + private Object delUserUid; + private Object delTime; + private Integer avatarIncludeCnt; + private Integer isMute; + private Integer forbidAddFriendInGroup; + private String gname; + private String gid; + private Integer gstatus; + private Integer gownerUserUid; + private Integer gmemberCount; + private Object gnotice; + private Object gnoticeUpdatetime; + private Object gnoticeUpdateuid; + private String showTitlte; + + public String getShowTitlte() { + return showTitlte; + } + + public void setShowTitlte(String showTitlte) { + this.showTitlte = showTitlte; + } + + public Integer getMaxMemberCount() { + return maxMemberCount; + } + + public void setMaxMemberCount(Integer maxMemberCount) { + this.maxMemberCount = maxMemberCount; + } + + public Integer getCreateUserUid() { + return createUserUid; + } + + public void setCreateUserUid(Integer createUserUid) { + this.createUserUid = createUserUid; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public Object getForbidUserUid() { + return forbidUserUid; + } + + public void setForbidUserUid(Object forbidUserUid) { + this.forbidUserUid = forbidUserUid; + } + + public Object getForbidTime() { + return forbidTime; + } + + public void setForbidTime(Object forbidTime) { + this.forbidTime = forbidTime; + } + + public Object getFirbidCause() { + return firbidCause; + } + + public void setFirbidCause(Object firbidCause) { + this.firbidCause = firbidCause; + } + + public Object getDelUserUid() { + return delUserUid; + } + + public void setDelUserUid(Object delUserUid) { + this.delUserUid = delUserUid; + } + + public Object getDelTime() { + return delTime; + } + + public void setDelTime(Object delTime) { + this.delTime = delTime; + } + + public Integer getAvatarIncludeCnt() { + return avatarIncludeCnt; + } + + public void setAvatarIncludeCnt(Integer avatarIncludeCnt) { + this.avatarIncludeCnt = avatarIncludeCnt; + } + + public Integer getIsMute() { + return isMute; + } + + public void setIsMute(Integer isMute) { + this.isMute = isMute; + } + + public Integer getForbidAddFriendInGroup() { + return forbidAddFriendInGroup; + } + + public void setForbidAddFriendInGroup(Integer forbidAddFriendInGroup) { + this.forbidAddFriendInGroup = forbidAddFriendInGroup; + } + + public String getGname() { + return gname; + } + + public void setGname(String gname) { + this.gname = gname; + } + + public String getGid() { + return gid; + } + + public void setGid(String gid) { + this.gid = gid; + } + + public Integer getGstatus() { + return gstatus; + } + + public void setGstatus(Integer gstatus) { + this.gstatus = gstatus; + } + + public Integer getGownerUserUid() { + return gownerUserUid; + } + + public void setGownerUserUid(Integer gownerUserUid) { + this.gownerUserUid = gownerUserUid; + } + + public Integer getGmemberCount() { + return gmemberCount; + } + + public void setGmemberCount(Integer gmemberCount) { + this.gmemberCount = gmemberCount; + } + + public Object getGnotice() { + return gnotice; + } + + public void setGnotice(Object gnotice) { + this.gnotice = gnotice; + } + + public Object getGnoticeUpdatetime() { + return gnoticeUpdatetime; + } + + public void setGnoticeUpdatetime(Object gnoticeUpdatetime) { + this.gnoticeUpdatetime = gnoticeUpdatetime; + } + + public Object getGnoticeUpdateuid() { + return gnoticeUpdateuid; + } + + public void setGnoticeUpdateuid(Object gnoticeUpdateuid) { + this.gnoticeUpdateuid = gnoticeUpdateuid; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/H5ChangeTitle.java b/app/src/main/java/com/dskj/rbchat/model/H5ChangeTitle.java new file mode 100644 index 0000000..73fd90a --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/H5ChangeTitle.java @@ -0,0 +1,42 @@ +package com.dskj.rbchat.model; + + +public class H5ChangeTitle { + + private String color ="#889CBC"; + private String bg = "#889CBC"; + private boolean showTitle = true; + private boolean textIsWhite = true; + + public String getColor() { + return color; + } + + public void setColor(String color) { + this.color = color; + } + + public boolean isShowTitle() { + return showTitle; + } + + public void setShowTitle(boolean showTitle) { + this.showTitle = showTitle; + } + + public boolean isTextIsWhite() { + return textIsWhite; + } + + public void setTextIsWhite(boolean textIsWhite) { + this.textIsWhite = textIsWhite; + } + + public String getBg() { + return bg; + } + + public void setBg(String bg) { + this.bg = bg; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/HisChatShowBean.java b/app/src/main/java/com/dskj/rbchat/model/HisChatShowBean.java new file mode 100644 index 0000000..271daea --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/HisChatShowBean.java @@ -0,0 +1,31 @@ +package com.dskj.rbchat.model; + +import com.netease.yunxin.kit.chatkit.model.IMMessageInfo; + +import java.util.List; + +public class HisChatShowBean { + public String title; + public List imMessageInfos; + + public HisChatShowBean(String title, List imMessageInfos) { + this.title = title; + this.imMessageInfos = imMessageInfos; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public List getImMessageInfos() { + return imMessageInfos; + } + + public void setImMessageInfos(List imMessageInfos) { + this.imMessageInfos = imMessageInfos; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/InviteDetailsBean.java b/app/src/main/java/com/dskj/rbchat/model/InviteDetailsBean.java new file mode 100644 index 0000000..4dc76fa --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/InviteDetailsBean.java @@ -0,0 +1,70 @@ +package com.dskj.rbchat.model; + + + +public class InviteDetailsBean { + + private Long detailId; + private Integer inviteUserId; + private Integer invitedUserId; + private Integer creditsAmount; + private String createTime; + private Long createTimestamp; + private LoginBean invitedUser; + + public Long getDetailId() { + return detailId; + } + + public void setDetailId(Long detailId) { + this.detailId = detailId; + } + + public Integer getInviteUserId() { + return inviteUserId; + } + + public void setInviteUserId(Integer inviteUserId) { + this.inviteUserId = inviteUserId; + } + + public Integer getInvitedUserId() { + return invitedUserId; + } + + public void setInvitedUserId(Integer invitedUserId) { + this.invitedUserId = invitedUserId; + } + + public Integer getCreditsAmount() { + return creditsAmount; + } + + public void setCreditsAmount(Integer creditsAmount) { + this.creditsAmount = creditsAmount; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public Long getCreateTimestamp() { + return createTimestamp; + } + + public void setCreateTimestamp(Long createTimestamp) { + this.createTimestamp = createTimestamp; + } + + public LoginBean getInvitedUser() { + return invitedUser; + } + + public void setInvitedUser(LoginBean invitedUser) { + this.invitedUser = invitedUser; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/JsBridgeOrderBean.java b/app/src/main/java/com/dskj/rbchat/model/JsBridgeOrderBean.java new file mode 100644 index 0000000..f3301d2 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/JsBridgeOrderBean.java @@ -0,0 +1,41 @@ +package com.dskj.rbchat.model; + +public class JsBridgeOrderBean { + + public String img; + public String money; + public String orderid; + public String payUid; + + public String getImg() { + return img; + } + + public void setImg(String img) { + this.img = img; + } + + public String getMoney() { + return money; + } + + public void setMoney(String money) { + this.money = money; + } + + public String getOrderid() { + return orderid; + } + + public void setOrderid(String orderid) { + this.orderid = orderid; + } + + public String getPayUid() { + return payUid; + } + + public void setPayUid(String payUid) { + this.payUid = payUid; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/LikeBean.java b/app/src/main/java/com/dskj/rbchat/model/LikeBean.java new file mode 100644 index 0000000..ac7ad18 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/LikeBean.java @@ -0,0 +1,70 @@ +package com.dskj.rbchat.model; + +import java.io.Serializable; + +public class LikeBean implements Serializable { + + private String likeId; + private Long postId; + private Integer userId; + private String createTime; + private String userNickname; + private String userAvatar; + private Boolean isFriend; + + public String getLikeId() { + return likeId; + } + + public void setLikeId(String likeId) { + this.likeId = likeId; + } + + public Long getPostId() { + return postId; + } + + public void setPostId(Long postId) { + this.postId = postId; + } + + public Integer getUserId() { + return userId; + } + + public void setUserId(Integer userId) { + this.userId = userId; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getUserNickname() { + return userNickname; + } + + public void setUserNickname(String userNickname) { + this.userNickname = userNickname; + } + + public String getUserAvatar() { + return userAvatar; + } + + public void setUserAvatar(String userAvatar) { + this.userAvatar = userAvatar; + } + + public Boolean getFriend() { + return isFriend; + } + + public void setFriend(Boolean friend) { + isFriend = friend; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/LinkBean.java b/app/src/main/java/com/dskj/rbchat/model/LinkBean.java new file mode 100644 index 0000000..827728e --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/LinkBean.java @@ -0,0 +1,51 @@ +package com.dskj.rbchat.model; + + +public class LinkBean { + + private Integer linkId; + private String link; + private String explain; + private Integer isValid; + private String createTime; + + public Integer getLinkId() { + return linkId; + } + + public void setLinkId(Integer linkId) { + this.linkId = linkId; + } + + public String getLink() { + return link; + } + + public void setLink(String link) { + this.link = link; + } + + public String getExplain() { + return explain; + } + + public void setExplain(String explain) { + this.explain = explain; + } + + public Integer getIsValid() { + return isValid; + } + + public void setIsValid(Integer isValid) { + this.isValid = isValid; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/ListBeanResult.java b/app/src/main/java/com/dskj/rbchat/model/ListBeanResult.java new file mode 100644 index 0000000..efc3d74 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/ListBeanResult.java @@ -0,0 +1,89 @@ +package com.dskj.rbchat.model; + +import java.util.List; + +public class ListBeanResult { + + private Integer prePage; + private Integer nextPage; + private Integer pages; + private Integer total; + private Boolean hasPreviousPage; + private Boolean hasNextPage; + private int invitedUserSum; + private int inviteCreditsSum; + + public int getInvitedUserSum() { + return invitedUserSum; + } + + public void setInvitedUserSum(int invitedUserSum) { + this.invitedUserSum = invitedUserSum; + } + + public int getInviteCreditsSum() { + return inviteCreditsSum; + } + + public void setInviteCreditsSum(int inviteCreditsSum) { + this.inviteCreditsSum = inviteCreditsSum; + } + + private List list; + + public List getList() { + return list; + } + + public void setList(List list) { + this.list = list; + } + + public Integer getPrePage() { + return prePage; + } + + public void setPrePage(Integer prePage) { + this.prePage = prePage; + } + + public Integer getNextPage() { + return nextPage; + } + + public void setNextPage(Integer nextPage) { + this.nextPage = nextPage; + } + + public Integer getPages() { + return pages; + } + + public void setPages(Integer pages) { + this.pages = pages; + } + + public Integer getTotal() { + return total; + } + + public void setTotal(Integer total) { + this.total = total; + } + + public Boolean getHasPreviousPage() { + return hasPreviousPage; + } + + public void setHasPreviousPage(Boolean hasPreviousPage) { + this.hasPreviousPage = hasPreviousPage; + } + + public Boolean getHasNextPage() { + return hasNextPage; + } + + public void setHasNextPage(Boolean hasNextPage) { + this.hasNextPage = hasNextPage; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/LngLat.java b/app/src/main/java/com/dskj/rbchat/model/LngLat.java new file mode 100644 index 0000000..4160e5d --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/LngLat.java @@ -0,0 +1,11 @@ +package com.dskj.rbchat.model; + +public class LngLat { + public double longitude; + public double latitude; + + public LngLat(double longitude, double latitude) { + this.longitude = longitude; + this.latitude = latitude; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/LoginBean.java b/app/src/main/java/com/dskj/rbchat/model/LoginBean.java new file mode 100644 index 0000000..363ef1c --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/LoginBean.java @@ -0,0 +1,324 @@ +package com.dskj.rbchat.model; + + +public class LoginBean extends RosterElementEntity { + + private String accessToken; + private String refreshToken; + private String headimgurl; + private String userUid; + private String birthday; + private String userRegieon; + private Integer addFriendNeedVerify; + private Integer allowStrangerChat; + private Integer allowSearchByPhone; + private Integer allowSearchById; + private Integer allowAddFriendByGroup; + private String online; + private Integer userSex; + private Integer isOnline; + private Boolean isStaffService; + private String inviteCode; + private String invitedBy; + private String postHomepageBackground; + private String nwId; + private String nwIdSetTime; + private Integer forbidQCoinTransferEnvelope; + private Integer forbidQCoin; + private SubstationDTO substation; + private String chatToken; + private LoginBean user; + private Integer isFollow; + private Integer allowGiftCoin; + private Integer isBiz = 0; + + public Integer getAllowGiftCoin() { + return allowGiftCoin; + } + + public void setAllowGiftCoin(Integer allowGiftCoin) { + this.allowGiftCoin = allowGiftCoin; + } + + public Integer getIsBiz() { + return isBiz; + } + + public void setIsBiz(Integer isBiz) { + this.isBiz = isBiz; + } + + public Integer getIsFollow() { + return isFollow; + } + + public void setIsFollow(Integer isFollow) { + this.isFollow = isFollow; + } + + public LoginBean getUser() { + return user; + } + + public void setUser(LoginBean user) { + this.user = user; + } + + public String getChatToken() { + return chatToken; + } + + public void setChatToken(String chatToken) { + this.chatToken = chatToken; + } + + public Integer getForbidQCoinTransferEnvelope() { + return forbidQCoinTransferEnvelope; + } + + public void setForbidQCoinTransferEnvelope(Integer forbidQCoinTransferEnvelope) { + this.forbidQCoinTransferEnvelope = forbidQCoinTransferEnvelope; + } + + public Integer getForbidQCoin() { + return forbidQCoin; + } + + public void setForbidQCoin(Integer forbidQCoin) { + this.forbidQCoin = forbidQCoin; + } + + public String getNwId() { + return nwId; + } + + public void setNwId(String nwId) { + this.nwId = nwId; + } + + public String getNwIdSetTime() { + return nwIdSetTime; + } + + public void setNwIdSetTime(String nwIdSetTime) { + this.nwIdSetTime = nwIdSetTime; + } + + public String getPostHomepageBackground() { + return postHomepageBackground; + } + + public void setPostHomepageBackground(String postHomepageBackground) { + this.postHomepageBackground = postHomepageBackground; + } + + public String getInviteCode() { + return inviteCode; + } + + public void setInviteCode(String inviteCode) { + this.inviteCode = inviteCode; + } + + public String getInvitedBy() { + return invitedBy; + } + + public void setInvitedBy(String invitedBy) { + this.invitedBy = invitedBy; + } + + public Boolean getStaffService() { + return isStaffService; + } + + public void setStaffService(Boolean staffService) { + isStaffService = staffService; + } + + public Integer getIsOnline() { + return isOnline; + } + + public void setIsOnline(Integer isOnline) { + this.isOnline = isOnline; + } + + public Integer getUserSex() { + return userSex; + } + + public void setUserSex(Integer userSex) { + this.userSex = userSex; + } + + public String getUserUid() { + return userUid; + } + + public void setUserUid(String userUid) { + this.userUid = userUid; + } + + public String getOnline() { + return online; + } + + public void setOnline(String online) { + this.online = online; + } + + public Integer getAddFriendNeedVerify() { + return addFriendNeedVerify; + } + + public void setAddFriendNeedVerify(Integer addFriendNeedVerify) { + this.addFriendNeedVerify = addFriendNeedVerify; + } + + public Integer getAllowStrangerChat() { + return allowStrangerChat; + } + + public void setAllowStrangerChat(Integer allowStrangerChat) { + this.allowStrangerChat = allowStrangerChat; + } + + public Integer getAllowSearchByPhone() { + return allowSearchByPhone; + } + + public void setAllowSearchByPhone(Integer allowSearchByPhone) { + this.allowSearchByPhone = allowSearchByPhone; + } + + public Integer getAllowSearchById() { + return allowSearchById; + } + + public void setAllowSearchById(Integer allowSearchById) { + this.allowSearchById = allowSearchById; + } + + public Integer getAllowAddFriendByGroup() { + return allowAddFriendByGroup; + } + + public void setAllowAddFriendByGroup(Integer allowAddFriendByGroup) { + this.allowAddFriendByGroup = allowAddFriendByGroup; + } + + public String getBirthday() { + return birthday; + } + + public void setBirthday(String birthday) { + this.birthday = birthday; + } + + public String getUserRegieon() { + return userRegieon; + } + + public void setUserRegieon(String userRegieon) { + this.userRegieon = userRegieon; + } + + public String getAccessToken() { + return accessToken; + } + + public String getHeadimgurl() { + return headimgurl; + } + + public void setHeadimgurl(String headimgurl) { + this.headimgurl = headimgurl; + } + + public void setAccessToken(String accessToken) { + this.accessToken = accessToken; + } + + public String getRefreshToken() { + return refreshToken; + } + + public void setRefreshToken(String refreshToken) { + this.refreshToken = refreshToken; + } + + public SubstationDTO getSubstation() { + return substation; + } + + public void setSubstation(SubstationDTO substation) { + this.substation = substation; + } + + public static class SubstationDTO { + private String substationId; + private String substationName; + private String createTime; + private Integer isValid; + private Integer adminId; + private String worldChatGroupId; + private String niuniuGroupId; + + public String getSubstationId() { + return substationId; + } + + public void setSubstationId(String substationId) { + this.substationId = substationId; + } + + public String getSubstationName() { + return substationName; + } + + public void setSubstationName(String substationName) { + this.substationName = substationName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public Integer getIsValid() { + return isValid; + } + + public void setIsValid(Integer isValid) { + this.isValid = isValid; + } + + public Integer getAdminId() { + return adminId; + } + + public void setAdminId(Integer adminId) { + this.adminId = adminId; + } + + public String getWorldChatGroupId() { + return worldChatGroupId; + } + + public void setWorldChatGroupId(String worldChatGroupId) { + this.worldChatGroupId = worldChatGroupId; + } + + public String getNiuniuGroupId() { + return niuniuGroupId; + } + + public void setNiuniuGroupId(String niuniuGroupId) { + this.niuniuGroupId = niuniuGroupId; + } + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/LoginBeanJiaXu.java b/app/src/main/java/com/dskj/rbchat/model/LoginBeanJiaXu.java new file mode 100644 index 0000000..74c0e9b --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/LoginBeanJiaXu.java @@ -0,0 +1,13 @@ +package com.dskj.rbchat.model; + +public class LoginBeanJiaXu { + private String loginUrl; + + public String getLoginUrl() { + return loginUrl; + } + + public void setLoginUrl(String loginUrl) { + this.loginUrl = loginUrl; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/LoginUserBean.java b/app/src/main/java/com/dskj/rbchat/model/LoginUserBean.java new file mode 100644 index 0000000..a459fc2 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/LoginUserBean.java @@ -0,0 +1,24 @@ +package com.dskj.rbchat.model; + + +public class LoginUserBean { + + public String username; + public String userpassword; + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getUserpassword() { + return userpassword; + } + + public void setUserpassword(String userpassword) { + this.userpassword = userpassword; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/Message54Bean.java b/app/src/main/java/com/dskj/rbchat/model/Message54Bean.java new file mode 100644 index 0000000..6451535 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/Message54Bean.java @@ -0,0 +1,25 @@ +package com.dskj.rbchat.model; + +import java.util.List; + +public class Message54Bean { + + private String content; + private List questionList; + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public List getQuestionList() { + return questionList; + } + + public void setQuestionList(List questionList) { + this.questionList = questionList; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/MessageAtQuBean.java b/app/src/main/java/com/dskj/rbchat/model/MessageAtQuBean.java new file mode 100644 index 0000000..b9c3bc9 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/MessageAtQuBean.java @@ -0,0 +1,13 @@ +package com.dskj.rbchat.model; + +public class MessageAtQuBean { + private String content; + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/MessageBean.java b/app/src/main/java/com/dskj/rbchat/model/MessageBean.java new file mode 100644 index 0000000..c2c62d0 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/MessageBean.java @@ -0,0 +1,105 @@ +package com.dskj.rbchat.model; + + +public class MessageBean{ + + private Integer historyId; + private Integer userUid; + private Integer friendUserUid; + private Integer historyType; + private String historyContent; + private String historyContent2; + private String historyTime2; + private String historyTime; + private Integer chatType; + private String groupId; + private String parentFp; + + public Integer getHistoryId() { + return historyId; + } + + public void setHistoryId(Integer historyId) { + this.historyId = historyId; + } + + public Integer getUserUid() { + return userUid; + } + + public void setUserUid(Integer userUid) { + this.userUid = userUid; + } + + public Integer getFriendUserUid() { + return friendUserUid; + } + + public void setFriendUserUid(Integer friendUserUid) { + this.friendUserUid = friendUserUid; + } + + public Integer getHistoryType() { + return historyType; + } + + public void setHistoryType(Integer historyType) { + this.historyType = historyType; + } + + public String getHistoryContent() { + return historyContent; + } + + public void setHistoryContent(String historyContent) { + this.historyContent = historyContent; + } + + public String getHistoryContent2() { + return historyContent2; + } + + public void setHistoryContent2(String historyContent2) { + this.historyContent2 = historyContent2; + } + + public String getHistoryTime2() { + return historyTime2; + } + + public void setHistoryTime2(String historyTime2) { + this.historyTime2 = historyTime2; + } + + public String getHistoryTime() { + return historyTime; + } + + public void setHistoryTime(String historyTime) { + this.historyTime = historyTime; + } + + public Integer getChatType() { + return chatType; + } + + public void setChatType(Integer chatType) { + this.chatType = chatType; + } + + public String getGroupId() { + return groupId; + } + + public void setGroupId(String groupId) { + this.groupId = groupId; + } + + public String getParentFp() { + return parentFp; + } + + public void setParentFp(String parentFp) { + this.parentFp = parentFp; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/NearbySearchBean.java b/app/src/main/java/com/dskj/rbchat/model/NearbySearchBean.java new file mode 100644 index 0000000..f96e6e1 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/NearbySearchBean.java @@ -0,0 +1,211 @@ +package com.dskj.rbchat.model; + +import java.util.List; + +public class NearbySearchBean { + + private GeometryDTO geometry; + private String icon; + private String icon_background_color; + private String icon_mask_base_uri; + private String name; + private List photos; + private String place_id; + private String reference; + private String scope; + private List types; + private String vicinity; + + + + public GeometryDTO getGeometry() { + return geometry; + } + + public void setGeometry(GeometryDTO geometry) { + this.geometry = geometry; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getIcon_background_color() { + return icon_background_color; + } + + public void setIcon_background_color(String icon_background_color) { + this.icon_background_color = icon_background_color; + } + + public String getIcon_mask_base_uri() { + return icon_mask_base_uri; + } + + public void setIcon_mask_base_uri(String icon_mask_base_uri) { + this.icon_mask_base_uri = icon_mask_base_uri; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getPhotos() { + return photos; + } + + public void setPhotos(List photos) { + this.photos = photos; + } + + public String getPlace_id() { + return place_id; + } + + public void setPlace_id(String place_id) { + this.place_id = place_id; + } + + public String getReference() { + return reference; + } + + public void setReference(String reference) { + this.reference = reference; + } + + public String getScope() { + return scope; + } + + public void setScope(String scope) { + this.scope = scope; + } + + public List getTypes() { + return types; + } + + public void setTypes(List types) { + this.types = types; + } + + public String getVicinity() { + return vicinity; + } + + public void setVicinity(String vicinity) { + this.vicinity = vicinity; + } + + public static class GeometryDTO { + private GeometryDTO.LocationDTO location; + private GeometryDTO.ViewportDTO viewport; + + public LocationDTO getLocation() { + return location; + } + + public void setLocation(LocationDTO location) { + this.location = location; + } + + public ViewportDTO getViewport() { + return viewport; + } + + public void setViewport(ViewportDTO viewport) { + this.viewport = viewport; + } + + public static class LocationDTO { + private Double lat; + private Double lng; + + public Double getLat() { + return lat; + } + + public void setLat(Double lat) { + this.lat = lat; + } + + public Double getLng() { + return lng; + } + + public void setLng(Double lng) { + this.lng = lng; + } + } + + public static class ViewportDTO { + private LocationDTO northeast; + private LocationDTO southwest; + + public LocationDTO getNortheast() { + return northeast; + } + + public void setNortheast(LocationDTO northeast) { + this.northeast = northeast; + } + + public LocationDTO getSouthwest() { + return southwest; + } + + public void setSouthwest(LocationDTO southwest) { + this.southwest = southwest; + } + } + } + + + public static class PhotosDTO { + private Integer height; + private List html_attributions; + private String photo_reference; + private Integer width; + + public Integer getHeight() { + return height; + } + + public void setHeight(Integer height) { + this.height = height; + } + + public List getHtml_attributions() { + return html_attributions; + } + + public void setHtml_attributions(List html_attributions) { + this.html_attributions = html_attributions; + } + + public String getPhoto_reference() { + return photo_reference; + } + + public void setPhoto_reference(String photo_reference) { + this.photo_reference = photo_reference; + } + + public Integer getWidth() { + return width; + } + + public void setWidth(Integer width) { + this.width = width; + } + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/NewsBean.java b/app/src/main/java/com/dskj/rbchat/model/NewsBean.java new file mode 100644 index 0000000..c00d67f --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/NewsBean.java @@ -0,0 +1,287 @@ +package com.dskj.rbchat.model; + + + +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.utils.DataUtils; + +import java.io.Serializable; + + +public class NewsBean implements Serializable { + + private Integer announcementId; + private String title; + private String subtitle; + private String picture; + private String content; + private String createTime; + private Integer isValid; + private Integer viewTime; + private Integer creatorId; + private String titleZhCn; + private String titleZhTw; + private String titleJaJp; + private String titleEnUs; + private String subtitleZhCn; + private String subtitleZhTw; + private String subtitleJaJp; + private String subtitleEnUs; + private String pictureZhCn; + private String pictureZhTw; + private String pictureJaJp; + private String pictureEnUs; + private String contentZhCn; + private String contentZhTw; + private String contentJaJp; + private String contentEnUs; + private String createTimestamp; + + public String getTitleZhCn() { + return titleZhCn; + } + + public void setTitleZhCn(String titleZhCn) { + this.titleZhCn = titleZhCn; + } + + public String getTitleZhTw() { + return titleZhTw; + } + + public void setTitleZhTw(String titleZhTw) { + this.titleZhTw = titleZhTw; + } + + public String getTitleJaJp() { + return titleJaJp; + } + + public void setTitleJaJp(String titleJaJp) { + this.titleJaJp = titleJaJp; + } + + public String getTitleEnUs() { + return titleEnUs; + } + + public void setTitleEnUs(String titleEnUs) { + this.titleEnUs = titleEnUs; + } + + public String getSubtitleZhCn() { + return subtitleZhCn; + } + + public void setSubtitleZhCn(String subtitleZhCn) { + this.subtitleZhCn = subtitleZhCn; + } + + public String getSubtitleZhTw() { + return subtitleZhTw; + } + + public void setSubtitleZhTw(String subtitleZhTw) { + this.subtitleZhTw = subtitleZhTw; + } + + public String getSubtitleJaJp() { + return subtitleJaJp; + } + + public void setSubtitleJaJp(String subtitleJaJp) { + this.subtitleJaJp = subtitleJaJp; + } + + public String getSubtitleEnUs() { + return subtitleEnUs; + } + + public void setSubtitleEnUs(String subtitleEnUs) { + this.subtitleEnUs = subtitleEnUs; + } + + public String getPictureZhCn() { + return pictureZhCn; + } + + public void setPictureZhCn(String pictureZhCn) { + this.pictureZhCn = pictureZhCn; + } + + public String getPictureZhTw() { + return pictureZhTw; + } + + public void setPictureZhTw(String pictureZhTw) { + this.pictureZhTw = pictureZhTw; + } + + public String getPictureJaJp() { + return pictureJaJp; + } + + public void setPictureJaJp(String pictureJaJp) { + this.pictureJaJp = pictureJaJp; + } + + public String getPictureEnUs() { + return pictureEnUs; + } + + public void setPictureEnUs(String pictureEnUs) { + this.pictureEnUs = pictureEnUs; + } + + public String getContentZhCn() { + return contentZhCn; + } + + public void setContentZhCn(String contentZhCn) { + this.contentZhCn = contentZhCn; + } + + public String getContentZhTw() { + return contentZhTw; + } + + public void setContentZhTw(String contentZhTw) { + this.contentZhTw = contentZhTw; + } + + public String getContentJaJp() { + return contentJaJp; + } + + public void setContentJaJp(String contentJaJp) { + this.contentJaJp = contentJaJp; + } + + public String getContentEnUs() { + return contentEnUs; + } + + public void setContentEnUs(String contentEnUs) { + this.contentEnUs = contentEnUs; + } + + public String getCreateTimestamp() { + return createTimestamp; + } + + public void setCreateTimestamp(String createTimestamp) { + this.createTimestamp = createTimestamp; + } + + public Integer getAnnouncementId() { + return announcementId; + } + + public void setAnnouncementId(Integer announcementId) { + this.announcementId = announcementId; + } + + public String getTitle() { + int loc = DataUtils.get(IMApplication.getAppContext(),"locale",0); + switch (loc){ + case 1: + return this.titleZhCn+""; + case 2: + return this.titleEnUs+""; + case 3: + return this.titleJaJp+""; + default: + return this.titleZhTw+""; + } + } + + public void setTitle(String title) { + this.title = title; + } + + public String getSubtitle() { + int loc = DataUtils.get(IMApplication.getAppContext(),"locale",0); + switch (loc){ + case 1: + return this.subtitleZhCn+""; + case 2: + return this.subtitleEnUs+""; + case 3: + return this.subtitleJaJp+""; + default: + return this.subtitleZhTw+""; + } + } + + public void setSubtitle(String subtitle) { + this.subtitle = subtitle; + } + + public String getPicture() { + int loc = DataUtils.get(IMApplication.getAppContext(),"locale",0); + switch (loc){ + case 1: + return this.pictureZhCn; + case 2: + return this.pictureEnUs; + case 3: + return this.pictureJaJp; + default: + return this.pictureZhTw; + } + } + + public void setPicture(String picture) { + this.picture = picture; + } + + public String getContent() { + int loc = DataUtils.get(IMApplication.getAppContext(),"locale",0); + switch (loc){ + case 1: + return this.contentZhCn+""; + case 2: + return this.contentEnUs+""; + case 3: + return this.contentJaJp+""; + default: + return this.contentZhTw+""; + } + } + + public void setContent(String content) { + this.content = content; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public Integer getIsValid() { + return isValid; + } + + public void setIsValid(Integer isValid) { + this.isValid = isValid; + } + + public Integer getViewTime() { + return viewTime; + } + + public void setViewTime(Integer viewTime) { + this.viewTime = viewTime; + } + + public Integer getCreatorId() { + return creatorId; + } + + public void setCreatorId(Integer creatorId) { + this.creatorId = creatorId; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/NotifyCountBean.java b/app/src/main/java/com/dskj/rbchat/model/NotifyCountBean.java new file mode 100644 index 0000000..0df422e --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/NotifyCountBean.java @@ -0,0 +1,23 @@ +package com.dskj.rbchat.model; + +public class NotifyCountBean { + + public int systemMsgCount; + public int activityMsgCount; + + public int getSystemMsgCount() { + return systemMsgCount; + } + + public void setSystemMsgCount(int systemMsgCount) { + this.systemMsgCount = systemMsgCount; + } + + public int getActivityMsgCount() { + return activityMsgCount; + } + + public void setActivityMsgCount(int activityMsgCount) { + this.activityMsgCount = activityMsgCount; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/NotifyExtraBean.java b/app/src/main/java/com/dskj/rbchat/model/NotifyExtraBean.java new file mode 100644 index 0000000..c890435 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/NotifyExtraBean.java @@ -0,0 +1,25 @@ +package com.dskj.rbchat.model; + +import java.io.Serializable; + +public class NotifyExtraBean implements Serializable { + + private String postId; + private int type; + + public String getPostId() { + return postId; + } + + public void setPostId(String postId) { + this.postId = postId; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/OauthAppBean.java b/app/src/main/java/com/dskj/rbchat/model/OauthAppBean.java new file mode 100644 index 0000000..9d0a4b6 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/OauthAppBean.java @@ -0,0 +1,51 @@ +package com.dskj.rbchat.model; + + +public class OauthAppBean { + + private Integer id; + private String appId; + private String appSecret; + private String appName; + private String oauthChargeCallbackUrl; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getAppId() { + return appId; + } + + public void setAppId(String appId) { + this.appId = appId; + } + + public String getAppSecret() { + return appSecret; + } + + public void setAppSecret(String appSecret) { + this.appSecret = appSecret; + } + + public String getAppName() { + return appName; + } + + public void setAppName(String appName) { + this.appName = appName; + } + + public String getOauthChargeCallbackUrl() { + return oauthChargeCallbackUrl; + } + + public void setOauthChargeCallbackUrl(String oauthChargeCallbackUrl) { + this.oauthChargeCallbackUrl = oauthChargeCallbackUrl; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/PassWordLoginBean.java b/app/src/main/java/com/dskj/rbchat/model/PassWordLoginBean.java new file mode 100644 index 0000000..36f6265 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/PassWordLoginBean.java @@ -0,0 +1,75 @@ +package com.dskj.rbchat.model; + +public class PassWordLoginBean { + private String phone; + private String password; + private String areaCode; + private int deviceType; + private String deviceId; + private String substationId; +// + public PassWordLoginBean(String phone, String password, String areaCode, int deviceType, String deviceId) { + this.phone = phone; + this.password = password; + this.areaCode = areaCode; + this.deviceType = deviceType; + this.deviceId = deviceId; + } + + public PassWordLoginBean(String phone, String password, String areaCode, int deviceType, String deviceId, String substationId) { + this.phone = phone; + this.password = password; + this.areaCode = areaCode; + this.deviceType = deviceType; + this.deviceId = deviceId; + this.substationId = substationId; + } + + public String getSubstationId() { + return substationId; + } + + public void setSubstationId(String substationId) { + this.substationId = substationId; + } + + public int getDeviceType() { + return deviceType; + } + + public void setDeviceType(int deviceType) { + this.deviceType = deviceType; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getAreaCode() { + return areaCode; + } + + public void setAreaCode(String areaCode) { + this.areaCode = areaCode; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/PayInfoBean.java b/app/src/main/java/com/dskj/rbchat/model/PayInfoBean.java new file mode 100644 index 0000000..ecea7e3 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/PayInfoBean.java @@ -0,0 +1,42 @@ +package com.dskj.rbchat.model; + + +public class PayInfoBean { + + private String headImage; + private String nickname; + private Long payId; + private Long amount; + + public String getHeadImage() { + return headImage; + } + + public void setHeadImage(String headImage) { + this.headImage = headImage; + } + + public String getNickname() { + return nickname; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } + + public long getPayId() { + return payId; + } + + public void setPayId(Long payId) { + this.payId = payId; + } + + public Long getAmount() { + return amount; + } + + public void setAmount(Long amount) { + this.amount = amount; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/PushBean.java b/app/src/main/java/com/dskj/rbchat/model/PushBean.java new file mode 100644 index 0000000..56a173f --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/PushBean.java @@ -0,0 +1,57 @@ +package com.dskj.rbchat.model; + +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.R; + +import java.util.ArrayList; +import java.util.List; + +public class PushBean { + private int type; + private String name; + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public PushBean() { + + } + + public PushBean(int type, String name) { + this.type = type; + this.name = name; + } + + public static List getList(){ + List typeBeans = new ArrayList<>(); + //0 群红包,1 私聊红包,2 转账,3 金币银币互转 + typeBeans.add(new PushBean(0, IMApplication.getAppContext().getString(R.string.all_visible_txt))); + typeBeans.add(new PushBean(1,IMApplication.getAppContext().getString(R.string.friend_visible_txt))); + typeBeans.add(new PushBean(2,IMApplication.getAppContext().getString(R.string.onlyme_visible_txt))); + + return typeBeans; + } + + public static PushBean getTypeString(int type){ + List typeBeans = getList(); + for ( int i = 0;i questions; + private String titleZhCn; + private String titleZhTw; + private String titleJaJp; + private String titleEnUs; + + public String getTitleZhCn() { + return titleZhCn; + } + + public void setTitleZhCn(String titleZhCn) { + this.titleZhCn = titleZhCn; + } + + public String getTitleZhTw() { + return titleZhTw; + } + + public void setTitleZhTw(String titleZhTw) { + this.titleZhTw = titleZhTw; + } + + public String getTitleJaJp() { + return titleJaJp; + } + + public void setTitleJaJp(String titleJaJp) { + this.titleJaJp = titleJaJp; + } + + public String getTitleEnUs() { + return titleEnUs; + } + + public void setTitleEnUs(String titleEnUs) { + this.titleEnUs = titleEnUs; + } + + public Integer getCategoryId() { + return categoryId; + } + + public void setCategoryId(Integer categoryId) { + this.categoryId = categoryId; + } + + public String getPicture() { + return picture; + } + + public void setPicture(String picture) { + this.picture = picture; + } + + public String getTitle() { + int loc = DataUtils.get(IMApplication.getAppContext(),"locale",0); + switch (loc){ + case 1: + return this.titleZhCn+""; + case 2: + return this.titleEnUs+""; + case 3: + return this.titleJaJp+""; + default: + return this.titleZhTw+""; + } + } + + public void setTitle(String title) { + this.title = title; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public Integer getSort() { + return sort; + } + + public void setSort(Integer sort) { + this.sort = sort; + } + + public Integer getCreatorId() { + return creatorId; + } + + public void setCreatorId(Integer creatorId) { + this.creatorId = creatorId; + } + + public Integer getIsValid() { + return isValid; + } + + public void setIsValid(Integer isValid) { + this.isValid = isValid; + } + + public List getQuestions() { + return questions; + } + + public void setQuestions(List questions) { + this.questions = questions; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/QuestionBean.java b/app/src/main/java/com/dskj/rbchat/model/QuestionBean.java new file mode 100644 index 0000000..4adf09b --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/QuestionBean.java @@ -0,0 +1,182 @@ +package com.dskj.rbchat.model; + + +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.utils.DataUtils; + +public class QuestionBean { + + private Integer questionId; + private Integer categoryId; + private String title; + private String answer; + private String createTime; + private Integer viewTime; + private Integer creatorId; + private Integer isValid; + private Integer isRecommend; + private String titleZhCn; + private String titleZhTw; + private String titleJaJp; + private String titleEnUs; + private String answerZhCn; + private String answerZhTw; + private String answerJaJp; + private String answerEnUs; + + public String getTitleZhCn() { + return titleZhCn; + } + + public void setTitleZhCn(String titleZhCn) { + this.titleZhCn = titleZhCn; + } + + public String getTitleZhTw() { + return titleZhTw; + } + + public void setTitleZhTw(String titleZhTw) { + this.titleZhTw = titleZhTw; + } + + public String getTitleJaJp() { + return titleJaJp; + } + + public void setTitleJaJp(String titleJaJp) { + this.titleJaJp = titleJaJp; + } + + public String getTitleEnUs() { + return titleEnUs; + } + + public void setTitleEnUs(String titleEnUs) { + this.titleEnUs = titleEnUs; + } + + public String getAnswerZhCn() { + return answerZhCn; + } + + public void setAnswerZhCn(String answerZhCn) { + this.answerZhCn = answerZhCn; + } + + public String getAnswerZhTw() { + return answerZhTw; + } + + public void setAnswerZhTw(String answerZhTw) { + this.answerZhTw = answerZhTw; + } + + public String getAnswerJaJp() { + return answerJaJp; + } + + public void setAnswerJaJp(String answerJaJp) { + this.answerJaJp = answerJaJp; + } + + public String getAnswerEnUs() { + return answerEnUs; + } + + public void setAnswerEnUs(String answerEnUs) { + this.answerEnUs = answerEnUs; + } + + public Integer getQuestionId() { + return questionId; + } + + public void setQuestionId(Integer questionId) { + this.questionId = questionId; + } + + public Integer getCategoryId() { + return categoryId; + } + + public void setCategoryId(Integer categoryId) { + this.categoryId = categoryId; + } + + public String getTitle() { + int loc = DataUtils.get(IMApplication.getAppContext(),"locale",0); + switch (loc){ + case 1: + return this.titleZhCn+""; + case 2: + return this.titleEnUs+""; + case 3: + return this.titleJaJp+""; + default: + return this.titleZhTw+""; + } + } + + public void setTitle(String title) { + this.title = title; + } + + public String getAnswer() { + int loc = DataUtils.get(IMApplication.getAppContext(),"locale",0); + switch (loc){ + case 1: + return this.answerZhCn+""; + case 2: + return this.answerEnUs+""; + case 3: + return this.answerJaJp+""; + default: + return this.answerZhTw+""; + } + } + + public void setAnswer(String answer) { + this.answer = answer; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public Integer getViewTime() { + return viewTime; + } + + public void setViewTime(Integer viewTime) { + this.viewTime = viewTime; + } + + public Integer getCreatorId() { + return creatorId; + } + + public void setCreatorId(Integer creatorId) { + this.creatorId = creatorId; + } + + public Integer getIsValid() { + return isValid; + } + + public void setIsValid(Integer isValid) { + this.isValid = isValid; + } + + public Integer getIsRecommend() { + return isRecommend; + } + + public void setIsRecommend(Integer isRecommend) { + this.isRecommend = isRecommend; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/QuoteMessageBean.java b/app/src/main/java/com/dskj/rbchat/model/QuoteMessageBean.java new file mode 100644 index 0000000..0a3209d --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/QuoteMessageBean.java @@ -0,0 +1,35 @@ +package com.dskj.rbchat.model; + + +import java.util.List; + +public class QuoteMessageBean { + + private String content; + private String quote; + private List user; + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getQuote() { + return quote; + } + + public void setQuote(String quote) { + this.quote = quote; + } + + public List getUser() { + return user; + } + + public void setUser(List user) { + this.user = user; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/ReadBean.java b/app/src/main/java/com/dskj/rbchat/model/ReadBean.java new file mode 100644 index 0000000..d17ddc4 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/ReadBean.java @@ -0,0 +1,73 @@ +package com.dskj.rbchat.model; + + + +public class ReadBean { + private Long id; + private Integer type; + private String fingerPrint; + private Integer fromUserId; + private Integer readUserId; + private String groupId; + + public ReadBean(Long id, Integer type, String fingerPrint, Integer fromUserId, + Integer readUserId, String groupId) { + this.id = id; + this.type = type; + this.fingerPrint = fingerPrint; + this.fromUserId = fromUserId; + this.readUserId = readUserId; + this.groupId = groupId; + } + + public ReadBean() { + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getFingerPrint() { + return fingerPrint; + } + + public void setFingerPrint(String fingerPrint) { + this.fingerPrint = fingerPrint; + } + + public Integer getFromUserId() { + return fromUserId; + } + + public void setFromUserId(Integer fromUserId) { + this.fromUserId = fromUserId; + } + + public Integer getReadUserId() { + return readUserId; + } + + public void setReadUserId(Integer readUserId) { + this.readUserId = readUserId; + } + + public String getGroupId() { + return groupId; + } + + public void setGroupId(String groupId) { + this.groupId = groupId; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/ReadMessageBean.java b/app/src/main/java/com/dskj/rbchat/model/ReadMessageBean.java new file mode 100644 index 0000000..2390edd --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/ReadMessageBean.java @@ -0,0 +1,15 @@ +package com.dskj.rbchat.model; + +import java.util.List; + +public class ReadMessageBean { + private List fingerPrints; + + public List getFingerPrints() { + return fingerPrints; + } + + public void setFingerPrints(List fingerPrints) { + this.fingerPrints = fingerPrints; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/ReadRxBusBean.java b/app/src/main/java/com/dskj/rbchat/model/ReadRxBusBean.java new file mode 100644 index 0000000..fe03df0 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/ReadRxBusBean.java @@ -0,0 +1,17 @@ +package com.dskj.rbchat.model; + +public class ReadRxBusBean { + public int type; + public Integer readUserId; + public String groupId; + + public ReadRxBusBean(int type, Integer readUserId) { + this.type = type; + this.readUserId = readUserId; + } + + public ReadRxBusBean(int type, String groupId) { + this.type = type; + this.groupId = groupId; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/RebootMessageBean.java b/app/src/main/java/com/dskj/rbchat/model/RebootMessageBean.java new file mode 100644 index 0000000..04f1f1b --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/RebootMessageBean.java @@ -0,0 +1,13 @@ +package com.dskj.rbchat.model; + +public class RebootMessageBean { + private String content; + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/RefreshTokenBean.java b/app/src/main/java/com/dskj/rbchat/model/RefreshTokenBean.java new file mode 100644 index 0000000..71d6c8b --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/RefreshTokenBean.java @@ -0,0 +1,13 @@ +package com.dskj.rbchat.model; + +public class RefreshTokenBean { + private String refreshToken; + + public String getRefreshToken() { + return refreshToken; + } + + public void setRefreshToken(String refreshToken) { + this.refreshToken = refreshToken; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/RegisteredBean.java b/app/src/main/java/com/dskj/rbchat/model/RegisteredBean.java new file mode 100644 index 0000000..9b4d2c9 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/RegisteredBean.java @@ -0,0 +1,31 @@ +package com.dskj.rbchat.model; + +public class RegisteredBean { + private boolean registered; + private boolean correct; + private boolean used; + + public boolean isUsed() { + return used; + } + + public void setUsed(boolean used) { + this.used = used; + } + + public boolean isCorrect() { + return correct; + } + + public void setCorrect(boolean correct) { + this.correct = correct; + } + + public boolean isRegistered() { + return registered; + } + + public void setRegistered(boolean registered) { + this.registered = registered; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/ReportBean.java b/app/src/main/java/com/dskj/rbchat/model/ReportBean.java new file mode 100644 index 0000000..c2ebf99 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/ReportBean.java @@ -0,0 +1,37 @@ +package com.dskj.rbchat.model; + +public class ReportBean { + private int index; + private boolean isCheck; + private String title; + + public ReportBean(int index, boolean isCheck, String title) { + this.index = index; + this.isCheck = isCheck; + this.title = title; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + public boolean isCheck() { + return isCheck; + } + + public void setCheck(boolean check) { + isCheck = check; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/RosterElementEntity.java b/app/src/main/java/com/dskj/rbchat/model/RosterElementEntity.java new file mode 100644 index 0000000..6b7aeec --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/RosterElementEntity.java @@ -0,0 +1,368 @@ +package com.dskj.rbchat.model; + +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// +import com.dskj.rbchat.utils.CommonUtils; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Observable; +import java.util.Observer; + +public class RosterElementEntity implements Serializable { + public static final String DEFAULT_INVALID_UID_VALUE = "-1"; + public static final int LIVE_STATUS_ONLINE = 1; + public static final int LIVE_STATUS_OFFLINE = 0; + public static final String SEX_MAN = "1"; + public static final String SEX_WOMAN = "0"; + protected String ex1; + protected String ex10; + protected String ex11; + protected String ex12; + protected String ex13; + protected String ex14; + protected String ex15; + protected String mustVersion4A; + protected String mustVersionDesc4A; + protected String userAvatarFileName; + protected String whatsUp; + protected String maxFriend; + protected String userDesc; + protected String userType; + protected String user_uid; + protected String user_mail; + protected String nickname; + protected String user_sex; + protected String register_time; + protected String latest_login_time; + protected String latest_login_ip; + protected String liveStatus; + protected String token = null; + protected String friendRemark; + protected String friendMobileNum; + protected String friendMoreDesc; + protected String friendPicFileName; + protected static transient List liveStatusChangeObss = new ArrayList(); + + public RosterElementEntity() { + } + + public String getUser_uid() { + return this.user_uid; + } + + public RosterElementEntity setUser_uid(String user_uid) { + this.user_uid = user_uid; + return this; + } + + public String getUser_mail() { + return this.user_mail; + } + + public RosterElementEntity setUser_mail(String user_mail) { + this.user_mail = user_mail; + return this; + } + + public String getNickname() { + return this.nickname; + } + + public String getNickNameWithRemark() { + return CommonUtils.isStringEmpty(this.friendRemark, true) ? this.nickname : this.friendRemark; + } + + public RosterElementEntity setNickname(String nickname) { + this.nickname = nickname; + return this; + } + + public String getUser_sex() { + return this.user_sex; + } + + public RosterElementEntity setUser_sex(String user_sex) { + this.user_sex = user_sex; + return this; + } + + public String getRegister_time() { + return this.register_time; + } + + public void setRegister_time(String register_time) { + this.register_time = register_time; + } + + public String getLatest_login_time() { + return this.latest_login_time; + } + + public void setLatest_login_time(String latest_login_time) { + this.latest_login_time = latest_login_time; + } + + public String getLiveStatus() { + return this.liveStatus; + } + + public RosterElementEntity setLiveStatus(String liveStatus) { + this.liveStatus = liveStatus; + if (getLiveStatusChangeObss().size() > 0) { + Iterator var2 = getLiveStatusChangeObss().iterator(); + + while(var2.hasNext()) { + Observer o = (Observer)var2.next(); + o.update((Observable)null, new String[]{this.nickname, "" + liveStatus, this.user_uid}); + } + } + + return this; + } + + public String getToken() { + return this.token; + } + + public void setToken(String tokenforIM) { + this.token = tokenforIM; + } + + public boolean isOnline() { + return this.liveStatus .equals("1"); + } + + public void online() { + this.setLiveStatus("1"); + } + + public void offline() { + this.setLiveStatus("0"); + } + + public boolean isMan() { + return "1".equals(this.user_sex); + } + + public String toString() { + return this.nickname; + } + + public String getEx1() { + return this.ex1; + } + + public void setEx1(String ex1) { + this.ex1 = ex1; + } + + public String getMustVersion4A() { + return this.mustVersion4A; + } + + public void setMustVersion4A(String mustVersion4A) { + this.mustVersion4A = mustVersion4A; + } + + public String getMustVersionDesc4A() { + return this.mustVersionDesc4A; + } + + public void setMustVersionDesc4A(String mustVersionDesc4A) { + this.mustVersionDesc4A = mustVersionDesc4A; + } + + public String getUserAvatarFileName() { + return this.userAvatarFileName; + } + + public void setUserAvatarFileName(String userAvatarFileName) { + this.userAvatarFileName = userAvatarFileName; + } + + public String getWhatsUp() { + return this.whatsUp; + } + + public void setWhatsUp(String whatsUp) { + this.whatsUp = whatsUp; + } + + public String getMaxFriend() { + if(this.maxFriend.equals("null")){ + return "500"; + } + return this.maxFriend; + } + + public void setMaxFriend(String maxFriend) { + + this.maxFriend = maxFriend; + } + + public String getUserDesc() { + return this.userDesc; + } + + public void setUserDesc(String userDesc) { + this.userDesc = userDesc; + } + + public String getUserType() { + return this.userType; + } + + public void setUserType(String userType) { + this.userType = userType; + } + + public String getLatest_login_ip() { + return this.latest_login_ip; + } + + public void setLatest_login_ip(String latest_login_ip) { + this.latest_login_ip = latest_login_ip; + } + + public String getEx10() { + return this.ex10; + } + + public void setEx10(String ex10) { + this.ex10 = ex10; + } + + public Object getEx11() { + return this.ex11; + } + + public void setEx11(String ex11) { + this.ex11 = ex11; + } + + public String getEx12() { + return this.ex12; + } + + public void setEx12(String ex12) { + this.ex12 = ex12; + } + + public String getEx13() { + return this.ex13; + } + + public void setEx13(String ex13) { + this.ex13 = ex13; + } + + public String getEx14() { + return this.ex14; + } + + public void setEx14(String ex14) { + this.ex14 = ex14; + } + + public String getEx15() { + return this.ex15; + } + + public void setEx15(String ex15) { + this.ex15 = ex15; + } + + public String getFriendRemark() { + return this.friendRemark; + } + + public void setFriendRemark(String friendRemark) { + this.friendRemark = friendRemark; + } + + public String getFriendMobileNum() { + return this.friendMobileNum; + } + + public void setFriendMobileNum(String friendMobileNum) { + this.friendMobileNum = friendMobileNum; + } + + public String getFriendMoreDesc() { + return this.friendMoreDesc; + } + + public void setFriendMoreDesc(String friendMoreDesc) { + this.friendMoreDesc = friendMoreDesc; + } + + public String getFriendPicFileName() { + return this.friendPicFileName; + } + + public void setFriendPicFileName(String friendPicFileName) { + this.friendPicFileName = friendPicFileName; + } + + protected RosterElementEntity doClone(RosterElementEntity newObj) { + if (newObj != null) { + newObj.setEx1(this.ex1); + newObj.setEx10(this.ex10); + newObj.setEx11(this.ex11); + newObj.setEx12(this.ex12); + newObj.setEx13(this.ex13); + newObj.setEx14(this.ex14); + newObj.setEx15(this.ex15); + newObj.setMustVersion4A(this.mustVersion4A); + newObj.setMustVersionDesc4A(this.mustVersionDesc4A); + newObj.setUserAvatarFileName(this.userAvatarFileName); + newObj.setWhatsUp(this.whatsUp); + newObj.setMaxFriend(this.maxFriend); + newObj.setUserDesc(this.userDesc); + newObj.setUserType(this.userType); + newObj.setUser_uid(this.user_uid); + newObj.setUser_mail(this.user_mail); + newObj.setNickname(this.nickname); + newObj.setUser_sex(this.user_sex); + newObj.setRegister_time(this.register_time); + newObj.setLatest_login_time(this.latest_login_time); + newObj.setLiveStatus(this.liveStatus); + newObj.setToken(this.token); + newObj.setFriendRemark(this.friendRemark); + newObj.setFriendMobileNum(this.friendMobileNum); + newObj.setFriendMoreDesc(this.friendMoreDesc); + newObj.setFriendPicFileName(this.friendPicFileName); + } + + return newObj; + } + + public Object clone() { + RosterElementEntity cloneRee = new RosterElementEntity(); + return this.doClone(cloneRee); + } + + public static void addLiveStatusChangeObs(Observer liveStatusChangeObs) { + if (liveStatusChangeObs != null) { + liveStatusChangeObss.add(liveStatusChangeObs); + } + + } + + public static void removeLiveStatusChangeObs(Observer liveStatusChangeObs) { + if (liveStatusChangeObs != null) { + liveStatusChangeObss.remove(liveStatusChangeObs); + } + + } + + public static List getLiveStatusChangeObss() { + return liveStatusChangeObss; + } +} + diff --git a/app/src/main/java/com/dskj/rbchat/model/RtcTokenBean.java b/app/src/main/java/com/dskj/rbchat/model/RtcTokenBean.java new file mode 100644 index 0000000..adab097 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/RtcTokenBean.java @@ -0,0 +1,37 @@ +package com.dskj.rbchat.model; + +public class RtcTokenBean { + private int role; + private String uid; + private String friendId; + + public RtcTokenBean(int role, String uid, String friendId) { + this.role = role; + this.uid = uid; + this.friendId = friendId; + } + + public int getRole() { + return role; + } + + public void setRole(int role) { + this.role = role; + } + + public String getUid() { + return uid; + } + + public void setUid(String uid) { + this.uid = uid; + } + + public String getFriendId() { + return friendId; + } + + public void setFriendId(String friendId) { + this.friendId = friendId; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/RtcTokenResBean.java b/app/src/main/java/com/dskj/rbchat/model/RtcTokenResBean.java new file mode 100644 index 0000000..9b45a92 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/RtcTokenResBean.java @@ -0,0 +1,33 @@ +package com.dskj.rbchat.model; + +public class RtcTokenResBean { + + + private String channelName; + private String uid; + private String rtcToken; + + public String getChannelName() { + return channelName; + } + + public void setChannelName(String channelName) { + this.channelName = channelName; + } + + public String getUid() { + return uid; + } + + public void setUid(String uid) { + this.uid = uid; + } + + public String getRtcToken() { + return rtcToken; + } + + public void setRtcToken(String rtcToken) { + this.rtcToken = rtcToken; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/RxBusEditMessage.java b/app/src/main/java/com/dskj/rbchat/model/RxBusEditMessage.java new file mode 100644 index 0000000..6031d74 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/RxBusEditMessage.java @@ -0,0 +1,40 @@ +package com.dskj.rbchat.model; + +public class RxBusEditMessage { + private String toUid; + private String fingerPrint; + private String content; + + public RxBusEditMessage() { + } + + public RxBusEditMessage(String toUid, String fingerPrint, String content) { + this.toUid = toUid; + this.fingerPrint = fingerPrint; + this.content = content; + } + + public String getToUid() { + return toUid; + } + + public void setToUid(String toUid) { + this.toUid = toUid; + } + + public String getFingerPrint() { + return fingerPrint; + } + + public void setFingerPrint(String fingerPrint) { + this.fingerPrint = fingerPrint; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/RxBusLoadMoreListBean.java b/app/src/main/java/com/dskj/rbchat/model/RxBusLoadMoreListBean.java new file mode 100644 index 0000000..d299112 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/RxBusLoadMoreListBean.java @@ -0,0 +1,18 @@ +package com.dskj.rbchat.model; + +public class RxBusLoadMoreListBean { + private int type; + + public RxBusLoadMoreListBean(int type) { + this.type = type; + } + + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/RxCommLikeBean.java b/app/src/main/java/com/dskj/rbchat/model/RxCommLikeBean.java new file mode 100644 index 0000000..119c3e3 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/RxCommLikeBean.java @@ -0,0 +1,37 @@ +package com.dskj.rbchat.model; + +public class RxCommLikeBean { + private String postId; + private int commentSize; + private int likeSize; + + public RxCommLikeBean(String postId, int commentSize, int likeSize) { + this.postId = postId; + this.commentSize = commentSize; + this.likeSize = likeSize; + } + + public String getPostId() { + return postId; + } + + public void setPostId(String postId) { + this.postId = postId; + } + + public int getCommentSize() { + return commentSize; + } + + public void setCommentSize(int commentSize) { + this.commentSize = commentSize; + } + + public int getLikeSize() { + return likeSize; + } + + public void setLikeSize(int likeSize) { + this.likeSize = likeSize; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/SearchBean.java b/app/src/main/java/com/dskj/rbchat/model/SearchBean.java new file mode 100644 index 0000000..f07fc6a --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/SearchBean.java @@ -0,0 +1,17 @@ +package com.dskj.rbchat.model; + +public class SearchBean { + public String searchText; + + public SearchBean(String searchText) { + this.searchText = searchText; + } + + public String getSearchText() { + return searchText; + } + + public void setSearchText(String searchText) { + this.searchText = searchText; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/SendOrderBean.java b/app/src/main/java/com/dskj/rbchat/model/SendOrderBean.java new file mode 100644 index 0000000..f5d27c4 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/SendOrderBean.java @@ -0,0 +1,157 @@ +package com.dskj.rbchat.model; + +import android.os.Parcel; +import android.os.Parcelable; + +public class SendOrderBean { + + private String CheckMacValue; + private String ChoosePayment; + private Integer EncryptType; + private String ItemName; + private String MerchantID; + private String MerchantTradeDate; + private Long MerchantTradeNo; + private String PaymentType; + private String ReturnURL; + private Integer TotalAmount; + private String TradeDesc; + private String MerchantMemberID; + private int BindingCard; + + public String getMerchantMemberID() { + return MerchantMemberID; + } + + public void setMerchantMemberID(String merchantMemberID) { + MerchantMemberID = merchantMemberID; + } + + public int getBindingCard() { + return BindingCard; + } + + public void setBindingCard(int bindingCard) { + BindingCard = bindingCard; + } + + public String getCheckMacValue() { + return CheckMacValue; + } + + public void setCheckMacValue(String checkMacValue) { + CheckMacValue = checkMacValue; + } + + public String getChoosePayment() { + return ChoosePayment; + } + + public void setChoosePayment(String choosePayment) { + ChoosePayment = choosePayment; + } + + public Integer getEncryptType() { + return EncryptType; + } + + public void setEncryptType(Integer encryptType) { + EncryptType = encryptType; + } + + public String getItemName() { + return ItemName; + } + + public void setItemName(String itemName) { + ItemName = itemName; + } + + public String getMerchantID() { + return MerchantID; + } + + public void setMerchantID(String merchantID) { + MerchantID = merchantID; + } + + public String getMerchantTradeDate() { + return MerchantTradeDate; + } + + public void setMerchantTradeDate(String merchantTradeDate) { + MerchantTradeDate = merchantTradeDate; + } + + public Long getMerchantTradeNo() { + return MerchantTradeNo; + } + + public void setMerchantTradeNo(Long merchantTradeNo) { + MerchantTradeNo = merchantTradeNo; + } + + public String getPaymentType() { + return PaymentType; + } + + public void setPaymentType(String paymentType) { + PaymentType = paymentType; + } + + public String getReturnURL() { + return ReturnURL; + } + + public void setReturnURL(String returnURL) { + ReturnURL = returnURL; + } + + public Integer getTotalAmount() { + return TotalAmount; + } + + public void setTotalAmount(Integer totalAmount) { + TotalAmount = totalAmount; + } + + public String getTradeDesc() { + return TradeDesc; + } + + public void setTradeDesc(String tradeDesc) { + TradeDesc = tradeDesc; + } + + + public String getQuery(){ + return "CheckMacValue=" + CheckMacValue + "&" + + "ChoosePayment=" + ChoosePayment + "&" + + "EncryptType=" + EncryptType +"&" + + "ItemName=" + ItemName + "&" + + "MerchantID=" + MerchantID + "&" + + "MerchantTradeDate=" + MerchantTradeDate + "&" + + "MerchantTradeNo=" + MerchantTradeNo +"&" + + "PaymentType=" + PaymentType + "&" + + "ReturnURL=" + ReturnURL + "&" + + "TotalAmount=" + TotalAmount +"&" + + "MerchantMemberID=" + MerchantMemberID +"&" + + "BindingCard=" + BindingCard +"&" + + "TradeDesc=" + TradeDesc; + } + + public String getQuery1(){ + return "CheckMacValue=" + CheckMacValue + "&" + + "ChoosePayment=" + ChoosePayment + "&" + + "EncryptType=" + EncryptType +"&" + + "ItemName=" + ItemName + "&" + + "MerchantID=" + MerchantID + "&" + + "MerchantTradeDate=" + MerchantTradeDate + "&" + + "MerchantTradeNo=" + MerchantTradeNo +"&" + + "PaymentType=" + PaymentType + "&" + + "ReturnURL=" + ReturnURL + "&" + + "TotalAmount=" + TotalAmount +"&" + + "TradeDesc=" + TradeDesc; + } + +} diff --git a/app/src/main/java/com/dskj/rbchat/model/SetUpdatesBean.java b/app/src/main/java/com/dskj/rbchat/model/SetUpdatesBean.java new file mode 100644 index 0000000..812234b --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/SetUpdatesBean.java @@ -0,0 +1,41 @@ +package com.dskj.rbchat.model; + +import java.util.List; + +public class SetUpdatesBean { + private List updates; + + public List getUpdates() { + return updates; + } + + public void setUpdates(List updates) { + this.updates = updates; + } + + public static class Update{ + private int userId; + private int role; + + public Update(int userId, int role) { + this.userId = userId; + this.role = role; + } + + public int getUserId() { + return userId; + } + + public void setUserId(int userId) { + this.userId = userId; + } + + public int getRole() { + return role; + } + + public void setRole(int role) { + this.role = role; + } + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/StaffServiceIdBean.java b/app/src/main/java/com/dskj/rbchat/model/StaffServiceIdBean.java new file mode 100644 index 0000000..6d02f91 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/StaffServiceIdBean.java @@ -0,0 +1,24 @@ +package com.dskj.rbchat.model; + + +public class StaffServiceIdBean { + + private Integer staffServiceId; + private String staffServiceNickname; + + public Integer getStaffServiceId() { + return staffServiceId; + } + + public void setStaffServiceId(Integer staffServiceId) { + this.staffServiceId = staffServiceId; + } + + public String getStaffServiceNickname() { + return staffServiceNickname; + } + + public void setStaffServiceNickname(String staffServiceNickname) { + this.staffServiceNickname = staffServiceNickname; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/StatisticsBean.java b/app/src/main/java/com/dskj/rbchat/model/StatisticsBean.java new file mode 100644 index 0000000..af1724b --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/StatisticsBean.java @@ -0,0 +1,24 @@ +package com.dskj.rbchat.model; + + +public class StatisticsBean { + + private Integer incoming; + private Integer outgoing; + + public Integer getIncoming() { + return incoming; + } + + public void setIncoming(Integer incoming) { + this.incoming = incoming; + } + + public Integer getOutgoing() { + return outgoing; + } + + public void setOutgoing(Integer outgoing) { + this.outgoing = outgoing; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/StsCredentialsBean.java b/app/src/main/java/com/dskj/rbchat/model/StsCredentialsBean.java new file mode 100644 index 0000000..18a82dd --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/StsCredentialsBean.java @@ -0,0 +1,42 @@ +package com.dskj.rbchat.model; + + +public class StsCredentialsBean { + + private String accessKeyId; + private String accessKeySecret; + private String securityToken; + private String expiration; + + public String getAccessKeyId() { + return accessKeyId; + } + + public void setAccessKeyId(String accessKeyId) { + this.accessKeyId = accessKeyId; + } + + public String getAccessKeySecret() { + return accessKeySecret; + } + + public void setAccessKeySecret(String accessKeySecret) { + this.accessKeySecret = accessKeySecret; + } + + public String getSecurityToken() { + return securityToken; + } + + public void setSecurityToken(String securityToken) { + this.securityToken = securityToken; + } + + public String getExpiration() { + return expiration; + } + + public void setExpiration(String expiration) { + this.expiration = expiration; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/SystemResultBean.java b/app/src/main/java/com/dskj/rbchat/model/SystemResultBean.java new file mode 100644 index 0000000..f46c32f --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/SystemResultBean.java @@ -0,0 +1,33 @@ +package com.dskj.rbchat.model; + + +public class SystemResultBean { + + private String title; + private String content; + private String href; + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getHref() { + return href; + } + + public void setHref(String href) { + this.href = href; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/TaskBean.java b/app/src/main/java/com/dskj/rbchat/model/TaskBean.java new file mode 100644 index 0000000..fb808b9 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/TaskBean.java @@ -0,0 +1,123 @@ +package com.dskj.rbchat.model; + + +public class TaskBean { + + private Integer taskId; + private String taskName; + private Integer limitTime; + private Integer silverAmount; + private String createTime; + private Integer isValid; + private String progressBar; + private Boolean complete; + private Boolean dailyTaskCreditsReceived; + private String taskNameZhCn; + private String taskNameZhTw; + private String taskNameJaJp; + private String taskNameEnUs; + + public String getTaskNameZhCn() { + return taskNameZhCn; + } + + public void setTaskNameZhCn(String taskNameZhCn) { + this.taskNameZhCn = taskNameZhCn; + } + + public String getTaskNameZhTw() { + return taskNameZhTw; + } + + public void setTaskNameZhTw(String taskNameZhTw) { + this.taskNameZhTw = taskNameZhTw; + } + + public String getTaskNameJaJp() { + return taskNameJaJp; + } + + public void setTaskNameJaJp(String taskNameJaJp) { + this.taskNameJaJp = taskNameJaJp; + } + + public String getTaskNameEnUs() { + return taskNameEnUs; + } + + public void setTaskNameEnUs(String taskNameEnUs) { + this.taskNameEnUs = taskNameEnUs; + } + + public Integer getTaskId() { + return taskId; + } + + public void setTaskId(Integer taskId) { + this.taskId = taskId; + } + + public String getTaskName() { + return taskName; + } + + public void setTaskName(String taskName) { + this.taskName = taskName; + } + + public Integer getLimitTime() { + return limitTime; + } + + public void setLimitTime(Integer limitTime) { + this.limitTime = limitTime; + } + + public Integer getSilverAmount() { + return silverAmount; + } + + public void setSilverAmount(Integer silverAmount) { + this.silverAmount = silverAmount; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public Integer getIsValid() { + return isValid; + } + + public void setIsValid(Integer isValid) { + this.isValid = isValid; + } + + public String getProgressBar() { + return progressBar; + } + + public void setProgressBar(String progressBar) { + this.progressBar = progressBar; + } + + public Boolean getComplete() { + return complete; + } + + public void setComplete(Boolean complete) { + this.complete = complete; + } + + public Boolean getDailyTaskCreditsReceived() { + return dailyTaskCreditsReceived; + } + + public void setDailyTaskCreditsReceived(Boolean dailyTaskCreditsReceived) { + this.dailyTaskCreditsReceived = dailyTaskCreditsReceived; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/TeamUpdateEvent.java b/app/src/main/java/com/dskj/rbchat/model/TeamUpdateEvent.java new file mode 100644 index 0000000..65cd474 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/TeamUpdateEvent.java @@ -0,0 +1,27 @@ +package com.dskj.rbchat.model; + +import androidx.annotation.NonNull; + +import com.netease.nimlib.sdk.team.model.Team; +import com.netease.yunxin.kit.corekit.event.BaseEvent; + +public class TeamUpdateEvent extends BaseEvent { + public static final String EVENT_TYPE = "TeamUpdateEvent"; + public String teamId; + public String teamIcon; + public Team team; + + public Team getTeam() { + return team; + } + + public void setTeam(Team team) { + this.team = team; + } + + @NonNull + @Override + public String getType() { + return EVENT_TYPE; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/dskj/rbchat/model/TimeBean.java b/app/src/main/java/com/dskj/rbchat/model/TimeBean.java new file mode 100644 index 0000000..128bf19 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/TimeBean.java @@ -0,0 +1,48 @@ +package com.dskj.rbchat.model; + +import android.content.Context; + +import com.dskj.rbchat.R; + +import java.util.ArrayList; +import java.util.List; + +public class TimeBean { + private long times; + private String timeName; + + + public TimeBean(long times, String timeName) { + this.times = times; + this.timeName = timeName; + } + + public long getTimes() { + return times; + } + + public void setTimes(long times) { + this.times = times; + } + + public String getTimeName() { + return timeName; + } + + public void setTimeName(String timeName) { + this.timeName = timeName; + } + + public static List getJinYanTime(Context context){ + List timeBeans = new ArrayList<>(); +// timeBeans.add(new TimeBean(10,"10秒")); +// timeBeans.add(new TimeBean(600,String.format(context.getString(R.string.fenzhong_txt),10))); +// timeBeans.add(new TimeBean(1800,String.format(context.getString(R.string.fenzhong_txt),30))); +// timeBeans.add(new TimeBean(3600,String.format(context.getString(R.string.fenzhong_txt),60))); +// timeBeans.add(new TimeBean(60*60*3,String.format(context.getString(R.string.xiaoshi_txt),3))); +// timeBeans.add(new TimeBean(60*60*6,String.format(context.getString(R.string.xiaoshi_txt),6))); +// timeBeans.add(new TimeBean(60*60*12,String.format(context.getString(R.string.xiaoshi_txt),12))); +// timeBeans.add(new TimeBean(60*60*24,String.format(context.getString(R.string.xiaoshi_txt),24))); + return timeBeans; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/TopBean.java b/app/src/main/java/com/dskj/rbchat/model/TopBean.java new file mode 100644 index 0000000..804a265 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/TopBean.java @@ -0,0 +1,152 @@ +package com.dskj.rbchat.model; + +import java.util.List; + + +public class TopBean { + + private Integer id; + private String cardHolderName; + private String cardNumber; + private Integer bankId; + private String subBranch; + private String walletAddress; + private String qrCode; + private Long maxChargeAmount; + private Integer chargedAmount; + private String createTime; + private Integer isValid; + private Long minChargeOnce; + private Long maxChargeOnce; + private BankBean bank; + private List amountList; + private List globalAmountList; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getCardHolderName() { + return cardHolderName; + } + + public void setCardHolderName(String cardHolderName) { + this.cardHolderName = cardHolderName; + } + + public String getCardNumber() { + return cardNumber; + } + + public void setCardNumber(String cardNumber) { + this.cardNumber = cardNumber; + } + + public Integer getBankId() { + return bankId; + } + + public void setBankId(Integer bankId) { + this.bankId = bankId; + } + + public String getSubBranch() { + return subBranch; + } + + public void setSubBranch(String subBranch) { + this.subBranch = subBranch; + } + + public String getWalletAddress() { + return walletAddress; + } + + public void setWalletAddress(String walletAddress) { + this.walletAddress = walletAddress; + } + + public String getQrCode() { + return qrCode; + } + + public void setQrCode(String qrCode) { + this.qrCode = qrCode; + } + + public Long getMaxChargeAmount() { + return maxChargeAmount; + } + + public void setMaxChargeAmount(Long maxChargeAmount) { + this.maxChargeAmount = maxChargeAmount; + } + + public Integer getChargedAmount() { + return chargedAmount; + } + + public void setChargedAmount(Integer chargedAmount) { + this.chargedAmount = chargedAmount; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public Integer getIsValid() { + return isValid; + } + + public void setIsValid(Integer isValid) { + this.isValid = isValid; + } + + public Long getMinChargeOnce() { + return minChargeOnce; + } + + public void setMinChargeOnce(Long minChargeOnce) { + this.minChargeOnce = minChargeOnce; + } + + public Long getMaxChargeOnce() { + return maxChargeOnce; + } + + public void setMaxChargeOnce(Long maxChargeOnce) { + this.maxChargeOnce = maxChargeOnce; + } + + public BankBean getBank() { + return bank; + } + + public void setBank(BankBean bank) { + this.bank = bank; + } + + public List getAmountList() { + return amountList; + } + + public void setAmountList(List amountList) { + this.amountList = amountList; + } + + public List getGlobalAmountList() { + return globalAmountList; + } + + public void setGlobalAmountList(List globalAmountList) { + this.globalAmountList = globalAmountList; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/TopOrderBean.java b/app/src/main/java/com/dskj/rbchat/model/TopOrderBean.java new file mode 100644 index 0000000..18a0c55 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/TopOrderBean.java @@ -0,0 +1,255 @@ +package com.dskj.rbchat.model; + + +import java.io.Serializable; + +public class TopOrderBean implements Serializable { + + private Long id; + private Integer amount; + private Integer type; + private Integer userId; + private Integer staffServiceId; + private String createTime; + /** 0 充值中,1 完成充值,2 订单已完成,3 超时已关闭,4 用户已取消,5 客服已关闭订单*/ + private Integer status; + private String hint; + private Integer bankCardChargeChannelId; + private BankCardChargeChannelDTO bankCardChargeChannel; + private String userNickname; + private String userPhone; + private String staffServiceName; + private BankBean bank; + + public BankBean getBank() { + return bank; + } + + public void setBank(BankBean bank) { + this.bank = bank; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Integer getAmount() { + return amount; + } + + public void setAmount(Integer amount) { + this.amount = amount; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public Integer getUserId() { + return userId; + } + + public void setUserId(Integer userId) { + this.userId = userId; + } + + public Integer getStaffServiceId() { + return staffServiceId; + } + + public void setStaffServiceId(Integer staffServiceId) { + this.staffServiceId = staffServiceId; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getHint() { + return hint; + } + + public void setHint(String hint) { + this.hint = hint; + } + + public Integer getBankCardChargeChannelId() { + return bankCardChargeChannelId; + } + + public void setBankCardChargeChannelId(Integer bankCardChargeChannelId) { + this.bankCardChargeChannelId = bankCardChargeChannelId; + } + + public BankCardChargeChannelDTO getBankCardChargeChannel() { + return bankCardChargeChannel; + } + + public void setBankCardChargeChannel(BankCardChargeChannelDTO bankCardChargeChannel) { + this.bankCardChargeChannel = bankCardChargeChannel; + } + + public String getUserNickname() { + return userNickname; + } + + public void setUserNickname(String userNickname) { + this.userNickname = userNickname; + } + + public String getUserPhone() { + return userPhone; + } + + public void setUserPhone(String userPhone) { + this.userPhone = userPhone; + } + + public String getStaffServiceName() { + return staffServiceName; + } + + public void setStaffServiceName(String staffServiceName) { + this.staffServiceName = staffServiceName; + } + + public static class BankCardChargeChannelDTO implements Serializable { + private Integer id; + private String cardHolderName; + private String cardNumber; + private Integer bankId; + private String subBranch; + private String walletAddress; + private String qrCode; + private Long maxChargeAmount; + private Long chargedAmount; + private String createTime; + private Integer isValid; + private Long minChargeOnce; + private Long maxChargeOnce; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getCardHolderName() { + return cardHolderName; + } + + public void setCardHolderName(String cardHolderName) { + this.cardHolderName = cardHolderName; + } + + public String getCardNumber() { + return cardNumber; + } + + public void setCardNumber(String cardNumber) { + this.cardNumber = cardNumber; + } + + public Integer getBankId() { + return bankId; + } + + public void setBankId(Integer bankId) { + this.bankId = bankId; + } + + public String getSubBranch() { + return subBranch; + } + + public void setSubBranch(String subBranch) { + this.subBranch = subBranch; + } + + public String getWalletAddress() { + return walletAddress; + } + + public void setWalletAddress(String walletAddress) { + this.walletAddress = walletAddress; + } + + public String getQrCode() { + return qrCode; + } + + public void setQrCode(String qrCode) { + this.qrCode = qrCode; + } + + public Long getMaxChargeAmount() { + return maxChargeAmount; + } + + public void setMaxChargeAmount(Long maxChargeAmount) { + this.maxChargeAmount = maxChargeAmount; + } + + public Long getChargedAmount() { + return chargedAmount; + } + + public void setChargedAmount(Long chargedAmount) { + this.chargedAmount = chargedAmount; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public Integer getIsValid() { + return isValid; + } + + public void setIsValid(Integer isValid) { + this.isValid = isValid; + } + + public Long getMinChargeOnce() { + return minChargeOnce; + } + + public void setMinChargeOnce(Long minChargeOnce) { + this.minChargeOnce = minChargeOnce; + } + + public Long getMaxChargeOnce() { + return maxChargeOnce; + } + + public void setMaxChargeOnce(Long maxChargeOnce) { + this.maxChargeOnce = maxChargeOnce; + } + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/TopUpBean.java b/app/src/main/java/com/dskj/rbchat/model/TopUpBean.java new file mode 100644 index 0000000..10fbc3c --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/TopUpBean.java @@ -0,0 +1,69 @@ +package com.dskj.rbchat.model; + + +public class TopUpBean { + + private Long oauthChargeId; + private Integer status; + private Integer oauthAppId; + private Integer userId; + private Integer amount; + private String oauthAppChargeId; + private String createTime; + + public Long getOauthChargeId() { + return oauthChargeId; + } + + public void setOauthChargeId(Long oauthChargeId) { + this.oauthChargeId = oauthChargeId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getOauthAppId() { + return oauthAppId; + } + + public void setOauthAppId(Integer oauthAppId) { + this.oauthAppId = oauthAppId; + } + + public Integer getUserId() { + return userId; + } + + public void setUserId(Integer userId) { + this.userId = userId; + } + + public Integer getAmount() { + return amount; + } + + public void setAmount(Integer amount) { + this.amount = amount; + } + + public String getOauthAppChargeId() { + return oauthAppChargeId; + } + + public void setOauthAppChargeId(String oauthAppChargeId) { + this.oauthAppChargeId = oauthAppChargeId; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/TrcGroupBean.java b/app/src/main/java/com/dskj/rbchat/model/TrcGroupBean.java new file mode 100644 index 0000000..0dcba33 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/TrcGroupBean.java @@ -0,0 +1,37 @@ +package com.dskj.rbchat.model; + +public class TrcGroupBean { + private int rtcType; + private int uid; + private String groupId; + + public TrcGroupBean(int rtcType, int uid, String groupId) { + this.rtcType = rtcType; + this.uid = uid; + this.groupId = groupId; + } + + public int getRtcType() { + return rtcType; + } + + public void setRtcType(int rtcType) { + this.rtcType = rtcType; + } + + public int getUid() { + return uid; + } + + public void setUid(int uid) { + this.uid = uid; + } + + public String getGroupId() { + return groupId; + } + + public void setGroupId(String groupId) { + this.groupId = groupId; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/TypeBean.java b/app/src/main/java/com/dskj/rbchat/model/TypeBean.java new file mode 100644 index 0000000..0938c38 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/TypeBean.java @@ -0,0 +1,142 @@ +package com.dskj.rbchat.model; + +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.R; + +import java.util.ArrayList; +import java.util.List; + +public class TypeBean { + private int type; + private String name; + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public TypeBean() { + + } + + public TypeBean(int type, String name) { + this.type = type; + this.name = name; + } + + public static List getList(boolean isGold){ + List typeBeans = new ArrayList<>(); + //0 群红包,1 私聊红包,2 转账,3 金币银币互转 + //0 群红包,1 私聊红包,2 转账,3 金币银币互转,4 充值,5 提现,6 直播间礼物,7 线下支付,8 第三方应用充值, + // 9 第三方应用提现,10 娃娃机收付款,11 电子游戏转入转出,12 管理员修改余额,13 牛牛下注冻结,14 牛牛结算,15 牛牛领包费 + typeBeans.add(new TypeBean(-1, IMApplication.getAppContext().getString(R.string.all_billing_txt))); + if(isGold) { + typeBeans.add(new TypeBean(0, IMApplication.getAppContext().getString(R.string.group_redpack_txt))); + typeBeans.add(new TypeBean(1, IMApplication.getAppContext().getString(R.string.redpacket_txt))); + typeBeans.add(new TypeBean(2, IMApplication.getAppContext().getString(R.string.zhuanzhang_txt1))); +// typeBeans.add(new TypeBean(3, IMApplication.getAppContext().getString(R.string.jinyinbihuzhuan_txt))); + typeBeans.add(new TypeBean(4, IMApplication.getAppContext().getString(R.string.topup_txt))); + typeBeans.add(new TypeBean(5, IMApplication.getAppContext().getString(R.string.withdrawal_txt))); + typeBeans.add(new TypeBean(8, IMApplication.getAppContext().getString(R.string.youxichongzhi_txt))); + typeBeans.add(new TypeBean(9, IMApplication.getAppContext().getString(R.string.youxitixian_txt))); + typeBeans.add(new TypeBean(10, IMApplication.getAppContext().getString(R.string.wawajishoufukuan_txt))); + typeBeans.add(new TypeBean(11, IMApplication.getAppContext().getString(R.string.dianziyouxizhuanru_txt))); +// typeBeans.add(new TypeBean(12, IMApplication.getAppContext().getString(R.string.guanliyuanxiugai_txt))); +// typeBeans.add(new TypeBean(13, IMApplication.getAppContext().getString(R.string.niuniuxiazhudongjie_txt))); +// typeBeans.add(new TypeBean(14, IMApplication.getAppContext().getString(R.string.niuniujiesuan_txt))); +// typeBeans.add(new TypeBean(15, IMApplication.getAppContext().getString(R.string.niuniulingbaofei_txt))); + typeBeans.add(new TypeBean(16, IMApplication.getAppContext().getString(R.string.erweimashoufukuan_txt))); + typeBeans.add(new TypeBean(17, IMApplication.getAppContext().getString(R.string.fukuanmafukuan_txt))); + typeBeans.add(new TypeBean(18, IMApplication.getAppContext().getString(R.string.fukuanmashoukuan_txt))); + typeBeans.add(new TypeBean(19, IMApplication.getAppContext().getString(R.string.saomaduibi_txt))); + typeBeans.add(new TypeBean(20, IMApplication.getAppContext().getString(R.string.jinbiduihuanlebi_txt))); + + + }else{ + typeBeans.add(new TypeBean(0, IMApplication.getAppContext().getString(R.string.group_redpack_txt))); + typeBeans.add(new TypeBean(1, IMApplication.getAppContext().getString(R.string.redpacket_txt))); + typeBeans.add(new TypeBean(2, IMApplication.getAppContext().getString(R.string.zhuanzhang_txt1))); +// typeBeans.add(new TypeBean(3, IMApplication.getAppContext().getString(R.string.jinyinbihuzhuan_txt))); +// typeBeans.add(new TypeBean(4, IMApplication.getAppContext().getString(R.string.topup_txt))); +// typeBeans.add(new TypeBean(5, IMApplication.getAppContext().getString(R.string.withdrawal_txt))); +// typeBeans.add(new TypeBean(6, IMApplication.getAppContext().getString(R.string.youxichongzhi_txt))); + typeBeans.add(new TypeBean(8, IMApplication.getAppContext().getString(R.string.wawajishoufukuan_txt))); +// typeBeans.add(new TypeBean(9, IMApplication.getAppContext().getString(R.string.guanliyuanxiugai_txt))); + typeBeans.add(new TypeBean(11, IMApplication.getAppContext().getString(R.string.yinbi_shop_txt))); + + } + return typeBeans; + } + + public static List getList1(boolean isGold){ + List typeBeans = new ArrayList<>(); + typeBeans.add(new TypeBean(-1, IMApplication.getAppContext().getString(R.string.shaixuan_txt))); + if(isGold) { + typeBeans.add(new TypeBean(0, IMApplication.getAppContext().getString(R.string.group_redpack_txt))); + typeBeans.add(new TypeBean(1, IMApplication.getAppContext().getString(R.string.redpacket_txt))); + typeBeans.add(new TypeBean(2, IMApplication.getAppContext().getString(R.string.zhuanzhang_txt1))); +// typeBeans.add(new TypeBean(3, IMApplication.getAppContext().getString(R.string.jinyinbihuzhuan_txt))); + typeBeans.add(new TypeBean(4, IMApplication.getAppContext().getString(R.string.topup_txt))); + typeBeans.add(new TypeBean(5, IMApplication.getAppContext().getString(R.string.withdrawal_txt))); + typeBeans.add(new TypeBean(8, IMApplication.getAppContext().getString(R.string.youxichongzhi_txt))); + typeBeans.add(new TypeBean(9, IMApplication.getAppContext().getString(R.string.youxitixian_txt))); + typeBeans.add(new TypeBean(10, IMApplication.getAppContext().getString(R.string.wawajishoufukuan_txt))); + typeBeans.add(new TypeBean(11, IMApplication.getAppContext().getString(R.string.dianziyouxizhuanru_txt))); +// typeBeans.add(new TypeBean(12, IMApplication.getAppContext().getString(R.string.guanliyuanxiugai_txt))); +// typeBeans.add(new TypeBean(13, IMApplication.getAppContext().getString(R.string.niuniuxiazhudongjie_txt))); +// typeBeans.add(new TypeBean(14, IMApplication.getAppContext().getString(R.string.niuniujiesuan_txt))); +// typeBeans.add(new TypeBean(15, IMApplication.getAppContext().getString(R.string.niuniulingbaofei_txt))); + typeBeans.add(new TypeBean(16, IMApplication.getAppContext().getString(R.string.erweimashoufukuan_txt))); + typeBeans.add(new TypeBean(17, IMApplication.getAppContext().getString(R.string.fukuanmafukuan_txt))); + typeBeans.add(new TypeBean(18, IMApplication.getAppContext().getString(R.string.fukuanmashoukuan_txt))); + typeBeans.add(new TypeBean(19, IMApplication.getAppContext().getString(R.string.saomaduibi_txt))); + typeBeans.add(new TypeBean(20, IMApplication.getAppContext().getString(R.string.jinbiduihuanlebi_txt))); + + }else { + typeBeans.add(new TypeBean(0, IMApplication.getAppContext().getString(R.string.group_redpack_txt))); + typeBeans.add(new TypeBean(1, IMApplication.getAppContext().getString(R.string.redpacket_txt))); + typeBeans.add(new TypeBean(2, IMApplication.getAppContext().getString(R.string.zhuanzhang_txt1))); +// typeBeans.add(new TypeBean(3, IMApplication.getAppContext().getString(R.string.jinyinbihuzhuan_txt))); +// typeBeans.add(new TypeBean(4, IMApplication.getAppContext().getString(R.string.topup_txt))); +// typeBeans.add(new TypeBean(5, IMApplication.getAppContext().getString(R.string.withdrawal_txt))); +// typeBeans.add(new TypeBean(6, IMApplication.getAppContext().getString(R.string.youxichongzhi_txt))); + typeBeans.add(new TypeBean(8, IMApplication.getAppContext().getString(R.string.wawajishoufukuan_txt))); +// typeBeans.add(new TypeBean(9, IMApplication.getAppContext().getString(R.string.guanliyuanxiugai_txt))); + typeBeans.add(new TypeBean(11, IMApplication.getAppContext().getString(R.string.yinbi_shop_txt))); + + } + return typeBeans; + } + + public static String getTypeString(int type,boolean isGold){ + List typeBeans = getList(isGold); + for ( int i = 0;i typeBeans = getList1(isGold); + for ( int i = 0;i> files; + + public Map> getFiles() { + return files; + } + + public void setFiles(Map> files) { + this.files = files; + } + + public String getLastFile() { + return lastFile; + } + + public void setLastFile(String lastFile) { + this.lastFile = lastFile; + } + + + public String getCoverImg() { + return coverImg; + } + + public void setCoverImg(String coverImg) { + this.coverImg = coverImg; + } + + public int getFileCount() { + return fileCount; + } + + public void setFileCount(int fileCount) { + this.fileCount = fileCount; + } + + public UserAlbum getUserAlbum() { + return userAlbum; + } + + public void setUserAlbum(UserAlbum userAlbum) { + this.userAlbum = userAlbum; + } + + public static class UserAlbum implements Serializable { + public int id; + public String userId; + public String name; + public int type; + public String password; + public String createTime; + public int status; + public List files; + public String coverImg; + + public String getCoverImg() { + return coverImg; + } + + public void setCoverImg(String coverImg) { + this.coverImg = coverImg; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + + public List getFiles() { + return files; + } + + public void setFiles(List files) { + this.files = files; + } + } + + +} diff --git a/app/src/main/java/com/dskj/rbchat/model/UserRankBean.java b/app/src/main/java/com/dskj/rbchat/model/UserRankBean.java new file mode 100644 index 0000000..0def6bf --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/UserRankBean.java @@ -0,0 +1,23 @@ +package com.dskj.rbchat.model; + +public class UserRankBean { + + public int total; + public int current; + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public int getCurrent() { + return current; + } + + public void setCurrent(int current) { + this.current = current; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/UserShareBean.java b/app/src/main/java/com/dskj/rbchat/model/UserShareBean.java new file mode 100644 index 0000000..9889172 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/UserShareBean.java @@ -0,0 +1,33 @@ +package com.dskj.rbchat.model; + +import com.netease.nimlib.sdk.team.model.Team; +import com.netease.yunxin.kit.corekit.im.model.FriendInfo; + +public class UserShareBean { + public FriendInfo friendInfo; + public Team teamInfo; + + public UserShareBean(FriendInfo friendInfo) { + this.friendInfo = friendInfo; + } + + public UserShareBean(Team teamInfo) { + this.teamInfo = teamInfo; + } + + public FriendInfo getFriendInfo() { + return friendInfo; + } + + public void setFriendInfo(FriendInfo friendInfo) { + this.friendInfo = friendInfo; + } + + public Team getTeamInfo() { + return teamInfo; + } + + public void setTeamInfo(Team teamInfo) { + this.teamInfo = teamInfo; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/UserUpdateEvent.java b/app/src/main/java/com/dskj/rbchat/model/UserUpdateEvent.java new file mode 100644 index 0000000..856b89a --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/UserUpdateEvent.java @@ -0,0 +1,27 @@ +package com.dskj.rbchat.model; + +import androidx.annotation.NonNull; + +import com.netease.yunxin.kit.corekit.event.BaseEvent; + +public class UserUpdateEvent extends BaseEvent { + + public static final String EVENT_TYPE = "UserUpdateEvent"; + public String userId; + + + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + @NonNull + @Override + public String getType() { + return EVENT_TYPE; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/dskj/rbchat/model/UsersExistBean.java b/app/src/main/java/com/dskj/rbchat/model/UsersExistBean.java new file mode 100644 index 0000000..ea379a6 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/UsersExistBean.java @@ -0,0 +1,51 @@ +package com.dskj.rbchat.model; + + +public class UsersExistBean { + + private Integer userId; + private String nickname; + private String remark; + private String avatar; + private Integer addFriendNeedVerify; + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public Integer getAddFriendNeedVerify() { + return addFriendNeedVerify; + } + + public void setAddFriendNeedVerify(Integer addFriendNeedVerify) { + this.addFriendNeedVerify = addFriendNeedVerify; + } + + public Integer getUserId() { + return userId; + } + + public void setUserId(Integer userId) { + this.userId = userId; + } + + 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; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/VersionBean.java b/app/src/main/java/com/dskj/rbchat/model/VersionBean.java new file mode 100644 index 0000000..5ba0af1 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/VersionBean.java @@ -0,0 +1,132 @@ +package com.dskj.rbchat.model; + + +public class VersionBean { + + private Integer versionId; + private Integer versionNumber; + private String versionName; + private Integer deviceType; + private String versionDescription; + private Integer forceDownload; + private String createTime; + private String downloadAddress; + private String upgradeHintZhCn; + private String upgradeHintZhTw; + private String upgradeHintJaJp; + private String upgradeHintEnUs; + private Integer gameOpen; + private Integer isList; + + public Integer getVersionId() { + return versionId; + } + + public void setVersionId(Integer versionId) { + this.versionId = versionId; + } + + public Integer getVersionNumber() { + return versionNumber; + } + + public void setVersionNumber(Integer versionNumber) { + this.versionNumber = versionNumber; + } + + public String getVersionName() { + return versionName; + } + + public void setVersionName(String versionName) { + this.versionName = versionName; + } + + public Integer getDeviceType() { + return deviceType; + } + + public void setDeviceType(Integer deviceType) { + this.deviceType = deviceType; + } + + public String getVersionDescription() { + return versionDescription; + } + + public void setVersionDescription(String versionDescription) { + this.versionDescription = versionDescription; + } + + public String getDownloadAddress() { + return downloadAddress; + } + + public void setDownloadAddress(String downloadAddress) { + this.downloadAddress = downloadAddress; + } + + public String getUpgradeHintZhCn() { + return upgradeHintZhCn; + } + + public void setUpgradeHintZhCn(String upgradeHintZhCn) { + this.upgradeHintZhCn = upgradeHintZhCn; + } + + public String getUpgradeHintZhTw() { + return upgradeHintZhTw; + } + + public void setUpgradeHintZhTw(String upgradeHintZhTw) { + this.upgradeHintZhTw = upgradeHintZhTw; + } + + public String getUpgradeHintJaJp() { + return upgradeHintJaJp; + } + + public void setUpgradeHintJaJp(String upgradeHintJaJp) { + this.upgradeHintJaJp = upgradeHintJaJp; + } + + public String getUpgradeHintEnUs() { + return upgradeHintEnUs; + } + + public void setUpgradeHintEnUs(String upgradeHintEnUs) { + this.upgradeHintEnUs = upgradeHintEnUs; + } + + public Integer getGameOpen() { + return gameOpen; + } + + public void setGameOpen(Integer gameOpen) { + this.gameOpen = gameOpen; + } + + public Integer getIsList() { + return isList; + } + + public void setIsList(Integer isList) { + this.isList = isList; + } + + public Integer getForceDownload() { + return forceDownload; + } + + public void setForceDownload(Integer forceDownload) { + this.forceDownload = forceDownload; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/WalletBean.java b/app/src/main/java/com/dskj/rbchat/model/WalletBean.java new file mode 100644 index 0000000..6d41920 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/WalletBean.java @@ -0,0 +1,51 @@ +package com.dskj.rbchat.model; + + +public class WalletBean { + + private int id; + private int userId; + private long goldCoin; + private long silverCoin; + private long giftCoin; + + public long getGiftCoin() { + return giftCoin; + } + + public void setGiftCoin(long giftCoin) { + this.giftCoin = giftCoin; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public int getUserId() { + return userId; + } + + public void setUserId(int userId) { + this.userId = userId; + } + + public long getGoldCoin() { + return goldCoin; + } + + public void setGoldCoin(long goldCoin) { + this.goldCoin = goldCoin; + } + + public long getSilverCoin() { + return silverCoin; + } + + public void setSilverCoin(long silverCoin) { + this.silverCoin = silverCoin; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/WithCashBean.java b/app/src/main/java/com/dskj/rbchat/model/WithCashBean.java new file mode 100644 index 0000000..2300ae5 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/WithCashBean.java @@ -0,0 +1,195 @@ +package com.dskj.rbchat.model; + + +public class WithCashBean { + + private Long id; + private Integer type; + private Integer amount; + private Integer userId; + private Integer actualAmount; + private Integer status; + private Object staffServiceId; + private Object staffServiceRemark; + private Object financeId; + private Object financeRemark; + private String createTime; + private Object auditTime; + private Object remitTime; + private Integer bankCardId; + private String userNickname; + private String userPhone; + private String userAvatar; + private Integer userSex; + private Object staffServiceName; + private Object financeName; + private BankListBean bankCard; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public Integer getAmount() { + return amount; + } + + public void setAmount(Integer amount) { + this.amount = amount; + } + + public Integer getUserId() { + return userId; + } + + public void setUserId(Integer userId) { + this.userId = userId; + } + + public Integer getActualAmount() { + return actualAmount; + } + + public void setActualAmount(Integer actualAmount) { + this.actualAmount = actualAmount; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Object getStaffServiceId() { + return staffServiceId; + } + + public void setStaffServiceId(Object staffServiceId) { + this.staffServiceId = staffServiceId; + } + + public Object getStaffServiceRemark() { + return staffServiceRemark; + } + + public void setStaffServiceRemark(Object staffServiceRemark) { + this.staffServiceRemark = staffServiceRemark; + } + + public Object getFinanceId() { + return financeId; + } + + public void setFinanceId(Object financeId) { + this.financeId = financeId; + } + + public Object getFinanceRemark() { + return financeRemark; + } + + public void setFinanceRemark(Object financeRemark) { + this.financeRemark = financeRemark; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public Object getAuditTime() { + return auditTime; + } + + public void setAuditTime(Object auditTime) { + this.auditTime = auditTime; + } + + public Object getRemitTime() { + return remitTime; + } + + public void setRemitTime(Object remitTime) { + this.remitTime = remitTime; + } + + public Integer getBankCardId() { + return bankCardId; + } + + public void setBankCardId(Integer bankCardId) { + this.bankCardId = bankCardId; + } + + public String getUserNickname() { + return userNickname; + } + + public void setUserNickname(String userNickname) { + this.userNickname = userNickname; + } + + public String getUserPhone() { + return userPhone; + } + + public void setUserPhone(String userPhone) { + this.userPhone = userPhone; + } + + public String getUserAvatar() { + return userAvatar; + } + + public void setUserAvatar(String userAvatar) { + this.userAvatar = userAvatar; + } + + public Integer getUserSex() { + return userSex; + } + + public void setUserSex(Integer userSex) { + this.userSex = userSex; + } + + public Object getStaffServiceName() { + return staffServiceName; + } + + public void setStaffServiceName(Object staffServiceName) { + this.staffServiceName = staffServiceName; + } + + public Object getFinanceName() { + return financeName; + } + + public void setFinanceName(Object financeName) { + this.financeName = financeName; + } + + public BankListBean getBankCard() { + return bankCard; + } + + public void setBankCard(BankListBean bankCard) { + this.bankCard = bankCard; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/WithdrawCashBean.java b/app/src/main/java/com/dskj/rbchat/model/WithdrawCashBean.java new file mode 100644 index 0000000..bdacb75 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/WithdrawCashBean.java @@ -0,0 +1,60 @@ +package com.dskj.rbchat.model; + + +public class WithdrawCashBean { + + private String id; + private Integer type; + private Integer amount; + private Integer userId; + private Integer status; + private Integer bankCardId; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public Integer getAmount() { + return amount; + } + + public void setAmount(Integer amount) { + this.amount = amount; + } + + public Integer getUserId() { + return userId; + } + + public void setUserId(Integer userId) { + this.userId = userId; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public Integer getBankCardId() { + return bankCardId; + } + + public void setBankCardId(Integer bankCardId) { + this.bankCardId = bankCardId; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/model/WorldChatBean.java b/app/src/main/java/com/dskj/rbchat/model/WorldChatBean.java new file mode 100644 index 0000000..edac89a --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/model/WorldChatBean.java @@ -0,0 +1,115 @@ +package com.dskj.rbchat.model; + + +public class WorldChatBean { + + private LoginBean srcUser; + + private Integer collectId; + private String srcUid; + private String destUid; + private Integer chatType; + private Integer msgType; + private String msgContent; + private String msgTime; + private Integer onlineCount; + private Long msgTime2; + private String fingerprint; + private String parentFp; + + public LoginBean getSrcUser() { + return srcUser; + } + + public void setSrcUser(LoginBean srcUser) { + this.srcUser = srcUser; + } + + public Integer getCollectId() { + return collectId; + } + + public void setCollectId(Integer collectId) { + this.collectId = collectId; + } + + public String getSrcUid() { + return srcUid; + } + + public void setSrcUid(String srcUid) { + this.srcUid = srcUid; + } + + public String getDestUid() { + return destUid; + } + + public void setDestUid(String destUid) { + this.destUid = destUid; + } + + public Integer getChatType() { + return chatType; + } + + public void setChatType(Integer chatType) { + this.chatType = chatType; + } + + public Integer getMsgType() { + return msgType; + } + + public void setMsgType(Integer msgType) { + this.msgType = msgType; + } + + public String getMsgContent() { + return msgContent; + } + + public void setMsgContent(String msgContent) { + this.msgContent = msgContent; + } + + public String getMsgTime() { + return msgTime; + } + + public void setMsgTime(String msgTime) { + this.msgTime = msgTime; + } + + public Integer getOnlineCount() { + return onlineCount; + } + + public void setOnlineCount(Integer onlineCount) { + this.onlineCount = onlineCount; + } + + public Long getMsgTime2() { + return msgTime2; + } + + public void setMsgTime2(Long msgTime2) { + this.msgTime2 = msgTime2; + } + + public String getFingerprint() { + return fingerprint; + } + + public void setFingerprint(String fingerprint) { + this.fingerprint = fingerprint; + } + + public String getParentFp() { + return parentFp; + } + + public void setParentFp(String parentFp) { + this.parentFp = parentFp; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/network/Api.java b/app/src/main/java/com/dskj/rbchat/network/Api.java new file mode 100644 index 0000000..6051db9 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/network/Api.java @@ -0,0 +1,74 @@ +package com.dskj.rbchat.network; + + +import com.dskj.rbchat.utils.LogUtils; + +import java.net.Proxy; +import java.util.concurrent.TimeUnit; + +import okhttp3.OkHttpClient; +import okhttp3.logging.HttpLoggingInterceptor; + +/** + * 项目名: TODO-MVVM + * 包名 com.azhon.mvvm.api + * 文件名: Api + * 创建时间: 2019-03-27 on 14:56 + * 描述: TODO 使用Retrofit基础服务 + * + * @author + */ + +public class Api extends BaseApi { + + private static final long CONNECT_TIMEOUT = 10; + private static final long READ_TIMEOUT = 10; + private static final long WRITE_TIMEOUT = 10; + + /** + * 静态内部类单例 + */ + private static class ApiHolder { + private static Api api = new Api(); + private final static ApiService apiService = api.initRetrofit(ApiService.URL) + .create(ApiService.class); + + } + + public static ApiService getInstance() { + return ApiHolder.apiService; + } + + + /** + * 做自己需要的操作 + */ + @Override + protected OkHttpClient setClient() { + OkHttpClient.Builder builder; + builder = new OkHttpClient() + .newBuilder(); + //禁止使用代理抓取数据 +// builder.proxy(Proxy.NO_PROXY); + //设置超时 + builder.connectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS); + builder.readTimeout(READ_TIMEOUT, TimeUnit.SECONDS); + builder.writeTimeout(WRITE_TIMEOUT, TimeUnit.SECONDS); + //错误重连 + builder.retryOnConnectionFailure(true); + builder.addInterceptor(new HeaderInterceptor()); + +// if (Config.IS_DEBUG) { + HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(message -> { + String text = message; + LogUtils.i("OKHttp111111-----", text); + + }); + interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); + builder.addInterceptor(interceptor); +// } + return builder.build(); + + } + +} diff --git a/app/src/main/java/com/dskj/rbchat/network/ApiService.java b/app/src/main/java/com/dskj/rbchat/network/ApiService.java new file mode 100644 index 0000000..ce663f6 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/network/ApiService.java @@ -0,0 +1,1004 @@ +package com.dskj.rbchat.network; + + +import com.blankj.utilcode.util.LogUtils; +import com.dskj.rbchat.model.ActivityMsgBean; +import com.dskj.rbchat.model.AdBean; +import com.dskj.rbchat.model.AfterCountBean; +import com.dskj.rbchat.model.AiConvertBean; +import com.dskj.rbchat.model.AlbumBean; +import com.dskj.rbchat.model.AuthorizeBean; +import com.dskj.rbchat.model.AvaterBean; +import com.dskj.rbchat.model.BankBean; +import com.dskj.rbchat.model.BankListBean; +import com.dskj.rbchat.model.BillBean; +import com.dskj.rbchat.model.BindBean; +import com.dskj.rbchat.model.ChargingBean; +import com.dskj.rbchat.model.ConfigBean; +import com.dskj.rbchat.model.CreditsConfBean; +import com.dskj.rbchat.model.ExchangeConfBean; +import com.dskj.rbchat.model.ForBiddenInfoBean; +import com.dskj.rbchat.model.FukuanResultBean; +import com.dskj.rbchat.model.GameBean; +import com.dskj.rbchat.model.GroupActionBean; +import com.dskj.rbchat.model.GroupBeanResult; +import com.dskj.rbchat.model.InviteDetailsBean; +import com.dskj.rbchat.model.LinkBean; +import com.dskj.rbchat.model.ListBeanResult; +import com.dskj.rbchat.model.LoginBean; +import com.dskj.rbchat.model.LoginBeanJiaXu; +import com.dskj.rbchat.model.MessageBean; +import com.dskj.rbchat.model.NearbySearchBean; +import com.dskj.rbchat.model.NewsBean; +import com.dskj.rbchat.model.NotifyCountBean; +import com.dskj.rbchat.model.PassWordLoginBean; +import com.dskj.rbchat.model.PayInfoBean; +import com.dskj.rbchat.model.QuesListBean; +import com.dskj.rbchat.model.ReadMessageBean; +import com.dskj.rbchat.model.RegisteredBean; +import com.dskj.rbchat.model.RtcTokenBean; +import com.dskj.rbchat.model.RtcTokenResBean; +import com.dskj.rbchat.model.SendOrderBean; +import com.dskj.rbchat.model.SetUpdatesBean; +import com.dskj.rbchat.model.StaffServiceIdBean; +import com.dskj.rbchat.model.StatisticsBean; +import com.dskj.rbchat.model.StsCredentialsBean; +import com.dskj.rbchat.model.TaskBean; +import com.dskj.rbchat.model.TopBean; +import com.dskj.rbchat.model.TopOrderBean; +import com.dskj.rbchat.model.TopUpBean; +import com.dskj.rbchat.model.TrcGroupBean; +import com.dskj.rbchat.model.UserAlbumBean; +import com.dskj.rbchat.model.UserRankBean; +import com.dskj.rbchat.model.UsersExistBean; +import com.dskj.rbchat.model.VersionBean; +import com.dskj.rbchat.model.WalletBean; +import com.dskj.rbchat.model.WithCashBean; +import com.dskj.rbchat.model.WorldChatBean; +import com.dskj.rbchat.wxapi.bean.WeiXinInfo; +import com.dskj.rbchat.wxapi.bean.WeiXinToken; +import com.netease.yunxin.kit.chatkit.ui.model.RedpacketBean; +import com.netease.yunxin.kit.chatkit.ui.model.RedpacketGroupBean; +import com.netease.yunxin.kit.chatkit.ui.model.TransferBean; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import io.reactivex.Observable; +import okhttp3.MultipartBody; +import okhttp3.RequestBody; +import retrofit2.http.Body; +import retrofit2.http.DELETE; +import retrofit2.http.Field; +import retrofit2.http.FieldMap; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.GET; +import retrofit2.http.HTTP; +import retrofit2.http.Multipart; +import retrofit2.http.POST; +import retrofit2.http.PUT; +import retrofit2.http.Part; +import retrofit2.http.Path; +import retrofit2.http.Query; +import retrofit2.http.QueryMap; + +/** + * 项目名: + * 包名 com.azhon.mvvm.api + * 文件名: ApiService + * 创建时间: 2019-03-27 on 14:55 + * 描述: + * + * @author + */ + +public interface ApiService { + + + /** + * 测试环境 + */ + String URL = com.netease.yunxin.kit.chatkit.ui.network.ApiService.URL; +// String URL = BuildConfig.HTTPS_BASE_URL; + + + @GET("https://api.weixin.qq.com/sns/oauth2/access_token") + Observable getAccessToken(@Query("appid") String appid, @Query("secret") String secret, + @Query("code") String code, @Query("grant_type") String grant_type); + + @GET("https://api.weixin.qq.com/sns/userinfo") + Observable getAccessUserInfo(@Query("access_token") String access_token, @Query("openid") String openid); + + + /** + * 获取游戏列表 + */ + @GET("/game/games") + Observable>> games(@Query("substationId") String substationId); + + + /** + * 手机号登录 + */ + @POST("/auth/passwordLogin") + Observable> passwordLogin(@Body PassWordLoginBean requestBody); + + /** + * 验证码登录 + */ + @POST("/auth/smsLogin") + Observable> smsLogin(@Body Map requestBody); + + /** + * 判定手机号是否已经注册过 + */ + @POST("/auth/phone/registered") + Observable> registered(@Body Map requestBody); + + + /** + * 发送登录验证码 + */ + @POST("/auth/sendSmsForLogin") + Observable> sendSmsForLogin(@Body Map requestBody); + + /** + * 发送支付验证码 + */ + @POST("/wallet/sendSmsForSetPayPassword") + Observable> sendSmsForSetPayPassword(@Body Map requestBody); + + /** + * 发送修改密码验证码 + */ + @POST("/auth/sendSmsForSetPassword") + Observable> sendSmsForSetPassword(@Body Map requestBody); + + + /** + * 发送修改绑定手机号验证码 + */ + @POST("/auth/sendSmsForChangeBindPhone") + Observable> sendSmsForChangeBindPhone(@Body Map requestBody); + + /** + * 发送绑定手机号验证码 + */ + @POST("/auth/sendSmsForBindPhone") + Observable> sendSmsForBindPhone(@Body Map requestBody); + + + /** + * 微信登录 + */ + @POST("/auth/wechatLogin") + Observable> wechatLogin(@Body WeiXinInfo requestBody); + + /** + * 修改密码 + */ + @POST("/auth/smsSetPassword") + Observable> smsSetPassword(@Body Map requestBody); + + /** + * 修改支付密码 + */ + @POST("/wallet/setPayPasswordByVerifyCode") + Observable> setPayPasswordByVerifyCode(@Body Map requestBody); + + /** + * 发送手机号注册验证码 + */ + @POST("/auth/sendSmsForRegister") + Observable> sendSmsForRegister(@Body Map requestBody); + + /** + * 手机号验证码注册 + */ + @POST("/auth/phoneRegister") + Observable> phoneRegister(@Body Map requestBody); + + /** + * 绑定手机号 + */ + @POST("/auth/bindPhone") + Observable bindPhone(@Body Map requestBody); + + + /** + * 使用验证码改绑手机号 + */ + @POST("/auth/smsChangeBindPhone") + Observable smsChangeBindPhone(@Body Map requestBody); + + /** + * 使用密码改绑手机号 + */ + @POST("/auth/passwordChangeBindPhone") + Observable passwordChangeBindPhone(@Body Map requestBody); + + /** + * 用户信息 + */ + @GET("/auth/user/{userId}") + Observable> userInfo(@Path("userId") String userId); + + /** + * 发起点对点会话 + */ + @POST("/rtc/rtcToken/private") + Observable> rtcTokenPrivate(@Body RtcTokenBean requestBody); + + /** + * 发起群会话 + */ + @POST("/rtc/publish/group") + Observable rtcTokenGroup(@Body TrcGroupBean requestBody); + + @POST("/rtc/rtcToken/group/publisher") + Observable publisher(@Body Map requestBody); + + /** + * 获取会话详情 + */ + @GET("/rtc/private/{recordId}") + Observable> recordId(@Path("recordId") String recordId); + + /** + * 获取用户钱包详情 + */ + @GET("/wallet/{userId}") + Observable> walletInfo(@Path("userId") String userId); + + /** + * 获取用户绑定详情 + */ + @GET("/auth/user/bind/{userId}") + Observable> bindInfo(@Path("userId") String userId); + + /** + * 绑定微信 + */ + @POST("/auth/bindWechat") + Observable bindWechat(@Body WeiXinInfo requestBody); + + /** + * 绑定微信 + */ + @POST("/wallet/convertCoin") + Observable convertCoin(@Body Map requestBody); + + /** + * 获取用户所有金币明细 + */ + @GET("/wallet/goldDetails/{userId}") + Observable>> goldDetails(@Path("userId") String userId, @QueryMap Map requestBody); + + /** + * 获取用户所有金币明细 + */ + @GET("/wallet/giftDetails/{userId}") + Observable>> giftDetails(@Path("userId") String userId, @QueryMap Map requestBody); + + + /** + * 获取用户所有银币明细 + */ + @GET("/wallet/silverDetails/{userId}") + Observable>> silverDetails(@Path("userId") String userId, @QueryMap Map requestBody); + + + /** + * 获取用户收入支出统计数据 + */ + @GET("/wallet/statistics/{userId}") + Observable> statistics(@Path("userId") String userId, @QueryMap Map requestBody); + + /** + * 获取银行列表 + */ + @GET("/wallet/banks") + Observable>> banks(); + + /** + * 获取银行列表 + */ + @GET("/wallet/bankCards/{userId}") + Observable>> bankCards(@Path("userId") String userId); + + + /** + * 绑定银行卡 + */ + @POST("/wallet/bankCard") + Observable bankCard(@Body Map requestBody); + + + /** + * 解绑银行卡 + */ +// @DELETE("/wallet/bankCard/{userId}/{cardId}") + @HTTP(method = "DELETE", path = "/wallet/bankCard/{userId}/{cardId}", hasBody = true) + Observable deleteCard(@Path("userId") String userId, @Path("cardId") String cardId, @Body Map requestBody); + + + /** + * 发红包 + */ + @POST("/redEnvelope/private/send") + Observable> sendRedpacket(@Body Map requestBody); + + /** + * 发群红包 + */ + @POST("/redEnvelope/group/send") + Observable> sendGroupRedpacket(@Body Map requestBody); + + /** + * 发送礼金红包 + * + * @param requestBody + * @return + */ + @POST("/redEnvelope/gift/send") + Observable> sendGiftRedpacket(@Body Map requestBody); + + /** + * 抢群红包 + */ + @POST("/redEnvelope/group/grab") + Observable> recGroupRedpacket(@Body Map requestBody); + + /** + * 收红包 + */ + @POST("/redEnvelope/private/receive") + Observable> receiveRedpacket(@Body Map requestBody); + + /** + * 红包详情 + */ + @GET("/redEnvelope/private/{recordId}") + Observable> redPacketInfo(@Path("recordId") String userId); + + /** + * 群聊红包详情 + */ + @GET("/redEnvelope/group/{recordId}") + Observable> redGroupPacketInfo(@Path("recordId") String userId); + + /** + * 礼金红包详情 + */ + @GET("/redEnvelope/gift/{recordId}") + Observable> redGroupGiftPacketInfo(@Path("recordId") String userId); + + /** + * 发起转账 + */ + @POST("/wallet/transferMoney/initiate") + Observable> transferMoney(@Body Map requestBody); + + @POST("/biz/transferCash") + Observable transferCashPay(@Body Map requestBody); + + /** + * 接收转账 + */ + @POST("/wallet/transferMoney/receive") + Observable> receiveTransferMoney(@Body Map requestBody); + + /** + * 转账详情 + */ + @GET("/wallet/transferMoney/{recordId}") + Observable> receiveTransferMoney(@Path("recordId") String recordId); + + /** + * 退回转账 + */ + @POST("/wallet/transferMoney/return") + Observable> transferMoneyReturn(@Body Map requestBody); + + + /** + * 刷新token + */ + @POST("/auth/refreshToken") + Observable> refreshToken(@Body Map requestBody); + + + /** + * 刷新token + */ + @POST("/wallet/checkPayPassword") + Observable> checkPayPassword(@Body Map requestBody); + + /** + * 获取银行卡渠道 + */ + @GET("/charge/bankCard/channels") + Observable>> channels(); + + /** + * 获取在线充值客服ID + */ + @GET("/charge/staffServiceId") + Observable> staffServiceId(); + + + /** + * 用户取消银行卡充值 + */ + @POST("/charge/bankCard/cancel") + Observable> chargeCancel(@Body Map requestBody); + + + /** + * 用户完成银行卡充值 + */ + @POST("/charge/bankCard/charged") + Observable chargeCharged(@Body Map requestBody); + + /** + * 发起银行卡充值 + */ + @POST("/charge/bankCard/initiate") + Observable> chargeInitiate(@Body Map requestBody); + + + /** + * 查看用户现在是否有正在进行的充值订单 + */ + @GET("/charge/charging") + Observable> charging(); + + /** + * 发起银行卡提现 + */ + @POST("/withdrawCash/bankCard/initiate") + Observable> withdrawCash(@Body Map requestBody); + + @Multipart + @POST("/charge/bankCard/charged") + Observable> bankCardCharged(@Part MultipartBody.Part id, @Part MultipartBody.Part serialNumber, @Part MultipartBody.Part part); + + @Multipart + @POST("/charge/bankCard/charged") + Observable> bankCardChargedSingeOne(@Part MultipartBody.Part id, @Part MultipartBody.Part serialNumber); + + + /** + * 查看用户现在是否有正在进行的充值订单 + */ + @GET("/charge/{recordId}") + Observable> chargRecordInfo(@Path("recordId") String recordId); + + + /** + * 帮助浏览量 + */ + @PUT("/helpCenter/question/{questionId}/viewTime") + Observable viewTime(@Path("questionId") String questionId); + + + /** + * 帮助浏览量 + */ + @PUT("/auth/firebaseToken") + Observable firebaseToken(@Body Map requestBody); + + /** + * 公告浏览量 + */ + @PUT("/announcement/{announcementId}/viewTime") + Observable announcementIdViewTime(@Path("announcementId") String announcementId); + + + /** + * 获取在线客服ID + */ + @GET("/helpCenter/staffServiceId") + Observable> helpCenterStaffServiceId(@Query("substationId") String substationId, @Query("staffServiceType") int type); + + /** + * 获取在线客服列表 + */ + @GET("/helpCenter/staffServiceIds") + Observable>> helpCenterStaffsServiceId(@Query("substationId") String substationId); + + + /** + * 获取在线充值客服ID + */ + @GET("/helpCenter/questionCategories/questions") + Observable>> questions(); + + +// +// /**查看某条公告创建时间之后还有多少条公告*/ +// @GET("/announcement/afterCount") +// Observable> afterCount(@Query("announcementId") String announcementId); + + /** + * 查看某条公告创建时间之后还有多少条公告 + */ + @GET("/announcement/afterCount") + Observable> afterCount(@QueryMap Map maps); + +// /**查看某条公告创建时间之后还有多少条公告*/ +// @GET("/announcement/afterCount") +// Observable> afterCount(); + + /** + * 新闻列表 + */ + @GET("/announcement/announcements") + Observable>> announcements(@Query("page") int page, @Query("size") int size); + + /** + * 新闻列表 + */ + @GET("/version/latest") + Observable>> version(@Query("deviceType") int page, @Query("versionNumberGe") int versionNumberGe, @Query("substationId") String substationId); + + + /** + * 修改用户信息 + */ + @PUT("/auth/user/{userId}") + Observable authUser(@Path("userId") String userId, @Body Map requestBody); + + + /** + * 好友列表 + */ + @GET("/auth/user/search") + Observable>> userSearch(@QueryMap Map requestBody); + + /** + * 好友列表 + */ + @GET("/auth/group/{groupId}") + Observable> authGroup(@Path("groupId") String groupId); + + /** + * 加入退出群聊 + */ + @POST("/worldChat/group/operate") + Observable> operate(@Body Map requestBody); + + + /** + * 修改用户信息 + */ + @PUT("/auth/group/{groupId}") + Observable authGroupPut(@Path("groupId") String groupId, @Body Map requestBody); + + /** + * 举报的 + */ + @Multipart + @POST("/report/report") + Observable report(@Part() List parts); + + + /** + * 好友列表 + */ + @GET("/offlineMessage/{toUserId}") + Observable offlineMessage(@Path("toUserId") String toUserId); + + + /** + * 发起银行卡提现 + */ + @POST("/auth/preCheckVerifyCode") + Observable> preCheckVerifyCode(@Body Map requestBody); + + + /**获取群成员列表 role 群聊身份,0 群员,1 群主,2 管理员*/ +// @GET("/group/members/{groupId}") +// Observable>> groupMembers(@Path("groupId") String groupId); + + + /** + * 设置群员角色 + */ + @PUT("/group/{groupId}/roles") + Observable> groupRolePut(@Path("groupId") String groupId, @Body SetUpdatesBean requestBody); + + + /** + * 消息已读 + */ + @POST("/message/readMessages") + Observable readMessages(@Body ReadMessageBean requestBody); + + + /** + * 消息已读 + */ + @POST("/oauth/auth/authorize") + Observable> authorizeLogin(@Body Map requestBody); + + + /** + * 设置群员角色 + */ + @PUT("/group/{groupId}/forbidAddFriendInGroup") + Observable> forbidAddFriendInGroup(@Path("groupId") String groupId, @Body Map requestBody); + + /** + * 设置群员角色 + */ + @PUT("/oauth/charge/initiate") + Observable oauthChargeInitiate(@Body Map requestBody); + + + /** + * 绑定上级邀请码 + */ + @POST("/auth/bindInvitedBy") + Observable bindInvitedBy(@Body Map requestBody); + + + /** + * 完成第三方充值 + */ + @POST("/charge/oauth/complete") + Observable> chargeComplete(@Body Map requestBody); + + + /** + * 举报的 + */ + @Multipart + @POST("/post/post") + Observable CirPost(@Part() List parts); + + + @Multipart + @POST("/auth/uploadUserAvatar") + Observable> uploadUserAvatar(@Part MultipartBody.Part serialNumber); + + + /** + * 消息已读 + */ + @GET("/post/posts") + Observable>> posts(@QueryMap Map requestBody); + + + /** + * 我的朋友圈列表 + */ + @GET("/post/posts/{userId}") + Observable>> posts(@Path("userId") String userId, @QueryMap Map requestBody); + + + /** + * 创建动态评论 + */ + @POST("/post/postComment") + Observable postComment(@Body Map requestBody); + + /** + * 删除动态评论 + */ + @HTTP(method = "DELETE", path = "/post/postComment/{commentId}", hasBody = true) + Observable postCommentDelete(@Path("commentId") String commentId); + + /** + * 创建动态点赞 + */ + @POST("/post/postLike") + Observable postLike(@Body Map requestBody); + + /** + * 删除动态点赞 + */ + @HTTP(method = "DELETE", path = "/post/postLike/{postId}", hasBody = true) + Observable postLikeDelete(@Path("postId") String postId); + + + /** + * 查询详情 + */ + @GET("/post/{postId}") + Observable> postsInfo(@Path("postId") String postId); + + /** + * 修改动态 + */ + @PUT("/post/{postId}") + Observable changePost(@Path("postId") String postId, @Body Map requestBody); + + /** + * 删除动态 + */ + @HTTP(method = "DELETE", path = "/post/{postId}", hasBody = true) + Observable postDelete(@Path("postId") String postId); + + + @Multipart + @POST("/auth/user/{userId}/postHomepageBackground") + Observable postHomepageBackground(@Path("userId") String userId, @Part MultipartBody.Part file); + + @GET("/group/relatedGroups") + Observable> relatedGroups(); + + @GET("/auth/{userId}/inviteDetails") + Observable>> inviteDetails(@Path("userId") String userId, @Query("page") int page, @Query("size") int size); + + @GET("/auth/{userId}/dailyTasks") + Observable>> dailyTasks(@Path("userId") String userId); + + + @GET("/auth/creditsConf") + Observable> creditsConf(); + + @POST("/auth/dailyTask/receiveCredits") + Observable receiveCredits(@Body Map requestBody); + + @POST("/group/ephemeralGroup") + Observable> ephemeralGroup(); + + @POST("/group/groupCode") + Observable groupCode(@Body Map requestBody); + + @GET("/group/detailByGroupCode/{groupCode}") + Observable> detailByGroupCode(@Path("groupCode") String groupCode); + + + @POST("/group/joinGroupByGroupCode") + Observable joinGroupByGroupCode(@Body Map requestBody); + + + @POST("http://192.168.110.233:8001/oauth/auth/oauthChat/ephemeralLogin") + Observable> ephemeralLogin(@Body Map requestBody); + + + /** + * 是否开启免打扰 + */ + @PUT("/group/{groupId}/member") + Observable groupMember(@Path("groupId") String groupId, @Body Map requestBody); + + /** + * 是否开启免打扰个人 + */ + @PUT("/auth/friendRoster/{friendId}") + Observable friendRoster(@Path("friendId") String friendId, @Body Map requestBody); + + @GET("/worldChat/messages") + Observable>> worldChatMessages(@Query("page") int page, @Query("size") int size, @Query("groupId") String groupId); + + @GET("/worldChat/forbiddenInfo") + Observable> forbiddenInfo(@Query("userId") String userId, @Query("groupId") String groupId); + + @POST("/worldChat/mute") + Observable worldChatMute(@Body Map requestBody); + + @POST("/worldChat/kick") + Observable worldChatKick(@Body Map requestBody); + +// @POST("/group/member") +// Observable> groupMember(@Body Map requestBody); + + @GET("/whiteLink/whiteLinks") + Observable>> whiteLinks(); + + @GET("/file/stsCredentials") + Observable> stsCredentials(); + + +// @POST(Const.TESTTOY_SAVE_USER_MACHINE) +// Observable save_user_machine(@Body Map requestBody); + + @POST("/auth/checkNickname") + Observable> checkNickname(@Body Map requestBody); + + @POST("/charge/device/bind") + Observable> deviceBind(@Body Map requestBody); + + @FormUrlEncoded + @POST("/charge/device/bind") + Observable> deviceBind(@Field("deviceId") String deviceId); + + @POST("/auth/usersExist") + Observable>> usersExist(@Body List contents); + + @FormUrlEncoded + @POST("/auth/follow") + Observable follow(@Field("userId") String userId, @Field("remark") String remark); + + @FormUrlEncoded + @POST("auth/follow/addRemark") + Observable> addRemark(@Field("userId") String userId, @Field("remark") String remark); //修改备注 + + @FormUrlEncoded + @POST("/auth/follow/cancel") + Observable followCancel(@Field("userId") String userId); + +// @POST("/auth/follow/cancel") +// Observable followCancel(@Body Map requestBody); + + @GET("/auth/followList") + Observable>> followList(); + + @GET("/post/{userId}/notifies") + Observable>> notifies(@Path("userId") String userId, @Query("page") int page, @Query("size") int size, @Query("timeLine") String timeLine); + + @GET("/wallet/payOuterCode") + Observable> payOuterCode(); + + @POST("/wallet/payOuterCode/scan") + Observable> payOuterCodeScan(@Body Map requestBody); + + @GET("/wallet/payOuterCode/getPayInfo") + Observable> getPayInfo(); + + + @POST("/wallet/payOuterCode/confirm") + Observable payOuterCodeConfirm(@Body Map requestBody); + + @POST("/wallet/payOuterCode/cancel") + Observable payOuterCodeCancel(@Body Map requestBody); + + @GET("/wallet/payOuterCode/getPayResult/{payId}") + Observable> getPayResult(@Path("payId") String payId); + + + @POST("/wallet/selfHelpATM/pay") + Observable selfHelpATM(@Body Map requestBody); + + @POST("/wallet/danzhu/pay") + Observable danzhuPay(@Body Map requestBody); + + @GET("/adList/") + Observable>> adList(); + + + @GET("https://maps.googleapis.com/maps/api/place/nearbysearch/json") + Observable>> nearbysearch(@Query("location") String location, @Query("radius") String radius, + @Query("type") String type, @Query("sensor") String sensor, + @Query("key") String key); + + @GET("https://maps.googleapis.com/maps/api/place/nearbysearch/json") + Observable>> nearbysearch(@Query("location") String location, @Query("radius") String radius, + @Query("type") String type, @Query("sensor") String sensor, + @Query("key") String key, @Query("keyword") String keyword); + + @GET("https://places.googleapis.com/v1/places/ChIJj61dQgK6j4AR4GeTYWZsKWw") + Observable nearbysearch(@Query("fields") String fields, @Query("key") String key); + + + @GET("https://www.mxnzp.com/api/convert/zh") + Observable> convertzh(@Query("type") int type, @Query("content") String content, + @Query("app_id") String appid, + @Query("app_secret") String appkey); + + + @POST("/auth/qrCodeLogin/{mid}") + Observable qrCodeLogin(@Path("mid") String mid, @Body Map requestBody); + + /** + * 1.6.7 以后的提交订单 + */ + @POST("/payment/sendOrder/V2") + Observable> sendOrderV2(@Body Map requestBody); + + /** + * 1.6.7 以及以前的提交订单 + */ + @POST("/payment/sendOrder") + Observable> sendOrder(@Body Map requestBody); + + @POST("/payment/sendOrder") + Observable>> sendOrderMap(@Body Map requestBody); + + @FormUrlEncoded + @POST("https://payment-stage.funpoint.com.tw/Cashier/AioCheckOut/V5") + Observable Cashier(@FieldMap Map sendOrderBean); + + + @GET("/charge/conf") + Observable> chargeConf(); + + + /** + * 1.6.7 以及以前的提交订单 + */ + @POST("/wallet/gift/cabinet") + Observable cabinet(@Body Map requestBody); + + + /** + * 群成员活跃时间 + */ + @GET("/group/member/activeTime") + Observable>> teamMemberActiveTime(@Query("groupId") String teamId); + + /** + * 获取用户相冊列表 + */ + @GET("/album/user/{userId}") + Observable>> getUserAlbums(@Path("userId") String userId); + + + /** + * 創建相冊 + */ + @POST("/album/") + Observable createAlbums(@Body UserAlbumBean.UserAlbum requestBody); + + /** + * 添加照片 + */ + @POST("/album/files") + Observable addPhotos(@Body Map map); + + @GET("/album/{albumId}") + Observable> getAlbums(@Path("albumId") int id, @QueryMap Map requestBody); + + @DELETE("/album/{albumId}") + Observable> deleteAlbums(@Path("albumId") int id); + + @PUT("/album/{albumId}") + Observable> editAlbums(@Path("albumId") int id, @Body UserAlbumBean.UserAlbum requestBody); + + /** + * 设置相册封面 + */ + @PUT("/album/{albumId}/coverImg") + Observable setAlbumsCover(@Path("albumId") int id, @Body Map requestBody); + + /** + * 删除相册里的照片 + */ + @HTTP(method = "DELETE", path = "/album/files", hasBody = true) + Observable deleteAlbumsPic(@Body Map requestBody); + + + /** + * 移动相片 + */ + @POST("/album/moveFiles") + Observable movePhotos(@Body Map map); + + + @GET("/offlineMessage/{userId}/system") + Observable>> notifiesmessage(@Path("userId") String userId, @Query("page") int page, @Query("size") int size, @Query("timeLine") String timeLine); + + + @GET("/offlineMessage/{userId}/activity") + Observable> activitymessage(@Path("userId") String userId, @Query("page") int page, @Query("size") int size, @Query("timeLine") String timeLine); + + @GET("/offlineMessage/activity/{id}") + Observable> activitymessagedetails(@Path("id") String id); + + +// @GET("offlineMessage/{toUserId}/systemCount") +// Observable notifiesmessageCount(@Path("toUserId") String userId, @Query("timeLine") String timeLine); + + @GET("offlineMessage/{toUserId}/systemCountNew") + Observable> notifiesmessageCountNew(@Path("toUserId") String userId, @Query("timeLine") String timeLine); + + /** + * 获取用户排行 + */ + @GET("/auth/user/rank") + Observable> getUserRank(); + + + /** + * 获取转账开关配置 + */ + @GET("/config/list") + Observable>> getConfig(); + +} + + diff --git a/app/src/main/java/com/dskj/rbchat/network/BaseApi.java b/app/src/main/java/com/dskj/rbchat/network/BaseApi.java new file mode 100644 index 0000000..cc66017 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/network/BaseApi.java @@ -0,0 +1,46 @@ +package com.dskj.rbchat.network; + +import okhttp3.OkHttpClient; +import retrofit2.Retrofit; +import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; +import retrofit2.converter.gson.GsonConverterFactory; +import retrofit2.converter.scalars.ScalarsConverterFactory; + +/** + * 项目名: TODO-MVVM + * 包名 com.azhon.basic.retrofit + * 文件名: BaseApi + * 创建时间: 2019-03-27 on 14:52 + * 描述: TODO 封装基础的Retrofit + * + * @author + */ + +public abstract class BaseApi { + + /** + * 初始化Retrofit + */ + public Retrofit initRetrofit(String baseUrl) { + Retrofit.Builder builder = new Retrofit.Builder(); + //支持返回Call + builder.addConverterFactory(ScalarsConverterFactory.create()); + //支持直接格式化json返回Bean对象 + builder.addConverterFactory(GsonConverterFactory.create()); + //支持RxJava + builder.addCallAdapterFactory(RxJava2CallAdapterFactory.create()); + builder.baseUrl(baseUrl); + OkHttpClient client = setClient(); + if (client != null) { + builder.client(client); + } + return builder.build(); + } + + /** + * 设置OkHttpClient,添加拦截器等 + * + * @return 可以返回为null + */ + protected abstract OkHttpClient setClient(); +} diff --git a/app/src/main/java/com/dskj/rbchat/network/BaseObserver.java b/app/src/main/java/com/dskj/rbchat/network/BaseObserver.java new file mode 100644 index 0000000..2d3ca2e --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/network/BaseObserver.java @@ -0,0 +1,173 @@ +package com.dskj.rbchat.network; + +import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; + +import android.app.Activity; +import android.content.Intent; +import android.os.Handler; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.welcome.WelcomeActivity; +import com.google.gson.JsonParseException; +import com.netease.yunxin.kit.chatkit.ui.common.RxBus; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.corekit.im.IMKitClient; + +import org.json.JSONException; + +import java.io.InterruptedIOException; +import java.net.ConnectException; +import java.net.UnknownHostException; +import java.text.ParseException; +import java.util.List; + +import io.reactivex.observers.DisposableObserver; +import retrofit2.HttpException; + +public abstract class BaseObserver extends DisposableObserver { + /** + * 解析数据失败 + */ + public static final int PARSE_ERROR = 1001; + /** + * 网络问题 + */ + public static final int BAD_NETWORK = 1002; + /** + * 连接错误 + */ + public static final int CONNECT_ERROR = 1003; + /** + * 连接超时 + */ + public static final int CONNECT_TIMEOUT = 1004; + + @Override + public void onNext(T o) { +// try { + if (o instanceof String) { +// LogUtils.i("返回个string就没意思了"); + } + Result model = (Result) o; + +// LogUtils.i("数据:"+ GsonUtils.beanToJSONString(model)); + if (model.code == 1) { + onSuccess(o); + } else { + if (model.code == 403 || model.code == 401) { + //退出登录 弹窗 + IMKitClient.logoutIM( + + new com.netease.yunxin.kit.corekit.im.login.LoginCallback() { + @Override + public void onError(int errorCode, @NonNull String errorMsg) { + + DataUtils.set(IMKitClient.getApplicationContext(), IMUIKitConfig.LOGIN_ACCOUNT, ""); + DataUtils.set(IMKitClient.getApplicationContext(), IMUIKitConfig.LOGIN_TOKEN, ""); + IMApplication.getInstance().removeAllActivity(); + + Intent intent = new Intent(IMKitClient.getApplicationContext(), WelcomeActivity.class); + intent.setFlags(FLAG_ACTIVITY_NEW_TASK); + IMKitClient.getApplicationContext().startActivity(intent); + + if (model.code == 403) { + new Handler().postDelayed(() -> RxBus.getInstance().post(117766), 1000); //5秒 + } + } + + @Override + public void onSuccess(@Nullable Void data) { + + DataUtils.set(IMKitClient.getApplicationContext(), IMUIKitConfig.LOGIN_ACCOUNT, ""); + DataUtils.set(IMKitClient.getApplicationContext(), IMUIKitConfig.LOGIN_TOKEN, ""); + IMApplication.getInstance().removeAllActivity(); + + Intent intent = new Intent(IMKitClient.getApplicationContext(), WelcomeActivity.class); + intent.setFlags(FLAG_ACTIVITY_NEW_TASK); + IMKitClient.getApplicationContext().startActivity(intent); + + if (model.code == 403) { + new Handler().postDelayed(() -> RxBus.getInstance().post(117766), 1000); //5秒 + } + } + }); + } else { + onError(model.code, model.error); + } + } +// } catch (Exception e) { +// e.printStackTrace(); +// onError(407,e.toString()); +// +// } + + } + + @Override + public void onError(Throwable e) { + if (e instanceof HttpException) { + // HTTP错误 + onException(BAD_NETWORK); + } else if (e instanceof ConnectException + || e instanceof UnknownHostException) { + // 连接错误 + onException(CONNECT_ERROR); + } else if (e instanceof InterruptedIOException) { + // 连接超时 + onException(CONNECT_TIMEOUT); + } else if (e instanceof JsonParseException + || e instanceof JSONException + || e instanceof ParseException) { + // 解析错误 + + onException(PARSE_ERROR); + } else { + if (e != null) { + onError(409, e.toString()); + } else { + onError(407, "未知錯誤"); + } + } + + } + + private void onException(int unknownError) { + switch (unknownError) { + case CONNECT_ERROR: + onError(CONNECT_ERROR, "連接錯誤"); + break; + + case CONNECT_TIMEOUT: + onError(CONNECT_TIMEOUT, "連接超時"); + break; + + case BAD_NETWORK: + onError(BAD_NETWORK, "網絡問題"); + break; + + case PARSE_ERROR: + onError(PARSE_ERROR, "宇宙也是有盡頭的"); + + break; + + default: + break; + } + } + + @Override + public void onComplete() { + + } + + public abstract void onSuccess(T o); + + public abstract void onError(int code, String msg); + +} diff --git a/app/src/main/java/com/dskj/rbchat/network/BaseObserver1.java b/app/src/main/java/com/dskj/rbchat/network/BaseObserver1.java new file mode 100644 index 0000000..ecceeda --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/network/BaseObserver1.java @@ -0,0 +1,125 @@ +package com.dskj.rbchat.network; + +import com.google.gson.JsonParseException; + +import org.json.JSONException; + +import java.io.InterruptedIOException; +import java.net.ConnectException; +import java.net.UnknownHostException; +import java.text.ParseException; + +import io.reactivex.observers.DisposableObserver; +import retrofit2.HttpException; + +public abstract class BaseObserver1 extends DisposableObserver { + /** + * 解析数据失败 + */ + public static final int PARSE_ERROR = 1001; + /** + * 网络问题 + */ + public static final int BAD_NETWORK = 1002; + /** + * 连接错误 + */ + public static final int CONNECT_ERROR = 1003; + /** + * 连接超时 + */ + public static final int CONNECT_TIMEOUT = 1004; + + @Override + public void onNext(T o) { +// try { + if(o instanceof String){ +// LogUtils.i("返回个string就没意思了"); + } +// Result model = (Result) o; + onSuccess(o); +// LogUtils.i("数据:"+ GsonUtils.beanToJSONString(model)); +// if (model.code == 1) { +// onSuccess(o); +// } else { +// if(model.code == 403){ + //退出登录 弹窗 +// if(MyApplication.topActivity!=null) { +// MyApplication.topActivity.showDialogFeng(model.error,100); +// }else{ +// ToolKits.exitAndGotoLoginFengHao(MyApplication.getInstance2(), model.error); +// } +// }else{ +// onError(model.code,model.error); +// } +// } +// } catch (Exception e) { +// e.printStackTrace(); +// onError(407,e.toString()); +// +// } + + } + + @Override + public void onError(Throwable e) { + if (e instanceof HttpException) { + // HTTP错误 + onException(BAD_NETWORK); + } else if (e instanceof ConnectException + || e instanceof UnknownHostException) { + // 连接错误 + onException(CONNECT_ERROR); + } else if (e instanceof InterruptedIOException) { + // 连接超时 + onException(CONNECT_TIMEOUT); + } else if (e instanceof JsonParseException + || e instanceof JSONException + || e instanceof ParseException) { + // 解析错误 + + onException(PARSE_ERROR); + } else { + if (e != null) { + onError(409,e.toString()); + } else { + onError(407,"未知錯誤"); + } + } + + } + + private void onException(int unknownError) { + switch (unknownError) { + case CONNECT_ERROR: + onError(CONNECT_ERROR,"連接錯誤"); + break; + + case CONNECT_TIMEOUT: + onError(CONNECT_TIMEOUT,"連接超時"); + break; + + case BAD_NETWORK: + onError(BAD_NETWORK,"網絡問題"); + break; + + case PARSE_ERROR: + onError(PARSE_ERROR,"宇宙也是有盡頭的"); + + break; + + default: + break; + } + } + + @Override + public void onComplete() { + + } + + public abstract void onSuccess(T o); + + public abstract void onError(int code,String msg); + +} diff --git a/app/src/main/java/com/dskj/rbchat/network/BaseObserverNew.java b/app/src/main/java/com/dskj/rbchat/network/BaseObserverNew.java new file mode 100644 index 0000000..6a1794e --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/network/BaseObserverNew.java @@ -0,0 +1,127 @@ +package com.dskj.rbchat.network; + +import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; + +import android.content.Intent; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.welcome.WelcomeActivity; +import com.google.gson.JsonParseException; +import com.netease.yunxin.kit.corekit.im.IMKitClient; + +import org.json.JSONException; + +import java.io.InterruptedIOException; +import java.net.ConnectException; +import java.net.UnknownHostException; +import java.text.ParseException; + +import io.reactivex.observers.DisposableObserver; +import retrofit2.HttpException; + +public abstract class BaseObserverNew extends DisposableObserver { + /** + * 解析数据失败 + */ + public static final int PARSE_ERROR = 1001; + /** + * 网络问题 + */ + public static final int BAD_NETWORK = 1002; + /** + * 连接错误 + */ + public static final int CONNECT_ERROR = 1003; + /** + * 连接超时 + */ + public static final int CONNECT_TIMEOUT = 1004; + + @Override + public void onNext(T o) { +// try { + if(o instanceof String){ +// LogUtils.i("返回个string就没意思了"); + } + ResultNew model = (ResultNew) o; + +// LogUtils.i("数据:"+ GsonUtils.beanToJSONString(model)); + if (model.isSuccessful()) { + onSuccess(o); + } else { + onError(100,"获取数据失败"); + } +// } catch (Exception e) { +// e.printStackTrace(); +// onError(407,e.toString()); +// +// } + + } + + @Override + public void onError(Throwable e) { + if (e instanceof HttpException) { + // HTTP错误 + onException(BAD_NETWORK); + } else if (e instanceof ConnectException + || e instanceof UnknownHostException) { + // 连接错误 + onException(CONNECT_ERROR); + } else if (e instanceof InterruptedIOException) { + // 连接超时 + onException(CONNECT_TIMEOUT); + } else if (e instanceof JsonParseException + || e instanceof JSONException + || e instanceof ParseException) { + // 解析错误 + + onException(PARSE_ERROR); + } else { + if (e != null) { + onError(409,e.toString()); + } else { + onError(407,"未知錯誤"); + } + } + + } + + private void onException(int unknownError) { + switch (unknownError) { + case CONNECT_ERROR: + onError(CONNECT_ERROR,"連接錯誤"); + break; + + case CONNECT_TIMEOUT: + onError(CONNECT_TIMEOUT,"連接超時"); + break; + + case BAD_NETWORK: + onError(BAD_NETWORK,"網絡問題"); + break; + + case PARSE_ERROR: + onError(PARSE_ERROR,"宇宙也是有盡頭的"); + + break; + + default: + break; + } + } + + @Override + public void onComplete() { + + } + + public abstract void onSuccess(T o); + + public abstract void onError(int code,String msg); + +} diff --git a/app/src/main/java/com/dskj/rbchat/network/HeaderInterceptor.java b/app/src/main/java/com/dskj/rbchat/network/HeaderInterceptor.java new file mode 100644 index 0000000..72f624e --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/network/HeaderInterceptor.java @@ -0,0 +1,47 @@ +package com.dskj.rbchat.network; + +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.utils.DataUtils; + +import java.io.IOException; + +import okhttp3.Interceptor; +import okhttp3.Request; +import okhttp3.Response; + +/** + * created by wmm on 2020/9/8 + */ +public class HeaderInterceptor implements Interceptor { + public HeaderInterceptor() { + } + + @Override + public Response intercept(Chain chain) throws IOException { + int loc = DataUtils.get(IMApplication.getAppContext(),"locale",1); + String lauguage = "zh-CN"; + switch (loc){ + case 1: + lauguage = "zh-CN"; + break; + case 2: + lauguage = "en-US"; + break; + case 3: + lauguage = "ja-JP"; + break; + default: + lauguage = "zh-TW"; + break; + } + //封装headers + Request request = chain.request().newBuilder() + .addHeader("Authorization", DataUtils.getToken()) + .addHeader("Accept-Language",lauguage) +// .addHeader("Channel", channel) + .build(); + +// LogUtils.i("头文件:"+MyApplication.getToken()); + return chain.proceed(request); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/dskj/rbchat/network/Result.java b/app/src/main/java/com/dskj/rbchat/network/Result.java new file mode 100644 index 0000000..4dd9f48 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/network/Result.java @@ -0,0 +1,29 @@ +package com.dskj.rbchat.network; + +import com.dskj.rbchat.utils.GsonUtils; + +import java.io.Serializable; + +/** + * created by wmm on 2020/9/8 + */ +public class Result implements Serializable { + + public String error; + public int code; + public T data; + + + public boolean isSuccessful() { + return code == 1; + } + + @Override + public String toString() { + return "Result{" + + "message='" + error + '\'' + + ", code=" + code + + ", data=" + GsonUtils.beanToJSONString(data) + + '}'; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/network/ResultNew.java b/app/src/main/java/com/dskj/rbchat/network/ResultNew.java new file mode 100644 index 0000000..0e55aec --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/network/ResultNew.java @@ -0,0 +1,27 @@ +package com.dskj.rbchat.network; + +import com.dskj.rbchat.utils.GsonUtils; + +import java.io.Serializable; + +/** + * created by wmm on 2020/9/8 + */ +public class ResultNew implements Serializable { + + public String status; + public T results; + + + public boolean isSuccessful() { + return status.equals("OK"); + } + + @Override + public String toString() { + return "Result{" + + "status='" + status + '\'' + + ", data=" + GsonUtils.beanToJSONString(results) + + '}'; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/pay/CollectionActivity.java b/app/src/main/java/com/dskj/rbchat/pay/CollectionActivity.java new file mode 100644 index 0000000..2ef7aa8 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/pay/CollectionActivity.java @@ -0,0 +1,362 @@ + +package com.dskj.rbchat.pay; + +import android.content.Intent; +import android.graphics.Bitmap; +import android.os.Build; +import android.os.Bundle; +import android.os.CountDownTimer; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.view.MotionEvent; +import android.view.View; +import android.view.inputmethod.InputMethodManager; + +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; + +import com.bumptech.glide.Glide; +import com.codersun.fingerprintcompat.AonFingerChangeCallback; +import com.codersun.fingerprintcompat.FingerManager; +import com.codersun.fingerprintcompat.SimpleFingerCheckCallback; +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.ActivityCollectionBinding; +import com.dskj.rbchat.databinding.ActivityPaymentBinding; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.dialog.PayCashDialog; +import com.dskj.rbchat.dialog.PayCashFingerDialog; +import com.dskj.rbchat.main.mine.ChangeAccoutActionActivity; +import com.dskj.rbchat.model.BindBean; +import com.dskj.rbchat.model.FukuanResultBean; +import com.dskj.rbchat.model.LoginBean; +import com.dskj.rbchat.model.WalletBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.KeyboardUtil; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.wallet.WalletInfoActivity; +import com.king.zxing.util.CodeUtils; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.uinfo.UserService; +import com.netease.nimlib.sdk.uinfo.model.NimUserInfo; +import com.netease.yunxin.kit.chatkit.ui.model.TransferBean; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.corekit.im.IMKitClient; + +import java.util.HashMap; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class CollectionActivity extends BaseActivity { + + WalletBean walletBean; + BindBean bindBean; + float number = 0; + ActivityCollectionBinding viewBinding; + String code; + String uid; + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + getWindow().setStatusBarColor(getResources().getColor(R.color.color_fcfcfc)); + getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white)); + + super.onCreate(savedInstanceState); + viewBinding = ActivityCollectionBinding.inflate(getLayoutInflater()); + setContentView(viewBinding.getRoot()); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + initView(); + } + code = getIntent().getStringExtra("code"); + uid = getIntent().getStringExtra("uid"); + if(!TextUtils.isEmpty(uid)){ + getUserInfo(uid); + } + } + private void getUserInfo(String user_uid) { + Api.getInstance().userInfo(user_uid) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result feedbackResp) { + viewBinding.userHeadIv.setVisibility(View.VISIBLE); + viewBinding.userNameTv.setVisibility(View.VISIBLE); + viewBinding.userNameTv.setText(feedbackResp.data.getNickNameWithRemark()); + viewBinding.userHeadIv.setData(feedbackResp.data.getUserAvatarFileName(),feedbackResp.data.getNickNameWithRemark()); + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + } + }); + + + } + /** + * + */ + @RequiresApi(api = Build.VERSION_CODES.M) + protected void initView() { + viewBinding.aboutTitleBar.getBackImageView().setOnClickListener(v -> finish()); + + viewBinding.tvLogin.setOnClickListener(v -> { + if (bindBean != null) { + if (!bindBean.getPhoneBind()) { + showDialog(); + } else { + if (TextUtils.isEmpty(viewBinding.numberHintEt.getText().toString().trim())) { + ToastX.showShortToast(R.string.zzjebnwk_txt1); + return; + } + float number1 = Float.parseFloat(viewBinding.numberHintEt.getText().toString().trim()) * 100; + if (number1 < 1) { + ToastX.showShortToast(R.string.zzjebnsy_txt1); + return; + } + + if (walletBean != null) { + number = Float.parseFloat(viewBinding.numberHintEt.getText().toString().trim()); + toChange(number); + } else { + ToastX.showShortToast(R.string.hqqbxxsb_tx); + + } + } + + } else { + ToastX.showShortToast(R.string.hqqbxxsb_tx); + + } + + }); + + viewBinding.numberHintEt.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) { + String input = s.toString(); + if(input.startsWith(".")){ + viewBinding.numberHintEt.setText("0"+viewBinding.numberHintEt.getText().toString()); + } + if(input.contains(".")){ + int dotIndex = input.indexOf("."); + if(input.length()-dotIndex-1>2){ + viewBinding.numberHintEt.setText(input.substring(0,dotIndex+3)); + } + } + viewBinding.numberHintEt.setSelection(viewBinding.numberHintEt.getText().length()); + } + + @Override + public void afterTextChanged(Editable s) { + + } + }); + viewBinding.tvLogin1.setOnClickListener(v -> { + finish(); + }); + } + + + private void showDialog() { + + ActionConfirmDialog actionDialog = new ActionConfirmDialog(CollectionActivity.this, + getString(R.string.bind_phone_des_txt), getString(R.string.nobind_txt), getString(R.string.tobind_txt)); + actionDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + Intent intent = new Intent(CollectionActivity.this, ChangeAccoutActionActivity.class); + intent.putExtra("type", ChangeAccoutActionActivity.TYPE_BIND_PHONE); + startActivity(intent); + } + + @Override + public void toCancel() { + + } + }); + actionDialog.show(); + } + long payId = 0; + private void toChange(float number) { + KeyboardUtil.hideSoftInput(this); + HashMap maps = new HashMap<>(); + maps.put("amount", (int) (number * 100)); + maps.put("codeMessage", code); + maps.put("coinType",0); + Api.getInstance().payOuterCodeScan(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result feedbackResp) { +// ToastX.showShortToast(R.string.shoukuanfasong_succ_txt); +// finish(); + payId = feedbackResp.data; + viewBinding.step1Ly.setVisibility(View.GONE); + viewBinding.step2.setVisibility(View.VISIBLE); + Glide.with(CollectionActivity.this) + .load(R.mipmap.zhifuzhong_img) + .into(viewBinding.waitingIv); + + myCountDownTimer = new MyCountDownTimer(1000 * 2*60, 3000); + myCountDownTimer.start(); + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast(msg); + + } + }); + } + + + MyCountDownTimer myCountDownTimer; + //倒计时函数 + private class MyCountDownTimer extends CountDownTimer { + + public MyCountDownTimer(long millisInFuture, long countDownInterval) { + super(millisInFuture, countDownInterval); + } + + //计时过程 + @Override + public void onTick(long l) { + getPayInfo(); + } + + //计时完毕的方法 + @Override + public void onFinish() { + ActionConfirmDialog actionDialog = new ActionConfirmDialog(CollectionActivity.this, + getString(R.string.shoukuanchaoshi_txt), "",getString(R.string.fanhuishouye_txt),false); + actionDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + finish(); + } + + @Override + public void toCancel() { + + } + }); + actionDialog.show(); + + } + } + + private void getPayInfo() { + + Api.getInstance().getPayResult(payId+"") + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + + @Override + public void onSuccess(Result feedbackResp) { + if(!feedbackResp.data.getStatus().equals(1)) { + myCountDownTimer.cancel(); + myCountDownTimer = null; + viewBinding.step2.setVisibility(View.GONE); + viewBinding.step3.setVisibility(View.VISIBLE); + changeStep3(feedbackResp.data); + } + //{"data":{"nickname":"鸡哔你","amount":100,"payTime":"","status":1},"code":1} + //1 支付中 2 成功 0/3支付失败 + + } + + @Override + public void onError(int code, String msg) { + + } + }); + } + + private void changeStep3(FukuanResultBean data) { + if(data.getStatus().equals(2)){ + viewBinding.numberTv.setText(viewBinding.numberHintEt.getText().toString().trim()); + viewBinding.fukuanfangTv.setText(data.getNickname()); + viewBinding.daozhangshijianTv.setText(DataUtils.getCurrentTimeType(System.currentTimeMillis())); + }else{ + viewBinding.step3Iv.setImageResource(R.mipmap.fukuan_faild_img); + viewBinding.step3SuccLy.setVisibility(View.GONE); + viewBinding.tvLogin1.setText(R.string.fanhuishouye_txt); + viewBinding.step3TitleTv.setText(R.string.sksb_qxfk_txt); + } + } + + + @Override + protected void onResume() { + super.onResume(); + getWallet(); + bindInfo(); + } + + + private void bindInfo() { +// if (u != null) { + Api.getInstance().bindInfo(IMKitClient.account()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + bindBean = feedbackResp.data; + + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + } + }); +// } + } + + private void getWallet() { + Api.getInstance().walletInfo(IMKitClient.account()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { + walletBean = feedbackResp.data; + } + + @Override + public void onError(int code, String msg) { +// WidgetUtils.showToast(getActivity(), msg, WidgetUtils.ToastType.ERROR); + + } + }); + + + } + public boolean onTouchEvent(MotionEvent event) { + if(null != this.getCurrentFocus()){ + /** + * 点击空白位置 隐藏软键盘 + */ + InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + return mInputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0); + } + return super .onTouchEvent(event); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/pay/CollectionAndPaymentActivity.java b/app/src/main/java/com/dskj/rbchat/pay/CollectionAndPaymentActivity.java new file mode 100644 index 0000000..5b72739 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/pay/CollectionAndPaymentActivity.java @@ -0,0 +1,594 @@ + +package com.dskj.rbchat.pay; + +import android.graphics.Bitmap; +import android.os.Build; +import android.os.Bundle; +import android.os.CountDownTimer; +import android.os.Handler; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.animation.Animation; +import android.view.animation.RotateAnimation; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; + +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.model.PayInfoBean; +import com.dskj.rbchat.model.WalletBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.ToolKits; +import com.codersun.fingerprintcompat.AonFingerChangeCallback; +import com.codersun.fingerprintcompat.FingerManager; +import com.codersun.fingerprintcompat.SimpleFingerCheckCallback; +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.R; +import com.dskj.rbchat.dialog.PayCashDialog; +import com.dskj.rbchat.dialog.PayCashFingerDialog; +import com.dskj.rbchat.dialog.SelectPayTypeDialog; +import com.dskj.rbchat.model.LoginBean; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.ImageCacheLoader; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.wallet.PaySettingActivity; +import com.king.zxing.util.CodeUtils; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.dskj.rbchat.databinding.ActivityCollectionAndPaymentBinding; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.corekit.im.IMKitClient; + +import java.util.HashMap; +import java.util.Map; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class CollectionAndPaymentActivity extends BaseActivity implements SelectPayTypeDialog.OnToTypeListener +{ + + private int payType = 0; + PayCashDialog payDialog; + PayCashFingerDialog payCashFingerDialog; + + ActivityCollectionAndPaymentBinding viewBinding; + boolean isShoukuan = false; + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + getWindow().setStatusBarColor(getResources().getColor(R.color.color_white)); + getWindow().setNavigationBarColor(getResources().getColor(R.color.color_f7f7f7)); + + super.onCreate(savedInstanceState); + viewBinding = ActivityCollectionAndPaymentBinding.inflate(getLayoutInflater()); + setContentView(viewBinding.getRoot()); + isShoukuan = getIntent().getBooleanExtra("isShoukuan",false); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + initView(); + } + } + /** + */ + @RequiresApi(api = Build.VERSION_CODES.M) + protected void initView() + { + viewBinding.mainAboutTitleBar.getBackImageView().setOnClickListener(v -> finish()); + + payType = DataUtils.get(this,"pay_type",0); + viewBinding.shoukuanmaLy.setOnClickListener(v -> changeType(0)); + + viewBinding.fukuanmaLy.setOnClickListener(v ->{ + getPayOuterCode(); + changeType(1); + }); +// loginBean = lu1(); +// if(loginBean!=null){ + viewBinding.userNameTv.setText(IMKitClient.getUserInfo().getName()); + viewBinding.userHeadIv.setData(IMKitClient.getUserInfo().getAvatar(),IMKitClient.getUserInfo().getName()); +// } + viewBinding.mainMoreSettingsSafa.setOnClickListener(v -> { +// SelectPayTypeDialog selectPayTypeDialog = new SelectPayTypeDialog(CollectionAndPaymentActivity.this,payType,walletBean); +// selectPayTypeDialog.setOnToVipListener(this); +// selectPayTypeDialog.show(); + }); + viewBinding.baocunShoukuanmaLy.setOnClickListener(v ->{ + doSaveQrcode(); + + }); + changePayType(); + viewBinding.shuaxinIv.setOnClickListener(v -> { + toShuaxin(); + }); + viewBinding.shuaxinIv1.setOnClickListener(v -> { + toShuaxin(); + }); + +// viewBinding.fukuanQrcodeIv.setOnClickListener(v -> { +// switch (FingerManager.checkSupport(CollectionAndPaymentActivity.this)) +// { +// case DEVICE_UNSUPPORTED: +// showPayDialog(0); +// break; +// case SUPPORT_WITHOUT_DATA: +// showPayDialog(1); +// break; +// case SUPPORT: +// showPayDialog(2); +// break; +// } +// }); + + + Bitmap bitmap = CodeUtils.createQRCode(String.format(IMUIKitConfig.SHARE_USER_PAYMENT_CODE, IMKitClient.account()), DataUtils.dip2px(this, 175.0f), null); + if (bitmap != null) { + viewBinding.shoukuanmaQrcodeIv.setImageBitmap(bitmap); + } + if(isShoukuan){ + changeType(0); + }else{ + getPayOuterCode(); + } + initStartDaojishi(); + + } + + private void initStartDaojishi() { + if(myCountDownTimer!=null){ + myCountDownTimer.cancel(); + } + myCountDownTimer = new MyCountDownTimer(1000 * 24*60*60, 3000); + myCountDownTimer.start(); + } + + @Override + protected void onDestroy() { + if(myCountDownTimer!=null){ + myCountDownTimer.cancel(); + } + super.onDestroy(); + } + + String payOuterCode; + private void getPayOuterCode() { + Api.getInstance().payOuterCode() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + + @Override + public void onSuccess(Result feedbackResp) { + payOuterCode = feedbackResp.data; + Bitmap bitmap = CodeUtils.createQRCode(payOuterCode, DataUtils.dip2px(CollectionAndPaymentActivity.this, 175.0f), null); + if (bitmap != null) { + viewBinding.fukuanQrcodeIv.setImageBitmap(bitmap); + } + + } + + @Override + public void onError(int code, String msg) { + + } + }); + } + + private void toShuaxin() { + + RotateAnimation ra = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); + // 设置动画时长 + ra.setDuration(1000); + // 启动动画 + viewBinding.shuaxinIv1.startAnimation(ra); + getPayOuterCode(); + + } + + + private void changePayType() { + viewBinding.yueTv.setVisibility(View.INVISIBLE); + if(payType == 0){ + viewBinding.payTypeTv.setText(R.string.species_txt); + viewBinding.yueTv.setVisibility(View.VISIBLE); + viewBinding.payTypeIv.setImageResource(R.mipmap.wallet_jinbi_img); + }else if(payType == 1){ + viewBinding.payTypeTv.setText("line pay"); + viewBinding.payTypeIv.setImageResource(R.mipmap.line_pay_img); + }else{ + viewBinding.payTypeTv.setText(R.string.neweb_txt); + viewBinding.payTypeIv.setImageResource(R.mipmap.newebpay_img); + } + } + + + /** + * 将2维码保存到系统相册。 + */ + private void doSaveQrcode(){ + // 先生成bitmap对象 + Bitmap bmp = DataUtils.generateBitmap(viewBinding.shoukuanRy1); + // bitmap对象生成成功 + if(bmp != null){ + // 保存到相册成功 + if (ToolKits.saveBmp2Gallery(CollectionAndPaymentActivity.this, bmp)) { + ToastX.showShortToast(getString(R.string.qrcode_generate_activity_qr_save_sucess)); + } else { + ToastX.showShortToast(getString(R.string.qrcode_generate_activity_qr_save_fail)); + + } + } + else{ + Log.w("TAG", "将2维码保存到相册时失败了,从view生成Bitmap对象失败,生成后的bmp=null!"); + ToastX.showShortToast(getString(R.string.qrcode_generate_activity_qr_generate_fail)); + + } + } + + private void changeType(int i) { + + if(i ==0){ + viewBinding.shoukuanRy.setVisibility(View.VISIBLE); + viewBinding.fukuanRy.setVisibility(View.GONE); + viewBinding.shoukuanmaIv.setImageResource(R.mipmap.pay_shoukuan_true); + viewBinding.fukuanmaIv.setImageResource(R.mipmap.pay_zhifu_false); + viewBinding.shoukuanmaTv.setTextColor(getResources().getColor(R.color.color_themeblue)); + viewBinding.fukuanmaTv.setTextColor(getResources().getColor(R.color.color_333333)); + viewBinding.shoukuanmaLy.setBackgroundResource(R.mipmap.pay_button_true); + viewBinding.fukuanmaLy.setBackgroundResource(R.mipmap.pay_button_false); + viewBinding.mainAboutTitleBar.getTitleTextView().setText(getString(R.string.shoukuanma_txt)); + + }else{ + viewBinding.shoukuanRy.setVisibility(View.GONE); + viewBinding.fukuanRy.setVisibility(View.VISIBLE); + viewBinding.shoukuanmaIv.setImageResource(R.mipmap.pay_shoukuan_false); + viewBinding.fukuanmaIv.setImageResource(R.mipmap.pay_zhifu_true); + viewBinding.fukuanmaTv.setTextColor(getResources().getColor(R.color.color_themeblue)); + viewBinding.shoukuanmaTv.setTextColor(getResources().getColor(R.color.color_333333)); + viewBinding.shoukuanmaLy.setBackgroundResource(R.mipmap.pay_button_false); + viewBinding.fukuanmaLy.setBackgroundResource(R.mipmap.pay_button_true); + viewBinding.mainAboutTitleBar.getTitleTextView().setText(getString(R.string.fukuanma_txt)); + + } + } + + @Override + protected void onResume() { + super.onResume(); + getWallet(); + } + + private WalletBean walletBean; + private void getWallet() { + Api.getInstance().walletInfo(IMKitClient.account()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + + @Override + public void onSuccess(Result feedbackResp) { + walletBean = feedbackResp.data; + viewBinding.yueTv.setText(String.format(getResources().getString(R.string.yue_pay_txt), feedbackResp.data.getGoldCoin() / 100f)); + + } + + @Override + public void onError(int code, String msg) { + + } + }); + + + } + + + + @Override + public void toType(int type) { + DataUtils.set(CollectionAndPaymentActivity.this,"pay_type",type); + payType = type; + changePayType(); + } + + MyCountDownTimer myCountDownTimer; + int count =0; + //倒计时函数 + private class MyCountDownTimer extends CountDownTimer { + + public MyCountDownTimer(long millisInFuture, long countDownInterval) { + super(millisInFuture, countDownInterval); + } + + //计时过程 + @Override + public void onTick(long l) { + count++; + getPayInfo(); + if(count>59){ + count=0; + if(!isShoukuan) { + getPayOuterCode(); + } + } + if((payDialog!=null&&payDialog.isShowing())||(payCashFingerDialog!=null&&payCashFingerDialog.isShowing())) { + if (System.currentTimeMillis() - passwordTime > 2 * 60 * 1000) { + if(payDialog!=null){ + payDialog.dismiss(); + } + if(payCashFingerDialog!=null){ + payCashFingerDialog.dismiss(); + } + if(payInfoBeanTop!=null){ + cancelPay(payInfoBeanTop.getPayId()); + + } + } + } + + } + + //计时完毕的方法 + @Override + public void onFinish() { + finish(); + + } + } + PayInfoBean payInfoBeanTop = null; + private void getPayInfo() { + Api.getInstance().getPayInfo() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + + @Override + public void onSuccess(Result feedbackResp) { + //{"data":{"headImage":"https://letschat.oss-cn-hongkong.aliyuncs.com/media/userAvatarFileName/dc873aed-2726-4b23-83af-0a8f3e1dbc17_1699842807436.jpg","nickname":"\uD83D\uDC36不乖","payId":2,"amount":2000},"code":1} + if(payInfoBeanTop!=null){ + return; + } + + if(feedbackResp.data!=null){ + payInfoBeanTop = feedbackResp.data; + getPayOuterCode(); + if(DataUtils.get(CollectionAndPaymentActivity.this, "hasMianMi", false)&&payInfoBeanTop.getAmount()<=1000*100){ + toChange(payInfoBeanTop,null,true); + }else { + passwordTime = System.currentTimeMillis(); + if (DataUtils.get(CollectionAndPaymentActivity.this, "hasFinger", false)) { + showPayCashFingerDialog(feedbackResp.data); + } else { + showPayCashDialog(feedbackResp.data); + } + } + } + } + + @Override + public void onError(int code, String msg) { + + } + }); + + } + + long passwordTime = 0; + + + + private void showPayCashDialog(PayInfoBean payInfoBean) { + payDialog = new PayCashDialog(CollectionAndPaymentActivity.this,String.format("%.2f",payInfoBean.getAmount()/100f),true,0,walletBean, + null,2,String.format(getString(R.string.fukuangei_txt),payInfoBean.getNickname())); + //免密支付的 要告诉 为什么 没有免密 + if((payInfoBean.getAmount()>1000*100)&&DataUtils.get(CollectionAndPaymentActivity.this, "hasMianMi", false)){ + payDialog = new PayCashDialog(CollectionAndPaymentActivity.this,String.format("%.2f",payInfoBean.getAmount()/100f),true,0,walletBean, + null,2,String.format(getString(R.string.fukuangei_txt),payInfoBean.getNickname()),getString(R.string.zfjecgxz_txt)); + } + payDialog.setOntoAlbumListener(new PayCashDialog.OnListItemClickListener() { + @Override + public void onPayPass(String position) { + + toChange(payInfoBean,position,false); + } + + @RequiresApi(api = Build.VERSION_CODES.M) + @Override + public void onChangeFinger() { + showPayCashFingerDialog(payInfoBean); + } + + @Override + public void dimess() { + ActionConfirmDialog actionDialog = new ActionConfirmDialog(CollectionAndPaymentActivity.this, + getString(R.string.quxiaozhifu_dialog_txt),true); + actionDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + cancelPay(payInfoBean.getPayId()); + } + + @Override + public void toCancel() { + actionDialog.dismiss(); + payDialog.show(); + } + }); + actionDialog.show(); + + } + }); + payDialog.show(); + } + + private void cancelPay(Long payId) { + HashMap maps = new HashMap<>(); + maps.put("payId", payId); + Api.getInstance().payOuterCodeCancel(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + + @Override + public void onSuccess(Result feedbackResp) { + ToastX.showShortToast(R.string.zhifuchengong_txt1); + payInfoBeanTop =null; + if(payDialog!=null) { + payDialog.dismiss(); + } + if(payCashFingerDialog!=null) { + payCashFingerDialog.dismiss(); + } + getPayOuterCode(); + initStartDaojishi(); + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast(msg); + + } + }); + } + + private void toChange(PayInfoBean payInfoBean,String password,boolean isMianMi) { + HashMap maps = new HashMap<>(); + maps.put("payId", payInfoBean.getPayId()); + if(!TextUtils.isEmpty(password)){ + maps.put("payPassword", password); + maps.put("payVerifyCode",1); + }else{ + maps.put("payVerifyCode",3); + + } + + Api.getInstance().payOuterCodeConfirm(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + + @Override + public void onSuccess(Result feedbackResp) { + ToastX.showShortToast(R.string.zhifuchengong_txt); + payInfoBeanTop = null; + getPayOuterCode(); + getWallet(); + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast(msg); + if(isMianMi){//免密支付失败 校验支付密码 这些 + if (DataUtils.get(CollectionAndPaymentActivity.this, "hasFinger", false)) { + showPayCashFingerDialog(payInfoBeanTop); + } else { + showPayCashDialog(payInfoBeanTop); + } + }else{ + payInfoBeanTop = null; + } + } + }); + + } + + private void showPayCashFingerDialog(PayInfoBean payInfoBean) { + //Context context, String data, boolean showNumber, int payType, WalletBean walletBean, SelectPayTypeDialog.OnToTypeListener onToTypeListener, int isShowFinger + payCashFingerDialog = new PayCashFingerDialog(this,String.format("%.2f",payInfoBean.getAmount()/100f),true, + 0,walletBean,null,2,String.format(getString(R.string.fukuangei_txt),payInfoBean.getNickname())); + if((payInfoBean.getAmount()>1000*100)&&DataUtils.get(CollectionAndPaymentActivity.this, "hasMianMi", false)){ + payCashFingerDialog = new PayCashFingerDialog(this,String.format("%.2f",payInfoBean.getAmount()/100f),true, + 0,walletBean,null,2,String.format(getString(R.string.fukuangei_txt),payInfoBean.getNickname()),getString(R.string.zfjecgxz_txt)); + } + payCashFingerDialog.setOntoAlbumListener(new PayCashFingerDialog.OnListItemClickListener() { + @Override + public void onChangePassword() { + showPayCashDialog(payInfoBean); + } + + @Override + public void toFinger() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + checkPayFinger(payInfoBean); + } + } + + @Override + public void dimess() { + ActionConfirmDialog actionDialog = new ActionConfirmDialog(CollectionAndPaymentActivity.this, + getString(R.string.quxiaozhifu_dialog_txt),true); + actionDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + cancelPay(payInfoBean.getPayId()); + } + + @Override + public void toCancel() { + actionDialog.dismiss(); + payCashFingerDialog.show(); + } + }); + actionDialog.show(); + } + }); + payCashFingerDialog.show(); + } + + @RequiresApi(api = Build.VERSION_CODES.M) + private void checkPayFinger(PayInfoBean payInfoBean) { + + FingerManager.build().setApplication(IMApplication.getInstance()) + .setTitle(" ") + .setDes(" ") + .setNegativeText(" ") + .setFingerCheckCallback(new SimpleFingerCheckCallback() + { + + @Override + public void onSucceed() + { + ToastX.showShortToast("验证成功"); + payCashFingerDialog.dismiss(); + toChange(payInfoBean,null,false); + } + + @Override + public void onError(String error) + { + ToastX.showShortToast("验证失败"); + + } + + @Override + public void onCancel() + { + ToastX.showShortToast("您取消了识别"); + + } + }) + .setFingerChangeCallback(new AonFingerChangeCallback() + { + + @Override + protected void onFingerDataChange() + { +// ToastX.showShortToast("指纹数据发生了变化"); + FingerManager.updateFingerData(CollectionAndPaymentActivity.this); + new Handler().postDelayed(() -> checkPayFinger(payInfoBean), 1000); + + } + }) + .create() + .startListener(CollectionAndPaymentActivity.this); + } + + + + +} diff --git a/app/src/main/java/com/dskj/rbchat/pay/LipinDuiHuanActivity.java b/app/src/main/java/com/dskj/rbchat/pay/LipinDuiHuanActivity.java new file mode 100644 index 0000000..aadd88e --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/pay/LipinDuiHuanActivity.java @@ -0,0 +1,622 @@ + +package com.dskj.rbchat.pay; + +import android.content.Intent; +import android.graphics.Bitmap; +import android.graphics.Color; +import android.os.Build; +import android.os.Bundle; +import android.os.CountDownTimer; +import android.os.Handler; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.view.animation.Animation; +import android.view.animation.RotateAnimation; + +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; + +import com.codersun.fingerprintcompat.AonFingerChangeCallback; +import com.codersun.fingerprintcompat.FingerManager; +import com.codersun.fingerprintcompat.SimpleFingerCheckCallback; +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.ActivityCollectionAndPaymentBinding; +import com.dskj.rbchat.databinding.ActivityLipinduihuanBinding; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.dialog.PayCashDialog; +import com.dskj.rbchat.dialog.PayCashFingerDialog; +import com.dskj.rbchat.dialog.SelectPayTypeDialog; +import com.dskj.rbchat.model.PayInfoBean; +import com.dskj.rbchat.model.WalletBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.AppUtils; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.ToolKits; +import com.king.zxing.util.CodeUtils; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.corekit.im.IMKitClient; + +import java.util.HashMap; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class LipinDuiHuanActivity extends BaseActivity implements SelectPayTypeDialog.OnToTypeListener { + + private int payType = 0; + PayCashDialog payDialog; + PayCashFingerDialog payCashFingerDialog; + + ActivityLipinduihuanBinding viewBinding; + boolean isShoukuan = false; + private int viewType = 0; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + getWindow().setStatusBarColor(getResources().getColor(R.color.color_fffbfb)); + getWindow().setNavigationBarColor(getResources().getColor(R.color.color_ffe49c)); + + super.onCreate(savedInstanceState); + viewBinding = ActivityLipinduihuanBinding.inflate(getLayoutInflater()); + setContentView(viewBinding.getRoot()); + isShoukuan = getIntent().getBooleanExtra("isShoukuan", false); + viewType = getIntent().getIntExtra("type", 0); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + initView(); + } + } + + /** + * + */ + @RequiresApi(api = Build.VERSION_CODES.M) + protected void initView() { +// if (viewType == 1) { +// viewBinding.mainAboutTitleBar.setTitle("礼金兑换码"); +// viewBinding.lipingduihuanLy.setBackgroundColor(Color.parseColor("#FFE49C")); +// viewBinding.fukuanRy.setBackgroundResource(R.mipmap.ic_redpay_bg); +// int whiteColor = getResources().getColor(R.color.color_white); +// viewBinding.tvShangjiamaHint.setTextColor(whiteColor); +// viewBinding.tvShangjiamaHint.setCompoundDrawablesWithIntrinsicBounds(getResources().getDrawable(R.mipmap.pay_qrcode_lijin_img), null, null, null); +// viewBinding.shuaxinIv.setTextColor(whiteColor); +// } + viewBinding.mainAboutTitleBar.getBackImageView().setOnClickListener(v -> finish()); + + payType = DataUtils.get(this, "pay_type", 0); + viewBinding.shoukuanmaLy.setOnClickListener(v -> changeType(0)); + + viewBinding.fukuanmaLy.setOnClickListener(v -> { + getWallet(); + changeType(1); + }); +// loginBean = lu1(); +// if(loginBean!=null){ + viewBinding.userNameTv.setText(IMKitClient.getUserInfo().getName()); + viewBinding.userHeadIv.setData(IMKitClient.getUserInfo().getAvatar(), IMKitClient.getUserInfo().getName()); +// } + viewBinding.mainMoreSettingsSafa.setOnClickListener(v -> { +// SelectPayTypeDialog selectPayTypeDialog = new SelectPayTypeDialog(CollectionAndPaymentActivity.this,payType,walletBean); +// selectPayTypeDialog.setOnToVipListener(this); +// selectPayTypeDialog.show(); + }); + viewBinding.baocunShoukuanmaLy.setOnClickListener(v -> { + doSaveQrcode(); + + }); + changePayType(); + viewBinding.shuaxinIv.setOnClickListener(v -> { + toShuaxin(); + }); + viewBinding.shuaxinIv1.setOnClickListener(v -> { + toShuaxin(); + }); + +// viewBinding.fukuanQrcodeIv.setOnClickListener(v -> { +// switch (FingerManager.checkSupport(CollectionAndPaymentActivity.this)) +// { +// case DEVICE_UNSUPPORTED: +// showPayDialog(0); +// break; +// case SUPPORT_WITHOUT_DATA: +// showPayDialog(1); +// break; +// case SUPPORT: +// showPayDialog(2); +// break; +// } +// }); + + + Bitmap bitmap = CodeUtils.createQRCode(String.format(IMUIKitConfig.SHARE_USER_PAYMENT_CODE, IMKitClient.account()), DataUtils.dip2px(this, 175.0f), null); + if (bitmap != null) { + viewBinding.shoukuanmaQrcodeIv.setImageBitmap(bitmap); + } + if (isShoukuan) { + changeType(0); + } else { + getWallet(); + } + initStartDaojishi(); + +// viewBinding.fukuanQrcodeIv.setOnClickListener(new View.OnClickListener() { +// @Override +// public void onClick(View v) { +// startActivity(new Intent(LipinDuiHuanActivity.this,LipinDuiHuanSuccessActivity.class)); +// } +// }); + + } + + private void initStartDaojishi() { + if (myCountDownTimer != null) { + myCountDownTimer.cancel(); + } + myCountDownTimer = new MyCountDownTimer(1000 * 24 * 60 * 60, 3000); + myCountDownTimer.start(); + } + + @Override + protected void onDestroy() { + if (myCountDownTimer != null) { + myCountDownTimer.cancel(); + } + super.onDestroy(); + } + + String payOuterCode; + + private void getPayOuterCode() { + Api.getInstance().payOuterCode() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + + @Override + public void onSuccess(Result feedbackResp) { + payOuterCode = feedbackResp.data; + if (walletBean != null) { + Bitmap bitmap = CodeUtils.createQRCode(payOuterCode + "/" + walletBean.getSilverCoin(), DataUtils.dip2px(LipinDuiHuanActivity.this, 175.0f), null); + if (bitmap != null) { + viewBinding.fukuanQrcodeIv.setImageBitmap(bitmap); + } + } else { + Bitmap bitmap = CodeUtils.createQRCode(payOuterCode, DataUtils.dip2px(LipinDuiHuanActivity.this, 175.0f), null); + if (bitmap != null) { + viewBinding.fukuanQrcodeIv.setImageBitmap(bitmap); + } + } + + + } + + @Override + public void onError(int code, String msg) { + + } + }); + } + + private void toShuaxin() { + + RotateAnimation ra = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); + // 设置动画时长 + ra.setDuration(1000); + // 启动动画 + viewBinding.shuaxinIv1.startAnimation(ra); + getWallet(); + + } + + + private void changePayType() { + viewBinding.yueTv.setVisibility(View.INVISIBLE); + if (payType == 0) { + viewBinding.payTypeTv.setText(R.string.silver_coins_txt); + viewBinding.yueTv.setVisibility(View.VISIBLE); + viewBinding.payTypeIv.setImageResource(R.mipmap.wallet_yinbi_img); + } else if (payType == 1) { + viewBinding.payTypeTv.setText("line pay"); + viewBinding.payTypeIv.setImageResource(R.mipmap.line_pay_img); + } else { + viewBinding.payTypeTv.setText(R.string.neweb_txt); + viewBinding.payTypeIv.setImageResource(R.mipmap.newebpay_img); + } + if(viewType==1){ + viewBinding.payTypeIv.setImageResource(R.mipmap.wallet_lijin_img); + viewBinding.payTypeTv.setText("礼金积分"); + viewBinding.payTypeTv.setTextColor(getResources().getColor(R.color.color_fff5cb)); + viewBinding.yueTv.setVisibility(View.VISIBLE); + viewBinding.yueTv.setTextColor(getResources().getColor(R.color.color_fffdf6)); + viewBinding.shuaxinIv1.setColorFilter(Color.WHITE); + } + } + + + /** + * 将2维码保存到系统相册。 + */ + private void doSaveQrcode() { + // 先生成bitmap对象 + Bitmap bmp = DataUtils.generateBitmap(viewBinding.shoukuanRy1); + // bitmap对象生成成功 + if (bmp != null) { + // 保存到相册成功 + if (ToolKits.saveBmp2Gallery(LipinDuiHuanActivity.this, bmp)) { + ToastX.showShortToast(getString(R.string.qrcode_generate_activity_qr_save_sucess)); + } else { + ToastX.showShortToast(getString(R.string.qrcode_generate_activity_qr_save_fail)); + + } + } else { + Log.w("TAG", "将2维码保存到相册时失败了,从view生成Bitmap对象失败,生成后的bmp=null!"); + ToastX.showShortToast(getString(R.string.qrcode_generate_activity_qr_generate_fail)); + + } + } + + private void changeType(int i) { + + if (i == 0) { + viewBinding.shoukuanRy.setVisibility(View.VISIBLE); + viewBinding.fukuanRy.setVisibility(View.GONE); + viewBinding.shoukuanmaIv.setImageResource(R.mipmap.pay_shoukuan_true); + viewBinding.fukuanmaIv.setImageResource(R.mipmap.pay_zhifu_false); + viewBinding.shoukuanmaTv.setTextColor(getResources().getColor(R.color.color_themeblue)); + viewBinding.fukuanmaTv.setTextColor(getResources().getColor(R.color.color_333333)); + viewBinding.shoukuanmaLy.setBackgroundResource(R.mipmap.pay_button_true); + viewBinding.fukuanmaLy.setBackgroundResource(R.mipmap.pay_button_false); +// viewBinding.mainAboutTitleBar.getTitleTextView().setText(getString(R.string.shoukuanma_txt)); + + } else { + viewBinding.shoukuanRy.setVisibility(View.GONE); + viewBinding.fukuanRy.setVisibility(View.VISIBLE); + viewBinding.shoukuanmaIv.setImageResource(R.mipmap.pay_shoukuan_false); + viewBinding.fukuanmaIv.setImageResource(R.mipmap.pay_zhifu_true); + viewBinding.fukuanmaTv.setTextColor(getResources().getColor(R.color.color_themeblue)); + viewBinding.shoukuanmaTv.setTextColor(getResources().getColor(R.color.color_333333)); + viewBinding.shoukuanmaLy.setBackgroundResource(R.mipmap.pay_button_false); + viewBinding.fukuanmaLy.setBackgroundResource(R.mipmap.pay_button_true); +// viewBinding.mainAboutTitleBar.getTitleTextView().setText(getString(R.string.fukuanma_txt)); + + } + } + + @Override + protected void onResume() { + super.onResume(); + } + + private WalletBean walletBean; + + private void getWallet() { + Api.getInstance().walletInfo(IMKitClient.account()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + + @Override + public void onSuccess(Result feedbackResp) { + walletBean = feedbackResp.data; + viewBinding.yueTv.setText(String.format(getResources().getString(R.string.yuee_2f_txt), AppUtils.getQian(feedbackResp.data.getSilverCoin()))); +// if(viewType==1){ +// viewBinding.yueTv.setText(String.format(getResources().getString(R.string.yuee_2f_txt), AppUtils.getQian(feedbackResp.data.getGiftCoin()*100))); +// } + getPayOuterCode(); + } + + @Override + public void onError(int code, String msg) { + + } + }); + + + } + + + @Override + public void toType(int type) { + DataUtils.set(LipinDuiHuanActivity.this, "pay_type", type); + payType = type; + changePayType(); + } + + MyCountDownTimer myCountDownTimer; + int count = 0; + + //倒计时函数 + private class MyCountDownTimer extends CountDownTimer { + + public MyCountDownTimer(long millisInFuture, long countDownInterval) { + super(millisInFuture, countDownInterval); + } + + //计时过程 + @Override + public void onTick(long l) { + count++; + getPayInfo(); + if (count > 59) { + count = 0; + if (!isShoukuan) { + getWallet(); + } + } + if ((payDialog != null && payDialog.isShowing()) || (payCashFingerDialog != null && payCashFingerDialog.isShowing())) { + if (System.currentTimeMillis() - passwordTime > 2 * 60 * 1000) { + if (payDialog != null) { + payDialog.dismiss(); + } + if (payCashFingerDialog != null) { + payCashFingerDialog.dismiss(); + } + if (payInfoBeanTop != null) { + cancelPay(payInfoBeanTop.getPayId()); + + } + } + } + + } + + //计时完毕的方法 + @Override + public void onFinish() { + finish(); + + } + } + + PayInfoBean payInfoBeanTop = null; + + private void getPayInfo() { + Api.getInstance().getPayInfo() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + + @Override + public void onSuccess(Result feedbackResp) { + //{"data":{"headImage":"https://letschat.oss-cn-hongkong.aliyuncs.com/media/userAvatarFileName/dc873aed-2726-4b23-83af-0a8f3e1dbc17_1699842807436.jpg","nickname":"\uD83D\uDC36不乖","payId":2,"amount":2000},"code":1} + if (payInfoBeanTop != null) { + return; + } + + if (feedbackResp.data != null) { + payInfoBeanTop = feedbackResp.data; + getWallet(); + if (DataUtils.get(LipinDuiHuanActivity.this, "hasMianMi", false) && payInfoBeanTop.getAmount() <= 1000 * 100) { + toChange(payInfoBeanTop, null, true); + } else { + passwordTime = System.currentTimeMillis(); + if (DataUtils.get(LipinDuiHuanActivity.this, "hasFinger", false)) { + showPayCashFingerDialog(feedbackResp.data); + } else { + showPayCashDialog(feedbackResp.data); + } + } + } + } + + @Override + public void onError(int code, String msg) { + + } + }); + + } + + long passwordTime = 0; + + + private void showPayCashDialog(PayInfoBean payInfoBean) { + payDialog = new PayCashDialog(LipinDuiHuanActivity.this, String.format("%.2f", payInfoBean.getAmount() / 100f), true, 0, walletBean, + null, 2, String.format(getString(R.string.fukuangei_txt), payInfoBean.getNickname()), 1); + //免密支付的 要告诉 为什么 没有免密 + if ((payInfoBean.getAmount() > 1000 * 100) && DataUtils.get(LipinDuiHuanActivity.this, "hasMianMi", false)) { + payDialog = new PayCashDialog(LipinDuiHuanActivity.this, String.format("%.2f", payInfoBean.getAmount() / 100f), true, 0, walletBean, + null, 2, String.format(getString(R.string.fukuangei_txt), payInfoBean.getNickname()), getString(R.string.zfjecgxz_txt), 1); + } + payDialog.setOntoAlbumListener(new PayCashDialog.OnListItemClickListener() { + @Override + public void onPayPass(String position) { + + toChange(payInfoBean, position, false); + } + + @RequiresApi(api = Build.VERSION_CODES.M) + @Override + public void onChangeFinger() { + showPayCashFingerDialog(payInfoBean); + } + + @Override + public void dimess() { + ActionConfirmDialog actionDialog = new ActionConfirmDialog(LipinDuiHuanActivity.this, + getString(R.string.quxiaozhifu_dialog_txt), true); + actionDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + cancelPay(payInfoBean.getPayId()); + } + + @Override + public void toCancel() { + actionDialog.dismiss(); + payDialog.show(); + + } + }); + actionDialog.show(); + + } + }); + payDialog.show(); + } + + private void cancelPay(Long payId) { + HashMap maps = new HashMap<>(); + maps.put("payId", payId); + Api.getInstance().payOuterCodeCancel(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + + @Override + public void onSuccess(Result feedbackResp) { + ToastX.showShortToast(R.string.zhifuchengong_txt1); + payInfoBeanTop = null; + if (payDialog != null) { + payDialog.dismiss(); + } + if (payCashFingerDialog != null) { + payCashFingerDialog.dismiss(); + } + getWallet(); + initStartDaojishi(); + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast(msg); + + } + }); + } + + private void toChange(PayInfoBean payInfoBean, String password, boolean isMianMi) { + HashMap maps = new HashMap<>(); + maps.put("payId", payInfoBean.getPayId()); + if (!TextUtils.isEmpty(password)) { + maps.put("payPassword", password); + maps.put("payVerifyCode", 1); + } else { + maps.put("payVerifyCode", 3); + + } + + Api.getInstance().payOuterCodeConfirm(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + + @Override + public void onSuccess(Result feedbackResp) { + ToastX.showShortToast(R.string.zhifuchengong_txt); + payInfoBeanTop = null; + getWallet(); + Intent intent = new Intent(LipinDuiHuanActivity.this, LipinDuiHuanSuccessActivity.class); + intent.putExtra("payId", payInfoBean.getPayId()); + startActivity(intent); + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast(msg); + if (isMianMi) {//免密支付失败 校验支付密码 这些 + if (DataUtils.get(LipinDuiHuanActivity.this, "hasFinger", false)) { + showPayCashFingerDialog(payInfoBeanTop); + } else { + showPayCashDialog(payInfoBeanTop); + } + } else { + payInfoBeanTop = null; + } + } + }); + + } + + private void showPayCashFingerDialog(PayInfoBean payInfoBean) { + //Context context, String data, boolean showNumber, int payType, WalletBean walletBean, SelectPayTypeDialog.OnToTypeListener onToTypeListener, int isShowFinger + payCashFingerDialog = new PayCashFingerDialog(this, String.format("%.2f", payInfoBean.getAmount() / 100f), true, + 0, walletBean, null, 2, String.format(getString(R.string.fukuangei_txt), payInfoBean.getNickname()), true); + if ((payInfoBean.getAmount() > 1000 * 100) && DataUtils.get(LipinDuiHuanActivity.this, "hasMianMi", false)) { + payCashFingerDialog = new PayCashFingerDialog(this, String.format("%.2f", payInfoBean.getAmount() / 100f), true, + 0, walletBean, null, 2, String.format(getString(R.string.fukuangei_txt), payInfoBean.getNickname()), getString(R.string.zfjecgxz_txt), true); + } + payCashFingerDialog.setOntoAlbumListener(new PayCashFingerDialog.OnListItemClickListener() { + @Override + public void onChangePassword() { + showPayCashDialog(payInfoBean); + } + + @Override + public void toFinger() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + checkPayFinger(payInfoBean); + } + } + + @Override + public void dimess() { + ActionConfirmDialog actionDialog = new ActionConfirmDialog(LipinDuiHuanActivity.this, + getString(R.string.quxiaozhifu_dialog_txt), true); + actionDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + cancelPay(payInfoBean.getPayId()); + } + + @Override + public void toCancel() { + actionDialog.dismiss(); + payCashFingerDialog.show(); + } + }); + actionDialog.show(); + } + }); + payCashFingerDialog.show(); + } + + @RequiresApi(api = Build.VERSION_CODES.M) + private void checkPayFinger(PayInfoBean payInfoBean) { + + FingerManager.build().setApplication(IMApplication.getInstance()) + .setTitle(" ") + .setDes(" ") + .setNegativeText(" ") + .setFingerCheckCallback(new SimpleFingerCheckCallback() { + + @Override + public void onSucceed() { + ToastX.showShortToast("验证成功"); + payCashFingerDialog.dismiss(); + toChange(payInfoBean, null, false); + } + + @Override + public void onError(String error) { + ToastX.showShortToast("验证失败"); + + } + + @Override + public void onCancel() { + ToastX.showShortToast("您取消了识别"); + + } + }) + .setFingerChangeCallback(new AonFingerChangeCallback() { + + @Override + protected void onFingerDataChange() { +// ToastX.showShortToast("指纹数据发生了变化"); + FingerManager.updateFingerData(LipinDuiHuanActivity.this); + new Handler().postDelayed(() -> checkPayFinger(payInfoBean), 1000); + + } + }) + .create() + .startListener(LipinDuiHuanActivity.this); + } + + +} diff --git a/app/src/main/java/com/dskj/rbchat/pay/LipinDuiHuanSuccessActivity.java b/app/src/main/java/com/dskj/rbchat/pay/LipinDuiHuanSuccessActivity.java new file mode 100644 index 0000000..062360d --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/pay/LipinDuiHuanSuccessActivity.java @@ -0,0 +1,91 @@ +package com.dskj.rbchat.pay; + +import android.content.Intent; +import android.os.Build; +import android.os.Bundle; +import android.os.CountDownTimer; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.view.View; + +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; + +import com.bumptech.glide.Glide; +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.ActivityLipinSuccessBinding; + +import com.dskj.rbchat.model.FukuanResultBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + + +public class LipinDuiHuanSuccessActivity extends BaseActivity { + ActivityLipinSuccessBinding viewBinding; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + getWindow().setStatusBarColor(getResources().getColor(R.color.color_fcfcfc)); + getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white)); + + super.onCreate(savedInstanceState); + viewBinding = ActivityLipinSuccessBinding.inflate(getLayoutInflater()); + setContentView(viewBinding.getRoot()); + initView(); + } + + /** + * + */ + protected void initView() { + viewBinding.aboutTitleBar.getBackImageView().setOnClickListener(v -> finish()); + viewBinding.buttonTv.setOnClickListener(v -> finish()); + getPayInfo(); + } + + private void getPayInfo() { + + Api.getInstance().getPayResult(getIntent().getLongExtra("payId",0l)+"") + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + + @Override + public void onSuccess(Result feedbackResp) { + viewBinding.numberTv.setText(String.format("%.2f",feedbackResp.data.getAmount()/100f)); + viewBinding.timeTv.setText(feedbackResp.data.getPayTime()+""); + if(!TextUtils.isEmpty(feedbackResp.data.getRemark())){ + String text = feedbackResp.data.getRemark(); + if(text.endsWith("-")){ + text = text.substring(0,text.length()); + } + String[] name = text.split("[-]"); + if(name.length>1){ + viewBinding.mendianTv.setText(name[0]); + String names =""; + for (int i =1;i onBackPressed()); + // 检查设备是否支持NFC功能 + NfcManager nfcManager = (NfcManager) getSystemService(Context.NFC_SERVICE); + nfcAdapter = nfcManager.getDefaultAdapter(); + if (nfcAdapter == null) { + // 设备不支持NFC功能 + Toast.makeText(this, "该设备不支持NFC功能", Toast.LENGTH_SHORT).show(); + return; + } + // 检查NFC是否打开 + if (!nfcAdapter.isEnabled()) { + // NFC未打开,跳转到系统设置页面 + startActivity(new Intent(Settings.ACTION_NFC_SETTINGS)); + return; + } + } + + @Override + public int initNavigationBarColor() { + return 0; + } + + @Override + public int initStatusBarColor() { + return 0; + } + + @Override + protected void onResume() { + super.onResume(); + if (nfcAdapter != null) { + showReadDialog(true); + nfcAdapter.enableReaderMode(this, new NfcAdapter.ReaderCallback() { + @Override + public void onTagDiscovered(Tag tag) { + byte[] byteArray = tag.getId(); + for (int i = 0; i < byteArray.length / 2; i++) { + byte temp = byteArray[i]; + byteArray[i] = byteArray[byteArray.length - 1 - i]; + byteArray[byteArray.length - 1 - i] = temp; + } + String result = byteArrayToHexStr(byteArray); + runOnUiThread(new Runnable() { + @Override + public void run() { + showReadDialog(false); + binding.tvNfcresult.setText("结果:" + result); + } + }); + } + + @NonNull + @Override + public String toString() { + return super.toString(); + } + }, (NfcAdapter.FLAG_READER_NFC_F | + NfcAdapter.FLAG_READER_NFC_V | + NfcAdapter.FLAG_READER_NFC_BARCODE), null); + } + + + } + + //转hex + public static String byteArrayToHexStr(byte[] byteArray) { + if (byteArray == null) { + return null; + } + char[] hexArray = "0123456789abcdef".toCharArray(); + char[] hexChars = new char[byteArray.length * 2]; + for (int j = 0; j < byteArray.length; j++) { + int v = byteArray[j] & 0xFF; + hexChars[j * 2] = hexArray[v >>> 4]; + hexChars[j * 2 + 1] = hexArray[v & 0x0F]; + } + return new String(hexChars); + + } + + BottomSheetDialog bottomSheetDialog; + View bottomView; + TextView tvTitle; + AppCompatImageView ivStatus; + TextView tvStatus; + TextView tvCancel; + + public void showReadDialog(boolean isStart) { + if (bottomSheetDialog != null) { + bottomSheetDialog.dismiss(); + } + bottomSheetDialog = new BottomSheetDialog(this, R.style.BottomSheetDialog); + bottomView = LayoutInflater.from(this).inflate(R.layout.dialog_bottom_nfcread, null); + tvTitle = bottomView.findViewById(R.id.tv_nfcread_title); + ivStatus = bottomView.findViewById(R.id.iv_nfcread_status); + tvStatus = bottomView.findViewById(R.id.tv_nfcread_status); + tvCancel = bottomView.findViewById(R.id.tv_nfcread_cancel); + bottomSheetDialog.setContentView(bottomView); + if (isStart) { + tvTitle.setVisibility(View.VISIBLE); + tvCancel.setVisibility(View.VISIBLE); + tvStatus.setText(getString(com.dskj.rbchat.R.string.nfctitle_dialog_status)); + Glide.with(this).load(R.mipmap.nfc_read).into(ivStatus); + tvCancel.setOnClickListener(view -> { + nfcAdapter.disableReaderMode(this); + bottomSheetDialog.dismiss(); + }); + } else { + tvTitle.setVisibility(View.INVISIBLE); + tvCancel.setVisibility(View.INVISIBLE); + tvStatus.setText(getString(R.string.nfctitle_dialog_succes)); + ivStatus.setImageResource(R.mipmap.nfc_success); + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + bottomSheetDialog.dismiss(); + } + }, 1000); + } + bottomSheetDialog.setCanceledOnTouchOutside(false); + bottomSheetDialog.show(); + } +// private NfcReadBottomDialog readBottomDialog; +// +// public void showReadDialog() { +// if (readBottomDialog == null) { +// readBottomDialog = new NfcReadBottomDialog(this); +// } +// readBottomDialog.showStart( +// () -> { +// +// }); +// } +// +// public void showSuccessDialog() { +// if (readBottomDialog == null) { +// readBottomDialog = new NfcReadBottomDialog(this); +// } +// readBottomDialog.showEnd(); +// } + + + @Override + protected void onPause() { + super.onPause(); + if (nfcAdapter != null) { + nfcAdapter.disableReaderMode(this); + } + } +} diff --git a/app/src/main/java/com/dskj/rbchat/pay/PaymentActivity.java b/app/src/main/java/com/dskj/rbchat/pay/PaymentActivity.java new file mode 100644 index 0000000..c8a60ba --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/pay/PaymentActivity.java @@ -0,0 +1,540 @@ + +package com.dskj.rbchat.pay; + +import android.content.Intent; +import android.graphics.Bitmap; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.text.Editable; +import android.text.InputType; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.util.Log; +import android.view.MotionEvent; +import android.view.View; +import android.view.animation.Animation; +import android.view.animation.RotateAnimation; +import android.view.inputmethod.InputMethodManager; + +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; + +import com.bumptech.glide.Glide; +import com.codersun.fingerprintcompat.AonFingerChangeCallback; +import com.codersun.fingerprintcompat.FingerManager; +import com.codersun.fingerprintcompat.SimpleFingerCheckCallback; +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.contact.UserInfoActivity; +import com.dskj.rbchat.databinding.ActivityCollectionAndPaymentBinding; +import com.dskj.rbchat.databinding.ActivityPaymentBinding; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.dialog.PayCashDialog; +import com.dskj.rbchat.dialog.PayCashFingerDialog; +import com.dskj.rbchat.dialog.PayDialog; +import com.dskj.rbchat.dialog.SelectPayTypeDialog; +import com.dskj.rbchat.main.mine.ChangeAccoutActionActivity; +import com.dskj.rbchat.model.BindBean; +import com.dskj.rbchat.model.LoginBean; +import com.dskj.rbchat.model.WalletBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.redpack.TransferAccountsActivity; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.KeyboardUtil; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.utils.ToolKits; +import com.dskj.rbchat.wallet.PaySettingActivity; +import com.dskj.rbchat.wallet.SetPayPasswordActivity; +import com.dskj.rbchat.wallet.WalletInfoActivity; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.msg.MessageBuilder; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.nimlib.sdk.msg.model.IMMessage; +import com.netease.nimlib.sdk.uinfo.UserService; +import com.netease.nimlib.sdk.uinfo.model.NimUserInfo; +import com.netease.yunxin.kit.chatkit.repo.ChatRepo; +import com.netease.yunxin.kit.chatkit.ui.custom.TransferAttachment; +import com.netease.yunxin.kit.chatkit.ui.model.TransferBean; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.utils.AvatarColor; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.provider.FetchCallback; + +import java.util.HashMap; +import java.util.Map; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class PaymentActivity extends BaseActivity { + + PayCashFingerDialog payCashFingerDialog; + WalletBean walletBean; + BindBean bindBean; + float number = 0; + PayCashDialog payDialog; + ActivityPaymentBinding viewBinding; + String userId; + NimUserInfo userInfo; + String userName; + private int userType = 0; //用户类型, 0普通用户 1商户 + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + getWindow().setStatusBarColor(getResources().getColor(R.color.color_fcfcfc)); + getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white)); + + super.onCreate(savedInstanceState); + viewBinding = ActivityPaymentBinding.inflate(getLayoutInflater()); + setContentView(viewBinding.getRoot()); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + initView(); + } + userType = getIntent().getIntExtra("userType", 0); // + userId = getIntent().getStringExtra("userId"); + if (userType == 0) { + userInfo = NIMClient.getService(UserService.class).getUserInfo(userId); + if (userInfo != null) { + viewBinding.userNameTv.setText(userInfo.getName()); + viewBinding.userHeadIv.setData(userInfo.getAvatar(), userInfo.getName()); + userName = userInfo.getName(); + } else { + getUserInfo1(); + } + } else { + viewBinding.numberHintEt.setHint("0"); + viewBinding.numberHintEt.setInputType(InputType.TYPE_CLASS_NUMBER); + viewBinding.tvAmountTitle.setText("Cash:"); + } + + } + + private void getUserInfo1() { + Api.getInstance().userInfo(userId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result feedbackResp) { + viewBinding.userNameTv.setText(feedbackResp.data.getNickNameWithRemark()); + viewBinding.userHeadIv.setData(feedbackResp.data.getUserAvatarFileName(), feedbackResp.data.getNickNameWithRemark()); + userName = feedbackResp.data.getNickNameWithRemark(); + + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); +// WidgetUtils.showToast(getActivity(), msg, WidgetUtils.ToastType.ERROR); + } + }); + } + + /** + * + */ + @RequiresApi(api = Build.VERSION_CODES.M) + protected void initView() { + viewBinding.aboutTitleBar.getBackImageView().setOnClickListener(v -> finish()); + + viewBinding.tvLogin.setOnClickListener(v -> { + if (bindBean != null) { + if (!bindBean.getPhoneBind()) { + showDialog(); + } else { + if (!bindBean.getPayPasswordSet()) { + showDialogPay(); + } else { + if (TextUtils.isEmpty(viewBinding.numberHintEt.getText().toString().trim())) { + ToastX.showShortToast(R.string.zzjebnwk_txt); + return; + } + float number1 = Float.parseFloat(viewBinding.numberHintEt.getText().toString().trim()) * 100; + if (number1 < 1) { + ToastX.showShortToast(R.string.zzjebnsy_txt); + return; + } + + if (walletBean != null) { + if (Float.parseFloat(viewBinding.numberHintEt.getText().toString().trim()) > (walletBean.getGoldCoin() / 100f)) { + + ActionConfirmDialog actionDialog = new ActionConfirmDialog(PaymentActivity.this, + getString(R.string.sfqcz_txt), getString(R.string.general_cancel), getString(R.string.quchongzhi_txt)); + actionDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + Intent intent = new Intent(PaymentActivity.this, WalletInfoActivity.class); + intent.putExtra("isG", true); + startActivity(intent); + } + + @Override + public void toCancel() { + + } + }); + actionDialog.show(); + ToastX.showShortToast(R.string.yebz_txt); + + return; + } + number = Float.parseFloat(viewBinding.numberHintEt.getText().toString().trim()); +// PayDialog payDialog = new PayDialog(PaymentActivity.this, number + "", true); +// payDialog.setOntoAlbumListener(new PayDialog.OnListItemClickListener() { +// @Override +// public void onPayPass(String position) { +// toChange(position, number); +// } +// +// @Override +// public void dimess() { +// +// } +// }); +// payDialog.show(); + if (DataUtils.get(PaymentActivity.this, "hasMianMi", false) && number <= 1000) { + toChange(null, number, 2); + } else { + if (DataUtils.get(PaymentActivity.this, "hasFinger", false)) { + showPayCashFingerDialog(); + } else { + showPayCashDialog(); + } + } + + } else { + ToastX.showShortToast(R.string.hqqbxxsb_tx); + + } + } + } + } else { + ToastX.showShortToast(R.string.hqqbxxsb_tx); + + } + + }); + + viewBinding.numberHintEt.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) { + String input = s.toString(); + if (input.startsWith(".")) { + viewBinding.numberHintEt.setText("0" + viewBinding.numberHintEt.getText().toString()); + } + if (input.contains(".")) { + int dotIndex = input.indexOf("."); + if (input.length() - dotIndex - 1 > 2) { + viewBinding.numberHintEt.setText(input.substring(0, dotIndex + 3)); + } + } + viewBinding.numberHintEt.setSelection(viewBinding.numberHintEt.getText().length()); + } + + @Override + public void afterTextChanged(Editable s) { + + } + }); + } + + private String getDialogUserName() { + return String.format(getString(R.string.fukuangei_txt), userType == 0 ? userInfo.getName() : getString(R.string.shangjia_txt)); + } + + private void showPayCashDialog() { + payDialog = new PayCashDialog(PaymentActivity.this, number + "", true, 0, walletBean, + null, 2, getDialogUserName()); + if (DataUtils.get(PaymentActivity.this, "hasMianMi", false) && ((int) (number * 100) > 1000 * 100)) { + payDialog = new PayCashDialog(PaymentActivity.this, number + "", true, 0, walletBean, + null, 2, getDialogUserName(), getString(R.string.zfjecgxz_txt)); + } + payDialog.setOntoAlbumListener(new PayCashDialog.OnListItemClickListener() { + @Override + public void onPayPass(String position) { + toChange(position, number, 1); + + } + + @RequiresApi(api = Build.VERSION_CODES.M) + @Override + public void onChangeFinger() { + showPayCashFingerDialog(); + } + + @Override + public void dimess() { + payDialog.dismiss(); + + } + }); + payDialog.show(); + } + + private void showPayCashFingerDialog() { + //Context context, String data, boolean showNumber, int payType, WalletBean walletBean, SelectPayTypeDialog.OnToTypeListener onToTypeListener, int isShowFinger + payCashFingerDialog = new PayCashFingerDialog(this, number + "", true, 0, walletBean, null, 2, + getDialogUserName()); + if (DataUtils.get(PaymentActivity.this, "hasMianMi", false) && ((int) (number * 100) > 1000 * 100)) { + payCashFingerDialog = new PayCashFingerDialog(this, number + "", true, 0, walletBean, null, 2, + getDialogUserName(), getString(R.string.zfjecgxz_txt)); + } + payCashFingerDialog.setOntoAlbumListener(new PayCashFingerDialog.OnListItemClickListener() { + @Override + public void onChangePassword() { + showPayCashDialog(); + } + + @Override + public void toFinger() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + checkPayFinger(); + } + } + + @Override + public void dimess() { + payCashFingerDialog.dismiss(); + } + }); + payCashFingerDialog.show(); + } + + @RequiresApi(api = Build.VERSION_CODES.M) + private void checkPayFinger() { + + FingerManager.build().setApplication(IMApplication.getInstance()) + .setTitle(" ") + .setDes(" ") + .setNegativeText(" ") + .setFingerCheckCallback(new SimpleFingerCheckCallback() { + + @Override + public void onSucceed() { + ToastX.showShortToast("验证成功"); + payCashFingerDialog.dismiss(); + toChange(null, number, 2); + + } + + @Override + public void onError(String error) { + ToastX.showShortToast("验证失败"); + + } + + @Override + public void onCancel() { + ToastX.showShortToast("您取消了识别"); + + } + }) + .setFingerChangeCallback(new AonFingerChangeCallback() { + + @Override + protected void onFingerDataChange() { + ToastX.showShortToast("指纹数据发生了变化"); + FingerManager.updateFingerData(PaymentActivity.this); + new Handler().postDelayed(() -> checkPayFinger(), 1000); + } + }) + .create() + .startListener(PaymentActivity.this); + } + + + private void showDialog() { + + ActionConfirmDialog actionDialog = new ActionConfirmDialog(PaymentActivity.this, + getString(R.string.bind_phone_des_txt), getString(R.string.nobind_txt), getString(R.string.tobind_txt)); + actionDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + Intent intent = new Intent(PaymentActivity.this, ChangeAccoutActionActivity.class); + intent.putExtra("type", ChangeAccoutActionActivity.TYPE_BIND_PHONE); + startActivity(intent); + } + + @Override + public void toCancel() { + + } + }); + actionDialog.show(); + } + + private void showDialogPay() { + + ActionConfirmDialog actionDialog = new ActionConfirmDialog(PaymentActivity.this, + getString(R.string.bind_phone_des_txt1), getString(com.netease.yunxin.kit.chatkit.ui.R.string.cancel_txt), getString(com.netease.yunxin.kit.chatkit.ui.R.string.to_sett_txt)); + actionDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { +// Intent intent = new Intent(PaymentActivity.this, ChangeAccoutActionActivity.class); +// intent.putExtra("type", ChangeAccoutActionActivity.TYPE_CHANGE_PAY_PASSWORD); +// startActivity(intent); + Intent intent = new Intent(PaymentActivity.this, SetPayPasswordActivity.class); + startActivity(intent); + } + + @Override + public void toCancel() { + + } + }); + actionDialog.show(); + } + + + private void toChange(String password, float number, int type) { + KeyboardUtil.hideSoftInput(this); + if (userType == 0) { + transfer(password, number, type); + } else { + transferBiz(password, number, type); + } + + } + + private void transfer(String password, float number, int type) { + HashMap maps = new HashMap<>(); + maps.put("amount", (int) (number * 100)); + maps.put("senderUid", Integer.parseInt(IMKitClient.account())); + maps.put("receiverUid", Integer.parseInt(userId)); + if (!TextUtils.isEmpty(password)) { + maps.put("payPassword", password); + } + if (!TextUtils.isEmpty(viewBinding.memoEt.getText().toString().trim())) { + maps.put("remark", viewBinding.memoEt.getText().toString().trim()); + } + maps.put("coinType", 0); + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + maps.put("payVerifyCode", type); + maps.put("receiptType", 2); + + Api.getInstance().transferMoney(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result feedbackResp) { + Intent intent = new Intent(PaymentActivity.this, PaymentSuccessActivity.class); + intent.putExtra("bean", feedbackResp.data); + intent.putExtra("name", userName); + + startActivity(intent); + finish(); + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast(msg); + + } + }); + } + + private void transferBiz(String password, float number, int type) { + KeyboardUtil.hideSoftInput(this); + Map maps = new HashMap<>(); + maps.put("amount", number); + maps.put("payVerifyCode", type); + if (!TextUtils.isEmpty(password)) { + maps.put("payPassword", password); + } + if (!TextUtils.isEmpty(viewBinding.memoEt.getText().toString().trim())) { + maps.put("remark", viewBinding.memoEt.getText().toString().trim()); + } + maps.put("bizId", userId); + Api.getInstance().transferCashPay(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result feedbackResp) { + ToastX.showShortToast(getString(R.string.zhiufuchengg_txt)); + finish(); + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast(msg); + + } + }); + + + } + + + @Override + protected void onResume() { + super.onResume(); + getWallet(); + bindInfo(); + } + + + private void bindInfo() { +// if (u != null) { + Api.getInstance().bindInfo(IMKitClient.account()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + bindBean = feedbackResp.data; + + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + } + }); +// } + } + + private void getWallet() { + Api.getInstance().walletInfo(IMKitClient.account()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { + walletBean = feedbackResp.data; + } + + @Override + public void onError(int code, String msg) { +// WidgetUtils.showToast(getActivity(), msg, WidgetUtils.ToastType.ERROR); + + } + }); + + + } + + public boolean onTouchEvent(MotionEvent event) { + if (null != this.getCurrentFocus()) { + /** + * 点击空白位置 隐藏软键盘 + */ + InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + return mInputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0); + } + return super.onTouchEvent(event); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/pay/PaymentActivity1.java b/app/src/main/java/com/dskj/rbchat/pay/PaymentActivity1.java new file mode 100644 index 0000000..6a84800 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/pay/PaymentActivity1.java @@ -0,0 +1,950 @@ + +package com.dskj.rbchat.pay; + +import static com.netease.yunxin.kit.contactkit.ui.ContactConstant.LIB_TAG; + +import android.content.Intent; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.view.inputmethod.InputMethodManager; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; +import androidx.appcompat.widget.AppCompatImageView; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.codersun.fingerprintcompat.AonFingerChangeCallback; +import com.codersun.fingerprintcompat.FingerManager; +import com.codersun.fingerprintcompat.SimpleFingerCheckCallback; +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.ActivityPayment1Binding; +import com.dskj.rbchat.databinding.ActivityPaymentBinding; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.dialog.PayCashDialog; +import com.dskj.rbchat.dialog.PayCashFingerDialog; +import com.dskj.rbchat.main.MainActivity; +import com.dskj.rbchat.main.mine.ChangeAccoutActionActivity; +import com.dskj.rbchat.model.BindBean; +import com.dskj.rbchat.model.LoginBean; +import com.dskj.rbchat.model.UsersExistBean; +import com.dskj.rbchat.model.WalletBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.AdaptScreenUtils; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.KeyboardUtil; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.utils.ShareDateUtils; +import com.dskj.rbchat.wallet.SetPayPasswordActivity; +import com.dskj.rbchat.wallet.WalletInfoActivity; +import com.google.android.material.bottomsheet.BottomSheetDialog; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.friend.FriendService; +import com.netease.nimlib.sdk.msg.MessageBuilder; +import com.netease.nimlib.sdk.msg.MsgService; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.nimlib.sdk.msg.model.IMMessage; +import com.netease.nimlib.sdk.msg.model.RecentContact; +import com.netease.nimlib.sdk.uinfo.UserService; +import com.netease.nimlib.sdk.uinfo.model.NimUserInfo; +import com.netease.yunxin.kit.alog.ALog; +import com.netease.yunxin.kit.chatkit.repo.ChatRepo; +import com.netease.yunxin.kit.chatkit.repo.ContactRepo; +import com.netease.yunxin.kit.chatkit.ui.adapter.CommonAdapter; +import com.netease.yunxin.kit.chatkit.ui.adapter.ViewHolder; +import com.netease.yunxin.kit.chatkit.ui.custom.TransferAttachment; +import com.netease.yunxin.kit.chatkit.ui.model.TransferBean; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.common.ui.viewmodel.LoadStatus; +import com.netease.yunxin.kit.common.ui.widgets.BackTitleBar; +import com.netease.yunxin.kit.common.ui.widgets.ContactAvatarView; +import com.netease.yunxin.kit.contactkit.ui.model.ContactBlackListBean; +import com.netease.yunxin.kit.contactkit.ui.utils.ColorUtils; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.model.FriendInfo; +import com.netease.yunxin.kit.corekit.im.model.UserInfo; +import com.netease.yunxin.kit.corekit.im.provider.FetchCallback; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class PaymentActivity1 extends BaseActivity { + + PayCashFingerDialog payCashFingerDialog; + WalletBean walletBean; + BindBean bindBean; + float number = 0; + PayCashDialog payDialog; + ActivityPayment1Binding viewBinding; + String userId; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + getWindow().setStatusBarColor(getResources().getColor(R.color.color_fcfcfc)); + getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white)); + + super.onCreate(savedInstanceState); + viewBinding = ActivityPayment1Binding.inflate(getLayoutInflater()); + setContentView(viewBinding.getRoot()); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + initView(); + } + viewBinding.layoutSelectLy.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + showShareBusiness(); + } + }); + viewBinding.userinfoLy.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + showShareBusiness(); + } + }); + + } + + private void changeUserInfo() { +// NimUserInfo userInfo = NIMClient.getService(UserService.class).getUserInfo(userId); + Api.getInstance().userInfo(userId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result feedbackResp) { + if (feedbackResp.data != null) { + LoginBean bean = feedbackResp.data; + viewBinding.layoutSelectLy.setVisibility(View.GONE); + viewBinding.userinfoLy.setVisibility(View.VISIBLE); + viewBinding.userNameTv.setText(bean.getNickname()); + ColorUtils.loadAvator(bean.getUserAvatarFileName(), viewBinding.userHeadIv); + viewBinding.cheatid.setText("CHATID:" + bean.getNwId()); + } else { + viewBinding.layoutSelectLy.setVisibility(View.VISIBLE); + viewBinding.userinfoLy.setVisibility(View.GONE); + } + } + + @Override + public void onError(int code, String msg) { + viewBinding.layoutSelectLy.setVisibility(View.VISIBLE); + viewBinding.userinfoLy.setVisibility(View.GONE); + } + }); +// if (userInfo != null) { +// viewBinding.layoutSelectLy.setVisibility(View.GONE); +// viewBinding.userinfoLy.setVisibility(View.VISIBLE); +// viewBinding.userNameTv.setText(userInfo.getName()); +// ColorUtils.loadAvator(userInfo.getAvatar(),viewBinding.userHeadIv); +//// viewBinding.userHeadIv.setData(, userInfo.getName()); +// +// viewBinding.cheatid.setText("CHATID:" + userInfo.getAccount() + ""); +// +// } else { +// viewBinding.layoutSelectLy.setVisibility(View.VISIBLE); +// viewBinding.userinfoLy.setVisibility(View.GONE); +// } + } + + /** + * + */ + @RequiresApi(api = Build.VERSION_CODES.M) + protected void initView() { + viewBinding.contactListActivityTitleBar.getBackImageView().setOnClickListener(v -> finish()); + + viewBinding.tvLogin.setOnClickListener(v -> { + + if (bindBean != null) { + if (!bindBean.getPhoneBind()) { + showDialog(); + } else { + if (!bindBean.getPayPasswordSet()) { + showDialogPay(); + } else { + if (viewBinding.userinfoLy.getVisibility() == View.GONE) { + ToastX.showShortToast(R.string.qxxzzzdx_txt); + return; + } + + + if (TextUtils.isEmpty(viewBinding.numberHintEt.getText().toString().trim())) { + ToastX.showShortToast(R.string.zzjebnwk_txt); + return; + } + float number1 = Float.parseFloat(viewBinding.numberHintEt.getText().toString().trim()) * 100; + if (number1 < 1) { + ToastX.showShortToast(R.string.zzjebnsy_txt); + return; + } + + if (walletBean != null) { + if (Float.parseFloat(viewBinding.numberHintEt.getText().toString().trim()) > (walletBean.getGoldCoin() / 100f)) { + + ActionConfirmDialog actionDialog = new ActionConfirmDialog(PaymentActivity1.this, + getString(R.string.sfqcz_txt), getString(R.string.general_cancel), getString(R.string.quchongzhi_txt)); + actionDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + Intent intent = new Intent(PaymentActivity1.this, WalletInfoActivity.class); + intent.putExtra("isG", true); + startActivity(intent); + } + + @Override + public void toCancel() { + + } + }); + actionDialog.show(); + ToastX.showShortToast(R.string.yebz_txt); + + return; + } + number = Float.parseFloat(viewBinding.numberHintEt.getText().toString().trim()); +// PayDialog payDialog = new PayDialog(PaymentActivity.this, number + "", true); +// payDialog.setOntoAlbumListener(new PayDialog.OnListItemClickListener() { +// @Override +// public void onPayPass(String position) { +// toChange(position, number); +// } +// +// @Override +// public void dimess() { +// +// } +// }); +// payDialog.show(); +// if(DataUtils.get(PaymentActivity1.this, "hasMianMi", false)){ +// toChange(null, number, 2); +// }else { + if (DataUtils.get(PaymentActivity1.this, "hasFinger", false)) { + showPayCashFingerDialog(); + + } else { + showPayCashDialog(); + } +// } + + } else { + ToastX.showShortToast(R.string.hqqbxxsb_tx); + + } + } + } + } else { + ToastX.showShortToast(R.string.hqqbxxsb_tx); + + } + + }); + + + viewBinding.numberHintEt.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) { + String input = s.toString(); + if (input.startsWith(".")) { + viewBinding.numberHintEt.setText("0" + viewBinding.numberHintEt.getText().toString()); + } + if (input.contains(".")) { + int dotIndex = input.indexOf("."); + if (input.length() - dotIndex - 1 > 2) { + viewBinding.numberHintEt.setText(input.substring(0, dotIndex + 3)); + } + } + viewBinding.numberHintEt.setSelection(viewBinding.numberHintEt.getText().length()); + } + + @Override + public void afterTextChanged(Editable s) { + + } + }); + getBlacks(); + } + + List blacks = new ArrayList<>(); + + private void getBlacks() { + com.netease.yunxin.kit.chatkit.ui.network.Api.getInstance().blocks() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new com.netease.yunxin.kit.chatkit.ui.network.BaseObserver<>() { + @Override + public void onSuccess(com.netease.yunxin.kit.chatkit.ui.network.Result> feedbackResp) { + blacks = feedbackResp.data; + getLocBlack(); + } + + @Override + public void onError(int code, String msg) { + } + }); + } + + private void getLocBlack() { + List accounts = NIMClient.getService(FriendService.class).getBlackList(); + if (accounts != null) { + if (blacks == null) { + blacks = new ArrayList<>(); + } + for (String user : accounts) { + blacks.add(Integer.parseInt(user)); + } + } + } + + + private void showPayCashDialog() { + payDialog = new PayCashDialog(PaymentActivity1.this, number + "", true, 0, walletBean, + null, 2, getString(R.string.fukuan_txt)); + payDialog.setOntoAlbumListener(new PayCashDialog.OnListItemClickListener() { + @Override + public void onPayPass(String position) { + toChange(position, number, 1); + } + + @RequiresApi(api = Build.VERSION_CODES.M) + @Override + public void onChangeFinger() { + showPayCashFingerDialog(); + } + + @Override + public void dimess() { + payCashFingerDialog.dismiss(); + + } + }); + payDialog.show(); + } + + private void showPayCashFingerDialog() { + //Context context, String data, boolean showNumber, int payType, WalletBean walletBean, SelectPayTypeDialog.OnToTypeListener onToTypeListener, int isShowFinger + payCashFingerDialog = new PayCashFingerDialog(this, number + "", true, 0, walletBean, null, 2, getString(R.string.fukuan_txt)); + payCashFingerDialog.setOntoAlbumListener(new PayCashFingerDialog.OnListItemClickListener() { + @Override + public void onChangePassword() { + showPayCashDialog(); + } + + @Override + public void toFinger() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + checkPayFinger(); + } + } + + @Override + public void dimess() { + payCashFingerDialog.dismiss(); + } + }); + payCashFingerDialog.show(); + } + + @RequiresApi(api = Build.VERSION_CODES.M) + private void checkPayFinger() { + + FingerManager.build().setApplication(IMApplication.getInstance()) + .setTitle(" ") + .setDes(" ") + .setNegativeText(" ") + .setFingerCheckCallback(new SimpleFingerCheckCallback() { + + @Override + public void onSucceed() { + ToastX.showShortToast("验证成功"); + payCashFingerDialog.dismiss(); + toChange(null, number, 2); + } + + @Override + public void onError(String error) { + ToastX.showShortToast("验证失败"); + + } + + @Override + public void onCancel() { + ToastX.showShortToast("您取消了识别"); + + } + }) + .setFingerChangeCallback(new AonFingerChangeCallback() { + + @Override + protected void onFingerDataChange() { +// ToastX.showShortToast("指纹数据发生了变化"); + FingerManager.updateFingerData(PaymentActivity1.this); + new Handler().postDelayed(() -> checkPayFinger(), 1000); + } + }) + .create() + .startListener(PaymentActivity1.this); + } + + + private void showDialog() { + + ActionConfirmDialog actionDialog = new ActionConfirmDialog(PaymentActivity1.this, + getString(R.string.bind_phone_des_txt), getString(R.string.nobind_txt), getString(R.string.tobind_txt)); + actionDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + Intent intent = new Intent(PaymentActivity1.this, ChangeAccoutActionActivity.class); + intent.putExtra("type", ChangeAccoutActionActivity.TYPE_BIND_PHONE); + startActivity(intent); + } + + @Override + public void toCancel() { + + } + }); + actionDialog.show(); + } + + private void showDialogPay() { + + ActionConfirmDialog actionDialog = new ActionConfirmDialog(PaymentActivity1.this, + getString(R.string.bind_phone_des_txt1), getString(com.netease.yunxin.kit.chatkit.ui.R.string.cancel_txt), getString(com.netease.yunxin.kit.chatkit.ui.R.string.to_sett_txt)); + actionDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { +// Intent intent = new Intent(PaymentActivity1.this, ChangeAccoutActionActivity.class); +// intent.putExtra("type", ChangeAccoutActionActivity.TYPE_CHANGE_PAY_PASSWORD); +// startActivity(intent); + Intent intent = new Intent(PaymentActivity1.this, SetPayPasswordActivity.class); + startActivity(intent); + } + + @Override + public void toCancel() { + + } + }); + actionDialog.show(); + } + + + private void toChange(String password, float number, int type) { + KeyboardUtil.hideSoftInput(this); + HashMap maps = new HashMap<>(); + maps.put("amount", (int) (number * 100)); + maps.put("senderUid", Integer.parseInt(IMKitClient.account())); + maps.put("receiverUid", Integer.parseInt(userId)); + if (!TextUtils.isEmpty(password)) { + maps.put("payPassword", password); + } + if (!TextUtils.isEmpty(viewBinding.memoEt.getText().toString().trim())) { + maps.put("remark", viewBinding.memoEt.getText().toString().trim()); + } + maps.put("coinType", 0); + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + maps.put("payVerifyCode", type); + maps.put("receiptType", 1); + + Api.getInstance().transferMoney(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result feedbackResp) { + + TransferBean albumBean1 = feedbackResp.data; + TransferAttachment customerAttachment = new TransferAttachment(albumBean1.getId() + "", + albumBean1.getStatus() + "", albumBean1.getAmount() + "", + albumBean1.getSenderUid() + "", albumBean1.getReceiverUid() + "", + albumBean1.getSendTime(), albumBean1.getReceiveTime(), albumBean1.getRemark(), albumBean1.getCoinType() + ""); + LogUtils.i("获取到的数据:" + GsonUtils.beanToJSONString(customerAttachment)); + toShareMessage(customerAttachment); + + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast(msg); + + } + }); + } + + + private void toShareMessage(TransferAttachment customerAttachment) { + IMMessage customMessage = MessageBuilder.createCustomMessage(userId, SessionTypeEnum.P2P, + getString(com.netease.yunxin.kit.chatkit.ui.R.string.zhuangzhang_chat_txt), customerAttachment); + + LogUtils.i("发送消息结构体:" + GsonUtils.beanToJSONString(customerAttachment)); + if (customMessage != null) { + ChatRepo.sendMessage(customMessage, false, new FetchCallback() { + @Override + public void onSuccess(@Nullable Void unused) { + finish(); + } + + @Override + public void onFailed(int i) { + } + + @Override + public void onException(@Nullable Throwable throwable) { + + } + }); + } + } + + @Override + protected void onResume() { + super.onResume(); + getWallet(); + bindInfo(); + } + + + private void bindInfo() { +// if (u != null) { + Api.getInstance().bindInfo(IMKitClient.account()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + bindBean = feedbackResp.data; + + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + } + }); +// } + } + + private void getWallet() { + Api.getInstance().walletInfo(IMKitClient.account()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { + walletBean = feedbackResp.data; + if (walletBean != null) { + viewBinding.jinbiTv.setText(String.format(getString(R.string.qbyf_txt), walletBean.getGoldCoin() / 100f)); +// viewBinding.yinbiTv.setText(String.format("%.2f", walletBean.getSilverCoin() / 100f)); + } else { + viewBinding.jinbiTv.setText(String.format(getString(R.string.qbyf_txt), 0f)); +// viewBinding.yinbiTv.setText(String.format("%.2f", 0f)); + } + } + + @Override + public void onError(int code, String msg) { +// WidgetUtils.showToast(getActivity(), msg, WidgetUtils.ToastType.ERROR); + + } + }); + + + } + + + /*************************************************以下是去转账的流程***************************************************************/ + private LinearLayout layoutSelectorroot; + private BackTitleBar title; + private EditText editSelectorFriends; + private AppCompatImageView icCleanEdit; + private LinearLayout layoutSearchlist; + private RecyclerView contactSearchlistView; + private LinearLayout layoutContactlist; + private RecyclerView contactLast; + private RecyclerView contactListViewMylove; + private TextView tvContactmember; + private RecyclerView contactListView; + private TextView zuijinTv; + private TextView tebieTv; + List zuijinUsers; + List usersExistBeanList; + List users; + + private void showShareBusiness() { + BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(PaymentActivity1.this, com.netease.yunxin.kit.chatkit.ui.R.style.BottomSheetDialog); + + View bottomView = LayoutInflater.from(PaymentActivity1.this).inflate(com.netease.yunxin.kit.chatkit.ui.R.layout.fun_contact_selector_dialog, null); + layoutSelectorroot = (LinearLayout) bottomView.findViewById(com.netease.yunxin.kit.chatkit.ui.R.id.layout_selectorroot); + title = (BackTitleBar) bottomView.findViewById(com.netease.yunxin.kit.chatkit.ui.R.id.title); + editSelectorFriends = (EditText) bottomView.findViewById(com.netease.yunxin.kit.chatkit.ui.R.id.edit_selector_friends); + icCleanEdit = (AppCompatImageView) bottomView.findViewById(com.netease.yunxin.kit.chatkit.ui.R.id.ic_clean_edit); + layoutSearchlist = (LinearLayout) bottomView.findViewById(com.netease.yunxin.kit.chatkit.ui.R.id.layout_searchlist); + contactSearchlistView = (RecyclerView) bottomView.findViewById(com.netease.yunxin.kit.chatkit.ui.R.id.contact_searchlistView); + layoutContactlist = (LinearLayout) bottomView.findViewById(com.netease.yunxin.kit.chatkit.ui.R.id.layout_contactlist); + contactLast = (RecyclerView) bottomView.findViewById(com.netease.yunxin.kit.chatkit.ui.R.id.contact_last); + contactListViewMylove = (RecyclerView) bottomView.findViewById(com.netease.yunxin.kit.chatkit.ui.R.id.contact_listView_mylove); + tvContactmember = (TextView) bottomView.findViewById(com.netease.yunxin.kit.chatkit.ui.R.id.tv_contactmember); + contactListView = (RecyclerView) bottomView.findViewById(com.netease.yunxin.kit.chatkit.ui.R.id.contact_listView); + title.getBackImageView().setImageResource(com.netease.yunxin.kit.chatkit.ui.R.drawable.map_colose_img); + editSelectorFriends.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) { + if (TextUtils.isEmpty(editSelectorFriends.getText().toString())) { + initDataDialog(true, null); + } else { + initDataDialog(true, editSelectorFriends.getText().toString()); + } + } + + @Override + public void afterTextChanged(Editable s) { + + } + }); + + zuijinTv = (TextView) bottomView.findViewById(com.netease.yunxin.kit.chatkit.ui.R.id.zuijin_tv); + tebieTv = (TextView) bottomView.findViewById(com.netease.yunxin.kit.chatkit.ui.R.id.tebie_tv); + initDataDialog(false, null); + initAdapterLast(bottomSheetDialog); + initAdapterLover(bottomSheetDialog); + initAdapterUser(bottomSheetDialog); + title.getBackImageView().setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + bottomSheetDialog.dismiss(); + } + }); + bottomSheetDialog.setContentView(bottomView); + bottomSheetDialog.show(); + + bottomSheetDialog.setOnDismissListener(dialog -> PaymentActivity1.this.getWindow().setNavigationBarColor(getResources().getColor(com.netease.yunxin.kit.chatkit.ui.R.color.color_white))); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + AdaptScreenUtils.setWhiteNavigationBar(bottomSheetDialog); + } + } + + private void initDataDialog(boolean isChange, String fifter) { + fifterDataDialog(fifter); + if (isChange) { + if (zuijinUsers != null) { + commonAdapterReadContents.setDates(zuijinUsers); + } + if (usersExistBeanList != null) { + commonAdapterLover.setDates(usersExistBeanList); + } + if (users != null) { + commonAdapterReadContentsAll.setDates(users); + } + } + } + + + private void fifterDataDialog(String fifter) { + List recentContact = NIMClient.getService(MsgService.class).queryRecentContactsBlock(); + List users1 = new ArrayList<>(); + if (recentContact != null && recentContact.size() > 0) { + for (RecentContact recentContact1 : recentContact) { + if (recentContact1.getSessionType() == SessionTypeEnum.P2P) { + users1.add(recentContact1.getContactId()); + } + } + } + zuijinUsers = NIMClient.getService(UserService.class).getUserInfoList(users1); + if (zuijinUsers != null) { + for (int i = 0; i < zuijinUsers.size(); i++) { + if (ContactRepo.isBlackList(zuijinUsers.get(i).getAccount()) + || !ContactRepo.isFriend(zuijinUsers.get(i).getAccount())) { + zuijinUsers.remove(i); + } + + } + + } + + usersExistBeanList = getFollowUsers(); + + List friends = NIMClient.getService(FriendService.class).getFriendAccounts(); + if (friends.size() > 0) { + users = NIMClient.getService(UserService.class).getUserInfoList(friends); + for (int i = 0; i < users.size(); i++) { + if (ContactRepo.isBlackList(users.get(i).getAccount())) { + users.remove(i); + } + + } + for (int i = 0; i < users.size(); i++) { + if (users.get(i).getAccount().equals(IMKitClient.account())) { + users.remove(i); + break; + } + + } + } + + if (!TextUtils.isEmpty(fifter)) { + if (zuijinUsers != null && zuijinUsers.size() > 0) { + List nimUserInfos = new ArrayList<>(); + for (int i = 0; i < zuijinUsers.size(); i++) { + if (zuijinUsers.get(i).getName().contains(fifter)) { + nimUserInfos.add(zuijinUsers.get(i)); + } + } + zuijinUsers = nimUserInfos; + } + + if (usersExistBeanList != null && usersExistBeanList.size() > 0) { + List nimUserInfos = new ArrayList<>(); + for (int i = 0; i < usersExistBeanList.size(); i++) { + if (usersExistBeanList.get(i).getNickname().contains(fifter)) { + nimUserInfos.add(usersExistBeanList.get(i)); + } + } + usersExistBeanList = nimUserInfos; + } + + if (users != null && users.size() > 0) { + List nimUserInfos = new ArrayList<>(); + for (int i = 0; i < users.size(); i++) { + if (users.get(i).getName().contains(fifter)) { + nimUserInfos.add(users.get(i)); + } + } + users = nimUserInfos; + } + + } + + if (zuijinUsers != null) { + for (int i = 0; i < zuijinUsers.size(); i++) { + // 获取迭代器 + Iterator it = blacks.iterator(); + while (it.hasNext()) { + Integer str = it.next(); + if ((str + "").equals(zuijinUsers.get(i).getAccount())) { + zuijinUsers.remove(i); + break; + } + } + + } + } + + if (usersExistBeanList != null) { + for (int i = 0; i < usersExistBeanList.size(); i++) { + // 获取迭代器 + Iterator it = blacks.iterator(); + while (it.hasNext()) { + Integer str = it.next(); + if ((str + "").equals(usersExistBeanList.get(i).getUserId() + "")) { + usersExistBeanList.remove(i); + break; + } + } + + } + } + + if (users != null) { + for (int i = 0; i < users.size(); i++) { + // 获取迭代器 + Iterator it = blacks.iterator(); + while (it.hasNext()) { + Integer str = it.next(); + if ((str + "").equals(users.get(i).getAccount())) { + users.remove(i); + break; + } + } + + } + } + + + int size1 = 0; + int size2 = 0; + int size3 = 0; + if (zuijinUsers != null && zuijinUsers.size() > 0) { + size1 = zuijinUsers.size(); + } + if (usersExistBeanList != null && usersExistBeanList.size() > 0) { + size2 = usersExistBeanList.size(); + } + if (users != null && users.size() > 0) { + size3 = users.size(); + } + zuijinTv.setText(getString(com.netease.yunxin.kit.chatkit.ui.R.string.jinjinlianxi_txt) + " " + size1); + tebieTv.setText(getString(com.netease.yunxin.kit.chatkit.ui.R.string.tebieguanxin_txt) + " " + size2); + tvContactmember.setText(getString(com.netease.yunxin.kit.chatkit.ui.R.string.all_txt) + " " + size3); + + } + + CommonAdapter commonAdapterReadContentsAll; + + private void initAdapterUser(BottomSheetDialog bottomSheetDialog) { + + if (users != null && users.size() > 0) { + tvContactmember.setVisibility(View.VISIBLE); + contactListView.setVisibility(View.VISIBLE); + contactListView.setLayoutManager(new LinearLayoutManager(PaymentActivity1.this)); + commonAdapterReadContentsAll = new CommonAdapter(PaymentActivity1.this, com.netease.yunxin.kit.chatkit.ui.R.layout.follow_child_item, users) { + @Override + public void convert(ViewHolder holder, NimUserInfo s, int index) { + ContactAvatarView contactAvatarView = holder.getView(com.netease.yunxin.kit.chatkit.ui.R.id.logo_iv); +// contactAvatarView.setData( +// s.getAvatar(), s.getName()); + ColorUtils.loadAvator(s.getAvatar(), contactAvatarView); + holder.setText(com.netease.yunxin.kit.chatkit.ui.R.id.item_title_tv, s.getName()); + + holder.getView(com.netease.yunxin.kit.chatkit.ui.R.id.big_ly).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + bottomSheetDialog.dismiss(); + userId = s.getAccount(); + changeUserInfo(); + } + }); + } + + + }; + contactListView.setAdapter(commonAdapterReadContentsAll); + + } else { + tvContactmember.setVisibility(View.GONE); + contactListView.setVisibility(View.GONE); + } + } + + CommonAdapter commonAdapterLover; + + private void initAdapterLover(BottomSheetDialog bottomSheetDialog) { + + if (usersExistBeanList != null && usersExistBeanList.size() > 0) { + tebieTv.setVisibility(View.VISIBLE); + contactListViewMylove.setVisibility(View.VISIBLE); + + contactListViewMylove.setLayoutManager(new LinearLayoutManager(PaymentActivity1.this)); + commonAdapterLover = new CommonAdapter(PaymentActivity1.this, com.netease.yunxin.kit.chatkit.ui.R.layout.follow_child_item, usersExistBeanList) { + @Override + public void convert(ViewHolder holder, UsersExistBean s, int index) { + ContactAvatarView contactAvatarView = holder.getView(com.netease.yunxin.kit.chatkit.ui.R.id.logo_iv); + Log.i("异常数据:", "异常数据:" + com.netease.yunxin.kit.chatkit.ui.common.GsonUtils.beanToJSONString(s)); + ColorUtils.loadAvator(s.getAvatar(), contactAvatarView); +// contactAvatarView.setData( +// s.getAvatar(), s.getNickname()); + holder.setText(com.netease.yunxin.kit.chatkit.ui.R.id.item_title_tv, s.getNickname()); + + holder.getView(com.netease.yunxin.kit.chatkit.ui.R.id.big_ly).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + bottomSheetDialog.dismiss(); + userId = s.getUserId() + ""; + changeUserInfo(); + } + }); + } + + + }; + contactListViewMylove.setAdapter(commonAdapterLover); + + } else { + tebieTv.setVisibility(View.GONE); + contactListViewMylove.setVisibility(View.GONE); + } + } + + /** + * 获取所有关注的用户 + * + * @return + */ + private List getFollowUsers() { + return ShareDateUtils.getFollowUsers(); + } + + CommonAdapter commonAdapterReadContents; + + private void initAdapterLast(BottomSheetDialog bottomSheetDialog) { + + if (zuijinUsers != null && zuijinUsers.size() > 0) { + zuijinTv.setVisibility(View.VISIBLE); + contactLast.setVisibility(View.VISIBLE); + + contactLast.setLayoutManager(new LinearLayoutManager(PaymentActivity1.this)); + commonAdapterReadContents = new CommonAdapter(PaymentActivity1.this, com.netease.yunxin.kit.chatkit.ui.R.layout.follow_child_item, zuijinUsers) { + @Override + public void convert(ViewHolder holder, NimUserInfo s, int index) { + ContactAvatarView contactAvatarView = holder.getView(com.netease.yunxin.kit.chatkit.ui.R.id.logo_iv); + ColorUtils.loadAvator(s.getAvatar(), contactAvatarView); +// contactAvatarView.setData( +// s.getAvatar(), s.getName()); + holder.setText(com.netease.yunxin.kit.chatkit.ui.R.id.item_title_tv, s.getName()); + + holder.getView(com.netease.yunxin.kit.chatkit.ui.R.id.big_ly).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + bottomSheetDialog.dismiss(); + userId = s.getAccount(); + changeUserInfo(); + } + }); + } + + + }; + contactLast.setAdapter(commonAdapterReadContents); + + } else { + zuijinTv.setVisibility(View.GONE); + contactLast.setVisibility(View.GONE); + } + + + } + /*************************************************以上是去转账的流程***************************************************************/ + + public boolean onTouchEvent(MotionEvent event) { + if(null != this.getCurrentFocus()){ + /** + * 点击空白位置 隐藏软键盘 + */ + InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + return mInputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0); + } + return super .onTouchEvent(event); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/pay/PaymentSuccessActivity.java b/app/src/main/java/com/dskj/rbchat/pay/PaymentSuccessActivity.java new file mode 100644 index 0000000..b0a5ccc --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/pay/PaymentSuccessActivity.java @@ -0,0 +1,77 @@ + +package com.dskj.rbchat.pay; + +import android.content.Intent; +import android.os.Build; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; + +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; + +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.ActivityPaymentSuccessBinding; + +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.uinfo.UserService; +import com.netease.nimlib.sdk.uinfo.model.NimUserInfo; +import com.netease.yunxin.kit.chatkit.ui.model.TransferBean; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; + + +public class PaymentSuccessActivity extends BaseActivity { + TransferBean transferBean; + ActivityPaymentSuccessBinding viewBinding; + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + getWindow().setStatusBarColor(getResources().getColor(R.color.color_fcfcfc)); + getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white)); + + super.onCreate(savedInstanceState); + viewBinding = ActivityPaymentSuccessBinding.inflate(getLayoutInflater()); + setContentView(viewBinding.getRoot()); + transferBean = (TransferBean) getIntent().getSerializableExtra("bean"); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + initView(); + } + NimUserInfo userInfo = NIMClient.getService(UserService.class).getUserInfo(transferBean.getReceiverUid()+""); + if(userInfo!=null){ + viewBinding.shoukuanfangTv.setText(userInfo.getName()); + }else{ + viewBinding.shoukuanfangTv.setText(getIntent().getStringExtra("name")); + } + if(TextUtils.isEmpty(transferBean.getRemark())){ + viewBinding.fukuanbeizhuTv.setText(getString(R.string.wu_txt)); + + }else{ + viewBinding.fukuanbeizhuTv.setText(transferBean.getRemark()); + } + viewBinding.numberTv.setText(String.format("%.2f",transferBean.getAmount()/100f)); + + } + /** + */ + @RequiresApi(api = Build.VERSION_CODES.M) + protected void initView() + { + viewBinding.contactListActivityTitleBar.getBackImageView().setOnClickListener(v -> finish()); + + viewBinding.buttonTv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + } + + + @Override + protected void onResume() { + super.onResume(); + + } + + +} diff --git a/app/src/main/java/com/dskj/rbchat/push/HWPushMessageService.java b/app/src/main/java/com/dskj/rbchat/push/HWPushMessageService.java new file mode 100644 index 0000000..7518902 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/push/HWPushMessageService.java @@ -0,0 +1,38 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.push; + +import com.huawei.hms.push.RemoteMessage; +import com.netease.yunxin.kit.alog.ALog; + +public class HWPushMessageService extends com.netease.nimlib.sdk.mixpush.HWPushMessageService { + + private static final String TAG = "HWPushMessageService"; + + public void onNewToken(String token) { + ALog.i(TAG, " onNewToken, token=" + token); + } + + /** + * 透传消息, 需要用户自己弹出通知 + * + * @param remoteMessage + */ + public void onMessageReceived(RemoteMessage remoteMessage) { + ALog.i(TAG, " onMessageReceived"); + } + + public void onMessageSent(String s) { + ALog.i(TAG, " onMessageSent"); + } + + public void onDeletedMessages() { + ALog.i(TAG, " onDeletedMessages"); + } + + public void onSendError(String var1, Exception var2) { + ALog.e(TAG, " onSendError, " + var1, var2); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/push/PushMessageHandler.java b/app/src/main/java/com/dskj/rbchat/push/PushMessageHandler.java new file mode 100644 index 0000000..3620fd2 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/push/PushMessageHandler.java @@ -0,0 +1,71 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.push; + +import android.app.Activity; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import com.netease.nimlib.sdk.NimIntent; +import com.netease.nimlib.sdk.StatusBarNotificationConfig; +import com.netease.nimlib.sdk.mixpush.MixPushMessageHandler; +import com.netease.nimlib.sdk.msg.MessageBuilder; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.nimlib.sdk.msg.model.IMMessage; +import com.dskj.rbchat.NimSDKOptionConfig; +import java.util.ArrayList; +import java.util.Map; + +public class PushMessageHandler implements MixPushMessageHandler { + + public static final String PAYLOAD_SESSION_ID = "sessionID"; + public static final String PAYLOAD_SESSION_TYPE = "sessionType"; + + @Override + public boolean onNotificationClicked(Context context, Map payload) { + String sessionId = payload.get(PAYLOAD_SESSION_ID); + String type = payload.get(PAYLOAD_SESSION_TYPE); + // + if (sessionId != null && type != null) { + int typeValue = Integer.valueOf(type); + ArrayList imMessages = new ArrayList<>(); + IMMessage imMessage = + MessageBuilder.createEmptyMessage(sessionId, SessionTypeEnum.typeOfValue(typeValue), 0); + imMessages.add(imMessage); + Intent notifyIntent = new Intent(); + notifyIntent.setComponent(initLaunchComponent(context)); + notifyIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); + notifyIntent.setAction(Intent.ACTION_VIEW); + notifyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 必须 + notifyIntent.putExtra(NimIntent.EXTRA_NOTIFY_CONTENT, imMessages); + + context.startActivity(notifyIntent); + return true; + } else { + return false; + } + } + + private ComponentName initLaunchComponent(Context context) { + ComponentName launchComponent; + StatusBarNotificationConfig config = NimSDKOptionConfig.loadStatusBarNotificationConfig(); + Class entrance = config.notificationEntrance; + if (entrance == null) { + launchComponent = + context + .getPackageManager() + .getLaunchIntentForPackage(context.getPackageName()) + .getComponent(); + } else { + launchComponent = new ComponentName(context, entrance); + } + return launchComponent; + } + + @Override + public boolean cleanMixPushNotifications(int pushType) { + return false; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/push/PushUserInfoProvider.java b/app/src/main/java/com/dskj/rbchat/push/PushUserInfoProvider.java new file mode 100644 index 0000000..23c57f6 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/push/PushUserInfoProvider.java @@ -0,0 +1,119 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.push; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import android.text.TextUtils; +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.RequestOptions; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.RequestCallbackWrapper; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.nimlib.sdk.msg.model.IMMessage; +import com.netease.nimlib.sdk.nos.NosService; +import com.netease.nimlib.sdk.team.model.Team; +import com.netease.nimlib.sdk.uinfo.UserInfoProvider; +import com.netease.nimlib.sdk.uinfo.model.UserInfo; +import com.dskj.rbchat.R; +import com.netease.yunxin.kit.corekit.im.provider.TeamProvider; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +public class PushUserInfoProvider implements UserInfoProvider { + + private Context context; + + public PushUserInfoProvider(Context context) { + this.context = context; + } + + @Override + public UserInfo getUserInfo(String account) { + return com.netease.yunxin.kit.corekit.im.provider.UserInfoProvider.getUserInfoLocal(account); + } + + @Override + public String getDisplayNameForMessageNotifier( + String account, String sessionId, SessionTypeEnum sessionType) { + return null; + } + + @Override + public Bitmap getAvatarForMessageNotifier(SessionTypeEnum sessionType, String sessionId) { + /* + * get from cache + */ + Bitmap bm = null; + int defResId = R.mipmap.ic_notification_avatar_default; + CountDownLatch countDownLatch = new CountDownLatch(1); + final String[] originUrl = new String[1]; + if (SessionTypeEnum.P2P == sessionType) { + UserInfo user = getUserInfo(sessionId); + originUrl[0] = user != null ? user.getAvatar() : null; + } else if (SessionTypeEnum.Team == sessionType) { + Team team = TeamProvider.INSTANCE.getTeamById(sessionId); + originUrl[0] = team != null ? team.getIcon() : null; + } + NIMClient.getService(NosService.class) + .getOriginUrlFromShortUrl(originUrl[0]) + .setCallback( + new RequestCallbackWrapper() { + + @Override + public void onResult(int code, String result, Throwable exception) { + originUrl[0] = result; + countDownLatch.countDown(); + } + }); + try { + countDownLatch.await(200, TimeUnit.MILLISECONDS); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + if (!TextUtils.isEmpty(originUrl[0])) { + bm = getNotificationBitmapFromCache(originUrl[0]); + } + if (bm == null) { + if (SessionTypeEnum.Team == sessionType || SessionTypeEnum.SUPER_TEAM == sessionType) { + defResId = R.mipmap.ic_notification_avatar_group; + } + Drawable drawable = context.getResources().getDrawable(defResId); + if (drawable instanceof BitmapDrawable) { + bm = ((BitmapDrawable) drawable).getBitmap(); + } + } + return bm; + } + + @Override + public String getDisplayTitleForMessageNotifier(IMMessage message) { + return null; + } + + public Bitmap getNotificationBitmapFromCache(String url) { + if (TextUtils.isEmpty(url)) { + return null; + } + final int imageSize = (int) context.getResources().getDimension(R.dimen.dp_48); + Bitmap cachedBitmap = null; + try { + cachedBitmap = + Glide.with(context) + .asBitmap() + .load(url) + .apply(new RequestOptions().centerCrop().override(imageSize, imageSize)) + .submit() + .get(200, TimeUnit.MILLISECONDS) // 最大等待200ms + ; + } catch (Exception e) { + e.printStackTrace(); + } + return cachedBitmap; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/redpack/ReceiveRedPacketActivity.java b/app/src/main/java/com/dskj/rbchat/redpack/ReceiveRedPacketActivity.java new file mode 100644 index 0000000..88ecb8c --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/redpack/ReceiveRedPacketActivity.java @@ -0,0 +1,502 @@ +package com.dskj.rbchat.redpack; + +import android.annotation.SuppressLint; +import android.content.Intent; +import android.graphics.Color; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.model.LoginBean; +import com.dskj.rbchat.network.Api; + +import androidx.annotation.Nullable; +import androidx.constraintlayout.widget.ConstraintSet; +import androidx.recyclerview.widget.LinearLayoutManager; + +import com.dskj.rbchat.R; + +import com.dskj.rbchat.databinding.ActivityReceiveRedPacketBinding; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.ImageCacheLoader; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.wallet.WalletInfoActivity; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.uinfo.UserService; +import com.netease.nimlib.sdk.uinfo.model.NimUserInfo; +import com.netease.yunxin.kit.chatkit.ui.common.ChatDataUtils; +import com.netease.yunxin.kit.chatkit.ui.common.RxBus; +import com.netease.yunxin.kit.chatkit.ui.model.GrabbersBean; +import com.netease.yunxin.kit.chatkit.ui.model.RedpacketBean; +import com.netease.yunxin.kit.chatkit.ui.model.RedpacketGroupBean; +import com.netease.yunxin.kit.chatkit.ui.model.RxHongBaoBean; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; + +import java.util.ArrayList; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +import com.netease.yunxin.kit.common.ui.utils.AvatarColor; +import com.netease.yunxin.kit.common.ui.widgets.ContactAvatarView; +import com.netease.yunxin.kit.contactkit.ui.utils.ColorUtils; +import com.netease.yunxin.kit.corekit.im.IMKitClient; + +public class ReceiveRedPacketActivity extends BaseActivity implements View.OnClickListener { + boolean isGroup = false; + + CommonAdapter commonAdapter; + RedpacketBean redpacketBean = null; + RedpacketGroupBean redpacketGroupBean = null; + String name; + String uid; + String fileName; + private ArrayList titles = new ArrayList<>(); + private ActivityReceiveRedPacketBinding viewBinding; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + getWindow().setStatusBarColor(getResources().getColor(R.color.transparent)); + getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white)); + super.onCreate(savedInstanceState); + viewBinding = ActivityReceiveRedPacketBinding.inflate(getLayoutInflater()); + setContentView(viewBinding.getRoot()); + initView(); + + } + + protected void initView() { + viewBinding.contactListActivityTitleBar.getTitleTextView().setText(getString(R.string.hbxq_txt)); + + viewBinding.contactListActivityTitleBar.getBackImageView().setOnClickListener(v -> finish()); + viewBinding.contactListActivityTitleBar.getBackImageView().setImageResource(R.mipmap.back_img1); + viewBinding.contactListActivityTitleBar.getTitleTextView().setTextColor(getResources().getColor(com.netease.yunxin.kit.chatkit.ui.R.color.color_white)); + + isGroup = getIntent().getBooleanExtra("isGroup", false); + if (!isGroup) { + redpacketBean = (RedpacketBean) getIntent().getSerializableExtra("bean"); + if (redpacketBean.getCoinType() == null || redpacketBean.getCoinType() == 0) { + viewBinding.zhutiBg.setBackgroundResource(R.mipmap.red_packet_top_bg); + viewBinding.bileixinIv.setImageResource(R.mipmap.wallet_jinbi_img); + } else { + viewBinding.zhutiBg.setBackgroundResource(R.mipmap.red_packet_top_bg_s); + viewBinding.bileixinIv.setImageResource(R.mipmap.wallet_yinbi_img); + viewBinding.numberTv.setTextColor(getResources().getColor(com.netease.yunxin.kit.chatkit.ui.R.color.color_3e7be4)); + viewBinding.toWalletTv.setTextColor(getResources().getColor(com.netease.yunxin.kit.chatkit.ui.R.color.color_3e7be4)); + viewBinding.endTypeIv.setImageResource(R.mipmap.wallet_yinbi_img); + + } + + } else { + redpacketGroupBean = (RedpacketGroupBean) getIntent().getSerializableExtra("bean"); + if (redpacketGroupBean.getCoinType() == null || redpacketGroupBean.getCoinType() == 0) { + viewBinding.zhutiBg.setBackgroundResource(R.mipmap.red_packet_top_bg); + viewBinding.bileixinIv.setImageResource(R.mipmap.wallet_jinbi_img); + + } else if (redpacketGroupBean.getCoinType() == 1) { + viewBinding.zhutiBg.setBackgroundResource(R.mipmap.red_packet_top_bg_s); + viewBinding.bileixinIv.setImageResource(R.mipmap.wallet_yinbi_img); + viewBinding.numberTv.setTextColor(getResources().getColor(com.netease.yunxin.kit.chatkit.ui.R.color.color_3e7be4)); + viewBinding.toWalletTv.setTextColor(getResources().getColor(com.netease.yunxin.kit.chatkit.ui.R.color.color_3e7be4)); + viewBinding.endTypeIv.setImageResource(R.mipmap.wallet_yinbi_img); + } else { + viewBinding.contactListActivityTitleBar.getTitleTextView().setText(getString(R.string.lqxq_txt)); + viewBinding.contactListActivityTitleBar.getTitleTextView().setTextColor(Color.parseColor("#FFEBCA")); + ConstraintSet constraintSet = new ConstraintSet(); + constraintSet.clone(viewBinding.zhutiCl); + constraintSet.setDimensionRatio(R.id.zhuti_bg, "h,375:130"); + constraintSet.applyTo(viewBinding.zhutiCl); + LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) viewBinding.layoutReceiveContent.getLayoutParams(); + params.setMargins(0, 0, 0, 0); + viewBinding.layoutReceiveContent.setLayoutParams(params); + viewBinding.zhutiBg.setBackgroundResource(R.mipmap.red_packet_top_bg_g); + viewBinding.bileixinIv.setVisibility(View.GONE); + viewBinding.numberTv.setTextColor(Color.parseColor("#F6BB31")); + viewBinding.titleTipsTvuser.setTextColor(Color.parseColor("#7F7B81")); + } + + } + name = getIntent().getStringExtra("name"); + uid = getIntent().getStringExtra("uid"); + fileName = getIntent().getStringExtra("fileName"); + + if (isGroup) { + viewBinding.groupRedLy.setVisibility(View.VISIBLE); + viewBinding.userRedLy.setVisibility(View.GONE); + getUserInfo(redpacketGroupBean.getSenderUid() + ""); + initList(); +// setList(); + getRedInfoGroup(redpacketGroupBean); + + } else { + viewBinding.groupRedLy.setVisibility(View.GONE); + viewBinding.userRedLy.setVisibility(View.VISIBLE); +// titleTv.setText(name + getString(R.string.red_envelope_issued_txt)); + viewBinding.numberTv.setText(String.format("%.2f", redpacketBean.getAmount() / 100f)); + getUserInfo(redpacketBean.getSenderUid() + ""); + getRedInfo(); + } +// +// ImageCacheLoader.loadAvatarImgWithGlide(ReceiveRedPacketActivity.this, uid, fileName +// , titleIv, 18, R.drawable.default_cir, false, false); + +// viewBinding.numberTv2.setText(getTypeName()); + } + + //设置礼金红包View + private void setGiftRedPacketView() { + + + } + + private boolean getJinToYin() { + if (isGroup) { + if (redpacketGroupBean.getCoinType() == null || redpacketGroupBean.getCoinType() == 0) { + return true; + } else { + return false; + } + } else { + if (redpacketBean.getCoinType() == null || redpacketBean.getCoinType() == 0) { + return true; + } else { + return false; + } + } + } + + private void getUserInfo(String user_uid) { + Api.getInstance().userInfo(user_uid) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + if (user_uid.equals(IMKitClient.account())) { + if (isGroup) { + if (redpacketGroupBean.getCoinType() == null || redpacketGroupBean.getCoinType() == 0) { + viewBinding.titleTv.setText(getString(R.string.wo_txt) + getString(R.string.red_envelope_issued_txt)); + } else if (redpacketGroupBean.getCoinType() == 1) { + viewBinding.titleTv.setText(getString(R.string.wo_txt) + getString(R.string.red_envelope_issued_txt1)); + } else { + viewBinding.titleTv.setText(getString(R.string.wo_txt) + getString(R.string.red_envelope_issued_txt2)); + viewBinding.titleTv.setCompoundDrawablesWithIntrinsicBounds(null, null, getResources().getDrawable(R.mipmap.left_pin_gift), null); + + } + } else { + if (redpacketBean.getCoinType() == null || redpacketBean.getCoinType() == 0) { + viewBinding.titleTv.setText(getString(R.string.wo_txt) + getString(R.string.red_envelope_issued_txt)); + } else { + viewBinding.titleTv.setText(getString(R.string.wo_txt) + getString(R.string.red_envelope_issued_txt1)); + } + } + } else { + if (isGroup) { + if (redpacketGroupBean.getCoinType() == null || redpacketGroupBean.getCoinType() == 0) { + viewBinding.titleTv.setText(feedbackResp.data.getNickNameWithRemark() + getString(R.string.red_envelope_issued_txt)); + } else if (redpacketGroupBean.getCoinType() == 1) { + viewBinding.titleTv.setText(feedbackResp.data.getNickNameWithRemark() + getString(R.string.red_envelope_issued_txt1)); + } else { + viewBinding.titleTv.setText(feedbackResp.data.getNickNameWithRemark() + getString(R.string.red_envelope_issued_txt2)); + viewBinding.titleTv.setCompoundDrawablesWithIntrinsicBounds(null, null, getResources().getDrawable(R.mipmap.left_pin_gift), null); + + } + } else { + if (redpacketBean.getCoinType() == null || redpacketBean.getCoinType() == 0) { + viewBinding.titleTv.setText(feedbackResp.data.getNickNameWithRemark() + getString(R.string.red_envelope_issued_txt)); + } else { + viewBinding.titleTv.setText(feedbackResp.data.getNickNameWithRemark() + getString(R.string.red_envelope_issued_txt1)); + } + } + + } + + ColorUtils.loadAvator(feedbackResp.data.getUserAvatarFileName(), viewBinding.titleIv); +// viewBinding.titleIv.setData( +// feedbackResp.data.getUserAvatarFileName(), feedbackResp.data.getNickNameWithRemark(), AvatarColor.avatarColor(feedbackResp.data.getUserUid()+"")); + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); +// WidgetUtils.showToast(getActivity(), msg, WidgetUtils.ToastType.ERROR); + } + }); + } + + private void getUserInfoRec(String user_uid) { + Api.getInstance().userInfo(user_uid) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + + viewBinding.titleTv.setText(feedbackResp.data.getNickNameWithRemark() + ""); + ColorUtils.loadAvator(feedbackResp.data.getUserAvatarFileName(), viewBinding.titleIv); + +// viewBinding.titleIv.setData( +// feedbackResp.data.getUserAvatarFileName(), feedbackResp.data.getNickNameWithRemark(), AvatarColor.avatarColor(feedbackResp.data.getUserUid()+"")); + + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); +// WidgetUtils.showToast(getActivity(), msg, WidgetUtils.ToastType.ERROR); + } + }); + } + + protected void getRedInfoGroup(RedpacketGroupBean redpacketBean) { + if (redpacketBean.getCoinType() == 2) { + Api.getInstance().redGroupGiftPacketInfo(redpacketBean.getId() + "") + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + redpacketGroupBean = feedbackResp.data; + titles = (ArrayList) redpacketGroupBean.getGrabbers(); + ChatDataUtils.set(ReceiveRedPacketActivity.this, "redpack_" + redpacketGroupBean.getId(), redpacketGroupBean.getStatus()); + RxBus.getInstance().post(new RxHongBaoBean(redpacketGroupBean.getId() + "")); + setList(); + + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到数据ERROR:" + code + ";;" + msg); + + } + }); + } else { + Api.getInstance().redGroupPacketInfo(redpacketBean.getId() + "") + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + redpacketGroupBean = feedbackResp.data; + titles = (ArrayList) redpacketGroupBean.getGrabbers(); + ChatDataUtils.set(ReceiveRedPacketActivity.this, "redpack_" + redpacketGroupBean.getId(), redpacketGroupBean.getStatus()); + RxBus.getInstance().post(new RxHongBaoBean(redpacketGroupBean.getId() + "")); + setList(); + + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到数据ERROR:" + code + ";;" + msg); + + } + }); + } + + } + + + protected void getRedInfo() { + chagneBean(); + Api.getInstance().redPacketInfo(redpacketBean.getId() + "") + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + redpacketBean = feedbackResp.data; + ChatDataUtils.set(ReceiveRedPacketActivity.this, "redpack_" + redpacketBean.getId(), redpacketBean.getStatus()); + RxBus.getInstance().post(new RxHongBaoBean(redpacketBean.getId() + "")); + chagneBean(); + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到数据ERROR:" + code + ";;" + msg); + + } + }); + } + + private void chagneBean() { + if (redpacketBean.getStatus() == 0) { + viewBinding.toWalletTv.setText(R.string.ddfglq_txt); +// titleTipsTvuser.setText(String.format("1个红包共%s%.2f",getString(R.string.danwei_txt), redpacketBean.getAmount() / 100f)); + if (redpacketBean.getCoinType() == 0) { + viewBinding.titleTipsTvuser.setText(getString(R.string.red_envelope_amount_txt) + String.format("%.2f", redpacketBean.getAmount() / 100f) + getTypeName() + ",等待对方领取"); + } else { + viewBinding.titleTipsTvuser.setText(getString(R.string.red_envelope_amount_txt) + String.format("%.2f", redpacketBean.getAmount() / 100f) + getTypeName() + ",等待对方领取"); + } + + } else if (redpacketBean.getStatus() == 1) { + if (redpacketBean.getCoinType() == 0) { + viewBinding.titleTipsTvuser.setText("1个红包,共" + String.format("%.2f", redpacketBean.getAmount() / 100f) + getTypeName()); + } else { + viewBinding.titleTipsTvuser.setText("1个红包,共" + String.format("%.2f", redpacketBean.getAmount() / 100f) + getTypeName()); + } + + viewBinding.toWalletTv.setText(getString(R.string.to_wallet_send_redpack_txt)); + + viewBinding.toWalletTv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(ReceiveRedPacketActivity.this, WalletInfoActivity.class); + intent.putExtra("isG", redpacketBean.getCoinType().equals(0)); + startActivity(intent); + + } + }); + if (IMKitClient.account().equals(redpacketBean.getSenderUid() + "")) { + viewBinding.toWalletTv.setText(R.string.hbyblq_txt); + } + + viewBinding.endLy.setVisibility(View.GONE); + viewBinding.priceTv.setText(String.format("%.2f", redpacketBean.getAmount() / 100f) + getTypeName()); + viewBinding.timeTv.setText(redpacketBean.getReceiveTime() + ""); + + if ((redpacketBean.getReceiverUid() + "").equals(IMKitClient.account())) { + viewBinding.titleTv1.setText(IMKitClient.getUserInfo().getName()); + viewBinding.logoIv.setData( + IMKitClient.getUserInfo().getAvatar(), IMKitClient.getUserInfo().getName()); + + } else { + NimUserInfo user = NIMClient.getService(UserService.class).getUserInfo(redpacketBean.getReceiverUid() + ""); + if (user != null) { + viewBinding.titleTv1.setText(user.getName()); + viewBinding.logoIv.setData( + user.getAvatar(), user.getName()); + } else { + getUserInfoRec(redpacketBean.getReceiverUid() + ""); + + } + } + } else { + viewBinding.toWalletTv.setText(R.string.hbygq_txt); + } + + if (TextUtils.isEmpty(redpacketBean.getRemark())) { + viewBinding.noteTv.setText(R.string.remarks_hit_txt); + } else { + viewBinding.noteTv.setText(redpacketBean.getRemark()); + } + } + + @SuppressLint("StringFormatMatches") + private void setList() { + if (titles != null) { + commonAdapter.setDates(titles); + } + viewBinding.numberTv1Ly.setVisibility(View.GONE); + if (redpacketGroupBean.getType().equals("0")) { +// binding.titleTipsTv.setText(bonusBean.getBonus().getNumber() + getString(R.string.red_envelopes_in_total) + String.format("%.2f", Integer.parseInt(bonusBean.getBonus().getMoney().trim()) / 100f) + getString(R.string.danwei_txt)); + viewBinding.titleTipsTv.setText(String.format(getString(R.string.red_envelopes_in_total), redpacketGroupBean.getCount() + "", String.format("%.2f", redpacketGroupBean.getAmount() / 100f))); + + } else { + if (redpacketGroupBean.getGrabbers() == null || redpacketGroupBean.getGrabbers().size() == 0) { + if (redpacketGroupBean.getStatus() == 2) { + viewBinding.titleTipsTv.setText(getString(R.string.hbxq_yiguoqi_txt) + getString(R.string.received_txt1) + "0/" + redpacketGroupBean.getCount() + getString(R.string.ge_gong_txt) + "0.00" + "/" + String.format("%.2f", redpacketGroupBean.getAmount() / 100f)); + } else { + viewBinding.titleTipsTv.setText(getString(R.string.received_txt1) + "0/" + redpacketGroupBean.getCount() + getString(R.string.ge_gong_txt) + "0.00" + "/" + String.format("%.2f", redpacketGroupBean.getAmount() / 100f)); + } + } else { + int size = 0; + for (int i = 0; i < redpacketGroupBean.getGrabbers().size(); i++) { + size += redpacketGroupBean.getGrabbers().get(i).getGrabAmount(); + if ((redpacketGroupBean.getGrabbers().get(i).getGrabberUid() + "").equals(IMKitClient.account())) { + viewBinding.numberTv1Ly.setVisibility(View.VISIBLE); + viewBinding.numberTv1.setText(String.format("%.2f", redpacketGroupBean.getGrabbers().get(i).getGrabAmount() / 100f)); +// viewBinding. numberTv3.setText(getTypeName()); + if (redpacketGroupBean.getCoinType() == 0) { + viewBinding.numberTv3.setImageResource(R.mipmap.wallet_jinbi_img); + } else if (redpacketGroupBean.getCoinType() == 1) { + viewBinding.numberTv3.setImageResource(R.mipmap.wallet_yinbi_img); + } else { + viewBinding.numberTv1.setTextColor(Color.parseColor("#F6BB31")); + viewBinding.numberTv3.setVisibility(View.GONE); + } + } + } + if (redpacketGroupBean.getStatus() == 2) { + viewBinding.titleTipsTv.setText(getString(R.string.hbxq_yiguoqi_txt) + getString(R.string.received_txt1) + redpacketGroupBean.getGrabbers().size() + "/" + redpacketGroupBean.getCount() + getString(R.string.ge_gong_txt) + + String.format("%.2f", size / 100f) + "/" + String.format("%.2f", redpacketGroupBean.getAmount() / 100f)); + } else { + viewBinding.titleTipsTv.setText(getString(R.string.received_txt1) + redpacketGroupBean.getGrabbers().size() + "/" + redpacketGroupBean.getCount() + getString(R.string.ge_gong_txt) + + String.format("%.2f", size / 100f) + "/" + String.format("%.2f", redpacketGroupBean.getAmount() / 100f)); + + } + + + } + } + +// if(redpacketGroupBean.getStatus()>1){ +// titleTipsTv.setText(titleTipsTv.getText()+" "+ getString(R.string.hbygq_txt)); +// } + + if (TextUtils.isEmpty(redpacketGroupBean.getRemark())) { + viewBinding.noteTv.setText(R.string.remarks_hit_txt); + } else { + viewBinding.noteTv.setText(redpacketGroupBean.getRemark()); + } + } + + private void initList() { + viewBinding.recyclerView.setLayoutManager(new LinearLayoutManager(this)); + commonAdapter = new CommonAdapter(ReceiveRedPacketActivity.this, R.layout.item_red_list, titles) { + @Override + public void convert(ViewHolder holder, GrabbersBean s, int index) { + TextView tvprice = holder.getView(R.id.price_tv); + holder.setText(R.id.title_tv, s.getGrabberNickname()); + holder.setText(R.id.time_tv, s.getGrabTime() + ""); + tvprice.setText(String.format("%.2f", s.getGrabAmount() / 100f)); + ContactAvatarView imageView = holder.getView(R.id.logo_iv); + LogUtils.i("数据是啥:" + GsonUtils.beanToJSONString(s)); + ImageView imageView1 = holder.getView(R.id.item_type_iv); + if (isGroup && redpacketGroupBean.getCoinType() == 2) { + imageView1.setVisibility(View.GONE); + tvprice.setTextColor(Color.parseColor("#E4543E")); + } else { + tvprice.setTextColor(getResources().getColor(android.R.color.black)); + imageView1.setVisibility(View.VISIBLE); + imageView1.setImageResource(getTypeNameImg()); + } + ColorUtils.loadAvator(s.getGrabberAvatar(), imageView); +// imageView.setData( +// s.getGrabberAvatar(), s.getGrabberNickname()); + } + }; + viewBinding.recyclerView.setAdapter(commonAdapter); + } + + private String getTypeName() { +// if(isGroup){ +// return (redpacketGroupBean.getCoinType()==null||redpacketGroupBean.getCoinType()==0)?getString(R.string.species_txt):getString(R.string.silver_coins_txt); +// }else{ +// return (redpacketBean.getCoinType()==null||redpacketBean.getCoinType()==0)?getString(R.string.species_txt):getString(R.string.silver_coins_txt); +// +// } + return ""; + } + + private Integer getTypeNameImg() { + if (isGroup) { + return (redpacketGroupBean.getCoinType() == null || redpacketGroupBean.getCoinType() == 0) ? R.mipmap.wallet_jinbi_img : R.mipmap.wallet_yinbi_img; + } else { + return (redpacketBean.getCoinType() == null || redpacketBean.getCoinType() == 0) ? R.mipmap.wallet_jinbi_img : R.mipmap.wallet_yinbi_img; + + } + } + + + @Override + public void onClick(View v) { + + } +} diff --git a/app/src/main/java/com/dskj/rbchat/redpack/SendGiftRedPacketActivity.java b/app/src/main/java/com/dskj/rbchat/redpack/SendGiftRedPacketActivity.java new file mode 100644 index 0000000..b3fba64 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/redpack/SendGiftRedPacketActivity.java @@ -0,0 +1,857 @@ + +package com.dskj.rbchat.redpack; + +import android.app.Activity; +import android.content.Intent; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.view.inputmethod.InputMethodManager; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; + +import com.codersun.fingerprintcompat.AonFingerChangeCallback; +import com.codersun.fingerprintcompat.FingerManager; +import com.codersun.fingerprintcompat.SimpleFingerCheckCallback; +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.ActivitySendGiftRedpacketBinding; +import com.dskj.rbchat.databinding.ActivitySendRedPacketBinding; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.dialog.PayCashDialog; +import com.dskj.rbchat.dialog.PayCashFingerDialog; +import com.dskj.rbchat.model.BindBean; +import com.dskj.rbchat.model.LoginBean; +import com.dskj.rbchat.model.WalletBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.AdaptScreenUtils; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.wallet.WalletInfoActivity; +import com.google.android.material.bottomsheet.BottomSheetDialog; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.msg.MessageBuilder; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.nimlib.sdk.msg.model.IMMessage; +import com.netease.nimlib.sdk.team.TeamService; +import com.netease.nimlib.sdk.team.model.Team; +import com.netease.yunxin.kit.chatkit.repo.ChatRepo; +import com.netease.yunxin.kit.chatkit.ui.custom.RedPacketAttachment; +import com.netease.yunxin.kit.chatkit.ui.model.GrabbersBean; +import com.netease.yunxin.kit.chatkit.ui.model.GrabbersBean1; +import com.netease.yunxin.kit.chatkit.ui.model.RedpacketBean; +import com.netease.yunxin.kit.chatkit.ui.model.RedpacketGroupBean; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.provider.FetchCallback; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +/** + * 礼金红包 + */ +public class SendGiftRedPacketActivity extends BaseActivity { + + boolean isGroup = true; + private boolean isPinShouQi = true; + LoginBean u; + WalletBean walletBean; + int maxNumber = 100; + + private boolean isJinBi = true; + private ActivitySendGiftRedpacketBinding viewBinding; + PayCashFingerDialog payCashFingerDialog; + PayCashDialog payDialog; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + getWindow().setStatusBarColor(getResources().getColor(R.color.color_fffbfb)); + getWindow().setNavigationBarColor(getResources().getColor(R.color.color_eee9e9)); + + super.onCreate(savedInstanceState); + viewBinding = ActivitySendGiftRedpacketBinding.inflate(getLayoutInflater()); + setContentView(viewBinding.getRoot()); + + initView(); + initListeners(); + } + + /** + * + */ + protected void initView() { + + viewBinding.sendredpacketActivityTitleBar.getBackImageView().setImageResource(R.mipmap.dialog_colose_img); + viewBinding.sendredpacketActivityTitleBar.getBackImageView().setOnClickListener(v -> finish()); + Team user = NIMClient.getService(TeamService.class).queryTeamBlock(getIntent().getStringExtra("receiverUid")); + if (user != null) { + viewBinding.tipsNamesTv.setText(String.format(getString(R.string.hbq_tips_txt), user.getMemberCount())); + maxNumber = user.getMemberCount(); + } +// isGroup = getIntent().getBooleanExtra("isGroup", false); +// setTitle(getString(R.string.hbxq_txt)); + + +// u = lu1(); + + // 设置标题(自定义标题栏后的title文本设置是不同的哦,见CustomeTitleBar中的说明) +// this.setTitle(getString(R.string.fshb_txt)); +// if (isGroup) { +// viewBinding.jintLeftTv.setText(R.string.zjine_txt); +// viewBinding.groupRedLy.setVisibility(View.VISIBLE); +// viewBinding.tipsTv.setVisibility(View.VISIBLE); + + +// GroupEntity groupEntity = MyApplication.getInstance2().getIMClientManager().getGroupsProvider().getGroupInfoByGid(getIntent().getStringExtra("receiverUid")); +// if (groupEntity != null) { +// maxNumber = Integer.parseInt(groupEntity.getG_member_count()); +// } +// LogUtils.i(getString(R.string.qunrenyuanshu_txt) + maxNumber); +// if (user != null) { +// viewBinding.tipsNamesTv.setText(String.format(getString(R.string.hbq_tips_txt), user.getMemberCount())); +// maxNumber = user.getMemberCount(); +// } +// } + + + } + + private TextView coloseIv; + private LinearLayout ftLy; + private LinearLayout jtLy; + + private void selectType() { + BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(this, R.style.BottomSheetDialog); + + View bottomView = LayoutInflater.from(SendGiftRedPacketActivity.this).inflate(R.layout.bottom_sheet_red_type_layout, null); + coloseIv = (TextView) bottomView.findViewById(R.id.colose_iv); + ftLy = (LinearLayout) bottomView.findViewById(R.id.ft_ly); + jtLy = (LinearLayout) bottomView.findViewById(R.id.jt_ly); + + + ftLy.setOnClickListener(v -> { + bottomSheetDialog.dismiss(); + isPinShouQi = true; + changeType(); + }); + jtLy.setOnClickListener(v -> { + bottomSheetDialog.dismiss(); + isPinShouQi = false; + changeType(); + }); + coloseIv.setOnClickListener(v -> bottomSheetDialog.dismiss()); + bottomSheetDialog.setContentView(bottomView); + bottomSheetDialog.show(); + + bottomSheetDialog.setOnDismissListener(dialog -> getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white))); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + AdaptScreenUtils.setWhiteNavigationBar(bottomSheetDialog); + } + + } + + @Override + protected void onResume() { + super.onResume(); + getWallet(); + bindInfo(); + } + + private void getWallet() { + Api.getInstance().walletInfo(IMKitClient.account()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { + walletBean = feedbackResp.data; + if (walletBean != null) { + viewBinding.jinbiTv.setText(String.format(getString(R.string.qbyf_txt), walletBean.getGoldCoin() / 100f)); +// viewBinding.yinbiTv.setText(String.format("%.2f", walletBean.getSilverCoin() / 100f)); + } else { + viewBinding.jinbiTv.setText(String.format(getString(R.string.qbyf_txt), 0f)); +// viewBinding.yinbiTv.setText(String.format("%.2f", 0f)); + } + } + + @Override + public void onError(int code, String msg) { +// WidgetUtils.showToast(getActivity(), msg, WidgetUtils.ToastType.ERROR); + + } + }); + + + } + + private void changeType() { + if (isPinShouQi) { + viewBinding.jintLeftTv.setText(getString(R.string.zjine_txt)); +// tipsTv.setText(String.format(getString(R.string.red_packet_tips_txt), getString(R.string.pinshouqi_txt))); +// tips1Tv.setText(getString(R.string.putong_txt)); + viewBinding.tipsTv.setText(getString(R.string.psjhb_txt)); + viewBinding.numberHintEt.setHint(getString(R.string.red_packet_number_hint_txt)); + if (isGroup) { + Drawable drawable = getResources().getDrawable(R.mipmap.left_pin_img); + drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); + viewBinding.jintLeftTv.setCompoundDrawables(drawable, null, null, null); + } + + } else { + viewBinding.jintLeftTv.setText(R.string.dangejine_txt); + viewBinding.numberHintEt.setHint(getString(R.string.red_packet_number_hint_txt1)); + viewBinding.tipsTv.setText(getString(R.string.pthb_txt)); + viewBinding.jintLeftTv.setCompoundDrawables(null, null, null, null); + + + } + changeInfo(); + } + + BindBean bindBean; + + private void bindInfo() { +// if (u != null) { + Api.getInstance().bindInfo(IMKitClient.account()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + bindBean = feedbackResp.data; + if (bindBean.isAllowSilverCoin() == true) { + viewBinding.topSelectLy.setVisibility(View.GONE); + } else { + viewBinding.topSelectLy.setVisibility(View.GONE); + + } + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + } + }); +// } + } + + float number = 0; + + + protected void initListeners() { + viewBinding.tvLogin.setOnClickListener(v -> { +// if(true){ +// ToastX.showShortToast("敬请期待"); +// return; +// +// } + + if (isGroup) { + if (TextUtils.isEmpty(viewBinding.sizeHintEt.getText().toString().trim())) { + ToastX.showShortToast(R.string.size_not_null_tips_txt); + return; + } + + if (Integer.parseInt(viewBinding.sizeHintEt.getText().toString().trim()) < 1) { + ToastX.showShortToast(R.string.qsrhbgs_txt); + + return; + } + + } + + + if (TextUtils.isEmpty(viewBinding.numberHintEt.getText().toString().trim())) { + ToastX.showShortToast(R.string.number_not_null_tips_txt); + + return; + } + float number1 = Float.parseFloat(viewBinding.numberTv.getText().toString().trim()) * 100; + LogUtils.i("红包金额:" + number1); + if (number1 < 1) { + ToastX.showShortToast(R.string.hbjebnsy_txt); + + return; + } + + if (isGroup) { + float number = Float.parseFloat(viewBinding.numberHintEt.getText().toString().trim()) * 100; + if (number / Integer.parseInt(viewBinding.sizeHintEt.getText().toString().trim()) < 1) { + ToastX.showShortToast(R.string.dghbjebnsy_txt); + + return; + } + + +// if (Float.parseFloat(viewBinding.numberHintEt.getText().toString().trim()) > IMUIKitConfig.GROUP_MAX_MONEY) { +//// ToastUtils.showShort(String.format(getString(R.string.max_red_packet_tips_txt),getString(R.string.danwei_txt),Const.GROUP_MAX_MONEY)); +// ToastX.showShortToast(getString(R.string.dghbjebndy_txt) + " " + IMUIKitConfig.GROUP_MAX_MONEY); +// +// return; +// } + + if (Integer.parseInt(viewBinding.sizeHintEt.getText().toString().trim()) > maxNumber) { + ToastX.showShortToast(R.string.hbgsbncgdqqlzs_txt); + + + return; + } + + } else { + if (Float.parseFloat(viewBinding.numberHintEt.getText().toString().trim()) > IMUIKitConfig.SINGLE_MAX_MONEY) { +// ToastUtils.showShort(String.format(getString(R.string.max_red_packet_tips_txt),getString(R.string.danwei_txt),Const.SINGLE_MAX_MONEY)); + ToastX.showShortToast(getString(R.string.dghbjebndy_txt) + " " + IMUIKitConfig.SINGLE_MAX_MONEY); + + return; + } + } + if (walletBean != null) { + if (Float.parseFloat(viewBinding.numberTv.getText().toString().trim()) > (walletBean.getGiftCoin() / 100f)) { +// new AlertDialog.Builder(SendRedPacketActivity.this) +// .setTitle("余额不足") +// .setMessage("是否去充值金额?") +// .setPositiveButton("去充值", (dialog, which) -> { +// Intent intent = new Intent(SendRedPacketActivity.this, TopActivity.class); +// startActivity(intent); +// }) +// .setNegativeButton($$(R.string.general_cancel), null) +// .show(); + +// ActionConfirmDialog actionDialog = new ActionConfirmDialog(SendGiftRedPacketActivity.this, getString(R.string.sfqcz_txt), getString(R.string.general_cancel), getString(R.string.quchongzhi_txt)); +// actionDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { +// @Override +// public void toSumbit() { +// Intent intent = new Intent(SendGiftRedPacketActivity.this, WalletInfoActivity.class); +// intent.putExtra("isG", true); +// startActivity(intent); +// } +// +// @Override +// public void toCancel() { +// +// } +// }); +// actionDialog.show(); + + + ToastX.showShortToast(R.string.yebz_txt); + + return; + } + number = Float.parseFloat(viewBinding.numberTv.getText().toString().trim()); +// if(isGroup&&!isPinShouQi){ +// number = number*Integer.parseInt(sizeHintEt.getText().toString().trim()); +// } + hideSoftInput(this); +// if (isJinBi) { +// PayDialog payDialog = new PayDialog(this, number + "", true); +// payDialog.setOntoAlbumListener(new PayDialog.OnListItemClickListener() { +// @Override +// public void onPayPass(String position) { +// toChange(position, number); +// } +// +// @Override +// public void dimess() { +// +// } +// }); +// payDialog.show(); + +// if(DataUtils.get(SendRedPacketActivity.this, "hasMianMi", false)){ +// toChange(null, number,2); +// }else{ + + if (DataUtils.get(SendGiftRedPacketActivity.this, "hasFinger", false)) { + showPayCashFingerDialog(); + + } else { + showPayCashDialog(); + } +// } + + + } else { + ToastX.showShortToast(R.string.hqqbxxsb_txt); + + } + + }); + + viewBinding.sizeHintEt.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) { + if (isGroup) { + changeButtonType(); + } else { + changeButtonChatType(); + } + changeInfo(); + changeStatus(); + } + }); + + viewBinding.numberHintEt.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) { + String input = s.toString(); + if (input.startsWith(".")) { + viewBinding.numberHintEt.setText("0" + viewBinding.numberHintEt.getText().toString()); + } + if (input.contains(".")) { + int dotIndex = input.indexOf("."); + if (input.length() - dotIndex - 1 > 2) { + viewBinding.numberHintEt.setText(input.substring(0, dotIndex + 3)); + } + } + viewBinding.numberHintEt.setSelection(viewBinding.numberHintEt.getText().length()); + + } + + @Override + public void afterTextChanged(Editable s) { + if (isGroup) { + changeButtonType(); + } else { + changeButtonChatType(); + } + changeInfo(); + changeStatus(); + + } + }); + + viewBinding.jinbiLy.setOnClickListener(v -> { + isJinBi = true; + changeTop(); + }); + viewBinding.ytinbiLy.setOnClickListener(v -> { + isJinBi = false; + changeTop(); + }); +// viewBinding.tips1Tv.setOnClickListener(v -> { +// isPinShouQi = false; +// changeType(); +// }); + +// viewBinding.tipsTv.setOnClickListener(v -> { +// isPinShouQi = true; +// changeType(); +// }); + } + + private void showPayCashDialog() { + payDialog = new PayCashDialog(SendGiftRedPacketActivity.this, number + "", true, 0, walletBean, + null, 2, getString(R.string.fahongbao_txt),2); + payDialog.setOntoAlbumListener(new PayCashDialog.OnListItemClickListener() { + @Override + public void onPayPass(String position) { + toChange(position, number, 1); + + } + + @RequiresApi(api = Build.VERSION_CODES.M) + @Override + public void onChangeFinger() { + showPayCashFingerDialog(); + } + + @Override + public void dimess() { + + } + }); + payDialog.show(); + } + + private void showPayCashFingerDialog() { + //Context context, String data, boolean showNumber, int payType, WalletBean walletBean, SelectPayTypeDialog.OnToTypeListener onToTypeListener, int isShowFinger + payCashFingerDialog = new PayCashFingerDialog(this, number + "", true, 0, walletBean, null, 2, getString(R.string.fahongbao_txt),2); + payCashFingerDialog.setOntoAlbumListener(new PayCashFingerDialog.OnListItemClickListener() { + @Override + public void onChangePassword() { + showPayCashDialog(); + + } + + @Override + public void toFinger() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + checkPayFinger(); + } + } + + @Override + public void dimess() { + + } + }); + payCashFingerDialog.show(); + } + + @RequiresApi(api = Build.VERSION_CODES.M) + private void checkPayFinger() { + + FingerManager.build().setApplication(IMApplication.getInstance()) + .setTitle(" ") + .setDes(" ") + .setNegativeText(" ") + .setFingerCheckCallback(new SimpleFingerCheckCallback() { + + @Override + public void onSucceed() { + ToastX.showShortToast("验证成功"); + payCashFingerDialog.dismiss(); + toChange(null, number, 2); + } + + @Override + public void onError(String error) { + ToastX.showShortToast("验证失败"); + + } + + @Override + public void onCancel() { + ToastX.showShortToast("您取消了识别"); + + } + }) + .setFingerChangeCallback(new AonFingerChangeCallback() { + + @Override + protected void onFingerDataChange() { +// ToastX.showShortToast("指纹数据发生了变化"); + FingerManager.updateFingerData(SendGiftRedPacketActivity.this); + new Handler().postDelayed(() -> checkPayFinger(), 1000); + } + }) + .create() + .startListener(SendGiftRedPacketActivity.this); + } + + + /** + * 隐藏软键盘 + */ + public void hideSoftInput(Activity activity) { + InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + if (getCurrentFocus() != null && null != imm) { + imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0); + } +// View view = activity.getCurrentFocus(); +// +// if (view != null) { +// +// InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE); +// +// inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); +// +// } + } + + private void changeTop() { + if (isJinBi) { + viewBinding.jinbiLy.setBackgroundResource(R.drawable.logout_btn_main1); + viewBinding.ytinbiLy.setBackgroundResource(R.drawable.logout_btn_c1); +// tvLogin.setBackgroundResource(R.drawable.logout_btn_red); + viewBinding.tvLogin.setText(getString(R.string.send_in_redenvelope_txt1)); + changeStatus(); + Drawable drawable = getResources().getDrawable(R.mipmap.wallet_jinbi_img); + drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); + viewBinding.numberHintEt.setCompoundDrawables(null, null, drawable, null); + } else { + viewBinding.ytinbiLy.setBackgroundResource(R.drawable.logout_btn_main1); + viewBinding.jinbiLy.setBackgroundResource(R.drawable.logout_btn_c1); +// tvLogin.setBackgroundResource(R.drawable.logout_btn_red1); + viewBinding.tvLogin.setText(getString(R.string.send_in_redenvelope_txt2)); + + changeStatus(); + Drawable drawable = getResources().getDrawable(R.mipmap.wallet_yinbi_img); + drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); + viewBinding.numberHintEt.setCompoundDrawables(null, null, drawable, null); + } + + + } + + + private void changeStatus() { +// if (isJinBi) { +// viewBinding.tvLogin.setBackgroundResource(R.drawable.logout_btn_z_88); +// if (isGroup) { +// if (!TextUtils.isEmpty(viewBinding.numberHintEt.getText().toString().trim()) && !TextUtils.isEmpty(viewBinding.sizeHintEt.getText().toString().trim())) { +// viewBinding.tvLogin.setBackgroundResource(R.drawable.logout_btn_red); +// } +// } else { +// if (!TextUtils.isEmpty(viewBinding.numberHintEt.getText().toString().trim())) { +// viewBinding.tvLogin.setBackgroundResource(R.drawable.logout_btn_red); +// } +// } +// } else { +// viewBinding.tvLogin.setBackgroundResource(R.drawable.logout_btn_sl_88); +// if (isGroup) { +// if (!TextUtils.isEmpty(viewBinding.numberHintEt.getText().toString().trim()) && !TextUtils.isEmpty(viewBinding.sizeHintEt.getText().toString().trim())) { +// viewBinding.tvLogin.setBackgroundResource(R.drawable.logout_btn_sl); +// } +// } else { +// if (!TextUtils.isEmpty(viewBinding.numberHintEt.getText().toString().trim())) { +// viewBinding.tvLogin.setBackgroundResource(R.drawable.logout_btn_sl); +// } +// } +// } + } + + private void changeInfo() { + if (!TextUtils.isEmpty(viewBinding.numberHintEt.getText().toString().trim())) { + if (viewBinding.numberHintEt.getText().toString().trim().equals(".")) { + viewBinding.numberHintEt.setText("0."); + viewBinding.numberHintEt.setSelection(2); + + } + if (viewBinding.numberHintEt.getText().toString().trim().indexOf(".") != -1) { + String[] nams = viewBinding.numberHintEt.getText().toString().trim().split("[.]"); + if (nams.length > 1) { + if (nams[1].length() > 2) { + viewBinding.numberHintEt.setText(nams[0] + "." + nams[1].substring(0, 2)); + viewBinding.numberHintEt.setSelection(viewBinding.numberHintEt.getText().toString().length()); + } + } + } + + float number1 = Float.parseFloat(viewBinding.numberHintEt.getText().toString().trim()); + String text1 = String.format("%.2f", number1); + viewBinding.numberTv.setText(text1); + if (isGroup) { + if (!isPinShouQi) { + if (TextUtils.isEmpty(viewBinding.sizeHintEt.getText().toString().trim())) { + viewBinding.numberTv.setText("0.00"); + } else { + float number = Float.parseFloat(viewBinding.numberHintEt.getText().toString().trim()); + int size = Integer.parseInt(viewBinding.sizeHintEt.getText().toString().trim()); + String text = String.format("%.2f", number * size); + viewBinding.numberTv.setText(text); + + } + } + } + } else { + viewBinding.numberTv.setText("0.00"); + + } + } + + + private void changeButtonChatType() { + + } + + private void changeButtonType() { + + } + + private void toChange(String position, float number, int type) { + if (isGroup) { + HashMap maps = new HashMap<>(); + maps.put("type", isPinShouQi ? 0 : 1); + maps.put("count", viewBinding.sizeHintEt.getText().toString().trim()); + maps.put("amount", (int) (number)); + maps.put("senderUid", Integer.parseInt(IMKitClient.account())); + maps.put("groupId", getIntent().getStringExtra("receiverUid")); + LogUtils.i("群ID:" + getIntent().getStringExtra("receiverUid")); + if (!TextUtils.isEmpty(position)) { + maps.put("payPassword", position); + } + if (!TextUtils.isEmpty(viewBinding.memoEt.getText().toString().trim())) { + maps.put("remark", viewBinding.memoEt.getText().toString().trim()); + } else { + maps.put("remark", getString(R.string.remarks_hit_txt)); + } + maps.put("coinType", 2); + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + maps.put("payVerifyCode", type); + + Api.getInstance().sendGiftRedpacket(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result feedbackResp) { + RedpacketGroupBean groupBean = feedbackResp.data; + //Long id, Integer status, Integer amount, Integer senderUid, String groupId, + // Integer count, Integer residualCount, Integer residualAmount, String sendTime, + // String finishTime, String remark, String senderNickname, Integer coinType, + // List grabbers, Integer receiverUid, String receiveTime + + List grabbersBean1List = null; + if (groupBean.getGrabbers() != null && groupBean.getGrabbers().size() > 0) { + //String redEnvelopeId, String grabberUid, String grabAmount, String grabTime, String grabberNickname, String grabberAvatar + grabbersBean1List = new ArrayList<>(); + for (GrabbersBean grabbersBean : groupBean.getGrabbers()) + grabbersBean1List.add(new GrabbersBean1(grabbersBean.getRedEnvelopeId() + "", grabbersBean.getGrabberUid() + "", + grabbersBean.getGrabAmount() + "", grabbersBean.getGrabTime() + "", grabbersBean.getGrabberNickname(), grabbersBean.getGrabberAvatar())); + } + + + RedPacketAttachment redPacketAttachment = new RedPacketAttachment(groupBean.getId() + "", groupBean.getStatus() + "", groupBean.getAmount() + "", + groupBean.getSenderUid() + "", groupBean.getGroupId(), + groupBean.getCount() + "", groupBean.getResidualCount() + "", groupBean.getResidualAmount() + "", groupBean.getSendTime(), + groupBean.getFinishTime(), groupBean.getRemark(), groupBean.getSenderNickname(), groupBean.getCoinType() + "", + null, null); + toShareMessageGroup(redPacketAttachment); + + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast(msg); + } + }); + + } else { + HashMap maps = new HashMap<>(); + maps.put("amount", (int) (number * 100)); + maps.put("senderUid", Integer.parseInt(IMKitClient.account())); + maps.put("receiverUid", Integer.parseInt(getIntent().getStringExtra("receiverUid"))); + if (!TextUtils.isEmpty(position)) { + maps.put("payPassword", position); + } + if (!TextUtils.isEmpty(viewBinding.memoEt.getText().toString().trim())) { + maps.put("remark", viewBinding.memoEt.getText().toString().trim()); + } else { + maps.put("remark", getString(R.string.remarks_hit_txt)); + } + maps.put("coinType", 2); + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + maps.put("payVerifyCode", type); + + Api.getInstance().sendRedpacket(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result feedbackResp) { + + //Long id, Integer status, Integer amount, Integer senderUid, String groupId, + // Integer count, Integer residualCount, Integer residualAmount, String sendTime, + // String finishTime, String remark, String senderNickname, Integer coinType, + // List grabbers, Integer receiverUid, String receiveTime + RedpacketBean redpacketBean = feedbackResp.data; + RedPacketAttachment redPacketAttachment = new RedPacketAttachment(redpacketBean.getId() + "", redpacketBean.getStatus() + "", redpacketBean.getAmount() + "", + redpacketBean.getSenderUid() + "", null, + 0 + "", 0 + "", 0 + "", redpacketBean.getSendTime(), null, redpacketBean.getRemark(), null, redpacketBean.getCoinType() + "", + redpacketBean.getReceiverUid() + "", redpacketBean.getReceiveTime()); + toShareMessage(redPacketAttachment); + + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast(msg); + } + }); + } + } + + + private void toShareMessage(RedPacketAttachment customerAttachment) { + IMMessage customMessage = MessageBuilder.createCustomMessage(getIntent().getStringExtra("receiverUid"), SessionTypeEnum.P2P, + getString(com.netease.yunxin.kit.chatkit.ui.R.string.hongbao_chat_txt), customerAttachment); + + LogUtils.i("发送消息结构体:" + GsonUtils.beanToJSONString(customerAttachment)); + if (customMessage != null) { + ChatRepo.sendMessage(customMessage, false, new FetchCallback() { + @Override + public void onSuccess(@Nullable Void unused) { + + Intent intent = new Intent(); + setResult(RESULT_OK, intent); + finish(); + } + + @Override + public void onFailed(int i) { + } + + @Override + public void onException(@Nullable Throwable throwable) { + + } + }); + } + } + + private void toShareMessageGroup(RedPacketAttachment customerAttachment) { + IMMessage customMessage = MessageBuilder.createCustomMessage(getIntent().getStringExtra("receiverUid"), SessionTypeEnum.Team, + getString(com.netease.yunxin.kit.chatkit.ui.R.string.hongbao_chat_txt), customerAttachment); + + LogUtils.i("发送消息结构体:" + GsonUtils.beanToJSONString(customerAttachment)); + if (customMessage != null) { + ChatRepo.sendMessage(customMessage, false, new FetchCallback() { + @Override + public void onSuccess(@Nullable Void unused) { + + Intent intent = new Intent(); + setResult(RESULT_OK, intent); + finish(); + } + + @Override + public void onFailed(int i) { + } + + @Override + public void onException(@Nullable Throwable throwable) { + + } + }); + } + } + + public boolean onTouchEvent(MotionEvent event) { + if (null != this.getCurrentFocus()) { + /** + * 点击空白位置 隐藏软键盘 + */ + InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + return mInputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0); + } + return super.onTouchEvent(event); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/redpack/SendRedPacketActivity.java b/app/src/main/java/com/dskj/rbchat/redpack/SendRedPacketActivity.java new file mode 100644 index 0000000..1f72d0c --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/redpack/SendRedPacketActivity.java @@ -0,0 +1,878 @@ + +package com.dskj.rbchat.redpack; + +import android.app.Activity; +import android.content.Intent; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.view.inputmethod.InputMethodManager; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; + + +import com.codersun.fingerprintcompat.AonFingerChangeCallback; +import com.codersun.fingerprintcompat.FingerManager; +import com.codersun.fingerprintcompat.SimpleFingerCheckCallback; +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; + +import com.dskj.rbchat.databinding.ActivitySendRedPacketBinding; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.dialog.PayCashDialog; +import com.dskj.rbchat.dialog.PayCashFingerDialog; +import com.dskj.rbchat.dialog.PayDialog; +import com.dskj.rbchat.dialog.SelectPayTypeDialog; +import com.dskj.rbchat.model.BindBean; +import com.dskj.rbchat.model.LoginBean; +import com.dskj.rbchat.model.WalletBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.pay.CollectionAndPaymentActivity; +import com.dskj.rbchat.utils.AdaptScreenUtils; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.wallet.PaySettingActivity; +import com.dskj.rbchat.wallet.WalletInfoActivity; +import com.google.android.material.bottomsheet.BottomSheetDialog; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.msg.MessageBuilder; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.nimlib.sdk.msg.model.IMMessage; +import com.netease.nimlib.sdk.team.TeamService; +import com.netease.nimlib.sdk.team.model.Team; +import com.netease.nimlib.sdk.uinfo.UserService; +import com.netease.nimlib.sdk.uinfo.model.NimUserInfo; +import com.netease.yunxin.kit.chatkit.repo.ChatRepo; +import com.netease.yunxin.kit.chatkit.ui.custom.RedPacketAttachment; +import com.netease.yunxin.kit.chatkit.ui.model.GrabbersBean; +import com.netease.yunxin.kit.chatkit.ui.model.GrabbersBean1; +import com.netease.yunxin.kit.chatkit.ui.model.RedpacketBean; +import com.netease.yunxin.kit.chatkit.ui.model.RedpacketGroupBean; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.provider.FetchCallback; + + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class SendRedPacketActivity extends BaseActivity { + + boolean isGroup = false; + private boolean isPinShouQi = true; + LoginBean u; + WalletBean walletBean; + int maxNumber = 100; + + private boolean isJinBi = true; + private ActivitySendRedPacketBinding viewBinding; + PayCashFingerDialog payCashFingerDialog; + PayCashDialog payDialog; + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + getWindow().setStatusBarColor(getResources().getColor(R.color.color_fcfcfc)); + getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white)); + + super.onCreate(savedInstanceState); + viewBinding = ActivitySendRedPacketBinding.inflate(getLayoutInflater()); + setContentView(viewBinding.getRoot()); + + initView(); + initListeners(); + } + /** + */ + protected void initView() { + + viewBinding.contactListActivityTitleBar.getBackImageView().setImageResource(R.mipmap.dialog_colose_img); + viewBinding.contactListActivityTitleBar.getBackImageView().setOnClickListener(v -> finish()); + + isGroup = getIntent().getBooleanExtra("isGroup", false); +// setTitle(getString(R.string.hbxq_txt)); + + + +// u = lu1(); + + // 设置标题(自定义标题栏后的title文本设置是不同的哦,见CustomeTitleBar中的说明) +// this.setTitle(getString(R.string.fshb_txt)); + if (isGroup) { + viewBinding.jintLeftTv.setText(R.string.zjine_txt); + viewBinding.groupRedLy.setVisibility(View.VISIBLE); + viewBinding.tipsTv.setVisibility(View.VISIBLE); + + changeType(); + + +// GroupEntity groupEntity = MyApplication.getInstance2().getIMClientManager().getGroupsProvider().getGroupInfoByGid(getIntent().getStringExtra("receiverUid")); +// if (groupEntity != null) { +// maxNumber = Integer.parseInt(groupEntity.getG_member_count()); +// } +// LogUtils.i(getString(R.string.qunrenyuanshu_txt) + maxNumber); + Team user = NIMClient.getService(TeamService.class).queryTeamBlock(getIntent().getStringExtra("receiverUid")); + if(user!=null){ + viewBinding.tipsNamesTv.setText(String.format(getString(R.string.hbq_tips_txt),user.getMemberCount())); + maxNumber = user.getMemberCount(); + } + } + + viewBinding.tipsTv.setOnClickListener(v -> selectType()); + + + } + private TextView coloseIv; + private LinearLayout ftLy; + private LinearLayout jtLy; + + private void selectType() { + BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(this, R.style.BottomSheetDialog); + + View bottomView = LayoutInflater.from(SendRedPacketActivity.this).inflate(R.layout.bottom_sheet_red_type_layout, null); + coloseIv = (TextView) bottomView.findViewById(R.id.colose_iv); + ftLy = (LinearLayout) bottomView.findViewById(R.id.ft_ly); + jtLy = (LinearLayout) bottomView.findViewById(R.id.jt_ly); + + + ftLy.setOnClickListener(v -> { + bottomSheetDialog.dismiss(); + isPinShouQi = true; + changeType(); + }); + jtLy.setOnClickListener(v -> { + bottomSheetDialog.dismiss(); + isPinShouQi = false; + changeType(); + }); + coloseIv.setOnClickListener(v -> bottomSheetDialog.dismiss()); + bottomSheetDialog.setContentView(bottomView); + bottomSheetDialog.show(); + + bottomSheetDialog.setOnDismissListener(dialog -> getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white))); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + AdaptScreenUtils.setWhiteNavigationBar(bottomSheetDialog); + } + + } + + @Override + protected void onResume() { + super.onResume(); + getWallet(); + bindInfo(); + } + + private void getWallet() { + Api.getInstance().walletInfo(IMKitClient.account()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { + walletBean = feedbackResp.data; + if(walletBean!=null){ + viewBinding.jinbiTv.setText(String.format(getString(R.string.qbyf_txt), walletBean.getGoldCoin() / 100f)); +// viewBinding.yinbiTv.setText(String.format("%.2f", walletBean.getSilverCoin() / 100f)); + }else{ + viewBinding.jinbiTv.setText(String.format(getString(R.string.qbyf_txt), 0f)); +// viewBinding.yinbiTv.setText(String.format("%.2f", 0f)); + } + } + + @Override + public void onError(int code, String msg) { +// WidgetUtils.showToast(getActivity(), msg, WidgetUtils.ToastType.ERROR); + + } + }); + + + } + + private void changeType() { + if (isPinShouQi) { + viewBinding.jintLeftTv.setText(getString(R.string.zjine_txt)); +// tipsTv.setText(String.format(getString(R.string.red_packet_tips_txt), getString(R.string.pinshouqi_txt))); +// tips1Tv.setText(getString(R.string.putong_txt)); + viewBinding.tipsTv.setText(getString(R.string.psjhb_txt)); + viewBinding.numberHintEt.setHint(getString(R.string.red_packet_number_hint_txt)); + if(isGroup) { + Drawable drawable = getResources().getDrawable(R.mipmap.left_pin_img); + drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); + viewBinding.jintLeftTv.setCompoundDrawables(drawable, null, null, null); + } + + } else { + viewBinding.jintLeftTv.setText(R.string.dangejine_txt); + viewBinding.numberHintEt.setHint(getString(R.string.red_packet_number_hint_txt1)); + viewBinding.tipsTv.setText(getString(R.string.pthb_txt)); + viewBinding.jintLeftTv.setCompoundDrawables(null, null, null, null); + + + } + changeInfo(); + } + + BindBean bindBean; + private void bindInfo() { +// if (u != null) { + Api.getInstance().bindInfo(IMKitClient.account()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + bindBean = feedbackResp.data; + if(bindBean.isAllowSilverCoin() == true){ + viewBinding.topSelectLy.setVisibility(View.GONE); + }else{ + viewBinding.topSelectLy.setVisibility(View.GONE); + + } + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + } + }); +// } + } + + float number = 0; + + + protected void initListeners() { + viewBinding.tvLogin.setOnClickListener(v -> { +// if(true){ +// ToastX.showShortToast("敬请期待"); +// return; +// +// } + + if (isGroup) { + if (TextUtils.isEmpty(viewBinding.sizeHintEt.getText().toString().trim())) { + ToastX.showShortToast(R.string.size_not_null_tips_txt); + return; + } + + if (Integer.parseInt(viewBinding.sizeHintEt.getText().toString().trim())<1) { + ToastX.showShortToast(R.string.qsrhbgs_txt); + + return; + } + + } + + + if (TextUtils.isEmpty(viewBinding.numberHintEt.getText().toString().trim())) { + ToastX.showShortToast(R.string.number_not_null_tips_txt); + + return; + } + float number1 =Float.parseFloat( viewBinding.numberTv.getText().toString().trim())*100; + LogUtils.i("红包金额:"+number1); + if (number1<1) { + ToastX.showShortToast(R.string.hbjebnsy_txt); + + return; + } + + if (isGroup) { + float number =Float.parseFloat(viewBinding. numberHintEt.getText().toString().trim())*100; + if (number/Integer.parseInt(viewBinding.sizeHintEt.getText().toString().trim())<1) { + ToastX.showShortToast(R.string.dghbjebnsy_txt); + + return; + } + + + if (Float.parseFloat(viewBinding.numberHintEt.getText().toString().trim()) > IMUIKitConfig.GROUP_MAX_MONEY) { +// ToastUtils.showShort(String.format(getString(R.string.max_red_packet_tips_txt),getString(R.string.danwei_txt),Const.GROUP_MAX_MONEY)); + ToastX.showShortToast(getString(R.string.dghbjebndy_txt)+" "+IMUIKitConfig.GROUP_MAX_MONEY); + + return; + } + + if (Integer.parseInt(viewBinding.sizeHintEt.getText().toString().trim()) > maxNumber) { + ToastX.showShortToast(R.string.hbgsbncgdqqlzs_txt); + + + return; + } + + } else { + if (Float.parseFloat(viewBinding.numberHintEt.getText().toString().trim()) > IMUIKitConfig.SINGLE_MAX_MONEY) { +// ToastUtils.showShort(String.format(getString(R.string.max_red_packet_tips_txt),getString(R.string.danwei_txt),Const.SINGLE_MAX_MONEY)); + ToastX.showShortToast(getString(R.string.dghbjebndy_txt)+" "+IMUIKitConfig.SINGLE_MAX_MONEY); + + return; + } + } + if (walletBean != null) { + if (Float.parseFloat(viewBinding.numberTv.getText().toString().trim()) > (isJinBi ? walletBean.getGoldCoin() / 100f : walletBean.getSilverCoin() / 100f)) { +// new AlertDialog.Builder(SendRedPacketActivity.this) +// .setTitle("余额不足") +// .setMessage("是否去充值金额?") +// .setPositiveButton("去充值", (dialog, which) -> { +// Intent intent = new Intent(SendRedPacketActivity.this, TopActivity.class); +// startActivity(intent); +// }) +// .setNegativeButton($$(R.string.general_cancel), null) +// .show(); + + ActionConfirmDialog actionDialog = new ActionConfirmDialog(SendRedPacketActivity.this,getString(R.string.sfqcz_txt),getString(R.string.general_cancel),getString(R.string.quchongzhi_txt)); + actionDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + Intent intent = new Intent(SendRedPacketActivity.this, WalletInfoActivity.class); + intent.putExtra("isG",true); + startActivity(intent); + } + @Override + public void toCancel() { + + } + }); + actionDialog.show(); + + + ToastX.showShortToast(R.string.yebz_txt); + + return; + } + number = Float.parseFloat(viewBinding.numberTv.getText().toString().trim()); +// if(isGroup&&!isPinShouQi){ +// number = number*Integer.parseInt(sizeHintEt.getText().toString().trim()); +// } + hideSoftInput(this); +// if (isJinBi) { +// PayDialog payDialog = new PayDialog(this, number + "", true); +// payDialog.setOntoAlbumListener(new PayDialog.OnListItemClickListener() { +// @Override +// public void onPayPass(String position) { +// toChange(position, number); +// } +// +// @Override +// public void dimess() { +// +// } +// }); +// payDialog.show(); + +// if(DataUtils.get(SendRedPacketActivity.this, "hasMianMi", false)){ +// toChange(null, number,2); +// }else{ + + if(DataUtils.get(SendRedPacketActivity.this, "hasFinger", false)){ + showPayCashFingerDialog(); + + }else{ + showPayCashDialog(); + } +// } + + + + + } else { + ToastX.showShortToast(R.string.hqqbxxsb_txt); + + } + + }); + + viewBinding.sizeHintEt.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) { + if (isGroup) { + changeButtonType(); + } else { + changeButtonChatType(); + } + changeInfo(); + changeStatus(); + } + }); + + viewBinding.numberHintEt.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) { + String input = s.toString(); + if(input.startsWith(".")){ + viewBinding.numberHintEt.setText("0"+viewBinding.numberHintEt.getText().toString()); + } + if(input.contains(".")){ + int dotIndex = input.indexOf("."); + if(input.length()-dotIndex-1>2){ + viewBinding.numberHintEt.setText(input.substring(0,dotIndex+3)); + } + } + viewBinding.numberHintEt.setSelection(viewBinding.numberHintEt.getText().length()); + + } + + @Override + public void afterTextChanged(Editable s) { + if (isGroup) { + changeButtonType(); + } else { + changeButtonChatType(); + } + changeInfo(); + changeStatus(); + + } + }); + + viewBinding.jinbiLy.setOnClickListener(v -> { + isJinBi = true; + changeTop(); + }); + viewBinding.ytinbiLy.setOnClickListener(v -> { + isJinBi = false; + changeTop(); + }); +// viewBinding.tips1Tv.setOnClickListener(v -> { +// isPinShouQi = false; +// changeType(); +// }); + +// viewBinding.tipsTv.setOnClickListener(v -> { +// isPinShouQi = true; +// changeType(); +// }); + } + + private void showPayCashDialog() { + if(isJinBi) { + payDialog = new PayCashDialog(SendRedPacketActivity.this, number + "", true, 0, walletBean, + null, 2, getString(R.string.fahongbao_txt)); + }else{ + payDialog = new PayCashDialog(SendRedPacketActivity.this, number + "", true, 0, walletBean, + null, 2, getString(R.string.fahongbao_txt),1); + } + payDialog.setOntoAlbumListener(new PayCashDialog.OnListItemClickListener() { + @Override + public void onPayPass(String position) { + toChange(position, number,1); + + } + + @RequiresApi(api = Build.VERSION_CODES.M) + @Override + public void onChangeFinger() { + showPayCashFingerDialog(); + } + + @Override + public void dimess() { + + } + }); + payDialog.show(); + } + + private void showPayCashFingerDialog() { + //Context context, String data, boolean showNumber, int payType, WalletBean walletBean, SelectPayTypeDialog.OnToTypeListener onToTypeListener, int isShowFinger + if(isJinBi) { + payCashFingerDialog = new PayCashFingerDialog(this, number + "", true, 0, walletBean, null, 2, getString(R.string.fahongbao_txt)); + }else{ + payCashFingerDialog = new PayCashFingerDialog(this, number + "", true, 0, walletBean, null, 2, getString(R.string.fahongbao_txt),true); + + } + payCashFingerDialog.setOntoAlbumListener(new PayCashFingerDialog.OnListItemClickListener() { + @Override + public void onChangePassword() { + showPayCashDialog(); + + } + + @Override + public void toFinger() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + checkPayFinger(); + } + } + + @Override + public void dimess() { + + } + }); + payCashFingerDialog.show(); + } + + @RequiresApi(api = Build.VERSION_CODES.M) + private void checkPayFinger() { + + FingerManager.build().setApplication(IMApplication.getInstance()) + .setTitle(" ") + .setDes(" ") + .setNegativeText(" ") + .setFingerCheckCallback(new SimpleFingerCheckCallback() + { + + @Override + public void onSucceed() + { + ToastX.showShortToast("验证成功"); + payCashFingerDialog.dismiss(); + toChange(null, number,2); + } + + @Override + public void onError(String error) + { + ToastX.showShortToast("验证失败"); + + } + + @Override + public void onCancel() + { + ToastX.showShortToast("您取消了识别"); + + } + }) + .setFingerChangeCallback(new AonFingerChangeCallback() + { + + @Override + protected void onFingerDataChange() + { +// ToastX.showShortToast("指纹数据发生了变化"); + FingerManager.updateFingerData(SendRedPacketActivity.this); + new Handler().postDelayed(() -> checkPayFinger(), 1000); + } + }) + .create() + .startListener(SendRedPacketActivity.this); + } + + + /** + * 隐藏软键盘 + */ + public void hideSoftInput(Activity activity) { + InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + if (getCurrentFocus() != null && null != imm) { + imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0); + } +// View view = activity.getCurrentFocus(); +// +// if (view != null) { +// +// InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE); +// +// inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); +// +// } + } + + private void changeTop() { + if (isJinBi) { + viewBinding.jinbiLy.setBackgroundResource(R.drawable.logout_btn_main1); + viewBinding. ytinbiLy.setBackgroundResource(R.drawable.logout_btn_c1); +// tvLogin.setBackgroundResource(R.drawable.logout_btn_red); + viewBinding.tvLogin.setText(getString(R.string.send_in_redenvelope_txt1)); + changeStatus(); + Drawable drawable = getResources().getDrawable(R.mipmap.wallet_jinbi_img); + drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); + viewBinding.numberHintEt.setCompoundDrawables(null, null, drawable, null); + } else { + viewBinding.ytinbiLy.setBackgroundResource(R.drawable.logout_btn_main1); + viewBinding.jinbiLy.setBackgroundResource(R.drawable.logout_btn_c1); +// tvLogin.setBackgroundResource(R.drawable.logout_btn_red1); + viewBinding.tvLogin.setText(getString(R.string.send_in_redenvelope_txt2)); + + changeStatus(); + Drawable drawable = getResources().getDrawable(R.mipmap.wallet_yinbi_img); + drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); + viewBinding.numberHintEt.setCompoundDrawables(null, null, drawable, null); + } + + + + } + + + private void changeStatus() { + if(isJinBi){ + viewBinding.tvLogin.setBackgroundResource(R.drawable.logout_btn_z_88); + if (isGroup) { + if (!TextUtils.isEmpty(viewBinding.numberHintEt.getText().toString().trim())&&!TextUtils.isEmpty(viewBinding.sizeHintEt.getText().toString().trim())) { + viewBinding.tvLogin.setBackgroundResource(R.drawable.logout_btn_red); + } + }else { + if (!TextUtils.isEmpty(viewBinding.numberHintEt.getText().toString().trim())) { + viewBinding.tvLogin.setBackgroundResource(R.drawable.logout_btn_red); + } + } + }else{ + viewBinding.tvLogin.setBackgroundResource(R.drawable.logout_btn_sl_88); + if (isGroup) { + if (!TextUtils.isEmpty(viewBinding.numberHintEt.getText().toString().trim())&&!TextUtils.isEmpty(viewBinding.sizeHintEt.getText().toString().trim())) { + viewBinding.tvLogin.setBackgroundResource(R.drawable.logout_btn_sl); + } + }else { + if (!TextUtils.isEmpty(viewBinding.numberHintEt.getText().toString().trim())) { + viewBinding.tvLogin.setBackgroundResource(R.drawable.logout_btn_sl); + } + } + } + } + + private void changeInfo() { + if (!TextUtils.isEmpty(viewBinding.numberHintEt.getText().toString().trim())) { + if(viewBinding.numberHintEt.getText().toString().trim().equals(".")){ + viewBinding. numberHintEt.setText("0."); + viewBinding.numberHintEt.setSelection(2); + + } + if(viewBinding.numberHintEt.getText().toString().trim().indexOf(".")!=-1){ + String[] nams = viewBinding.numberHintEt.getText().toString().trim().split("[.]"); + if(nams.length>1){ + if(nams[1].length()>2) { + viewBinding.numberHintEt.setText(nams[0] + "." + nams[1].substring(0, 2)); + viewBinding.numberHintEt.setSelection(viewBinding.numberHintEt.getText().toString().length()); + } + } + } + + float number1 = Float.parseFloat(viewBinding.numberHintEt.getText().toString().trim()); + String text1 = String.format("%.2f", number1); + viewBinding.numberTv.setText(text1); + if(isGroup) { + if (!isPinShouQi) { + if (TextUtils.isEmpty(viewBinding.sizeHintEt.getText().toString().trim())) { + viewBinding.numberTv.setText("0.00"); + } else { + float number = Float.parseFloat(viewBinding.numberHintEt.getText().toString().trim()); + int size = Integer.parseInt(viewBinding.sizeHintEt.getText().toString().trim()); + String text = String.format("%.2f", number * size); + viewBinding.numberTv.setText(text); + + } + } + } + } else { + viewBinding.numberTv.setText("0.00"); + + } + } + + + private void changeButtonChatType() { + + } + + private void changeButtonType() { + + } + + private void toChange(String position, float number,int type) { + if (isGroup) { + HashMap maps = new HashMap<>(); + maps.put("type", isPinShouQi ? 0 : 1); + maps.put("count", viewBinding.sizeHintEt.getText().toString().trim()); + maps.put("amount", (int) (number * 100)); + maps.put("senderUid", Integer.parseInt(IMKitClient.account())); + maps.put("groupId", getIntent().getStringExtra("receiverUid")); + LogUtils.i("群ID:" + getIntent().getStringExtra("receiverUid")); + if(!TextUtils.isEmpty(position)) { + maps.put("payPassword", position); + } + if (!TextUtils.isEmpty(viewBinding.memoEt.getText().toString().trim())) { + maps.put("remark", viewBinding.memoEt.getText().toString().trim()); + } else { + maps.put("remark", getString(R.string.remarks_hit_txt)); + } + maps.put("coinType",isJinBi?0:1); + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + maps.put("payVerifyCode", type); + + Api.getInstance().sendGroupRedpacket(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result feedbackResp) { + RedpacketGroupBean groupBean = feedbackResp.data; + //Long id, Integer status, Integer amount, Integer senderUid, String groupId, + // Integer count, Integer residualCount, Integer residualAmount, String sendTime, + // String finishTime, String remark, String senderNickname, Integer coinType, + // List grabbers, Integer receiverUid, String receiveTime + + List grabbersBean1List = null; + if(groupBean.getGrabbers()!=null&&groupBean.getGrabbers().size()>0){ + //String redEnvelopeId, String grabberUid, String grabAmount, String grabTime, String grabberNickname, String grabberAvatar + grabbersBean1List = new ArrayList<>(); + for (GrabbersBean grabbersBean:groupBean.getGrabbers()) + grabbersBean1List.add(new GrabbersBean1(grabbersBean.getRedEnvelopeId()+"",grabbersBean.getGrabberUid()+"", + grabbersBean.getGrabAmount()+"",grabbersBean.getGrabTime()+"",grabbersBean.getGrabberNickname(),grabbersBean.getGrabberAvatar())); + } + + + RedPacketAttachment redPacketAttachment = new RedPacketAttachment(groupBean.getId()+"",groupBean.getStatus()+"",groupBean.getAmount()+"", + groupBean.getSenderUid()+"",groupBean.getGroupId(), + groupBean.getCount()+"",groupBean.getResidualCount()+"",groupBean.getResidualAmount()+"",groupBean.getSendTime(), + groupBean.getFinishTime(),groupBean.getRemark(),groupBean.getSenderNickname(),groupBean.getCoinType()+"", + null,null); + toShareMessageGroup(redPacketAttachment); + + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast(msg); + } + }); + + } else { + HashMap maps = new HashMap<>(); + maps.put("amount", (int) (number * 100)); + maps.put("senderUid", Integer.parseInt(IMKitClient.account())); + maps.put("receiverUid", Integer.parseInt(getIntent().getStringExtra("receiverUid"))); + if(!TextUtils.isEmpty(position)) { + maps.put("payPassword", position); + } + if (!TextUtils.isEmpty(viewBinding.memoEt.getText().toString().trim())) { + maps.put("remark", viewBinding.memoEt.getText().toString().trim()); + } else { + maps.put("remark",getString(R.string.remarks_hit_txt)); + } + maps.put("coinType",isJinBi?0:1); + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + maps.put("payVerifyCode", type); + + Api.getInstance().sendRedpacket(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result feedbackResp) { + + //Long id, Integer status, Integer amount, Integer senderUid, String groupId, + // Integer count, Integer residualCount, Integer residualAmount, String sendTime, + // String finishTime, String remark, String senderNickname, Integer coinType, + // List grabbers, Integer receiverUid, String receiveTime + RedpacketBean redpacketBean = feedbackResp.data; + RedPacketAttachment redPacketAttachment = new RedPacketAttachment(redpacketBean.getId()+"",redpacketBean.getStatus()+"",redpacketBean.getAmount()+"", + redpacketBean.getSenderUid()+"",null, + 0+"",0+"",0+"",redpacketBean.getSendTime(),null,redpacketBean.getRemark(),null,redpacketBean.getCoinType()+"", + redpacketBean.getReceiverUid()+"",redpacketBean.getReceiveTime()); + toShareMessage(redPacketAttachment); + + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast(msg); + } + }); + } + } + + + + private void toShareMessage(RedPacketAttachment customerAttachment) { + IMMessage customMessage = MessageBuilder.createCustomMessage(getIntent().getStringExtra("receiverUid"), SessionTypeEnum.P2P, + getString(com.netease.yunxin.kit.chatkit.ui.R.string.hongbao_chat_txt), customerAttachment); + + LogUtils.i("发送消息结构体:" + GsonUtils.beanToJSONString(customerAttachment)); + if (customMessage != null) { + ChatRepo.sendMessage(customMessage, false, new FetchCallback() { + @Override + public void onSuccess(@Nullable Void unused) { + + Intent intent = new Intent(); + setResult(RESULT_OK, intent); + finish(); + } + + @Override + public void onFailed(int i) { + } + + @Override + public void onException(@Nullable Throwable throwable) { + + } + }); + } + } + + private void toShareMessageGroup(RedPacketAttachment customerAttachment) { + IMMessage customMessage = MessageBuilder.createCustomMessage(getIntent().getStringExtra("receiverUid"), SessionTypeEnum.Team, + getString(com.netease.yunxin.kit.chatkit.ui.R.string.hongbao_chat_txt), customerAttachment); + + LogUtils.i("发送消息结构体:" + GsonUtils.beanToJSONString(customerAttachment)); + if (customMessage != null) { + ChatRepo.sendMessage(customMessage, false, new FetchCallback() { + @Override + public void onSuccess(@Nullable Void unused) { + + Intent intent = new Intent(); + setResult(RESULT_OK, intent); + finish(); + } + + @Override + public void onFailed(int i) { + } + + @Override + public void onException(@Nullable Throwable throwable) { + + } + }); + } + } + public boolean onTouchEvent(MotionEvent event) { + if(null != this.getCurrentFocus()){ + /** + * 点击空白位置 隐藏软键盘 + */ + InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + return mInputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0); + } + return super .onTouchEvent(event); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/redpack/TransferAccountsActivity.java b/app/src/main/java/com/dskj/rbchat/redpack/TransferAccountsActivity.java new file mode 100644 index 0000000..455eaf9 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/redpack/TransferAccountsActivity.java @@ -0,0 +1,577 @@ + +package com.dskj.rbchat.redpack; + +import android.app.Activity; +import android.content.Intent; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.view.MotionEvent; +import android.view.View; +import android.view.inputmethod.InputMethodManager; + +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; + +import com.codersun.fingerprintcompat.AonFingerChangeCallback; +import com.codersun.fingerprintcompat.FingerManager; +import com.codersun.fingerprintcompat.SimpleFingerCheckCallback; +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.ActivityTransferAccountsBinding; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.dialog.PayCashDialog; +import com.dskj.rbchat.dialog.PayCashFingerDialog; +import com.dskj.rbchat.dialog.PayDialog; +import com.dskj.rbchat.model.BindBean; +import com.dskj.rbchat.model.LoginBean; +import com.dskj.rbchat.model.WalletBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.pay.CollectionAndPaymentActivity; +import com.dskj.rbchat.utils.AppUtils; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; + +import com.dskj.rbchat.wallet.WalletInfoActivity; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.msg.MessageBuilder; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.nimlib.sdk.msg.model.IMMessage; +import com.netease.nimlib.sdk.uinfo.UserService; +import com.netease.nimlib.sdk.uinfo.model.NimUserInfo; +import com.netease.yunxin.kit.chatkit.repo.ChatRepo; +import com.netease.yunxin.kit.chatkit.ui.custom.TransferAttachment; +import com.netease.yunxin.kit.chatkit.ui.model.TransferBean; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.contactkit.ui.utils.ColorUtils; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.provider.FetchCallback; + +import java.util.HashMap; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class TransferAccountsActivity extends BaseActivity { + + LoginBean u; + WalletBean walletBean; + float number = 0; + PayCashFingerDialog payCashFingerDialog; + PayCashDialog payDialog; + private boolean isJinBi = false; + + private ActivityTransferAccountsBinding viewBinding; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + getWindow().setStatusBarColor(getResources().getColor(R.color.color_fffafa)); + getWindow().setNavigationBarColor(getResources().getColor(R.color.color_fffafa)); + super.onCreate(savedInstanceState); + viewBinding = ActivityTransferAccountsBinding.inflate(getLayoutInflater()); + setContentView(viewBinding.getRoot()); + isJinBi = getIntent().getBooleanExtra("type", isJinBi); + initView(); + initListeners(); + } + + /** + * + */ + protected void initView() { + viewBinding.contactListActivityTitleBar.getBackImageView().setImageResource(R.mipmap.dialog_colose_img); + viewBinding.contactListActivityTitleBar.getBackImageView().setOnClickListener(v -> finish()); + viewBinding.ivJinbiType.setImageResource(isJinBi?R.mipmap.wallet_jinbi_img:R.mipmap.wallet_yinbi_img); +// u = lu1(); + + // 设置标题(自定义标题栏后的title文本设置是不同的哦,见CustomeTitleBar中的说明) + this.setTitle(getString(R.string.zhuanzhang_txt)); + viewBinding.tvLogin.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + +// if(true){ +// ToastX.showShortToast("敬请期待"); +// return; +// } + + if (TextUtils.isEmpty(viewBinding.numberHintEt.getText().toString().trim())) { + ToastX.showShortToast(R.string.zzjebnwk_txt); + return; + } + float number1 = Float.parseFloat(viewBinding.numberHintEt.getText().toString().trim()) * 100; + LogUtils.i("红包金额:" + number1); + if (number1 < 1) { + ToastX.showShortToast(R.string.zzjebnsy_txt); + + return; + } + + if (walletBean != null) { + if (Float.parseFloat(viewBinding.numberHintEt.getText().toString().trim()) > (isJinBi ? walletBean.getGoldCoin() / 100f : walletBean.getSilverCoin() / 100f)) { + ActionConfirmDialog actionDialog; + if (isJinBi) { + actionDialog = new ActionConfirmDialog(TransferAccountsActivity.this, + getString(R.string.sfqcz_txt), getString(R.string.general_cancel), getString(R.string.quchongzhi_txt)); + } else { + actionDialog = new ActionConfirmDialog(TransferAccountsActivity.this, + getString(R.string.lpjfbz_txt), "", "", false); + } + actionDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + if (isJinBi) { + Intent intent = new Intent(TransferAccountsActivity.this, WalletInfoActivity.class); + intent.putExtra("isG", true); + startActivity(intent); + } + + } + + @Override + public void toCancel() { + + } + }); + actionDialog.show(); + ToastX.showShortToast(R.string.yebz_txt); + + return; + } + number = Float.parseFloat(viewBinding.numberHintEt.getText().toString().trim()); + +// if(DataUtils.get(TransferAccountsActivity.this, "hasMianMi", false)){ +// toChange(null, number,2); +// }else { + + if (DataUtils.get(TransferAccountsActivity.this, "hasFinger", false)) { + showPayCashFingerDialog(); + + } else { + showPayCashDialog(); + } +// } + + } else { + ToastX.showShortToast(R.string.hqqbxxsb_tx); + + } + } + }); +// NimUserInfo nimUserInfo = NIMClient.getService(UserService.class).getUserInfo(getIntent().getStringExtra("receiverUid")); +// if(nimUserInfo!=null) { +// ColorUtils.loadAvator(nimUserInfo.getAvatar(),viewBinding.userHeadIv); +//// viewBinding.userHeadIv.setData(nimUserInfo.getAvatar(),nimUserInfo.getName()); +// viewBinding.userNameTv.setText(nimUserInfo.getName()); +// viewBinding.cheatid.setText("CHATID:"+nimUserInfo.getAccount()+""); +// userNickName = nimUserInfo.getName(); +// }else { +// +// } + getUserInfo(getIntent().getStringExtra("receiverUid")); + + } + + String userNickName = ""; + + private void showPayCashDialog() { + if (isJinBi) { + + payDialog = new PayCashDialog(TransferAccountsActivity.this, number + "", true, 0, walletBean, + null, 2, String.format(getString(R.string.fukuangei_txt), userNickName)); + } else { + payDialog = new PayCashDialog(TransferAccountsActivity.this, number + "", true, 0, walletBean, + null, 2, String.format(getString(R.string.fukuangei_txt), userNickName), 1); + } + payDialog.setOntoAlbumListener(new PayCashDialog.OnListItemClickListener() { + @Override + public void onPayPass(String position) { + toChange(position, number, 1); + } + + @RequiresApi(api = Build.VERSION_CODES.M) + @Override + public void onChangeFinger() { + showPayCashFingerDialog(); + } + + @Override + public void dimess() { + + } + }); + payDialog.show(); + } + + private void showPayCashFingerDialog() { + //Context context, String data, boolean showNumber, int payType, WalletBean walletBean, SelectPayTypeDialog.OnToTypeListener onToTypeListener, int isShowFinger + if (isJinBi) { + payCashFingerDialog = new PayCashFingerDialog(this, number + "", true, 0, + walletBean, null, 2, String.format(getString(R.string.fukuangei_txt), + viewBinding.userNameTv.getText().toString())); + } else { + payCashFingerDialog = new PayCashFingerDialog(this, number + "", true, 0, walletBean, + null, 2, String.format(getString(R.string.fukuangei_txt), viewBinding.userNameTv.getText().toString()), true); + + } + payCashFingerDialog.setOntoAlbumListener(new PayCashFingerDialog.OnListItemClickListener() { + @Override + public void onChangePassword() { + showPayCashDialog(); + } + + @Override + public void toFinger() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + checkPayFinger(); + } + } + + @Override + public void dimess() { + + } + }); + payCashFingerDialog.show(); + } + + @RequiresApi(api = Build.VERSION_CODES.M) + private void checkPayFinger() { + + FingerManager.build().setApplication(IMApplication.getInstance()) + .setTitle(" ") + .setDes(" ") + .setNegativeText(" ") + .setFingerCheckCallback(new SimpleFingerCheckCallback() { + + @Override + public void onSucceed() { + ToastX.showShortToast("验证成功"); + payCashFingerDialog.dismiss(); + toChange(null, number, 2); + } + + @Override + public void onError(String error) { + ToastX.showShortToast("验证失败"); + + } + + @Override + public void onCancel() { + ToastX.showShortToast("您取消了识别"); + + } + }) + .setFingerChangeCallback(new AonFingerChangeCallback() { + + @Override + protected void onFingerDataChange() { +// ToastX.showShortToast("指纹数据发生了变化"); + FingerManager.updateFingerData(TransferAccountsActivity.this); + new Handler().postDelayed(() -> checkPayFinger(), 1000); + } + }) + .create() + .startListener(TransferAccountsActivity.this); + } + + + LoginBean userInfoBean; + + private void getUserInfo(String user_uid) { + Api.getInstance().userInfo(user_uid) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + userInfoBean = feedbackResp.data; + if (userInfoBean != null) { + viewBinding.userNameTv.setText(String.format(getString(R.string.zhuanzhangjineto_txt), userInfoBean.getNickNameWithRemark())); + viewBinding.cheatid.setText("CHATID:" + userInfoBean.getNwId() + ""); + userNickName = userInfoBean.getNickNameWithRemark(); + ColorUtils.loadAvator(userInfoBean.getUserAvatarFileName(), viewBinding.userHeadIv); +// viewBinding.userHeadIv.setData( +// feedbackResp.data.getUserAvatarFileName(), feedbackResp.data.getNickNameWithRemark()); + } + + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + } + }); + } + + /** + * 隐藏软键盘 + */ + public void hideSoftInput(Activity activity) { + InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + if (getCurrentFocus() != null && null != imm) { + imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0); + } +// View view = activity.getCurrentFocus(); +// +// if (view != null) { +// +// InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE); +// +// inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); +// +// } + } + + private void toChange(String password, float number, int type) { + hideSoftInput(this); + HashMap maps = new HashMap<>(); + maps.put("amount", (int) (number * 100)); + maps.put("senderUid", Integer.parseInt(IMKitClient.account())); + maps.put("receiverUid", Integer.parseInt(getIntent().getStringExtra("receiverUid"))); + if (!TextUtils.isEmpty(password)) { + maps.put("payPassword", password); + } + if (!TextUtils.isEmpty(viewBinding.memoEt.getText().toString().trim())) { + maps.put("remark", viewBinding.memoEt.getText().toString().trim()); + } + maps.put("coinType", isJinBi ? 0 : 1); + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + maps.put("payVerifyCode", type); + maps.put("receiptType", 1); + + Api.getInstance().transferMoney(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result feedbackResp) { + //Long id, Integer status, Integer amount, Integer senderUid, Integer receiverUid, String sendTime, String receiveTime, String remark, Integer coinType + TransferBean albumBean1 = feedbackResp.data; + TransferAttachment customerAttachment = new TransferAttachment(albumBean1.getId() + "", + albumBean1.getStatus() + "", albumBean1.getAmount() + "", + albumBean1.getSenderUid() + "", albumBean1.getReceiverUid() + "", + albumBean1.getSendTime(), albumBean1.getReceiveTime(), albumBean1.getRemark(), albumBean1.getCoinType() + ""); + LogUtils.i("获取到的数据:" + GsonUtils.beanToJSONString(customerAttachment)); + toShareMessage(customerAttachment); + + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast(msg); + + } + }); + } + + private void toShareMessage(TransferAttachment customerAttachment) { + IMMessage customMessage = MessageBuilder.createCustomMessage(getIntent().getStringExtra("receiverUid"), SessionTypeEnum.P2P, + getString(com.netease.yunxin.kit.chatkit.ui.R.string.zhuangzhang_chat_txt), customerAttachment); + + LogUtils.i("发送消息结构体:" + GsonUtils.beanToJSONString(customerAttachment)); + if (customMessage != null) { + ChatRepo.sendMessage(customMessage, false, new FetchCallback() { + @Override + public void onSuccess(@Nullable Void unused) { + finish(); + } + + @Override + public void onFailed(int i) { + LogUtils.i("错误码:" + i); + } + + @Override + public void onException(@Nullable Throwable throwable) { + + } + }); + } + } + + @Override + protected void onResume() { + super.onResume(); + getWallet(); + bindInfo(); + } + + BindBean bindBean; + + private void bindInfo() { +// if (u != null) { + Api.getInstance().bindInfo(IMKitClient.account()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + bindBean = feedbackResp.data; + if (bindBean.isAllowSilverCoin() == true) { + viewBinding.topSelectLy.setVisibility(View.GONE); + } else { + viewBinding.topSelectLy.setVisibility(View.GONE); + + } + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + } + }); +// } + } + + private void getWallet() { + Api.getInstance().walletInfo(IMKitClient.account()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { + walletBean = feedbackResp.data; + if (walletBean != null) { + viewBinding.jinbiTv.setText(isJinBi ? String.format(getString(R.string.qbyf_txt), AppUtils.getQian(walletBean.getGoldCoin())) : String.format(getString(R.string.hljfye_txt), AppUtils.getQian(walletBean.getSilverCoin()))); +// viewBinding.yinbiTv.setText(String.format("%.2f", walletBean.getSilverCoin() / 100f)); + } else { + viewBinding.jinbiTv.setText(isJinBi ? String.format(getString(R.string.qbyf_txt), "0.00") : String.format(getString(R.string.hljfye_txt), "0.00")); +// viewBinding.yinbiTv.setText(String.format("%.2f", 0f)); + } + } + + @Override + public void onError(int code, String msg) { +// WidgetUtils.showToast(getActivity(), msg, WidgetUtils.ToastType.ERROR); + + } + }); + + + } + + /** + * + */ + protected void initListeners() { + viewBinding.numberHintEt.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) { + String input = s.toString(); + if (input.startsWith(".")) { + viewBinding.numberHintEt.setText("0" + viewBinding.numberHintEt.getText().toString()); + } + if (input.contains(".")) { + int dotIndex = input.indexOf("."); + if (input.length() - dotIndex - 1 > 2) { + viewBinding.numberHintEt.setText(input.substring(0, dotIndex + 3)); + } + } + viewBinding.numberHintEt.setSelection(viewBinding.numberHintEt.getText().length()); + } + + @Override + public void afterTextChanged(Editable s) { + + changeInfo(); + changeStatus(); + } + }); + + viewBinding.jinbiLy.setOnClickListener(v -> { + isJinBi = true; + changeTop(); + }); + viewBinding.ytinbiLy.setOnClickListener(v -> { + isJinBi = false; + changeTop(); + }); + + } + + + private void changeTop() { + if (isJinBi) { + viewBinding.jinbiLy.setBackgroundResource(R.drawable.logout_btn_main1); + viewBinding.ytinbiLy.setBackgroundResource(R.drawable.logout_btn_c1); +// viewBinding.jinbiTv.setText(String.format(getString(R.string.qbyf_txt), walletBean.getGoldCoin() / 100f)); + + changeStatus(); + + } else { + viewBinding.ytinbiLy.setBackgroundResource(R.drawable.logout_btn_main1); + viewBinding.jinbiLy.setBackgroundResource(R.drawable.logout_btn_c1); +// viewBinding.jinbiTv.setText(String.format(getString(R.string.hljfye_txt), walletBean.getSilverCoin() / 100f)); + + changeStatus(); + } + } + + private void changeStatus() { + if (isJinBi) { +// viewBinding.tvLogin.setBackgroundResource(R.drawable.logout_btn_z_88); + if (!TextUtils.isEmpty(viewBinding.numberHintEt.getText().toString().trim())) { +// viewBinding.tvLogin.setBackgroundResource(R.drawable.logout_btn_z); + } + } else { +// viewBinding.tvLogin.setBackgroundResource(R.drawable.logout_btn_sl_88); + if (!TextUtils.isEmpty(viewBinding.numberHintEt.getText().toString().trim())) { +// viewBinding.tvLogin.setBackgroundResource(R.drawable.logout_btn_sl); + } + } + } + + + private void changeInfo() { + if (!TextUtils.isEmpty(viewBinding.numberHintEt.getText().toString().trim())) { + if (viewBinding.numberHintEt.getText().toString().trim().equals(".")) { + viewBinding.numberHintEt.setText("0."); + viewBinding.numberHintEt.setSelection(2); + + } + if (viewBinding.numberHintEt.getText().toString().trim().indexOf(".") != -1) { + String[] nams = viewBinding.numberHintEt.getText().toString().trim().split("[.]"); + if (nams.length > 1) { + if (nams[1].length() > 2) { + viewBinding.numberHintEt.setText(nams[0] + "." + nams[1].substring(0, 2)); + viewBinding.numberHintEt.setSelection(viewBinding.numberHintEt.getText().toString().length()); + } + } + } + + float number1 = Float.parseFloat(viewBinding.numberHintEt.getText().toString().trim()); + String text1 = String.format("%.2f", number1); +// viewBinding.numberHintEt.setText(text1); + } else { +// viewBinding.numberTv.setText("0.00"); + + } + } + + public boolean onTouchEvent(MotionEvent event) { + if (null != this.getCurrentFocus()) { + /** + * 点击空白位置 隐藏软键盘 + */ + InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + return mInputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0); + } + return super.onTouchEvent(event); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/redpack/TransferInfoActivity.java b/app/src/main/java/com/dskj/rbchat/redpack/TransferInfoActivity.java new file mode 100644 index 0000000..621cd76 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/redpack/TransferInfoActivity.java @@ -0,0 +1,494 @@ + +package com.dskj.rbchat.redpack; + +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; + +import androidx.annotation.Nullable; + + +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; + +import com.dskj.rbchat.databinding.ActivityTransferInfoBinding; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.model.LoginBean; +import com.dskj.rbchat.model.StaffServiceIdBean; +import com.dskj.rbchat.model.WalletBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; + +import com.dskj.rbchat.utils.ShareDateUtils; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.msg.MessageBuilder; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.nimlib.sdk.msg.model.IMMessage; +import com.netease.nimlib.sdk.uinfo.UserService; +import com.netease.nimlib.sdk.uinfo.model.NimUserInfo; +import com.netease.yunxin.kit.chatkit.repo.ChatRepo; +import com.netease.yunxin.kit.chatkit.ui.common.ChatDataUtils; +import com.netease.yunxin.kit.chatkit.ui.common.RxBus; +import com.netease.yunxin.kit.chatkit.ui.custom.TransferAttachment; +import com.netease.yunxin.kit.chatkit.ui.model.RxZhuanZhangBean; +import com.netease.yunxin.kit.chatkit.ui.model.TransferBean; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.model.UserInfo; +import com.netease.yunxin.kit.corekit.im.provider.FetchCallback; + +import java.util.HashMap; +import java.util.Map; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class TransferInfoActivity extends BaseActivity +{ + + LoginBean u; + WalletBean walletBean; + float number = 0; + LoginBean otherUser; + TransferBean transferBean; + + private ActivityTransferInfoBinding viewBinding; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + getWindow().setStatusBarColor(getResources().getColor(R.color.color_fcfcfc)); + getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white)); + super.onCreate(savedInstanceState); + viewBinding = ActivityTransferInfoBinding.inflate(getLayoutInflater()); + setContentView(viewBinding.getRoot()); + initView(); + initListeners(); + } + /** + */ + protected void initView( ) + { + viewBinding.contactListActivityTitleBar.getBackImageView().setOnClickListener(v -> finish()); + transferBean = (TransferBean) getIntent().getSerializableExtra("bean"); + + viewBinding.buttonTv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + shoukuan(); + } + }); + + if(transferBean.getCoinType()==null||transferBean.getCoinType()==0){ + viewBinding.numberTv1.setImageResource(R.mipmap.wallet_jinbi_img); + viewBinding.numberTv.setTextColor(getResources().getColor(R.color.color_cf924f)); + + }else{ + viewBinding.numberTv1.setImageResource(R.mipmap.wallet_yinbi_img); + viewBinding.numberTv.setTextColor(getResources().getColor(com.netease.yunxin.kit.chatkit.ui.R.color.color_3e7be4)); + } + + if((transferBean.getSenderUid()+"").equals(IMKitClient.account())){ + viewBinding.buttonTv.setVisibility(View.GONE); + getUserInfo(transferBean.getReceiverUid()+""); + + }else{ + viewBinding.buttonTv.setVisibility(View.VISIBLE); + getUserInfo(transferBean.getSenderUid()+""); + + } + + getTransfer(transferBean.getId()); + + + viewBinding.tuihuanTv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + tuihuan(); + } + }); + + changTopTxt(); + + + } + + private boolean getJinToYin() { + + if(transferBean.getCoinType()==null||transferBean.getCoinType()==0){ + return true; + }else{ + return false; + } + + } + private void tuihuan() { + String name = getString(R.string.nqdythzz_txt); + if(otherUser!=null){ + name = String.format(getString(R.string.nqdythzz_txt1),otherUser.getNickNameWithRemark()); + } +// new AlertDialog.Builder(TransferInfoActivity.this) +// .setTitle(name) +// .setPositiveButton("退还", (dialog, which) -> { +// Map map = new HashMap<>(); +// map.put("recordId",transferBean.getId()); +// map.put("uid",transferBean.getSenderUid()); +// Api.getInstance().transferMoneyReturn(map) +// .subscribeOn(Schedulers.io()) +// .observeOn(AndroidSchedulers.mainThread()) +// .subscribe(new BaseObserver>() { +// @Override +// public void onSuccess(Result feedbackResp) { +// transferBean = feedbackResp.data; +// PreferencesToolkits.set(TransferInfoActivity.this, transferBean.getId() + "_t", transferBean.getStatus()); +// changTopTxt(); +// MessageHelper.sendPlainTransferMessageAsync(TransferInfoActivity.this, transferBean.getSenderUid()+"", transferBean, null); +// +// } +// +// @Override +// public void onError(int code, String msg) { +// LogUtils.i("获取到数据ERROR:"+code+";;"+msg); +// +// } +// }); +// }) +// .setNegativeButton($$(R.string.general_cancel), null) +// .show(); +// + + ActionConfirmDialog actionDialog = new ActionConfirmDialog(TransferInfoActivity.this,name,getString(R.string.general_cancel),getString(R.string.tuihuan_txt)); + actionDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + Map map = new HashMap<>(); + map.put("recordId",transferBean.getId()); + map.put("uid",transferBean.getSenderUid()); + map.put("substationId", IMUIKitConfig.SUBSTATIONID); + + Api.getInstance().transferMoneyReturn(map) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + transferBean = feedbackResp.data; +// PreferencesToolkits.set(TransferInfoActivity.this, transferBean.getId() + "_t", transferBean.getStatus()); + + ChatDataUtils.set(TransferInfoActivity.this, "transfer_" + transferBean.getId(), transferBean.getStatus()); + RxBus.getInstance().post(new RxZhuanZhangBean(transferBean.getId()+"")); + + changTopTxt(); +// MessageHelper.sendPlainTransferMessageAsync(TransferInfoActivity.this, transferBean.getSenderUid()+"", transferBean, null); + + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到数据ERROR:"+code+";;"+msg); + + } + }); + } + + @Override + public void toCancel() { + + } + }); + actionDialog.show(); + + } + + private void shoukuan() { + + LoginBean loginBean = DataUtils.getLocUserInfo(); + if (loginBean != null&&loginBean.getUser()!=null) { + if (loginBean.getUser().getForbidQCoin() == 1) { + toRengong(); + return; + } + + Map map = new HashMap<>(); + map.put("recordId",transferBean.getId()); + map.put("uid",transferBean.getReceiverUid()); + map.put("substationId", IMUIKitConfig.SUBSTATIONID); + + Api.getInstance().receiveTransferMoney(map) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + transferBean = feedbackResp.data; +// PreferencesToolkits.set(TransferInfoActivity.this, transferBean.getId() + "_t", transferBean.getStatus()); + ChatDataUtils.set(TransferInfoActivity.this, "transfer_" + transferBean.getId(), transferBean.getStatus()); + RxBus.getInstance().post(new RxZhuanZhangBean(transferBean.getId()+"")); + + changTopTxt(); +// MessageHelper.sendPlainTransferMessageAsync(TransferInfoActivity.this, transferBean.getSenderUid()+"", transferBean, null); +// TransferBean albumBean1 = feedbackResp.data; + TransferAttachment customerAttachment = new TransferAttachment(transferBean.getId()+"", + transferBean.getStatus()+"", transferBean.getAmount()+"", + transferBean.getSenderUid()+"", transferBean.getReceiverUid()+"", transferBean.getSendTime(), transferBean.getReceiveTime(), + transferBean.getRemark(),transferBean.getCoinType()+""); + LogUtils.i("获取到的数据:" + GsonUtils.beanToJSONString(customerAttachment)); + ChatDataUtils.set(TransferInfoActivity.this,"transfer_"+transferBean.getId(),transferBean.getStatus()); + toShareMessage(customerAttachment); + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到数据ERROR:"+code+";;"+msg); + + } + }); + + } + + } + + private void toShareMessage(TransferAttachment customerAttachment) { + IMMessage customMessage = MessageBuilder.createCustomMessage(customerAttachment.getSenderUid()+"", SessionTypeEnum.P2P, + getString(com.netease.yunxin.kit.chatkit.ui.R.string.zhuangzhang_chat_txt), customerAttachment); + + LogUtils.i("发送消息结构体:" + GsonUtils.beanToJSONString(customerAttachment)); + if (customMessage != null) { + ChatRepo.sendMessage(customMessage, false, new FetchCallback() { + @Override + public void onSuccess(@Nullable Void unused) { + } + + @Override + public void onFailed(int i) { + } + + @Override + public void onException(@Nullable Throwable throwable) { + + } + }); + } + } + + private void toRengong() { + ActionConfirmDialog actionDialog = new ActionConfirmDialog(TransferInfoActivity.this,getString(R.string.ndqbbdj_txt),getString(R.string.general_got_it), + getString(R.string.lxkh_txt)); + actionDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + toKefu(); + } + + @Override + public void toCancel() { + + } + }); + actionDialog.show(); + + } + + public void toKefu() { + Api.getInstance().helpCenterStaffServiceId(IMUIKitConfig.SUBSTATIONID,1) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + toRengongCallTop(feedbackResp.data.getStaffServiceId(),feedbackResp.data.getStaffServiceNickname()); + } + + @Override + public void onError(int code, String msg) { +// toRengongCall(400227); + ToastX.showShortToast(msg); + + } + }); + } + + + public void toRengongCallTop(Integer staffServiceId,String name) { +// Intent i = IntentFactory.createTempChatIntent(TransferInfoActivity.this, staffServiceId+"", name); +// startActivity(i); + } + + + + private void getTransfer(Long id) { + Api.getInstance().receiveTransferMoney(id + "") + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + transferBean = feedbackResp.data; +// PreferencesToolkits.set(TransferInfoActivity.this, transferBean.getId() + "_t", transferBean.getStatus()); + viewBinding.numberTv.setText(String.format("%.2f",transferBean.getAmount()/100f)); + + ChatDataUtils.set(TransferInfoActivity.this, "transfer_" + transferBean.getId(), transferBean.getStatus()); + if(transferBean.getStatus()>0) + RxBus.getInstance().post(new RxZhuanZhangBean(transferBean.getId()+"")); + + changTopTxt(); + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到数据ERROR:"+code+";;"+msg); + + } + }); + } + + private void changTopTxt() { + viewBinding.tuihuanTv.setVisibility(View.GONE); + viewBinding.memoTv.setText(TextUtils.isEmpty(transferBean.getRemark())?getString(R.string.wu_txt):transferBean.getRemark()); + viewBinding.timeTv.setText(transferBean.getSendTime()); + viewBinding.buttonTv.setVisibility(View.GONE); + if(transferBean.getStatus() == 0){ + viewBinding.botLine.setVisibility(View.GONE); + viewBinding.shoukuanLy.setVisibility(View.GONE); + }else{ + viewBinding.botLine.setVisibility(View.VISIBLE); + viewBinding.shoukuanLy.setVisibility(View.VISIBLE); + viewBinding.time1Tv.setText(transferBean.getReceiveTime()+""); + } + if(transferBean.getStatus() == 0){//待领取 +// viewBinding.statusIv.setImageResource(R.mipmap.t_dengdai_img); + }else if(transferBean.getStatus() == 1){//已领取 +// viewBinding.statusIv.setImageResource(R.mipmap.t_success_img); + }else if(transferBean.getStatus()== 2){//已自动领取 +// viewBinding.statusIv.setImageResource(R.mipmap.t_success_img); + }else if(transferBean.getStatus() == 3||transferBean.getStatus() == 4){//3 已退回 4 已自动退回 +// viewBinding.statusIv.setImageResource(R.mipmap.t_back_img); + + viewBinding.shoukuanLy.setVisibility(View.VISIBLE); + viewBinding.botLine.setVisibility(View.VISIBLE); + + viewBinding.time1Tv.setText(transferBean.getUpdateTime()+""); + viewBinding.timeLeftTv.setText(R.string.tuihuanshijain_txt); + } + +// if(transferBean.getStatus()==4){ +// viewBinding.shoukuanLy.setVisibility(View.GONE); +// +// } + + + if(otherUser!=null) { + viewBinding.tipsLy.setVisibility(View.VISIBLE); + if ((transferBean.getSenderUid() + "").equals(IMKitClient.account())) { + viewBinding.tipsTv.setText(R.string.zhuanzhang_tips1_txt); + if(transferBean.getStatus() == 0){ + viewBinding.titleTv.setText(String.format(getString(R.string.daishoukuan_txt),otherUser.getNickname())); + + }else if(transferBean.getStatus() == 1){ + viewBinding.titleTv.setText(String.format(getString(R.string.yishoukuan_txt),otherUser.getNickname())); + viewBinding.tipsTv.setVisibility(View.GONE); + }else if(transferBean.getStatus()== 2){ + viewBinding.titleTv.setText(String.format(getString(R.string.yzdsk_txt),otherUser.getNickname())); + viewBinding.tipsTv.setVisibility(View.GONE); + }else if(transferBean.getStatus() == 3||transferBean.getStatus() == 4){ + viewBinding.titleTv.setText(String.format(getString(R.string.yituikuan_txt1),otherUser.getNickname())); + if(transferBean.getStatus() ==4){ + viewBinding.titleTv.setText(String.format(getString(R.string.yzdtk_txt),otherUser.getNickname())); + } +// viewBinding.titleTv.setTextColor(getResources().getColor(R.color.black)); +// viewBinding.numberTv.setTextColor(getResources().getColor(R.color.black)); + viewBinding.tipsTv.setText(R.string.ytkdye_txt); + if(transferBean.getStatus() ==4){ + viewBinding.tipsTv.setText(R.string.dfwbdsjhytkdye_txt); + } + } + + NimUserInfo nimUserInfo = NIMClient.getService(UserService.class).getUserInfo(transferBean.getReceiverUid()+""); + if(nimUserInfo!=null){ +// viewBinding.titleTvv.setText("来自%s的金币转账") + if(transferBean.getCoinType().equals(0)) { + viewBinding.titleTvv.setText(String.format(getString(R.string.xiangshuijinbi_txt),nimUserInfo.getName())); + }else{ + viewBinding.titleTvv.setText(String.format(getString(R.string.xiangshuiyinbi_txt),nimUserInfo.getName())); + } + + } + }else{ + + viewBinding.tipsTv.setText(R.string.zhuangzhang_tips2_txt); + if(transferBean.getStatus() == 0){ + viewBinding.titleTv.setText(R.string.dainishoukuan_txt); + viewBinding.tuihuanTv.setVisibility(View.VISIBLE); + viewBinding.buttonTv.setVisibility(View.VISIBLE); + + }else if(transferBean.getStatus() == 1){ + viewBinding.titleTv.setText(R.string.ninyishoukuan_txt); + viewBinding.tipsLy.setVisibility(View.GONE); + + }else if(transferBean.getStatus()== 2){ + viewBinding.titleTv.setText(R.string.niyizdsk_txt); + viewBinding.tipsLy.setVisibility(View.GONE); + + }else if(transferBean.getStatus() == 3||transferBean.getStatus() ==4){ + viewBinding.titleTv.setText(R.string.nyth_txt); + +// viewBinding.titleTv.setTextColor(getResources().getColor(R.color.color_666666)); +// viewBinding.numberTv.setTextColor(getResources().getColor(R.color.black)); + viewBinding.tipsTv.setText(R.string.ytkddfye_txt); + if(transferBean.getStatus() ==4){ + viewBinding.tipsTv.setText(R.string.wbdsjhytkddfye_txt); + } + viewBinding.tipsTv.setVisibility(View.GONE); + } + + NimUserInfo nimUserInfo = NIMClient.getService(UserService.class).getUserInfo(transferBean.getSenderUid()+""); + if(nimUserInfo!=null){ +// viewBinding.titleTvv.setText("来自%s的金币转账") + if(transferBean.getCoinType().equals(0)) { + viewBinding.titleTvv.setText(String.format(getString(R.string.xiangshuijinbi_txt1),nimUserInfo.getName())); + }else{ + viewBinding.titleTvv.setText(String.format(getString(R.string.xiangshuiyinbi_txt1),nimUserInfo.getName())); + } + + } + } + } + } + + private void getUserInfo(String user_uid) { + Api.getInstance().userInfo(user_uid) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + otherUser = feedbackResp.data; + changTopTxt(); + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:"+code+""+ msg); + } + }); + } + + + + @Override + protected void onResume() { + super.onResume(); + } + + + protected void initListeners() { + + + } + + +} diff --git a/app/src/main/java/com/dskj/rbchat/repository/LoginUserRepository.java b/app/src/main/java/com/dskj/rbchat/repository/LoginUserRepository.java new file mode 100644 index 0000000..090edb9 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/repository/LoginUserRepository.java @@ -0,0 +1,33 @@ +package com.dskj.rbchat.repository; + +import android.annotation.SuppressLint; + +import androidx.lifecycle.MutableLiveData; + +import com.dskj.rbchat.model.LoginUserBean; + + +import java.util.Map; + +import javax.inject.Inject; + +import retrofit2.adapter.rxjava2.Result; + +//用户数据处理 +public class LoginUserRepository { + + private final MutableLiveData userMutableLiveData = new MutableLiveData<>(); + + @Inject + LoginUserRepository() { + + } + + public MutableLiveData getUser() { + + return userMutableLiveData; + } + + + +} diff --git a/app/src/main/java/com/dskj/rbchat/utils/AdaptScreenUtils.java b/app/src/main/java/com/dskj/rbchat/utils/AdaptScreenUtils.java new file mode 100644 index 0000000..4e30dcf --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/utils/AdaptScreenUtils.java @@ -0,0 +1,203 @@ +package com.dskj.rbchat.utils; + + +import android.app.Dialog; +import android.content.res.Resources; +import android.graphics.Color; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.GradientDrawable; +import android.graphics.drawable.LayerDrawable; +import android.os.Build; +import android.util.DisplayMetrics; +import android.view.Window; + +import androidx.annotation.NonNull; +import androidx.annotation.RequiresApi; + +import com.dskj.rbchat.IMApplication; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; + +/** + *

+ *     author: Blankj
+ *     blog  : http://blankj.com
+ *     time  : 2018/11/15
+ *     desc  : utils about adapt screen
+ * 
+ */ +public final class AdaptScreenUtils { + + private static List sMetricsFields; + + private AdaptScreenUtils() { + throw new UnsupportedOperationException("u can't instantiate me..."); + } + + /** + * Adapt for the horizontal screen, and call it in {@link android.app.Activity#getResources()}. + */ + @NonNull + public static Resources adaptWidth(@NonNull final Resources resources, final int designWidth) { + float newXdpi = (resources.getDisplayMetrics().widthPixels * 72f) / designWidth; + applyDisplayMetrics(resources, newXdpi); + return resources; + } + + /** + * Adapt for the vertical screen, and call it in {@link android.app.Activity#getResources()}. + */ + @NonNull + public static Resources adaptHeight(@NonNull final Resources resources, final int designHeight) { + return adaptHeight(resources, designHeight, false); + } + + /** + * Adapt for the vertical screen, and call it in {@link android.app.Activity#getResources()}. + */ + @NonNull + public static Resources adaptHeight(@NonNull final Resources resources, final int designHeight, final boolean includeNavBar) { + float screenHeight = (resources.getDisplayMetrics().heightPixels + + (includeNavBar ? getNavBarHeight(resources) : 0)) * 72f; + float newXdpi = screenHeight / designHeight; + applyDisplayMetrics(resources, newXdpi); + return resources; + } + + private static int getNavBarHeight(@NonNull final Resources resources) { + int resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android"); + if (resourceId != 0) { + return resources.getDimensionPixelSize(resourceId); + } else { + return 0; + } + } + + + + @RequiresApi(api = Build.VERSION_CODES.M) + public static void setWhiteNavigationBar(@NonNull Dialog dialog) { + Window window = dialog.getWindow(); + if (window != null) { + DisplayMetrics metrics = new DisplayMetrics(); + window.getWindowManager().getDefaultDisplay().getMetrics(metrics); + + GradientDrawable dimDrawable = new GradientDrawable(); + + GradientDrawable navigationBarDrawable = new GradientDrawable(); + navigationBarDrawable.setShape(GradientDrawable.RECTANGLE); + navigationBarDrawable.setColor(Color.WHITE);//这里设置颜色 + + Drawable[] layers = {dimDrawable, navigationBarDrawable}; + + LayerDrawable windowBackground = new LayerDrawable(layers); + windowBackground.setLayerInsetTop(1, metrics.heightPixels); + + window.setBackgroundDrawable(windowBackground); + } + } + + + + /** + * @param resources The resources. + * @return the resource + */ + @NonNull + public static Resources closeAdapt(@NonNull final Resources resources) { + float newXdpi = Resources.getSystem().getDisplayMetrics().density * 72f; + applyDisplayMetrics(resources, newXdpi); + return resources; + } + + /** + * Value of pt to value of px. + * + * @param ptValue The value of pt. + * @return value of px + */ + public static int pt2Px(final float ptValue) { + DisplayMetrics metrics = IMApplication.getAppContext().getResources().getDisplayMetrics(); + return (int) (ptValue * metrics.xdpi / 72f + 0.5); + } + + /** + * Value of px to value of pt. + * + * @param pxValue The value of px. + * @return value of pt + */ + public static int px2Pt(final float pxValue) { + DisplayMetrics metrics = IMApplication.getAppContext().getResources().getDisplayMetrics(); + return (int) (pxValue * 72 / metrics.xdpi + 0.5); + } + + private static void applyDisplayMetrics(@NonNull final Resources resources, final float newXdpi) { + resources.getDisplayMetrics().xdpi = newXdpi; + IMApplication.getAppContext().getResources().getDisplayMetrics().xdpi = newXdpi; + applyOtherDisplayMetrics(resources, newXdpi); + } + + static Runnable getPreLoadRunnable() { + return new Runnable() { + @Override + public void run() { + preLoad(); + } + }; + } + + private static void preLoad() { + applyDisplayMetrics(Resources.getSystem(), Resources.getSystem().getDisplayMetrics().xdpi); + } + + private static void applyOtherDisplayMetrics(final Resources resources, final float newXdpi) { + if (sMetricsFields == null) { + sMetricsFields = new ArrayList<>(); + Class resCls = resources.getClass(); + Field[] declaredFields = resCls.getDeclaredFields(); + while (declaredFields != null && declaredFields.length > 0) { + for (Field field : declaredFields) { + if (field.getType().isAssignableFrom(DisplayMetrics.class)) { + field.setAccessible(true); + DisplayMetrics tmpDm = getMetricsFromField(resources, field); + if (tmpDm != null) { + sMetricsFields.add(field); + tmpDm.xdpi = newXdpi; + } + } + } + resCls = resCls.getSuperclass(); + if (resCls != null) { + declaredFields = resCls.getDeclaredFields(); + } else { + break; + } + } + } else { + applyMetricsFields(resources, newXdpi); + } + } + + private static void applyMetricsFields(final Resources resources, final float newXdpi) { + for (Field metricsField : sMetricsFields) { + try { + DisplayMetrics dm = (DisplayMetrics) metricsField.get(resources); + if (dm != null) dm.xdpi = newXdpi; + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + private static DisplayMetrics getMetricsFromField(final Resources resources, final Field field) { + try { + return (DisplayMetrics) field.get(resources); + } catch (Exception ignore) { + return null; + } + } +} + diff --git a/app/src/main/java/com/dskj/rbchat/utils/AnimUtil.java b/app/src/main/java/com/dskj/rbchat/utils/AnimUtil.java new file mode 100644 index 0000000..4a90f4a --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/utils/AnimUtil.java @@ -0,0 +1,47 @@ +package com.dskj.rbchat.utils; + +import android.view.View; + +import com.github.hariprasanths.bounceview.BounceView; + +/** + * 控件的点击缩放事件 + */ +public class AnimUtil { + /** + * 控件设置动画事件 + * @param view + */ + public static void setAnimView(View view){ + BounceView.addAnimTo(view).setScaleForPushInAnim(1.02f,1.02f).setScaleForPopOutAnim(1.0f,1.0f); + } + + /** + * 控件设置动画事件 + * @param view + */ + public static void setAnimView(View view,float inAnim){ + BounceView.addAnimTo(view).setScaleForPushInAnim(inAnim,inAnim).setScaleForPopOutAnim(1.0f,1.0f); + } + + + /** + * 控件设置动画事件 + * @param view + */ + public static void setAnimViews(View... view){ + for (View num : view) { + BounceView.addAnimTo(num).setScaleForPushInAnim(1.02f, 1.02f).setScaleForPopOutAnim(1.0f, 1.0f); + } + } + + /** + * 控件设置动画事件 + * @param view + */ + public static void setAnimViews(float inAnim,View... view){ + for (View num : view) { + BounceView.addAnimTo(num).setScaleForPushInAnim(inAnim, inAnim).setScaleForPopOutAnim(1.0f, 1.0f); + } + } +} diff --git a/app/src/main/java/com/dskj/rbchat/utils/AppUtils.java b/app/src/main/java/com/dskj/rbchat/utils/AppUtils.java new file mode 100644 index 0000000..ff3b63c --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/utils/AppUtils.java @@ -0,0 +1,199 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.utils; + +import android.app.Activity; +import android.content.Context; +import android.content.ContextWrapper; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.graphics.Bitmap; +import android.text.TextUtils; + +import androidx.annotation.Nullable; + +import com.netease.yunxin.kit.chatkit.ui.model.IMUserExtension; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.corekit.im.model.UserField; +import com.netease.yunxin.kit.corekit.im.model.UserInfo; +import com.netease.yunxin.kit.corekit.im.provider.FetchCallback; +import com.netease.yunxin.kit.corekit.im.provider.UserInfoProvider; +import com.tencent.mm.opensdk.modelmsg.SendMessageToWX; +import com.tencent.mm.opensdk.modelmsg.WXMediaMessage; +import com.tencent.mm.opensdk.modelmsg.WXWebpageObject; +import com.tencent.mm.opensdk.openapi.IWXAPI; +import com.tencent.mm.opensdk.openapi.WXAPIFactory; + +import java.text.DecimalFormat; +import java.util.HashMap; +import java.util.Map; + +public class AppUtils { + + public static String getAppVersionName(Context context) { + String versionName = ""; + try { + PackageManager pm = context.getPackageManager(); + PackageInfo packageInfo = pm.getPackageInfo(context.getPackageName(), 0); + versionName = packageInfo.versionName; + } catch (Exception exception) { + + } + return versionName; + } + + public static int getAppVersionCode(Context context) { + int versionCode = 0; + try { + PackageManager pm = context.getPackageManager(); + PackageInfo packageInfo = pm.getPackageInfo(context.getPackageName(), 0); + versionCode = packageInfo.versionCode; + } catch (Exception exception) { + + } + return versionCode; + } + + + public static String getQian(long number) { + if (number % 100 == 0) { + long numbers = number/100; + DecimalFormat decimalFormat = new DecimalFormat("#,###,###"); + String formattedNumber = decimalFormat.format(numbers); + return String.format("%s", formattedNumber); + } else if (number % 10 == 0) { + float numbers = number/100f; + DecimalFormat decimalFormat = new DecimalFormat("#,###,##0.0"); + String formattedNumber = decimalFormat.format(numbers); + return String.format("%s", formattedNumber); + } else { + float numbers = number/100f; + DecimalFormat decimalFormat = new DecimalFormat("#,###,##0.00"); + String formattedNumber = decimalFormat.format(numbers); + return String.format("%s", formattedNumber); + } + } + + /** + * 分享网页类型至微信 + * + * @param context 上下文 + * @param appId 微信的appId + * @param webUrl 网页的url + * @param title 网页标题 + * @param content 网页描述 + * @param bitmap 位图 + * @param scene SendMessageToWX.Req.WXSceneSession是分享到好友会话 SendMessageToWX.Req.WXSceneTimeline是分享到朋友圈 + */ + public static void shareWeb(Context context, String appId, String webUrl, String title, String content, Bitmap bitmap, int scene) { + // 通过appId得到IWXAPI这个对象 + IWXAPI wxapi = WXAPIFactory.createWXAPI(context, appId); + // 检查手机或者模拟器是否安装了微信 + if (!wxapi.isWXAppInstalled()) { + ToastX.showShortToast("您还没有安装微信"); + return; + } + + // 初始化一个WXWebpageObject对象 + WXWebpageObject webpageObject = new WXWebpageObject(); + // 填写网页的url + webpageObject.webpageUrl = webUrl; + + // 用WXWebpageObject对象初始化一个WXMediaMessage对象 + WXMediaMessage msg = new WXMediaMessage(webpageObject); + // 填写网页标题、描述、位图 + msg.title = title; + msg.description = content; + // 如果没有位图,可以传null,会显示默认的图片 + msg.setThumbImage(bitmap); + + // 构造一个Req + SendMessageToWX.Req req = new SendMessageToWX.Req(); + // transaction用于唯一标识一个请求(可自定义) + req.transaction = "webpage"; + // 上文的WXMediaMessage对象 + req.message = msg; + // SendMessageToWX.Req.WXSceneSession是分享到好友会话 + // SendMessageToWX.Req.WXSceneTimeline是分享到朋友圈 + req.scene = scene; + + // 向微信发送请求 + wxapi.sendReq(req); + } + + + public static boolean assertValidRequest(Context context) { + if (context instanceof Activity) { + Activity activity = (Activity) context; + return !isDestroy(activity); + } else if (context instanceof ContextWrapper) { + ContextWrapper contextWrapper = (ContextWrapper) context; + if (contextWrapper.getBaseContext() instanceof Activity) { + Activity activity = (Activity) contextWrapper.getBaseContext(); + return !isDestroy(activity); + } + } + return true; + } + + private static boolean isDestroy(Activity activity) { + if (activity == null) { + return true; + } + return activity.isFinishing() || activity.isDestroyed(); + } + + +// public static void setUserInfoExtension(String callBell, String messageBell) { +// //设置用户扩展字段 +// IMUserExtension extension = new IMUserExtension(); +// extension.setCallBell(callBell); +// extension.setMessageBell(messageBell); +// String extensionValue = GsonUtils.beanToJSONString(extension); +// updateUserExtension(extensionValue); +// } + + public static void updateUserExtension(String extensionValue) { + Map fields = new HashMap<>(); + fields.put(UserField.Ext, extensionValue); + UserInfoProvider.updateUserInfo(fields, new FetchCallback() { + @Override + public void onSuccess(@Nullable Void unused) { + //成功 + LogUtils.d("yes"); + } + + @Override + public void onFailed(int i) { + + } + + @Override + public void onException(@Nullable Throwable throwable) { + + } + }); + + } + + + public final static int EMPTY_TIME = 500; + public static long lasttime; + + //连续点击拦截 + public synchronized static boolean isDoubleClick() { + long currentTime = System.currentTimeMillis(); + boolean isDouble; + if (currentTime - lasttime > EMPTY_TIME) { + isDouble = false; + } else { + isDouble = true; + } + lasttime = currentTime; + return isDouble; + } + + +} diff --git a/app/src/main/java/com/dskj/rbchat/utils/CharInputFilter.java b/app/src/main/java/com/dskj/rbchat/utils/CharInputFilter.java new file mode 100644 index 0000000..25a6ea8 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/utils/CharInputFilter.java @@ -0,0 +1,23 @@ +package com.dskj.rbchat.utils; + +import android.text.InputFilter; +import android.text.Spanned; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class CharInputFilter implements InputFilter { + + private Pattern pattern1; + + public CharInputFilter(Pattern pattern) { + this.pattern1 = pattern; + } + + @Override + public CharSequence filter(CharSequence charSequence, int i, int i1, Spanned spanned, int i2, int i3) { + String inputcontent = charSequence.toString(); + Matcher matcher = pattern1.matcher(inputcontent); + return matcher.replaceAll("").trim(); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/utils/CommonUtils.java b/app/src/main/java/com/dskj/rbchat/utils/CommonUtils.java new file mode 100644 index 0000000..a2fef9d --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/utils/CommonUtils.java @@ -0,0 +1,678 @@ +package com.dskj.rbchat.utils; + +import java.lang.reflect.Method; +import java.math.BigDecimal; +import java.net.NetworkInterface; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.text.DateFormat; +import java.text.DecimalFormat; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Date; +import java.util.Enumeration; +import java.util.GregorianCalendar; +import java.util.Random; +import java.util.StringTokenizer; +import java.util.Vector; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class CommonUtils { + public CommonUtils() { + } + + public static boolean isEmail(String email) { + if (email == null) { + return false; + } else { + 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(); + } + } + + public static String getExceptionStackTraceForHTML(Exception e) { + StringBuffer out = new StringBuffer(); + StackTraceElement[] stes = e.getStackTrace(); + out.append("
" + e.getClass().getName() + ":" + e.getMessage() + "
"); + StackTraceElement[] var6 = stes; + int var5 = stes.length; + + for(int var4 = 0; var4 < var5; ++var4) { + StackTraceElement ste = var6[var4]; + out.append(" (" + ste.getFileName() + ":" + ste.getLineNumber() + ") - " + ste.getClassName() + "." + ste.getMethodName() + "()
"); + } + + out.append("
"); + return out.toString(); + } + + public static String getExceptionStackTraceForPlainText(Exception e) { + StringBuffer out = new StringBuffer(); + StackTraceElement[] stes = e.getStackTrace(); + out.append(e.getClass().getName()).append(":").append(isStringEmpty(e.getLocalizedMessage()) ? e.getMessage() : e.getLocalizedMessage()).append("\n"); + StackTraceElement[] var6 = stes; + int var5 = stes.length; + + for(int var4 = 0; var4 < var5; ++var4) { + StackTraceElement ste = var6[var4]; + out.append(" (" + ste.getFileName()).append(":").append(ste.getLineNumber()).append(" - ").append(ste.getClassName()).append(".").append(ste.getMethodName()).append("()").append("\n"); + } + + return out.toString(); + } + + public static int getLikePageNum(int allCount, int countPerPage) { + int pageNum = countPerPage == 0 ? 1 : allCount / countPerPage + (allCount % countPerPage > 0 ? 1 : 0); + return pageNum; + } + + public static String byteToHexStringForMD5(byte[] MD5Bytes) { + char[] hexDigits = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; + char[] str = new char[32]; + int k = 0; + + for(int i = 0; i < 16; ++i) { + byte byte0 = MD5Bytes[i]; + str[k++] = hexDigits[byte0 >>> 4 & 15]; + str[k++] = hexDigits[byte0 & 15]; + } + + String s = new String(str); + return s; + } + + public static String stringNULL(String str, boolean needTrim) { + return isStringEmpty(str, needTrim) ? "" : str; + } + + public static String stringNULL(String str, boolean needTrim, String willPreAppend) { + return isStringEmpty(str, needTrim) ? "" : willPreAppend + str; + } + + public static String escapeXML(String beforeEscapeXML) { + return beforeEscapeXML.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll("'", "'").replaceAll("\"", """); + } + + public static Object[][] to2DArray(Vector towDVector) { + Object[][] towDArray = new Object[towDVector.size()][]; + + for(int i = 0; i < towDVector.size(); ++i) { + Vector row = (Vector)towDVector.elementAt(i); + towDArray[i] = row.toArray(); + } + + return towDArray; + } + + public static Vector to2DVector(Object[][] src) { + return to2DVector(src, new Vector()); + } + + public static Vector to2DVector(Object[][] src, Vector dest) { + if (src != null && src.length > 0) { + for(int i = 0; i < src.length; ++i) { + dest.addElement(toVector(src[i])); + } + } + + return dest; + } + + public static Vector toVector(Object[] src) { + return toVector(src, new Vector()); + } + + public static Vector toVector(Object[] src, Vector dest) { + if (src != null && src.length > 0) { + for(int i = 0; i < src.length; ++i) { + dest.addElement(src[i]); + } + } + + return dest; + } + + public static int[] getFlowingNums(int seed, int stepping, int count) { + int[] nums = new int[count]; + + for(int i = 0; i < count; ++i) { + nums[i] = seed + stepping * (i + 1); + } + + return nums; + } + + public static String[] sequence(long currentValue, int count, int digit, String appendStr) throws Exception { + if (count < 1) { + String warn = "count不能小于1,currentValue=" + currentValue + " =" + count + " digit=" + digit + " appendStr=" + appendStr; +// SimpleLogger.w(warn); + throw new Exception(warn); + } else { + String[] sns = new String[count]; + + for(int i = 0; i < count; ++i) { + sns[i] = appendStr + hiString("" + (currentValue + (long)i), digit, '0', true, false); + } + + return sns; + } + } + + public static final String encyptPassword(String originalPsw, String DEFAULT_PASSWORD) { + if (originalPsw == null) { + return null; + } else { + if (!DEFAULT_PASSWORD.equals(originalPsw)) { + try { + return byteToHexStringForMD5(MessageDigest.getInstance("MD5").digest(originalPsw.getBytes())); + } catch (Exception var3) { + var3.printStackTrace(); + } + } + + return originalPsw; + } + } + + /** @deprecated */ + @Deprecated + public static final byte[] encyptPasswordOld(char[] raw, String DEFAULT_PASSWORD) { + if (raw == null) { + return null; + } else { + byte[] byteRaw = (new String(raw)).getBytes(); + if (!Arrays.equals(raw, DEFAULT_PASSWORD.toCharArray())) { + try { + byteRaw = MessageDigest.getInstance("SHA").digest(byteRaw); + long v = 0L; + int len = byteRaw.length; + int n = Math.min(len, 8); + + for(int i = 0; i < n; ++i) { + v += (long)(byteRaw[i] + n & 255) << i * 8; + } + + byteRaw = Long.toString(v).getBytes(); + } catch (NoSuchAlgorithmException var8) { + var8.printStackTrace(); + } + } + + return byteRaw; + } + } + + public static Date getFirstDayTime(Calendar c) { + c.add(5, -c.get(5) + 1); + c.set(11, 0); + c.set(12, 0); + return c.getTime(); + } + + public static Date getFirstDayTime() { + Calendar c = Calendar.getInstance(); + return getFirstDayTime(c); + } + + public static Date getLastDayTime(Calendar c) { + c.set(11, 23); + c.set(12, 59); + return c.getTime(); + } + + public static Date getLastDayTime() { + Calendar c = Calendar.getInstance(); + return getLastDayTime(c); + } + + public static String getDateDepthed(String srcDate, int depth, int calendarField) { + try { + Date csrq = DateFormat.getDateInstance().parse(srcDate); + GregorianCalendar gc = new GregorianCalendar(); + gc.setTime(csrq); + gc.add(calendarField, depth); + return (new SimpleDateFormat("yyyy-MM-dd")).format(gc.getTime()); + } catch (Exception var5) { + return null; + } + } + + public static ArrayList getSplitedPartByBrackets(String str) { + return getSplitedPartByBrackets(str, '{', '}'); + } + + public static ArrayList getSplitedPartByBrackets(String str, char startBracket, char endBracket) { + ArrayList res = new ArrayList(); + if (str != null) { + int point = 0; + + for(int start = -1; point < str.length(); ++point) { + char c = str.charAt(point); + if (c == startBracket) { + start = point; + } else if (c == endBracket && start != -1) { + res.add(str.substring(start, point + 1)); + start = -1; + } + } + } + + return res; + } + + public static String firstCharUpper(String s) { + return s != null && !(s = s.trim()).equals("") ? s.substring(0, 1).toUpperCase() + s.substring(1, s.length()) : null; + } + + public static double getScaledDoubleValue(double d, int precision) { + return getScaledValue(d, precision).doubleValue(); + } + + public static BigDecimal getScaledValue(double d, int precision) { + BigDecimal bd = new BigDecimal(d); + bd = bd.divide(new BigDecimal("1"), precision < 0 ? 0 : precision, 4); + return bd; + } + + public static String getScaledValue(Object d, int precision, boolean trimTail) { + String ori_str = d.toString(); + + try { + new Double(ori_str); + return getScaledValue(Double.parseDouble(ori_str), precision, trimTail); + } catch (Exception var5) { + return "0"; + } + } + + public static String getScaledValue(double d, int precision, boolean trimTail) { + String str = getScaledValue(d, precision).toString(); + if (trimTail && precision > 0) { + StringBuffer sb = new StringBuffer(str); + + while(sb.length() > 0) { + char c = sb.charAt(sb.length() - 1); + if (c != '0' && c != '.') { + return sb.toString(); + } + + sb.deleteCharAt(sb.length() - 1); + if (c == '.') { + return sb.toString(); + } + } + } + + return str; + } + + public static String[] breakStringByReturnChar(String str) { + return splitStringByChar(str, "\n"); + } + + public static String[] splitStringByChar(String str, String c) { + ArrayList resultAl = splitStringByCharC(str, c); + String[] strs = new String[resultAl.size()]; + resultAl.toArray(strs); + return strs; + } + + public static ArrayList splitStringByCharC(String str, String c) { + StringTokenizer en = new StringTokenizer(str, c); + ArrayList vec = new ArrayList(); + + while(en.hasMoreElements()) { + vec.add(en.nextElement()); + } + + return vec; + } + + public static String hiString(String originalStr, int theLength) { + return hiString(originalStr, theLength, '0'); + } + + public static String hiString(String originalStr, int theLength, char stuffChar) { + return hiString(originalStr, theLength, stuffChar, true, true); + } + + public static String hiString(String originalStr, int theLength, char stuffChar, boolean stuffToLeft, boolean trucateIfLong) { + if (originalStr.getBytes().length > theLength) { + return trucateIfLong ? new String(originalStr.getBytes(), 0, theLength) : originalStr; + } else if (originalStr.getBytes().length >= theLength) { + return originalStr; + } else { + StringBuffer dst = new StringBuffer(); + + for(int i = 0; i < theLength - originalStr.getBytes().length; ++i) { + dst.append(stuffChar); + } + + if (stuffToLeft) { + dst.append(originalStr); + } else { + dst = (new StringBuffer(originalStr)).append(dst.toString()); + } + + return dst.toString(); + } + } + + public static String truncString(String msg, int maxLen, String trailStr) { + String ret = msg; + if (msg != null) { + int len = msg.length(); + int max = maxLen - (trailStr != null ? trailStr.length() : 0); + if (len > max) { + System.out.println("文本内容超长(长度=" + len + ",但允许的最大长度=" + max + "),内容其余部分将被截断!"); + ret = truncString(msg, max) + (trailStr != null ? trailStr : ""); + } + } + + return ret; + } + + public static String truncStringEx(String msg, int maxLen, String trailStr) { + String ret = msg; + if (msg != null) { + int len = msg.getBytes().length; + int max = maxLen - (trailStr != null ? trailStr.length() : 0); + if (len > max) { + ret = truncStringEx(msg, max) + (trailStr != null ? trailStr : ""); + } + } + + return ret; + } + + public static String truncString(String msg, int maxLen) { + String ret = msg; + if (msg != null && msg.length() > maxLen) { + ret = msg.substring(0, maxLen); + } + + return ret; + } + + public static String truncStringEx(String msg, int maxLen) { + String ret = msg; + if (msg != null && msg.length() > maxLen) { + byte[] bs = msg.getBytes(); + byte[] tmp = new byte[maxLen]; + System.arraycopy(bs, 0, tmp, 0, maxLen); + ret = new String(tmp); + } + + return ret; + } + + public static boolean isStringEmpty(String s, boolean needTrim) { + if (s != null) { + if (needTrim) { + if (!s.trim().equals("")) { + return false; + } + } else if (!s.equals("")) { + return false; + } + } + + return true; + } + + public static boolean isStringEmpty(String s) { + return isStringEmpty(s, false); + } + + public static float getFloatValue(String s) { + try { + return getFloatValue(s, 0.0F); + } catch (Exception var2) { + System.err.println(var2.getMessage()); + return 0.0F; + } + } + + public static float getFloatValueUnsafe(String s) { + return getFloatValue(s, 0.0F); + } + + public static float getFloatValue(Object obj, float defaultVal) { + String value = String.valueOf(obj); + return obj != null && !isStringEmpty(value, true) ? Float.parseFloat(value) : defaultVal; + } + + public static double getDoubleValue(String s) { + try { + return getDoubleValue(s, 0.0); + } catch (Exception var2) { + System.err.println(var2.getMessage()); + return 0.0; + } + } + + public static double getDoubleValueUnsafe(String s) { + return getDoubleValue(s, 0.0); + } + + public static double getDoubleValue(Object obj, double defaultVal) { + String value = String.valueOf(obj); + return obj != null && !isStringEmpty(value, true) ? Double.parseDouble(value) : defaultVal; + } + + public static int getIntValue(Object ob) { + try { + return getIntValue(ob, 0); + } catch (Exception var2) { + System.err.println(var2.getMessage()); + return 0; + } + } + + public static int getIntValueUnsafe(Object ob) { + return getIntValue(ob, 0); + } + + public static int getIntValue(Object obj, int defaultVal) { + String value = String.valueOf(obj); + return obj != null && !isStringEmpty(value, true) ? Integer.parseInt(value) : defaultVal; + } + + public static long getLongValue(String s) { + try { + return getLongValue(s, 0L); + } catch (Exception var2) { + System.err.println(var2.getMessage()); + return 0L; + } + } + + public static long getLongValueUnsafe(String s) { + return getLongValue(s, 0L); + } + + public static long getLongValue(Object obj, long defaultVal) { + String value = String.valueOf(obj); + return obj != null && !isStringEmpty(value, true) ? Long.parseLong(value) : defaultVal; + } + + public static String getJavaHomePath() { + String javaHome = System.getProperty("java.home"); + return javaHome + "/bin"; + } + + public static void sleep(long ms) { + try { + Thread.sleep(ms); + } catch (Exception var3) { + } + + } + + public static String getRandomStr() { + return getRandomStr(20); + } + + public static String getRandomStr(int len) { + Random rd = new Random(); + String retStr = ""; + + do { + int rdGet1 = Math.abs(rd.nextInt()) % 10; + int rdGet2 = Math.abs(rd.nextInt()) % 26 + 65; + retStr = retStr + rdGet1 + (char)rdGet2; + } while(retStr.length() < len); + + return retStr; + } + + public static String getRandomStr2(int len) { + Random rd = new Random(); + String retStr = ""; + + do { + int rdGet1 = -1; + int rdGet2 = -1; + int decide = Math.abs(rd.nextInt()) % 2; + if (decide == 0) { + rdGet1 = Math.abs(rd.nextInt()) % 10; + } else { + rdGet2 = Math.abs(rd.nextInt()) % 26 + 65; + } + + retStr = retStr + (decide == 0 ? rdGet1 : "" + (char)rdGet2); + } while(retStr.length() < len); + + return retStr; + } + + public static String getTimeWithStr() { + return getTimeWithStr(":"); + } + + public static String getTimeWithStr(String separator) { + Calendar calendar = Calendar.getInstance(); + int h = calendar.get(11); + int m = calendar.get(12); + int s = calendar.get(13); + int ms = calendar.get(14); + String time = (h >= 10 ? "" + h : "0" + h) + separator + (m >= 10 ? "" + m : "0" + m) + separator + s + separator + ms; + return time; + } + + public static String getDateWithStr() { + Calendar calendar = Calendar.getInstance(); + int y = calendar.get(1); + int M = calendar.get(2) + 1; + int d = calendar.get(5); + String date = y + "-" + (M >= 10 ? "" + M : "0" + M) + "-" + (d >= 10 ? "" + d : "0" + d); + return date; + } + + public static String getConvenientFileSize(double size, int scale) { + String ret = size + "字节"; + double temp = size / 1024.0; + if (temp >= 1.0) { + ret = roundEx(temp, scale) + "KB"; + temp /= 1024.0; + if (temp >= 1.0) { + ret = roundEx(temp, scale) + "MB"; + temp /= 1024.0; + if (temp >= 1.0) { + ret = roundEx(temp, scale) + "GB"; + temp /= 1024.0; + if (temp >= 1.0) { + ret = (new DecimalFormat("#0.00")).format(roundEx(temp, scale)) + "TB"; + } + } + } + } + + return ret; + } + + public static double roundEx(double v, int scale) { + if (scale < 0) { + throw new IllegalArgumentException("The scale must be a positive integer or zero!"); + } else { + BigDecimal data = new BigDecimal(Double.toString(v)); + BigDecimal divisor = new BigDecimal("1"); + return data.divide(divisor, scale, 5).doubleValue(); + } + } + + private static String concatOneMACAddr(byte[] mac) { + String macStr = ""; + if (mac != null && mac.length != 0) { + int i = 0; + byte[] var6 = mac; + int var5 = mac.length; + + for(int var4 = 0; var4 < var5; ++var4) { + byte b = var6[var4]; + String s = Integer.toHexString(b & 255).toUpperCase(); + macStr = macStr + (s.length() == 1 ? "0" + s : s) + (i == mac.length - 1 ? "" : "-"); + ++i; + } + + return macStr; + } else { + return null; + } + } + + public static String getMACAddresses() throws Exception { + String macStr = ""; + Enumeration nis = NetworkInterface.getNetworkInterfaces(); + + while(nis.hasMoreElements()) { + NetworkInterface ni = (NetworkInterface)nis.nextElement(); + Method m = NetworkInterface.class.getMethod("getHardwareAddress", (Class[])null); + byte[] mac = (byte[])m.invoke(ni, (Object[])null); + String oneMACStr = concatOneMACAddr(mac); + if (!isStringEmpty(oneMACStr, true)) { + macStr = macStr + (isStringEmpty(macStr, true) ? "" : ",") + oneMACStr; + } + } + + return macStr; + } + + public static boolean isNumber(char c) { + switch (c) { + case '0': + return true; + case '1': + return true; + case '2': + return true; + case '3': + return true; + case '4': + return true; + case '5': + return true; + case '6': + return true; + case '7': + return true; + case '8': + return true; + case '9': + return true; + default: + return false; + } + } + + public static boolean isNumeric(String str) { + Pattern pattern = Pattern.compile("[0-9]*"); + return pattern.matcher(str).matches(); + } +} + diff --git a/app/src/main/java/com/dskj/rbchat/utils/Constant.java b/app/src/main/java/com/dskj/rbchat/utils/Constant.java new file mode 100644 index 0000000..d9a5bf6 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/utils/Constant.java @@ -0,0 +1,31 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.utils; + +public class Constant { + + public static final String PROJECT_TAG = "LAILIAOLIAO"; + public static final String PAGE_MAIN = "https://netease.yunxin.im.demo.home"; + public static final String CONFIG_APPKEY_KEY = "com.netease.nim.appKey"; + public static final String CONFIG_APPKEY_KEY_OVERSEA = "com.netease.nim.oversea.appKey"; + + public static final String TITLE = "title"; + public static final String CHOICE_LIST = "choice_list"; + public static final String SELECTED_INDEX = "selected_index"; + + public static final String EDIT_TYPE = "setting_type"; + public static final String EDIT_SEXUAL = "setting_sexual"; + public static final String EDIT_NAME = "setting_name"; + public static final String EDIT_BIRTHDAY = "setting_birthday"; + public static final String EDIT_PHONE = "setting_phone"; + public static final String EDIT_EMAIL = "setting_email"; + public static final String EDIT_SIGN = "setting_sign"; + public static final String SERVER_CONFIG = "imkit_server_config"; + public static final String SERVER_CONFIG_FILE = "imkit_config_info"; + public static final int CHINA_CONFIG = 0; + public static final int OVERSEA_CONFIG = 1; + + public static final int NETWORK_ERROR_CODE = 415; +} diff --git a/app/src/main/java/com/dskj/rbchat/utils/DataUtils.java b/app/src/main/java/com/dskj/rbchat/utils/DataUtils.java new file mode 100644 index 0000000..2b1bb6d --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/utils/DataUtils.java @@ -0,0 +1,501 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.utils; + +import android.content.ClipboardManager; +import android.content.Context; +import android.content.SharedPreferences; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; + +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.main.MainActivity; +import com.dskj.rbchat.model.CountryBean; +import com.dskj.rbchat.model.LoginBean; +import com.netease.yunxin.kit.chatkit.ui.common.ChatDataUtils; +import com.netease.yunxin.kit.corekit.im.IMKitClient; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class DataUtils { + + private static String appKey = null; + private static int serverConfig = -1; + + public static boolean checkPassword(String password) { + String CONTAIN_DIGIT_REGEX = ".*[0-9].*"; + String CONTAIN_LETTER_REGEX = ".*[a-zA-z].*"; + if (password.matches(CONTAIN_DIGIT_REGEX) && password.matches(CONTAIN_LETTER_REGEX)) { + return true; + } else { + return false; + } + } + + + public static String getLauguage(Context context) { + int loc = DataUtils.get(context, "locale", 1); + String lauguage = "zh-CN"; + switch (loc) { + case 1: + lauguage = "zh-CN"; + break; + case 2: + lauguage = "en-US"; + break; + case 3: + lauguage = "ja-JP"; + break; + default: + lauguage = "zh-TW"; + break; + } + return lauguage; + } + + public static String getLauguage(Context context, int loc) { + String lauguage = "zh-CN"; + switch (loc) { + case 1: + lauguage = "zh-CN"; + break; + case 2: + lauguage = "en-US"; + break; + case 3: + lauguage = "ja-JP"; + break; + default: + lauguage = "zh-TW"; + break; + } + return lauguage; + } + + /** + * APP支持的国家地区 + * + * @param context + * @return + */ + public static List getCountry(Context context) { + List countryBeans = new ArrayList<>(); + int localeLan = DataUtils.get(context, "locale", 0); + String jsonStr = ""; + if (localeLan == 1) { + jsonStr = getAssetsJson(context, "countrycn.json"); + } else if (localeLan == 2) { + jsonStr = getAssetsJson(context, "countryen.json"); + } else if (localeLan == 3) { + jsonStr = getAssetsJson(context, "countryja.json"); + } else { + jsonStr = getAssetsJson(context, "countrytw.json"); + } + if (!TextUtils.isEmpty(jsonStr)) { + List countryBeans1 = GsonUtils.getListFromJSON(jsonStr, CountryBean.class); + countryBeans.addAll(countryBeans1); + } +// countryBeans.add(new CountryBean(886,"+886",context.getString(R.string.taiwan_txt))); +// countryBeans.add(new CountryBean(86,"+86",context.getString(R.string.zhongguo_txt))); + + +// countryBeans.add(new CountryBean(81,"+81",context.getString(R.string.riben_txt))); + return countryBeans; + } + + public static String getAssetsJson(Context context, String jsonName) { + StringBuilder stringBuilder = new StringBuilder(); + try { + InputStream inputStream = context.getResources().getAssets().open(jsonName); + InputStreamReader inputStreamReader = new InputStreamReader(inputStream); + BufferedReader bf = new BufferedReader(inputStreamReader); + String read; + while ((read = bf.readLine()) != null) { + stringBuilder.append(read); + } + bf.close(); + inputStreamReader.close(); + inputStream.close(); + } catch (IOException e) { + throw new RuntimeException(e); + } + return stringBuilder.toString(); + } + + /** + * 本地默认国家地区 + * + * @param context + * @return + */ + public static CountryBean getLocCountry(Context context) { + String areaCode; + try { + areaCode = DataUtils.get(context, IMUIKitConfig.LOC_COUNTRY_CODE, "+886"); + } catch (Exception e) { + areaCode = "+" + DataUtils.get(context, IMUIKitConfig.LOC_COUNTRY_CODE, 886); //兼容老版本 + } + List countryBeans = getCountry(context); + for (CountryBean country : countryBeans) { + if (country.getAreaCodeName().equals(areaCode)) { + return country; + } + } + return new CountryBean("+886", context.getString(R.string.taiwan_txt)); + + } + + /** + * 获取版本号 + * + * @return + */ + + public static int getVersionCode(Context context) throws Exception { + +// 获取packagemanager的实例 + + PackageManager packagemanager = context.getPackageManager(); + +// getpackagename()是你当前类的包名,0代表是获取版本信息 + + PackageInfo packinfo = packagemanager.getPackageInfo(context.getPackageName(), 0); + + int version = packinfo.versionCode; + + return version; + + } + + /** + * 获取版本号 + * + * @return + */ + + public static String getVersionName(Context context) throws Exception { + +// 获取packagemanager的实例 + + PackageManager packagemanager = context.getPackageManager(); + +// getpackagename()是你当前类的包名,0代表是获取版本信息 + + PackageInfo packinfo = packagemanager.getPackageInfo(context.getPackageName(), 0); + + String version = packinfo.versionName; + + return version; + + } + + + /** + * 实现文本复制功能 + * add by wangqianzhou + * + * @param content + */ + public static void copy(String content, Context context) { + // 得到剪贴板管理器 + ClipboardManager cmb = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); + cmb.setText(content.trim()); + } + + /** + * 将View对象内容作为内容生成Bitmap对象。 + * + * @param v View对象 + * @return 如果生成成功则返回bitmap对象,否则返回null + * @since 8.0 + */ + public static Bitmap generateBitmap(View v) { + Bitmap bmp = null; + try { + int w = v.getWidth(); + int h = v.getHeight(); + + bmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); + Canvas c = new Canvas(bmp); + + // 如果不设置canvas画布为白色,则生成透明 + c.drawColor(Color.WHITE); + +// v.layout(0, 0, w, h); + v.draw(c); + } catch (OutOfMemoryError oom) { + Log.w("generateBitmap", "从View对象生成Bitmap对象时OOM了!", oom); + } catch (Exception e) { + Log.w("generateBitmap", "从View对象生成Bitmap对象失败了!", e); + } + + return bmp; + } + + /** + * 将dip转换为像素. + */ + public static int dip2px(Context context, float dipValue) { + final float scale = context.getResources().getDisplayMetrics().density; + return (int) (dipValue * scale + 0.5f); + } + + /** + * 格式化long类型的时间戳 + */ + public static String getCurrentTimeTypeNoline(long dates) { + SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyyMMdd"); + String date = sDateFormat.format(new Date(dates)); + return date; + } + + + /** + * 格式化long类型的时间戳 + */ + public static String getCurrentTimeTypeNoline1(Context context, long dates) { + SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyy" + context.getString(R.string.year) + "MM" + context.getString(R.string.month) + "dd" + context.getString(R.string.day)); + String date = sDateFormat.format(new Date(dates)); + return date; + } + + /** + * 格式化long类型的时间戳 + */ + public static String getCurrentTimeType(long dates) { + Date date = new Date(dates); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String formattedDate = sdf.format(date); + return formattedDate; + } + + + /** + * 格式化long类型的时间戳 + */ + public static String getCurrentTimeMonth(long dates) { + Date date = new Date(dates); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM"); + String formattedDate = sdf.format(date); + return formattedDate; + } + + + /* + * 将时间转换为时间戳 + */ + public static long dateToStamp(String s) { + String res; + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); + try { + Date date = simpleDateFormat.parse(s); + long ts = date.getTime(); + return ts; + } catch (ParseException e) { + e.printStackTrace(); + return 0; + } + + } + + /* + * 将时间转换为时间戳 + */ + public static long dateToStampNew(String s) { + String res; + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); + try { + Date date = simpleDateFormat.parse(s); + long ts = date.getTime(); + return ts; + } catch (ParseException e) { + e.printStackTrace(); + return 0; + } + + } + + + /** + * read appKey from manifest + */ + public static String readAppKey(Context context) { + if (appKey != null) { + return appKey; + } + if (context != null) { + + try { + ApplicationInfo appInfo = + context + .getPackageManager() + .getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA); + if (appInfo != null) { + String keyStr = + getServerConfigType(context) == Constant.CHINA_CONFIG + ? Constant.CONFIG_APPKEY_KEY + : Constant.CONFIG_APPKEY_KEY_OVERSEA; + appKey = appInfo.metaData.getString(keyStr); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + return appKey; + } + + public static int getServerConfigType(Context context) { + if (serverConfig < 0) { + serverConfig = getConfigShared(context).getInt(Constant.SERVER_CONFIG, Constant.CHINA_CONFIG); + } + return serverConfig; + } + + public static String getToken() { + LoginBean loginBean = GsonUtils.getObjFromJSON(get(IMApplication.getAppContext(), "login_bean", ""), LoginBean.class); + if (loginBean != null) { + ChatDataUtils.set(IMApplication.getAppContext(), "getAccessToken", "Bearer " + loginBean.getAccessToken()); + return "Bearer " + loginBean.getAccessToken(); + } else { + ChatDataUtils.set(IMApplication.getAppContext(), "getAccessToken", ""); + return ""; + } + } + + public static boolean getIsSendGiftRedPacket() { + LoginBean loginBean = GsonUtils.getObjFromJSON(get(IMApplication.getAppContext(), "login_bean", ""), LoginBean.class); + if (loginBean != null && loginBean.getAllowGiftCoin() != null) { + return loginBean.getAllowGiftCoin() == 1; + } else { + return false; + } + } + + public static boolean getIsMerchant() { + LoginBean loginBean = GsonUtils.getObjFromJSON(get(IMApplication.getAppContext(), "login_bean", ""), LoginBean.class); + if (loginBean != null && loginBean.getIsBiz() != null) { + return loginBean.getIsBiz() == 1; + } else { + return false; + } + } + + + public static LoginBean getLocUserInfo() { + LoginBean loginBean = GsonUtils.getObjFromJSON(get(IMApplication.getAppContext(), "login_bean", ""), LoginBean.class); + if (loginBean != null) { + return loginBean; + } else { + return null; + } + } + + /** + * @param @param key 要获取的key + */ + public static int get(Context context, String key, int defaultValue) { + SharedPreferences nameSetting = getConfigShared(context); + return nameSetting.getInt(key, defaultValue); + } + + /** + * @param key 要设置的key + */ + public static void set(Context activity, String key, int is) { + SharedPreferences nameSetting = getConfigShared(activity); + SharedPreferences.Editor namePref = nameSetting.edit(); + namePref.putInt(key, is); + namePref.commit(); + } + + + /** + * @param @param key 要获取的key + */ + public static String get(Context context, String key, String defaultValue) { + SharedPreferences nameSetting = getConfigShared(context); + return nameSetting.getString(key, defaultValue); + } + + /** + * @param key 要设置的key + */ + public static void set(Context activity, String key, String is) { + SharedPreferences nameSetting = getConfigShared(activity); + SharedPreferences.Editor namePref = nameSetting.edit(); + namePref.putString(key, is); + namePref.commit(); + } + + /** + * @param @param key 要获取的key + */ + public static long get(Context context, String key, long defaultValue) { + SharedPreferences nameSetting = getConfigShared(context); + return nameSetting.getLong(key, defaultValue); + } + + /** + * @param key 要设置的key + */ + public static void set(Context activity, String key, long is) { + SharedPreferences nameSetting = getConfigShared(activity); + SharedPreferences.Editor namePref = nameSetting.edit(); + namePref.putLong(key, is); + namePref.commit(); + } + + + /** + * @param @param key 要获取的key + */ + public static boolean get(Context context, String key, boolean defaultValue) { + SharedPreferences nameSetting = getConfigShared(context); + return nameSetting.getBoolean(key, defaultValue); + } + + /** + * @param key 要设置的key + */ + public static void set(Context activity, String key, boolean is) { + SharedPreferences nameSetting = getConfigShared(activity); + SharedPreferences.Editor namePref = nameSetting.edit(); + namePref.putBoolean(key, is); + namePref.commit(); + } + + + public static SharedPreferences getConfigShared(Context context) { + if (context == null) { + context = IMKitClient.getApplicationContext(); + } + SharedPreferences sharedPreferences = + context.getSharedPreferences(Constant.SERVER_CONFIG_FILE, Context.MODE_MULTI_PROCESS); + return sharedPreferences; + } + + public static float getSizeToM(long size) { + return size / (1024.0f * 1024.0f); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/utils/DateUtil.java b/app/src/main/java/com/dskj/rbchat/utils/DateUtil.java new file mode 100644 index 0000000..86b641d --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/utils/DateUtil.java @@ -0,0 +1,351 @@ +package com.dskj.rbchat.utils; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.Locale; +import java.util.Objects; + +/** + * 日期时间工具类 + */ +public class DateUtil { + public static final String STANDARD_TIME = "yyyy-MM-dd HH:mm:ss"; + public static final String FULL_TIME = "yyyy-MM-dd HH:mm:ss.SSS"; + public static final String YEAR_MONTH_DAY = "yyyy-MM-dd"; + public static final String YEAR_MONTH_DAY_CN = "yyyy年MM月dd号"; + public static final String HOUR_MINUTE_SECOND = "HH:mm:ss"; + public static final String HOUR_MINUTE_SECOND_CN = "HH时mm分ss秒"; + public static final String YEAR = "yyyy"; + public static final String MONTH = "MM"; + public static final String DAY = "dd"; + public static final String HOUR = "HH"; + public static final String MINUTE = "mm"; + public static final String SECOND = "ss"; + public static final String MILLISECOND = "SSS"; + public static final String YESTERDAY = "昨天"; + public static final String TODAY = "今天"; + public static final String TOMORROW = "明天"; + public static final String SUNDAY = "星期日"; + public static final String MONDAY = "星期一"; + public static final String TUESDAY = "星期二"; + public static final String WEDNESDAY = "星期三"; + public static final String THURSDAY = "星期四"; + public static final String FRIDAY = "星期五"; + public static final String SATURDAY = "星期六"; + public static final String[] WEEK_DAYS = {SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY}; + + /** + * 获取标准时间 + * + * @return 例如 2021-07-01 10:35:53 + */ + public static String getDateTime() { + return new SimpleDateFormat(STANDARD_TIME, Locale.CHINESE).format(new Date()); + } + + /** + * 获取完整时间 + * + * @return 例如 2021-07-01 10:37:00.748 + */ + public static String getFullDateTime() { + return new SimpleDateFormat(FULL_TIME, Locale.CHINESE).format(new Date()); + } + + /** + * 获取年月日(今天) + * + * @return 例如 2021-07-01 + */ + public static String getTheYearMonthAndDay() { + return new SimpleDateFormat(YEAR_MONTH_DAY, Locale.CHINESE).format(new Date()); + } + + /** + * 获取年月日 + * + * @return 例如 2021年07月01号 + */ + public static String getTheYearMonthAndDayCn() { + return new SimpleDateFormat(YEAR_MONTH_DAY_CN, Locale.CHINESE).format(new Date()); + } + + /** + * 获取年月日 + * @param delimiter 分隔符 + * @return 例如 2021年07月01号 + */ + public static String getTheYearMonthAndDayDelimiter(CharSequence delimiter) { + return new SimpleDateFormat(YEAR + delimiter + MONTH + delimiter + DAY, Locale.CHINESE).format(new Date()); + } + + /** + * 获取时分秒 + * + * @return 例如 10:38:25 + */ + public static String getHoursMinutesAndSeconds() { + return new SimpleDateFormat(HOUR_MINUTE_SECOND, Locale.CHINESE).format(new Date()); + } + + /** + * 获取时分秒 + * + * @return 例如 10时38分50秒 + */ + public static String getHoursMinutesAndSecondsCn() { + return new SimpleDateFormat(HOUR_MINUTE_SECOND_CN, Locale.CHINESE).format(new Date()); + } + + /** + * 获取时分秒 + * @param delimiter 分隔符 + * @return 例如 2021/07/01 + */ + public static String getHoursMinutesAndSecondsDelimiter(CharSequence delimiter) { + return new SimpleDateFormat(HOUR + delimiter + MINUTE + delimiter + SECOND, Locale.CHINESE).format(new Date()); + } + + /** + * 获取年 + * + * @return 例如 2021 + */ + public static String getYear() { + return new SimpleDateFormat(YEAR, Locale.CHINESE).format(new Date()); + } + + /** + * 获取月 + * + * @return 例如 07 + */ + public static String getMonth() { + return new SimpleDateFormat(MONTH, Locale.CHINESE).format(new Date()); + } + + /** + * 获取天 + * + * @return 例如 01 + */ + public static String getDay() { + return new SimpleDateFormat(DAY, Locale.CHINESE).format(new Date()); + } + + /** + * 获取小时 + * + * @return 例如 10 + */ + public static String getHour() { + return new SimpleDateFormat(HOUR, Locale.CHINESE).format(new Date()); + } + + /** + * 获取分钟 + * + * @return 例如 40 + */ + public static String getMinute() { + return new SimpleDateFormat(MINUTE, Locale.CHINESE).format(new Date()); + } + + /** + * 获取秒 + * + * @return 例如 58 + */ + public static String getSecond() { + return new SimpleDateFormat(SECOND, Locale.CHINESE).format(new Date()); + } + + /** + * 获取毫秒 + * + * @return 例如 666 + */ + public static String getMilliSecond() { + return new SimpleDateFormat(MILLISECOND, Locale.CHINESE).format(new Date()); + } + + /** + * 获取时间戳 + * + * @return 例如 1625107306051 + */ + public static long getTimestamp() { + return System.currentTimeMillis(); + } + + /** + * 获取第二天凌晨0点时间戳 + * @return + */ + public static long getMillisNextEarlyMorning() { + Calendar cal = Calendar.getInstance(); + //日期加1 + cal.add(Calendar.DAY_OF_YEAR, 1); + //时间设定到0点整 + cal.set(Calendar.HOUR_OF_DAY, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.MILLISECOND, 0); + return cal.getTimeInMillis(); + } + + /** + * 将时间转换为时间戳 + * + * @param time 例如 2021-07-01 10:44:11 + * @return 1625107451000 + */ + public static long dateToStamp(String time) { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat(STANDARD_TIME, Locale.CHINESE); + Date date = null; + try { + date = simpleDateFormat.parse(time); + } catch (ParseException e) { + e.printStackTrace(); + } + return Objects.requireNonNull(date).getTime(); + } + + /** + * 将时间戳转换为时间 + * + * @param timeMillis 例如 1625107637084 + * @return 例如 2021-07-01 10:47:17 + */ + public static String stampToDate(long timeMillis) { + return new SimpleDateFormat(STANDARD_TIME, Locale.CHINESE).format(new Date(timeMillis)); + } + + /** + * 获取今天是星期几 + * + * @return 例如 星期四 + */ + public static String getTodayOfWeek() { + Calendar cal = Calendar.getInstance(); + cal.setTime(new Date()); + int index = cal.get(Calendar.DAY_OF_WEEK) - 1; + if (index < 0) { + index = 0; + } + return WEEK_DAYS[index]; + } + + /** + * 根据输入的日期时间计算是星期几 + * + * @param dateTime 例如 2021-06-20 + * @return 例如 星期日 + */ + public static String getWeek(String dateTime) { + Calendar cal = Calendar.getInstance(); + if ("".equals(dateTime)) { + cal.setTime(new Date(System.currentTimeMillis())); + } else { + SimpleDateFormat sdf = new SimpleDateFormat(YEAR_MONTH_DAY, Locale.getDefault()); + Date date; + try { + date = sdf.parse(dateTime); + } catch (ParseException e) { + date = null; + e.printStackTrace(); + } + if (date != null) { + cal.setTime(new Date(date.getTime())); + } + } + return WEEK_DAYS[cal.get(Calendar.DAY_OF_WEEK) - 1]; + } + + /** + * 获取输入日期的昨天 + * + * @param date 例如 2021-07-01 + * @return 例如 2021-06-30 + */ + public static String getYesterday(Date date) { + Calendar calendar = new GregorianCalendar(); + calendar.setTime(date); + calendar.add(Calendar.DATE, -1); + date = calendar.getTime(); + return new SimpleDateFormat(YEAR_MONTH_DAY, Locale.getDefault()).format(date); + } + + /** + * 获取输入日期的明天 + * + * @param date 例如 2021-07-01 + * @return 例如 2021-07-02 + */ + public static String getTomorrow(Date date) { + Calendar calendar = new GregorianCalendar(); + calendar.setTime(date); + calendar.add(Calendar.DATE, +1); + date = calendar.getTime(); + return new SimpleDateFormat(YEAR_MONTH_DAY, Locale.getDefault()).format(date); + } + + /** + * 根据年月日计算是星期几并与当前日期判断 非昨天、今天、明天 则以星期显示 + * + * @param dateTime 例如 2021-07-03 + * @return 例如 星期六 + */ + public static String getDayInfo(String dateTime) { + String dayInfo; + String yesterday = getYesterday(new Date()); + String today = getTheYearMonthAndDay(); + String tomorrow = getTomorrow(new Date()); + + if (dateTime.equals(yesterday)) { + dayInfo = YESTERDAY; + } else if (dateTime.equals(today)) { + dayInfo = TODAY; + } else if (dateTime.equals(tomorrow)) { + dayInfo = TOMORROW; + } else { + dayInfo = getWeek(dateTime); + } + return dayInfo; + } + + /** + * 获取本月天数 + * + * @return 例如 31 + */ + public static int getCurrentMonthDays() { + Calendar calendar = Calendar.getInstance(); + //把日期设置为当月第一天 + calendar.set(Calendar.DATE, 1); + //日期回滚一天,也就是最后一天 + calendar.roll(Calendar.DATE, -1); + return calendar.get(Calendar.DATE); + } + + /** + * 获得指定月的天数 + * + * @param year 例如 2021 + * @param month 例如 7 + * @return 例如 31 + */ + public static int getMonthDays(int year, int month) { + Calendar calendar = Calendar.getInstance(); + calendar.set(Calendar.YEAR, year); + calendar.set(Calendar.MONTH, month - 1); + //把日期设置为当月第一天 + calendar.set(Calendar.DATE, 1); + //日期回滚一天,也就是最后一天 + calendar.roll(Calendar.DATE, -1); + return calendar.get(Calendar.DATE); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/utils/FileUtils.java b/app/src/main/java/com/dskj/rbchat/utils/FileUtils.java new file mode 100644 index 0000000..0130f85 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/utils/FileUtils.java @@ -0,0 +1,64 @@ +package com.dskj.rbchat.utils; + +import android.app.Activity; + +import com.blankj.utilcode.util.ToastUtils; +import com.dskj.rbchat.model.AiChatUpdateEvent; +import com.dskj.rbchat.model.AiMessageBean; +import com.netease.yunxin.kit.corekit.event.EventCenter; +import com.netease.yunxin.kit.corekit.im.IMKitClient; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.util.ArrayList; + +public class FileUtils { + + private static final String chatFileName = "aichatfile"; + + public static String getChatData(Activity activity) { + try { + File file = new File(activity.getFilesDir(), IMKitClient.account()+"_"+chatFileName); + if (file.exists()) { + String filePath = file.getAbsolutePath(); + BufferedReader reader = new BufferedReader(new FileReader(filePath)); + StringBuilder stringBuilder = new StringBuilder(); + String content; + while ((content = reader.readLine()) != null) { + stringBuilder.append(content); + } + reader.close(); + return stringBuilder.toString(); + } + } catch (FileNotFoundException e) { + throw new RuntimeException(e); + } catch (IOException e) { + throw new RuntimeException(e); + } + return ""; + } + + public static void writeData(Activity activity, ArrayList chatMessageBeans) { + try { +// if (chatMessageBeans.size() > 100) { //只存100条 +// chatMessageBeans.remove(0); +// } + File file = new File(activity.getFilesDir(), IMKitClient.account()+"_"+chatFileName); + String jsonString = GsonUtils.beanToJSONString(chatMessageBeans); + FileWriter fileWriter = new FileWriter(file, false); + BufferedWriter bufferedWriter = new BufferedWriter(fileWriter); + bufferedWriter.write(jsonString); + bufferedWriter.close(); + EventCenter.notifyEvent(new AiChatUpdateEvent(chatMessageBeans.size() == 0 ? "" : chatMessageBeans.get(chatMessageBeans.size() - 1).getMessage())); + } catch (IOException e) { + LogUtils.i(e.getMessage()); + ToastUtils.showLong("保存异常" + e.getMessage()); + } + + } +} diff --git a/app/src/main/java/com/dskj/rbchat/utils/GetAndroidUniqueMark.java b/app/src/main/java/com/dskj/rbchat/utils/GetAndroidUniqueMark.java new file mode 100644 index 0000000..968ab3f --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/utils/GetAndroidUniqueMark.java @@ -0,0 +1,54 @@ +package com.dskj.rbchat.utils; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.os.Build; +import android.provider.Settings; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +/** + * 设备码的一些东西 + * @author + */ + +public class GetAndroidUniqueMark { + + public static String getUniqueId(Context context) { + @SuppressLint("HardwareIds") + // ANDROID_ID是设备第一次启动时产生和存储的64bit的一个数,当设备被wipe后该数重置。 + String androidID = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID); + @SuppressLint("HardwareIds") + String id = androidID + Build.SERIAL; // +硬件序列号 + try { + return toMD5(id); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + return id; + } + } + + public static String toMD5(String text) throws NoSuchAlgorithmException { + //获取摘要器 MessageDigest + MessageDigest messageDigest = MessageDigest.getInstance("MD5"); + //通过摘要器对字符串的二进制字节数组进行hash计算 + byte[] digest = messageDigest.digest(text.getBytes()); + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < digest.length; i++) { + //循环每个字符 将计算结果转化为正整数; + int digestInt = digest[i] & 0xff; + //将10进制转化为较短的16进制 + String hexString = Integer.toHexString(digestInt); + //转化结果如果是个位数会省略0,因此判断并补0 + if (hexString.length() < 2) { + sb.append(0); + } + //将循环结果添加到缓冲区 + sb.append(hexString); + } + //返回整个结果 + return sb.toString().substring(8, 24); + } + +} diff --git a/app/src/main/java/com/dskj/rbchat/utils/GsonUtils.java b/app/src/main/java/com/dskj/rbchat/utils/GsonUtils.java new file mode 100644 index 0000000..ad8b5c4 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/utils/GsonUtils.java @@ -0,0 +1,91 @@ +package com.dskj.rbchat.utils; + +import android.text.TextUtils; + +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.reflect.TypeToken; + +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.List; + +/** + * json解析工具类 其实对于数组解析有一些问题 + * @author + */ +public class GsonUtils { + + public static Gson gson = new Gson(); + + /** + * 返回List对象 + * @param str + * @param type new TypeToken>(){}.getType() + * @param + * @return + */ + public static T getListFromJSON(String str, Type type) { + if (!TextUtils.isEmpty(str)) { + return gson.fromJson(str, type); + } + return null; + } + + /** + * 返回List对象 + * @param str + * @param cls + * @param + * @return + */ + public static List getListFromJSON(String str, Class cls) + { + Type type = new TypeToken>() + {}.getType(); + ArrayList jsonObjects = gson.fromJson(str, type); + ArrayList arrayList = new ArrayList<>(); + for (JsonObject jsonObject : jsonObjects) + { + arrayList.add(gson.fromJson(jsonObject, cls)); + } + return arrayList; + } + + /** + * 返回对象 + * @param str + * @param cls + * @param + * @return + */ + public static T getObjFromJSON(String str, Class cls) { + try { + if (!TextUtils.isEmpty(str)) { +// LogUtils.i("参数:"+str); + return gson.fromJson(str, cls); + } + return null; + }catch (Exception e) { + return null; + } + } + + /** + * 返回JsonString + * @return + */ + public static String beanToJSONString(Object bean) { + return new Gson().toJson(bean); + } + + + public static String JSONTokener(String in) { + // consume an optional byte order mark (BOM) if it exists + if (in != null && in.startsWith("\ufeff")) { + in = in.substring(1); + } + return in; + } + +} diff --git a/app/src/main/java/com/dskj/rbchat/utils/ImageCacheLoader.java b/app/src/main/java/com/dskj/rbchat/utils/ImageCacheLoader.java new file mode 100644 index 0000000..cffe048 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/utils/ImageCacheLoader.java @@ -0,0 +1,227 @@ + +package com.dskj.rbchat.utils; + +import android.content.Context; +import android.widget.ImageView; + +import androidx.fragment.app.Fragment; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.RequestManager; +import com.bumptech.glide.load.MultiTransformation; +import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.bumptech.glide.load.resource.bitmap.CenterCrop; +import com.bumptech.glide.load.resource.bitmap.RoundedCorners; +import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions; +import com.bumptech.glide.request.RequestOptions; +import com.bumptech.glide.request.transition.DrawableCrossFadeFactory; +import com.bumptech.glide.signature.ObjectKey; +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; + + +/** + * 新版图片缓存加载封装类。 + * + * @since 8.0 + */ +public class ImageCacheLoader { + + /** + * 从网络加载图片。 + * + * @param c Context对象 + * @param url 网络加载地址 + * @param signatureKey 签名字符串,Glide中相同的URL是无法判定图片是否被更新(因为它读缓存时压根就不用通过网络从服务端取) + * ,这个签名字符串就是用于当图片内容变更时能即时从网络加载一次,这个签名内容通常可以是图片的md5码等, + * ,在rainbowchat中的用户头像时,这个签名可以用头像文件名(因为文件名就是用头像图片文件数据的md5码命名的)。 + * 关于signature的说,请见官方资料:https://muyangmin.github.io/glide-docs-cn/doc/caching.html + * @param iv 要显示图片的ui组件 + * @param roundCorner roundCorner 圆角半径,单位:dp,不需要圆角则请填0 + * @param placeholderResId 默认占位图设置,不需要则请填-1 + * @param errorPlaceholderResId 加载出错时要显示的占位图,不需要则请填-1 + * @param dontDiskCache 跳过磁盘缓存,这种情况可确保在app重启时不从磁盘加载(从而有机会从网络加载一次),用户至少有机会在下次重启时更新图片显示。默认请填false! + * @param skipMemoryCache 跳过内存缓存,在dontDiskCache==true的情况下,可确保每次都从网络加载,尽最大可能确保在图片改变的情况下能第一时间更新显示。默认请填false! + * @see #loadImgWithGlide(RequestManager, String, String, ImageView, int, int, int, boolean, boolean) + */ + public static void loadImgWithGlide(Context c, String url, String signatureKey, ImageView iv, int roundCorner + , int placeholderResId, int errorPlaceholderResId, boolean dontDiskCache, boolean skipMemoryCache) { + loadImgWithGlide(Glide.with(c), url, signatureKey, iv, roundCorner, placeholderResId, errorPlaceholderResId, dontDiskCache, skipMemoryCache); + } + + /** + * 从网络加载图片。 + * + * @param f Fragment对象 + * @param url 网络加载地址 + * @param signatureKey 签名字符串,Glide中相同的URL是无法判定图片是否被更新(因为它读缓存时压根就不用通过网络从服务端取) + * ,这个签名字符串就是用于当图片内容变更时能即时从网络加载一次,这个签名内容通常可以是图片的md5码等, + * ,在rainbowchat中的用户头像时,这个签名可以用头像文件名(因为文件名就是用头像图片文件数据的md5码命名的)。 + * 关于signature的说,请见官方资料:https://muyangmin.github.io/glide-docs-cn/doc/caching.html + * @param iv 要显示图片的ui组件 + * @param roundCorner roundCorner 圆角半径,单位:dp,不需要圆角则请填0 + * @param placeholderResId 默认占位图设置,不需要则请填-1 + * @param errorPlaceholderResId 加载出错时要显示的占位图,不需要则请填-1 + * @param dontDiskCache 跳过磁盘缓存,这种情况可确保在app重启时不从磁盘加载(从而有机会从网络加载一次),用户至少有机会在下次重启时更新图片显示。默认请填false! + * @param skipMemoryCache 跳过内存缓存,在dontDiskCache==true的情况下,可确保每次都从网络加载,尽最大可能确保在图片改变的情况下能第一时间更新显示。默认请填false! + * @see #loadImgWithGlide(RequestManager, String, String, ImageView, int, int, int, boolean, boolean) + */ + public static void loadImgWithGlide(Fragment f, String url, String signatureKey, ImageView iv, int roundCorner + , int placeholderResId, int errorPlaceholderResId, boolean dontDiskCache, boolean skipMemoryCache) { + loadImgWithGlide(Glide.with(f), url, signatureKey, iv, roundCorner, placeholderResId, errorPlaceholderResId, dontDiskCache, skipMemoryCache); + } + + /** + * 从网络加载图片。 + * + * @param rm RequestManager 对象 + * @param url 网络加载地址 + * @param signatureKey 签名字符串,Glide中相同的URL是无法判定图片是否被更新(因为它读缓存时压根就不用通过网络从服务端取) + * ,这个签名字符串就是用于当图片内容变更时能即时从网络加载一次,这个签名内容通常可以是图片的md5码等, + * ,在rainbowchat中的用户头像时,这个签名可以用头像文件名(因为文件名就是用头像图片文件数据的md5码命名的)。 + * 关于signature的说,请见官方资料:https://muyangmin.github.io/glide-docs-cn/doc/caching.html + * @param iv 要显示图片的ui组件 + * @param roundCorner roundCorner 圆角半径,单位:dp,不需要圆角则请填0 + * @param placeholderResId 默认占位图设置,不需要则请填-1 + * @param errorPlaceholderResId 加载出错时要显示的占位图,不需要则请填-1 + * @param dontDiskCache 跳过磁盘缓存,这种情况可确保在app重启时不从磁盘加载(从而有机会从网络加载一次),用户至少有机会在下次重启时更新图片显示。默认请填false! + * @param skipMemoryCache 跳过内存缓存,在dontDiskCache==true的情况下,可确保每次都从网络加载,尽最大可能确保在图片改变的情况下能第一时间更新显示。默认请填false! + */ + public static void loadImgWithGlide(RequestManager rm, String url, String signatureKey + , ImageView iv, int roundCorner, int placeholderResId, int errorPlaceholderResId + , boolean dontDiskCache, boolean skipMemoryCache) { + + RequestOptions ros = new RequestOptions(); + + // 有签名字符串时 + if (signatureKey != null) { + // 头像文件名是由图片文件的md5码组成,当头像更新时,此文件名也会改变,因此作为Glide的签名是合适 + // 的,这样当好友更新头像之后Glide能取到最新头像,否由load方法中的头像加载url是固定的情况下就永 + // 远没办法取到最新头像了(因为Glide通过固定url读取到的会一直是本地缓存) + ros = ros.signature(new ObjectKey(signatureKey)); + } + + // 当前app是否能正常与服务器通信(能正常通信,意味着网络一定是正常) +// boolean isConnectedToServer = ClientCoreSDK.getInstance().isConnectedToServer(); + boolean isConnectedToServer = true; + + // 跳过磁盘缓存,这种情况可确保在app重启时不从磁盘加载(从而有机会从网络加载一次),用户至少有机会在下次重启时更新图片显示 + if (dontDiskCache && isConnectedToServer) {// 加上isConnectedToServer的条件,是确保在无网的情况下还是能通过缓存显示,不然APP空白无图时太丑了 + // 官方资料请见:https://muyangmin.github.io/glide-docs-cn/doc/caching.html#%E8%B7%B3%E8%BF%87%E7%BC%93%E5%AD%98 + ros = ros.diskCacheStrategy(DiskCacheStrategy.NONE); + } +// else{//? +// // 磁盘缓存所有图 +// ros = ros.diskCacheStrategy(DiskCacheStrategy.ALL); +// } + + // 跳过内存缓存,在dontDiskCache==true的情况下,可确保每次都从网络加载,尽最大可能确保在图片改变的情况下能第一时间更新显示 + if (skipMemoryCache && isConnectedToServer) {// 加上isConnectedToServer的条件,是确保在无网的情况下还是能通过缓存显示,不然APP空白无图时太丑了 + // 官方资料请见:https://muyangmin.github.io/glide-docs-cn/doc/caching.html#%E8%B7%B3%E8%BF%87%E7%BC%93%E5%AD%98 + ros = ros.skipMemoryCache(true); + } + + // 图片圆角设置(当圆角大小大于或等于图片半径时,就是圆形图了) + if (roundCorner > 0) + ros = ros.optionalTransform(new MultiTransformation(new CenterCrop(), new RoundedCorners(DataUtils.dip2px(IMApplication.getAppContext(), roundCorner)))); + + // 默认占位图设置 + if (placeholderResId > 0) + ros = ros.placeholder(placeholderResId);//.transforms(new CenterCrop(), roundedCorners); + + // 加载出错时要显示的占位图 + if (errorPlaceholderResId > 0) + ros = ros.error(errorPlaceholderResId); +// LogUtils.i("头像呢?" + url); + + rm.load(url) + // 过渡动画 + .transition(DrawableTransitionOptions.with(new DrawableCrossFadeFactory.Builder().setCrossFadeEnabled(true).build())) + // 各种配置选项 + .apply(ros) + // 显示到目标组件上 + .into(iv); + } + + /** + * 从网络加载用户头像。 + * + * @param rm RequestManager对象 + * @param uid 用户uid + * @param signatureKey 签名字符串,Glide中相同的URL是无法判定图片是否被更新(因为它读缓存时压根就不用通过网络从服务端取) + * ,这个签名字符串就是用于当图片内容变更时能即时从网络加载一次,这个签名内容通常可以是图片的md5码等, + * ,在rainbowchat中的用户头像时,这个签名可以用头像文件名(因为文件名就是用头像图片文件数据的md5码命名的)。 + * 关于signature的说,请见官方资料:https://muyangmin.github.io/glide-docs-cn/doc/caching.html + * @param iv 要显示图片的ui组件 + * @param roundCorner roundCorner 圆角半径,单位:dp,不需要圆角则请填0 + * @param placeholderResId 默认占位图设置,不需要则请填-1 + * @param dontDiskCache 跳过磁盘缓存,这种情况可确保在app重启时不从磁盘加载(从而有机会从网络加载一次),用户至少有机会在下次重启时更新图片显示。默认请填false! + * @param skipMemoryCache 跳过内存缓存,在dontDiskCache==true的情况下,可确保每次都从网络加载,尽最大可能确保在图片改变的情况下能第一时间更新显示。默认请填false! + * @see #loadImgWithGlide(RequestManager, String, String, ImageView, int, int, int, boolean, boolean) + */ + public static void loadAvatarImgWithGlide(RequestManager rm, String uid, String signatureKey + , ImageView iv, int roundCorner, int placeholderResId, boolean dontDiskCache, boolean skipMemoryCache) { + String url = getUserAvatarDownloadURL2022(uid); + loadImgWithGlide(rm, url, signatureKey, iv, roundCorner, placeholderResId, -1, dontDiskCache, skipMemoryCache); + + + } + public static String getUserAvatarDownloadURL2022(String userUid) + { + + + String fileURL = IMUIKitConfig.AVATAR_DOWNLOAD_CONTROLLER_URL_ROOT + + "?action=ad" + + "&user_uid=" + userUid + + "&enforceDawnload=1" + // 尾巴上加一个签名字符串,可以放头像文件的md5码等,这样对于同一个uid的用户,在使用Glide这样的库时如 + // 果它的头像改变时能通过此签名的改变而取到最新的头像,否则Glide就没办法即时取到最新头像了 +// +(signature == null ?"":"&v="+signature) + ; + return fileURL; + + } + /** + * 从网络加载用户头像。 + * + * @param c Context对象 + * @param uid 用户uid + * @param signatureKey 签名字符串,Glide中相同的URL是无法判定图片是否被更新(因为它读缓存时压根就不用通过网络从服务端取) + * ,这个签名字符串就是用于当图片内容变更时能即时从网络加载一次,这个签名内容通常可以是图片的md5码等, + * ,在rainbowchat中的用户头像时,这个签名可以用头像文件名(因为文件名就是用头像图片文件数据的md5码命名的)。 + * 关于signature的说,请见官方资料:https://muyangmin.github.io/glide-docs-cn/doc/caching.html + * @param iv 要显示图片的ui组件 + * @param roundCorner roundCorner 圆角半径,单位:dp,不需要圆角则请填0 + * @param placeholderResId 默认占位图设置,不需要则请填-1 + * @param dontDiskCache 跳过磁盘缓存,这种情况可确保在app重启时不从磁盘加载(从而有机会从网络加载一次),用户至少有机会在下次重启时更新图片显示。默认请填false! + * @param skipMemoryCache 跳过内存缓存,在dontDiskCache==true的情况下,可确保每次都从网络加载,尽最大可能确保在图片改变的情况下能第一时间更新显示。默认请填false! + * @see #loadImgWithGlide(RequestManager, String, String, ImageView, int, int, int, boolean, boolean) + */ + public static void loadAvatarImgWithGlide(Context c, String uid, String signatureKey, ImageView iv, int roundCorner + , int placeholderResId, boolean dontDiskCache, boolean skipMemoryCache) { + loadAvatarImgWithGlide(Glide.with(c), uid, signatureKey, iv, roundCorner, placeholderResId, dontDiskCache, skipMemoryCache); + } + + /** + * 从网络加载用户头像。 + * + * @param f Fragment对象 + * @param uid 用户uid + * @param signatureKey 签名字符串,Glide中相同的URL是无法判定图片是否被更新(因为它读缓存时压根就不用通过网络从服务端取) + * ,这个签名字符串就是用于当图片内容变更时能即时从网络加载一次,这个签名内容通常可以是图片的md5码等, + * ,在rainbowchat中的用户头像时,这个签名可以用头像文件名(因为文件名就是用头像图片文件数据的md5码命名的)。 + * 关于signature的说,请见官方资料:https://muyangmin.github.io/glide-docs-cn/doc/caching.html + * @param iv 要显示图片的ui组件 + * @param roundCorner roundCorner 圆角半径,单位:dp,不需要圆角则请填0 + * @param placeholderResId 默认占位图设置,不需要则请填-1 + * @param dontDiskCache 跳过磁盘缓存,这种情况可确保在app重启时不从磁盘加载(从而有机会从网络加载一次),用户至少有机会在下次重启时更新图片显示。默认请填false! + * @param skipMemoryCache 跳过内存缓存,在dontDiskCache==true的情况下,可确保每次都从网络加载,尽最大可能确保在图片改变的情况下能第一时间更新显示。默认请填false! + * @see #loadImgWithGlide(RequestManager, String, String, ImageView, int, int, int, boolean, boolean) + */ + public static void loadAvatarImgWithGlide(Fragment f, String uid, String signatureKey, ImageView iv, int roundCorner + , int placeholderResId, boolean dontDiskCache, boolean skipMemoryCache) { + loadAvatarImgWithGlide(Glide.with(f), uid, signatureKey, iv, roundCorner, placeholderResId, dontDiskCache, skipMemoryCache); + } + +} diff --git a/app/src/main/java/com/dskj/rbchat/utils/ImageLoader.java b/app/src/main/java/com/dskj/rbchat/utils/ImageLoader.java new file mode 100644 index 0000000..2ece2e5 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/utils/ImageLoader.java @@ -0,0 +1,32 @@ +package com.dskj.rbchat.utils; + +import static com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions.withCrossFade; + +import android.content.Context; +import android.widget.ImageView; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.annotation.GlideModule; +import com.bumptech.glide.module.AppGlideModule; +import com.bumptech.glide.request.RequestListener; +import com.bumptech.glide.request.RequestOptions; +import com.dskj.rbchat.model.AdBean; + +/** + * Created by Meiji on 2017/5/31. + */ +@GlideModule +public class ImageLoader extends AppGlideModule { + + + + /** + * 带加载异常图片 + */ + public static void loadCenterCropBanner(Context context, AdBean url, ImageView view, int defaultResId, int errorResId) { + + Glide.with(context).load(url.getImgUrl()).thumbnail(Glide.with(context).load(defaultResId)).apply(new RequestOptions().centerCrop().error(errorResId)).into(view); + + } + +} diff --git a/app/src/main/java/com/dskj/rbchat/utils/ItemDragTouchHelper.java b/app/src/main/java/com/dskj/rbchat/utils/ItemDragTouchHelper.java new file mode 100644 index 0000000..420d98d --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/utils/ItemDragTouchHelper.java @@ -0,0 +1,28 @@ +package com.dskj.rbchat.utils; + +import androidx.recyclerview.widget.RecyclerView; + +public interface ItemDragTouchHelper { + /** + * 交换 + * + * @param source + * @param target + */ + void onItemMove(RecyclerView.ViewHolder source, RecyclerView.ViewHolder target); + + /** + * 选中 + * + * @param source + */ + void onItemSelect(RecyclerView.ViewHolder source); + + /** + * 状态清除 + * + * @param source + */ + void onItemClear(RecyclerView.ViewHolder source); +} + diff --git a/app/src/main/java/com/dskj/rbchat/utils/ItemDragTouchHelperCallback.java b/app/src/main/java/com/dskj/rbchat/utils/ItemDragTouchHelperCallback.java new file mode 100644 index 0000000..07213c9 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/utils/ItemDragTouchHelperCallback.java @@ -0,0 +1,64 @@ +package com.dskj.rbchat.utils; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.ItemTouchHelper; +import androidx.recyclerview.widget.RecyclerView; + +public class ItemDragTouchHelperCallback extends ItemTouchHelper.Callback { + private ItemDragTouchHelper helper; + + public ItemDragTouchHelperCallback(ItemDragTouchHelper helper) { + this.helper = helper; + } + + @Override + public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) { + // 上下左右都可以拖拽 + int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT; + return makeMovementFlags(dragFlags, 0); + } + + @Override + public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) { + helper.onItemMove(viewHolder, target); + return true; + } + + @Override + public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) { + + } + + /** + * @return + */ + @Override + public boolean isLongPressDragEnabled() { + return true; + } + + @Override + public boolean isItemViewSwipeEnabled() { + return false; + } + + + @Override + public void clearView(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) { + super.clearView(recyclerView, viewHolder); + if (!recyclerView.isComputingLayout()) { + helper.onItemClear(viewHolder); + } + } + + @Override + public void onSelectedChanged(@Nullable RecyclerView.ViewHolder viewHolder, int actionState) { + super.onSelectedChanged(viewHolder, actionState); + if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) { + helper.onItemSelect(viewHolder); + } + } +} + + diff --git a/app/src/main/java/com/dskj/rbchat/utils/KeyboardUtil.java b/app/src/main/java/com/dskj/rbchat/utils/KeyboardUtil.java new file mode 100644 index 0000000..d3b5d2f --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/utils/KeyboardUtil.java @@ -0,0 +1,135 @@ +package com.dskj.rbchat.utils; + +import android.app.Activity; +import android.content.Context; +import android.view.View; +import android.view.inputmethod.InputMethodManager; + +/** + * 用于监听键盘是否弹出,并获取键盘高度 + */ +public class KeyboardUtil { + Activity mContext; + /** + * 虚拟键盘高度 + */ + int virtualKeyboardHeight; + /** + * 屏幕高度 + */ + int screenHeight; + /** + * 屏幕6分之一的高度,作用是防止获取到虚拟键盘的高度 + */ + int screenHeight6; + View rootView; + + public KeyboardUtil(Activity context) { + this.mContext = context; + /** + * 获取屏幕的高度,该方式的获取不包含虚拟键盘 + */ + screenHeight = mContext.getResources().getDisplayMetrics().heightPixels; + screenHeight6 = screenHeight / 6; + rootView = mContext.getWindow().getDecorView(); + } + +// /** +// * @param listener +// */ +// public void setOnKeyboardChangeListener(final KeyboardChangeListener listener) { +// //当键盘弹出隐藏的时候会 调用此方法。 +// rootView.getViewTreeObserver().addOnGlobalLayoutListener(() -> { +// /** +// * 回调该方法时rootView还未绘制,需要设置绘制完成监听 +// */ +// rootView.post(() -> { +// Rect rect = new Rect(); +// /** +// * 获取屏幕底部坐标 +// */ +// rootView.getWindowVisibleDisplayFrame(rect); +// /** +// * 获取键盘的高度 +// */ +// int heightDifference = screenHeight - rect.bottom; +// if (heightDifference < screenHeight6) { +// virtualKeyboardHeight = heightDifference; +// if (listener != null) { +// listener.onKeyboardHide(); +// } +// } else { +// if (listener != null) { +// listener.onKeyboardShow(heightDifference - virtualKeyboardHeight); +// } +// } +// }); +// }); +// } + + /** + * 软键盘状态切换监听 + */ + public interface KeyboardChangeListener { + /** + * 键盘弹出 + * + * @param keyboardHight 键盘高度 + */ + void onKeyboardShow(int keyboardHight); + + /** + * 键盘隐藏 + */ + void onKeyboardHide(); + } + + /** + * 显示软键盘 + * + * @param context 当前Activity + */ + public static void showSoftInput(Context context) { + InputMethodManager inputMethodManager =(InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); + inputMethodManager.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS); + } + + /** + * 隐藏软键盘 + * + * @param activity 当前Activity + */ + public static void hideSoftInput(Activity activity) { + InputMethodManager inputMethodManager = + (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE); + inputMethodManager.hideSoftInputFromWindow( + activity.getWindow().getDecorView().getWindowToken(), 0); + } + + public static void showSoftInput(Context context, View view) { + InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); +// imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS); + imm.showSoftInput(view, InputMethodManager.SHOW_FORCED); + } + + public static void hideSoftInput(Context context, View view) { + InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); + imm.hideSoftInputFromWindow(view.getWindowToken(), 0); //强制隐藏键盘 + } + + public static boolean isShowSoftInput(Context context) { + InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); + //获取状态信息 + return imm.isActive();//true 打开 + } + + /** + * 是否显示,显示则关闭,没显示则显示 + * + * @param context + */ + public static void isShow(Context context) { + InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); + imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/utils/LogUtils.java b/app/src/main/java/com/dskj/rbchat/utils/LogUtils.java new file mode 100644 index 0000000..2bfb325 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/utils/LogUtils.java @@ -0,0 +1,148 @@ +package com.dskj.rbchat.utils; + +import android.util.Log; + +import com.dskj.rbchat.BuildConfig; + + +/** + * Log统一管理类 + * Created by on 2015/10/19 0019. + */ +public class LogUtils { + + private LogUtils() { + throw new UnsupportedOperationException("cannot be instantiated"); + } + +// public static boolean isDebug = ApiService.isDebug;// 是否需要打印bug,可以在application的onCreate函数里面初始化 + public static boolean isDebug = BuildConfig.BUILD_TYPE.equals("debug");// 是否需要打印bug,可以在application的onCreate函数里面初始化 +// public static boolean isDebug = false;// 是否需要打印bug,可以在application的onCreate函数里面初始化 + + private static final String TAG = "LAILIAOLIAO"; + + /** + * 默认tag的函数 + * + * @param msg 打印信息 + */ + public static void v(String msg) { + if (isDebug) Log.v(TAG, msg); + } + + public static void d(String msg) { + if (isDebug) Log.d(TAG, msg); + } + + public static void i(String msg) { + if (isDebug) { + if (msg.length() > 4000) { + Log.i( TAG,"BIKAOVIDEOsb.length = " + msg.length()); + int chunkCount = msg.length() / 4000; // integer division + for (int i = 0; i <= chunkCount; i++) { + int max = 4000 * (i + 1); + if (max >= msg.length()) { + Log.i( TAG,"XHXchunk " + i + " of " + chunkCount + ":" + msg.substring(4000 * i)); + } else { + Log.i( TAG,"XHXchunk " + i + " of " + chunkCount + ":" + msg.substring(4000 * i, max)); + } + } + } else { + Log.i( TAG,"BIKAOVIDEO" + msg.toString()); + } + } + } + + public static void w(String msg) { + if (isDebug) Log.w(TAG, msg); + } + + public static void e(String msg) { + if (isDebug) { + if (msg.length() > 4000) { + Log.e(TAG, "sb.length = " + msg.length()); + int chunkCount = msg.length() / 4000; // integer division + for (int i = 0; i <= chunkCount; i++) { + int max = 4000 * (i + 1); + if (max >= msg.length()) { + Log.e(TAG, "XHXchunk " + i + " of " + chunkCount + ":" + msg.substring(4000 * i)); + } else { + Log.e(TAG, "XHXchunk " + i + " of " + chunkCount + ":" + msg.substring(4000 * i, max)); + } + } + } else { + Log.e(TAG, "XHX" + msg.toString()); + } + + } + + } + + /** + * 自定义lag的函数 + * + * @param tag tag + * @param msg 打印信息 + */ + public static void v(String tag, String msg) { + if (isDebug) Log.v(tag, msg); + } + + public static void d(String tag, String msg) { + if (isDebug) Log.d(tag, msg); + } + + public static void i(String tag, String msg) { + if (isDebug) { + if (msg.length() > 4000) { + Log.i( TAG,"sb.length = " + msg.length()); + int chunkCount = msg.length() / 4000; // integer division + for (int i = 0; i <= chunkCount; i++) { + int max = 4000 * (i + 1); + if (max >= msg.length()) { + Log.i( TAG,"XHXchunk " + i + " of " + chunkCount + ":" + msg.substring(4000 * i)); + } else { + Log.i( TAG,"XHXchunk " + i + " of " + chunkCount + ":" + msg.substring(4000 * i, max)); + } + } + } else { + Log.i( TAG,"XHX" + msg.toString()); + } + } + } + + public static void w(String tag, String msg) { + if (isDebug) Log.w(tag, msg); + } + + public static void e(String tag, String msg) { + if (isDebug) Log.e(tag, msg); + } + + /** + * 自定义lag的函数 + * + * @param clazz 类 + * @param msg 打印信息 + */ + public static void v(Class clazz, String msg) { + if (isDebug) Log.v(clazz.getSimpleName(), msg); + } + + public static void d(Class clazz, String msg) { + if (isDebug) Log.d(clazz.getSimpleName(), msg); + } + + public static void i(Class clazz, String msg) { + if (isDebug) Log.i(clazz.getSimpleName(), msg); + } + + public static void w(Class clazz, String msg) { + if (isDebug) Log.w(clazz.getSimpleName(), msg); + } + + public static void e(Class clazz, String msg) { + if (isDebug) Log.e(clazz.getSimpleName(), msg); + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/dskj/rbchat/utils/QRCodeScheme.java b/app/src/main/java/com/dskj/rbchat/utils/QRCodeScheme.java new file mode 100644 index 0000000..0cfc55b --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/utils/QRCodeScheme.java @@ -0,0 +1,153 @@ + +package com.dskj.rbchat.utils; + +import android.util.Log; + +import androidx.annotation.NonNull; + +/** + * 2维码编码前缀常量定义类。 + * + * @since 8.0 + */ +public class QRCodeScheme { + + private final static String TAG = QRCodeScheme.class.getSimpleName(); + + /** 2维码内容前缀:扫码添加好友 */ + public final static String QR_CODE_SCHEME_ADD_USER = "time_go_chat://add_user/"; + /** 2维码内容前缀:扫码加群 */ + public final static String QR_CODE_PSCHEME_JOIN_GROUP = "time_go_chat://join_group/"; + + /** 2维码内容前缀:扫码授权登录web端 */ + public final static String QR_CODE_PSCHEME_LOGIN_WEB = "time_go_chat://qr_code_login/"; + + /** 2维码内容前缀:收款前缀 */ + public final static String QR_CODE_PSCHEME_PAYMENT_CODE = "time_go_chat://payment_code/"; + + /** 2维码内容前缀:扫码收款 */ + public final static String QR_CODE_PSCHEME_PAYMENT_OUTER_CODE = "time_go_chat://payment_outer_code/"; + + /** 2维码内容前缀:储币机兑币 */ + public final static String QR_CODE_PSCHEME_PAYMENT_ATM = "time_go_chat://payment_atm/"; + /** 2维码内容前缀: */ + public final static String QR_CODE_PSCHEME_SILVER_QR_CODE = "time_go_chat://silver_qr_code/"; + + /** 2维码内容前缀:储币机兑币 */ + public final static String QR_CODE_PSCHEME_PAYMENT_BEAD = "time_go_chat://payment_bead/"; + /** + * 2维码内容前缀:商家码转账 + */ + public final static String QR_CODE_PSCHEME_BIZ_RECEIVE = "time_go_chat://biz_receive_qr_code/"; + + public static boolean isAddUserQRCode(String scheme) { + return QR_CODE_SCHEME_ADD_USER.equals(scheme); + } + + public static boolean isJoinGroupQRCode(String scheme) { + return QR_CODE_PSCHEME_JOIN_GROUP.equals(scheme); + } + + public static String constructCodeStr(@NonNull String scheme, @NonNull String value) { + return scheme + value; + } + + /** + * 构造指定用户的加好友2维码的字符串。 + * + * @param uid 用户uid + * @return 将用于生成2维码的字符串 + */ + public static String constructAddUserCodeStr(@NonNull String uid) { + return constructCodeStr(QR_CODE_SCHEME_ADD_USER, uid); + } + + /** + * 构造指定群聊的加群2维码的字符串。 + * + * @param gid 群id + * @param sharedByUid 行动码分享者的uid + * @return 将用于生成2维码的字符串 + */ + public static String constructJoinGroupCodeStr(@NonNull String gid, @NonNull String sharedByUid) { + return constructCodeStr(QR_CODE_PSCHEME_JOIN_GROUP, gid + "_" + sharedByUid); + } + + /** + * 解析2维码内容。 + * + * @param qrcodeStr 扫描出的原始行动码字符串 + * @return 无论能否成功解析,都会返回QRCodeData对象 + */ + public static QRCodeData parseCodeData(String qrcodeStr){ + QRCodeData d = new QRCodeData(); + if(qrcodeStr != null){ + try { + if(qrcodeStr.startsWith("http")){ + d.setScheme(qrcodeStr); + }else { + // 2维码内容前缀 + String uid = null; + if(qrcodeStr.startsWith(QR_CODE_PSCHEME_PAYMENT_OUTER_CODE) + ||qrcodeStr.startsWith(QR_CODE_PSCHEME_PAYMENT_ATM) + || qrcodeStr.startsWith(QR_CODE_PSCHEME_PAYMENT_BEAD)){ + uid = qrcodeStr.substring(qrcodeStr.lastIndexOf("/") + 1); + qrcodeStr = qrcodeStr.substring(0, qrcodeStr.lastIndexOf("/")); + } + String scheme = qrcodeStr.substring(0, qrcodeStr.lastIndexOf("/") + 1); + // 2维码内容 + String value = qrcodeStr.substring(qrcodeStr.lastIndexOf("/") + 1); + LogUtils.i("行动码是啥:"+scheme+";;"+value); + // 设置 + d.setScheme(scheme).setValue(value).setUserId(uid); + } + } + catch (Exception e){ + Log.w(TAG, "无效的qrcodeStr="+qrcodeStr); + } + } + return d; + } + + /** + * 2维码解析后的对象。 + */ + public static class QRCodeData { + + private String scheme = null; + private String value = null; + private String userId = null; + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getScheme() { + return scheme; + } + + public QRCodeData setScheme(String scheme) { + this.scheme = scheme; + return this; + } + + public String getValue() { + return value; + } + + public QRCodeData setValue(String value) { + this.value = value; + return this; + } + } + + + //跳转 QR_CODE_PSCHEME_SILVER_QR_CODE + public static void toStartSilveDetails(String value){ + + } +} diff --git a/app/src/main/java/com/dskj/rbchat/utils/ScreenUtils.java b/app/src/main/java/com/dskj/rbchat/utils/ScreenUtils.java new file mode 100644 index 0000000..fde4804 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/utils/ScreenUtils.java @@ -0,0 +1,328 @@ +package com.dskj.rbchat.utils; + +import static android.Manifest.permission.WRITE_SETTINGS; + +import android.annotation.SuppressLint; +import android.app.Activity; +import android.app.KeyguardManager; +import android.content.Context; +import android.content.pm.ActivityInfo; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.graphics.Point; +import android.os.Build; +import android.provider.Settings; +import android.view.Surface; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; + +import androidx.annotation.NonNull; +import androidx.annotation.RequiresPermission; + +import com.dskj.rbchat.IMApplication; + +/** + *
+ *     author: Blankj
+ *     blog  : http://blankj.com
+ *     time  : 2016/08/02
+ *     desc  : utils about screen
+ * 
+ */ +public final class ScreenUtils { + + private ScreenUtils() { + throw new UnsupportedOperationException("u can't instantiate me..."); + } + + /** + * Return the width of screen, in pixel. + * + * @return the width of screen, in pixel + */ + public static int getScreenWidth() { + WindowManager wm = (WindowManager) IMApplication.getAppContext().getSystemService(Context.WINDOW_SERVICE); + if (wm == null) return -1; + Point point = new Point(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + wm.getDefaultDisplay().getRealSize(point); + } else { + wm.getDefaultDisplay().getSize(point); + } + return point.x; + } + + /** + * Return the height of screen, in pixel. + * + * @return the height of screen, in pixel + */ + public static int getScreenHeight() { + WindowManager wm = (WindowManager) IMApplication.getAppContext().getSystemService(Context.WINDOW_SERVICE); + if (wm == null) return -1; + Point point = new Point(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + wm.getDefaultDisplay().getRealSize(point); + } else { + wm.getDefaultDisplay().getSize(point); + } + return point.y; + } + + /** + * Return the application's width of screen, in pixel. + * + * @return the application's width of screen, in pixel + */ + public static int getAppScreenWidth() { + WindowManager wm = (WindowManager) IMApplication.getAppContext().getSystemService(Context.WINDOW_SERVICE); + if (wm == null) return -1; + Point point = new Point(); + wm.getDefaultDisplay().getSize(point); + return point.x; + } + + /** + * Return the application's height of screen, in pixel. + * + * @return the application's height of screen, in pixel + */ + public static int getAppScreenHeight() { + WindowManager wm = (WindowManager) IMApplication.getAppContext().getSystemService(Context.WINDOW_SERVICE); + if (wm == null) return -1; + Point point = new Point(); + wm.getDefaultDisplay().getSize(point); + return point.y; + } + + /** + * Return the density of screen. + * + * @return the density of screen + */ + public static float getScreenDensity() { + return Resources.getSystem().getDisplayMetrics().density; + } + + /** + * Return the screen density expressed as dots-per-inch. + * + * @return the screen density expressed as dots-per-inch + */ + public static int getScreenDensityDpi() { + return Resources.getSystem().getDisplayMetrics().densityDpi; + } + + /** + * Return the exact physical pixels per inch of the screen in the Y dimension. + * + * @return the exact physical pixels per inch of the screen in the Y dimension + */ + public static float getScreenXDpi() { + return Resources.getSystem().getDisplayMetrics().xdpi; + } + + /** + * Return the exact physical pixels per inch of the screen in the Y dimension. + * + * @return the exact physical pixels per inch of the screen in the Y dimension + */ + public static float getScreenYDpi() { + return Resources.getSystem().getDisplayMetrics().ydpi; + } + + /** + * Return the distance between the given View's X (start point of View's width) and the screen width. + * + * @return the distance between the given View's X (start point of View's width) and the screen width. + */ + public int calculateDistanceByX(View view) { + int[] point = new int[2]; + view.getLocationOnScreen(point); + return getScreenWidth() - point[0]; + } + + /** + * Return the distance between the given View's Y (start point of View's height) and the screen height. + * + * @return the distance between the given View's Y (start point of View's height) and the screen height. + */ + public int calculateDistanceByY(View view) { + int[] point = new int[2]; + view.getLocationOnScreen(point); + return getScreenHeight() - point[1]; + } + + /** + * Return the X coordinate of the given View on the screen. + * + * @return X coordinate of the given View on the screen. + */ + public int getViewX(View view) { + int[] point = new int[2]; + view.getLocationOnScreen(point); + return point[0]; + } + + /** + * Return the Y coordinate of the given View on the screen. + * + * @return Y coordinate of the given View on the screen. + */ + public int getViewY(View view) { + int[] point = new int[2]; + view.getLocationOnScreen(point); + return point[1]; + } + + /** + * Set full screen. + * + * @param activity The activity. + */ + public static void setFullScreen(@NonNull final Activity activity) { + activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); + } + + /** + * Set non full screen. + * + * @param activity The activity. + */ + public static void setNonFullScreen(@NonNull final Activity activity) { + activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); + } + + /** + * Toggle full screen. + * + * @param activity The activity. + */ + public static void toggleFullScreen(@NonNull final Activity activity) { + boolean isFullScreen = isFullScreen(activity); + Window window = activity.getWindow(); + if (isFullScreen) { + window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); + } else { + window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); + } + } + + /** + * Return whether screen is full. + * + * @param activity The activity. + * @return {@code true}: yes
{@code false}: no + */ + public static boolean isFullScreen(@NonNull final Activity activity) { + int fullScreenFlag = WindowManager.LayoutParams.FLAG_FULLSCREEN; + return (activity.getWindow().getAttributes().flags & fullScreenFlag) == fullScreenFlag; + } + + /** + * Set the screen to landscape. + * + * @param activity The activity. + */ + @SuppressLint("SourceLockedOrientationActivity") + public static void setLandscape(@NonNull final Activity activity) { + activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); + } + + /** + * Set the screen to portrait. + * + * @param activity The activity. + */ + @SuppressLint("SourceLockedOrientationActivity") + public static void setPortrait(@NonNull final Activity activity) { + activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); + } + + /** + * Return whether screen is landscape. + * + * @return {@code true}: yes
{@code false}: no + */ + public static boolean isLandscape() { + return IMApplication.getAppContext().getResources().getConfiguration().orientation + == Configuration.ORIENTATION_LANDSCAPE; + } + + /** + * Return whether screen is portrait. + * + * @return {@code true}: yes
{@code false}: no + */ + public static boolean isPortrait() { + return IMApplication.getAppContext().getResources().getConfiguration().orientation + == Configuration.ORIENTATION_PORTRAIT; + } + + /** + * Return the rotation of screen. + * + * @param activity The activity. + * @return the rotation of screen + */ + public static int getScreenRotation(@NonNull final Activity activity) { + switch (activity.getWindowManager().getDefaultDisplay().getRotation()) { + case Surface.ROTATION_0: + return 0; + case Surface.ROTATION_90: + return 90; + case Surface.ROTATION_180: + return 180; + case Surface.ROTATION_270: + return 270; + default: + return 0; + } + } + + /** + * Return whether screen is locked. + * + * @return {@code true}: yes
{@code false}: no + */ + public static boolean isScreenLock() { + KeyguardManager km = + (KeyguardManager) IMApplication.getAppContext().getSystemService(Context.KEYGUARD_SERVICE); + if (km == null) return false; + return km.inKeyguardRestrictedInputMode(); + } + + /** + * Set the duration of sleep. + *

Must hold {@code }

+ * + * @param duration The duration. + */ + @RequiresPermission(WRITE_SETTINGS) + public static void setSleepDuration(final int duration) { + Settings.System.putInt( + IMApplication.getAppContext().getContentResolver(), + Settings.System.SCREEN_OFF_TIMEOUT, + duration + ); + } + + /** + * Return the duration of sleep. + * + * @return the duration of sleep. + */ + public static int getSleepDuration() { + try { + return Settings.System.getInt( + IMApplication.getAppContext().getContentResolver(), + Settings.System.SCREEN_OFF_TIMEOUT + ); + } catch (Settings.SettingNotFoundException e) { + e.printStackTrace(); + return -123; + } + } +} + diff --git a/app/src/main/java/com/dskj/rbchat/utils/ShareDateUtils.java b/app/src/main/java/com/dskj/rbchat/utils/ShareDateUtils.java new file mode 100644 index 0000000..770cc88 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/utils/ShareDateUtils.java @@ -0,0 +1,264 @@ +package com.dskj.rbchat.utils; + +import android.text.TextUtils; + +import androidx.annotation.Nullable; + +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.model.UserShareBean; +import com.dskj.rbchat.model.UsersExistBean; +import com.netease.nimlib.sdk.msg.model.RecentContact; +import com.netease.nimlib.sdk.team.model.Team; +import com.netease.yunxin.kit.chatkit.model.ConversationInfo; +import com.netease.yunxin.kit.chatkit.repo.ContactRepo; +import com.netease.yunxin.kit.chatkit.repo.ConversationRepoAll; +import com.netease.yunxin.kit.chatkit.repo.TeamRepo; +import com.netease.yunxin.kit.conversationkit.ui.model.ConversationBean; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.model.FriendInfo; +import com.netease.yunxin.kit.corekit.im.model.UserInfo; +import com.netease.yunxin.kit.corekit.im.provider.FetchCallback; + +import java.util.ArrayList; +import java.util.List; + +public class ShareDateUtils { + public ArrayList titleUsers; + public ArrayList titleFriends; + public ArrayList titleGroups; + + public List userFriends; + + + + public ShareDateUtils() { + } + + /** + * 要分享到的用户 + * + * @return + */ + public ArrayList getConverstionShareInfo() { +// LogUtils.i("数据是啥:"+GsonUtils.beanToJSONString(titleUsers)); +// conversationInfos = new ArrayList<>(); +// for (int i =0;i getLocUserListInfo() { + + return userFriends; + + } + +// private void hasAtList( ConversationInfo conversationInfo) { +// boolean isAt = false; +// for (int i=0;i getConverstionShareInfoSelect() { + if (titleUsers.size() > 20) { + return (ArrayList) titleUsers.subList(0, 20); + } + return titleUsers; + } + + ; + + + /** + * 获取最近会话 + */ + public void getAllSessionList() { + titleUsers = new ArrayList<>(); + + ConversationRepoAll.getAllSessionList( + // data, + // PAGE_LIMIT, + // comparator, + new FetchCallback<>() { + @Override + public void onSuccess(@Nullable List param) { + for (ConversationInfo conversationInfo : param) { + LogUtils.i("用户信息:" + GsonUtils.beanToJSONString(conversationInfo)); + + if (conversationInfo.getTeamInfo() != null) { + titleUsers.add(new UserShareBean(conversationInfo.getTeamInfo())); + } else if (conversationInfo.getFriendInfo() != null) { + FriendInfo friendInfo = conversationInfo.getFriendInfo(); + if (friendInfo.getName().equals(friendInfo.getAccount()) && conversationInfo.getUserInfo() != null) { + friendInfo.setAlias(conversationInfo.getUserInfo().getName()); + } + titleUsers.add(new UserShareBean(friendInfo)); + } + + } + + + getFriends(); + + } + + @Override + public void onFailed(int code) { + + } + + @Override + public void onException(@Nullable Throwable exception) { + + } + }); + + } + + /** + * 获取好友列表 + */ + public void getFriends() { + titleFriends = new ArrayList<>(); + ContactRepo.getContactList( + new FetchCallback<>() { + @Override + public void onSuccess(@Nullable List param) { + for (FriendInfo conversationInfo : param) { + LogUtils.i("用户信息1:" + GsonUtils.beanToJSONString(conversationInfo)); + boolean isAt = false; + for (int i = 0; i < titleUsers.size(); i++) { + if (titleUsers.get(i).getFriendInfo() != null) { + if (conversationInfo.getAccount().equals(titleUsers.get(i).getFriendInfo().getAccount())) { + isAt = true; + break; + } + } + } + if (!isAt) { + titleFriends.add(new UserShareBean(conversationInfo)); + } + } + titleUsers.addAll(titleFriends); + getGroups(); + } + + @Override + public void onFailed(int code) { + + } + + @Override + public void onException(@Nullable Throwable exception) { + + } + }); + } + + /** + * 获取群用户列表 + */ + public void getGroups() { + titleGroups = new ArrayList<>(); + + TeamRepo.getTeamList( + new FetchCallback>() { + @Override + public void onSuccess(List param) { + for (Team conversationInfo : param) { +// LogUtils.i("用户信息1:" + GsonUtils.beanToJSONString(conversationInfo)); + boolean isAt = false; + for (int i = 0; i < titleUsers.size(); i++) { + if (titleUsers.get(i).getTeamInfo() != null) { + if (conversationInfo.getId().equals(titleUsers.get(i).getTeamInfo().getId())) { + isAt = true; + break; + } + } + } + if (!isAt) { + titleGroups.add(new UserShareBean(conversationInfo)); + } + } + titleUsers.addAll(titleGroups); + } + + @Override + public void onFailed(int code) { + + } + + @Override + public void onException(@Nullable Throwable exception) { + + } + }); + } + + + /** + * 获取好友列表 + */ + public void getLocFriends() { + userFriends = new ArrayList<>(); + ContactRepo.getContactList( + new FetchCallback<>() { + @Override + public void onSuccess(@Nullable List param) { + userFriends = param; + } + + @Override + public void onFailed(int code) { + + } + + @Override + public void onException(@Nullable Throwable exception) { + + } + }); + } + + /** + * 获取所有关注的用户 + * @return + */ + public static List getFollowUsers(){ + String tagString = DataUtils.get(IMApplication.getAppContext(), IMUIKitConfig.FOLLOW_USER_TAG+"_"+ IMKitClient.account(),""); + if(TextUtils.isEmpty(tagString)){ + return null; + }else{ + List usersExistBeans = GsonUtils.getListFromJSON(tagString,UsersExistBean.class); + return usersExistBeans; + } + } + +} diff --git a/app/src/main/java/com/dskj/rbchat/utils/SoftHideKeyBoardUtil.java b/app/src/main/java/com/dskj/rbchat/utils/SoftHideKeyBoardUtil.java new file mode 100644 index 0000000..06b1553 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/utils/SoftHideKeyBoardUtil.java @@ -0,0 +1,74 @@ +package com.dskj.rbchat.utils; + +import android.app.Activity; +import android.graphics.Rect; +import android.os.Build; +import android.view.View; +import android.view.ViewTreeObserver; +import android.widget.FrameLayout; + +public class SoftHideKeyBoardUtil { + public static void assistActivity (Activity activity) { + new SoftHideKeyBoardUtil(activity); + } + private View mChildOfContent; + private int usableHeightPrevious; + private FrameLayout.LayoutParams frameLayoutParams; + //为适应华为小米等手机键盘上方出现黑条或不适配 + private int contentHeight;//获取setContentView本来view的高度 + private boolean isfirst = true;//只用获取一次 + private int statusBarHeight;//状态栏高度 + private SoftHideKeyBoardUtil(Activity activity) { + //1、找到Activity的最外层布局控件,它其实是一个DecorView,它所用的控件就是FrameLayout + FrameLayout content = (FrameLayout) activity.findViewById(android.R.id.content); + //2、获取到setContentView放进去的View + mChildOfContent = content.getChildAt(0); + //3、给Activity的xml布局设置View树监听,当布局有变化,如键盘弹出或收起时,都会回调此监听 + mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { + //4、软键盘弹起会使GlobalLayout发生变化 + public void onGlobalLayout() { + if (isfirst) { + contentHeight = mChildOfContent.getHeight();//兼容华为等机型 + isfirst = false; + } + //5、当前布局发生变化时,对Activity的xml布局进行重绘 + possiblyResizeChildOfContent(); + } + }); + //6、获取到Activity的xml布局的放置参数 + frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent.getLayoutParams(); + } + + // 获取界面可用高度,如果软键盘弹起后,Activity的xml布局可用高度需要减去键盘高度 + private void possiblyResizeChildOfContent() { + //1、获取当前界面可用高度,键盘弹起后,当前界面可用布局会减少键盘的高度 + int usableHeightNow = computeUsableHeight(); + //2、如果当前可用高度和原始值不一样 + if (usableHeightNow != usableHeightPrevious) { + //3、获取Activity中xml中布局在当前界面显示的高度 + int usableHeightSansKeyboard = mChildOfContent.getRootView().getHeight(); + //4、Activity中xml布局的高度-当前可用高度 + int heightDifference = usableHeightSansKeyboard - usableHeightNow; + //5、高度差大于屏幕1/4时,说明键盘弹出 + if (heightDifference > (usableHeightSansKeyboard/4)) { + // 6、键盘弹出了,Activity的xml布局高度应当减去键盘高度 + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){ + frameLayoutParams.height = usableHeightSansKeyboard - heightDifference + statusBarHeight; + } else { + frameLayoutParams.height = usableHeightSansKeyboard - heightDifference; + } + } else { + frameLayoutParams.height = contentHeight; + } + //7、 重绘Activity的xml布局 + mChildOfContent.requestLayout(); + usableHeightPrevious = usableHeightNow; + } + } + private int computeUsableHeight() { + Rect r = new Rect(); + mChildOfContent.getWindowVisibleDisplayFrame(r); + // 全屏模式下:直接返回r.bottom,r.top其实是状态栏的高度 + return (r.bottom - r.top); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/dskj/rbchat/utils/StickyTopicScroller.java b/app/src/main/java/com/dskj/rbchat/utils/StickyTopicScroller.java new file mode 100644 index 0000000..24b32a3 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/utils/StickyTopicScroller.java @@ -0,0 +1,28 @@ +package com.dskj.rbchat.utils; + +import android.content.Context; +import android.util.DisplayMetrics; + +import androidx.recyclerview.widget.LinearSmoothScroller; + +public class StickyTopicScroller extends LinearSmoothScroller { + public StickyTopicScroller(Context context) { + super(context); + } + + @Override + public int calculateDtToFit(int viewStart, int viewEnd, int boxStart, int boxEnd, int snapPreference) { + //原本的返回值 + //return super.calculateDtToFit(viewStart, viewEnd, boxStart, boxEnd, snapPreference); + //修改,返回item置顶的偏移量如果是二级列表即有标题或头部加上对应的值就可把头部显示出来 + return boxStart - viewStart; + } + + @Override + protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) { + return super.calculateSpeedPerPixel(displayMetrics); + } +} + + + diff --git a/app/src/main/java/com/dskj/rbchat/utils/TaiWanIDCardUtils.java b/app/src/main/java/com/dskj/rbchat/utils/TaiWanIDCardUtils.java new file mode 100644 index 0000000..a04794b --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/utils/TaiWanIDCardUtils.java @@ -0,0 +1,71 @@ +package com.dskj.rbchat.utils; + +import java.util.ArrayList; + +public class TaiWanIDCardUtils { + + public static boolean checkTaiWanIdCardNumber(String number){ + + if(number.length()!=10){ + return false; + } + + String checkId = getCheckId(number); + + if(checkId.length()!=11){ + return false; + } + + ArrayList arrayList = new ArrayList<>(); + for (int i = 0;i 0 && badgeNumber <= 99) { + mBadgeText = String.valueOf(badgeNumber); + } else if (badgeNumber > 99) { + mBadgeText = "99+"; + } + return mBadgeText; + } + +// /** +// * 邮箱格式检查. +// * +// * @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(); +// } + + + + /** + * 将对象转成JSON字串符。 + * 如果要转的对象已经是字符串,那就直接返回,不用转了。 + * + * @param obj + * @return + */ + public static String toJSON(Object obj) + { + if(obj == null) + return null; + + return !(obj instanceof String) ? (new Gson().toJson(obj)) : (String)obj; + } + + + + /** + * 资源字符串国际化。 + * + * @param c 上下文 + * @param messageFormatPatternResId 资源字符串,字符串内容通常形如:"视频会话发送失败 t0 {0}({1},{2})" + * @param arguments 对应于messageFormatPatternResId中的占位符 + * @return 返回格式化后的字符串 + */ + public static String i18n(Context c, int messageFormatPatternResId, Object... arguments){ + String messageFormatPattern = c.getString(messageFormatPatternResId); + return MessageFormat.format(messageFormatPattern, arguments); + } + + /** + * 调用系统浏览器。 + * + * @param c 上下文对象 + * @param url 要打开的网址 + */ + public static void openWithSystemBrowsers(Context c, String url) + { + Intent intent = new Intent(); + //Intent intent = new Intent(Intent.ACTION_VIEW,uri); + intent.setAction("android.intent.action.VIEW"); + Uri content_url = Uri.parse(url); + intent.setData(content_url); + c.startActivity(intent); + } + + /** + * 读取配置于AndroidManifest.xml中的Application元素内的META-DATA的值。 + * 参资料请见:https://www.cnblogs.com/spring87/p/5810381.html + * + * @param c + * @param dataName + * @return 如果成功获取则返回配置值,否则返回null + */ + public static String getApplicationMetaData(Context c, String dataName) + { + String metaValue = null; + + try{ + ApplicationInfo appInfo = c.getPackageManager() + .getApplicationInfo(c.getPackageName(), PackageManager.GET_META_DATA); + metaValue = appInfo.metaData.getString(dataName); + } + catch(Exception e){ + Log.w(TAG, e); + } + + return metaValue; + } + + /** + * 获取App的名称。 + * + * @param context 上下文 + * + * @return 名称 + */ + public static String getAppName(Context context) { + PackageManager pm = context.getPackageManager(); + //获取包信息 + try { + PackageInfo packageInfo = pm.getPackageInfo(context.getPackageName(), 0); + //获取应用 信息 + ApplicationInfo applicationInfo = packageInfo.applicationInfo; + //获取albelRes + int labelRes = applicationInfo.labelRes; + //返回App的名称 + return context.getResources().getString(labelRes); + } catch (PackageManager.NameNotFoundException e) { + Log.w(TAG, e); + } + + return null; + } + + /** + * 复制文本内容到剪贴板。 + * + * @param context + * @param copiedText + * @return + * @since 4.4 + */ + public static boolean copyTextToClipborad(Context context, String copiedText) + { + boolean sucess = false; + try { + ClipboardManager clipboardManager = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); + clipboardManager.setPrimaryClip(ClipData.newPlainText("text", copiedText)); + sucess = true; + } + catch (Exception e) { + Log.w(TAG, e); + } + + return sucess; + } + + + + /** + * 将视频时长转换成"00:00:00"的字符串格式 + * + * @param seconds 视频时长(单位:秒) + * @return + * @since 4.4 + */ + public static String durationFormatToString(int seconds) + { + BigDecimal duration = BigDecimal.valueOf(seconds); + + BigDecimal nine = BigDecimal.valueOf(9); + BigDecimal sixty = BigDecimal.valueOf(60); + + BigDecimal second = duration.divideAndRemainder(sixty)[1]; + BigDecimal minute = duration.subtract(second).divide(sixty).divideAndRemainder(sixty)[1]; + BigDecimal hour = duration.subtract(second).divideToIntegralValue(BigDecimal.valueOf(3600)); + + String str = ""; + + if(hour.intValue() > 0 ) + { + if (hour.compareTo(nine)>0) + str += hour.intValue() + ":"; + else + str += "0" + hour.intValue() + ":"; + } + +// if(minute.intValue() > 0 ) + { + if (minute.compareTo(nine)>0) + str += minute.intValue() + ":"; + else + str += "0" + minute.intValue() + ":"; + } + + if (second.compareTo(nine)>0) + str += second.intValue() ; + else + str +="0"+ second.intValue(); + + return str; + } + + /** + * 获取指定文件路径处视频的时长信息。 + * + * @param filePath 视频文件绝对路径(在Android10及以上系统中,此路径只可能是APP的私有路径,因为Android10及 + * 以后系统由于分区存储权限限制,不允许直接读取系统目录) + * @return 成功则返回视频时长(单位:毫秒),否则返回0 + * @since 8.3 + */ + public static long getVideoDuration(String filePath) { + long duration = 0L; + MediaMetadataRetriever retriever = null; + try { + retriever = new MediaMetadataRetriever(); + retriever.setDataSource(filePath); + duration = CommonUtils.getLongValue(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION)); + } catch (Exception e) { + Log.w(TAG, "获取视频时长失败,原因是:"+e.getMessage(), e); + } finally { + try{ + if (retriever != null) + retriever.release(); + } catch (Exception ee) { + Log.w(TAG, ee); + } + } + + return duration; + } + + /** + * 保存一个bitmap对象的图片到系统相册中的实现方法。 + * + * @param bmp 获取的bitmap数据 + * @return true表示保存成功,否则失败 + */ + public static boolean saveBmp2Gallery(Context context, Bitmap bmp) + { + if(isAndroidQ_greater$equal()) { + LogUtils.i( "是andriod 10以上的手机哦!!!!!!!!"); + return saveBmp2Gallerry_Q(context, bmp); + } + else + return saveBmp2Gallery_old(context, bmp); + } + + /** + * 保存一个bitmap对象的图片到系统相册中的实现方法。 + * + * @param bmp 获取的bitmap数据 + * @return true表示保存成功,否则失败 + */ + public static Uri saveBmp2GalleryShare(Context context, Bitmap bmp) + { + if(isAndroidQ_greater$equal()) { + LogUtils.i( "是andriod 10以上的手机哦!!!!!!!!"); + return saveBmp2Gallerry_QShare(context, bmp); + } + else + return saveBmp2Gallery_oldShare(context, bmp); + } + + + /** + * 当前Android系统版本是否"大于等于" Android Q。 + * + * @return true表示是,否则不是 + */ + public static boolean isAndroidQ_greater$equal() { + return Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q; + } + + /** + * 保存一个bitmap对象的图片到系统相册中的实现方法。方法适用于Andriod Q及以上版本。 + *

+ * 由于Andriod Q及以后的最新Andriod系统启用了分区存储,传统的直接读取SD卡的文件读写方式已不被允许了! + * + * @param bmp 获取的bitmap数据 + * @return true表示保存成功,否则失败 + */ + public static boolean saveBmp2Gallerry_Q(Context context, Bitmap bmp) + { + boolean sucess = false; + OutputStream os = null; + + try{ + + //** 拿到 MediaStore.Images 表的uri + Uri tableUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; + + String fileName = System.currentTimeMillis() + ".jpg"; + + //** 创建图片索引 + ContentValues values = new ContentValues(); + // 设置文件名 + values.put(MediaStore.Images.Media.DISPLAY_NAME, fileName); + //设置文件描述,这里以文件名代替 + values.put(MediaStore.Images.Media.DESCRIPTION, fileName); + values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg"); + values.put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_DCIM); + values.put(MediaStore.Images.Media.DATE_ADDED, System.currentTimeMillis()); + + //** 保存图片 + // 将该索引信息插入数据表,获得图片的Uri + Uri imageUri = context.getContentResolver().insert(tableUri, values); + // 通过图片uri获得输出流 + os = context.getContentResolver().openOutputStream(imageUri); + // 图片压缩保存 + bmp.compress(Bitmap.CompressFormat.JPEG,100, os); + + sucess = true; + } + catch (Exception e) { + Log.w(TAG, e); + } + finally { + try { + if (os != null) + os.close(); + } + catch (IOException e) { + Log.w(TAG, e); + } + } + + return sucess; + } + + /** + * 保存一个bitmap对象的图片到系统相册中的实现方法。方法适用于Andriod Q及以上版本。 + *

+ * 由于Andriod Q及以后的最新Andriod系统启用了分区存储,传统的直接读取SD卡的文件读写方式已不被允许了! + * + * @param bmp 获取的bitmap数据 + * @return true表示保存成功,否则失败 + */ + public static Uri saveBmp2Gallerry_QShare(Context context, Bitmap bmp) + { + boolean sucess = false; + OutputStream os = null; + + try{ + + //** 拿到 MediaStore.Images 表的uri + Uri tableUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; + + String fileName = System.currentTimeMillis() + ".jpg"; + + //** 创建图片索引 + ContentValues values = new ContentValues(); + // 设置文件名 + values.put(MediaStore.Images.Media.DISPLAY_NAME, fileName); + //设置文件描述,这里以文件名代替 + values.put(MediaStore.Images.Media.DESCRIPTION, fileName); + values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg"); + values.put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_DCIM); + values.put(MediaStore.Images.Media.DATE_ADDED, System.currentTimeMillis()); + + //** 保存图片 + // 将该索引信息插入数据表,获得图片的Uri + Uri imageUri = context.getContentResolver().insert(tableUri, values); + // 通过图片uri获得输出流 + os = context.getContentResolver().openOutputStream(imageUri); + // 图片压缩保存 + bmp.compress(Bitmap.CompressFormat.JPEG,100, os); + + sucess = true; + return imageUri; + } + catch (Exception e) { + Log.w(TAG, e); + } + finally { + try { + if (os != null) + os.close(); + } + catch (IOException e) { + Log.w(TAG, e); + } + } + + return null; + } + + /** + * 保存一个bitmap对象的图片到系统相册中的实现方法。方法适用于比Andriod Q老的系统版本。 + * + * @param bmp 获取的bitmap数据 + * @return true表示保存成功,否则失败 + */ + public static boolean saveBmp2Gallery_old(Context context, Bitmap bmp) + { + boolean sucess = false; + + // 声明文件对象 + File file = null; + // 声明输出流 + FileOutputStream outStream = null; + + try{ + String filePath = null; + + //系统相册目录 + String galleryPath = Environment.getExternalStorageDirectory() + + File.separator + Environment.DIRECTORY_DCIM + + File.separator + "Camera" + File.separator; + + LogUtils.i( "》galleryPath="+galleryPath); + + // 创建一个以时间戳为名的文件 + file = new File(galleryPath, System.currentTimeMillis() + ".jpg"); + + // 获得文件相对路径 + filePath = file.toString(); + // 获得输出流,如果文件中有内容,追加内容 + outStream = new FileOutputStream(filePath); + if (null != outStream) { + bmp.compress(Bitmap.CompressFormat.JPEG, 100, outStream); + } + + // 通知相册更新(不然要到重启手机后,图片才能出现在打开的相册预览里) + MediaStore.Images.Media.insertImage(context.getContentResolver(), bmp, filePath, null); + Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); + Uri uri = Uri.fromFile(file); + intent.setData(uri); + context.sendBroadcast(intent); + + sucess = true; + } + catch (Exception e) { + Log.w(TAG, e); + } + finally { + try { + if (outStream != null) + outStream.close(); + } + catch (IOException e) { + Log.w(TAG, e); + } + } + + return sucess; + } + + /** + * 保存一个bitmap对象的图片到系统相册中的实现方法。方法适用于比Andriod Q老的系统版本。 + * + * @param bmp 获取的bitmap数据 + * @return true表示保存成功,否则失败 + */ + public static Uri saveBmp2Gallery_oldShare(Context context, Bitmap bmp) + { + boolean sucess = false; + + // 声明文件对象 + File file = null; + // 声明输出流 + FileOutputStream outStream = null; + + try{ + String filePath = null; + + //系统相册目录 + String galleryPath = Environment.getExternalStorageDirectory() + + File.separator + Environment.DIRECTORY_DCIM + + File.separator + "Camera" + File.separator; + + LogUtils.i( "》galleryPath="+galleryPath); + + // 创建一个以时间戳为名的文件 + file = new File(galleryPath, System.currentTimeMillis() + ".jpg"); + + // 获得文件相对路径 + filePath = file.toString(); + // 获得输出流,如果文件中有内容,追加内容 + outStream = new FileOutputStream(filePath); + if (null != outStream) { + bmp.compress(Bitmap.CompressFormat.JPEG, 100, outStream); + } + + // 通知相册更新(不然要到重启手机后,图片才能出现在打开的相册预览里) + MediaStore.Images.Media.insertImage(context.getContentResolver(), bmp, filePath, null); + Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); + Uri uri = Uri.fromFile(file); + intent.setData(uri); + context.sendBroadcast(intent); + + sucess = true; + return uri; + } + catch (Exception e) { + Log.w(TAG, e); + } + finally { + try { + if (outStream != null) + outStream.close(); + } + catch (IOException e) { + Log.w(TAG, e); + } + } + + return null; + } + + + public static File uriToFile(Context context, Uri uri) { + if (uri == null) { + return null; + } + String[] projection = {MediaStore.Images.Media.DATA}; + Cursor cursor = context.getContentResolver().query(uri, projection, null, null, null); + if (cursor != null) { + cursor.moveToFirst(); + int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); + String filePath = cursor.getString(column_index); + cursor.close(); + return new File(filePath); + } + return null; + } + + /** + * 打开扬声器. + * + * @param mContext + * @return 返回-1即表示扬声器打开失败,否则返回的是之前的系统音量 + * (调用者应保存此音量,用于关闭扬声器时恢复音量设置哦) + */ + public static int openSpeaker(Context mContext) + { + int currVolume = -1; +// boolean sucess = false; + try + { + AudioManager audioManager = (AudioManager) mContext + .getSystemService(Context.AUDIO_SERVICE); + // 经实验:MODE_IN_CALL模式下可正常开启外放但在诸如3星T210平板上会因为没有电话模块而导致本代码调用后卡了一下就无法播放声音了 + // 目前初步测度下来AudioManager.STREAM_MUSI模式在现有的机器上都能成功开启外放(在T210平板上也正常有声音! + audioManager.setMode(AudioManager.MODE_IN_CALL);//MODE_IN_CALL);//AudioManager.ROUTE_SPEAKER); +// currVolume = audioManager +// .getStreamVolume(AudioManager.STREAM_VOICE_CALL); + + if (!audioManager.isSpeakerphoneOn()) + { + audioManager.setSpeakerphoneOn(true); + audioManager.setStreamVolume( + AudioManager.STREAM_VOICE_CALL, + audioManager.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL), + AudioManager.STREAM_VOICE_CALL); + Log.w(TAG, "播放语音留言前扬声器已成功打开!currVolume="+currVolume); +// sucess = true; + } + } + catch (Exception e) + { +// e.printStackTrace(); + Log.w(TAG, "打开扬声器失败!", e); + } + return currVolume; + } + + // 关闭扬声器 + public static boolean closeSpeaker(Context mContext, int currVolume) + { + boolean sucess = false; + try + { + AudioManager audioManager = (AudioManager) mContext + .getSystemService(Context.AUDIO_SERVICE); + audioManager.setMode(AudioManager.MODE_NORMAL); + if (audioManager != null) + { + if (audioManager.isSpeakerphoneOn()) + { + audioManager.setSpeakerphoneOn(false); +// audioManager.setStreamVolume( +// AudioManager.STREAM_VOICE_CALL, currVolume < 0? 0 : currVolume, +// AudioManager.STREAM_VOICE_CALL); + Log.w(TAG, "播放语音留后前扬声器已成功关闭.currVolume="+currVolume); + sucess = true; + } + } + } + catch (Exception e) + { + Log.w(TAG, "关闭扬声器失败!", e); + } + // Toast.makeText(context,"扬声器已经关闭",Toast.LENGTH_SHORT).show(); + return sucess; + } + + /** + * 强制隐藏输入法. + *

+ * 某些情况下输入法会盖住某此后ui,不好看. + * + * @param view + */ + public static void hideInputMethod(Activity activity, View view) + { + if(activity != null && view != null) + { + // 强制关闭输入法,某些情况下输入法会盖住某些ui,体验不好,所以需要强制关闭 + ((InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow( +// activity.getCurrentFocus().getWindowToken(), + // 使用view.getWindowToken()解决Android 9.0上的崩溃问题,参见: + // https://blog.csdn.net/qq_16318981/article/details/53301997 + view.getWindowToken(), + InputMethodManager.HIDE_NOT_ALWAYS); + } + } + + /** + * 显示软键盘 + * Freeman添加 21.4.23 + */ + public static void showInputMethod(Activity activity, View view) { + if (activity != null && view != null) { + InputMethodManager imm = (InputMethodManager) activity + .getSystemService(Context.INPUT_METHOD_SERVICE); + imm.showSoftInput(view, InputMethodManager.RESULT_UNCHANGED_SHOWN); + } + } + + //手机设备基本信息 + public static String getMobileFullInfo(Context context) + { + StringBuilder info = new StringBuilder(); + TelephonyManager phoneMgr=(TelephonyManager) context + .getSystemService(Context.TELEPHONY_SERVICE); + info.append("运营商:"+getProviderName(phoneMgr)) +// .append(" ,手机号:"+phoneMgr.getLine1Number()) + .append(" ,型号:"+Build.MODEL) + .append(" ,ID:"+Build.ID) + .append(" ,制造商:"+Build.MANUFACTURER) + .append(" ,安卓版本:"+Build.VERSION.RELEASE) + .append(" ,SDK版本:"+Build.VERSION.SDK); + +// Product: C8800 +// , CPU_ABI: armeabi +// , TAGS: ota-rel-keys,release-keys +// , VERSION_CODES.BASE: 1 +// , MODEL: C8800 +// , SDK: 10 +// , VERSION.RELEASE: 2.3.3 +// , DEVICE: hwc8800 +// , DISPLAY: C8800V100R001C298B833 +// , BRAND: Huawei +// , BOARD: C8800 +// , FINGERPRINT: Huawei/C8800/hwc8800:2.3.3/HuaweiC8800/C298B833:user/ota-rel-keys,release-keys +// , ID: HuaweiC8800 +// , MANUFACTURER: HUAWEI +// , USER: wangyali + + return info.toString(); + } + + /** + *

+ * 获取手机服务商信息.
+ * + * 需要权限{@code } + *

+ */ + public static String getProviderName(TelephonyManager telephonyManager) + { + String providerName = null; +// if(Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { +// // //国际移动用户识别码 +// String IMSI = telephonyManager.getSubscriberId(); +// // IMSI号前面3位460是国家,紧接着后面2位00 02是中国移动,01是中国联通,03是中国电信。 +// if (IMSI.startsWith("46000") +// || IMSI.startsWith("46002")) +// providerName = "中国移动"; +// else if (IMSI.startsWith("46001")) +// providerName = "中国联通"; +// else if (IMSI.startsWith("46003")) +// providerName = "中国电信"; +// return providerName; +// } + return "N/A"; + } + + /** + * 判断网络是否可用. + * + * @param context + * @return true表示网络可用,否则表示不可用 + */ + public static boolean isNetworkAvailable(Context context) + { + ConnectivityManager mgr = (ConnectivityManager) context + .getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkInfo[] info = mgr.getAllNetworkInfo(); + if (info != null) + { + for (int i = 0; i < info.length; i++) + { + if (info[i].getState() == NetworkInfo.State.CONNECTED) + return true; + } + } + return false; + } + + public static InputStream getStreamFromURL(String imageURL) throws Exception + { + InputStream in = null; + try + { + URL url = new URL(imageURL); + URLConnection openConnection = url.openConnection(); + if (openConnection != null&&openConnection.getDate()>0) + { + HttpURLConnection connection = (HttpURLConnection) openConnection; + in = connection.getInputStream(); + } + } + catch (Exception e) + { +// Log.d("getStreamFromURL", e.getMessage(), e); + throw e; + } + return in; + } + + +} diff --git a/app/src/main/java/com/dskj/rbchat/utils/play/AmountBean.java b/app/src/main/java/com/dskj/rbchat/utils/play/AmountBean.java new file mode 100644 index 0000000..5b0f13a --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/utils/play/AmountBean.java @@ -0,0 +1,30 @@ +package com.dskj.rbchat.utils.play; + +public class AmountBean { + + + public AmountBean(String amount, int type) { + super(); + this.amount = amount; + this.type = type; + } + + public String amount; + public int type; + + public String getAmount() { + return amount; + } + + public void setAmount(String amount) { + this.amount = amount; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/utils/play/PlaySound.java b/app/src/main/java/com/dskj/rbchat/utils/play/PlaySound.java new file mode 100644 index 0000000..1696a4e --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/utils/play/PlaySound.java @@ -0,0 +1,197 @@ +package com.dskj.rbchat.utils.play; + + +public class PlaySound { + + + /** + * 截取字符串 + * + * @param str 需要截取的字符串 + * @param idx1 开始位置 + * @param idx2 截止位置 + * @return 截取后的字符串 + */ + public static String subString(String str, int idx1, int idx2) { + try { + return str.substring(idx1, idx2); + } catch (Exception ex) { + return ""; + } + } + + /** + * 传递一个字符串参数,如果是null返回“”字符串,否则去除前后的空格。 + * + * @param str 传入参数 + * @return 没有前后没有空格的字符串 + */ + public static final String trim(String str) { + if (str == null) return ""; + else return str.trim(); + } + + /** + * 把double类型数据转换成有格式的字符串 + * + * @param d 需要转换的double类型数据 + * @param format 格式化方式 + * @return 有格式的字符串 + */ + public static String formatDoubleToString(double d, String format) { + String doubleStr = String.valueOf(d); + java.text.DecimalFormat decf = new java.text.DecimalFormat(format); + String formatStr = decf.format(d); + /** + * 通过java保留小数了 + * 如果转换前的长度>转换后的长度,Java的转换就有可能出错 + */ + if (doubleStr.length() > formatStr.length()) { + /** + * 如果前面的都一致,但最后一位大于4就需要进位 + * 否则不进位 + */ + if (formatStr.equals(doubleStr.substring(0, formatStr.length()))) { + /** + * 取转换前的后一位, + * 有可能是“.” + */ + String followStr = doubleStr.substring(formatStr.length(), formatStr.length() + 1); + if (".".equals(followStr)) { + followStr = doubleStr.substring(formatStr.length() + 1, formatStr.length() + 2); + } + + if (Integer.valueOf(followStr).intValue() > 4) { + /** + * 这个时候Java没有进位 + */ + formatStr = decf.format(Double.valueOf(formatStr).doubleValue() + Double.valueOf(format.substring(0, format.length() - 1) + "1"). + doubleValue()); + } + } + } + + return formatStr; + } + + /** + * 把一个都money转换成大写的money + * + * @param d 需要转换的money + * @return 换成大写的money + */ + public static String capitalValueOf(double d) { + String lowStr; + int strLen; + String currentStr; + String upperPart; + String upperStr = ""; + int index = 0; + int findCount; + String chns = "零壹贰叁肆伍陆柒捌玖"; + String units = "分角 拾佰仟万拾佰仟亿拾佰仟万"; + + if (d >= 100000000 || d < 0) { + return ""; + } + if (d == 0) { + return "零元"; + } + lowStr = trim(formatDoubleToString(d, "0.00")); + strLen = lowStr.length(); + if (strLen == 0) { + return ""; + } + while (index < strLen) { + currentStr = subString(lowStr, strLen - index - 1, strLen - index); + if (".".equals(currentStr)) { + upperPart = "元"; + } else { + upperPart = subString(chns, Integer.valueOf(currentStr).intValue(), Integer.valueOf(currentStr).intValue() + 1); + } + upperPart += trim(subString(units, index, index + 1)); + upperStr = upperPart + upperStr; + index += 1; + } + for (; ; ) { + findCount = 0; + if (upperStr.indexOf("拾零万零仟") < 0) { + if (upperStr.indexOf("拾零万") >= 0) { + if ("仟".equals(subString(upperStr, upperStr.indexOf("拾零万") + 4, upperStr.indexOf("拾零万") + 5))) { + findCount++; + upperStr = upperStr.replaceFirst("拾零万", "拾万零"); + } + } + } + if (upperStr.indexOf("零元") >= 0) { + findCount++; + upperStr = upperStr.replaceAll("零元", "元"); + } + if (upperStr.indexOf("零拾") >= 0) { + findCount++; + upperStr = upperStr.replaceAll("零拾", "零"); + } + if (upperStr.indexOf("零佰") >= 0) { + findCount++; + upperStr = upperStr.replaceAll("零佰", "零"); + } + if (upperStr.indexOf("零仟") >= 0) { + findCount++; + upperStr = upperStr.replaceAll("零仟", "零"); + } + if (upperStr.indexOf("零万") >= 0) { + findCount++; + upperStr = upperStr.replaceAll("零万", "万"); + } + if (upperStr.indexOf("零亿") >= 0) { + findCount++; + upperStr = upperStr.replaceAll("零亿", "亿"); + } + if (upperStr.indexOf("零零") >= 0) { + findCount++; + upperStr = upperStr.replaceAll("零零", "零"); + } + if (upperStr.indexOf("零角零分") >= 0) { + findCount++; + upperStr = upperStr.replaceAll("零角零分", ""); + } + if (upperStr.indexOf("零分") >= 0) { + findCount++; + upperStr = upperStr.replaceAll("零分", ""); + } + if (upperStr.indexOf("零角") >= 0) { + findCount++; + upperStr = upperStr.replaceAll("零角", "零"); + } + if (upperStr.indexOf("零亿零万零元") >= 0) { + findCount++; + upperStr = upperStr.replaceAll("零亿零万零元", "亿元"); + } + if (upperStr.indexOf("亿零万零元") >= 0) { + findCount++; + upperStr = upperStr.replaceAll("亿零万零元", "亿元"); + } + if (upperStr.indexOf("零亿零万") >= 0) { + findCount++; + upperStr = upperStr.replaceAll("零亿零万", "亿"); + } + if (upperStr.indexOf("零万零元") >= 0) { + findCount++; + upperStr = upperStr.replaceAll("零万零元", "万元"); + } + if (upperStr.indexOf("万零元") >= 0) { + findCount++; + upperStr = upperStr.replaceAll("万零元", "万元"); + } + if (findCount == 0) { + break; + } + } + while ("元".equals(subString(upperStr, 0, 1)) || "零".equals(subString(upperStr, 0, 1)) || "角".equals(subString(upperStr, 0, 1)) || "分".equals(subString(upperStr, 0, 1)) || "整".equals(subString(upperStr, 0, 1))) { + strLen = upperStr.length(); + upperStr = subString(upperStr, 1, strLen); + } + return upperStr; + } + +} diff --git a/app/src/main/java/com/dskj/rbchat/utils/play/VoiceUtils.java b/app/src/main/java/com/dskj/rbchat/utils/play/VoiceUtils.java new file mode 100644 index 0000000..9f08d92 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/utils/play/VoiceUtils.java @@ -0,0 +1,221 @@ +package com.dskj.rbchat.utils.play; + +import android.content.Context; +import android.media.MediaPlayer; +import android.media.PlaybackParams; + +import com.dskj.rbchat.R; +import com.dskj.rbchat.utils.LogUtils; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + + +public class VoiceUtils { + private static volatile VoiceUtils singleton = null; + public boolean IsPlaying; + public int mType; // Cash or 积分 + + MediaPlayer mediaPlayer = null; + private Context mContext; + + private List stringsAmount = new ArrayList<>(); + + public VoiceUtils(Context context) { + this.mContext = context.getApplicationContext(); + } + + /** + * 单例 + * + * @param context + * @return + */ + public static VoiceUtils with(Context context) { + if (singleton == null) { + synchronized (VoiceUtils.class) { + if (singleton == null) { + singleton = new VoiceUtils(context); + } + } + } + return singleton; + } + + public void SetIsPlay(boolean IsPlaying) { + + this.IsPlaying = IsPlaying; + } + + public boolean GetIsPlay() { + return IsPlaying; + } + + public void Play(String stramount, int type) { + if (!IsPlaying) { + doPlay(stramount, type); + } else { + stringsAmount.add(new AmountBean(stramount, type)); + LogUtils.d("stringsAmount==" + stringsAmount.size()); + } + + } + + + public void doPlay(String stramount, int type) { + mType = type; + singleton.SetIsPlay(true); + String str = null; + str = "¥" + PlaySound.capitalValueOf(Double.valueOf(String.format("%.2f", Double.parseDouble(stramount)))).trim(); + LogUtils.d("金额的长度 " + str); + try { + Thread.sleep(500); + } catch (InterruptedException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } + + PlaySoundList(1, str, str.length()); + } + + + public void PlaySoundList(final int soundindex, final String soundString, final int soundcount) { + boolean createState = false; + if (mediaPlayer == null) { + mediaPlayer = null; + } + LogUtils.d("加载音频[" + soundindex + "]"); + mediaPlayer = createSound(soundindex, soundString); + createState = true; + + if (createState == true) + LogUtils.d("加载音频成功[" + soundindex + "]"); + else + LogUtils.d("加载音频失败[" + soundindex + "]"); + + //播放完成触发此事件 + mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { + @Override + public void onCompletion(MediaPlayer mp) { + mp.release();//释放音频资源 + int newsoundindex = soundindex; + LogUtils.d("释放资源[" + soundindex + "]"); + if (soundindex < soundcount) { + newsoundindex = newsoundindex + 1; + PlaySoundList(newsoundindex, soundString, soundcount); + } else { + singleton.SetIsPlay(false); + for (Iterator iterator = stringsAmount.iterator(); iterator.hasNext(); ) { + if (!IsPlaying) { + AmountBean bean = iterator.next(); + doPlay(bean.getAmount(), bean.getType()); + iterator.remove(); + LogUtils.d("stringsAmount== remove" + stringsAmount.size()); + break; + } + + } + + } + + } + }); + try { + //在播放音频资源之前,必须调用Prepare方法完成些准备工作 + if (createState) + mediaPlayer.prepare(); + else + mediaPlayer.prepare(); + //开始播放音频 + mediaPlayer.start(); + + LogUtils.d("播放音频[" + soundindex + "]"); + } catch (IllegalStateException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public MediaPlayer createSound(int soundIndex, String soundString) { + MediaPlayer mp = null; + + String soundChar = soundString.substring(soundIndex - 1, soundIndex); + PlaybackParams pbp = new PlaybackParams(); + pbp.setSpeed(1.8f); + switch (soundChar) { + case "零": + mp = MediaPlayer.create(mContext, R.raw.sound0); + break; + case "壹": + mp = MediaPlayer.create(mContext, R.raw.sound1); + break; + case "贰": + mp = MediaPlayer.create(mContext, R.raw.sound2); + break; + case "叁": + mp = MediaPlayer.create(mContext, R.raw.sound3); + break; + case "肆": + mp = MediaPlayer.create(mContext, R.raw.sound4); + break; + case "伍": + mp = MediaPlayer.create(mContext, R.raw.sound5); + break; + case "陆": + mp = MediaPlayer.create(mContext, R.raw.sound6); + break; + case "柒": + mp = MediaPlayer.create(mContext, R.raw.sound7); + break; + case "捌": + mp = MediaPlayer.create(mContext, R.raw.sound8); + break; + case "玖": + mp = MediaPlayer.create(mContext, R.raw.sound9); + break; + case "拾": + mp = MediaPlayer.create(mContext, R.raw.soundshi); + break; + case "佰": + mp = MediaPlayer.create(mContext, R.raw.soundbai); + break; + case "仟": + mp = MediaPlayer.create(mContext, R.raw.soundqian); + break; +// case "角": +// mp=MediaPlayer.create(mContext,R.raw.soundjiao); +// break; +// case "分": +// mp=MediaPlayer.create(mContext,R.raw.soundfen); +// break; + case "元": + if (mType == 0) { + mp = MediaPlayer.create(mContext, R.raw.soundcash); + } else { + pbp.setSpeed(1.2f); + mp = MediaPlayer.create(mContext, R.raw.soundjifen); + } + + break; +// case "整": +// mp=MediaPlayer.create(mContext,R.raw.soundzheng); +// break; + case "万": + mp = MediaPlayer.create(mContext, R.raw.soundwan); + break; + case "¥": + pbp.setSpeed(1.2f); + mp = MediaPlayer.create(mContext, R.raw.soundsuccess); + break; + + } + + mp.setPlaybackParams(pbp); + mp.stop(); + return mp; + } + +} diff --git a/app/src/main/java/com/dskj/rbchat/voom/CircleFragment.java b/app/src/main/java/com/dskj/rbchat/voom/CircleFragment.java new file mode 100644 index 0000000..b5c5da7 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/voom/CircleFragment.java @@ -0,0 +1,562 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.voom; + +import android.app.Activity; +import android.content.Intent; +import android.graphics.Bitmap; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.text.TextUtils; +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 androidx.activity.result.ActivityResultLauncher; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.DefaultItemAnimator; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.SimpleItemAnimator; +import androidx.recyclerview.widget.StaggeredGridLayoutManager; + +import com.amap.api.location.AMapLocation; +import com.amap.api.location.AMapLocationClient; +import com.amap.api.location.AMapLocationClientOption; +import com.amap.api.location.AMapLocationListener; +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.DataSource; +import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.bumptech.glide.load.engine.GlideException; +import com.bumptech.glide.request.RequestListener; +import com.bumptech.glide.request.RequestOptions; +import com.bumptech.glide.request.target.ImageViewTarget; +import com.bumptech.glide.request.target.SimpleTarget; +import com.bumptech.glide.request.target.Target; +import com.bumptech.glide.request.transition.Transition; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.databinding.FragmentCircleBinding; +import com.dskj.rbchat.model.AlbumBean; +import com.dskj.rbchat.model.ListBeanResult; +import com.dskj.rbchat.model.RxBusLoadMoreListBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.ApiService; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.AdaptScreenUtils; +import com.dskj.rbchat.utils.AnimUtil; +import com.dskj.rbchat.utils.Constant; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.utils.ScreenUtils; +import com.dskj.rbchat.widget.CircleImageView; +import com.ethanhua.skeleton.Skeleton; +import com.ethanhua.skeleton.SkeletonScreen; +import com.netease.yunxin.kit.alog.ALog; +import com.netease.yunxin.kit.chatkit.repo.ContactRepo; +import com.netease.yunxin.kit.chatkit.ui.common.RxBus; +import com.netease.yunxin.kit.common.ui.fragments.BaseFragment; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.model.FriendInfo; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +public class CircleFragment extends BaseFragment { + private FragmentCircleBinding binding; + + AMapLocation aMapLocation; + //声明AMapLocationClientOption对象 + public AMapLocationClientOption mLocationOption = null; + //声明AMapLocationClient类对象 + public AMapLocationClient mLocationClient = null; + //声明定位回调监听器 + public AMapLocationListener mLocationListener; + + public static List titles = new ArrayList<>(); + static CommonAdapter commonAdapter; + private int categoryId; + StaggeredGridLayoutManager linearLayoutManager; + protected ActivityResultLauncher permissionLauncher; + SkeletonScreen skeletonScreen; + + public static void changeBean(AlbumBean albumBean, int pos) { + if (titles.size() > pos) { + titles.set(pos, albumBean); + commonAdapter.notifyItemChanged(pos, albumBean); + } + } + + private void initShowSkeleton() { + skeletonScreen = Skeleton.bind(binding.recyclerview) + .adapter(commonAdapter) + .load(R.layout.discover_child_item_default) + .shimmer(true) // whether show shimmer animation. default is true + .count(10) // the recycler view item count. default is 10 + .color(R.color.color_white) // the shimmer color. default is #a2878787 + .angle(20) // the shimmer angle. default is 20; + .duration(1500) // the shimmer animation duration. default is 1000; + .frozen(false).show(); + } + + int type; + + public static CircleFragment newInstance(int status1) { + Bundle bundle = new Bundle(); + bundle.putInt("type", status1); + CircleFragment view = new CircleFragment(); + view.setArguments(bundle); + return view; + } + + @Nullable + @Override + public View onCreateView( + @NonNull LayoutInflater inflater, + @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + ALog.d(Constant.PROJECT_TAG, "CircleFragment:onCreateView"); + binding = FragmentCircleBinding.inflate(inflater); + type = getArguments().getInt("type"); + + return binding.getRoot(); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + initList(); + initRefreshLayout(); + RxBus.getInstance().toObservable(Integer.class) + .subscribeOn(Schedulers.io()) + .unsubscribeOn(Schedulers.io()) + .subscribe(changeImageViewBean -> {//回顶部 + if (changeImageViewBean == (8000 + categoryId)) { + binding.recyclerview.scrollToPosition(0); + binding.recyclerview.scrollTo(0, 0); + } else if (changeImageViewBean == IMUIKitConfig.PUSH_CIR_SUCC) { + + binding.refreshLayout.autoRefresh(); + + } + }); + + RxBus.getInstance().toObservable(AlbumBean.class) + .subscribeOn(Schedulers.io()) + .unsubscribeOn(Schedulers.io()) + .subscribe(changeImageViewBean -> {//回顶部 + if (changeImageViewBean.getIsDelete() == 1) { + for (int i = 0; i < titles.size(); i++) { + if (changeImageViewBean.getPostId().equals(titles.get(i).getPostId())) { + titles.remove(i); + commonAdapter.setDates(titles); + break; + } + } + } else { + for (int i = 0; i < titles.size(); i++) { + if (changeImageViewBean.getPostId().equals(titles.get(i).getPostId())) { + titles.set(i, changeImageViewBean); + commonAdapter.notifyItemChanged(i, changeImageViewBean); + break; + } + } + } + }); + + RxBus.getInstance().toObservable(RxBusLoadMoreListBean.class) + .subscribeOn(Schedulers.io()) + .unsubscribeOn(Schedulers.io()) + .subscribe(changeImageViewBean -> { + if (changeImageViewBean.getType() == 0) { + if (titles.size() % 30 == 0) { + pageSize += 1; + getDateList(); + } + } + }); + + String locList = DataUtils.get(getActivity(), "loc_tuijian_" + IMKitClient.account(), null); + if (TextUtils.isEmpty(locList)) { + binding.refreshLayout.autoRefresh(); + } else { + titles = GsonUtils.getListFromJSON(locList, AlbumBean.class); + changeDateFirst(); + } + + + } + + + int pageSize = 1; + + private void initRefreshLayout() { + binding.refreshLayout.setOnRefreshListener(refreshlayout -> { +// titles = initTest(); +// binding.refreshLayout.finishRefresh(); +// binding.refreshLayout.finishLoadMore(); +// commonAdapter.setDates(titles); + + pageSize = 1; + binding.refreshLayout.setVisibility(View.VISIBLE); + binding.refreshLayout.setEnableLoadMore(true); + initShowSkeleton(); + getDateList(); + + + }); + binding.refreshLayout.setOnLoadMoreListener(refreshLayout -> { +// List list = initTest(); +// titles.addAll(list); +// commonAdapter.addDates(list); +// binding.refreshLayout.finishRefresh(); +// binding.refreshLayout.finishLoadMore(); + pageSize += 1; + getDateList(); + }); + } + + Map map = new HashMap<>(); + + private void initList() { + RequestOptions requestOptions; + requestOptions = new RequestOptions() + .error(R.mipmap.voom_none_img) + .placeholder(R.mipmap.voom_none_img) + .skipMemoryCache(false) + .diskCacheStrategy(DiskCacheStrategy.RESOURCE); + linearLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL); + linearLayoutManager.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_NONE); + + +// linearLayoutManager.setReverseLayout(true); + //防止item 交换位置 + binding.recyclerview.addOnScrollListener(new RecyclerView.OnScrollListener() { + @Override + public void onScrollStateChanged(RecyclerView recyclerView, int newState) { + super.onScrollStateChanged(recyclerView, newState); + linearLayoutManager.invalidateSpanAssignments(); //防止第一行到顶部有空白区域 + } + }); + ((DefaultItemAnimator) binding.recyclerview.getItemAnimator()).setSupportsChangeAnimations(false); + ((SimpleItemAnimator) binding.recyclerview.getItemAnimator()).setSupportsChangeAnimations(false); + binding.recyclerview.getItemAnimator().setChangeDuration(0); + binding.recyclerview.setLayoutManager(linearLayoutManager); + + + commonAdapter = new CommonAdapter(getContext(), R.layout.discover_child_item, titles) { + @Override + public void convert(ViewHolder holder, AlbumBean s, int index) { + TextView textView = holder.getView(R.id.title_tv); + textView.setText(s.getText()); + ImageView video_tag = holder.getView(R.id.video_tag); + String name = s.getUserNickname(); + FriendInfo friendInfo = ContactRepo.getFriend(String.valueOf(s.getUserId())); + if (friendInfo!=null&&!TextUtils.isEmpty(friendInfo.getAlias())) { + name = friendInfo.getAlias(); + } + holder.setText(R.id.user_name_tv, name); + LinearLayout main_content = holder.getView(R.id.big_ly); + AnimUtil.setAnimView(main_content, 1.02f); + main_content.setOnClickListener(v -> { + Intent intent = new Intent(getActivity(), TiktokActivity.class); + intent.putExtra("index", index); + intent.putExtra("type", type); + startActivityForResult(intent, 888); + }); + ImageView pic_ic = holder.getView(R.id.pic_ic); + long timeDa = DataUtils.dateToStamp(s.getCreateTime()); + video_tag.setVisibility(View.GONE); + CircleImageView itemHeadCiv = holder.getView(R.id.head_iv); + if (!TextUtils.isEmpty(s.getUserAvatar())) { + if (s.getUserAvatar().startsWith("http")) { + Glide.with(itemHeadCiv) + .load(s.getUserAvatar()) + .placeholder(R.mipmap.default_head_img) + .error(R.mipmap.default_head_img) + .into(itemHeadCiv); + } else { + LogUtils.i("头像地址:" + String.format(IMUIKitConfig.AVATAR_DOWNLOAD_CONTROLLER_URL_ROOT, s.getUserAvatar())); + Glide.with(itemHeadCiv) + .load(IMUIKitConfig.OSS_URL + s.getUserAvatar()) + .placeholder(R.mipmap.default_head_img) + .error(R.mipmap.default_head_img) + .into(itemHeadCiv); + } + } else { + itemHeadCiv.setImageResource(R.mipmap.default_head_img); + } + pic_ic.setVisibility(View.VISIBLE); + if (s.getType() != null) { + if (s.getType() == 1) { + if (!TextUtils.isEmpty(s.getPicture1())) { + if (s.getPicture1().startsWith("http")) { + if (System.currentTimeMillis() - timeDa < IMUIKitConfig.MOMENTS_SOURCE_TIME) { +// Glide.with(getActivity()) +// .load(s.getPicture1().replace("/pic_output/", "/pic_input/")) +// .apply(requestOptions).into(pic_ic); + toUrl(holder, s.getPicture1().replace("/pic_output/", "/pic_input/")); + } else { +// Glide.with(getActivity()) +// .load(s.getPicture1().replace("/pic_input/", "/pic_output/")) +// .apply(requestOptions).into(pic_ic); + toUrl(holder, s.getPicture1().replace("/pic_input/", "/pic_output/")); + + } + } else { +// Glide.with(getActivity()) +// .load(ApiService.URL + s.getPicture1()) +// .into(pic_ic); + toUrl(holder, ApiService.URL + s.getPicture1()); + + } + } + + } else if (s.getType() == 2) { + String url = s.getVideo(); + String picUrl = ""; + video_tag.setVisibility(View.VISIBLE); + + if (!TextUtils.isEmpty(s.getVideo())) { + if (!url.startsWith("http")) { + url = ApiService.URL + s.getVideo(); + picUrl = url; + } else { + +// if (System.currentTimeMillis() - timeDa < IMUIKitConfig.MOMENTS_SOURCE_TIME) { + picUrl = url.replace("video_output", "video_input") + "?x-oss-process=video/snapshot,t_7000,w_300,h_400,f_jpg,m_fast"; +// } else { +// picUrl = url.replace("video_input", "video_output") + "?x-oss-process=video/snapshot,t_7000,w_300,h_400,f_jpg,m_fast"; +// } + + } +// Glide.with(getActivity()) +// .load(picUrl) +// .into(pic_ic); + + toUrl(holder, picUrl); + + } + } else { + pic_ic.setVisibility(View.GONE); + } + if (s.getLikes() == null || s.getLikes().size() == 0) { + holder.setText(R.id.like_number_tv, "0"); + } else { + holder.setText(R.id.like_number_tv, "" + s.getLikes().size()); + } + ImageView like_iv = holder.getView(R.id.like_iv); + if (isZan(s)) { + like_iv.setImageResource(R.mipmap.like_t_img); + } else { + like_iv.setImageResource(R.mipmap.like_f_img); + + } + } + + } + }; + binding.recyclerview.setAdapter(commonAdapter); + } + + private void toUrl(ViewHolder holder, String s) { + ImageView pic_ic = holder.getView(R.id.pic_ic); + +// try { +// Glide.with(getActivity()) +// .load(s) +// .placeholder(R.mipmap.voom_none_img) +// .error(R.mipmap.voom_none_img) +// .into(pic_ic); +// .listener(new RequestListener() { +// @Override +// public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) { +// Glide.with(getActivity()) +// .asBitmap() +// .load(s.replace("/pic_output/", "/pic_input/")) +// .placeholder(R.mipmap.voom_none_img) +// .error(R.mipmap.voom_none_img) +// .into(new SimpleTarget() { +// public void onResourceReady(@NonNull Bitmap bitmap, @Nullable Transition transition) { +// //这个bitmap就是你图片url加载得到的结果 +//// //获取bitmap信息,可赋值给外部变量操作,也可在此时行操作。 +// ViewGroup.LayoutParams layoutParams = (ViewGroup.LayoutParams)pic_ic.getLayoutParams();//获取你要填充图片的布局的layoutParam +// //因为是2列,所以宽度是屏幕的一半,高度是根据bitmap的高/宽*屏幕宽的一半 +// layoutParams.width = (ScreenUtils.getScreenWidth()- AdaptScreenUtils.pt2Px(0)) / 2;//这个是布局的宽度 +// +// layoutParams.height = (int) ((float) bitmap.getHeight() / (float) bitmap.getWidth() * layoutParams.width- AdaptScreenUtils.pt2Px(5) ); +// +// pic_ic.setLayoutParams(layoutParams);//容器的宽高设置好了 +// // 然后在改变一下bitmap的宽高 +// (pic_ic).setImageBitmap(bitmap); +// } +// +// +// }); +// return false; +// } +// +// @Override +// public boolean onResourceReady(Bitmap resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) { +// return false; +// } +// }) +// .into(new SimpleTarget() { +// public void onResourceReady(@NonNull Bitmap bitmap, @Nullable Transition transition) { +// //这个bitmap就是你图片url加载得到的结果 +//// //获取bitmap信息,可赋值给外部变量操作,也可在此时行操作。 +// ViewGroup.LayoutParams layoutParams = (ViewGroup.LayoutParams)pic_ic.getLayoutParams();//获取你要填充图片的布局的layoutParam +// //因为是2列,所以宽度是屏幕的一半,高度是根据bitmap的高/宽*屏幕宽的一半 +// layoutParams.width = (ScreenUtils.getScreenWidth()- AdaptScreenUtils.pt2Px(0)) / 2;//这个是布局的宽度 +// +// layoutParams.height = (int) ((float) bitmap.getHeight() / (float) bitmap.getWidth() * layoutParams.width- AdaptScreenUtils.pt2Px(5) ); +// +// pic_ic.setLayoutParams(layoutParams);//容器的宽高设置好了 +// // 然后在改变一下bitmap的宽高 +// (pic_ic).setImageBitmap(bitmap); +// } + + +// }); + +// }catch (Exception e){ +// e.printStackTrace(); +// } + Glide.with(getActivity()) + .load(s.replace("/pic_output/", "/pic_input/")) + .placeholder(R.mipmap.voom_none_img) + .error(R.mipmap.voom_none_img) + + .into(pic_ic); + } + + @Override + public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (requestCode == 888 && resultCode == Activity.RESULT_OK) { + int index = data.getIntExtra("index", 0); + binding.recyclerview.scrollToPosition(index); + } + } + + private boolean isZan(AlbumBean albumBean) { + if (albumBean.getLikes() != null && albumBean.getLikes().size() > 0) { + for (int i = 0; i < albumBean.getLikes().size(); i++) { + if ((albumBean.getLikes().get(i).getUserId() + "").equals(IMKitClient.account())) { + return true; + } + } + return false; + } else { + return false; + } + } + + private void getDateList() { + Map maps = new HashMap<>(); + maps.put("page", pageSize); + maps.put("size", 30); + maps.put("selectType", type); + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + + Api.getInstance().posts(maps) + .subscribeOn(io.reactivex.schedulers.Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>>() { + @Override + public void onSuccess(Result> feedbackResp) { + LogUtils.i("获取到的列表:" + GsonUtils.beanToJSONString(feedbackResp)); + + changeDate(feedbackResp.data); + + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + binding.refreshLayout.finishRefresh(); + binding.refreshLayout.finishLoadMore(); +// changeView(false); + changeView(); + } + }); + } + + + private void changeDate(ListBeanResult data) { + if (data.getList() != null) { + if (pageSize == 1) { + titles = data.getList(); + if (titles != null) { + commonAdapter.setDates(titles); + if (titles.size() > 0) { + if (getActivity() != null) { + DataUtils.set(getActivity(), "loc_tuijian_" + IMKitClient.account(), GsonUtils.beanToJSONString(titles)); + } + } + } + } else { + commonAdapter.addDates(data.getList()); + titles = commonAdapter.getDates(); + LogUtils.i("滑动到哪个位置:" + ((titles.size() - data.getList().size()) - 1)); + binding.recyclerview.scrollToPosition((titles.size() - data.getList().size()) - 1); +// mLinearLayoutManager.smoothScrollToPosition(recyclerView,null,mList.size()-data.getList().size()); + } + + } + binding.refreshLayout.finishRefresh(); + binding.refreshLayout.finishLoadMore(); + if (data.getList().size() < 30) { + binding.refreshLayout.finishLoadMoreWithNoMoreData(); + } + changeView(); + } + + private void changeDateFirst() { + if (titles != null) { + commonAdapter.setDates(titles); + pageSize = 1; + getDateList(); + } + } + + private void changeView() { + if (skeletonScreen != null) { + skeletonScreen.hide(); + } + if (titles == null || titles.size() == 0) { + if (binding.emtryLy.getVisibility() == View.GONE) { + binding.emtryLy.setVisibility(View.VISIBLE); + binding.refreshLayout.setVisibility(View.GONE); + } + binding.emtryIv.setImageResource(R.mipmap.pyq_nodate1); + binding.emtryTv.setText(R.string.zanwushuju_txt); + binding.emtryIv.setOnClickListener(v -> binding.refreshLayout.autoRefresh()); + } else { + if (binding.emtryLy.getVisibility() == View.VISIBLE) { + binding.emtryLy.setVisibility(View.GONE); + binding.refreshLayout.setVisibility(View.VISIBLE); + } + } + } + + @Override + public void onResume() { + super.onResume(); + + } +} diff --git a/app/src/main/java/com/dskj/rbchat/voom/CirclePicFragment.java b/app/src/main/java/com/dskj/rbchat/voom/CirclePicFragment.java new file mode 100644 index 0000000..8b08873 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/voom/CirclePicFragment.java @@ -0,0 +1,70 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.voom; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.bumptech.glide.request.RequestOptions; +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.FragmentCirclePicBinding; +import com.dskj.rbchat.utils.Constant; +import com.netease.yunxin.kit.alog.ALog; +import com.netease.yunxin.kit.common.ui.fragments.BaseFragment; + +public class CirclePicFragment extends BaseFragment { + private FragmentCirclePicBinding binding; + String type = null; + public static CirclePicFragment newInstance(String url) { + Bundle bundle = new Bundle(); + bundle.putString("type", url); + CirclePicFragment view = new CirclePicFragment(); + view.setArguments(bundle); + return view; + } + + @Nullable + @Override + public View onCreateView( + @NonNull LayoutInflater inflater, + @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + ALog.d(Constant.PROJECT_TAG, "CircleFragment:onCreateView"); + binding = FragmentCirclePicBinding.inflate(inflater); + type = getArguments().getString("type"); + + return binding.getRoot(); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + RequestOptions requestOptions; + requestOptions = new RequestOptions() + .fitCenter() + .error(R.mipmap.voom_none_img1) + .skipMemoryCache(false) + .diskCacheStrategy(DiskCacheStrategy.RESOURCE); + + Glide.with(getActivity()) + .load(type) + .apply(requestOptions).into(binding.picIv); + + } + + + @Override + public void onResume() { + super.onResume(); + + } +} diff --git a/app/src/main/java/com/dskj/rbchat/voom/CommentFragment.java b/app/src/main/java/com/dskj/rbchat/voom/CommentFragment.java new file mode 100644 index 0000000..4f1ebc7 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/voom/CommentFragment.java @@ -0,0 +1,368 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.voom; + +import android.os.Bundle; +import android.os.Handler; +import android.text.TextUtils; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.view.inputmethod.EditorInfo; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.LinearLayoutManager; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.bumptech.glide.request.RequestOptions; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.databinding.FragmentCommentBinding; +import com.dskj.rbchat.model.AlbumBean; +import com.dskj.rbchat.model.CommentBean; +import com.dskj.rbchat.model.RxCommLikeBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.Constant; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.KeyboardUtil; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.widget.CircleImageView; +import com.netease.yunxin.kit.alog.ALog; +import com.netease.yunxin.kit.chatkit.ui.common.RxBus; +import com.netease.yunxin.kit.common.ui.fragments.BaseFragment; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.corekit.im.IMKitClient; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class CommentFragment extends BaseFragment { + private FragmentCommentBinding binding; + private ArrayList titles = new ArrayList<>(); + CommonAdapter commonAdapter; + LinearLayoutManager linearLayoutManager; + AlbumBean albumBean; + int type; + + public static CommentFragment newInstance(int status1, AlbumBean albumBean) { + Bundle bundle = new Bundle(); + bundle.putInt("type", status1); + bundle.putSerializable("bean", albumBean); + + CommentFragment view = new CommentFragment(); + view.setArguments(bundle); + return view; + } + + @Nullable + @Override + public View onCreateView( + @NonNull LayoutInflater inflater, + @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + ALog.d(Constant.PROJECT_TAG, "CircleFragment:onCreateView"); + binding = FragmentCommentBinding.inflate(inflater); + type = getArguments().getInt("type"); + albumBean = (AlbumBean) getArguments().getSerializable("bean"); + return binding.getRoot(); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + LogUtils.i("数据是啥:"+ GsonUtils.beanToJSONString(albumBean)); + + if(albumBean.getComments()!=null&&albumBean.getComments().size()>0){ + titles = (ArrayList) albumBean.getComments(); + LogUtils.i("评论多少条:"+titles.size()); + binding.refreshLayout.setVisibility(View.VISIBLE); + binding.nodianzanLy.setVisibility(View.GONE); + }else{ + titles = new ArrayList<>(); + + binding.refreshLayout.setVisibility(View.GONE); + binding.nodianzanLy.setVisibility(View.VISIBLE); + } + initList(); + initRefreshLayout(); + + +// binding.refreshLayout.autoRefresh(); + + binding.commentEt.setOnEditorActionListener(new TextView.OnEditorActionListener() { + @Override + public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { + if(actionId == EditorInfo.IME_ACTION_SEND){ + if(!TextUtils.isEmpty(binding.commentEt.getText().toString().trim())){ + toComment(binding.commentEt.getText().toString().trim()); + } + } + return false; + } + }); + + binding.nodianzanIv.setOnClickListener(v -> { +// binding.nodianzanLy.setVisibility(View.GONE); +// binding.refreshLayout.setVisibility(View.VISIBLE); + getInfo(); + + }); + + } + + String replyCommentId = null; + private void toComment(String toString) { + Map map = new HashMap<>(); + map.put("postId", albumBean.getPostId()); + map.put("text", toString); + if(replyCommentId!=null){ + map.put("replyCommentId",replyCommentId); + } + if(!TextUtils.isEmpty(IMUIKitConfig.SUBSTATIONID)) { + map.put("substationId", IMUIKitConfig.SUBSTATIONID); + } + Api.getInstance().postComment(map) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver() { + @Override + public void onSuccess(Result feedbackResp) { + binding.commentEt.setText(""); + binding.commentEt.setHint(getString(R.string.say_somthing_txt)); + replyCommentId = null; + getInfo(); + binding.refreshLayout.setVisibility(View.VISIBLE); + binding.nodianzanLy.setVisibility(View.GONE); + + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast(msg); + + } + }); + } + private void deleteComment(CommentBean s) { + + Api.getInstance().postCommentDelete(s.getCommentId()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver() { + @Override + public void onSuccess(Result feedbackResp) { + getInfo(); + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast(msg); + + } + }); + } + + private void getInfo(){ + + Api.getInstance().postsInfo(albumBean.getPostId()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + albumBean = feedbackResp.data; + + RxBus.getInstance().post(albumBean); + RxCommLikeBean rxCommLikeBean = new RxCommLikeBean(albumBean.getPostId(),feedbackResp.data.getComments()==null?0:feedbackResp.data.getComments().size(), + feedbackResp.data.getLikes()==null?0:feedbackResp.data.getLikes().size()); + RxBus.getInstance().post(rxCommLikeBean); + binding.refreshLayout.finishRefresh(); + if(albumBean.getComments()!=null&&albumBean.getComments().size()>0){ + titles = (ArrayList) albumBean.getComments(); + LogUtils.i("评论多少条:"+titles.size()); + binding.refreshLayout.setVisibility(View.VISIBLE); + binding.nodianzanLy.setVisibility(View.GONE); + commonAdapter.setDates(titles); + }else{ + titles = new ArrayList<>(); + binding.refreshLayout.setVisibility(View.GONE); + binding.nodianzanLy.setVisibility(View.VISIBLE); + } + } + + @Override + public void onError(int code, String msg) { + } + }); + } + private void initRefreshLayout() { + binding.refreshLayout.setOnRefreshListener(refreshlayout -> { +// titles = initTest(); + getInfo(); + }); +// binding.refreshLayout.setOnLoadMoreListener(refreshLayout -> { +// List list = initTest(); +// titles.addAll(list); +// commonAdapter.addDates(list); +// binding.refreshLayout.finishRefresh(); +// binding.refreshLayout.finishLoadMore(); +// }); + } + Handler handler = new Handler(); + + private void initList() { + RequestOptions requestOptions; + requestOptions = new RequestOptions() + .error(R.mipmap.default_head_img) + .skipMemoryCache(false) + .diskCacheStrategy(DiskCacheStrategy.RESOURCE); + linearLayoutManager = new LinearLayoutManager(getActivity()); + + binding.recyclerview.setLayoutManager(linearLayoutManager); + commonAdapter = new CommonAdapter<>(getContext(), R.layout.item_comment_list, titles) { + @Override + public void convert(ViewHolder holder, CommentBean s, int index) { + holder.setText(R.id.title_tv, s.getUserNickname()); + holder.setText(R.id.des_tv, s.getText()); + holder.setText(R.id.time_tv, s.getCreateTime()); + holder.getView(R.id.title_tv1).setVisibility(View.GONE); + holder.getView(R.id.huifu_tv).setVisibility(View.GONE); + holder.getView(R.id.zuozhe_iv1).setVisibility(View.GONE); + holder.getView(R.id.zuozhe_iv2).setVisibility(View.GONE); + CircleImageView logo_iv = holder.getView(R.id.logo_iv); + if (s.getUserId().equals(albumBean.getUserId())) { + holder.getView(R.id.zuozhe_iv1).setVisibility(View.VISIBLE); + } + + if (s.getReplyCommentId() != null) { + holder.getView(R.id.title_tv1).setVisibility(View.VISIBLE); + String name = getNickName(s.getReplyCommentId()); + if(TextUtils.isEmpty(name)){ + holder.setText(R.id.title_tv1, ""); + holder.getView(R.id.huifu_tv).setVisibility(View.GONE); + }else{ + holder.setText(R.id.title_tv1, name); + holder.getView(R.id.huifu_tv).setVisibility(View.VISIBLE); + if (getCommentUserId(s.getReplyCommentId()).equals(albumBean.getUserId())) { + holder.getView(R.id.zuozhe_iv2).setVisibility(View.VISIBLE); + } + } + } + holder.getView(R.id.rep_tv).setOnClickListener(v -> { + binding.commentEt.setHint(getString(R.string.huifu_txt) + " " + s.getUserNickname()); + replyCommentId = s.getCommentId(); + binding.commentEt.setFocusable(true); + binding.commentEt.setFocusableInTouchMode(true); + binding.commentEt.requestFocus(); + handler.postDelayed(() -> KeyboardUtil.showSoftInput(getActivity()), 200);//3秒后执行Runnable中的run方法 + }); + holder.getView(R.id.big_bg).setOnLongClickListener(v -> { + showBottomAction(s); + return true; + }); + if (!TextUtils.isEmpty(s.getUserAvatar())) { + if (s.getUserAvatar().startsWith("http")) { + Glide.with(getActivity()) + .load(s.getUserAvatar()) + .apply(requestOptions).into(logo_iv); + } else { + LogUtils.i("头像地址:" + String.format(IMUIKitConfig.AVATAR_DOWNLOAD_CONTROLLER_URL_ROOT, s.getUserAvatar())); + Glide.with(getActivity()) + .load(String.format(IMUIKitConfig.AVATAR_DOWNLOAD_CONTROLLER_URL_ROOT, s.getUserAvatar())) + .apply(requestOptions).into(logo_iv); + } + + } + } + }; + binding.recyclerview.setAdapter(commonAdapter); + } + + private void showBottomAction(CommentBean s) { + binding.huifuRy.setVisibility(View.GONE); + binding.floatLy.setVisibility(View.VISIBLE); + binding.actionTv.setText(s.getText()); + + if(((albumBean.getUserId()+"").equals(IMKitClient.account()))||(s.getUserId()+"").equals(IMKitClient.account())){ + binding.deleteTv.setVisibility(View.VISIBLE); + }else{ + binding.deleteTv.setVisibility(View.GONE); + } + + binding.huifudTv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + binding.huifuRy.setVisibility(View.VISIBLE); + binding.floatLy.setVisibility(View.GONE); + binding.commentEt.setHint(getString(R.string.huifu_txt)+" "+s.getUserNickname()); + replyCommentId = s.getCommentId(); + binding.commentEt.setFocusable(true); + binding.commentEt.setFocusableInTouchMode(true); + binding.commentEt.requestFocus(); + handler.postDelayed(() -> KeyboardUtil.showSoftInput(getActivity()), 200);//3秒后执行Runnable中的run方法 + } + }); + + binding.copyTv.setOnClickListener(v -> { + binding.huifuRy.setVisibility(View.VISIBLE); + binding.floatLy.setVisibility(View.GONE); + DataUtils.copy(s.getText(),getActivity()); + ToastX.showShortToast(R.string.fuzhichenggong_txt); + }); + binding.deleteTv.setOnClickListener(v -> { + binding.huifuRy.setVisibility(View.VISIBLE); + binding.floatLy.setVisibility(View.GONE); + deleteComment(s); + }); + + binding.cancelTv.setOnClickListener(v -> { + binding.huifuRy.setVisibility(View.VISIBLE); + binding.floatLy.setVisibility(View.GONE); + }); + } + + private String getNickName(Long commentId) { + if(titles != null){ + for (int i = 0; i < titles.size(); i++) { + if ((commentId+"").equals(titles.get(i).getCommentId())) { + return titles.get(i).getUserNickname(); + } + } + } + return ""; + } + + + private Integer getCommentUserId(Long commentId) { + if(titles != null){ + for (int i = 0; i < titles.size(); i++) { + if ((commentId+"").equals(titles.get(i).getCommentId())) { + return titles.get(i).getUserId(); + } + } + } + return 0; + } + + @Override + public void onResume() { + super.onResume(); + + } +} diff --git a/app/src/main/java/com/dskj/rbchat/voom/LikeFragment.java b/app/src/main/java/com/dskj/rbchat/voom/LikeFragment.java new file mode 100644 index 0000000..cb30bbd --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/voom/LikeFragment.java @@ -0,0 +1,187 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.voom; + +import android.os.Bundle; +import android.text.TextUtils; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.inputmethod.EditorInfo; +import android.widget.TextView; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.LinearLayoutManager; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.bumptech.glide.request.RequestOptions; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.databinding.FragmentCommentBinding; +import com.dskj.rbchat.databinding.FragmentLikeBinding; +import com.dskj.rbchat.model.AlbumBean; +import com.dskj.rbchat.model.CommentBean; +import com.dskj.rbchat.model.LikeBean; +import com.dskj.rbchat.utils.Constant; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.widget.CircleImageView; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.friend.FriendService; +import com.netease.nimlib.sdk.friend.model.Friend; +import com.netease.nimlib.sdk.uinfo.UserService; +import com.netease.nimlib.sdk.uinfo.model.NimUserInfo; +import com.netease.yunxin.kit.alog.ALog; +import com.netease.yunxin.kit.common.ui.fragments.BaseFragment; +import com.netease.yunxin.kit.common.ui.utils.ToastX; + +import java.util.ArrayList; +import java.util.List; + +public class LikeFragment extends BaseFragment { + private FragmentLikeBinding binding; + + private ArrayList titles = new ArrayList<>(); + CommonAdapter commonAdapter; + LinearLayoutManager linearLayoutManager; + AlbumBean albumBean; + + int type; + + public static LikeFragment newInstance(int status1, AlbumBean albumBean) { + Bundle bundle = new Bundle(); + bundle.putInt("type", status1); + bundle.putSerializable("bean", albumBean); + + LikeFragment view = new LikeFragment(); + view.setArguments(bundle); + return view; + } + + @Nullable + @Override + public View onCreateView( + @NonNull LayoutInflater inflater, + @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + ALog.d(Constant.PROJECT_TAG, "CircleFragment:onCreateView"); + binding = FragmentLikeBinding.inflate(inflater); + type = getArguments().getInt("type"); + albumBean = (AlbumBean) getArguments().getSerializable("bean"); + + return binding.getRoot(); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + + if(albumBean.getLikes()!=null&&albumBean.getLikes().size()>0){ + titles = (ArrayList) albumBean.getLikes(); + LogUtils.i("评论多少条:"+titles.size()); + binding.refreshLayout.setVisibility(View.VISIBLE); + binding.nodianzanLy.setVisibility(View.GONE); + }else{ + titles = new ArrayList<>(); + + binding.refreshLayout.setVisibility(View.GONE); + binding.nodianzanLy.setVisibility(View.VISIBLE); + } + initList(); + initRefreshLayout(); + + binding.nodianzanIv.setOnClickListener(v -> { +// binding.nodianzanLy.setVisibility(View.GONE); +// binding.refreshLayout.setVisibility(View.VISIBLE); +// binding.refreshLayout.autoRefresh(); + + }); + + } + + + + private void initRefreshLayout() { + binding.refreshLayout.setOnRefreshListener(refreshlayout -> { + titles = (ArrayList) albumBean.getLikes(); + binding.refreshLayout.finishRefresh(); + binding.refreshLayout.finishLoadMore(); + + if(albumBean.getLikes()!=null&&albumBean.getLikes().size()>0){ + titles = (ArrayList) albumBean.getLikes(); + LogUtils.i("评论多少条:"+titles.size()); + binding.refreshLayout.setVisibility(View.VISIBLE); + binding.nodianzanLy.setVisibility(View.GONE); + commonAdapter.setDates(titles); + + }else{ + titles = new ArrayList<>(); + + binding.refreshLayout.setVisibility(View.GONE); + binding.nodianzanLy.setVisibility(View.VISIBLE); + } + }); +// binding.refreshLayout.setOnLoadMoreListener(refreshLayout -> { +// List list = initTest(); +// titles.addAll(list); +// commonAdapter.addDates(list); +// binding.refreshLayout.finishRefresh(); +// binding.refreshLayout.finishLoadMore(); +// }); + } + + private void initList() { + RequestOptions requestOptions; + requestOptions = new RequestOptions() + .error(R.mipmap.default_head_img) + .skipMemoryCache(false) + .diskCacheStrategy(DiskCacheStrategy.RESOURCE); + linearLayoutManager = new LinearLayoutManager(getActivity()); + + binding.recyclerview.setLayoutManager(linearLayoutManager); + commonAdapter = new CommonAdapter(getContext(), R.layout.item_like_list, titles) { + @Override + public void convert(ViewHolder holder, LikeBean s, int index) { + holder.setText(R.id.title_tv,s.getUserNickname()); + CircleImageView logo_iv = holder.getView(R.id.logo_iv); + if(!TextUtils.isEmpty(s.getUserAvatar())) { + if (s.getUserAvatar().startsWith("http")) { + Glide.with(getActivity()) + .load(s.getUserAvatar()) + .apply(requestOptions).into(logo_iv); + } else { + LogUtils.i("头像地址:" + String.format(IMUIKitConfig.AVATAR_DOWNLOAD_CONTROLLER_URL_ROOT, s.getUserAvatar())); + Glide.with(getActivity()) + .load(String.format(IMUIKitConfig.AVATAR_DOWNLOAD_CONTROLLER_URL_ROOT, s.getUserAvatar())) + .apply(requestOptions).into(logo_iv); + } + } + +// zuozhe_iv1 + + if(NIMClient.getService(FriendService.class).isMyFriend(s.getUserId()+"")){ + holder.getView(R.id.zuozhe_iv1).setVisibility(View.VISIBLE); + }else{ + holder.getView(R.id.zuozhe_iv1).setVisibility(View.GONE); + + } + } + }; + binding.recyclerview.setAdapter(commonAdapter); + } + + + @Override + public void onResume() { + super.onResume(); + + } + +} diff --git a/app/src/main/java/com/dskj/rbchat/voom/MessageActivity.java b/app/src/main/java/com/dskj/rbchat/voom/MessageActivity.java new file mode 100644 index 0000000..d3f7848 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/voom/MessageActivity.java @@ -0,0 +1,350 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.voom; + + +import android.content.Intent; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.recyclerview.widget.LinearLayoutManager; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.bumptech.glide.request.RequestOptions; +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.databinding.ActivityMessageBinding; +import com.dskj.rbchat.model.AlbumBean; +import com.dskj.rbchat.model.CirPushMessage; +import com.dskj.rbchat.model.DongTaiActionBean; +import com.dskj.rbchat.model.ListBeanResult; +import com.dskj.rbchat.model.MessageBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.Constant; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.widget.CircleImageView; +import com.netease.yunxin.kit.alog.ALog; +import com.netease.yunxin.kit.chatkit.repo.ContactRepo; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.utils.TimeFormatUtils; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.common.ui.widgets.ContactAvatarView; +import com.netease.yunxin.kit.contactkit.ui.utils.ColorUtils; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.model.FriendInfo; +import com.netease.yunxin.kit.corekit.im.utils.RouterConstant; +import com.netease.yunxin.kit.corekit.route.XKitRouter; + +import java.util.ArrayList; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +/** + * Welcome Page is launch page + */ +public class MessageActivity extends BaseActivity { + + private static final String TAG = "MessageActivity"; + private ActivityMessageBinding binding; + LinearLayoutManager linearLayoutManager; + private ArrayList titles = new ArrayList<>(); + + private CommonAdapter commonAdapter; + int page = 1; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getWindow().setStatusBarColor(getResources().getColor(R.color.color_fffbfb)); + getWindow().setNavigationBarColor(getResources().getColor(R.color.color_fffbfb)); + + ALog.d(Constant.PROJECT_TAG, TAG, "onCreateView"); + IMApplication.setColdStart(true); + binding = ActivityMessageBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + + binding.aboutTitleBar.setOnBackIconClickListener(v -> onBackPressed()); + initList(); + initRefreshLayout(); + String name = DataUtils.get(MessageActivity.this, "message_list_" + IMKitClient.account(), GsonUtils.beanToJSONString(titles)); + if (TextUtils.isEmpty(name)) { + binding.refreshLayout.autoRefresh(); + } else { + titles = (ArrayList) GsonUtils.getListFromJSON(name, MessageBean.class); + if (titles != null && titles.size() > 0) { + commonAdapter.setDates(titles); + getNotifies(); + } else { + binding.refreshLayout.autoRefresh(); + } + } + + } + + + private void initRefreshLayout() { + binding.refreshLayout.setOnRefreshListener(refreshlayout -> { + page = 1; + binding.refreshLayout.setVisibility(View.VISIBLE); + binding.nodateLy.setVisibility(View.GONE); + binding.refreshLayout.setEnableLoadMore(true); + getNotifies(); + + }); + binding.refreshLayout.setOnLoadMoreListener(refreshLayout -> { + page += 1; + getNotifies(); + + }); + } + + @Override + protected void onResume() { + super.onResume(); + commonAdapter.notifyDataSetChanged(); + } + + private void initList() { + RequestOptions requestOptions; + requestOptions = new RequestOptions() + .centerCrop() + .error(R.mipmap.ic_launcher) + .skipMemoryCache(false) + .diskCacheStrategy(DiskCacheStrategy.RESOURCE); + linearLayoutManager = new LinearLayoutManager(MessageActivity.this); + + binding.recyclerview.setLayoutManager(linearLayoutManager); + commonAdapter = new CommonAdapter(MessageActivity.this, R.layout.item_message_list, titles) { + @Override + public void convert(ViewHolder holder, MessageBean ss, int index) { + CircleImageView dongtaiPortrait = holder.getView(R.id.item_head_civ); + LinearLayout big_item = holder.getView(R.id.big_item); + big_item.setVisibility(View.VISIBLE); + if (ss.getHistoryType() >= 20) { + big_item.setVisibility(View.GONE); + + dongtaiPortrait.setImageResource(R.mipmap.xitongtongzhi_img); + holder.setText(R.id.item_title_tv,getString(R.string.xitongtongzhi_txt)); + holder.setText(R.id.item_time_tv, ss.getHistoryTime()); + if (!TextUtils.isEmpty(ss.getHistoryTime())) { + holder.setText(R.id.item_time_tv, TimeFormatUtils.formatMillisecond(MessageActivity.this, DataUtils.dateToStamp(ss.getHistoryTime()))); + } + DongTaiActionBean dongTaiActionBean = GsonUtils.getObjFromJSON(ss.getHistoryContent(), DongTaiActionBean.class); + if(dongTaiActionBean!=null){ + holder.setText(R.id.conent_tv, dongTaiActionBean.getContent()); + holder.setText(R.id.item_title_tv,dongTaiActionBean.getTitle()); + + } + + } else { + CirPushMessage s = GsonUtils.getObjFromJSON(ss.getHistoryContent(), CirPushMessage.class); + + + if (s.getMessageType() == null) { + s.setMessageType(16); + } + if (s.getMessageType() == 16) { +// holder.getView(R.id.zan_iv).setVisibility(View.VISIBLE); + holder.setText(R.id.conent_tv, getString(R.string.zlnddt_txt)); + if (s.getIsOtherReply() != null && s.getIsOtherReply()) { + holder.setText(R.id.conent_tv, s.getReplyUserNickname() + getString(R.string.zlnddt_txt)); + } + + } else { +// holder.getView(R.id.zan_iv).setVisibility(View.GONE); + if (s.getMessageType() == 17) { + holder.setText(R.id.conent_tv, getString(R.string.plln_txt) + s.getText()); + } else { + if (s.getIsOtherReply() != null && s.getIsOtherReply()) { + holder.setText(R.id.conent_tv, getString(R.string.huifule_txt) + s.getReplyUserNickname() + ":" + s.getText()); + } else { + holder.setText(R.id.conent_tv, getString(R.string.huifuleni_txt) + s.getText()); + } + } + } + + + CircleImageView bigIv = holder.getView(R.id.big_iv); + TextView textView = holder.getView(R.id.text_tv); + Glide.with(MessageActivity.this) + .load(s.getUserAvatar()+"") + .error(R.mipmap.default_head_img) + .placeholder(R.mipmap.default_head_img) + .into(dongtaiPortrait); + AlbumBean albumBean = s.getPost(); + String name = s.getUserNickname(); + FriendInfo friendInfo = ContactRepo.getFriend(String.valueOf(s.getUserId())); + if (friendInfo!=null&&!TextUtils.isEmpty(friendInfo.getAlias())) { + name = friendInfo.getAlias(); + } + holder.setText(R.id.item_title_tv, name); + holder.setText(R.id.item_time_tv, s.getCreateTime()); + + if (!TextUtils.isEmpty(s.getCreateTimestamp())) { + holder.setText(R.id.item_time_tv, TimeFormatUtils.formatMillisecond(MessageActivity.this, Long.parseLong(s.getCreateTimestamp()))); + } +// LogUtils.i("图片地址:"+ApiService.URL1+albumBean.getPicture1()); +// long timeDa = DataUtils.dateToStamp(ss.getHistoryContent()); + + if (albumBean != null) { + if (!TextUtils.isEmpty(albumBean.getVideo()) || !TextUtils.isEmpty(albumBean.getPicture1())) { + bigIv.setVisibility(View.VISIBLE); + if (!TextUtils.isEmpty(albumBean.getVideo())) { + String url = albumBean.getVideo(); +// if (System.currentTimeMillis() - timeDa < IMUIKitConfig.MOMENTS_SOURCE_TIME) { + url = url.replace("video_output", "video_input") + "?x-oss-process=video/snapshot,t_7000,w_300,h_400,f_jpg,m_fast"; +// } else { +// url = url.replace("video_input", "video_output") + "?x-oss-process=video/snapshot,t_7000,w_300,h_400,f_jpg,m_fast"; +// } + Glide.with(MessageActivity.this) + .load(url) + .into(bigIv); + } else { +// holder.getView(R.id.video_iv).setVisibility(View.GONE); +// if (System.currentTimeMillis() - timeDa < IMUIKitConfig.MOMENTS_SOURCE_TIME) { + Glide.with(MessageActivity.this) + .load(albumBean.getPicture1().replace("/pic_output/", "/pic_input/")) + .apply(requestOptions).into(bigIv); +// } else { +// Glide.with(MessageActivity.this) +// .load(albumBean.getPicture1().replace("/pic_input/", "/pic_output/")) +// .apply(requestOptions).into(bigIv); +// } + } + } else { + bigIv.setVisibility(View.GONE); + } + + if (TextUtils.isEmpty(albumBean.getText())) { +// textView.setText(Html.fromHtml(""+s.getPostUserNickname()+":"+getString(R.string.post_updates_txt))); + textView.setText("" + getString(R.string.post_updates_txt)); + + } else { +// textView.setText(Html.fromHtml(""+s.getPostUserNickname()+":"+albumBean.getText())); + textView.setText("" + albumBean.getText()); + + } + holder.getView(R.id.big_item).setOnClickListener(v -> getPostInfo(albumBean)); + + } + dongtaiPortrait.setOnClickListener(v -> { +// QueryFriendInfo.gotoWatchUserInfoGroup(self(), s.getUserId() + "", null); + LogUtils.i("数据是啥:"+GsonUtils.beanToJSONString(ss)); + XKitRouter.withKey(RouterConstant.PATH_USER_INFO_PAGE) + .withContext(MessageActivity.this) + .withParam(RouterConstant.KEY_ACCOUNT_ID_KEY, s.getUserId() + "") + .withParam("userId", s.getUserId() + "") + .navigate(); + }); + } + } + }; + binding.recyclerview.setAdapter(commonAdapter); + } + + private void getPostInfo(AlbumBean albumBean) { + Api.getInstance().postsInfo(albumBean.getPostId()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + AlbumBean albumBean = feedbackResp.data; + Intent intent = new Intent(MessageActivity.this, TiktoInfokActivity.class); + intent.putExtra("bean", albumBean); + startActivity(intent); + + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast(msg); + + } + }); + } + + + private void getNotifies() { + String time = DataUtils.getCurrentTimeType(IMUIKitConfig.VOOM_MESSAGE_START_TIME); + Api.getInstance().notifies(IMKitClient.account(), page, 30, time) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result> feedbackResp) { + DataUtils.set(MessageActivity.this, "voom_message_time_" + IMKitClient.account(), System.currentTimeMillis()); + changeDate(feedbackResp.data); + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); +// WidgetUtils.showToast(getActivity(), msg, WidgetUtils.ToastType.ERROR); + LogUtils.i("获取到的错误:" + code + "" + msg); + binding.refreshLayout.finishRefresh(); + binding.refreshLayout.finishLoadMore(); + changeView(false); + } + }); + } + + private void changeDate(ListBeanResult data) { + if (data.getList() != null) { + if (page == 1) { + titles = (ArrayList) data.getList(); + commonAdapter.setDates(titles); + DataUtils.set(MessageActivity.this, "message_list_" + IMKitClient.account(), GsonUtils.beanToJSONString(titles)); + } else { + commonAdapter.addDates(data.getList()); + titles = (ArrayList) commonAdapter.getDates(); + } + + } + binding.refreshLayout.finishRefresh(); + binding.refreshLayout.finishLoadMore(); + if (titles.size() == data.getTotal()) { + binding.refreshLayout.finishLoadMoreWithNoMoreData(); + } + changeView(true); + } + + + private void changeView(boolean isNodate) { + if (titles == null || (titles.size() == 0)) { + binding.nodateLy.setVisibility(View.VISIBLE); + binding.refreshLayout.setVisibility(View.GONE); + if (isNodate) { + binding.nodateTv.setText(getString(R.string.nodate_txt)); + binding.nodateIv.setImageResource(R.mipmap.pyq_nodate); + } else { + binding.nodateTv.setText(getString(R.string.net_error_txt)); + binding.nodateIv.setImageResource(R.mipmap.pyq_nodate); + + } + + } else { + binding.refreshLayout.setVisibility(View.VISIBLE); + binding.nodateLy.setVisibility(View.GONE); + } + binding.nodateLy.setOnClickListener(view -> { + binding.refreshLayout.autoRefresh(); + }); + } + + +} diff --git a/app/src/main/java/com/dskj/rbchat/voom/PushActivity.java b/app/src/main/java/com/dskj/rbchat/voom/PushActivity.java new file mode 100644 index 0000000..1c8b675 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/voom/PushActivity.java @@ -0,0 +1,754 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.voom; + + +import android.Manifest; +import android.app.Activity; +import android.content.Intent; +import android.graphics.Color; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.util.TypedValue; +import android.view.MotionEvent; +import android.view.View; +import android.view.inputmethod.InputMethodManager; +import android.widget.Toast; + +import androidx.activity.result.ActivityResult; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.ItemTouchHelper; + +import com.alibaba.sdk.android.oss.ClientException; +import com.alibaba.sdk.android.oss.OSSClient; +import com.alibaba.sdk.android.oss.ServiceException; +import com.alibaba.sdk.android.oss.callback.OSSCompletedCallback; +import com.alibaba.sdk.android.oss.common.auth.OSSCredentialProvider; +import com.alibaba.sdk.android.oss.common.auth.OSSStsTokenCredentialProvider; +import com.alibaba.sdk.android.oss.model.PutObjectRequest; +import com.alibaba.sdk.android.oss.model.PutObjectResult; +import com.bumptech.glide.Glide; +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.databinding.ActivityPushBinding; +import com.dskj.rbchat.dialog.SelectPushTypeDialog; +import com.dskj.rbchat.model.StsCredentialsBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.Constant; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.ItemDragTouchHelperCallback; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.widget.CircleImageView; +import com.luck.picture.lib.basic.PictureSelector; +import com.luck.picture.lib.config.SelectMimeType; +import com.luck.picture.lib.entity.LocalMedia; +import com.luck.picture.lib.interfaces.OnResultCallbackListener; +import com.luck.picture.lib.style.BottomNavBarStyle; +import com.luck.picture.lib.style.PictureSelectorStyle; +import com.luck.picture.lib.style.SelectMainStyle; +import com.luck.picture.lib.style.TitleBarStyle; +import com.netease.yunxin.kit.alog.ALog; +import com.netease.yunxin.kit.chatkit.map.ChatLocationBean; +import com.netease.yunxin.kit.chatkit.ui.common.ChatDataUtils; +import com.netease.yunxin.kit.chatkit.ui.common.ChatUtils; +import com.netease.yunxin.kit.chatkit.ui.common.GlideEngine; +import com.netease.yunxin.kit.chatkit.ui.common.RxBus; +import com.netease.yunxin.kit.chatkit.ui.dialog.PermissionExplainDialog; +import com.netease.yunxin.kit.chatkit.ui.page.LocationPageActivity; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.dialog.LoadingDialog; +import com.netease.yunxin.kit.common.ui.utils.Permission; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.common.utils.PermissionUtils; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.utils.RouterConstant; +import com.netease.yunxin.kit.corekit.route.XKitRouter; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; +import okhttp3.MultipartBody; + +/** + * Welcome Page is launch page + */ +public class PushActivity extends BaseActivity { + + private static final String TAG = "PushActivity"; + private ActivityPushBinding activityWelcomeBinding; + List uris = new ArrayList<>(); + List uriStrings = new ArrayList<>(); + List outputStrings = new ArrayList<>(); + protected ActivityResultLauncher permissionLauncher; + protected ActivityResultLauncher locationLauncher; + ChatLocationBean locationBean; + CommonAdapter commonAdapter; + private int pushType = 0; + boolean isPush = false; + public LoadingDialog loadingDialog; + List localMedias = new ArrayList<>(); + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getWindow().setStatusBarColor(getResources().getColor(R.color.color_white)); + getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white)); + + ALog.d(Constant.PROJECT_TAG, TAG, "onCreateView"); + IMApplication.setColdStart(true); + activityWelcomeBinding = ActivityPushBinding.inflate(getLayoutInflater()); + setContentView(activityWelcomeBinding.getRoot()); + initAdapter(); + permissionLauncher = + registerForActivityResult( + new ActivityResultContracts.RequestMultiplePermissions(), + result -> { + if (result != null) { + for (Map.Entry entry : result.entrySet()) { + String permission = entry.getKey().toString(); + boolean grant = (Boolean) entry.getValue(); + if (grant) { + if (TextUtils.equals( + permission, Manifest.permission.READ_EXTERNAL_STORAGE) || TextUtils.equals( + permission, Manifest.permission.READ_MEDIA_IMAGES) || TextUtils.equals( + permission, Manifest.permission.READ_MEDIA_VIDEO)) { + startPickMedia(); + } + } else { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (shouldShowRequestPermissionRationale(permission)) { + ToastX.showShortToast(getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_deny_tips)); + } else { + ToastX.showShortToast(getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_storage)); + } + } + } + } + } + if (permissionExplainDialog != null) { + permissionExplainDialog.dismiss(); + } + }); + + locationLauncher = + registerForActivityResult( + new ActivityResultContracts.StartActivityForResult(), this::onSelectLocation); + + activityWelcomeBinding.qianmingTv.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) { + changeSumbit(); + } + + @Override + public void afterTextChanged(Editable s) { + + } + }); + + activityWelcomeBinding.addLocLy.setOnClickListener(v -> { + String[] permissions = { + Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION + }; + if (PermissionUtils.hasPermissions(IMKitClient.getApplicationContext(), permissions)) { + + + if(ChatUtils.doesContainGsfPackage(PushActivity.this)&& ChatDataUtils.get(PushActivity.this, "locale", 0)!=1) { + XKitRouter.withKey(RouterConstant.PATH_CHAT_LOCATION_PAGE) + .withContext(PushActivity.this) + .navigate(locationLauncher); + }else{ + XKitRouter.withKey("locationPage") + .withContext(PushActivity.this) + .navigate(locationLauncher); + } + + } else { + permissionExplainDialog = new PermissionExplainDialog(this, getResources().getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_location_title), getResources().getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_location_content)); + permissionExplainDialog.show(); + Permission.requirePermissions(IMKitClient.getApplicationContext(), permissions) + .request( + new Permission.PermissionCallback() { + @Override + public void onGranted(List permissionsGranted) { + permissionExplainDialog.dismiss(); + if(ChatUtils.doesContainGsfPackage(PushActivity.this)&& ChatDataUtils.get(PushActivity.this, "locale", 0)!=1) { + XKitRouter.withKey(RouterConstant.PATH_CHAT_LOCATION_PAGE) + .withContext(PushActivity.this) + .navigate(locationLauncher); + }else{ + XKitRouter.withKey("locationPage") + .withContext(PushActivity.this) + .navigate(locationLauncher); + } + } + + @Override + public void onDenial( + List permissionsDenial, List permissionDenialForever) { + permissionExplainDialog.dismiss(); + Toast.makeText(PushActivity.this, com.netease.yunxin.kit.chatkit.ui.R.string.permission_default, Toast.LENGTH_SHORT) + .show(); + } + + @Override + public void onException(Exception exception) { + permissionExplainDialog.dismiss(); + Toast.makeText(PushActivity.this, com.netease.yunxin.kit.chatkit.ui.R.string.permission_default, Toast.LENGTH_SHORT) + .show(); + } + }); + } + + }); + + activityWelcomeBinding.backIv.setOnClickListener(v -> onBackPressed()); + activityWelcomeBinding.userTypeTv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + SelectPushTypeDialog selectPushTypeDialog = new SelectPushTypeDialog(PushActivity.this, pushType); + selectPushTypeDialog.setOnToVipListener(new SelectPushTypeDialog.OnToTypeListener() { + @Override + public void toType(int type) { + changTopType(type); + } + }); + selectPushTypeDialog.show(); + } + }); + activityWelcomeBinding.pushBt.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + sumbit(); + } + }); + } + + private void sumbit() { + if (TextUtils.isEmpty(activityWelcomeBinding.qianmingTv.getText().toString())) { + ToastX.showShortToast(R.string.fbnrbnwk_txt); + return; + } + if (activityWelcomeBinding.qianmingTv.getText().toString().trim().length() < 5) { + ToastX.showShortToast(getString(R.string.wabnsywgzf_txt)); + return; + } + + if (uris.size() == 0) { + ToastX.showShortToast(getString(R.string.qxsctphyp_txt)); + return; + } + + if (isPush) { + return; + } + + isPush = true; + toShangchuanAli(); + + } + + + StsCredentialsBean stsCredentialsBean; + + private void toShangchuanAli() { + showLoadingDialog(); + Api.getInstance().stsCredentials() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + stsCredentialsBean = feedbackResp.data; + toAliYunOss(); + } + + @Override + public void onError(int code, String msg) { + dimessLoadingDialog(); + } + }); + } + + private void toAliYunOss() { + String endpoint = "https://oss-cn-hongkong.aliyuncs.com"; + String accessKeyId = stsCredentialsBean.getAccessKeyId(); + String accessKeySecret = stsCredentialsBean.getAccessKeySecret(); + String securityToken = stsCredentialsBean.getSecurityToken(); + String bucketName = IMUIKitConfig.bucketName; + + OSSCredentialProvider credentialProvider = new OSSStsTokenCredentialProvider(accessKeyId, accessKeySecret, securityToken); + OSSClient oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider); + toUpdateOss(bucketName, 0, oss); + + } + + // + private void toUpdateOss(String bucketName, int i, OSSClient oss) { + String updatePathPic = "pic_input"; + String updatePathVideo = "video_input"; +// String outputPathPic = "pic_output"; +// String outputPathVideo = "video_output"; + String outputPathPic = "pic_input"; + String outputPathVideo = "video_input"; +// Calendar calendar= Calendar.getInstance(); +// String year = calendar.get(Calendar.YEAR)+""; +// String month = (calendar.get(Calendar.MONTH)+1)<10?"0"+(calendar.get(Calendar.MONTH)+1):(calendar.get(Calendar.MONTH)+1)+""; +// String d = calendar.get(Calendar.DATE)<10?"0"+calendar.get(Calendar.DAY_OF_MONTH):calendar.get(Calendar.DAY_OF_MONTH)+""; + + String data = DataUtils.getCurrentTimeTypeNoline(System.currentTimeMillis()); + if (i < uris.size()) { + +// File file = new File(uriStrings.get(i)); + String fileName = System.currentTimeMillis() + "_" + localMedias.get(i).getFileName(); + LogUtils.i("上传文件是啥:" + GsonUtils.beanToJSONString(localMedias.get(i))); + LogUtils.i("上传文件是啥:" + fileName); + + // 构造上传请求。 + PutObjectRequest put = new PutObjectRequest(bucketName, "media/" + updatePathPic + "/" + data + "/" + fileName, localMedias.get(i).getRealPath()); + + if (localMedias.get(0).getMimeType().contains("video")) { + put = new PutObjectRequest(bucketName, "media/" + updatePathVideo + "/" + data + "/" + fileName, localMedias.get(i).getRealPath()); + } + + put.setProgressCallback((request, currentSize, totalSize) -> { + LogUtils.i("PutObject", "currentSize: " + currentSize + " totalSize: " + totalSize); +// if(isVideo){ +// showLoadingDialog(("正在上传"+(currentSize*100)/totalSize)+"%"); +// } + }); + + //OSSAsyncTask task = + oss.asyncPutObject(put, new OSSCompletedCallback<>() { + @Override + public void onSuccess(PutObjectRequest request, PutObjectResult result) { + LogUtils.i("PutObject", "UploadSuccess"); + LogUtils.i("ETag", result.getETag()); + LogUtils.i("RequestId", result.getRequestId()); + LogUtils.i("获取到的数据:" + GsonUtils.beanToJSONString(result)); + if (localMedias.get(0).getMimeType().contains("video")) { + outputStrings.add(IMUIKitConfig.OSS_URL + "media/" + outputPathVideo + "/" + data + "/" + fileName); + } else { + outputStrings.add(IMUIKitConfig.OSS_URL + "media/" + outputPathPic + "/" + data + "/" + fileName); + } + //https://shenqi777.oss-cn-hongkong.aliyuncs.com/qtalk/pic_output/20230914/null_false53.jpg + if (i == uris.size() - 1) { + toPush(); + } else { + toUpdateOss(bucketName, i + 1, oss); + } + } + + @Override + public void onFailure(PutObjectRequest request, ClientException clientExcepion, ServiceException serviceException) { + dimessLoadingDialog(); + LogUtils.i("ErrorCode", clientExcepion.getMessage()); + + // 请求异常。 + if (clientExcepion != null) { + // 本地异常,如网络异常等。 + clientExcepion.printStackTrace(); + } + if (serviceException != null) { + // 服务异常。 + LogUtils.i("ErrorCode", serviceException.getErrorCode()); + LogUtils.i("RequestId", serviceException.getRequestId()); + LogUtils.i("HostId", serviceException.getHostId()); + LogUtils.i("RawMessage", serviceException.getRawMessage()); + } + } + }); + } + } + + private void toPush() { + LogUtils.i("上传的数据:" + GsonUtils.beanToJSONString(outputStrings)); +// for (int i = 0;i< outputStrings.size();i++) { +// LogUtils.i("上传的数据:" + "https://shenqi777.oss-cn-hongkong.aliyuncs.com/" + outputStrings.get(i)); +// } + + List map = new ArrayList<>(); + + + MultipartBody.Part reportedGroupId = MultipartBody.Part.createFormData("type", localMedias.get(0).getMimeType().contains("video") ? "2" : "1"); + map.add(reportedGroupId); + + MultipartBody.Part explain = MultipartBody.Part.createFormData("visible", pushType + ""); + map.add(explain); + + if (!TextUtils.isEmpty(activityWelcomeBinding.qianmingTv.getText().toString())) { + MultipartBody.Part text = MultipartBody.Part.createFormData("text", activityWelcomeBinding.qianmingTv.getText().toString()); + map.add(text); + } + if (localMedias.get(0).getMimeType().contains("video")) { +// File file = new File(uriStrings.get(0)); +// RequestBody imageBody = RequestBody.create(MediaType.parse("multipart/form-data"), file); +// MultipartBody.Part imageBodyPart = MultipartBody.Part.createFormData("video", file.getName(), imageBody); +// map.add(imageBodyPart); + + MultipartBody.Part text = MultipartBody.Part.createFormData("video", outputStrings.get(0)); + map.add(text); + } else { + uriStrings = commonAdapter.getDates(); + + for (int i = 0; i < uris.size(); i++) { +// File file = new File(uriStrings.get(i)); +// RequestBody imageBody = RequestBody.create(MediaType.parse("multipart/form-data"), file); +// MultipartBody.Part imageBodyPart = MultipartBody.Part.createFormData("picture"+(i+1), file.getName(), imageBody); +// map.add(imageBodyPart); + MultipartBody.Part text = MultipartBody.Part.createFormData("picture" + (i + 1), outputStrings.get(i)); + map.add(text); + } + } + + if (locationBean != null) { + MultipartBody.Part longitude = MultipartBody.Part.createFormData("longitude", locationBean.getLng() + ""); + map.add(longitude); + MultipartBody.Part latitude = MultipartBody.Part.createFormData("latitude", locationBean.getLat() + ""); + map.add(latitude); +// MultipartBody.Part position_name = MultipartBody.Part.createFormData("positionName", locationBean.getCity()); + MultipartBody.Part position_name = MultipartBody.Part.createFormData("positionName", locationBean.getTitle()); + map.add(position_name); +// MultipartBody.Part position_sub_name = MultipartBody.Part.createFormData("positionSubName", locationBean.getAddress()); + MultipartBody.Part position_sub_name = MultipartBody.Part.createFormData("positionSubName", locationBean.getCity()); + map.add(position_sub_name); + } + MultipartBody.Part substationId = MultipartBody.Part.createFormData("substationId", IMUIKitConfig.SUBSTATIONID); + map.add(substationId); + Api.getInstance().CirPost(map) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver() { + @Override + public void onSuccess(Result feedbackResp) { + dimessLoadingDialog(); + isPush = false; + if (feedbackResp.data != null) { + ToastX.showShortToast(R.string.pyqfbcg_txt); + RxBus.getInstance().post(IMUIKitConfig.PUSH_CIR_SUCC); + finish(); + } + } + + @Override + public void onError(int code, String msg) { + isPush = false; + dimessLoadingDialog(); + LogUtils.i("获取到的错误:" + code + "" + msg); + ToastX.showShortToast(msg); + } + }); + } + + + private void changTopType(int type) { + pushType = type; + switch (type) { + case 0: + activityWelcomeBinding.userTypeTv.setText(R.string.all_visible_txt); + break; + case 1: + activityWelcomeBinding.userTypeTv.setText(R.string.friend_visible_txt); + break; + case 2: + activityWelcomeBinding.userTypeTv.setText(R.string.onlyme_visible_txt); + break; + } + } + + + protected void onSelectLocation(ActivityResult result) { + if (result.getResultCode() != Activity.RESULT_OK) { + return; + } + LogUtils.i("send location result"); + Intent data = result.getData(); + if (data != null) { + locationBean = (ChatLocationBean) data.getSerializableExtra(LocationPageActivity.SEND_LOCATION_RESULT); + if (locationBean != null) { +// activityWelcomeBinding.mainWeizhiBt.setText(locationBean.getCity()+locationBean.getAddress()); + activityWelcomeBinding.mainWeizhiBt.setText(locationBean.getTitle()); + } + } + } + + private List getList(List list) { + if (list == null) { + list = new ArrayList<>(); + } + if (list.size() < 9) { + list.add("add"); + } + return list; + } + + private void initAdapter() { + + uriStrings = getList(uriStrings); + + activityWelcomeBinding.recylerview1.setLayoutManager(new GridLayoutManager(this, 3)); + commonAdapter = new CommonAdapter(this, R.layout.item_post_circle, uriStrings) { + @Override + public void convert(ViewHolder holder, String s, int index) { + final String s1 = s; + if (uriStrings.get(index).equals("add")) { + holder.getView(R.id.item_image_iv).setVisibility(View.GONE); + holder.getView(R.id.item_image_iv1).setVisibility(View.VISIBLE); + holder.getView(R.id.colose_iv).setVisibility(View.GONE); + } else { + holder.getView(R.id.item_image_iv).setVisibility(View.VISIBLE); + holder.getView(R.id.item_image_iv1).setVisibility(View.GONE); + holder.getView(R.id.colose_iv).setVisibility(View.VISIBLE); + Glide.with(PushActivity.this).load(uriStrings.get(index)).into((CircleImageView) holder.getView(R.id.item_image_iv)); + } + holder.getView(R.id.item_image_iv1).setOnClickListener(v -> { + if (uriStrings.get(index).equals("add")) { + addPic(); + } else { + //查看图片 + showListImage(uriStrings.subList(0, uris.size()), index); + } + }); + + holder.getView(R.id.item_image_iv).setOnClickListener(v -> { + if (uriStrings.get(index).equals("add")) { + addPic(); + } else { + //查看图片 + int indess = index; + for (int i = 0; i < uris.size(); i++) { + if (uriStrings.get(i).equals(s1)) { + indess = i; + } + } + showListImage(uriStrings.subList(0, uris.size()), indess); + } + }); + holder.getView(R.id.colose_iv).setOnClickListener(v -> { + uris.remove(index); + uriStrings.remove(index); + localMedias.remove(index); + if (uris.size() == 8 || uriStrings.size() == 0) { + uriStrings = getList(uriStrings); + } + changeSumbit(); + setDates(uriStrings); + LogUtils.i("数据123:" + GsonUtils.beanToJSONString(uriStrings)); + + }); + } + }; + activityWelcomeBinding.recylerview1.setAdapter(commonAdapter); + // 适配器添加拖拽回调 + ItemTouchHelper.Callback callback = new ItemDragTouchHelperCallback(commonAdapter); + ItemTouchHelper itemTouchHelper = new ItemTouchHelper(callback); + // 为recyclerView添加拖拽功能 + itemTouchHelper.attachToRecyclerView(activityWelcomeBinding.recylerview1); + + } + + private void addPic() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + if (PermissionUtils.hasPermissions( + PushActivity.this, Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO)) { + startPickMedia(); + } else { + requestCameraPermission(); + } + } else { + if (PermissionUtils.hasPermissions( + PushActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE)) { + startPickMedia(); + } else { + requestCameraPermission( + Manifest.permission.READ_EXTERNAL_STORAGE); + } + } + + } + + private void requestCameraPermission(String permission) { + permissionExplainDialog = new PermissionExplainDialog(this, getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_storage_title), getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_storage_content)); + permissionExplainDialog.show(); + permissionLauncher.launch(new String[]{permission}); + } + + PermissionExplainDialog permissionExplainDialog; + + private void requestCameraPermission() { + permissionExplainDialog = new PermissionExplainDialog(this, getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_storage_title), getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_storage_content)); + permissionExplainDialog.show(); + permissionLauncher.launch(new String[]{Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO}); + } + + protected void startPickMedia() { +// pickMediaLauncher.launch("image/*;video/*"); + + TitleBarStyle whiteTitleBarStyle = new TitleBarStyle(); + whiteTitleBarStyle.setTitleBackgroundColor(ContextCompat.getColor(PushActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_white)); + whiteTitleBarStyle.setTitleDrawableRightResource(com.netease.yunxin.kit.chatkit.ui.R.drawable.ic_orange_arrow_down); + whiteTitleBarStyle.setTitleLeftBackResource(com.netease.yunxin.kit.common.ui.R.drawable.ic_back); + whiteTitleBarStyle.setTitleTextColor(ContextCompat.getColor(PushActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_black)); + whiteTitleBarStyle.setTitleCancelTextColor(ContextCompat.getColor(PushActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_53575e)); + whiteTitleBarStyle.setDisplayTitleBarLine(true); + + BottomNavBarStyle whiteBottomNavBarStyle = new BottomNavBarStyle(); + whiteBottomNavBarStyle.setBottomNarBarBackgroundColor(Color.parseColor("#FFFFFF")); + whiteBottomNavBarStyle.setBottomPreviewSelectTextColor(ContextCompat.getColor(PushActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_53575e)); + + whiteBottomNavBarStyle.setBottomPreviewNormalTextColor(ContextCompat.getColor(PushActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_9b)); + whiteBottomNavBarStyle.setBottomPreviewSelectTextColor(ContextCompat.getColor(PushActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.color_222222)); + whiteBottomNavBarStyle.setCompleteCountTips(false); + whiteBottomNavBarStyle.setBottomEditorTextColor(ContextCompat.getColor(PushActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_53575e)); + whiteBottomNavBarStyle.setBottomOriginalTextColor(ContextCompat.getColor(PushActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_53575e)); + + SelectMainStyle selectMainStyle = new SelectMainStyle(); + selectMainStyle.setStatusBarColor(ContextCompat.getColor(PushActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_white)); + selectMainStyle.setDarkStatusBarBlack(true); + selectMainStyle.setSelectNormalTextColor(ContextCompat.getColor(PushActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_9b)); + selectMainStyle.setSelectTextColor(ContextCompat.getColor(PushActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.color_222222)); + selectMainStyle.setPreviewSelectBackground(com.netease.yunxin.kit.chatkit.ui.R.drawable.ps_demo_white_preview_selector); + selectMainStyle.setSelectBackground(com.netease.yunxin.kit.chatkit.ui.R.drawable.ps_checkbox_selector); +// selectMainStyle.setSelectText(R.string.ps_done_front_num); + selectMainStyle.setMainListBackgroundColor(ContextCompat.getColor(PushActivity.this, com.netease.yunxin.kit.chatkit.ui.R.color.ps_color_white)); + PictureSelectorStyle selectorStyle = new PictureSelectorStyle(); + selectorStyle.setTitleBarStyle(whiteTitleBarStyle); + selectorStyle.setBottomBarStyle(whiteBottomNavBarStyle); + selectorStyle.setSelectMainStyle(selectMainStyle); + + + PictureSelector.create(this) + .openGallery(SelectMimeType.ofAll()) + .setImageEngine(GlideEngine.createGlideEngine()) + .setMaxSelectNum(9 - localMedias.size()) +// .setMaxVideoSelectNum(9) + .setSelectorUIStyle(selectorStyle) + .forResult(new OnResultCallbackListener<>() { + @Override + public void onResult(ArrayList result) { + + if (uriStrings.size() > 1) { + uriStrings.remove(uriStrings.size() - 1); +// uriStrings.addAll(Matisse.obtainPathResult(data)); +// uris.addAll(Matisse.obtainResult(data)); + localMedias.addAll(result); + for (int i = 0; i < result.size(); ++i) { + Uri uri = Uri.parse(result.get(i).getAvailablePath()); + uris.add(uri); + uriStrings.add(result.get(i).getAvailablePath()); + } + } else { + uris.clear(); + uriStrings.clear(); + localMedias = result; + for (int i = 0; i < result.size(); ++i) { + Uri uri = Uri.parse(result.get(i).getAvailablePath()); + uris.add(uri); + uriStrings.add(result.get(i).getAvailablePath()); + } + } + + getList(uriStrings); + + commonAdapter.setDates(uriStrings); + changeSumbit(); + + } + + @Override + public void onCancel() { + + } + }); + + } + + + private void changeSumbit() { + if ((!TextUtils.isEmpty(activityWelcomeBinding.qianmingTv.getText().toString().trim()) + && activityWelcomeBinding.qianmingTv.getText().toString().trim().length() >= 5) + && uris.size() > 0) { + changeRight(true); + } else { + changeRight(false); + } + activityWelcomeBinding.contentNumberTv.setText(activityWelcomeBinding.qianmingTv.getText().toString().trim().length() + "/200"); + } + + + private void changeRight(boolean b) { + if (b) { + activityWelcomeBinding.pushBt.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12); // 12sp + activityWelcomeBinding.pushBt.setTextColor(getResources().getColor(R.color.color_white)); + activityWelcomeBinding.pushBt.setVisibility(View.VISIBLE); + activityWelcomeBinding.pushBt.setBackgroundResource(R.drawable.button_true_bg); + } else { + activityWelcomeBinding.pushBt.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12); // 12sp + activityWelcomeBinding.pushBt.setTextColor(getResources().getColor(R.color.color_999999)); + activityWelcomeBinding.pushBt.setVisibility(View.VISIBLE); + activityWelcomeBinding.pushBt.setBackgroundResource(R.drawable.button_false_bg); + } + } + + + public void showListImage(List urls, int index) { + + } + + + public void showLoadingDialog() { + if (loadingDialog == null) + loadingDialog = new LoadingDialog(this); + loadingDialog.show(); + } + + public void showLoadingDialog(String msg) { + if (loadingDialog == null) + loadingDialog = new LoadingDialog(this); + loadingDialog.setLoadingText(msg); + loadingDialog.show(); + } + + + public void dimessLoadingDialog() { + if (loadingDialog != null) { + loadingDialog.dismiss(); + } + + } + public boolean onTouchEvent(MotionEvent event) { + if(null != this.getCurrentFocus()){ + /** + * 点击空白位置 隐藏软键盘 + */ + InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + return mInputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0); + } + return super .onTouchEvent(event); + } + +} diff --git a/app/src/main/java/com/dskj/rbchat/voom/TiktoInfokActivity.java b/app/src/main/java/com/dskj/rbchat/voom/TiktoInfokActivity.java new file mode 100644 index 0000000..616f12c --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/voom/TiktoInfokActivity.java @@ -0,0 +1,1099 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.voom; + +import android.Manifest; +import android.content.DialogInterface; +import android.content.Intent; +import android.graphics.drawable.Drawable; +import android.media.MediaPlayer; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewTreeObserver; +import android.view.inputmethod.InputMethodManager; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.SeekBar; +import android.widget.TextView; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.viewpager2.adapter.FragmentStateAdapter; +import androidx.viewpager2.widget.ViewPager2; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.bumptech.glide.request.RequestOptions; +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.contact.ReportActivity; +import com.dskj.rbchat.contact.UserInfoActivity; +import com.dskj.rbchat.databinding.ActivityTiktokinfoBinding; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.model.AlbumBean; +import com.dskj.rbchat.model.RxCommLikeBean; +import com.dskj.rbchat.model.UserShareBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.ApiService; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.AdaptScreenUtils; +import com.dskj.rbchat.utils.Constant; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.utils.ShareDateUtils; +import com.google.android.material.bottomsheet.BottomSheetDialog; +import com.google.android.material.tabs.TabLayout; +import com.google.android.material.tabs.TabLayoutMediator; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.msg.MessageBuilder; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.nimlib.sdk.msg.model.IMMessage; +import com.netease.nimlib.sdk.uinfo.UserService; +import com.netease.nimlib.sdk.uinfo.model.NimUserInfo; +import com.netease.yunxin.kit.alog.ALog; +import com.netease.yunxin.kit.chatkit.repo.ChatRepo; +import com.netease.yunxin.kit.chatkit.ui.common.RxBus; +import com.netease.yunxin.kit.chatkit.ui.custom.StickerAttachment; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.utils.AvatarColor; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.common.ui.widgets.ContactAvatarView; +import com.netease.yunxin.kit.common.utils.PermissionUtils; +import com.netease.yunxin.kit.contactkit.ui.utils.ColorUtils; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.model.FriendInfo; +import com.netease.yunxin.kit.corekit.im.provider.FetchCallback; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Timer; +import java.util.TimerTask; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; +import rx.Subscription; + +/** + * Welcome Page is launch page + */ +public class TiktoInfokActivity extends BaseActivity { + + private static final String TAG = "TiktokActivity"; + private ActivityTiktokinfoBinding binding; + private ShareDateUtils shareDateUtils; + private AlbumBean albumBean; + RequestOptions requestOptions; + private Subscription mEventSubscription; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getWindow().setStatusBarColor(getResources().getColor(R.color.color_white)); + getWindow().setNavigationBarColor(getResources().getColor(R.color.black)); + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); + + ALog.d(Constant.PROJECT_TAG, TAG, "onCreateView"); + IMApplication.setColdStart(true); + binding = ActivityTiktokinfoBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + albumBean = (AlbumBean) getIntent().getSerializableExtra("bean"); + requestOptions = new RequestOptions() + .error(R.mipmap.default_head_img) + .skipMemoryCache(false) + .diskCacheStrategy(DiskCacheStrategy.RESOURCE); + initView(); + initListener(); + shareDateUtils = new ShareDateUtils(); + shareDateUtils.getAllSessionList(); + + mEventSubscription = RxBus.getInstance().toObservable(AlbumBean.class) + .subscribeOn(rx.schedulers.Schedulers.io()) + .unsubscribeOn(rx.schedulers.Schedulers.io()) + .subscribe(changeImageViewBean -> {//回顶部 + if (changeImageViewBean.getPostId().equals(albumBean.getPostId())) { + albumBean = changeImageViewBean; + if(albumBean.getLikes()==null||albumBean.getLikes().size()==0){ + binding.tiktok.itemLikeTv.setText(R.string.dianzan_txt); + }else{ + binding.tiktok.itemLikeTv.setText(albumBean.getLikes().size()+""); + } + if(albumBean.getComments()==null||albumBean.getComments().size()==0){ + binding.tiktok.itemCommentTv.setText(R.string.pinglun_txt11); + }else{ + binding.tiktok.itemCommentTv.setText(albumBean.getComments().size()+""); + } + Drawable drawable = binding.tiktok.itemLikeTv.getResources().getDrawable(R.mipmap.heart_icon); + if(isZan(albumBean)){ + drawable = binding.tiktok.itemLikeTv.getResources().getDrawable(R.mipmap.heart_icon_t); + } + drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); + binding.tiktok.itemLikeTv.setCompoundDrawables(null, drawable, null, null); + } + }); + } + + //初始化监听 + private void initListener() { + binding.backIv.setOnClickListener(v -> onBackPressed()); + } + + //初始化View + private void initView() { + binding.tiktok.mTitle.setText("@"+albumBean.getUserNickname()); + binding.tiktok.mTitle1.setText(albumBean.getText()); + if(albumBean.getLikes()==null||albumBean.getLikes().size()==0){ + binding.tiktok.itemLikeTv.setText("0"); + }else{ + binding.tiktok.itemLikeTv.setText(albumBean.getLikes().size()+""); + } + + if(String.valueOf(albumBean.getUserId()).equals(IMKitClient.account())){ + binding.tiktok.itemMoreTv.setVisibility(View.VISIBLE); + }else{ + binding.tiktok.itemMoreTv.setVisibility(View.VISIBLE); + } + + Drawable drawable = binding.tiktok.itemLikeTv.getResources().getDrawable(R.mipmap.heart_icon); + if(isZan(albumBean)){ + drawable = binding.tiktok.itemLikeTv.getResources().getDrawable(R.mipmap.heart_icon_t); + } + drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); + binding.tiktok.itemLikeTv.setCompoundDrawables(null, drawable, null, null); + + if(albumBean.getComments()==null||albumBean.getComments().size()==0){ + binding.tiktok.itemCommentTv.setText("0"); + }else{ + binding.tiktok.itemCommentTv.setText(albumBean.getComments().size()+""); + } + + if(!TextUtils.isEmpty(albumBean.getPositionName())){ + binding.tiktok.locTv.setText(albumBean.getPositionName()); + binding.tiktok.locTv.setVisibility(View.VISIBLE); + }else{ + binding.tiktok.locTv.setVisibility(View.GONE); + } + + if(!TextUtils.isEmpty(albumBean.getUserAvatar())) { + if (albumBean.getUserAvatar().startsWith("http")) { + Glide.with(TiktoInfokActivity.this) + .load(albumBean.getUserAvatar()) + .apply(requestOptions).into(binding.tiktok.itemHeadCiv); + } else { + LogUtils.i("头像地址:" + String.format(IMUIKitConfig.AVATAR_DOWNLOAD_CONTROLLER_URL_ROOT, albumBean.getUserAvatar())); + Glide.with(TiktoInfokActivity.this) + .load( IMUIKitConfig.OSS_URL + albumBean.getUserAvatar()) + .apply(requestOptions).into(binding.tiktok.itemHeadCiv); + } + } + + binding.tiktok.mTitle1.setMaxLines(100); + binding.tiktok.mTitle1.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { + @Override + public boolean onPreDraw() { + //这个回调会调用多次,获取完行数记得注销监听 + binding.tiktok.mTitle1.getViewTreeObserver().removeOnPreDrawListener(this); + LogUtils.i("行数:"+ binding.tiktok.mTitle1.getLineCount()); + if( binding.tiktok.mTitle1.getLineCount()>2){ + LogUtils.i("行数:"+ binding.tiktok.mTitle2.getText().toString()+";"+getString(R.string.full_text_txt)); + + if( binding.tiktok.mTitle2.getText().toString().equals(getString(R.string.full_text_txt))) { + binding.tiktok.mTitle1.setMaxLines(2); + }else{ + binding.tiktok.mTitle1.setMaxLines(100); + LogUtils.i("行数2:"+ binding.tiktok.mTitle1.getLineCount()); + + } + binding.tiktok.mTitle2.setVisibility(View.VISIBLE); + }else{ + binding.tiktok.mTitle2.setVisibility(View.GONE); + } + return false; + } + }); + binding.tiktok.mTitle2.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if( binding.tiktok.mTitle2.getText().equals(getString(R.string.full_text_txt))){ + binding.tiktok.mTitle1.setMaxLines(100); + binding.tiktok.mTitle2.setText(R.string.shouqi_txt); + }else{ + binding.tiktok.mTitle1.setMaxLines(2); + binding.tiktok.mTitle2.setText(getString(R.string.full_text_txt)); + } + } + }); + + + if(albumBean.getType()==2) { + binding.tiktok.progress.setVisibility(View.VISIBLE); + binding.tiktok.mThumb.setVisibility(View.GONE); + binding.tiktok.mVideoView.setVisibility(View.VISIBLE); + binding.tiktok.showPicRy.setVisibility(View.GONE); +// holder.mThumb.setImageResource(imgs[pos % 2]); + String url = albumBean.getVideo(); +// String picUrl = ""; + if(!TextUtils.isEmpty(url)) { +// if (!albumBean.getVideo().startsWith("http")) { +// url = ApiService.URL + albumBean.getVideo(); +//// picUrl = url; +// } else { +//// picUrl = url.replace("video_output", "video_input") + "?x-oss-process=video/snapshot,t_7000,w_300,h_400,f_jpg,m_fast"; +//// url = url.replace("video_input", "video_output"); +// } + url = url.replace("/video_output/", "/video_input/"); + + LogUtils.i("播放地址是啥:"+url); + binding.tiktok.mVideoView.setVideoURI(Uri.parse(url)); + } + }else{ + binding.tiktok.mThumb.setVisibility(View.GONE); + binding.tiktok.mVideoView.setVisibility(View.GONE); + binding.tiktok.showPicRy.setVisibility(View.VISIBLE); + binding.tiktok.progress.setVisibility(View.GONE); + + initAdapterPic(albumBean); + } + + binding.tiktok.itemHeadCiv.setOnClickListener(v -> toUserHead()); + binding.tiktok.itemLikeTv.setOnClickListener(v -> toLike()); + binding.tiktok.itemCommentTv.setOnClickListener(v -> toComment()); + binding.tiktok.itemShareTv.setOnClickListener(v -> { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + if (PermissionUtils.hasPermissions( + TiktoInfokActivity.this, Manifest.permission.READ_MEDIA_IMAGES,Manifest.permission.READ_MEDIA_VIDEO)) { + toShare(); + } else { + requestCameraPermission( + ); + } + } else { + if (PermissionUtils.hasPermissions( + TiktoInfokActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE)) { + toShare(); + } else { + requestCameraPermission( + Manifest.permission.READ_EXTERNAL_STORAGE); + } + } + }); + + binding.tiktok.itemMoreTv.setOnClickListener(v -> toMoreAction()); + } + + + + private void requestCameraPermission(String permission) { + permissionLauncher.launch(new String[]{permission}); + } + protected ActivityResultLauncher permissionLauncher; + private void requestCameraPermission() { + permissionLauncher.launch(new String[]{Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO}); + } + + + @Override + protected void onResume() { + super.onResume(); + if(albumBean.getType()==2) { + playVideo(); + } + } + + private ArrayList titles; + private ArrayList titles1; + + private List listFragment; + private void initAdapterPic(AlbumBean dongtaiBean) { + + titles = new ArrayList<>(); + + long timeDa = DataUtils.dateToStamp(dongtaiBean.getCreateTime()); + + if(!TextUtils.isEmpty(dongtaiBean.getPicture1())){ + if(dongtaiBean.getPicture1().startsWith("http")){ +// if(System.currentTimeMillis()-timeDa< IMUIKitConfig.MOMENTS_SOURCE_TIME) { + titles.add(dongtaiBean.getPicture1().replace("/pic_output/","/pic_input/")); +// }else{ +// titles.add(dongtaiBean.getPicture1().replace("/pic_input/","/pic_output/")); +// } + }else { + titles.add(ApiService.URL + dongtaiBean.getPicture1()); + } + } + if(!TextUtils.isEmpty(dongtaiBean.getPicture2())){ + if(dongtaiBean.getPicture2().startsWith("http")){ +// if(System.currentTimeMillis()-timeDa< IMUIKitConfig.MOMENTS_SOURCE_TIME) { + titles.add(dongtaiBean.getPicture2().replace("/pic_output/","/pic_input/")); +// }else{ +// titles.add(dongtaiBean.getPicture2().replace("/pic_input/","/pic_output/")); +// } + }else { + titles.add(ApiService.URL + dongtaiBean.getPicture2()); + } + } + + if(!TextUtils.isEmpty(dongtaiBean.getPicture3())){ + if(dongtaiBean.getPicture3().startsWith("http")){ +// if(System.currentTimeMillis()-timeDa< IMUIKitConfig.MOMENTS_SOURCE_TIME) { + titles.add(dongtaiBean.getPicture3().replace("/pic_output/","/pic_input/")); +// }else{ +// titles.add(dongtaiBean.getPicture3().replace("/pic_input/","/pic_output/")); +// } + }else { + titles.add(ApiService.URL + dongtaiBean.getPicture3()); + } + } + if(!TextUtils.isEmpty(dongtaiBean.getPicture4())){ + if(dongtaiBean.getPicture4().startsWith("http")){ +// if(System.currentTimeMillis()-timeDa< IMUIKitConfig.MOMENTS_SOURCE_TIME) { + titles.add(dongtaiBean.getPicture4().replace("/pic_output/","/pic_input/")); +// }else{ +// titles.add(dongtaiBean.getPicture4().replace("/pic_input/","/pic_output/")); +// } + }else { + titles.add(ApiService.URL + dongtaiBean.getPicture4()); + } + } + if(!TextUtils.isEmpty(dongtaiBean.getPicture5())){ + if(dongtaiBean.getPicture5().startsWith("http")){ +// if(System.currentTimeMillis()-timeDa< IMUIKitConfig.MOMENTS_SOURCE_TIME) { + titles.add(dongtaiBean.getPicture5().replace("/pic_output/","/pic_input/")); +// }else{ +// titles.add(dongtaiBean.getPicture5().replace("/pic_input/","/pic_output/")); +// } + }else { + titles.add(ApiService.URL + dongtaiBean.getPicture5()); + } + } + if(!TextUtils.isEmpty(dongtaiBean.getPicture6())){ + if(dongtaiBean.getPicture6().startsWith("http")){ +// if(System.currentTimeMillis()-timeDa< IMUIKitConfig.MOMENTS_SOURCE_TIME) { + titles.add(dongtaiBean.getPicture6().replace("/pic_output/","/pic_input/")); +// }else{ +// titles.add(dongtaiBean.getPicture6().replace("/pic_input/","/pic_output/")); +// } + }else { + titles.add(ApiService.URL + dongtaiBean.getPicture6()); + } + } + if(!TextUtils.isEmpty(dongtaiBean.getPicture7())){ + if(dongtaiBean.getPicture7().startsWith("http")){ +// if(System.currentTimeMillis()-timeDa< IMUIKitConfig.MOMENTS_SOURCE_TIME) { + titles.add(dongtaiBean.getPicture7().replace("/pic_output/","/pic_input/")); +// }else{ +// titles.add(dongtaiBean.getPicture7().replace("/pic_input/","/pic_output/")); +// } + }else { + titles.add(ApiService.URL + dongtaiBean.getPicture7()); + } + } + if(!TextUtils.isEmpty(dongtaiBean.getPicture8())){ + if(dongtaiBean.getPicture8().startsWith("http")){ +// if(System.currentTimeMillis()-timeDa< IMUIKitConfig.MOMENTS_SOURCE_TIME) { + titles.add(dongtaiBean.getPicture8().replace("/pic_output/","/pic_input/")); +// }else{ +// titles.add(dongtaiBean.getPicture8().replace("/pic_input/","/pic_output/")); +// } + }else { + titles.add(ApiService.URL + dongtaiBean.getPicture8()); + } + } + if(!TextUtils.isEmpty(dongtaiBean.getPicture9())){ + if(dongtaiBean.getPicture9().startsWith("http")){ +// if(System.currentTimeMillis()-timeDa< IMUIKitConfig.MOMENTS_SOURCE_TIME) { + titles.add(dongtaiBean.getPicture9().replace("/pic_output/","/pic_input/")); +// }else{ +// titles.add(dongtaiBean.getPicture9().replace("/pic_input/","/pic_output/")); +// } + }else { + titles.add(ApiService.URL + dongtaiBean.getPicture9()); + } + } + + listFragment = new ArrayList<>(); + titles1 = new ArrayList<>(); + for (int i = 0;i tab.setText(titles.get(position))).attach(); + } + + public class CommunityAdapter extends FragmentStateAdapter { + private ArrayList listTitle; + private List listFragment; + + + public CommunityAdapter(@NonNull FragmentActivity fragmentActivity, ArrayList listTitle, List listFragment) { + super(fragmentActivity); + this.listTitle = listTitle; + this.listFragment = listFragment; + } + + + @NonNull + @Override + public Fragment createFragment(int position) { + return listFragment.get(position); + } + + @Override + public int getItemCount() { + return listFragment.size(); + } + + } + + + Timer mTimer; + TimerTask mTimerTask; + //播放 + private void playVideo() { + final MediaPlayer[] mMediaPlayer = new MediaPlayer[1]; + + binding.tiktok.mVideoView.start(); + + binding.tiktok.mVideoView.setOnInfoListener(new MediaPlayer.OnInfoListener() { + @Override + public boolean onInfo(MediaPlayer mp, int what, int extra) { + mMediaPlayer[0] = mp; + mp.setLooping(true); + try { + binding.tiktok.progress.setMax(mp.getDuration()); + binding.tiktok.progress.setProgress(mp.getCurrentPosition()); + mTimer = new Timer(); + mTimerTask = new TimerTask() { + @Override + public void run() { + try { + binding.tiktok.progress.setProgress(mp.getCurrentPosition()); + + }catch (Exception e){ + + } + } + }; + mTimer.schedule(mTimerTask, 0, 30); + binding.tiktok.progress.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + @Override + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { + + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + + } + + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + if(mp!=null&& binding.tiktok.progress!=null){ + mp.seekTo( binding.tiktok.progress.getProgress()); + } + + } + }); + } catch (Exception e) { + e.printStackTrace(); + } + + binding.tiktok.mThumb.animate().alpha(0).setDuration(200).start(); + return false; + } + }); + + //暂停控制 + binding.tiktok.mPlay.setOnClickListener(new View.OnClickListener() { + boolean isPlaying = true; + + @Override + public void onClick(View v) { + if (binding.tiktok.mVideoView.isPlaying()) { + binding.tiktok.mPlay.animate().alpha(1f).start(); + binding.tiktok.mVideoView.pause(); + isPlaying = false; + } else { + binding.tiktok.mPlay.animate().alpha(0f).start(); + binding.tiktok.mVideoView.start(); + isPlaying = true; + } + } + }); + } + + + //释放 + //释放 + private void releaseVideo() { + if(binding.tiktok.mVideoView!=null) { + binding.tiktok.mVideoView.stopPlayback(); + binding.tiktok.mPlay.animate().alpha(0f).start(); + } + } + + private ImageView coloseIvShare; + private RecyclerView recyclerShare; + private EditText commentEtShare; + private TextView shareBt; + private LinearLayoutManager linearLayoutManager; + private CommonAdapter commonAdapter; + private ArrayList titleUsers; + + private ArrayList titleUsersIsCheck; + + private void initList() { + + linearLayoutManager = new LinearLayoutManager(TiktoInfokActivity.this); + linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); + recyclerShare.setLayoutManager(linearLayoutManager); + commonAdapter = new CommonAdapter<>(TiktoInfokActivity.this, R.layout.item_share_list, titleUsers) { + @Override + public void convert(ViewHolder holder, UserShareBean s, int index) { + ImageView select_iv = holder.getView(R.id.select_iv); + + ContactAvatarView imageView = holder.getView(R.id.logo_iv); + + if (s.getTeamInfo() != null) { + ColorUtils.loadGroupAvator(s.getTeamInfo().getIcon(),imageView); +// imageView.setData( +// s.getTeamInfo().getIcon(), s.getTeamInfo().getName(), AvatarColor.avatarColor(s.getTeamInfo().getId())); + holder.setText(R.id.title_tv, s.getTeamInfo().getName()); + } else { + FriendInfo friendInfo = s.friendInfo; + NimUserInfo user = NIMClient.getService(UserService.class).getUserInfo(friendInfo.getAccount()); + if(user!=null) { + holder.setText(R.id.title_tv, user.getName()); + ColorUtils.loadAvator(user.getAvatar(),imageView); +// imageView.setData( +// user.getAvatar(), user.getName(), AvatarColor.avatarColor(user.getAccount())); + } + + } + + + if (titleUsersIsCheck.get(index)) { + select_iv.setImageResource(R.mipmap.dialog_item_gou); + } else { + select_iv.setImageResource(R.mipmap.dialog_item_quan); + } + holder.getView(R.id.big_bg).setOnClickListener(v -> { + titleUsersIsCheck.set(index, !titleUsersIsCheck.get(index)); + commonAdapter.notifyItemChanged(index, titleUsersIsCheck.get(index)); + LogUtils.i("0000000000"); + + changeItemButton(); + }); + } + }; + recyclerShare.setAdapter(commonAdapter); + } + + private void changeItemButton() { + LogUtils.i("1111111111111111"); + boolean isSelcet = false; + for (boolean item: titleUsersIsCheck) { + if(item){ + isSelcet = true; + break; + } + } + chagnBottom(isSelcet); + + } + + private void chagnBottom(boolean b) { + LogUtils.i("22222222222:"+b ); + + if(b){ + shareBt.setBackground(getResources().getDrawable(R.drawable.button_true_bg)); + shareBt.setEnabled(true); + }else{ + shareBt.setBackground(getResources().getDrawable(R.drawable.button_false_bg_new)); + shareBt.setEnabled(false); + + } + } + + private TabLayout tablayout; + private ImageView coloseIv; + private ViewPager2 viewpager; + + private void initShow(AlbumBean albumBean) { + + titles = new ArrayList<>(2); + int size1 = 0; + if(albumBean.getComments()!=null&&albumBean.getComments().size()>0){ + size1 = albumBean.getComments().size(); + } + int size2 = 0; + if(albumBean.getLikes()!=null&&albumBean.getLikes().size()>0){ + size2 = albumBean.getLikes().size(); + } + titles.add(getString(R.string.pinglun_txt)+"("+size1+")"); + titles.add(getString(R.string.zan_txt)+"("+size2+")"); + + listFragment = new ArrayList<>(); + listFragment.add(CommentFragment.newInstance(0, albumBean)); + listFragment.add(LikeFragment.newInstance(1, albumBean)); + CommunityAdapter adapter = new CommunityAdapter(TiktoInfokActivity.this, titles, listFragment); + viewpager.setAdapter(adapter); +//把TabLayout(选项卡布局)和ViewPager2绑定在一起。特别说明一下,下面这行代码是官方给的,特别好使。 + new TabLayoutMediator(tablayout, viewpager, (tab, position) -> tab.setText(titles.get(position))).attach(); + RxBus.getInstance().toObservable(RxCommLikeBean.class) + .subscribeOn(rx.schedulers.Schedulers.io()) + .unsubscribeOn(rx.schedulers.Schedulers.io()) + .subscribe(changeImageViewBean -> {//回顶部 + if (changeImageViewBean.getPostId().equals(albumBean.getPostId())) { + tablayout.getTabAt(0).setText(getString(R.string.pinglun_txt)+"("+changeImageViewBean.getCommentSize()+")"); + tablayout.getTabAt(1).setText(getString(R.string.zan_txt)+"("+changeImageViewBean.getLikeSize()+")"); + } + }); + + + } + + public void toUserHead() { +// XKitRouter.withKey(RouterConstant.PATH_USER_INFO_PAGE) +// .withContext(TiktoInfokActivity.this) +// .withParam(RouterConstant.KEY_ACCOUNT_ID_KEY, albumBean.getUserId() + "") +// .navigate(); + Intent intent = new Intent(TiktoInfokActivity.this, UserInfoActivity.class); + intent.putExtra("uid",albumBean.getUserId() + ""); +// intent.putExtra("uid","400432"); + + startActivity(intent); + } + + public void toLike() { + if (isZan(albumBean)) { + deleteZan(albumBean); + } else { + addZan(albumBean); + + } + } + + + private void addZan(AlbumBean albumBean) { + Map map = new HashMap<>(); + map.put("postId", albumBean.getPostId()); + if (!TextUtils.isEmpty(IMUIKitConfig.SUBSTATIONID)) { + map.put("substationId", IMUIKitConfig.SUBSTATIONID); + } + Api.getInstance().postLike(map) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver() { + @Override + public void onSuccess(Result feedbackResp) { + getInfo(albumBean); + } + + @Override + public void onError(int code, String msg) { + } + }); + } + + private void deleteZan(AlbumBean albumBean) { + Api.getInstance().postLikeDelete(albumBean.getPostId()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver() { + @Override + public void onSuccess(Result feedbackResp) { + getInfo(albumBean); + } + + @Override + public void onError(int code, String msg) { + + } + }); + } + + + private void getInfo(AlbumBean albumBean) { + + Api.getInstance().postsInfo(albumBean.getPostId()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result feedbackResp) { + RxBus.getInstance().post(feedbackResp.data); + } + + @Override + public void onError(int code, String msg) { + + } + }); + } + + + private boolean isZan(AlbumBean albumBean) { + if (albumBean.getLikes() != null && albumBean.getLikes().size() > 0) { + for (int i = 0; i < albumBean.getLikes().size(); i++) { + if ((albumBean.getLikes().get(i).getUserId() + "").equals(IMKitClient.account())) { + return true; + } + } + return false; + } else { + return false; + } + } + + + public void toComment() { + BottomSheetDialog bottomSheetCommentDialog = new BottomSheetDialog(this, R.style.BottomSheetDialog); + + View bottomView = LayoutInflater.from(TiktoInfokActivity.this).inflate(R.layout.bottom_sheet_comment_layout, null); + + tablayout = (TabLayout) bottomView.findViewById(R.id.tablayout); + coloseIv = (ImageView) bottomView.findViewById(R.id.colose_iv); + viewpager = (ViewPager2) bottomView.findViewById(R.id.viewpager); + initShow(albumBean); + bottomSheetCommentDialog.setContentView(bottomView); + bottomSheetCommentDialog.show(); + + bottomSheetCommentDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { + @Override + public void onDismiss(DialogInterface dialog) { + getWindow().setNavigationBarColor(getResources().getColor(R.color.black)); + + } + }); + coloseIv.setOnClickListener(v -> bottomSheetCommentDialog.dismiss()); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + AdaptScreenUtils.setWhiteNavigationBar(bottomSheetCommentDialog); + } + + } + + public void toShare() { + titleUsers = shareDateUtils.getConverstionShareInfo(); + titleUsersIsCheck = new ArrayList<>(); + for (UserShareBean conversationInfo:titleUsers){ + titleUsersIsCheck.add(false); + } + + if(titleUsers==null||titleUsers.size()==0){ + ToastX.showShortToast(R.string.mykfxfddx_txt); + return; + } + + BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(this, R.style.BottomSheetDialog); + + View bottomView = LayoutInflater.from(TiktoInfokActivity.this).inflate(R.layout.bottom_sheet_layout, null); + + + + coloseIvShare = (ImageView) bottomView.findViewById(R.id.colose_iv); + recyclerShare = (RecyclerView) bottomView.findViewById(R.id.recycler); + commentEtShare = (EditText) bottomView.findViewById(R.id.comment_et); + + shareBt = (TextView) bottomView.findViewById(R.id.share_bt); + initList(); + bottomSheetDialog.setContentView(bottomView); + bottomSheetDialog.show(); + + bottomSheetDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { + @Override + public void onDismiss(DialogInterface dialog) { + getWindow().setNavigationBarColor(getResources().getColor(R.color.black)); + + } + }); + coloseIvShare.setOnClickListener(v -> bottomSheetDialog.dismiss()); + shareBt.setOnClickListener(v -> { + + boolean isSelect = false; + for(Boolean type:titleUsersIsCheck){ + if(type){ + isSelect = true; + } + } + if(!isSelect){ + ToastX.showShortToast(getString(R.string.qxxzyfxddx_txt)); + return; + } + +// if(!TextUtils.isEmpty(commentEtShare.getText().toString().trim())){ +// albumBean.setText(commentEtShare.getText().toString().trim()); +// } + //String postId, String picPath, String videoPath,String postContent + //String postId, String picPath, String videoPath, String postContent, String userId, String userAvatar + StickerAttachment customerAttachment = new StickerAttachment(albumBean.getPostId()+"", + albumBean.getPicture1(),albumBean.getVideo(), + albumBean.getText(),albumBean.getUserId()+"",albumBean.getUserAvatar(),albumBean.getUserNickname()); + LogUtils.i("获取到的数据:"+ GsonUtils.beanToJSONString(customerAttachment)); + //创建IMMessage,其中sessionId代表会话ID,sessionType会话类型,content代表消息内容,customerAttachment自定义消息 + for (int i = 0;i= Build.VERSION_CODES.M) { + AdaptScreenUtils.setWhiteNavigationBar(bottomSheetDialog); + } + } + + @Override + protected void onDestroy() { + releaseVideo(); + mEventSubscription.unsubscribe(); + super.onDestroy(); + } + + private void toShareMessage(UserShareBean conversationInfo, AlbumBean albumBean, StickerAttachment customerAttachment, BottomSheetDialog bottomSheetDialog ,String fujiaTxt) { + IMMessage customMessage = null; + if(conversationInfo.getTeamInfo()!=null){ + customMessage = MessageBuilder.createCustomMessage(conversationInfo.getTeamInfo().getId(), SessionTypeEnum.Team, albumBean.getText(), customerAttachment); + }else if(conversationInfo.getFriendInfo()!=null){ + customMessage = MessageBuilder.createCustomMessage(conversationInfo.getFriendInfo().getAccount(), SessionTypeEnum.P2P, albumBean.getText(), customerAttachment); + } + + + if(customMessage!=null) { + ChatRepo.sendMessage(customMessage, false, new FetchCallback() { + @Override + public void onSuccess(@Nullable Void unused) { + ToastX.showShortToast(getString(R.string.message_share_success)); + bottomSheetDialog.dismiss(); + } + + @Override + public void onFailed(int i) { + bottomSheetDialog.dismiss(); + } + + @Override + public void onException(@Nullable Throwable throwable) { + bottomSheetDialog.dismiss(); + } + }); + } + + + if (!TextUtils.isEmpty(fujiaTxt)) { + IMMessage customMessage1 = null; + if (conversationInfo.getTeamInfo() != null) { + customMessage1 = MessageBuilder.createTextMessage(conversationInfo.getTeamInfo().getId(), SessionTypeEnum.Team, fujiaTxt); + } else if (conversationInfo.getFriendInfo() != null) { + customMessage1 = MessageBuilder.createTextMessage(conversationInfo.getFriendInfo().getAccount(), SessionTypeEnum.P2P, fujiaTxt); + } + ChatRepo.sendMessage(customMessage1, false, new FetchCallback() { + @Override + public void onSuccess(@Nullable Void unused) { + + } + + @Override + public void onFailed(int i) { + bottomSheetDialog.dismiss(); + } + + @Override + public void onException(@Nullable Throwable throwable) { + } + }); + } + + } + + private ImageView coloseIvAction; + private LinearLayout allLy; + private TextView allVisibleTv; + private ImageView allVisibleIv; + private LinearLayout haoyouLy; + private TextView friendVisibleTv; + private ImageView friendVisibleIv; + private LinearLayout zijiLy; + private TextView onlymeVisibleTv; + private ImageView onlymeVisibleIv; + private LinearLayout deleteLy; + private TextView deleteTv; + + + private TextView coloseIv1; + private TextView jubaoTv; + public void toMoreAction() { + + if (String.valueOf(albumBean.getUserId()).equals(IMKitClient.account())) { + + + BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(this, R.style.BottomSheetDialog); + + View bottomView = LayoutInflater.from(TiktoInfokActivity.this).inflate(R.layout.bottom_sheet_layout_action, null); + bottomSheetDialog.setContentView(bottomView); + bottomSheetDialog.show(); + coloseIvAction = (ImageView) bottomView.findViewById(R.id.colose_iv); + allLy = (LinearLayout) bottomView.findViewById(R.id.all_ly); + allVisibleTv = (TextView) bottomView.findViewById(R.id.all_visible_tv); + allVisibleIv = (ImageView) bottomView.findViewById(R.id.all_visible_iv); + haoyouLy = (LinearLayout) bottomView.findViewById(R.id.haoyou_ly); + friendVisibleTv = (TextView) bottomView.findViewById(R.id.friend_visible_tv); + friendVisibleIv = (ImageView) bottomView.findViewById(R.id.friend_visible_iv); + zijiLy = (LinearLayout) bottomView.findViewById(R.id.ziji_ly); + onlymeVisibleTv = (TextView) bottomView.findViewById(R.id.onlyme_visible_tv); + onlymeVisibleIv = (ImageView) bottomView.findViewById(R.id.onlyme_visible_iv); + deleteLy = (LinearLayout) bottomView.findViewById(R.id.delete_ly); + deleteTv = (TextView) bottomView.findViewById(R.id.delete_tv); + coloseIvAction.setOnClickListener(v -> bottomSheetDialog.dismiss()); + allLy.setOnClickListener(v -> { + bottomSheetDialog.dismiss(); + changePost(0, albumBean); + }); + haoyouLy.setOnClickListener(v -> { + bottomSheetDialog.dismiss(); + + changePost(1, albumBean); + }); + zijiLy.setOnClickListener(v -> { + bottomSheetDialog.dismiss(); + + changePost(2, albumBean); + }); + deleteLy.setOnClickListener(v -> { + ActionConfirmDialog actionDialog = new ActionConfirmDialog(TiktoInfokActivity.this, getString(R.string.nqdyscztdt_txt), true); + actionDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + bottomSheetDialog.dismiss(); + deletePost(albumBean); + } + + @Override + public void toCancel() { + + } + }); + actionDialog.show(); + }); + + bottomSheetDialog.setOnDismissListener(dialog -> getWindow().setNavigationBarColor(getResources().getColor(R.color.black))); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + AdaptScreenUtils.setWhiteNavigationBar(bottomSheetDialog); + } + }else{ + BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(this, R.style.BottomSheetDialog); + + View bottomView = LayoutInflater.from(TiktoInfokActivity.this).inflate(R.layout.bottom_sheet_layout_action1, null); + bottomSheetDialog.setContentView(bottomView); + bottomSheetDialog.show(); + + coloseIv1 = (TextView) bottomView. findViewById(R.id.colose_iv); + jubaoTv = (TextView) bottomView.findViewById(R.id.jubao_tv); + + coloseIv1.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + bottomSheetDialog.dismiss(); + } + }); + + jubaoTv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + bottomSheetDialog.dismiss(); + Intent intent = new Intent(TiktoInfokActivity.this, ReportActivity.class); + intent.putExtra("type", 2); + intent.putExtra("bean", albumBean); + startActivity(intent); + } + }); + bottomSheetDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { + @Override + public void onDismiss(DialogInterface dialog) { + getWindow().setNavigationBarColor(getResources().getColor(R.color.black)); + } + }); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + AdaptScreenUtils.setWhiteNavigationBar(bottomSheetDialog); + } + } + + } + + private void deletePost(AlbumBean albumBean) { + Api.getInstance().postDelete(albumBean.getPostId()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver() { + @Override + public void onSuccess(Result feedbackResp) { + ToastX.showShortToast(getString(R.string.shanchu_chenggong_txt)); + + finish(); + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast(msg); + } + }); + } + + private void changePost(int i,AlbumBean albumBean) { + Map map = new HashMap<>(); + map.put("visible",i); + map.put("substationId", IMUIKitConfig.SUBSTATIONID); + + Api.getInstance().changePost(albumBean.getPostId(),map) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver() { + @Override + public void onSuccess(Result feedbackResp) { + getInfo(albumBean); + ToastX.showShortToast(getString(R.string.xiugaichenggong_txt)); + + } + + @Override + public void onError(int code, String msg) { +// WidgetUtils.showToast(CircleInfoActivity.this, msg, WidgetUtils.ToastType.ERROR); + } + }); + } + public boolean onTouchEvent(MotionEvent event) { + if(null != this.getCurrentFocus()){ + /** + * 点击空白位置 隐藏软键盘 + */ + InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + return mInputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0); + } + return super .onTouchEvent(event); + } + +} diff --git a/app/src/main/java/com/dskj/rbchat/voom/TiktokActivity.java b/app/src/main/java/com/dskj/rbchat/voom/TiktokActivity.java new file mode 100644 index 0000000..163d602 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/voom/TiktokActivity.java @@ -0,0 +1,1146 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.voom; + +import android.Manifest; +import android.content.DialogInterface; +import android.content.Intent; +import android.graphics.Color; +import android.media.MediaPlayer; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.text.TextUtils; +import android.view.LayoutInflater; +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.ProgressBar; +import android.widget.SeekBar; +import android.widget.TextView; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.OrientationHelper; +import androidx.recyclerview.widget.RecyclerView; +import androidx.viewpager2.adapter.FragmentStateAdapter; +import androidx.viewpager2.widget.ViewPager2; + +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; + +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.contact.ReportActivity; +import com.dskj.rbchat.contact.UserInfoActivity; +import com.dskj.rbchat.databinding.ActivityTiktokBinding; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.model.AlbumBean; +import com.dskj.rbchat.model.RxCommLikeBean; +import com.dskj.rbchat.model.UserShareBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.AdaptScreenUtils; +import com.dskj.rbchat.utils.Constant; + +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.utils.ShareDateUtils; +import com.dskj.rbchat.voom.comm.CircleFragment1; +import com.dskj.rbchat.voom.comm.CircleFragment2; +import com.dskj.rbchat.voom.comm.CusVideoView; +import com.dskj.rbchat.voom.comm.OnViewPagerListener; +import com.dskj.rbchat.voom.comm.TiktokAdapter; +import com.dskj.rbchat.voom.comm.ViewPagerLayoutManager; +import com.google.android.material.bottomsheet.BottomSheetDialog; +import com.google.android.material.tabs.TabLayout; +import com.google.android.material.tabs.TabLayoutMediator; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.msg.MessageBuilder; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.nimlib.sdk.msg.model.IMMessage; +import com.netease.nimlib.sdk.uinfo.UserService; +import com.netease.nimlib.sdk.uinfo.model.NimUserInfo; +import com.netease.yunxin.kit.alog.ALog; + +import com.netease.yunxin.kit.chatkit.repo.ChatRepo; +import com.netease.yunxin.kit.chatkit.ui.common.RxBus; +import com.netease.yunxin.kit.chatkit.ui.custom.StickerAttachment; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.utils.AvatarColor; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.common.ui.widgets.ContactAvatarView; +import com.netease.yunxin.kit.common.utils.PermissionUtils; +import com.netease.yunxin.kit.contactkit.ui.utils.ColorUtils; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.model.FriendInfo; +import com.netease.yunxin.kit.corekit.im.provider.FetchCallback; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Timer; +import java.util.TimerTask; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; +import rx.Subscription; + +/** + * Welcome Page is launch page + */ +public class TiktokActivity extends BaseActivity implements TiktokAdapter.OnToActionListener { + + private static final String TAG = "TiktokActivity"; + private ActivityTiktokBinding binding; + private ViewPagerLayoutManager mLayoutManager; + private ShareDateUtils shareDateUtils; + private int type; + TiktokAdapter mAdapter; + private Subscription mEventSubscription; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + getWindow().setDecorFitsSystemWindows(false); + } else { + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); + } + getWindow().setStatusBarColor(Color.TRANSPARENT); + + ALog.d(Constant.PROJECT_TAG, TAG, "onCreateView"); + IMApplication.setColdStart(true); + binding = ActivityTiktokBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + type = getIntent().getIntExtra("type", 0); + + initView(); + initListener(); + if (DataUtils.get(TiktokActivity.this, "fist_tiktok", true)) { + binding.firstTv.setVisibility(View.VISIBLE); + } else { + binding.firstTv.setVisibility(View.GONE); + } + + nowPosition = getIntent().getIntExtra("index", 0); + binding.mRecycler.scrollToPosition(getIntent().getIntExtra("index", 0)); + shareDateUtils = new ShareDateUtils(); + shareDateUtils.getAllSessionList(); + permissionLauncher = registerForActivityResult( + new ActivityResultContracts.RequestMultiplePermissions(), + result -> { + if (result != null) { + for (Map.Entry entry : result.entrySet()) { + String permission = entry.getKey().toString(); + boolean grant = (Boolean) entry.getValue(); + if (grant) { + if (TextUtils.equals( + permission, Manifest.permission.READ_MEDIA_IMAGES) + || TextUtils.equals( + permission, Manifest.permission.READ_MEDIA_VIDEO) + || TextUtils.equals( + permission, Manifest.permission.READ_EXTERNAL_STORAGE)) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + toShareAction(locAlbumBean); + } + } + } else { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (shouldShowRequestPermissionRationale(permission)) { + ToastX.showShortToast(getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_deny_tips)); + } else { + ToastX.showShortToast(getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_storage)); + } + } + } + } + } + }); + } + + int nowPosition = 0; + + //初始化监听 + private void initListener() { +// mLayoutManager.setOnPageSlideListener(new OnPageSlideListener() { +// +// @Override +// public void onPageRelease(boolean isNext, int position) { +// int index; +// if (isNext) { +// index = 0; +// } else { +// index = 1; +// } +// releaseVideo(index); +// +// } +// +// @Override +// public void onPageSelected(int position, boolean isNext) { +// nowPosition = position; +// if (position != getIntent().getIntExtra("index", 0)) { +// DataUtils.set(TiktokActivity.this, "fist_tiktok", false); +// binding.firstTv.setVisibility(View.GONE); +// } +// if(type==0) { +// if (position < CircleFragment.titles.size()) { +// playVideo(); +// } +// }else if(type==1){ +// if (position < CircleFragment1.titles.size()) { +// playVideo(); +// } +// }else{ +// if (position < CircleFragment2.titles.size()) { +// playVideo(); +// } +// } + +// +// } +// }); + mLayoutManager.setOnViewPagerListener(new OnViewPagerListener() { + @Override + public void onInitComplete() { + playVideo(); + } + + @Override + public void onPageRelease(boolean isNext, int position) { + int index; + if (isNext) { + index = 0; + } else { + index = 1; + } + releaseVideo(index); + } + + @Override + public void onPageSelected(int position, boolean isBottom) { + nowPosition = position; + if (position != getIntent().getIntExtra("index", 0)) { + DataUtils.set(TiktokActivity.this, "fist_tiktok", false); + binding.firstTv.setVisibility(View.GONE); + } + if (type == 0) { + if (position < CircleFragment.titles.size()) { + playVideo(); + } + } else if (type == 1) { + if (position < CircleFragment1.titles.size()) { + playVideo(); + } + } else { + if (position < CircleFragment2.titles.size()) { + playVideo(); + } + } + + } + }); + + binding.backIv.setOnClickListener(v -> onBackPressed()); + } + + @Override + public void onBackPressed() { + Intent intent = new Intent(); + intent.putExtra("index", nowPosition); + setResult(RESULT_OK, intent); + super.onBackPressed(); + } + + //初始化View + private void initView() { + mLayoutManager = new ViewPagerLayoutManager(this, OrientationHelper.VERTICAL); + mAdapter = new TiktokAdapter(this, this, type); + binding.mRecycler.setLayoutManager(mLayoutManager); + binding.mRecycler.setAdapter(mAdapter); + } + + Timer mTimer; + TimerTask mTimerTask; + + //播放 + private void playVideo() { + View itemView = binding.mRecycler.getChildAt(0); + final CusVideoView mVideoView = itemView.findViewById(R.id.mVideoView); + final ImageView mPlay = itemView.findViewById(R.id.mPlay); + final ImageView mThumb = itemView.findViewById(R.id.mThumb); + final SeekBar progressBar = itemView.findViewById(R.id.progress); + + final MediaPlayer[] mMediaPlayer = new MediaPlayer[1]; + mVideoView.start(); + + mVideoView.setOnInfoListener((mp, what, extra) -> { + mMediaPlayer[0] = mp; + mp.setLooping(true); + try { + progressBar.setMax(mp.getDuration()); + progressBar.setProgress(mp.getCurrentPosition()); + mTimer = new Timer(); + mTimerTask = new TimerTask() { + @Override + public void run() { + try { + progressBar.setProgress(mp.getCurrentPosition()); + + }catch (Exception e){ + + } + } + }; + mTimer.schedule(mTimerTask, 0, 30); + progressBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + @Override + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { + + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + + } + + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + if(mp!=null&&progressBar!=null){ + mp.seekTo(progressBar.getProgress()); + } + + } + }); + } catch (Exception e) { + e.printStackTrace(); + } + mThumb.animate().alpha(0).setDuration(200).start(); + return false; + }); + + + //暂停控制 + mPlay.setOnClickListener(new View.OnClickListener() { + boolean isPlaying = true; + + @Override + public void onClick(View v) { + if (mVideoView.isPlaying()) { + mPlay.animate().alpha(1f).start(); + mVideoView.pause(); + isPlaying = false; + } else { + mPlay.animate().alpha(0f).start(); + mVideoView.start(); + isPlaying = true; + } + } + }); + } + + + //播放 + private void playVideoOnResume() { + View itemView = binding.mRecycler.getChildAt(0); + final CusVideoView mVideoView = itemView.findViewById(R.id.mVideoView); + final ImageView mPlay = itemView.findViewById(R.id.mPlay); + final ImageView mThumb = itemView.findViewById(R.id.mThumb); + final MediaPlayer[] mMediaPlayer = new MediaPlayer[1]; + mThumb.setVisibility(View.VISIBLE); + + mVideoView.start(); + mPlay.animate().alpha(0f).start(); + } + + + //释放 + private void releaseVideo(int index) { + View itemView = binding.mRecycler.getChildAt(index); + final CusVideoView mVideoView = itemView.findViewById(R.id.mVideoView); + final ImageView mThumb = itemView.findViewById(R.id.mThumb); + final ImageView mPlay = itemView.findViewById(R.id.mPlay); + mVideoView.stopPlayback(); +// mThumb.animate().alpha(1).start(); + mPlay.animate().alpha(0f).start(); + } + + private ImageView coloseIvShare; + private RecyclerView recyclerShare; + private EditText commentEtShare; + private TextView shareBt; + private LinearLayoutManager linearLayoutManager; + private CommonAdapter commonAdapter; + private ArrayList titleUsers; + + private ArrayList titleUsersIsCheck; + + private void initList() { + + + linearLayoutManager = new LinearLayoutManager(TiktokActivity.this); + linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); + recyclerShare.setLayoutManager(linearLayoutManager); + commonAdapter = new CommonAdapter<>(TiktokActivity.this, R.layout.item_share_list, titleUsers) { + @Override + public void convert(ViewHolder holder, UserShareBean s, int index) { + ImageView select_iv = holder.getView(R.id.select_iv); + + ContactAvatarView imageView = holder.getView(R.id.logo_iv); + + if (s.getTeamInfo() != null) { + ColorUtils.loadGroupAvator(s.getTeamInfo().getIcon(), imageView); +// imageView.setData( +// s.getTeamInfo().getIcon(), s.getTeamInfo().getName(), AvatarColor.avatarColor(s.getTeamInfo().getId())); + holder.setText(R.id.title_tv, s.getTeamInfo().getName()); + } else { + LogUtils.i("用户信息:" + GsonUtils.beanToJSONString(s.getFriendInfo())); + + FriendInfo friendInfo = s.getFriendInfo(); + NimUserInfo user = NIMClient.getService(UserService.class).getUserInfo(friendInfo.getAccount()); + if (user != null) { + holder.setText(R.id.title_tv, user.getName()); + ColorUtils.loadAvator(user.getAvatar(), imageView); +// imageView.setData( +// user.getAvatar(), user.getName(), AvatarColor.avatarColor(user.getAccount())); + } + } + + + if (titleUsersIsCheck.get(index)) { + select_iv.setImageResource(R.mipmap.dialog_item_gou); + } else { + select_iv.setImageResource(R.mipmap.dialog_item_quan); + } + holder.getView(R.id.big_bg).setOnClickListener(v -> { + titleUsersIsCheck.set(index, !titleUsersIsCheck.get(index)); + commonAdapter.notifyItemChanged(index, titleUsersIsCheck.get(index)); + LogUtils.i("0000000000"); + + changeItemButton(); + }); + } + }; + recyclerShare.setAdapter(commonAdapter); + } + + private void changeItemButton() { + LogUtils.i("1111111111111111"); + boolean isSelcet = false; + for (boolean item : titleUsersIsCheck) { + if (item) { + isSelcet = true; + break; + } + } + chagnBottom(isSelcet); + + } + + private void chagnBottom(boolean b) { + LogUtils.i("22222222222:" + b); + + if (b) { + shareBt.setBackground(getResources().getDrawable(R.drawable.button_true_bg)); + shareBt.setEnabled(true); + } else { + shareBt.setBackground(getResources().getDrawable(R.drawable.button_false_bg_new)); + shareBt.setEnabled(false); + + } + } + + private ArrayList titles; + private List listFragment; + private TabLayout tablayout; + private ImageView coloseIv; + private ViewPager2 viewpager; + + private void initShow(AlbumBean albumBean) { + + titles = new ArrayList<>(2); + int size1 = 0; + if (albumBean.getComments() != null && albumBean.getComments().size() > 0) { + size1 = albumBean.getComments().size(); + } + + int size2 = 0; + if (albumBean.getLikes() != null && albumBean.getLikes().size() > 0) { + size2 = albumBean.getLikes().size(); + } + titles.add(getString(R.string.pinglun_txt) + "(" + size1 + ")"); + titles.add(getString(R.string.zan_txt) + "(" + size2 + ")"); + LogUtils.i("评论:" + GsonUtils.beanToJSONString(albumBean.getComments())); + listFragment = new ArrayList<>(); + listFragment.add(CommentFragment.newInstance(0, albumBean)); + listFragment.add(LikeFragment.newInstance(1, albumBean)); + CommunityAdapter adapter = new CommunityAdapter(TiktokActivity.this, titles, listFragment); + viewpager.setAdapter(adapter); +//把TabLayout(选项卡布局)和ViewPager2绑定在一起。特别说明一下,下面这行代码是官方给的,特别好使。 + new TabLayoutMediator(tablayout, viewpager, (tab, position) -> tab.setText(titles.get(position))).attach(); + RxBus.getInstance().toObservable(RxCommLikeBean.class) + .subscribeOn(rx.schedulers.Schedulers.io()) + .unsubscribeOn(rx.schedulers.Schedulers.io()) + .subscribe(changeImageViewBean -> {//回顶部 + if (changeImageViewBean.getPostId().equals(albumBean.getPostId())) { + tablayout.getTabAt(0).setText(getString(R.string.pinglun_txt) + "(" + changeImageViewBean.getCommentSize() + ")"); + tablayout.getTabAt(1).setText(getString(R.string.zan_txt) + "(" + changeImageViewBean.getLikeSize() + ")"); + } + }); + + } + + @Override + public void toUserHead(int nowPosition, AlbumBean albumBean) { +// XKitRouter.withKey(RouterConstant.PATH_USER_INFO_PAGE) +// .withContext(TiktokActivity.this) +// .withParam(RouterConstant.KEY_ACCOUNT_ID_KEY, CircleFragment.titles.get(albumBean).getUserId() + "") +// .navigate(); + Intent intent = new Intent(TiktokActivity.this, UserInfoActivity.class); + intent.putExtra("uid", albumBean.getUserId() + ""); + startActivity(intent); + } + + @Override + public void toLike(int post, AlbumBean albumBean) { + LogUtils.i("给谁点赞进来了:" + albumBean.getPostId()); + + +// if(type==0) { + if (isZan(albumBean)) { + LogUtils.i("给谁点赞进来了点过赞了:" + albumBean.getPostId()); + + deleteZan(albumBean, post); + } else { + LogUtils.i("给谁点赞进来了没点过赞:" + albumBean.getPostId()); + + addZan(albumBean, post); + + } +// }else if(type==1){ +// if (isZan(CircleFragment1.titles.get(albumBean))) { +// deleteZan(CircleFragment1.titles.get(albumBean), albumBean); +// } else { +// addZan(CircleFragment1.titles.get(albumBean), albumBean); +// +// } +// +// }else{ +// if (isZan(CircleFragment2.titles.get(albumBean))) { +// deleteZan(CircleFragment2.titles.get(albumBean), albumBean); +// } else { +// addZan(CircleFragment2.titles.get(albumBean), albumBean); +// +// } +// +// } + + } + + + private void addZan(AlbumBean albumBean, int index) { + Map map = new HashMap<>(); + map.put("postId", albumBean.getPostId()); + if (!TextUtils.isEmpty(IMUIKitConfig.SUBSTATIONID)) { + map.put("substationId", IMUIKitConfig.SUBSTATIONID); + } + Api.getInstance().postLike(map) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver() { + @Override + public void onSuccess(Result feedbackResp) { + getInfo(albumBean, index); + } + + @Override + public void onError(int code, String msg) { + } + }); + } + + private void deleteZan(AlbumBean albumBean, int index) { + Api.getInstance().postLikeDelete(albumBean.getPostId()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver() { + @Override + public void onSuccess(Result feedbackResp) { + getInfo(albumBean, index); + } + + @Override + public void onError(int code, String msg) { + + } + }); + } + + + private void getInfo(AlbumBean albumBean, int index) { + + Api.getInstance().postsInfo(albumBean.getPostId()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result feedbackResp) { + if (type == 0) { + CircleFragment.changeBean(feedbackResp.data, index); + } else if (type == 1) { + CircleFragment1.changeBean(feedbackResp.data, index); + } else { + CircleFragment2.changeBean(feedbackResp.data, index); + } + RxBus.getInstance().post(feedbackResp.data); + + } + + @Override + public void onError(int code, String msg) { + + } + }); + } + + + private boolean isZan(AlbumBean albumBean) { + if (albumBean.getLikes() != null && albumBean.getLikes().size() > 0) { + for (int i = 0; i < albumBean.getLikes().size(); i++) { + if ((albumBean.getLikes().get(i).getUserId() + "").equals(IMKitClient.account())) { + return true; + } + } + return false; + } else { + return false; + } + } + + + @Override + public void toComment(int nowPosition, AlbumBean albumBean) { + BottomSheetDialog bottomSheetCommentDialog = new BottomSheetDialog(this, R.style.BottomSheetDialog); + + View bottomView = LayoutInflater.from(TiktokActivity.this).inflate(R.layout.bottom_sheet_comment_layout, null); + + tablayout = (TabLayout) bottomView.findViewById(R.id.tablayout); + coloseIv = (ImageView) bottomView.findViewById(R.id.colose_iv); + viewpager = (ViewPager2) bottomView.findViewById(R.id.viewpager); +// if(type==0) { +// LogUtils.i("评论1:"+GsonUtils.beanToJSONString(CircleFragment.titles.get(albumBean).getComments())); +// +// initShow(CircleFragment.titles.get(albumBean)); +// }else if(type==1){ +// LogUtils.i("评论2:"+GsonUtils.beanToJSONString(CircleFragment1.titles.get(albumBean).getComments())); +// +// initShow(CircleFragment1.titles.get(albumBean)); +// }else{ +// LogUtils.i("评论3:"+GsonUtils.beanToJSONString(CircleFragment2.titles.get(albumBean).getComments())); +// +// initShow(CircleFragment2.titles.get(albumBean)); +// } + initShow(albumBean); + bottomSheetCommentDialog.setContentView(bottomView); + bottomSheetCommentDialog.show(); + + bottomSheetCommentDialog.setOnDismissListener(dialog -> getWindow().setNavigationBarColor(getResources().getColor(R.color.black))); + coloseIv.setOnClickListener(v -> bottomSheetCommentDialog.dismiss()); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + AdaptScreenUtils.setWhiteNavigationBar(bottomSheetCommentDialog); + } + } + + private int album; + AlbumBean locAlbumBean; + + @Override + public void toShare(int nowPosition, AlbumBean albumBean) { + album = nowPosition; + locAlbumBean = albumBean; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + if (PermissionUtils.hasPermissions( + TiktokActivity.this, Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO)) { + toShareAction(albumBean); + } else { + requestCameraPermission(); + } + } else { + if (PermissionUtils.hasPermissions( + TiktokActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE)) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + toShareAction(albumBean); + } + } else { + requestCameraPermission( + Manifest.permission.READ_EXTERNAL_STORAGE); + } + } + + + } + + @RequiresApi(api = Build.VERSION_CODES.M) + private void toShareAction(AlbumBean albumBean) { + + titleUsers = shareDateUtils.getConverstionShareInfo(); + titleUsersIsCheck = new ArrayList<>(); + for (UserShareBean conversationInfo : titleUsers) { + titleUsersIsCheck.add(false); + } + if (titleUsers == null || titleUsers.size() == 0) { + ToastX.showShortToast(R.string.mykfxfddx_txt); + return; + } + BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(this, R.style.BottomSheetDialog); + + View bottomView = LayoutInflater.from(TiktokActivity.this).inflate(R.layout.bottom_sheet_layout, null); + + + coloseIvShare = (ImageView) bottomView.findViewById(R.id.colose_iv); + recyclerShare = (RecyclerView) bottomView.findViewById(R.id.recycler); + commentEtShare = (EditText) bottomView.findViewById(R.id.comment_et); + + shareBt = (TextView) bottomView.findViewById(R.id.share_bt); + initList(); + bottomSheetDialog.setContentView(bottomView); + bottomSheetDialog.show(); + + bottomSheetDialog.setOnDismissListener(dialog -> getWindow().setNavigationBarColor(getResources().getColor(R.color.black))); + coloseIvShare.setOnClickListener(v -> bottomSheetDialog.dismiss()); + shareBt.setOnClickListener(v -> { + + boolean isSelect = false; + for (Boolean type : titleUsersIsCheck) { + if (type) { + isSelect = true; + } + } + if (!isSelect) { + ToastX.showShortToast(getString(R.string.qxxzyfxddx_txt)); + return; + } + + + //String postId, String picPath, String videoPath,String postContent + //String postId, String picPath, String videoPath, String postContent, String userId, String userAvatar + StickerAttachment customerAttachment = new StickerAttachment(albumBean.getPostId() + "", + albumBean.getPicture1(), albumBean.getVideo(), + albumBean.getText(), albumBean.getUserId() + "", albumBean.getUserAvatar(), albumBean.getUserNickname()); + LogUtils.i("获取到的数据:" + GsonUtils.beanToJSONString(customerAttachment)); + //创建IMMessage,其中sessionId代表会话ID,sessionType会话类型,content代表消息内容,customerAttachment自定义消息 + for (int i = 0; i < titleUsersIsCheck.size(); i++) { + if (titleUsersIsCheck.get(i)) { + toShareMessage(titleUsers.get(i), albumBean, customerAttachment, bottomSheetDialog, commentEtShare.getText().toString().trim()); + } + } + + }); + AdaptScreenUtils.setWhiteNavigationBar(bottomSheetDialog); + + } + + private void requestCameraPermission(String permission) { + permissionLauncher.launch(new String[]{permission}); + } + + protected ActivityResultLauncher permissionLauncher; + + private void requestCameraPermission() { + permissionLauncher.launch(new String[]{Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO}); + } + + private void toShareMessage(UserShareBean conversationInfo, AlbumBean albumBean, StickerAttachment customerAttachment, BottomSheetDialog bottomSheetDialog, String fujiaTxt) { + IMMessage customMessage = null; + if (conversationInfo.getTeamInfo() != null) { + customMessage = MessageBuilder.createCustomMessage(conversationInfo.getTeamInfo().getId(), SessionTypeEnum.Team, albumBean.getText(), customerAttachment); + } else if (conversationInfo.getFriendInfo() != null) { + customMessage = MessageBuilder.createCustomMessage(conversationInfo.getFriendInfo().getAccount(), SessionTypeEnum.P2P, albumBean.getText(), customerAttachment); + } + LogUtils.i("发送消息结构体:" + GsonUtils.beanToJSONString(customerAttachment)); + + + if (customMessage != null) { + ChatRepo.sendMessage(customMessage, false, new FetchCallback() { + @Override + public void onSuccess(@Nullable Void unused) { + ToastX.showShortToast(getString(R.string.message_share_success)); + bottomSheetDialog.dismiss(); + } + + @Override + public void onFailed(int i) { + bottomSheetDialog.dismiss(); + } + + @Override + public void onException(@Nullable Throwable throwable) { + bottomSheetDialog.dismiss(); + } + }); + } + + + if (!TextUtils.isEmpty(fujiaTxt)) { + IMMessage customMessage1 = null; + if (conversationInfo.getTeamInfo() != null) { + customMessage1 = MessageBuilder.createTextMessage(conversationInfo.getTeamInfo().getId(), SessionTypeEnum.Team, fujiaTxt); + } else if (conversationInfo.getFriendInfo() != null) { + customMessage1 = MessageBuilder.createTextMessage(conversationInfo.getFriendInfo().getAccount(), SessionTypeEnum.P2P, fujiaTxt); + } + ChatRepo.sendMessage(customMessage1, false, new FetchCallback() { + @Override + public void onSuccess(@Nullable Void unused) { + + } + + @Override + public void onFailed(int i) { + bottomSheetDialog.dismiss(); + } + + @Override + public void onException(@Nullable Throwable throwable) { + } + }); + } + + } + + private ImageView coloseIvAction; + private LinearLayout allLy; + private TextView allVisibleTv; + private ImageView allVisibleIv; + private LinearLayout haoyouLy; + private TextView friendVisibleTv; + private ImageView friendVisibleIv; + private LinearLayout zijiLy; + private TextView onlymeVisibleTv; + private ImageView onlymeVisibleIv; + private LinearLayout deleteLy; + private TextView deleteTv; + + private TextView coloseIv1; + private TextView jubaoTv; + + @Override + public void toMoreAction(int nowPosition, AlbumBean albumBean) { + + + if (String.valueOf(albumBean.getUserId()).equals(IMKitClient.account())) { + + BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(this, R.style.BottomSheetDialog); + + View bottomView = LayoutInflater.from(TiktokActivity.this).inflate(R.layout.bottom_sheet_layout_action, null); + bottomSheetDialog.setContentView(bottomView); + bottomSheetDialog.show(); + coloseIvAction = (ImageView) bottomView.findViewById(R.id.colose_iv); + allLy = (LinearLayout) bottomView.findViewById(R.id.all_ly); + allVisibleTv = (TextView) bottomView.findViewById(R.id.all_visible_tv); + allVisibleIv = (ImageView) bottomView.findViewById(R.id.all_visible_iv); + haoyouLy = (LinearLayout) bottomView.findViewById(R.id.haoyou_ly); + friendVisibleTv = (TextView) bottomView.findViewById(R.id.friend_visible_tv); + friendVisibleIv = (ImageView) bottomView.findViewById(R.id.friend_visible_iv); + zijiLy = (LinearLayout) bottomView.findViewById(R.id.ziji_ly); + onlymeVisibleTv = (TextView) bottomView.findViewById(R.id.onlyme_visible_tv); + onlymeVisibleIv = (ImageView) bottomView.findViewById(R.id.onlyme_visible_iv); + deleteLy = (LinearLayout) bottomView.findViewById(R.id.delete_ly); + deleteTv = (TextView) bottomView.findViewById(R.id.delete_tv); + coloseIvAction.setOnClickListener(v -> bottomSheetDialog.dismiss()); + AlbumBean finalAlbumBean = albumBean; + allVisibleIv.setVisibility(View.GONE); + friendVisibleIv.setVisibility(View.GONE); + onlymeVisibleIv.setVisibility(View.GONE); + + switch (finalAlbumBean.getVisible()) { + case 0: + allVisibleIv.setVisibility(View.VISIBLE); + break; + case 1: + friendVisibleIv.setVisibility(View.VISIBLE); + break; + case 2: + onlymeVisibleIv.setVisibility(View.VISIBLE); + break; + } + allLy.setOnClickListener(v -> { + bottomSheetDialog.dismiss(); + changePost(0, finalAlbumBean, nowPosition); + }); + haoyouLy.setOnClickListener(v -> { + bottomSheetDialog.dismiss(); + + changePost(1, finalAlbumBean, nowPosition); + }); + zijiLy.setOnClickListener(v -> { + bottomSheetDialog.dismiss(); + + changePost(2, finalAlbumBean, nowPosition); + }); + deleteLy.setOnClickListener(v -> { + ActionConfirmDialog actionDialog = new ActionConfirmDialog(TiktokActivity.this, getString(R.string.nqdyscztdt_txt), true); + actionDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + bottomSheetDialog.dismiss(); + deletePost(finalAlbumBean, nowPosition); + } + + @Override + public void toCancel() { + + } + }); + actionDialog.show(); + }); + bottomSheetDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { + @Override + public void onDismiss(DialogInterface dialog) { + getWindow().setNavigationBarColor(getResources().getColor(R.color.black)); + } + }); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + AdaptScreenUtils.setWhiteNavigationBar(bottomSheetDialog); + } + } else { + BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(this, R.style.BottomSheetDialog); + + View bottomView = LayoutInflater.from(TiktokActivity.this).inflate(R.layout.bottom_sheet_layout_action1, null); + bottomSheetDialog.setContentView(bottomView); + bottomSheetDialog.show(); + + coloseIv1 = (TextView) bottomView.findViewById(R.id.colose_iv); + jubaoTv = (TextView) bottomView.findViewById(R.id.jubao_tv); + + coloseIv1.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + bottomSheetDialog.dismiss(); + } + }); + AlbumBean finalAlbumBean = albumBean; + + jubaoTv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + bottomSheetDialog.dismiss(); + Intent intent = new Intent(TiktokActivity.this, ReportActivity.class); + intent.putExtra("type", 2); + intent.putExtra("bean", finalAlbumBean); + startActivity(intent); + } + }); + bottomSheetDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { + @Override + public void onDismiss(DialogInterface dialog) { + getWindow().setNavigationBarColor(getResources().getColor(R.color.black)); + } + }); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + AdaptScreenUtils.setWhiteNavigationBar(bottomSheetDialog); + } + } + } + + private void deletePost(AlbumBean albumBean, int index) { + Api.getInstance().postDelete(albumBean.getPostId()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result feedbackResp) { + ToastX.showShortToast(getString(R.string.shanchu_chenggong_txt)); + albumBean.setIsDelete(1); + RxBus.getInstance().post(albumBean); + if (type == 0) { + + if(CircleFragment.titles.size()==0){ + new Handler().postDelayed(() -> { + finish(); + }, 200); //延迟2秒 + return; + + } + + if(index==CircleFragment.titles.size()){ + new Handler().postDelayed(() -> { + mAdapter.notifyItemRemoved(index); + binding.mRecycler.scrollToPosition(index-1); + }, 200); //延迟2秒 + return; + + } + + if (index < CircleFragment.titles.size()) { + new Handler().postDelayed(() -> { +// mAdapter.notifyItemChanged(index, CircleFragment.titles.get(index)); + mAdapter.notifyItemRemoved(index); + + + }, 200); //延迟2秒 + } + } else if (type == 1) { + + if(CircleFragment1.titles.size()==0){ + new Handler().postDelayed(() -> { + finish(); + }, 200); //延迟2秒 + return; + + } + + + if(index==CircleFragment1.titles.size()){ + new Handler().postDelayed(() -> { + mAdapter.notifyItemRemoved(index); + binding.mRecycler.scrollToPosition(index-1); + }, 200); //延迟2秒 + return; + + } + if (index < CircleFragment1.titles.size()) { + new Handler().postDelayed(() -> { +// mAdapter.notifyItemChanged(index, CircleFragment1.titles.get(index)); + mAdapter.notifyItemRemoved(index); + + }, 200); //延迟2秒 + } + } else { + if(CircleFragment2.titles.size()==0){ + new Handler().postDelayed(() -> { + finish(); + }, 200); //延迟2秒 + return; + + } + + + if(index==CircleFragment2.titles.size()){ + new Handler().postDelayed(() -> { + mAdapter.notifyItemRemoved(index); + binding.mRecycler.scrollToPosition(index-1); + }, 200); //延迟2秒 + return; + } + + if (index < CircleFragment2.titles.size()) { + new Handler().postDelayed(() -> { +// mAdapter.notifyItemChanged(index, CircleFragment2.titles.get(index)); + mAdapter.notifyItemRemoved(index); + + }, 200); //延迟2秒 + } + } +// finish(); + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast(msg); + } + }); + } + + public class CommunityAdapter extends FragmentStateAdapter { + private ArrayList listTitle; + private List listFragment; + + + public CommunityAdapter(@NonNull FragmentActivity fragmentActivity, ArrayList listTitle, List listFragment) { + super(fragmentActivity); + this.listTitle = listTitle; + this.listFragment = listFragment; + } + + + @NonNull + @Override + public Fragment createFragment(int position) { + return listFragment.get(position); + } + + @Override + public int getItemCount() { + return listFragment.size(); + } + + } + + + private void changePost(int i, AlbumBean albumBean, int index) { + Map map = new HashMap<>(); + map.put("visible", i); + map.put("substationId", IMUIKitConfig.SUBSTATIONID); + + Api.getInstance().changePost(albumBean.getPostId(), map) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver() { + @Override + public void onSuccess(Result feedbackResp) { + getInfo(albumBean, index); + ToastX.showShortToast(getString(R.string.xiugaichenggong_txt)); + + } + + @Override + public void onError(int code, String msg) { +// WidgetUtils.showToast(CircleInfoActivity.this, msg, WidgetUtils.ToastType.ERROR); + } + }); + } + + @Override + protected void onResume() { + super.onResume(); + if (hasOut) { + hasOut = false; + playVideoOnResume(); + } + } + + boolean hasOut = false; + + @Override + protected void onPause() { + hasOut = true; + super.onPause(); + } + + @Override + protected void onDestroy() { + if (mAdapter != null) { + mAdapter.dimessRxBus(); + } + super.onDestroy(); + } + + public boolean onTouchEvent(MotionEvent event) { + if (null != this.getCurrentFocus()) { + /** + * 点击空白位置 隐藏软键盘 + */ + InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + return mInputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0); + } + return super.onTouchEvent(event); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/voom/TiktokActivityMe.java b/app/src/main/java/com/dskj/rbchat/voom/TiktokActivityMe.java new file mode 100644 index 0000000..7786361 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/voom/TiktokActivityMe.java @@ -0,0 +1,1038 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.voom; + +import android.Manifest; +import android.content.DialogInterface; +import android.content.Intent; +import android.graphics.Color; +import android.media.MediaPlayer; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.text.TextUtils; +import android.view.LayoutInflater; +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.SeekBar; +import android.widget.TextView; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.OrientationHelper; +import androidx.recyclerview.widget.RecyclerView; +import androidx.viewpager2.adapter.FragmentStateAdapter; +import androidx.viewpager2.widget.ViewPager2; + +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.contact.ReportActivity; +import com.dskj.rbchat.contact.UserInfoActivity; +import com.dskj.rbchat.databinding.ActivityTiktokBinding; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.model.AlbumBean; +import com.dskj.rbchat.model.ListBeanResult; +import com.dskj.rbchat.model.RxBusLoadMoreListBean; +import com.dskj.rbchat.model.RxCommLikeBean; +import com.dskj.rbchat.model.UserShareBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.AdaptScreenUtils; +import com.dskj.rbchat.utils.Constant; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.utils.ShareDateUtils; +import com.dskj.rbchat.voom.comm.CircleFragment1; +import com.dskj.rbchat.voom.comm.CircleFragment2; +import com.dskj.rbchat.voom.comm.CusVideoView; +import com.dskj.rbchat.voom.comm.OnViewPagerListener; +import com.dskj.rbchat.voom.comm.TiktokAdapterMe; +import com.dskj.rbchat.voom.comm.ViewPagerLayoutManager; +import com.google.android.material.bottomsheet.BottomSheetDialog; +import com.google.android.material.tabs.TabLayout; +import com.google.android.material.tabs.TabLayoutMediator; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.msg.MessageBuilder; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.nimlib.sdk.msg.model.IMMessage; +import com.netease.nimlib.sdk.uinfo.UserService; +import com.netease.nimlib.sdk.uinfo.model.NimUserInfo; +import com.netease.yunxin.kit.alog.ALog; +import com.netease.yunxin.kit.chatkit.repo.ChatRepo; +import com.netease.yunxin.kit.chatkit.ui.common.RxBus; +import com.netease.yunxin.kit.chatkit.ui.custom.StickerAttachment; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.utils.AvatarColor; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.common.ui.widgets.ContactAvatarView; +import com.netease.yunxin.kit.common.utils.PermissionUtils; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.model.FriendInfo; +import com.netease.yunxin.kit.corekit.im.provider.FetchCallback; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Timer; +import java.util.TimerTask; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +/** + * Welcome Page is launch page + */ +public class TiktokActivityMe extends BaseActivity implements TiktokAdapterMe.OnToActionListener { + + private static final String TAG = "TiktokActivity"; + private ActivityTiktokBinding binding; + private ViewPagerLayoutManager mLayoutManager; + private ShareDateUtils shareDateUtils; + public static List titlesAlbumBean = new ArrayList<>(); + private String accId; + + @Override + protected void onCreate(Bundle savedInstanceState) { + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + getWindow().setDecorFitsSystemWindows(false); + } else { + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); + } + getWindow().setStatusBarColor(Color.TRANSPARENT); + super.onCreate(savedInstanceState); + + ALog.d(Constant.PROJECT_TAG, TAG, "onCreateView"); + IMApplication.setColdStart(true); + binding = ActivityTiktokBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + accId = getIntent().getStringExtra("userId"); + initView(); + initListener(); + if (DataUtils.get(TiktokActivityMe.this, "fist_tiktok", true)) { + binding.firstTv.setVisibility(View.VISIBLE); + } else { + binding.firstTv.setVisibility(View.GONE); + } + + shareDateUtils = new ShareDateUtils(); + shareDateUtils.getAllSessionList(); + permissionLauncher = registerForActivityResult( + new ActivityResultContracts.RequestMultiplePermissions(), + result -> { + if (result != null) { + for (Map.Entry entry : result.entrySet()) { + String permission = entry.getKey().toString(); + boolean grant = (Boolean) entry.getValue(); + if (grant) { + if (TextUtils.equals( + permission, Manifest.permission.READ_MEDIA_IMAGES) + || TextUtils.equals( + permission, Manifest.permission.READ_MEDIA_VIDEO) + || TextUtils.equals( + permission, Manifest.permission.READ_EXTERNAL_STORAGE)) { + toShareAction(locAlbumBean); + } + } else { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (shouldShowRequestPermissionRationale(permission)) { + ToastX.showShortToast(getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_deny_tips)); + } else { + ToastX.showShortToast(getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_storage)); + } + } + } + } + } + }); + + + RxBus.getInstance().toObservable(RxBusLoadMoreListBean.class) + .subscribeOn(rx.schedulers.Schedulers.io()) + .unsubscribeOn(rx.schedulers.Schedulers.io()) + .subscribe(changeImageViewBean -> { + if (changeImageViewBean.getType() == 2) { + if (titlesAlbumBean.size() % 30 == 0) { + page += 1; + getDateList(); + } + } + }); + } + + int page = 1; + + private void getDateList() { + Map maps = new HashMap<>(); + maps.put("page", page); + maps.put("size", 30); + maps.put("selectType", 2); + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + + Api.getInstance().posts(accId, maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result> feedbackResp) { + if (feedbackResp.data != null && feedbackResp.data.getList() != null && feedbackResp.data.getList().size() > 0) { + if (page == 1) { + titlesAlbumBean = feedbackResp.data.getList(); + initListAdapter(); + + + } else { + titlesAlbumBean.addAll(feedbackResp.data.getList()); + } + } + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast(msg); + } + }); + } + + private void initListAdapter() { + mLayoutManager = new ViewPagerLayoutManager(TiktokActivityMe.this, OrientationHelper.VERTICAL, false); + mAdapter = new TiktokAdapterMe(TiktokActivityMe.this, TiktokActivityMe.this); + binding.mRecycler.setLayoutManager(mLayoutManager); + binding.mRecycler.setAdapter(mAdapter); + mLayoutManager.setOnViewPagerListener(new OnViewPagerListener() { + @Override + public void onInitComplete() { + playVideo(); + + } + + @Override + public void onPageRelease(boolean isNext, int position) { + int index; + if (isNext) { + index = 0; + } else { + index = 1; + } + releaseVideo(index); + } + + @Override + public void onPageSelected(int position, boolean isBottom) { + nowPosition = position; + if (position != getIntent().getIntExtra("index", 0)) { + DataUtils.set(TiktokActivityMe.this, "fist_tiktok", false); + binding.firstTv.setVisibility(View.GONE); + } + if (position < titlesAlbumBean.size()) { + playVideo(); + } + + } + }); + + + } + + + int nowPosition = 0; + + //初始化监听 + private void initListener() { + + + binding.backIv.setOnClickListener(v -> onBackPressed()); + } + + @Override + public void onBackPressed() { + Intent intent = new Intent(); + intent.putExtra("index", nowPosition); + setResult(RESULT_OK, intent); + super.onBackPressed(); + } + + TiktokAdapterMe mAdapter; + + //初始化View + private void initView() { + getDateList(); + } + + Timer mTimer; + TimerTask mTimerTask; + //播放 + private void playVideo() { + View itemView = binding.mRecycler.getChildAt(0); + final CusVideoView mVideoView = itemView.findViewById(R.id.mVideoView); + final ImageView mPlay = itemView.findViewById(R.id.mPlay); + final ImageView mThumb = itemView.findViewById(R.id.mThumb); + final SeekBar progressBar = itemView.findViewById(R.id.progress); + final MediaPlayer[] mMediaPlayer = new MediaPlayer[1]; + mVideoView.start(); + + mVideoView.setOnInfoListener(new MediaPlayer.OnInfoListener() { + @Override + public boolean onInfo(MediaPlayer mp, int what, int extra) { + mMediaPlayer[0] = mp; + mp.setLooping(true); + try { + progressBar.setMax(mp.getDuration()); + progressBar.setProgress(mp.getCurrentPosition()); + mTimer = new Timer(); + mTimerTask = new TimerTask() { + @Override + public void run() { + try { + progressBar.setProgress(mp.getCurrentPosition()); + + }catch (Exception e){ + + } + } + }; + mTimer.schedule(mTimerTask, 0, 30); + progressBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + @Override + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { + + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + + } + + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + if(mp!=null&&progressBar!=null){ + mp.seekTo(progressBar.getProgress()); + } + + } + }); + } catch (Exception e) { + e.printStackTrace(); + } + mThumb.animate().alpha(0).setDuration(200).start(); + return false; + } + }); + + //暂停控制 + mPlay.setOnClickListener(new View.OnClickListener() { + boolean isPlaying = true; + + @Override + public void onClick(View v) { + if (mVideoView.isPlaying()) { + mPlay.animate().alpha(1f).start(); + mVideoView.pause(); + isPlaying = false; + } else { + mPlay.animate().alpha(0f).start(); + mVideoView.start(); + isPlaying = true; + } + } + }); + } + + + //播放 + private void playVideoOnResume() { + View itemView = binding.mRecycler.getChildAt(0); + final CusVideoView mVideoView = itemView.findViewById(R.id.mVideoView); + final ImageView mPlay = itemView.findViewById(R.id.mPlay); + final ImageView mThumb = itemView.findViewById(R.id.mThumb); + final MediaPlayer[] mMediaPlayer = new MediaPlayer[1]; + mThumb.setVisibility(View.VISIBLE); + + mVideoView.start(); + mPlay.animate().alpha(0f).start(); + } + + + //释放 + private void releaseVideo(int index) { + View itemView = binding.mRecycler.getChildAt(index); + final CusVideoView mVideoView = itemView.findViewById(R.id.mVideoView); + final ImageView mThumb = itemView.findViewById(R.id.mThumb); + final ImageView mPlay = itemView.findViewById(R.id.mPlay); + mVideoView.stopPlayback(); +// mThumb.animate().alpha(1).start(); + mPlay.animate().alpha(0f).start(); + } + + private ImageView coloseIvShare; + private RecyclerView recyclerShare; + private EditText commentEtShare; + private TextView shareBt; + private LinearLayoutManager linearLayoutManager; + private CommonAdapter commonAdapter; + private ArrayList titleUsers; + + private ArrayList titleUsersIsCheck; + + private void initList() { + + + linearLayoutManager = new LinearLayoutManager(TiktokActivityMe.this); + linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); + recyclerShare.setLayoutManager(linearLayoutManager); + commonAdapter = new CommonAdapter<>(TiktokActivityMe.this, R.layout.item_share_list, titleUsers) { + @Override + public void convert(ViewHolder holder, UserShareBean s, int index) { + ImageView select_iv = holder.getView(R.id.select_iv); + + ContactAvatarView imageView = holder.getView(R.id.logo_iv); + + if (s.getTeamInfo() != null) { + imageView.setData( + s.getTeamInfo().getIcon(), s.getTeamInfo().getName(), AvatarColor.avatarColor(s.getTeamInfo().getId())); + holder.setText(R.id.title_tv, s.getTeamInfo().getName()); + } else { +// imageView.setData( +// s.getFriendInfo().getAvatar(), s.getFriendInfo().getName(), AvatarColor.avatarColor(s.getFriendInfo().getAccount())); + FriendInfo friendInfo = s.getFriendInfo(); + NimUserInfo user = NIMClient.getService(UserService.class).getUserInfo(friendInfo.getAccount()); + if (user != null) { + holder.setText(R.id.title_tv, user.getName()); + imageView.setData( + user.getAvatar(), user.getName(), AvatarColor.avatarColor(user.getAccount())); + } + + + } + + + if (titleUsersIsCheck.get(index)) { + select_iv.setImageResource(R.mipmap.dialog_item_gou); + } else { + select_iv.setImageResource(R.mipmap.dialog_item_quan); + } + holder.getView(R.id.big_bg).setOnClickListener(v -> { + titleUsersIsCheck.set(index, !titleUsersIsCheck.get(index)); + commonAdapter.notifyItemChanged(index, titleUsersIsCheck.get(index)); + LogUtils.i("0000000000"); + + changeItemButton(); + }); + } + }; + recyclerShare.setAdapter(commonAdapter); + } + + private void changeItemButton() { + LogUtils.i("1111111111111111"); + boolean isSelcet = false; + for (boolean item : titleUsersIsCheck) { + if (item) { + isSelcet = true; + break; + } + } + chagnBottom(isSelcet); + + } + + private void chagnBottom(boolean b) { + LogUtils.i("22222222222:" + b); + + if (b) { + shareBt.setBackground(getResources().getDrawable(R.drawable.button_true_bg)); + shareBt.setEnabled(true); + } else { + shareBt.setBackground(getResources().getDrawable(R.drawable.button_false_bg_new)); + shareBt.setEnabled(false); + + } + } + + private ArrayList titles; + private List listFragment; + private TabLayout tablayout; + private ImageView coloseIv; + private ViewPager2 viewpager; + + private void initShow(AlbumBean albumBean) { + + titles = new ArrayList<>(2); + int size1 = 0; + if (albumBean.getComments() != null && albumBean.getComments().size() > 0) { + size1 = albumBean.getComments().size(); + } + int size2 = 0; + if (albumBean.getLikes() != null && albumBean.getLikes().size() > 0) { + size2 = albumBean.getLikes().size(); + } + titles.add(getString(R.string.pinglun_txt) + "(" + size1 + ")"); + titles.add(getString(R.string.zan_txt) + "(" + size2 + ")"); + + listFragment = new ArrayList<>(); + listFragment.add(CommentFragment.newInstance(0, albumBean)); + listFragment.add(LikeFragment.newInstance(1, albumBean)); + CommunityAdapter adapter = new CommunityAdapter(TiktokActivityMe.this, titles, listFragment); + viewpager.setAdapter(adapter); +//把TabLayout(选项卡布局)和ViewPager2绑定在一起。特别说明一下,下面这行代码是官方给的,特别好使。 + new TabLayoutMediator(tablayout, viewpager, (tab, position) -> tab.setText(titles.get(position))).attach(); + RxBus.getInstance().toObservable(RxCommLikeBean.class) + .subscribeOn(rx.schedulers.Schedulers.io()) + .unsubscribeOn(rx.schedulers.Schedulers.io()) + .subscribe(changeImageViewBean -> {//回顶部 + if (changeImageViewBean.getPostId().equals(albumBean.getPostId())) { + tablayout.getTabAt(0).setText(getString(R.string.pinglun_txt) + "(" + changeImageViewBean.getCommentSize() + ")"); + tablayout.getTabAt(1).setText(getString(R.string.zan_txt) + "(" + changeImageViewBean.getLikeSize() + ")"); + } + }); + + + } + + @Override + public void toUserHead(int nowPosition, AlbumBean albumBean) { + + Intent intent = new Intent(TiktokActivityMe.this, UserInfoActivity.class); + intent.putExtra("uid", albumBean.getUserId() + ""); + startActivity(intent); + } + + @Override + public void toLike(int nowPosition, AlbumBean albumBean) { + + if (isZan(albumBean)) { + deleteZan(albumBean, nowPosition); + } else { + addZan(albumBean, nowPosition); + } + + } + + + private void addZan(AlbumBean albumBean, int index) { + Map map = new HashMap<>(); + map.put("postId", albumBean.getPostId()); + if (!TextUtils.isEmpty(IMUIKitConfig.SUBSTATIONID)) { + map.put("substationId", IMUIKitConfig.SUBSTATIONID); + } + Api.getInstance().postLike(map) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver() { + @Override + public void onSuccess(Result feedbackResp) { + getInfo(albumBean, index); + } + + @Override + public void onError(int code, String msg) { + } + }); + } + + private void deleteZan(AlbumBean albumBean, int index) { + Api.getInstance().postLikeDelete(albumBean.getPostId()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver() { + @Override + public void onSuccess(Result feedbackResp) { + getInfo(albumBean, index); + } + + @Override + public void onError(int code, String msg) { + + } + }); + } + + + private void getInfo(AlbumBean albumBean, int index) { + + Api.getInstance().postsInfo(albumBean.getPostId()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result feedbackResp) { +// CircleFragment.changeBean(feedbackResp.data, index); + + RxBus.getInstance().post(feedbackResp.data); + + } + + @Override + public void onError(int code, String msg) { + + } + }); + } + + + private boolean isZan(AlbumBean albumBean) { + if (albumBean.getLikes() != null && albumBean.getLikes().size() > 0) { + for (int i = 0; i < albumBean.getLikes().size(); i++) { + if ((albumBean.getLikes().get(i).getUserId() + "").equals(IMKitClient.account())) { + return true; + } + } + return false; + } else { + return false; + } + } + + + @Override + public void toComment(int nowPosition, AlbumBean albumBean) { + BottomSheetDialog bottomSheetCommentDialog = new BottomSheetDialog(this, R.style.BottomSheetDialog); + + View bottomView = LayoutInflater.from(TiktokActivityMe.this).inflate(R.layout.bottom_sheet_comment_layout, null); + + tablayout = (TabLayout) bottomView.findViewById(R.id.tablayout); + coloseIv = (ImageView) bottomView.findViewById(R.id.colose_iv); + viewpager = (ViewPager2) bottomView.findViewById(R.id.viewpager); + initShow(albumBean); + + bottomSheetCommentDialog.setContentView(bottomView); + bottomSheetCommentDialog.show(); + + bottomSheetCommentDialog.setOnDismissListener(dialog -> getWindow().setNavigationBarColor(getResources().getColor(R.color.black))); + coloseIv.setOnClickListener(v -> bottomSheetCommentDialog.dismiss()); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + AdaptScreenUtils.setWhiteNavigationBar(bottomSheetCommentDialog); + } + } + + private int album; + private AlbumBean locAlbumBean; + + @Override + public void toShare(int nowPosition, AlbumBean albumBean) { + album = nowPosition; + locAlbumBean = albumBean; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + if (PermissionUtils.hasPermissions( + TiktokActivityMe.this, Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO)) { + toShareAction(albumBean); + } else { + requestCameraPermission( + ); + } + } else { + if (PermissionUtils.hasPermissions( + TiktokActivityMe.this, Manifest.permission.READ_EXTERNAL_STORAGE)) { + toShareAction(albumBean); + } else { + requestCameraPermission( + Manifest.permission.READ_EXTERNAL_STORAGE); + } + } + + + } + + private void toShareAction(AlbumBean albumBean) { + + titleUsers = shareDateUtils.getConverstionShareInfo(); + titleUsersIsCheck = new ArrayList<>(); + for (UserShareBean conversationInfo : titleUsers) { + titleUsersIsCheck.add(false); + } + if (titleUsers == null || titleUsers.size() == 0) { + ToastX.showShortToast(R.string.mykfxfddx_txt); + return; + } + BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(this, R.style.BottomSheetDialog); + + View bottomView = LayoutInflater.from(TiktokActivityMe.this).inflate(R.layout.bottom_sheet_layout, null); + + + coloseIvShare = (ImageView) bottomView.findViewById(R.id.colose_iv); + recyclerShare = (RecyclerView) bottomView.findViewById(R.id.recycler); + commentEtShare = (EditText) bottomView.findViewById(R.id.comment_et); + + shareBt = (TextView) bottomView.findViewById(R.id.share_bt); + initList(); + bottomSheetDialog.setContentView(bottomView); + bottomSheetDialog.show(); + + bottomSheetDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { + @Override + public void onDismiss(DialogInterface dialog) { + getWindow().setNavigationBarColor(getResources().getColor(R.color.black)); + + } + }); + coloseIvShare.setOnClickListener(v -> bottomSheetDialog.dismiss()); + shareBt.setOnClickListener(v -> { + + boolean isSelect = false; + for (Boolean type : titleUsersIsCheck) { + if (type) { + isSelect = true; + } + } + if (!isSelect) { + ToastX.showShortToast(getString(R.string.qxxzyfxddx_txt)); + return; + } + + + //String postId, String picPath, String videoPath,String postContent + //String postId, String picPath, String videoPath, String postContent, String userId, String userAvatar + StickerAttachment customerAttachment = new StickerAttachment(albumBean.getPostId() + "", + albumBean.getPicture1(), albumBean.getVideo(), + albumBean.getText(), albumBean.getUserId() + "", albumBean.getUserAvatar(), albumBean.getUserNickname()); + LogUtils.i("获取到的数据:" + GsonUtils.beanToJSONString(customerAttachment)); + //创建IMMessage,其中sessionId代表会话ID,sessionType会话类型,content代表消息内容,customerAttachment自定义消息 + for (int i = 0; i < titleUsersIsCheck.size(); i++) { + if (titleUsersIsCheck.get(i)) { + toShareMessage(titleUsers.get(i), albumBean, customerAttachment, bottomSheetDialog, commentEtShare.getText().toString().trim()); + } + } + + }); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + AdaptScreenUtils.setWhiteNavigationBar(bottomSheetDialog); + } + } + + private void requestCameraPermission(String permission) { + permissionLauncher.launch(new String[]{permission}); + } + + protected ActivityResultLauncher permissionLauncher; + + private void requestCameraPermission() { + permissionLauncher.launch(new String[]{Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO}); + } + + private void toShareMessage(UserShareBean conversationInfo, AlbumBean albumBean, StickerAttachment customerAttachment, BottomSheetDialog bottomSheetDialog, String fujiaTxt) { + IMMessage customMessage = null; + if (conversationInfo.getTeamInfo() != null) { + customMessage = MessageBuilder.createCustomMessage(conversationInfo.getTeamInfo().getId(), SessionTypeEnum.Team, albumBean.getText(), customerAttachment); + } else if (conversationInfo.getFriendInfo() != null) { + customMessage = MessageBuilder.createCustomMessage(conversationInfo.getFriendInfo().getAccount(), SessionTypeEnum.P2P, albumBean.getText(), customerAttachment); + } + + + LogUtils.i("发送消息结构体:" + GsonUtils.beanToJSONString(customerAttachment)); + if (customMessage != null) { + ChatRepo.sendMessage(customMessage, false, new FetchCallback() { + @Override + public void onSuccess(@Nullable Void unused) { + ToastX.showShortToast(getString(R.string.message_share_success)); + bottomSheetDialog.dismiss(); + } + + @Override + public void onFailed(int i) { + bottomSheetDialog.dismiss(); + } + + @Override + public void onException(@Nullable Throwable throwable) { + bottomSheetDialog.dismiss(); + } + }); + } + + + if (!TextUtils.isEmpty(fujiaTxt)) { + IMMessage customMessage1 = null; + if (conversationInfo.getTeamInfo() != null) { + customMessage1 = MessageBuilder.createTextMessage(conversationInfo.getTeamInfo().getId(), SessionTypeEnum.Team, fujiaTxt); + } else if (conversationInfo.getFriendInfo() != null) { + customMessage1 = MessageBuilder.createTextMessage(conversationInfo.getFriendInfo().getAccount(), SessionTypeEnum.P2P, fujiaTxt); + } + ChatRepo.sendMessage(customMessage1, false, new FetchCallback() { + @Override + public void onSuccess(@Nullable Void unused) { + + } + + @Override + public void onFailed(int i) { + bottomSheetDialog.dismiss(); + } + + @Override + public void onException(@Nullable Throwable throwable) { + } + }); + } + } + + private ImageView coloseIvAction; + private LinearLayout allLy; + private TextView allVisibleTv; + private ImageView allVisibleIv; + private LinearLayout haoyouLy; + private TextView friendVisibleTv; + private ImageView friendVisibleIv; + private LinearLayout zijiLy; + private TextView onlymeVisibleTv; + private ImageView onlymeVisibleIv; + private LinearLayout deleteLy; + private TextView deleteTv; + private TextView coloseIv1; + private TextView jubaoTv; + + @Override + public void toMoreAction(int nowPosition, AlbumBean albumBean) { + if (String.valueOf(albumBean.getUserId()).equals(IMKitClient.account())) { + + BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(this, R.style.BottomSheetDialog); + + View bottomView = LayoutInflater.from(TiktokActivityMe.this).inflate(R.layout.bottom_sheet_layout_action, null); + bottomSheetDialog.setContentView(bottomView); + bottomSheetDialog.show(); + coloseIvAction = (ImageView) bottomView.findViewById(R.id.colose_iv); + allLy = (LinearLayout) bottomView.findViewById(R.id.all_ly); + allVisibleTv = (TextView) bottomView.findViewById(R.id.all_visible_tv); + allVisibleIv = (ImageView) bottomView.findViewById(R.id.all_visible_iv); + haoyouLy = (LinearLayout) bottomView.findViewById(R.id.haoyou_ly); + friendVisibleTv = (TextView) bottomView.findViewById(R.id.friend_visible_tv); + friendVisibleIv = (ImageView) bottomView.findViewById(R.id.friend_visible_iv); + zijiLy = (LinearLayout) bottomView.findViewById(R.id.ziji_ly); + onlymeVisibleTv = (TextView) bottomView.findViewById(R.id.onlyme_visible_tv); + onlymeVisibleIv = (ImageView) bottomView.findViewById(R.id.onlyme_visible_iv); + deleteLy = (LinearLayout) bottomView.findViewById(R.id.delete_ly); + deleteTv = (TextView) bottomView.findViewById(R.id.delete_tv); + coloseIvAction.setOnClickListener(v -> bottomSheetDialog.dismiss()); + bottomSheetDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { + @Override + public void onDismiss(DialogInterface dialog) { + getWindow().setNavigationBarColor(getResources().getColor(R.color.black)); + } + }); + AlbumBean finalAlbumBean = albumBean; + allVisibleIv.setVisibility(View.GONE); + friendVisibleIv.setVisibility(View.GONE); + onlymeVisibleIv.setVisibility(View.GONE); + + switch (finalAlbumBean.getVisible()) { + case 0: + allVisibleIv.setVisibility(View.VISIBLE); + break; + case 1: + friendVisibleIv.setVisibility(View.VISIBLE); + break; + case 2: + onlymeVisibleIv.setVisibility(View.VISIBLE); + break; + } + allLy.setOnClickListener(v -> { + bottomSheetDialog.dismiss(); + changePost(0, finalAlbumBean, nowPosition); + }); + haoyouLy.setOnClickListener(v -> { + bottomSheetDialog.dismiss(); + + changePost(1, finalAlbumBean, nowPosition); + }); + zijiLy.setOnClickListener(v -> { + bottomSheetDialog.dismiss(); + + changePost(2, finalAlbumBean, nowPosition); + }); + deleteLy.setOnClickListener(v -> { + ActionConfirmDialog actionDialog = new ActionConfirmDialog(TiktokActivityMe.this, getString(R.string.nqdyscztdt_txt), true); + actionDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + bottomSheetDialog.dismiss(); + deletePost(finalAlbumBean, nowPosition); + } + + @Override + public void toCancel() { + + } + }); + actionDialog.show(); + }); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + AdaptScreenUtils.setWhiteNavigationBar(bottomSheetDialog); + } + } else { + BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(this, R.style.BottomSheetDialog); + + View bottomView = LayoutInflater.from(TiktokActivityMe.this).inflate(R.layout.bottom_sheet_layout_action1, null); + bottomSheetDialog.setContentView(bottomView); + bottomSheetDialog.show(); + + coloseIv1 = (TextView) bottomView.findViewById(R.id.colose_iv); + jubaoTv = (TextView) bottomView.findViewById(R.id.jubao_tv); + + coloseIv1.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + bottomSheetDialog.dismiss(); + } + }); + AlbumBean finalAlbumBean = albumBean; + + jubaoTv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + bottomSheetDialog.dismiss(); + Intent intent = new Intent(TiktokActivityMe.this, ReportActivity.class); + intent.putExtra("type", 2); + intent.putExtra("bean", finalAlbumBean); + startActivity(intent); + } + }); + bottomSheetDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { + @Override + public void onDismiss(DialogInterface dialog) { + getWindow().setNavigationBarColor(getResources().getColor(R.color.black)); + } + }); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + AdaptScreenUtils.setWhiteNavigationBar(bottomSheetDialog); + } + } + } + + private void deletePost(AlbumBean albumBean, int index) { + Api.getInstance().postDelete(albumBean.getPostId()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver() { + @Override + public void onSuccess(Result feedbackResp) { + ToastX.showShortToast(getString(R.string.shanchu_chenggong_txt)); + albumBean.setIsDelete(1); + titlesAlbumBean.remove(index); + if(titlesAlbumBean.size()==0){ + finish(); + return; + } + + if(index==titlesAlbumBean.size()){ + mAdapter.notifyItemRemoved(index); + binding.mRecycler.scrollToPosition(index-1); + return; + } + + if (index < titlesAlbumBean.size()) { + new Handler().postDelayed(() -> mAdapter.notifyItemRemoved(index), 200); //延迟2秒 + }else{ + + } + +// finish(); + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast(msg); + } + }); + } + + public class CommunityAdapter extends FragmentStateAdapter { + private ArrayList listTitle; + private List listFragment; + + + public CommunityAdapter(@NonNull FragmentActivity fragmentActivity, ArrayList listTitle, List listFragment) { + super(fragmentActivity); + this.listTitle = listTitle; + this.listFragment = listFragment; + } + + + @NonNull + @Override + public Fragment createFragment(int position) { + return listFragment.get(position); + } + + @Override + public int getItemCount() { + return listFragment.size(); + } + + } + + + private void changePost(int i, AlbumBean albumBean, int index) { + Map map = new HashMap<>(); + map.put("visible", i); + map.put("substationId", IMUIKitConfig.SUBSTATIONID); + + Api.getInstance().changePost(albumBean.getPostId(), map) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver() { + @Override + public void onSuccess(Result feedbackResp) { + getInfo(albumBean, index); + ToastX.showShortToast(getString(R.string.xiugaichenggong_txt)); + + } + + @Override + public void onError(int code, String msg) { +// WidgetUtils.showToast(CircleInfoActivity.this, msg, WidgetUtils.ToastType.ERROR); + } + }); + } + + @Override + protected void onResume() { + super.onResume(); + if (hasOut) { + hasOut = false; + playVideoOnResume(); + } + } + + boolean hasOut = false; + + @Override + protected void onPause() { + hasOut = true; + super.onPause(); + } + + @Override + protected void onDestroy() { + if(mAdapter!=null) { + mAdapter.dimessRxBus(); + } + super.onDestroy(); + } + public boolean onTouchEvent(MotionEvent event) { + if(null != this.getCurrentFocus()){ + /** + * 点击空白位置 隐藏软键盘 + */ + InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + return mInputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0); + } + return super .onTouchEvent(event); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/voom/VoomFragment.java b/app/src/main/java/com/dskj/rbchat/voom/VoomFragment.java new file mode 100644 index 0000000..d13e92a --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/voom/VoomFragment.java @@ -0,0 +1,149 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.voom; + +import android.content.Intent; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentActivity; +import androidx.viewpager2.adapter.FragmentStateAdapter; + +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.FragmentVoomBinding; +import com.dskj.rbchat.model.ListBeanResult; +import com.dskj.rbchat.model.MessageBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.Constant; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.voom.comm.CircleFragment1; +import com.dskj.rbchat.voom.comm.CircleFragment2; +import com.google.android.material.tabs.TabLayoutMediator; +import com.netease.yunxin.kit.alog.ALog; +import com.netease.yunxin.kit.common.ui.fragments.BaseFragment; +import com.netease.yunxin.kit.corekit.im.IMKitClient; + +import java.util.ArrayList; +import java.util.List; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class VoomFragment extends BaseFragment { + private FragmentVoomBinding binding; + private ArrayList titles; + private List listFragment; + private CircleFragment discoverFragment; + private CircleFragment1 momentsFragment; + private CircleFragment2 nearbyFragment; + @Nullable + @Override + public View onCreateView( + @NonNull LayoutInflater inflater, + @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + ALog.d(Constant.PROJECT_TAG, "VoomFragment:onCreateView"); + binding = FragmentVoomBinding.inflate(inflater); + return binding.getRoot(); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + initShow(); + } + + private void initShow() { + + titles = new ArrayList<>(3); + titles.add(getString(R.string.tuijian_txt)); + titles.add(getString(R.string.haoyou_txt)); + titles.add(getString(R.string.fujin_txt)); + + listFragment = new ArrayList<>(); + listFragment.add(discoverFragment=CircleFragment.newInstance(0)); + listFragment.add(momentsFragment= CircleFragment1.newInstance(1)); + listFragment.add(nearbyFragment= CircleFragment2.newInstance(3)); + CommunityAdapter adapter = new CommunityAdapter(getActivity(), titles, listFragment); + binding.viewpager.setAdapter(adapter); +//把TabLayout(选项卡布局)和ViewPager2绑定在一起。特别说明一下,下面这行代码是官方给的,特别好使。 + new TabLayoutMediator(binding.tablayout, binding.viewpager, (tab, position) -> tab.setText(titles.get(position))).attach(); + + binding.addCirIv.setOnClickListener(v -> startActivity(new Intent(getActivity(),PushActivity.class))); + binding.notCirIv.setOnClickListener(v -> { + + + + + startActivity(new Intent(getActivity(),MessageActivity.class)); + }); + + } + public class CommunityAdapter extends FragmentStateAdapter { + private ArrayList listTitle; + private List listFragment; + + + public CommunityAdapter(@NonNull FragmentActivity fragmentActivity, ArrayList listTitle, List listFragment) { + super(fragmentActivity); + this.listTitle = listTitle; + this.listFragment = listFragment; + } + + + @NonNull + @Override + public Fragment createFragment(int position) { + return listFragment.get(position); + } + + @Override + public int getItemCount() { + return listFragment.size(); + } + + } + + @Override + public void onResume() { + super.onResume(); + getNotifies(); + } + + private void getNotifies() { + String time = DataUtils.getCurrentTimeType(DataUtils.get(getActivity(),"voom_message_time_"+IMKitClient.account(),IMUIKitConfig.VOOM_MESSAGE_START_TIME)); + Api.getInstance().notifies(IMKitClient.account(),1,1000,time) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result> feedbackResp) { + if(feedbackResp.data.getList()!=null&&feedbackResp.data.getList().size()>0){ + binding.mainAlarmsListItemFlagNumView.setVisibility(View.VISIBLE); + binding.mainAlarmsListItemFlagNumView.setText(feedbackResp.data.getList().size()+""); + + }else{ + binding.mainAlarmsListItemFlagNumView.setVisibility(View.GONE); + + } + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); +// WidgetUtils.showToast(getActivity(), msg, WidgetUtils.ToastType.ERROR); + } + }); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/voom/comm/CircleFragment1.java b/app/src/main/java/com/dskj/rbchat/voom/comm/CircleFragment1.java new file mode 100644 index 0000000..5b608dc --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/voom/comm/CircleFragment1.java @@ -0,0 +1,568 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.voom.comm; + +import android.app.Activity; +import android.content.Intent; +import android.graphics.Bitmap; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.text.TextUtils; +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 androidx.activity.result.ActivityResultLauncher; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.StaggeredGridLayoutManager; + +import com.amap.api.location.AMapLocation; +import com.amap.api.location.AMapLocationClient; +import com.amap.api.location.AMapLocationClientOption; +import com.amap.api.location.AMapLocationListener; +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.DataSource; +import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.bumptech.glide.load.engine.GlideException; +import com.bumptech.glide.request.RequestListener; +import com.bumptech.glide.request.RequestOptions; +import com.bumptech.glide.request.target.ImageViewTarget; +import com.bumptech.glide.request.target.SimpleTarget; +import com.bumptech.glide.request.target.Target; +import com.bumptech.glide.request.transition.Transition; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.databinding.FragmentCircleBinding; +import com.dskj.rbchat.model.AlbumBean; +import com.dskj.rbchat.model.ListBeanResult; +import com.dskj.rbchat.model.RxBusLoadMoreListBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.ApiService; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.AdaptScreenUtils; +import com.dskj.rbchat.utils.AnimUtil; +import com.dskj.rbchat.utils.Constant; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.utils.ScreenUtils; +import com.dskj.rbchat.voom.TiktokActivity; +import com.dskj.rbchat.widget.CircleImageView; +import com.ethanhua.skeleton.Skeleton; +import com.ethanhua.skeleton.SkeletonScreen; +import com.netease.yunxin.kit.alog.ALog; +import com.netease.yunxin.kit.chatkit.repo.ContactRepo; +import com.netease.yunxin.kit.chatkit.ui.common.RxBus; +import com.netease.yunxin.kit.common.ui.fragments.BaseFragment; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.model.FriendInfo; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +public class CircleFragment1 extends BaseFragment { + private FragmentCircleBinding binding; + + AMapLocation aMapLocation; + //声明AMapLocationClientOption对象 + public AMapLocationClientOption mLocationOption = null; + //声明AMapLocationClient类对象 + public AMapLocationClient mLocationClient = null; + //声明定位回调监听器 + public AMapLocationListener mLocationListener; + + public static List titles = new ArrayList<>(); + static CommonAdapter commonAdapter; + private int categoryId; + StaggeredGridLayoutManager linearLayoutManager; + protected ActivityResultLauncher permissionLauncher; + SkeletonScreen skeletonScreen; + + public static void changeBean(AlbumBean albumBean,int pos){ + if(titles.size()>pos){ + titles.set(pos,albumBean); + commonAdapter.notifyItemChanged(pos,albumBean); + } + } + + private void initShowSkeleton() { + skeletonScreen = Skeleton.bind(binding.recyclerview) + .adapter(commonAdapter) + .load(R.layout.discover_child_item_default) + .shimmer(true) // whether show shimmer animation. default is true + .count(10) // the recycler view item count. default is 10 + .color(R.color.color_white) // the shimmer color. default is #a2878787 + .angle(20) // the shimmer angle. default is 20; + .duration(1500) // the shimmer animation duration. default is 1000; + .frozen(false).show(); + } + + int type; + + public static CircleFragment1 newInstance(int status1) { + Bundle bundle = new Bundle(); + bundle.putInt("type", status1); + CircleFragment1 view = new CircleFragment1(); + view.setArguments(bundle); + return view; + } + + @Nullable + @Override + public View onCreateView( + @NonNull LayoutInflater inflater, + @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + ALog.d(Constant.PROJECT_TAG, "CircleFragment:onCreateView"); + binding = FragmentCircleBinding.inflate(inflater); + type = getArguments().getInt("type"); + + return binding.getRoot(); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + initList(); + initRefreshLayout(); + RxBus.getInstance().toObservable(Integer.class) + .subscribeOn(Schedulers.io()) + .unsubscribeOn(Schedulers.io()) + .subscribe(changeImageViewBean -> {//回顶部 + if (changeImageViewBean == 8000 + categoryId) { + binding.recyclerview.scrollToPosition(0); + binding.recyclerview.scrollTo(0, 0); + }else if(changeImageViewBean == IMUIKitConfig.PUSH_CIR_SUCC){ + binding.refreshLayout.autoRefresh(); + } + }); + + RxBus.getInstance().toObservable(AlbumBean.class) + .subscribeOn(Schedulers.io()) + .unsubscribeOn(Schedulers.io()) + .subscribe(changeImageViewBean -> {//回顶部 + if(changeImageViewBean.getIsDelete()==1){ + for (int i = 0; i < titles.size(); i++) { + if (changeImageViewBean.getPostId().equals(titles.get(i).getPostId())) { + titles.remove(i); + commonAdapter.setDates(titles); + changeView(); + break; + } + } + }else { + for (int i = 0; i < titles.size(); i++) { + if (changeImageViewBean.getPostId().equals(titles.get(i).getPostId())) { + titles.set(i, changeImageViewBean); + commonAdapter.notifyItemChanged(i, changeImageViewBean); + break; + } + } + } + }); + + + RxBus.getInstance().toObservable(RxBusLoadMoreListBean.class) + .subscribeOn(Schedulers.io()) + .unsubscribeOn(Schedulers.io()) + .subscribe(changeImageViewBean -> { + if(changeImageViewBean.getType()==1){ + if(titles.size()%30==0) { + pageSize += 1; + getDateList(); + } + } + }); + + String locList = DataUtils.get(getActivity(), "loc_tuijian1_" + IMKitClient.account(), null); + if (TextUtils.isEmpty(locList)) { + binding.refreshLayout.autoRefresh(); + } else { + titles = GsonUtils.getListFromJSON(locList, AlbumBean.class); + changeDateFirst(); + } + + + + + } + + private void changeDateFirst() { + if (titles != null) { + commonAdapter.setDates(titles); + pageSize = 1; + getDateList(); + } + } + + @Override + public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if(requestCode== 888&&resultCode == Activity.RESULT_OK){ + int index = data.getIntExtra("index",0); + binding.recyclerview.scrollToPosition(index); + } + } + + + int pageSize = 1; + + private void initRefreshLayout() { + binding.refreshLayout.setOnRefreshListener(refreshlayout -> { +// titles = initTest(); +// binding.refreshLayout.finishRefresh(); +// binding.refreshLayout.finishLoadMore(); +// commonAdapter.setDates(titles); + + pageSize = 1; + binding.refreshLayout.setVisibility(View.VISIBLE); + binding.refreshLayout.setEnableLoadMore(true); + initShowSkeleton(); + getDateList(); + + }); + binding.refreshLayout.setOnLoadMoreListener(refreshLayout -> { +// List list = initTest(); +// titles.addAll(list); +// commonAdapter.addDates(list); +// binding.refreshLayout.finishRefresh(); +// binding.refreshLayout.finishLoadMore(); + pageSize += 1; + getDateList(); + }); + } + + private void initList() { + RequestOptions requestOptions; + requestOptions = new RequestOptions() + .error(R.mipmap.voom_none_img) + .placeholder(R.mipmap.voom_none_img) + .skipMemoryCache(false) + .diskCacheStrategy(DiskCacheStrategy.RESOURCE); + linearLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL); + linearLayoutManager.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_NONE); +// linearLayoutManager.setReverseLayout(true); + //防止item 交换位置 + binding.recyclerview.addOnScrollListener(new RecyclerView.OnScrollListener() { + @Override + public void onScrollStateChanged(RecyclerView recyclerView, int newState) { + super.onScrollStateChanged(recyclerView, newState); + linearLayoutManager.invalidateSpanAssignments(); //防止第一行到顶部有空白区域 + } + }); + + + binding.recyclerview.setLayoutManager(linearLayoutManager); + commonAdapter = new CommonAdapter(getContext(), R.layout.discover_child_item, titles) { + @Override + public void convert(ViewHolder holder, AlbumBean s, int index) { + TextView textView = holder.getView(R.id.title_tv); + textView.setText(s.getText()); + ImageView video_tag = holder.getView(R.id.video_tag); + String name = s.getUserNickname(); + FriendInfo friendInfo = ContactRepo.getFriend(String.valueOf(s.getUserId())); + if (friendInfo!=null&&!TextUtils.isEmpty(friendInfo.getAlias())) { + name = friendInfo.getAlias(); + } + holder.setText(R.id.user_name_tv,name); + LinearLayout main_content = holder.getView(R.id.big_ly); + AnimUtil.setAnimView(main_content, 1.02f); + main_content.setOnClickListener(v -> { + Intent intent = new Intent(getActivity(), TiktokActivity.class); + intent.putExtra("index",index); + intent.putExtra("type",type); + startActivityForResult(intent,888); + }); + ImageView pic_ic = holder.getView(R.id.pic_ic); + long timeDa = DataUtils.dateToStamp(s.getCreateTime()); + video_tag.setVisibility(View.GONE); + CircleImageView itemHeadCiv = holder.getView(R.id.head_iv); + if(!TextUtils.isEmpty(s.getUserAvatar())) { + if (s.getUserAvatar().startsWith("http")) { + Glide.with(itemHeadCiv) + .load(s.getUserAvatar()) + .placeholder(R.mipmap.default_head_img) + .error(R.mipmap.default_head_img) + .into(itemHeadCiv); + } else { + LogUtils.i("头像地址:" + String.format(IMUIKitConfig.AVATAR_DOWNLOAD_CONTROLLER_URL_ROOT, s.getUserAvatar())); + Glide.with(itemHeadCiv) + .load( IMUIKitConfig.OSS_URL + s.getUserAvatar()) + .placeholder(R.mipmap.default_head_img) + .error(R.mipmap.default_head_img) + .into(itemHeadCiv); + } + }else{ + itemHeadCiv.setImageResource(R.mipmap.default_head_img); + } + + pic_ic.setVisibility(View.VISIBLE); + if(s.getType()!=null) { + if (s.getType() == 1) { + if(!TextUtils.isEmpty(s.getPicture1())) { + if (s.getPicture1().startsWith("http")) { + if (System.currentTimeMillis() - timeDa < IMUIKitConfig.MOMENTS_SOURCE_TIME) { +// Glide.with(getActivity()) +// .load(s.getPicture1().replace("/pic_output/", "/pic_input/")) +// .apply(requestOptions).into(pic_ic); + toUrl(holder,s.getPicture1().replace("/pic_output/", "/pic_input/")); + } else { +// Glide.with(getActivity()) +// .load(s.getPicture1().replace("/pic_input/", "/pic_output/")) +// .apply(requestOptions).into(pic_ic); + toUrl(holder,s.getPicture1().replace("/pic_input/", "/pic_output/")); + + } + } else { +// Glide.with(getActivity()) +// .load(ApiService.URL + s.getPicture1()) +// .into(pic_ic); + toUrl(holder,ApiService.URL + s.getPicture1()); + + } + } + + } else if (s.getType() == 2) { + String url = s.getVideo(); + String picUrl = ""; + video_tag.setVisibility(View.VISIBLE); + + if(!TextUtils.isEmpty(s.getVideo())) { + if (!url.startsWith("http")) { + url = ApiService.URL + s.getVideo(); + picUrl = url; + } else { + +// if (System.currentTimeMillis() - timeDa < IMUIKitConfig.MOMENTS_SOURCE_TIME) { + picUrl = url.replace("video_output", "video_input") + "?x-oss-process=video/snapshot,t_7000,w_300,h_400,f_jpg,m_fast"; +// } else { +// picUrl = url.replace("video_input", "video_output") + "?x-oss-process=video/snapshot,t_7000,w_300,h_400,f_jpg,m_fast"; +// } + + } +// Glide.with(getActivity()) +// .load(picUrl) +// .into(pic_ic); + toUrl(holder,picUrl); + + } + }else{ + pic_ic.setVisibility(View.GONE); + } + if(s.getLikes()==null||s.getLikes().size()==0){ + holder.setText(R.id.like_number_tv,"0"); + }else{ + holder.setText(R.id.like_number_tv,""+s.getLikes().size()); + } + ImageView like_iv = holder.getView(R.id.like_iv); + if(isZan(s)){ + like_iv.setImageResource(R.mipmap.like_t_img); + }else{ + like_iv.setImageResource(R.mipmap.like_f_img); + + } + } + } + }; + binding.recyclerview.setAdapter(commonAdapter); + } + private void toUrl(ViewHolder holder, String s) { + ImageView pic_ic = holder.getView(R.id.pic_ic); + +// try { +// Glide.with(getActivity()) +// .asBitmap() +// .load(s) +// .placeholder(R.mipmap.voom_none_img) +// .error(R.mipmap.voom_none_img) +// .listener(new RequestListener() { +// @Override +// public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) { +// Glide.with(getActivity()) +// .asBitmap() +// .load(s.replace("/pic_output/", "/pic_input/")) +// .placeholder(R.mipmap.voom_none_img) +// .error(R.mipmap.voom_none_img) +// .into(new SimpleTarget() { +// public void onResourceReady(@NonNull Bitmap bitmap, @Nullable Transition transition) { +// //这个bitmap就是你图片url加载得到的结果 +//// //获取bitmap信息,可赋值给外部变量操作,也可在此时行操作。 +// ViewGroup.LayoutParams layoutParams = (ViewGroup.LayoutParams)pic_ic.getLayoutParams();//获取你要填充图片的布局的layoutParam +// //因为是2列,所以宽度是屏幕的一半,高度是根据bitmap的高/宽*屏幕宽的一半 +// layoutParams.width = (ScreenUtils.getScreenWidth()- AdaptScreenUtils.pt2Px(0)) / 2;//这个是布局的宽度 +// +// layoutParams.height = (int) ((float) bitmap.getHeight() / (float) bitmap.getWidth() * layoutParams.width- AdaptScreenUtils.pt2Px(5) ); +// +// pic_ic.setLayoutParams(layoutParams);//容器的宽高设置好了 +// // 然后在改变一下bitmap的宽高 +// (pic_ic).setImageBitmap(bitmap); +// } +// +// +// }); +// return false; +// } +// +// @Override +// public boolean onResourceReady(Bitmap resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) { +// return false; +// } +// }) +// .into(new SimpleTarget() { +// public void onResourceReady(@NonNull Bitmap bitmap, @Nullable Transition transition) { +// //这个bitmap就是你图片url加载得到的结果 +//// //获取bitmap信息,可赋值给外部变量操作,也可在此时行操作。 +// ViewGroup.LayoutParams layoutParams = (ViewGroup.LayoutParams)pic_ic.getLayoutParams();//获取你要填充图片的布局的layoutParam +// //因为是2列,所以宽度是屏幕的一半,高度是根据bitmap的高/宽*屏幕宽的一半 +// layoutParams.width = (ScreenUtils.getScreenWidth()- AdaptScreenUtils.pt2Px(0)) / 2;//这个是布局的宽度 +// +// layoutParams.height = (int) ((float) bitmap.getHeight() / (float) bitmap.getWidth() * layoutParams.width- AdaptScreenUtils.pt2Px(5) ); +// +// pic_ic.setLayoutParams(layoutParams);//容器的宽高设置好了 +// // 然后在改变一下bitmap的宽高 +// (pic_ic).setImageBitmap(bitmap); +// } +// +// +// }); +// +// }catch (Exception e){ +// e.printStackTrace(); +// } + Glide.with(getActivity()) + .load(s.replace("/pic_output/", "/pic_input/")) + .placeholder(R.mipmap.voom_none_img) + .error(R.mipmap.voom_none_img) +// .listener(new RequestListener() { +// @Override +// public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) { +// try { +// Glide.with(getActivity()) +// .load(s.replace("/pic_output/", "/pic_input/")) +// .placeholder(R.mipmap.voom_none_img) +// .error(R.mipmap.voom_none_img) +// .into(pic_ic); +// }catch (Exception ee){ +// +// } +// +// return false; +// } +// +// @Override +// public boolean onResourceReady(Drawable resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) { +// return false; +// } +// }) + .into(pic_ic); + } + + private boolean isZan(AlbumBean albumBean){ + if(albumBean.getLikes()!=null&&albumBean.getLikes().size()>0){ + for (int i = 0;i maps = new HashMap<>(); + maps.put("page", pageSize); + maps.put("size", 30); + maps.put("selectType", type); + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + + Api.getInstance().posts(maps) + .subscribeOn(io.reactivex.schedulers.Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>>() { + @Override + public void onSuccess(Result> feedbackResp) { + changeDate(feedbackResp.data); + + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + binding. refreshLayout.finishRefresh(); + binding. refreshLayout.finishLoadMore(); +// changeView(false); + changeView(); + } + }); + } + + + private void changeDate(ListBeanResult data) { + if (data.getList() != null) { + if (pageSize == 1) { + titles = data.getList(); + if (titles != null) { + commonAdapter.setDates(titles); + if (titles.size() > 0) { + DataUtils.set(getActivity(), "loc_tuijian1_" + IMKitClient.account(), GsonUtils.beanToJSONString(titles)); + } + } + } else { + commonAdapter.addDates(data.getList()); + titles = commonAdapter.getDates(); + LogUtils.i("滑动到哪个位置:"+((titles.size()-data.getList().size())-1)); + binding.recyclerview.scrollToPosition((titles.size()-data.getList().size())-1); +// mLinearLayoutManager.smoothScrollToPosition(recyclerView,null,mList.size()-data.getList().size()); + } + + } + binding.refreshLayout.finishRefresh(); + binding.refreshLayout.finishLoadMore(); + if (data.getList().size() <30) { + binding.refreshLayout.finishLoadMoreWithNoMoreData(); + } + changeView(); + } + + private void changeView() { + if(skeletonScreen!=null) { + skeletonScreen.hide(); + } + if (titles == null || titles.size() == 0) { + if(binding.emtryLy.getVisibility() == View.GONE) { + binding.emtryLy.setVisibility(View.VISIBLE); + binding.refreshLayout.setVisibility(View.GONE); + } + binding.emtryIv.setImageResource(R.mipmap.pyq_nodate_friends); + binding.emtryTv.setText(R.string.zanwushuju_txt); + binding.emtryIv.setOnClickListener(v -> binding.refreshLayout.autoRefresh()); + } else { + if(binding.emtryLy.getVisibility() == View.VISIBLE) { + binding.emtryLy.setVisibility(View.GONE); + binding.refreshLayout.setVisibility(View.VISIBLE); + } + } + } + @Override + public void onResume() { + super.onResume(); + + } +} diff --git a/app/src/main/java/com/dskj/rbchat/voom/comm/CircleFragment2.java b/app/src/main/java/com/dskj/rbchat/voom/comm/CircleFragment2.java new file mode 100644 index 0000000..1360cfe --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/voom/comm/CircleFragment2.java @@ -0,0 +1,685 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.voom.comm; + +import android.Manifest; +import android.app.Activity; +import android.content.Intent; +import android.graphics.Bitmap; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.text.TextUtils; +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 android.widget.Toast; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.StaggeredGridLayoutManager; + +import com.amap.api.location.AMapLocation; +import com.amap.api.location.AMapLocationClient; +import com.amap.api.location.AMapLocationClientOption; +import com.amap.api.location.AMapLocationListener; +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.DataSource; +import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.bumptech.glide.load.engine.GlideException; +import com.bumptech.glide.request.RequestListener; +import com.bumptech.glide.request.RequestOptions; +import com.bumptech.glide.request.target.ImageViewTarget; +import com.bumptech.glide.request.target.SimpleTarget; +import com.bumptech.glide.request.target.Target; +import com.bumptech.glide.request.transition.Transition; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.databinding.FragmentCircleBinding; +import com.dskj.rbchat.model.AlbumBean; +import com.dskj.rbchat.model.ListBeanResult; +import com.dskj.rbchat.model.RxBusLoadMoreListBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.ApiService; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.AdaptScreenUtils; +import com.dskj.rbchat.utils.AnimUtil; +import com.dskj.rbchat.utils.Constant; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.utils.ScreenUtils; +import com.dskj.rbchat.voom.TiktokActivity; +import com.dskj.rbchat.widget.CircleImageView; +import com.ethanhua.skeleton.Skeleton; +import com.ethanhua.skeleton.SkeletonScreen; +import com.netease.yunxin.kit.alog.ALog; +import com.netease.yunxin.kit.chatkit.repo.ContactRepo; +import com.netease.yunxin.kit.chatkit.ui.common.RxBus; +import com.netease.yunxin.kit.chatkit.ui.dialog.PermissionExplainDialog; +import com.netease.yunxin.kit.common.ui.fragments.BaseFragment; +import com.netease.yunxin.kit.common.ui.utils.Permission; +import com.netease.yunxin.kit.common.utils.PermissionUtils; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.model.FriendInfo; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +public class CircleFragment2 extends BaseFragment { + private FragmentCircleBinding binding; + + AMapLocation aMapLocation; + //声明AMapLocationClientOption对象 + public AMapLocationClientOption mLocationOption = null; + //声明AMapLocationClient类对象 + public AMapLocationClient mLocationClient = null; + //声明定位回调监听器 + public AMapLocationListener mLocationListener; + + public static List titles = new ArrayList<>(); + static CommonAdapter commonAdapter; + private int categoryId; + StaggeredGridLayoutManager linearLayoutManager; + protected ActivityResultLauncher permissionLauncher; + SkeletonScreen skeletonScreen; + + public static void changeBean(AlbumBean albumBean,int pos){ + if(titles.size()>pos){ + titles.set(pos,albumBean); + commonAdapter.notifyItemChanged(pos,albumBean); + } + } + + private void initShowSkeleton() { + skeletonScreen = Skeleton.bind(binding.recyclerview) + .adapter(commonAdapter) + .load(R.layout.discover_child_item_default) + .shimmer(true) // whether show shimmer animation. default is true + .count(10) // the recycler view item count. default is 10 + .color(R.color.color_white) // the shimmer color. default is #a2878787 + .angle(20) // the shimmer angle. default is 20; + .duration(1500) // the shimmer animation duration. default is 1000; + .frozen(false).show(); + } + + int type; + + public static CircleFragment2 newInstance(int status1) { + Bundle bundle = new Bundle(); + bundle.putInt("type", status1); + CircleFragment2 view = new CircleFragment2(); + view.setArguments(bundle); + return view; + } + + @Nullable + @Override + public View onCreateView( + @NonNull LayoutInflater inflater, + @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + ALog.d(Constant.PROJECT_TAG, "CircleFragment:onCreateView"); + binding = FragmentCircleBinding.inflate(inflater); + type = getArguments().getInt("type"); + + return binding.getRoot(); + } + + public PermissionExplainDialog permissionExplainDialog; + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + initList(); + initRefreshLayout(); + RxBus.getInstance().toObservable(Integer.class) + .subscribeOn(Schedulers.io()) + .unsubscribeOn(Schedulers.io()) + .subscribe(changeImageViewBean -> {//回顶部 + if (changeImageViewBean == 8000 + categoryId) { + binding.recyclerview.scrollToPosition(0); + binding.recyclerview.scrollTo(0, 0); + }else if(changeImageViewBean == IMUIKitConfig.PUSH_CIR_SUCC){ +// if (type == 3) { + initLocation(); +// } else { +// binding.refreshLayout.autoRefresh(); +// } + } + }); + + RxBus.getInstance().toObservable(AlbumBean.class) + .subscribeOn(Schedulers.io()) + .unsubscribeOn(Schedulers.io()) + .subscribe(changeImageViewBean -> {//回顶部 + if(changeImageViewBean.getIsDelete()==1){ + for (int i = 0; i < titles.size(); i++) { + if (changeImageViewBean.getPostId().equals(titles.get(i).getPostId())) { + titles.remove(i); + commonAdapter.setDates(titles); + changeView(); + break; + } + } + }else { + for (int i = 0; i < titles.size(); i++) { + if (changeImageViewBean.getPostId().equals(titles.get(i).getPostId())) { + titles.set(i, changeImageViewBean); + commonAdapter.notifyItemChanged(i, changeImageViewBean); + break; + } + } + } + }); + + + RxBus.getInstance().toObservable(RxBusLoadMoreListBean.class) + .subscribeOn(Schedulers.io()) + .unsubscribeOn(Schedulers.io()) + .subscribe(changeImageViewBean -> { + if(changeImageViewBean.getType()==3){ + if(titles.size()%30==0) { + pageSize += 1; + getDateList(); + } + } + }); +// if (type == 3) { + initLocation(); +// } else { +// binding.refreshLayout.autoRefresh(); +// } + + + binding.nowOpenTv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + String[] permissions = { + Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION + }; + permissionExplainDialog = new PermissionExplainDialog(getContext(), getResources().getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_location_title), getResources().getString(com.netease.yunxin.kit.chatkit.ui.R.string.permission_location_content)); + permissionExplainDialog.show(); + Permission.requirePermissions(IMKitClient.getApplicationContext(), permissions) + .request( + new Permission.PermissionCallback() { + @Override + public void onGranted(List permissionsGranted) { + permissionExplainDialog.dismiss(); + toLocation(); + } + + @Override + public void onDenial( + List permissionsDenial, List permissionDenialForever) { + permissionExplainDialog.dismiss(); + Toast.makeText(getContext(), com.netease.yunxin.kit.chatkit.ui.R.string.permission_default, Toast.LENGTH_SHORT) + .show(); + } + + @Override + public void onException(Exception exception) { + permissionExplainDialog.dismiss(); + Toast.makeText(getContext(), com.netease.yunxin.kit.chatkit.ui.R.string.permission_default, Toast.LENGTH_SHORT) + .show(); + } + }); + + } + }); + } + + @Override + public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if(requestCode== 888&&resultCode == Activity.RESULT_OK){ + int index = data.getIntExtra("index",0); + binding.recyclerview.scrollToPosition(index); + } + } + + private void toLocation() { + + //设置定位回调监听 + mLocationListener = amapLocation -> { + if (amapLocation != null) { + if (amapLocation.getErrorCode() == 0) { + if (aMapLocation == null) { + aMapLocation = amapLocation; + } + binding.refreshLayout.setVisibility(View.VISIBLE); + binding.dingweiRy.setVisibility(View.GONE); + binding.refreshLayout.autoRefresh(); + //可在其中解析amapLocation获取相应内容。 + LogUtils.i("定位位置:" + amapLocation.getLatitude() + ";;" + amapLocation.getLongitude() + ";" + + amapLocation.getAddress() + ";" + amapLocation.getCountry() + ";" + amapLocation.getCity() + ";"); + } else { + //定位失败时,可通过ErrCode(错误码)信息来确定失败的原因,errInfo是错误信息,详见错误码表。 + + LogUtils.i("AmapError location Error, ErrCode:" + + amapLocation.getErrorCode() + ", errInfo:" + + amapLocation.getErrorInfo()); + + } + } else { + + LogUtils.i("定位数据为空"); + + } + }; + + //初始化AMapLocationClientOption对象 + mLocationOption = new AMapLocationClientOption(); + mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy); + mLocationOption.setOnceLocation(true); + mLocationOption.setOnceLocationLatest(true); + mLocationOption.setHttpTimeOut(20000); + mLocationOption.setLocationCacheEnable(false); + + //初始化定位 + try { + mLocationClient = new AMapLocationClient(getActivity()); + mLocationClient.setLocationOption(mLocationOption); + mLocationClient.setLocationListener(mLocationListener); + mLocationClient.startLocation(); + } catch (Exception e) { + e.printStackTrace(); + } + + } + + + private void initLocation() { + if (aMapLocation != null) { + getDateList(); + } else { + LogUtils.i("111111111111111111"); + showLoc(); + } + + } + + + private void showLoc() { + String[] permissions = { + Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION + }; + if (PermissionUtils.hasPermissions(IMKitClient.getApplicationContext(), permissions)) { + LogUtils.i("22222222222222222222"); + pageSize=1; + toLocation(); + } else { + LogUtils.i("33333333333333333333"); + + toShowNoPer(); + } + + } + + + private void toShowNoPer() { + binding.refreshLayout.setVisibility(View.GONE); + binding.dingweiRy.setVisibility(View.VISIBLE); + } + + + + int pageSize = 1; + + private void initRefreshLayout() { + binding.refreshLayout.setOnRefreshListener(refreshlayout -> { +// titles = initTest(); +// binding.refreshLayout.finishRefresh(); +// binding.refreshLayout.finishLoadMore(); +// commonAdapter.setDates(titles); + + pageSize = 1; + binding.refreshLayout.setVisibility(View.VISIBLE); + binding.refreshLayout.setEnableLoadMore(true); + if (type < 3) { + initShowSkeleton(); + getDateList(); + } else { + initShowSkeleton(); + initLocation(); + } + + }); + binding.refreshLayout.setOnLoadMoreListener(refreshLayout -> { +// List list = initTest(); +// titles.addAll(list); +// commonAdapter.addDates(list); +// binding.refreshLayout.finishRefresh(); +// binding.refreshLayout.finishLoadMore(); + pageSize += 1; + getDateList(); + }); + } + + private void initList() { + RequestOptions requestOptions; + requestOptions = new RequestOptions() + .error(R.mipmap.voom_none_img) + .placeholder(R.mipmap.voom_none_img) + .skipMemoryCache(false) + .diskCacheStrategy(DiskCacheStrategy.RESOURCE); + linearLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL); + linearLayoutManager.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_NONE); +// linearLayoutManager.setReverseLayout(true); + //防止item 交换位置 + binding.recyclerview.addOnScrollListener(new RecyclerView.OnScrollListener() { + @Override + public void onScrollStateChanged(RecyclerView recyclerView, int newState) { + super.onScrollStateChanged(recyclerView, newState); + linearLayoutManager.invalidateSpanAssignments(); //防止第一行到顶部有空白区域 + } + }); + + + binding.recyclerview.setLayoutManager(linearLayoutManager); + commonAdapter = new CommonAdapter(getContext(), R.layout.discover_child_item, titles) { + @Override + public void convert(ViewHolder holder, AlbumBean s, int index) { + TextView textView = holder.getView(R.id.title_tv); + textView.setText(s.getText()); + ImageView video_tag = holder.getView(R.id.video_tag); + String name = s.getUserNickname(); + FriendInfo friendInfo = ContactRepo.getFriend(String.valueOf(s.getUserId())); + if (friendInfo!=null&&!TextUtils.isEmpty(friendInfo.getAlias())) { + name = friendInfo.getAlias(); + } + holder.setText(R.id.user_name_tv,name); + LinearLayout main_content = holder.getView(R.id.big_ly); + AnimUtil.setAnimView(main_content, 1.02f); + main_content.setOnClickListener(v -> { + Intent intent = new Intent(getActivity(), TiktokActivity.class); + intent.putExtra("index",index); + intent.putExtra("type",type); + startActivityForResult(intent,888); + }); + ImageView pic_ic = holder.getView(R.id.pic_ic); + long timeDa = DataUtils.dateToStamp(s.getCreateTime()); + video_tag.setVisibility(View.GONE); + CircleImageView itemHeadCiv = holder.getView(R.id.head_iv); + if(!TextUtils.isEmpty(s.getUserAvatar())) { + if (s.getUserAvatar().startsWith("http")) { + Glide.with(itemHeadCiv) + .load(s.getUserAvatar()) + .placeholder(R.mipmap.default_head_img) + .error(R.mipmap.default_head_img) + .into(itemHeadCiv); + } else { + LogUtils.i("头像地址:" + String.format(IMUIKitConfig.AVATAR_DOWNLOAD_CONTROLLER_URL_ROOT, s.getUserAvatar())); + Glide.with(itemHeadCiv) + .load( IMUIKitConfig.OSS_URL + s.getUserAvatar()) + .placeholder(R.mipmap.default_head_img) + .error(R.mipmap.default_head_img) + .into(itemHeadCiv); + } + }else{ + itemHeadCiv.setImageResource(R.mipmap.default_head_img); + } + + pic_ic.setVisibility(View.VISIBLE); + if(s.getType()!=null) { + if (s.getType() == 1) { + if(!TextUtils.isEmpty(s.getPicture1())) { + if (s.getPicture1().startsWith("http")) { + if (System.currentTimeMillis() - timeDa < IMUIKitConfig.MOMENTS_SOURCE_TIME) { +// Glide.with(getActivity()) +// .load(s.getPicture1().replace("/pic_output/", "/pic_input/")) +// .apply(requestOptions).into(pic_ic); + toUrl(holder,s.getPicture1().replace("/pic_output/", "/pic_input/")); + } else { +// Glide.with(getActivity()) +// .load(s.getPicture1().replace("/pic_input/", "/pic_output/")) +// .apply(requestOptions).into(pic_ic); + toUrl(holder,s.getPicture1().replace("/pic_input/", "/pic_output/")); + + } + } else { +// Glide.with(getActivity()) +// .load(ApiService.URL + s.getPicture1()) +// .into(pic_ic); + toUrl(holder,ApiService.URL + s.getPicture1()); + + } + } + + } else if (s.getType() == 2) { + String url = s.getVideo(); + String picUrl = ""; + video_tag.setVisibility(View.VISIBLE); + + if(!TextUtils.isEmpty(s.getVideo())) { + if (!url.startsWith("http")) { + url = ApiService.URL + s.getVideo(); + picUrl = url; + } else { + +// if (System.currentTimeMillis() - timeDa < IMUIKitConfig.MOMENTS_SOURCE_TIME) { + picUrl = url.replace("video_output", "video_input") + "?x-oss-process=video/snapshot,t_7000,w_300,h_400,f_jpg,m_fast"; +// } else { +// picUrl = url.replace("video_input", "video_output") + "?x-oss-process=video/snapshot,t_7000,w_300,h_400,f_jpg,m_fast"; +// } + + } +// Glide.with(getActivity()) +// .load(picUrl) +// .into(pic_ic); + + toUrl(holder,picUrl); + + } + }else{ + pic_ic.setVisibility(View.GONE); + } + if(s.getLikes()==null||s.getLikes().size()==0){ + holder.setText(R.id.like_number_tv,"0"); + }else{ + holder.setText(R.id.like_number_tv,""+s.getLikes().size()); + } + ImageView like_iv = holder.getView(R.id.like_iv); + if(isZan(s)){ + like_iv.setImageResource(R.mipmap.like_t_img); + }else{ + like_iv.setImageResource(R.mipmap.like_f_img); + + } + } + } + }; + binding.recyclerview.setAdapter(commonAdapter); + } + + private void toUrl(ViewHolder holder, String s) { + ImageView pic_ic = holder.getView(R.id.pic_ic); + +// try { +// Glide.with(getActivity()) +// .asBitmap() +// .load(s) +// .placeholder(R.mipmap.voom_none_img) +// .error(R.mipmap.voom_none_img) +// .listener(new RequestListener() { +// @Override +// public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) { +// Glide.with(getActivity()) +// .asBitmap() +// .load(s.replace("/pic_output/", "/pic_input/")) +// .placeholder(R.mipmap.voom_none_img) +// .error(R.mipmap.voom_none_img) +// .into(new SimpleTarget() { +// public void onResourceReady(@NonNull Bitmap bitmap, @Nullable Transition transition) { +// //这个bitmap就是你图片url加载得到的结果 +//// //获取bitmap信息,可赋值给外部变量操作,也可在此时行操作。 +// ViewGroup.LayoutParams layoutParams = (ViewGroup.LayoutParams)pic_ic.getLayoutParams();//获取你要填充图片的布局的layoutParam +// //因为是2列,所以宽度是屏幕的一半,高度是根据bitmap的高/宽*屏幕宽的一半 +// layoutParams.width = (ScreenUtils.getScreenWidth()- AdaptScreenUtils.pt2Px(0)) / 2;//这个是布局的宽度 +// +// layoutParams.height = (int) ((float) bitmap.getHeight() / (float) bitmap.getWidth() * layoutParams.width- AdaptScreenUtils.pt2Px(5) ); +// +// pic_ic.setLayoutParams(layoutParams);//容器的宽高设置好了 +// // 然后在改变一下bitmap的宽高 +// (pic_ic).setImageBitmap(bitmap); +// } +// +// +// }); +// return false; +// } +// +// @Override +// public boolean onResourceReady(Bitmap resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) { +// return false; +// } +// }) +// .into(new SimpleTarget() { +// public void onResourceReady(@NonNull Bitmap bitmap, @Nullable Transition transition) { +// //这个bitmap就是你图片url加载得到的结果 +//// //获取bitmap信息,可赋值给外部变量操作,也可在此时行操作。 +// ViewGroup.LayoutParams layoutParams = (ViewGroup.LayoutParams)pic_ic.getLayoutParams();//获取你要填充图片的布局的layoutParam +// //因为是2列,所以宽度是屏幕的一半,高度是根据bitmap的高/宽*屏幕宽的一半 +// layoutParams.width = (ScreenUtils.getScreenWidth()- AdaptScreenUtils.pt2Px(0)) / 2;//这个是布局的宽度 +// +// layoutParams.height = (int) ((float) bitmap.getHeight() / (float) bitmap.getWidth() * layoutParams.width- AdaptScreenUtils.pt2Px(5) ); +// +// pic_ic.setLayoutParams(layoutParams);//容器的宽高设置好了 +// // 然后在改变一下bitmap的宽高 +// (pic_ic).setImageBitmap(bitmap); +// } +// +// +// }); +// +// }catch (Exception e){ +// e.printStackTrace(); +// } + Glide.with(getActivity()) + .load(s.replace("/pic_output/", "/pic_input/")) + .placeholder(R.mipmap.voom_none_img) + .error(R.mipmap.voom_none_img) +// .listener(new RequestListener() { +// @Override +// public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) { +// Glide.with(getActivity()) +// .load(s.replace("/pic_output/", "/pic_input/")) +// .placeholder(R.mipmap.voom_none_img) +// .error(R.mipmap.voom_none_img) +// .into(pic_ic); +// return false; +// } +// +// @Override +// public boolean onResourceReady(Drawable resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) { +// return false; +// } +// }) + .into(pic_ic); + } + + private boolean isZan(AlbumBean albumBean){ + if(albumBean.getLikes()!=null&&albumBean.getLikes().size()>0){ + for (int i = 0;i maps = new HashMap<>(); + maps.put("page", pageSize); + maps.put("size", 30); + maps.put("selectType", type); + if ( aMapLocation != null) { + maps.put("longitude", aMapLocation.getLongitude()); + maps.put("latitude", aMapLocation.getLatitude()); + } + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + + Api.getInstance().posts(maps) + .subscribeOn(io.reactivex.schedulers.Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>>() { + @Override + public void onSuccess(Result> feedbackResp) { + changeDate(feedbackResp.data); + + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + binding. refreshLayout.finishRefresh(); + binding. refreshLayout.finishLoadMore(); +// changeView(false); + changeView(); + } + }); + } + + + private void changeDate(ListBeanResult data) { + if (data.getList() != null) { + if (pageSize == 1) { + titles = data.getList(); + commonAdapter.setDates(titles); + } else { + commonAdapter.addDates(data.getList()); + titles = commonAdapter.getDates(); + LogUtils.i("滑动到哪个位置:"+((titles.size()-data.getList().size())-1)); + binding.recyclerview.scrollToPosition((titles.size()-data.getList().size())-1); +// mLinearLayoutManager.smoothScrollToPosition(recyclerView,null,mList.size()-data.getList().size()); + } + + } + binding.refreshLayout.finishRefresh(); + binding.refreshLayout.finishLoadMore(); + if (data.getList().size() <30) { + binding.refreshLayout.finishLoadMoreWithNoMoreData(); + } + changeView(); + } + + private void changeView() { + if(skeletonScreen!=null) { + skeletonScreen.hide(); + } + if (titles == null || titles.size() == 0) { + if(binding.emtryLy.getVisibility() == View.GONE) { + binding.emtryLy.setVisibility(View.VISIBLE); + binding.refreshLayout.setVisibility(View.GONE); + } + binding.emtryIv.setImageResource(R.mipmap.pyq_nodate1); + binding.emtryTv.setText(R.string.zanwushuju_txt); + binding.emtryIv.setOnClickListener(v -> binding.refreshLayout.autoRefresh()); + } else { + if(binding.emtryLy.getVisibility() == View.VISIBLE) { + binding.emtryLy.setVisibility(View.GONE); + binding.refreshLayout.setVisibility(View.VISIBLE); + } + } + } + @Override + public void onResume() { + super.onResume(); + + } +} diff --git a/app/src/main/java/com/dskj/rbchat/voom/comm/CusVideoView.java b/app/src/main/java/com/dskj/rbchat/voom/comm/CusVideoView.java new file mode 100644 index 0000000..e4afd02 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/voom/comm/CusVideoView.java @@ -0,0 +1,33 @@ +package com.dskj.rbchat.voom.comm; + +import android.content.Context; +import android.util.AttributeSet; +import android.widget.VideoView; + +/** + * 作者:created by Jarchie + * 时间:2020/12/7 15:05:57 + * 邮箱:jarchie520@gmail.com + * 说明:自定义宽高VideoView + */ +public class CusVideoView extends VideoView { + public CusVideoView(Context context) { + super(context); + } + + public CusVideoView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public CusVideoView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); +// int width = getDefaultSize(getWidth(), widthMeasureSpec); +// int height = getDefaultSize(getHeight(), heightMeasureSpec); +// setMeasuredDimension(width, height); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/voom/comm/CustomLayoutManager.java b/app/src/main/java/com/dskj/rbchat/voom/comm/CustomLayoutManager.java new file mode 100644 index 0000000..9d2936f --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/voom/comm/CustomLayoutManager.java @@ -0,0 +1,99 @@ +//package com.dskj.rbchat.voom.comm; +// +//import android.content.Context; +//import android.view.View; +// +//import androidx.annotation.NonNull; +//import androidx.recyclerview.widget.LinearLayoutManager; +//import androidx.recyclerview.widget.PagerSnapHelper; +//import androidx.recyclerview.widget.RecyclerView; +// +//import com.dskj.rbchat.utils.StickyTopicScroller; +// +///** +// * 作者:created by Jarchie +// * 时间:2020/12/7 11:12:49 +// * 邮箱:jarchie520@gmail.com +// * 说明:自定义LayoutManager +// */ +//public class CustomLayoutManager extends LinearLayoutManager implements RecyclerView.OnChildAttachStateChangeListener { +// private int mDrift;//位移,用来判断移动方向 +// +// private PagerSnapHelper mPagerSnapHelper; +// private OnPageSlideListener mOnPageSlideListener; +// +// public CustomLayoutManager(Context context) { +// super(context); +// } +// +// public CustomLayoutManager(Context context, int orientation, boolean reverseLayout) { +// super(context, orientation, reverseLayout); +// mPagerSnapHelper = new PagerSnapHelper(); +// } +// +// @Override +// public void onAttachedToWindow(RecyclerView view) { +// view.addOnChildAttachStateChangeListener(this); +// mPagerSnapHelper.attachToRecyclerView(view); +// super.onAttachedToWindow(view); +// } +// +// //Item添加进来 +// @Override +// public void onChildViewAttachedToWindow(@NonNull View view) { +// //播放视频操作,判断将要播放的是上一个视频,还是下一个视频 +// if (mDrift > 0) { //向上 +// if (mOnPageSlideListener != null) +// mOnPageSlideListener.onPageSelected(getPosition(view), true); +// } else { //向下 +// if (mOnPageSlideListener != null) +// mOnPageSlideListener.onPageSelected(getPosition(view), false); +// } +// } +// +// //Item移除出去 +// @Override +// public void onChildViewDetachedFromWindow(@NonNull View view) { +// //暂停播放操作 +// if (mDrift >= 0) { +// if (mOnPageSlideListener != null) +// mOnPageSlideListener.onPageRelease(true, getPosition(view)); +// } else { +// if (mOnPageSlideListener != null) +// mOnPageSlideListener.onPageRelease(false, getPosition(view)); +// } +// } +// +// @Override +// public void onScrollStateChanged(int state) { //滑动状态监听 +// switch (state) { +// case RecyclerView.SCROLL_STATE_IDLE: +// View view = mPagerSnapHelper.findSnapView(this); +// int position = getPosition(view); +// if (mOnPageSlideListener != null) { +// mOnPageSlideListener.onPageSelected(position, position == getItemCount() - 1); +// } +// break; +// } +// } +// +// +////// @Override +//// public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) { +//// StickyTopicScroller stickyTopicScroller = new StickyTopicScroller(recyclerView.getContext()); +//// stickyTopicScroller.setTargetPosition(position); +//// startSmoothScroll(stickyTopicScroller); +//// } +// +// +// @Override +// public int scrollVerticallyBy(int dy, RecyclerView.Recycler recycler, RecyclerView.State state) { +// this.mDrift = dy; +// return super.scrollVerticallyBy(dy, recycler, state); +// } +// +// //接口注入 +// public void setOnPageSlideListener(OnPageSlideListener mOnViewPagerListener) { +// this.mOnPageSlideListener = mOnViewPagerListener; +// } +//} diff --git a/app/src/main/java/com/dskj/rbchat/voom/comm/OnPageSlideListener.java b/app/src/main/java/com/dskj/rbchat/voom/comm/OnPageSlideListener.java new file mode 100644 index 0000000..286bf75 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/voom/comm/OnPageSlideListener.java @@ -0,0 +1,15 @@ +package com.dskj.rbchat.voom.comm; + +/** + * 作者:created by Jarchie + * 时间:2020/12/7 11:20:48 + * 邮箱:jarchie520@gmail.com + * 说明:页面滑动监听 + */ +public interface OnPageSlideListener { + //释放的监听 + void onPageRelease(boolean isNext, int position); + + //选中的监听以及判断是否滑动到底部 + void onPageSelected(int position, boolean isBottom); +} diff --git a/app/src/main/java/com/dskj/rbchat/voom/comm/OnViewPagerListener.java b/app/src/main/java/com/dskj/rbchat/voom/comm/OnViewPagerListener.java new file mode 100644 index 0000000..b3c07df --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/voom/comm/OnViewPagerListener.java @@ -0,0 +1,22 @@ +package com.dskj.rbchat.voom.comm; + +/** + * Created by 钉某人 + * github: https://github.com/DingMouRen + * email: naildingmouren@gmail.com + * 用于ViewPagerLayoutManager的监听 + */ + +public interface OnViewPagerListener { + + /*初始化完成*/ + void onInitComplete(); + + /*释放的监听*/ + void onPageRelease(boolean isNext, int position); + + /*选中的监听以及判断是否滑动到底部*/ + void onPageSelected(int position, boolean isBottom); + + +} diff --git a/app/src/main/java/com/dskj/rbchat/voom/comm/TiktokAdapter.java b/app/src/main/java/com/dskj/rbchat/voom/comm/TiktokAdapter.java new file mode 100644 index 0000000..8dbcf59 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/voom/comm/TiktokAdapter.java @@ -0,0 +1,613 @@ +package com.dskj.rbchat.voom.comm; + +import static android.app.PendingIntent.getActivity; + +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.os.Handler; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewTreeObserver; +import android.widget.ImageView; +import android.widget.ProgressBar; +import android.widget.RelativeLayout; +import android.widget.SeekBar; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.RecyclerView; +import androidx.viewpager2.adapter.FragmentStateAdapter; +import androidx.viewpager2.widget.ViewPager2; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.bumptech.glide.request.RequestOptions; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.model.AlbumBean; +import com.dskj.rbchat.model.RxBusLoadMoreListBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.ApiService; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.voom.CircleFragment; +import com.dskj.rbchat.voom.CirclePicFragment; +import com.dskj.rbchat.voom.TiktokActivity; +import com.dskj.rbchat.widget.CircleImageView; +import com.google.android.material.tabs.TabLayout; +import com.google.android.material.tabs.TabLayoutMediator; +import com.netease.yunxin.kit.chatkit.repo.ContactRepo; +import com.netease.yunxin.kit.chatkit.ui.common.GsonUtils; +import com.netease.yunxin.kit.chatkit.ui.common.RxBus; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.model.FriendInfo; + +import java.util.ArrayList; +import java.util.List; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import rx.Subscription; +import rx.schedulers.Schedulers; + +/** + * 作者:created by Jarchie + * 时间:2020/12/7 10:28:01 + * 邮箱:jarchie520@gmail.com + * 说明:仿抖音主界面适配器 + */ +public class TiktokAdapter extends RecyclerView.Adapter { +// private List mTitles = new ArrayList<>(); +// private List mMarqueeList = new ArrayList<>(); + private Context mContext; + AlbumBean albumBean; + OnToActionListener onToActionListener; + RequestOptions requestOptions; + private Subscription mEventSubscription; + int type; + public interface OnToActionListener { + void toUserHead(int post,AlbumBean albumBean); + void toLike(int post,AlbumBean albumBean); + void toComment(int post,AlbumBean albumBean); + void toShare(int post,AlbumBean albumBean); + void toMoreAction(int post,AlbumBean albumBean); + + } + + + public TiktokAdapter(Context context,OnToActionListener onToActionListener,int type) { + this.mContext = context; + this.onToActionListener = onToActionListener; + this.type = type; + requestOptions = new RequestOptions() + .error(R.mipmap.default_head_img) + .skipMemoryCache(false) + .diskCacheStrategy(DiskCacheStrategy.RESOURCE); + } + + + private boolean isZan(AlbumBean albumBean){ + if(albumBean.getLikes()!=null&&albumBean.getLikes().size()>0){ + for (int i = 0;i {//回顶部 + // commentsTv = holder.itemCommentTv; + // likesTv = holder.itemLikeTv; + if(changeImageViewBean.getIsDelete()==0) { + if (changeImageViewBean.getPostId().equals(albumBean.getPostId())) { + LogUtils.i("给谁点赞重绘UI"); + albumBean = changeImageViewBean; + if (albumBean.getLikes() == null || albumBean.getLikes().size() == 0) { + holder.itemLikeTv.setText(R.string.dianzan_txt); + } else { + holder.itemLikeTv.setText(albumBean.getLikes().size() + ""); + } + if (albumBean.getComments() == null || albumBean.getComments().size() == 0) { + holder.itemCommentTv.setText(R.string.pinglun_txt11); + } else { + holder.itemCommentTv.setText(albumBean.getComments().size() + ""); + } + Drawable drawable2 = holder.itemLikeTv.getResources().getDrawable(R.mipmap.heart_icon); + if (isZan(albumBean)) { + drawable2 = holder.itemLikeTv.getResources().getDrawable(R.mipmap.heart_icon_t); + } + drawable2.setBounds(0, 0, drawable2.getMinimumWidth(), drawable2.getMinimumHeight()); + holder.itemLikeTv.setCompoundDrawables(null, drawable2, null, null); + new Handler().postDelayed(() -> getPostInfo(albumBean, holder, pos), 1000); + + } + } + }); + + } + + private void initShow( AlbumBean albumBean, ViewHolder holder,int pos,boolean isFirst) { + if(isFirst){ + LogUtils.i("什么数据啊1:"+GsonUtils.beanToJSONString(albumBean)); + } + if(!TextUtils.isEmpty(albumBean.getPositionName())){ + holder.locTv.setText(albumBean.getPositionName()); + holder.locTv.setVisibility(View.VISIBLE); + }else{ + holder.locTv.setVisibility(View.GONE); + + } + + String name = albumBean.getUserNickname(); + FriendInfo friendInfo = ContactRepo.getFriend(String.valueOf(albumBean.getUserId())); + if (friendInfo!=null&&!TextUtils.isEmpty(friendInfo.getAlias())) { + name = friendInfo.getAlias(); + } + holder.mTitle.setText("@"+name); + holder.mTitle1.setText(albumBean.getText()); + + + if(albumBean.getLikes()==null||albumBean.getLikes().size()==0){ + holder.itemLikeTv.setText(R.string.dianzan_txt); + }else{ + holder.itemLikeTv.setText(albumBean.getLikes().size()+""); + } + + if(String.valueOf(albumBean.getUserId()).equals(IMKitClient.account())){ + holder.itemMoreTv.setVisibility(View.VISIBLE); + }else{ + holder.itemMoreTv.setVisibility(View.VISIBLE); + } + + + Drawable drawable = holder.itemLikeTv.getResources().getDrawable(R.mipmap.heart_icon); + if(isZan(albumBean)){ + drawable = holder.itemLikeTv.getResources().getDrawable(R.mipmap.heart_icon_t); + } + drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); + holder.itemLikeTv.setCompoundDrawables(null, drawable, null, null); + + if(albumBean.getComments()==null||albumBean.getComments().size()==0){ + holder.itemCommentTv.setText(R.string.pinglun_txt11); + }else{ + holder.itemCommentTv.setText(albumBean.getComments().size()+""); + } + + if(!TextUtils.isEmpty(albumBean.getUserAvatar())) { + if (albumBean.getUserAvatar().startsWith("http")) { + try { + Glide.with(holder.itemHeadCiv) + .load(albumBean.getUserAvatar()) + .placeholder(R.mipmap.default_head_img) + .error(R.mipmap.default_head_img) + .into(holder.itemHeadCiv); + }catch (Exception e){ + e.printStackTrace(); + } + + } else { + LogUtils.i("头像地址:" + String.format(IMUIKitConfig.AVATAR_DOWNLOAD_CONTROLLER_URL_ROOT, albumBean.getUserAvatar())); + try { + Glide.with(holder.itemHeadCiv) + .load(IMUIKitConfig.OSS_URL + albumBean.getUserAvatar()) + .placeholder(R.mipmap.default_head_img) + .error(R.mipmap.default_head_img) + .into(holder.itemHeadCiv); + }catch (Exception e){ + e.printStackTrace(); + } + } + }else{ + holder.itemHeadCiv.setImageResource(R.mipmap.default_head_img); + } + + + holder.mTitle1.setMaxLines(100); + holder.mTitle1.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { + @Override + public boolean onPreDraw() { + //这个回调会调用多次,获取完行数记得注销监听 + holder.mTitle1.getViewTreeObserver().removeOnPreDrawListener(this); + LogUtils.i("行数:"+holder.mTitle1.getLineCount()); + if(holder.mTitle1.getLineCount()>2){ + LogUtils.i("行数:"+holder.mTitle2.getText().toString()+";"+holder.mTitle2.getResources().getString(R.string.full_text_txt)); + + if(holder.mTitle2.getText().toString().equals(holder.mTitle2.getResources().getString(R.string.full_text_txt))) { + holder.mTitle1.setMaxLines(2); + }else{ + holder.mTitle1.setMaxLines(100); + LogUtils.i("行数2:"+holder.mTitle1.getLineCount()); + + } + holder.mTitle2.setVisibility(View.VISIBLE); + }else{ + holder.mTitle2.setVisibility(View.GONE); + } + return false; + } + }); + holder.mTitle2.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(holder.mTitle2.getText().equals(holder.mTitle2.getResources().getString(R.string.full_text_txt))){ + holder.mTitle1.setMaxLines(100); + holder.mTitle2.setText(R.string.shouqi_txt); + }else{ + holder.mTitle1.setMaxLines(2); + holder.mTitle2.setText(holder.mTitle2.getResources().getString(R.string.full_text_txt)); + } + } + }); + + if(isFirst) { + if (albumBean.getType() == 2) { + holder.mThumb.setVisibility(View.VISIBLE); + holder.mVideoView.setVisibility(View.VISIBLE); + holder.showPicRy.setVisibility(View.GONE); +// holder.mThumb.setImageResource(imgs[pos % 2]); + String url = albumBean.getVideo(); + String picUrl = ""; + holder.progress.setVisibility(View.VISIBLE); + if (!TextUtils.isEmpty(albumBean.getVideo())) { + if (!albumBean.getVideo().startsWith("http")) { + url = ApiService.URL + albumBean.getVideo(); + picUrl = url; + } else { + picUrl = url.replace("video_input", "video_output") + "?x-oss-process=video/snapshot,t_7000,w_300,h_400,f_jpg,m_fast"; + } + Glide.with(holder.mThumb.getContext()) + .load(R.mipmap.zhifuzhong_img) + .into(holder.mThumb); +// long timeDa = DataUtils.dateToStamp(albumBean.getCreateTime()); +// if (System.currentTimeMillis() - timeDa < IMUIKitConfig.MOMENTS_SOURCE_TIME) { + url = url.replace("/video_output/", "/video_input/"); + holder.mVideoView.setVideoURI(Uri.parse(url)); +// } else { +//// url = url.replace("/video_input/", "/video_output/"); +// holder.mVideoView.setVideoURI(Uri.parse(url)); +// } + LogUtils.i("播放地址:" + url); + + } + + } else { + holder.progress.setVisibility(View.GONE); + + holder.mThumb.setVisibility(View.GONE); + holder.mVideoView.setVisibility(View.GONE); + holder.showPicRy.setVisibility(View.VISIBLE); + initAdapterPic(holder, albumBean); + } + } + if(type==0){ + if(pos == CircleFragment.titles.size()-1){ + holder.daodile_txt.setVisibility(View.VISIBLE); + }else{ + holder.daodile_txt.setVisibility(View.GONE); + } + holder.itemHeadCiv.setOnClickListener(v -> onToActionListener.toUserHead(pos,albumBean)); + holder.itemLikeTv.setOnClickListener(v -> { +// LogUtils.i("给谁点赞:"+albumBean.getPostId()); + onToActionListener.toLike(pos,albumBean); + }); + holder.itemCommentTv.setOnClickListener(v -> onToActionListener.toComment(pos,albumBean)); + holder.itemShareTv.setOnClickListener(v -> onToActionListener.toShare(pos,albumBean)); + holder.itemMoreTv.setOnClickListener(v -> onToActionListener.toMoreAction(pos,albumBean)); + + if(CircleFragment.titles.size()-pos<5){ + RxBus.getInstance().post(new RxBusLoadMoreListBean(type)); + } + + }else if(type==1){ + if(pos == CircleFragment1.titles.size()-1){ + holder.daodile_txt.setVisibility(View.VISIBLE); + }else{ + holder.daodile_txt.setVisibility(View.GONE); + } + holder.itemHeadCiv.setOnClickListener(v -> onToActionListener.toUserHead(pos,albumBean)); + holder.itemLikeTv.setOnClickListener(v -> onToActionListener.toLike(pos,albumBean)); + holder.itemCommentTv.setOnClickListener(v -> onToActionListener.toComment(pos,albumBean)); + holder.itemShareTv.setOnClickListener(v -> onToActionListener.toShare(pos,albumBean)); + holder.itemMoreTv.setOnClickListener(v -> onToActionListener.toMoreAction(pos,albumBean)); + + if(CircleFragment1.titles.size()-pos<5){ + RxBus.getInstance().post(new RxBusLoadMoreListBean(type)); + } + }else{ + if(pos == CircleFragment2.titles.size()-1){ + holder.daodile_txt.setVisibility(View.VISIBLE); + }else{ + holder.daodile_txt.setVisibility(View.GONE); + } + holder.itemHeadCiv.setOnClickListener(v -> onToActionListener.toUserHead(pos,albumBean)); + holder.itemLikeTv.setOnClickListener(v -> onToActionListener.toLike(pos,albumBean)); + holder.itemCommentTv.setOnClickListener(v -> onToActionListener.toComment(pos,albumBean)); + holder.itemShareTv.setOnClickListener(v -> onToActionListener.toShare(pos,albumBean)); + holder.itemMoreTv.setOnClickListener(v -> onToActionListener.toMoreAction(pos,albumBean)); + + if(CircleFragment2.titles.size()-pos<5){ + RxBus.getInstance().post(new RxBusLoadMoreListBean(type)); + } + } + + + + } + + private void getPostInfo(AlbumBean albumBean1, ViewHolder holder,int pos) { + Api.getInstance().postsInfo(albumBean1.getPostId()) + .subscribeOn(io.reactivex.schedulers.Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result feedbackResp) { + albumBean = feedbackResp.data; + initShow(albumBean,holder,pos,false); + + } + + @Override + public void onError(int code, String msg) { + + } + }); + } + + private ArrayList titles; + private ArrayList titles1; + + private List listFragment; + private void initAdapterPic(ViewHolder holder,AlbumBean dongtaiBean) { + + titles = new ArrayList<>(); + + long timeDa = DataUtils.dateToStamp(dongtaiBean.getCreateTime()); + + if(!TextUtils.isEmpty(dongtaiBean.getPicture1())){ + if(dongtaiBean.getPicture1().startsWith("http")){ +// if(System.currentTimeMillis()-timeDa< IMUIKitConfig.MOMENTS_SOURCE_TIME) { + titles.add(dongtaiBean.getPicture1().replace("/pic_output/","/pic_input/")); +// }else{ +// titles.add(dongtaiBean.getPicture1().replace("/pic_input/","/pic_output/")); +// } + }else { + titles.add(ApiService.URL + dongtaiBean.getPicture1()); + } + } + if(!TextUtils.isEmpty(dongtaiBean.getPicture2())){ + if(dongtaiBean.getPicture2().startsWith("http")){ +// if(System.currentTimeMillis()-timeDa< IMUIKitConfig.MOMENTS_SOURCE_TIME) { + titles.add(dongtaiBean.getPicture2().replace("/pic_output/","/pic_input/")); +// }else{ +// titles.add(dongtaiBean.getPicture2().replace("/pic_input/","/pic_output/")); +// } + }else { + titles.add(ApiService.URL + dongtaiBean.getPicture2()); + } + } + + if(!TextUtils.isEmpty(dongtaiBean.getPicture3())){ + if(dongtaiBean.getPicture3().startsWith("http")){ +// if(System.currentTimeMillis()-timeDa< IMUIKitConfig.MOMENTS_SOURCE_TIME) { + titles.add(dongtaiBean.getPicture3().replace("/pic_output/","/pic_input/")); +// }else{ +// titles.add(dongtaiBean.getPicture3().replace("/pic_input/","/pic_output/")); +// } + }else { + titles.add(ApiService.URL + dongtaiBean.getPicture3()); + } + } + if(!TextUtils.isEmpty(dongtaiBean.getPicture4())){ + if(dongtaiBean.getPicture4().startsWith("http")){ +// if(System.currentTimeMillis()-timeDa< IMUIKitConfig.MOMENTS_SOURCE_TIME) { + titles.add(dongtaiBean.getPicture4().replace("/pic_output/","/pic_input/")); +// }else{ +// titles.add(dongtaiBean.getPicture4().replace("/pic_input/","/pic_output/")); +// } + }else { + titles.add(ApiService.URL + dongtaiBean.getPicture4()); + } + } + if(!TextUtils.isEmpty(dongtaiBean.getPicture5())){ + if(dongtaiBean.getPicture5().startsWith("http")){ +// if(System.currentTimeMillis()-timeDa< IMUIKitConfig.MOMENTS_SOURCE_TIME) { + titles.add(dongtaiBean.getPicture5().replace("/pic_output/","/pic_input/")); +// }else{ +// titles.add(dongtaiBean.getPicture5().replace("/pic_input/","/pic_output/")); +// } + }else { + titles.add(ApiService.URL + dongtaiBean.getPicture5()); + } + } + if(!TextUtils.isEmpty(dongtaiBean.getPicture6())){ + if(dongtaiBean.getPicture6().startsWith("http")){ +// if(System.currentTimeMillis()-timeDa< IMUIKitConfig.MOMENTS_SOURCE_TIME) { + titles.add(dongtaiBean.getPicture6().replace("/pic_output/","/pic_input/")); +// }else{ +// titles.add(dongtaiBean.getPicture6().replace("/pic_input/","/pic_output/")); +// } + }else { + titles.add(ApiService.URL + dongtaiBean.getPicture6()); + } + } + if(!TextUtils.isEmpty(dongtaiBean.getPicture7())){ + if(dongtaiBean.getPicture7().startsWith("http")){ +// if(System.currentTimeMillis()-timeDa< IMUIKitConfig.MOMENTS_SOURCE_TIME) { + titles.add(dongtaiBean.getPicture7().replace("/pic_output/","/pic_input/")); +// }else{ +// titles.add(dongtaiBean.getPicture7().replace("/pic_input/","/pic_output/")); +// } + }else { + titles.add(ApiService.URL + dongtaiBean.getPicture7()); + } + } + if(!TextUtils.isEmpty(dongtaiBean.getPicture8())){ + if(dongtaiBean.getPicture8().startsWith("http")){ +// if(System.currentTimeMillis()-timeDa< IMUIKitConfig.MOMENTS_SOURCE_TIME) { + titles.add(dongtaiBean.getPicture8().replace("/pic_output/","/pic_input/")); +// }else{ +// titles.add(dongtaiBean.getPicture8().replace("/pic_input/","/pic_output/")); +// } + }else { + titles.add(ApiService.URL + dongtaiBean.getPicture8()); + } + } + if(!TextUtils.isEmpty(dongtaiBean.getPicture9())){ + if(dongtaiBean.getPicture9().startsWith("http")){ +// if(System.currentTimeMillis()-timeDa< IMUIKitConfig.MOMENTS_SOURCE_TIME) { + titles.add(dongtaiBean.getPicture9().replace("/pic_output/","/pic_input/")); +// }else{ +// titles.add(dongtaiBean.getPicture9().replace("/pic_input/","/pic_output/")); +// } + }else { + titles.add(ApiService.URL + dongtaiBean.getPicture9()); + } + } + + listFragment = new ArrayList<>(); + titles1 = new ArrayList<>(); + for (int i = 0;i tab.setText(titles.get(position))).attach(); + if(listFragment.size()<2){ + holder.tablayout.setVisibility(View.GONE); + }else{ + holder.tablayout.setVisibility(View.VISIBLE); + + } + } + + public class CommunityAdapter extends FragmentStateAdapter { + private ArrayList listTitle; + private List listFragment; + + + public CommunityAdapter(@NonNull FragmentActivity fragmentActivity, ArrayList listTitle, List listFragment) { + super(fragmentActivity); + this.listTitle = listTitle; + this.listFragment = listFragment; + } + + + @NonNull + @Override + public Fragment createFragment(int position) { + return listFragment.get(position); + } + + @Override + public int getItemCount() { + return listFragment.size(); + } + + } + + + @Override + public int getItemCount() { + if(type==0){ + return CircleFragment.titles.size(); + }else if(type==1){ + return CircleFragment1.titles.size(); + }else{ + return CircleFragment2.titles.size(); + } + } + + public class ViewHolder extends RecyclerView.ViewHolder { + RelativeLayout mRootView; + ImageView mThumb; + ImageView mPlay; + TextView mTitle; + TextView mTitle1; + private RelativeLayout showPicRy; + private ViewPager2 viewPager; + private TabLayout tablayout; + CusVideoView mVideoView; + private CircleImageView itemHeadCiv; + private TextView itemLikeTv; + private TextView itemCommentTv; + private TextView itemShareTv; + private TextView daodile_txt; + private TextView itemMoreTv; + private TextView locTv; + private TextView mTitle2; + private SeekBar progress; + + public ViewHolder(@NonNull View itemView) { + super(itemView); + mRootView = itemView.findViewById(R.id.mRootView); + mThumb = itemView.findViewById(R.id.mThumb); + mPlay = itemView.findViewById(R.id.mPlay); + mVideoView = itemView.findViewById(R.id.mVideoView); + mTitle = itemView.findViewById(R.id.mTitle); + mTitle1 = itemView.findViewById(R.id.mTitle1); + mTitle2 = itemView.findViewById(R.id.mTitle2); + daodile_txt = itemView.findViewById(R.id.daodile_txt); +// mMarquee = itemView.findViewById(R.id.mMarquee); + showPicRy = (RelativeLayout) itemView.findViewById(R.id.show_pic_ry); + viewPager = (ViewPager2) itemView.findViewById(R.id.viewPager); + tablayout = (TabLayout) itemView.findViewById(R.id.tablayout); + itemMoreTv= (TextView) itemView.findViewById(R.id.item_more_tv); + itemHeadCiv = (CircleImageView) itemView.findViewById(R.id.item_head_civ); + itemLikeTv = (TextView) itemView.findViewById(R.id.item_like_tv); + itemCommentTv = (TextView) itemView.findViewById(R.id.item_comment_tv); + itemShareTv = (TextView) itemView.findViewById(R.id.item_share_tv); + locTv = itemView.findViewById(R.id.loc_tv); + + progress = (SeekBar) itemView.findViewById(R.id.progress); + + } + } + +} diff --git a/app/src/main/java/com/dskj/rbchat/voom/comm/TiktokAdapterMe.java b/app/src/main/java/com/dskj/rbchat/voom/comm/TiktokAdapterMe.java new file mode 100644 index 0000000..95823a4 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/voom/comm/TiktokAdapterMe.java @@ -0,0 +1,550 @@ +package com.dskj.rbchat.voom.comm; + +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.os.Handler; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewTreeObserver; +import android.widget.ImageView; +import android.widget.RelativeLayout; +import android.widget.SeekBar; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.RecyclerView; +import androidx.viewpager2.adapter.FragmentStateAdapter; +import androidx.viewpager2.widget.ViewPager2; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.bumptech.glide.request.RequestOptions; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.model.AlbumBean; +import com.dskj.rbchat.model.RxBusLoadMoreListBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.ApiService; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.voom.CirclePicFragment; +import com.dskj.rbchat.voom.TiktoInfokActivity; +import com.dskj.rbchat.voom.TiktokActivityMe; +import com.dskj.rbchat.widget.CircleImageView; +import com.google.android.material.tabs.TabLayout; +import com.google.android.material.tabs.TabLayoutMediator; +import com.netease.yunxin.kit.chatkit.ui.common.RxBus; +import com.netease.yunxin.kit.corekit.im.IMKitClient; + +import java.util.ArrayList; +import java.util.List; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import rx.Subscription; +import rx.schedulers.Schedulers; + +/** + * 作者:created by Jarchie + * 时间:2020/12/7 10:28:01 + * 邮箱:jarchie520@gmail.com + * 说明:仿抖音主界面适配器 + */ +public class TiktokAdapterMe extends RecyclerView.Adapter { + // private List mTitles = new ArrayList<>(); +// private List mMarqueeList = new ArrayList<>(); + private Context mContext; + AlbumBean albumBean; + OnToActionListener onToActionListener; + RequestOptions requestOptions; + private Subscription mEventSubscription; + + public interface OnToActionListener { + void toUserHead(int post, AlbumBean albumBean); + + void toLike(int post, AlbumBean albumBean); + + void toComment(int post, AlbumBean albumBean); + + void toShare(int post, AlbumBean albumBean); + + void toMoreAction(int post, AlbumBean albumBean); + + } + + + public TiktokAdapterMe(Context context, OnToActionListener onToActionListener) { + this.mContext = context; + this.onToActionListener = onToActionListener; + requestOptions = new RequestOptions() + .error(R.mipmap.default_head_img) + .skipMemoryCache(false) + .diskCacheStrategy(DiskCacheStrategy.RESOURCE); + } + + + private boolean isZan(AlbumBean albumBean) { + if (albumBean.getLikes() != null && albumBean.getLikes().size() > 0) { + for (int i = 0; i < albumBean.getLikes().size(); i++) { + if ((albumBean.getLikes().get(i).getUserId() + "").equals(IMKitClient.account())) { + return true; + } + } + return false; + } else { + return false; + } + } + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { + return new ViewHolder(LayoutInflater.from(mContext).inflate(R.layout.item_tiktok_layout, viewGroup, false)); + } + + @Override + public void onBindViewHolder(@NonNull final ViewHolder holder, int pos) { + //第一种方式:获取视频第一帧作为封面图片 +// MediaMetadataRetriever media = new MediaMetadataRetriever(); +// media.setDataSource(mContext,Uri.parse("android.resource://" + mContext.getPackageName() + "/" + videos[pos % 2])); +// holder.mThumb.setImageBitmap(media.getFrameAtTime()); + //第二种方式:使用固定图片作为封面图片 + albumBean = TiktokActivityMe.titlesAlbumBean.get(pos); + + + getPostInfo(albumBean, holder, pos); + initShow(albumBean, holder, pos, true); + mEventSubscription = RxBus.getInstance().toObservable(AlbumBean.class) + .subscribeOn(Schedulers.io()) + .unsubscribeOn(Schedulers.io()) + .subscribe(changeImageViewBean -> {//回顶部 + if (changeImageViewBean.getPostId().equals(albumBean.getPostId())) { + albumBean = changeImageViewBean; + if (albumBean.getLikes() == null || albumBean.getLikes().size() == 0) { + holder.itemLikeTv.setText(R.string.dianzan_txt); + } else { + holder.itemLikeTv.setText(albumBean.getLikes().size() + ""); + } + if (albumBean.getComments() == null || albumBean.getComments().size() == 0) { + holder.itemCommentTv.setText(R.string.pinglun_txt11); + } else { + holder.itemCommentTv.setText(albumBean.getComments().size() + ""); + } + Drawable drawable2 = holder.itemLikeTv.getResources().getDrawable(R.mipmap.heart_icon); + if (isZan(albumBean)) { + drawable2 = holder.itemLikeTv.getResources().getDrawable(R.mipmap.heart_icon_t); + } + drawable2.setBounds(0, 0, drawable2.getMinimumWidth(), drawable2.getMinimumHeight()); + holder.itemLikeTv.setCompoundDrawables(null, drawable2, null, null); + new Handler().postDelayed(() -> getPostInfo(albumBean, holder, pos), 1000); + + } + }); + + } + + public void dimessRxBus() { + if (mEventSubscription != null) { + mEventSubscription.unsubscribe(); + } + } + + private void initShow(AlbumBean albumBean, ViewHolder holder, int pos, boolean isFirst) { + + if (!TextUtils.isEmpty(albumBean.getPositionName())) { + holder.locTv.setText(albumBean.getPositionName()); + holder.locTv.setVisibility(View.VISIBLE); + } else { + holder.locTv.setVisibility(View.GONE); + + } + holder.mTitle.setText("@" + albumBean.getUserNickname()); + holder.mTitle1.setText(albumBean.getText()); + +// commentsTv = holder.itemCommentTv; +// likesTv = holder.itemLikeTv; + if (albumBean.getLikes() == null || albumBean.getLikes().size() == 0) { + holder.itemLikeTv.setText(R.string.dianzan_txt); + } else { + holder.itemLikeTv.setText(albumBean.getLikes().size() + ""); + } + if (String.valueOf(albumBean.getUserId()).equals(IMKitClient.account())) { + holder.itemMoreTv.setVisibility(View.VISIBLE); + } else { + holder.itemMoreTv.setVisibility(View.VISIBLE); + } + + Drawable drawable = holder.itemLikeTv.getResources().getDrawable(R.mipmap.heart_icon); + if (isZan(albumBean)) { + drawable = holder.itemLikeTv.getResources().getDrawable(R.mipmap.heart_icon_t); + } + drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight()); + holder.itemLikeTv.setCompoundDrawables(null, drawable, null, null); + + if (albumBean.getComments() == null || albumBean.getComments().size() == 0) { + holder.itemCommentTv.setText(R.string.pinglun_txt11); + } else { + holder.itemCommentTv.setText(albumBean.getComments().size() + ""); + } + + if (!TextUtils.isEmpty(albumBean.getUserAvatar())) { + if (albumBean.getUserAvatar().startsWith("http")) { + try { + + + Glide.with(holder.itemHeadCiv) + .load(albumBean.getUserAvatar()) + .error(R.mipmap.default_head_img) + .placeholder(R.mipmap.default_head_img) + .apply(requestOptions).into(holder.itemHeadCiv); + }catch (Exception e){ + e.printStackTrace(); + } + } else { + LogUtils.i("头像地址:" + String.format(IMUIKitConfig.AVATAR_DOWNLOAD_CONTROLLER_URL_ROOT, albumBean.getUserAvatar())); + try { + Glide.with(holder.itemHeadCiv) + .load(IMUIKitConfig.OSS_URL + albumBean.getUserAvatar()) + .apply(requestOptions).into(holder.itemHeadCiv); + }catch (Exception e){ + e.printStackTrace(); + } + + } + }else{ + holder.itemHeadCiv.setImageResource(R.mipmap.default_head_img); + } + + holder.mTitle1.setMaxLines(100); + holder.mTitle1.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { + @Override + public boolean onPreDraw() { + //这个回调会调用多次,获取完行数记得注销监听 + holder.mTitle1.getViewTreeObserver().removeOnPreDrawListener(this); + LogUtils.i("行数:" + holder.mTitle1.getLineCount()); + if (holder.mTitle1.getLineCount() > 2) { + LogUtils.i("行数:" + holder.mTitle2.getText().toString() + ";" + holder.mTitle2.getResources().getString(R.string.full_text_txt)); + + if (holder.mTitle2.getText().toString().equals(holder.mTitle2.getResources().getString(R.string.full_text_txt))) { + holder.mTitle1.setMaxLines(2); + } else { + holder.mTitle1.setMaxLines(100); + LogUtils.i("行数2:" + holder.mTitle1.getLineCount()); + + } + holder.mTitle2.setVisibility(View.VISIBLE); + } else { + holder.mTitle2.setVisibility(View.GONE); + } + return false; + } + }); + holder.mTitle2.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (holder.mTitle2.getText().equals(holder.mTitle2.getResources().getString(R.string.full_text_txt))) { + holder.mTitle1.setMaxLines(100); + holder.mTitle2.setText(R.string.shouqi_txt); + } else { + holder.mTitle1.setMaxLines(2); + holder.mTitle2.setText(holder.mTitle2.getResources().getString(R.string.full_text_txt)); + } + } + }); + + + if (isFirst) { + if (albumBean.getType() == 2) { + holder.progress.setVisibility(View.VISIBLE); + + holder.mThumb.setVisibility(View.VISIBLE); + holder.mVideoView.setVisibility(View.VISIBLE); + holder.showPicRy.setVisibility(View.GONE); +// holder.mThumb.setImageResource(imgs[pos % 2]); + String url = albumBean.getVideo(); + String picUrl = ""; + if (!TextUtils.isEmpty(albumBean.getVideo())) { + if (!albumBean.getVideo().startsWith("http")) { + url = ApiService.URL + albumBean.getVideo(); + picUrl = url; + } else { + picUrl = url.replace("video_input", "video_output") + "?x-oss-process=video/snapshot,t_7000,w_300,h_400,f_jpg,m_fast"; + } + Glide.with(holder.mThumb.getContext()) + .load(R.mipmap.zhifuzhong_img) + .into(holder.mThumb); +// long timeDa = DataUtils.dateToStamp(albumBean.getCreateTime()); +// if (System.currentTimeMillis() - timeDa < IMUIKitConfig.MOMENTS_SOURCE_TIME) { + url = url.replace("/video_output/", "/video_input/"); + holder.mVideoView.setVideoURI(Uri.parse(url)); +// } else { +//// url = url.replace("/video_input/", "/video_output/"); +// holder.mVideoView.setVideoURI(Uri.parse(url)); +// } + LogUtils.i("播放地址:" + url); + + } + + } else { + holder.progress.setVisibility(View.GONE); + + holder.mThumb.setVisibility(View.GONE); + holder.mVideoView.setVisibility(View.GONE); + holder.showPicRy.setVisibility(View.VISIBLE); + initAdapterPic(holder, albumBean); + + } + } + if (pos == TiktokActivityMe.titlesAlbumBean.size() - 1) { + holder.daodile_txt.setVisibility(View.VISIBLE); + } else { + holder.daodile_txt.setVisibility(View.GONE); + } + holder.itemHeadCiv.setOnClickListener(v -> onToActionListener.toUserHead(pos, albumBean)); + holder.itemLikeTv.setOnClickListener(v -> onToActionListener.toLike(pos, albumBean)); + holder.itemCommentTv.setOnClickListener(v -> onToActionListener.toComment(pos, albumBean)); + holder.itemShareTv.setOnClickListener(v -> onToActionListener.toShare(pos, albumBean)); + holder.itemMoreTv.setOnClickListener(v -> onToActionListener.toMoreAction(pos, albumBean)); + + if (TiktokActivityMe.titlesAlbumBean.size() - pos < 5) { + RxBus.getInstance().post(new RxBusLoadMoreListBean(2)); + } + + } + + + private void getPostInfo(AlbumBean albumBean1, ViewHolder holder, int pos) { + Api.getInstance().postsInfo(albumBean1.getPostId()) + .subscribeOn(io.reactivex.schedulers.Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result feedbackResp) { + albumBean = feedbackResp.data; + initShow(albumBean, holder, pos, false); + + } + + @Override + public void onError(int code, String msg) { + + } + }); + } + + + private ArrayList titles; + private ArrayList titles1; + + private List listFragment; + + private void initAdapterPic(ViewHolder holder, AlbumBean dongtaiBean) { + + titles = new ArrayList<>(); + + long timeDa = DataUtils.dateToStamp(dongtaiBean.getCreateTime()); + + if (!TextUtils.isEmpty(dongtaiBean.getPicture1())) { + if (dongtaiBean.getPicture1().startsWith("http")) { +// if (System.currentTimeMillis() - timeDa < IMUIKitConfig.MOMENTS_SOURCE_TIME) { + titles.add(dongtaiBean.getPicture1().replace("/pic_output/", "/pic_input/")); +// } else { +// titles.add(dongtaiBean.getPicture1().replace("/pic_input/", "/pic_output/")); +// } + } else { + titles.add(ApiService.URL + dongtaiBean.getPicture1()); + } + } + if (!TextUtils.isEmpty(dongtaiBean.getPicture2())) { + if (dongtaiBean.getPicture2().startsWith("http")) { +// if (System.currentTimeMillis() - timeDa < IMUIKitConfig.MOMENTS_SOURCE_TIME) { + titles.add(dongtaiBean.getPicture2().replace("/pic_output/", "/pic_input/")); +// } else { +// titles.add(dongtaiBean.getPicture2().replace("/pic_input/", "/pic_output/")); +// } + } else { + titles.add(ApiService.URL + dongtaiBean.getPicture2()); + } + } + + if (!TextUtils.isEmpty(dongtaiBean.getPicture3())) { + if (dongtaiBean.getPicture3().startsWith("http")) { +// if (System.currentTimeMillis() - timeDa < IMUIKitConfig.MOMENTS_SOURCE_TIME) { + titles.add(dongtaiBean.getPicture3().replace("/pic_output/", "/pic_input/")); +// } else { +// titles.add(dongtaiBean.getPicture3().replace("/pic_input/", "/pic_output/")); +// } + } else { + titles.add(ApiService.URL + dongtaiBean.getPicture3()); + } + } + if (!TextUtils.isEmpty(dongtaiBean.getPicture4())) { + if (dongtaiBean.getPicture4().startsWith("http")) { +// if (System.currentTimeMillis() - timeDa < IMUIKitConfig.MOMENTS_SOURCE_TIME) { + titles.add(dongtaiBean.getPicture4().replace("/pic_output/", "/pic_input/")); +// } else { +// titles.add(dongtaiBean.getPicture4().replace("/pic_input/", "/pic_output/")); +// } + } else { + titles.add(ApiService.URL + dongtaiBean.getPicture4()); + } + } + if (!TextUtils.isEmpty(dongtaiBean.getPicture5())) { + if (dongtaiBean.getPicture5().startsWith("http")) { +// if (System.currentTimeMillis() - timeDa < IMUIKitConfig.MOMENTS_SOURCE_TIME) { + titles.add(dongtaiBean.getPicture5().replace("/pic_output/", "/pic_input/")); +// } else { +// titles.add(dongtaiBean.getPicture5().replace("/pic_input/", "/pic_output/")); +// } + } else { + titles.add(ApiService.URL + dongtaiBean.getPicture5()); + } + } + if (!TextUtils.isEmpty(dongtaiBean.getPicture6())) { + if (dongtaiBean.getPicture6().startsWith("http")) { +// if (System.currentTimeMillis() - timeDa < IMUIKitConfig.MOMENTS_SOURCE_TIME) { + titles.add(dongtaiBean.getPicture6().replace("/pic_output/", "/pic_input/")); +// } else { +// titles.add(dongtaiBean.getPicture6().replace("/pic_input/", "/pic_output/")); +// } + } else { + titles.add(ApiService.URL + dongtaiBean.getPicture6()); + } + } + if (!TextUtils.isEmpty(dongtaiBean.getPicture7())) { + if (dongtaiBean.getPicture7().startsWith("http")) { +// if (System.currentTimeMillis() - timeDa < IMUIKitConfig.MOMENTS_SOURCE_TIME) { + titles.add(dongtaiBean.getPicture7().replace("/pic_output/", "/pic_input/")); +// } else { +// titles.add(dongtaiBean.getPicture7().replace("/pic_input/", "/pic_output/")); +// } + } else { + titles.add(ApiService.URL + dongtaiBean.getPicture7()); + } + } + if (!TextUtils.isEmpty(dongtaiBean.getPicture8())) { + if (dongtaiBean.getPicture8().startsWith("http")) { +// if (System.currentTimeMillis() - timeDa < IMUIKitConfig.MOMENTS_SOURCE_TIME) { + titles.add(dongtaiBean.getPicture8().replace("/pic_output/", "/pic_input/")); +// } else { +// titles.add(dongtaiBean.getPicture8().replace("/pic_input/", "/pic_output/")); +// } + } else { + titles.add(ApiService.URL + dongtaiBean.getPicture8()); + } + } + if (!TextUtils.isEmpty(dongtaiBean.getPicture9())) { + if (dongtaiBean.getPicture9().startsWith("http")) { +// if (System.currentTimeMillis() - timeDa < IMUIKitConfig.MOMENTS_SOURCE_TIME) { + titles.add(dongtaiBean.getPicture9().replace("/pic_output/", "/pic_input/")); +// } else { +// titles.add(dongtaiBean.getPicture9().replace("/pic_input/", "/pic_output/")); +// } + } else { + titles.add(ApiService.URL + dongtaiBean.getPicture9()); + } + } + + listFragment = new ArrayList<>(); + titles1 = new ArrayList<>(); + for (int i = 0; i < titles.size(); i++) { + titles1.add(""); + listFragment.add(CirclePicFragment.newInstance(titles.get(i))); + + } + TiktokActivityMe activity = (TiktokActivityMe) holder.showPicRy.getContext(); + CommunityAdapter adapter = new CommunityAdapter(activity, titles, listFragment); + holder.viewPager.setAdapter(adapter); + //把TabLayout(选项卡布局)和ViewPager2绑定在一起。特别说明一下,下面这行代码是官方给的,特别好使。 + new TabLayoutMediator(holder.tablayout, holder.viewPager, (tab, position) -> tab.setText(titles.get(position))).attach(); + if (listFragment.size() < 2) { + holder.tablayout.setVisibility(View.GONE); + } else { + holder.tablayout.setVisibility(View.VISIBLE); + + } + } + + public class CommunityAdapter extends FragmentStateAdapter { + private ArrayList listTitle; + private List listFragment; + + + public CommunityAdapter(@NonNull FragmentActivity fragmentActivity, ArrayList listTitle, List listFragment) { + super(fragmentActivity); + this.listTitle = listTitle; + this.listFragment = listFragment; + } + + + @NonNull + @Override + public Fragment createFragment(int position) { + return listFragment.get(position); + } + + @Override + public int getItemCount() { + return listFragment.size(); + } + + } + + + @Override + public int getItemCount() { + return TiktokActivityMe.titlesAlbumBean.size(); + } + + public class ViewHolder extends RecyclerView.ViewHolder { + RelativeLayout mRootView; + ImageView mThumb; + ImageView mPlay; + TextView mTitle; + TextView mTitle1; + private RelativeLayout showPicRy; + private ViewPager2 viewPager; + private TabLayout tablayout; + CusVideoView mVideoView; + private CircleImageView itemHeadCiv; + private TextView itemLikeTv; + private TextView itemCommentTv; + private TextView itemShareTv; + private TextView daodile_txt; + private TextView itemMoreTv; + private TextView locTv; + private TextView mTitle2; + private SeekBar progress; + + public ViewHolder(@NonNull View itemView) { + super(itemView); + mRootView = itemView.findViewById(R.id.mRootView); + mThumb = itemView.findViewById(R.id.mThumb); + mPlay = itemView.findViewById(R.id.mPlay); + mVideoView = itemView.findViewById(R.id.mVideoView); + mTitle = itemView.findViewById(R.id.mTitle); + mTitle1 = itemView.findViewById(R.id.mTitle1); + daodile_txt = itemView.findViewById(R.id.daodile_txt); +// mMarquee = itemView.findViewById(R.id.mMarquee); + showPicRy = (RelativeLayout) itemView.findViewById(R.id.show_pic_ry); + viewPager = (ViewPager2) itemView.findViewById(R.id.viewPager); + tablayout = (TabLayout) itemView.findViewById(R.id.tablayout); + itemMoreTv = (TextView) itemView.findViewById(R.id.item_more_tv); + itemHeadCiv = (CircleImageView) itemView.findViewById(R.id.item_head_civ); + itemLikeTv = (TextView) itemView.findViewById(R.id.item_like_tv); + itemCommentTv = (TextView) itemView.findViewById(R.id.item_comment_tv); + itemShareTv = (TextView) itemView.findViewById(R.id.item_share_tv); + locTv = itemView.findViewById(R.id.loc_tv); + mTitle2 = itemView.findViewById(R.id.mTitle2); + progress = (SeekBar) itemView.findViewById(R.id.progress); + + } + } + +} diff --git a/app/src/main/java/com/dskj/rbchat/voom/comm/ViewPagerLayoutManager.java b/app/src/main/java/com/dskj/rbchat/voom/comm/ViewPagerLayoutManager.java new file mode 100644 index 0000000..b2ecdea --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/voom/comm/ViewPagerLayoutManager.java @@ -0,0 +1,130 @@ +package com.dskj.rbchat.voom.comm; + +import android.content.Context; +import android.view.View; + +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.PagerSnapHelper; +import androidx.recyclerview.widget.RecyclerView; + +/** + * Created by 钉某人 + * github: https://github.com/DingMouRen + * email: naildingmouren@gmail.com + */ + +public class ViewPagerLayoutManager extends LinearLayoutManager { + private static final String TAG = "ViewPagerLayoutManager"; + private PagerSnapHelper mPagerSnapHelper; + private OnViewPagerListener mOnViewPagerListener; + private RecyclerView mRecyclerView; + private int mDrift;//位移,用来判断移动方向 + private RecyclerView.OnChildAttachStateChangeListener mChildAttachStateChangeListener = new RecyclerView.OnChildAttachStateChangeListener() { + @Override + public void onChildViewAttachedToWindow(View view) { + if (mOnViewPagerListener != null && getChildCount() == 1) { + mOnViewPagerListener.onInitComplete(); + } + } + + @Override + public void onChildViewDetachedFromWindow(View view) { + if (mDrift >= 0) { + if (mOnViewPagerListener != null) + mOnViewPagerListener.onPageRelease(true, getPosition(view)); + } else { + if (mOnViewPagerListener != null) + mOnViewPagerListener.onPageRelease(false, getPosition(view)); + } + + } + }; + + public ViewPagerLayoutManager(Context context, int orientation) { + super(context, orientation, false); + init(); + } + + public ViewPagerLayoutManager(Context context, int orientation, boolean reverseLayout) { + super(context, orientation, reverseLayout); + init(); + } + + private void init() { + mPagerSnapHelper = new PagerSnapHelper(); + + } + + @Override + public void onAttachedToWindow(RecyclerView view) { + super.onAttachedToWindow(view); + mPagerSnapHelper.attachToRecyclerView(view); + this.mRecyclerView = view; + mRecyclerView.addOnChildAttachStateChangeListener(mChildAttachStateChangeListener); + } + + @Override + public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) { + super.onLayoutChildren(recycler, state); + } + + /** + * 滑动状态的改变 + * 缓慢拖拽-> SCROLL_STATE_DRAGGING + * 快速滚动-> SCROLL_STATE_SETTLING + * 空闲状态-> SCROLL_STATE_IDLE + * + * @param state + */ + @Override + public void onScrollStateChanged(int state) { + switch (state) { + case RecyclerView.SCROLL_STATE_IDLE: + View viewIdle = mPagerSnapHelper.findSnapView(this); + if (viewIdle != null) { + int positionIdle = getPosition(viewIdle); + if (mOnViewPagerListener != null && getChildCount() == 1) { + mOnViewPagerListener.onPageSelected(positionIdle, positionIdle == getItemCount() - 1); + } + } + break; + } + } + + /** + * 监听竖直方向的相对偏移量 + * + * @param dy + * @param recycler + * @param state + * @return + */ + @Override + public int scrollVerticallyBy(int dy, RecyclerView.Recycler recycler, RecyclerView.State state) { + this.mDrift = dy; + return super.scrollVerticallyBy(dy, recycler, state); + } + + /** + * 监听水平方向的相对偏移量 + * + * @param dx + * @param recycler + * @param state + * @return + */ + @Override + public int scrollHorizontallyBy(int dx, RecyclerView.Recycler recycler, RecyclerView.State state) { + this.mDrift = dx; + return super.scrollHorizontallyBy(dx, recycler, state); + } + + /** + * 设置监听 + * + * @param listener + */ + public void setOnViewPagerListener(OnViewPagerListener listener) { + this.mOnViewPagerListener = listener; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/wallet/GiftInfoActivity.java b/app/src/main/java/com/dskj/rbchat/wallet/GiftInfoActivity.java new file mode 100644 index 0000000..cdfd14f --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/wallet/GiftInfoActivity.java @@ -0,0 +1,173 @@ +package com.dskj.rbchat.wallet; + +import android.content.Intent; +import android.os.Bundle; +import android.view.View; + +import androidx.annotation.Nullable; + +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.ActivityGiftInfoBinding; +import com.dskj.rbchat.databinding.ActivityWalletInfoBinding; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.main.mine.ChangeAccoutActionActivity; +import com.dskj.rbchat.model.BindBean; +import com.dskj.rbchat.model.WalletBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.pay.LipinDuiHuanActivity; +import com.dskj.rbchat.utils.AnimUtil; +import com.dskj.rbchat.utils.AppUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.corekit.im.IMKitClient; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class GiftInfoActivity extends BaseActivity { + ActivityGiftInfoBinding viewBinding; + WalletBean walletBean; + BindBean bindBean; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + getWindow().setStatusBarColor(getResources().getColor(R.color.color_fee8bf)); + getWindow().setNavigationBarColor(getResources().getColor(R.color.color_fee8bf)); + + super.onCreate(savedInstanceState); + viewBinding = ActivityGiftInfoBinding.inflate(getLayoutInflater()); + setContentView(viewBinding.getRoot()); + viewBinding.contactListActivityTitleBar.setBackgroundColor(getResources().getColor(R.color.color_fee8bf)); + + initView(); + getWallet(); + bindInfo(); + } + + + private void bindInfo() { + Api.getInstance().bindInfo(IMKitClient.account()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + bindBean = feedbackResp.data; + LogUtils.i("获取到的数据:" + GsonUtils.beanToJSONString(bindBean)); + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + } + }); + + } + + protected void initView() { + viewBinding.contactListActivityTitleBar.getBackImageView().setOnClickListener(v -> finish()); + getSupportFragmentManager().beginTransaction() + .replace(R.id.frameLayout, GiftInfoFragment.newInstance()) + .commit(); + viewBinding.tvYouwanTimes.setOnClickListener(view -> { + if (bindBean != null) { + if (!bindBean.getPhoneBind()) { + showDialog(); + } else if (!bindBean.getPayPasswordSet()) { + showDialogPay(); + } else { + +// startActivity(new Intent(GiftInfoActivity.this, LipinDuiHuanActivity.class).putExtra("type", 1)); + } + } + }); + + } + + + private void showDialogPay() { + + com.netease.yunxin.kit.chatkit.ui.dialog.ActionConfirmDialog actionDialog = new com.netease.yunxin.kit.chatkit.ui.dialog.ActionConfirmDialog(GiftInfoActivity.this, + getString(com.netease.yunxin.kit.chatkit.ui.R.string.bind_phone_des_txt1), getString(com.netease.yunxin.kit.chatkit.ui.R.string.cancel_txt), getString(com.netease.yunxin.kit.chatkit.ui.R.string.to_sett_txt)); + actionDialog.setOnToActionListener(new com.netease.yunxin.kit.chatkit.ui.dialog.ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { +// Intent intent = new Intent(getActivity(), ChangeAccoutActionActivity.class); +// intent.putExtra("type", 5); +// startActivity(intent); + Intent intent = new Intent(GiftInfoActivity.this, SetPayPasswordActivity.class); + startActivity(intent); + } + + @Override + public void toCancel() { + + } + }); + actionDialog.show(); + } + + + private void showDialog() { + + ActionConfirmDialog actionDialog = new ActionConfirmDialog(GiftInfoActivity.this, + getString(R.string.bind_phone_des_txt), getString(R.string.nobind_txt), getString(R.string.tobind_txt)); + actionDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + Intent intent = new Intent(GiftInfoActivity.this, ChangeAccoutActionActivity.class); + intent.putExtra("type", ChangeAccoutActionActivity.TYPE_BIND_PHONE); + startActivity(intent); + } + + @Override + public void toCancel() { + + } + }); + actionDialog.show(); + } + + public void getWallet() { + Api.getInstance().walletInfo(IMKitClient.account()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { + walletBean = feedbackResp.data; + changeInfo(); + + } + + @Override + public void onError(int code, String msg) { + + } + }); + + + } + + + private void changeInfo() { + if (walletBean != null) { + viewBinding.yinbiYueTv.setText(AppUtils.getQian(walletBean.getGiftCoin() * 100)); + + } + + } + + @Override + protected void onStop() { + super.onStop(); + + } + + +} diff --git a/app/src/main/java/com/dskj/rbchat/wallet/GiftInfoFragment.java b/app/src/main/java/com/dskj/rbchat/wallet/GiftInfoFragment.java new file mode 100644 index 0000000..5bd8e50 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/wallet/GiftInfoFragment.java @@ -0,0 +1,336 @@ +package com.dskj.rbchat.wallet; + +import android.os.Bundle; +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.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.LinearLayoutManager; + +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.databinding.FragmentWalletInfo1Binding; +import com.dskj.rbchat.databinding.FragmentWalletInfoBinding; +import com.dskj.rbchat.dialog.SelectTypeDialog; +import com.dskj.rbchat.model.BillBean; +import com.dskj.rbchat.model.ListBeanResult; +import com.dskj.rbchat.model.StatisticsBean; +import com.dskj.rbchat.model.TaskBean; +import com.dskj.rbchat.model.TypeBean; +import com.dskj.rbchat.model.WithdrawCashBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.AppUtils; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.team.TeamService; +import com.netease.nimlib.sdk.team.model.Team; +import com.netease.nimlib.sdk.uinfo.UserService; +import com.netease.nimlib.sdk.uinfo.model.NimUserInfo; +import com.netease.yunxin.kit.common.ui.fragments.BaseFragment; +import com.netease.yunxin.kit.common.ui.utils.TimeFormatUtils; +import com.netease.yunxin.kit.corekit.im.IMKitClient; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +//import com.bigkoo.pickerview.builder.TimePickerBuilder; +//import com.bigkoo.pickerview.view.TimePickerView; + +/** + * 主页模块 + * + * @author + */ +public class GiftInfoFragment extends BaseFragment { + int pageSize = 1; + String time = "2022-06"; + String typeInfo = ""; + CommonAdapter commonAdapter; + private ArrayList titles = new ArrayList<>(); + int loc = 0; + FragmentWalletInfo1Binding binding; + + public static GiftInfoFragment newInstance() { + Bundle bundle = new Bundle(); + GiftInfoFragment view = new GiftInfoFragment(); + view.setArguments(bundle); + return view; + } + + + @Nullable + @Override + public View onCreateView( + @NonNull LayoutInflater inflater, + @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + binding = FragmentWalletInfo1Binding.inflate(inflater); + return binding.getRoot(); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + initViews(); + } + + + protected void initViews() { + + Calendar selectedDate = Calendar.getInstance();//系统当前时间 + time = selectedDate.get(Calendar.YEAR) + "-" + ((selectedDate.get(Calendar.MONTH) + 1) < 10 ? "0" + (selectedDate.get(Calendar.MONTH) + 1) : (selectedDate.get(Calendar.MONTH) + 1)); + + binding.typeNameTv.setText(R.string.lijinmingxi_txt); + + loc = DataUtils.get(IMApplication.getInstance(), "locale", 1); + +// } + + initList(); + initRefreshLayout(); + + + } + + + private void initList() { + LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity()); + binding.recyclerview.setLayoutManager(linearLayoutManager); + commonAdapter = new CommonAdapter(getContext(), R.layout.item_bill_list, titles) { + @Override + public void convert(ViewHolder holder, BillBean s, int index) { +// holder.setText(R.id.price_tv, AppUtils.getQian(s.getAmount()) + (status == 0 ? getString(R.string.species_txt) : +// getString(R.string.silver_coins_txt))); + holder.setText(R.id.price_tv, AppUtils.getQian(s.getAmount() * 100)); + TextView textView = holder.getView(R.id.price_tv); + if (s.getAmount() < 0) { + textView.setTextColor(getResources().getColor(R.color.black)); + } else { + textView.setTextColor(getResources().getColor(R.color.black)); + } + TextView statusTv = holder.getView(R.id.status_tv); + statusTv.setVisibility(View.GONE); +// if (status == 0) { +// if (s.getType() == 5) { +// if (s.getWithdrawCashRecord() != null) { +// statusTv.setVisibility(View.VISIBLE); +// statusTv.setText(getStatusTxt(s.getWithdrawCashRecord())); +// } +// } +// } + holder.setText(R.id.balan_tv, getString(R.string.yuee_2f_txt1) + AppUtils.getQian(s.getBalance())); +// holder.setText(R.id.title_tv,getUserInfo(s)+getTypeString(s.getType())); + holder.setText(R.id.title_tv, getTypeNoteString(s)); + + holder.setText(R.id.time_tv, s.getCreateTime()); + if (!TextUtils.isEmpty(s.getCreateTimestamp())) { + holder.setText(R.id.time_tv, TimeFormatUtils.formatMillisecond(getActivity(), Long.parseLong(s.getCreateTimestamp()))); + + } + holder.getView(R.id.big_bg).setOnClickListener(v -> { + + }); + ((ImageView) holder.getView(R.id.logo_iv)).setImageResource(getTypeRes(s)); + + } + }; + binding.recyclerview.setAdapter(commonAdapter); + } + + + private String getTypeNoteString(BillBean s) { + //0 群红包,1 私聊红包,2 转账,3 金币银币互转 + + + if (s.getType() == 1) { + return getString(R.string.redpacket_txt); + } else if (s.getType() == 2) { + return getString(R.string.xitonggaidong_txt); + } else if (s.getType() == 0) { + return getString(R.string.group_redpack_txt); + + } else if (s.getType() == 3) { + return getString(R.string.duihuancishu_txt); + } else if (s.getType() == 4) { + return getString(R.string.hongbaoshixiao_txt); + } else { + return getString(R.string.weizhi_txt); + } + + } + + private int getTypeRes(BillBean bean) { + int type = bean.getType(); + switch (type) { + case 0: + return R.mipmap.tongbi_hongbao_img; + case 1: + return R.mipmap.tongbi_hongbao_img; + case 2: + return R.mipmap.tongbi_2_img; + case 3: + return R.mipmap.tongbi_youwan_img; + case 4: + return R.mipmap.tongbi_hongbao_img; + default: + return R.mipmap.tongbi_2_img; + } + } + + private void initRefreshLayout() { + binding.refreshLayout.setOnRefreshListener(refreshlayout -> { + pageSize = 1; + binding.refreshLayout.setVisibility(View.VISIBLE); + binding.nodateLy.setVisibility(View.GONE); + binding.refreshLayout.setEnableLoadMore(true); + getDateList(); + if (getActivity() != null) { + ((GiftInfoActivity) getActivity()).getWallet(); + } + + }); + binding.refreshLayout.setOnLoadMoreListener(refreshLayout -> { + pageSize += 1; + getDateList(); + + }); + } + + @Override + public void onResume() { + super.onResume(); + String name = DataUtils.get(getActivity(), "gift_info_" + IMKitClient.account(), ""); + + binding.typeTv1.setVisibility(View.GONE); + + if (TextUtils.isEmpty(name)) { + binding.refreshLayout.autoRefresh(); + } else { + titles = (ArrayList) GsonUtils.getListFromJSON(name, BillBean.class); + if (titles != null && titles.size() > 0) { + commonAdapter.setDates(titles); + getDateList(); + } else { + binding.refreshLayout.autoRefresh(); + } + } + } + + private void getDateList() { + + Map map = new HashMap<>(); + map.put("page", pageSize); + + if (!TextUtils.isEmpty(IMUIKitConfig.SUBSTATIONID)) { + map.put("substationId", IMUIKitConfig.SUBSTATIONID); + } + Api.getInstance().giftDetails(IMKitClient.account(), map) +// Api.getInstance().giftDetails("20", map) + + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>>() { + @Override + public void onSuccess(Result> feedbackResp) { + changeDate(feedbackResp.data); + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + binding.refreshLayout.finishRefresh(); + binding.refreshLayout.finishLoadMore(); + changeView(false); + } + }); + + + } + + + private String getMonth(String time) { + if (time.endsWith("01") || time.endsWith("03") || time.endsWith("05") || time.endsWith("07") || time.endsWith("08") || time.endsWith("10") || time.endsWith("12")) { + return "31"; + } else if (time.endsWith("02")) { + Calendar selectedDate = Calendar.getInstance();//系统当前时间 + int year = selectedDate.get(Calendar.YEAR); + if (year % 400 == 0) {// 判断能否被400整除 + return "29"; + } else if (year % 100 == 0) {// 判断能否被100整除 + return "28"; + } else if (year % 4 == 0) {// 判断能否被4整除 + return "29"; + } else { + return "28"; + } + + } else { + return "30"; + } + } + + + private void changeDate(ListBeanResult data) { + if (data.getList() != null) { + if (pageSize == 1) { + titles = (ArrayList) data.getList(); + DataUtils.set(getActivity(), "gift_info_" + IMKitClient.account(), GsonUtils.beanToJSONString(titles)); + commonAdapter.setDates(titles); + } else { + commonAdapter.addDates(data.getList()); + titles = (ArrayList) commonAdapter.getDates(); + } + + } + binding.refreshLayout.finishRefresh(); + binding.refreshLayout.finishLoadMore(); + if (titles.size() == data.getTotal()) { + binding.refreshLayout.finishLoadMoreWithNoMoreData(); + } + changeView(true); + } + + private void changeView(boolean isNodate) { + if (titles == null || (titles.size() == 0)) { + binding.nodateLy.setVisibility(View.VISIBLE); + binding.refreshLayout.setVisibility(View.GONE); + if (isNodate) { + binding.nodateTv.setText(getString(R.string.nodate_txt)); + binding.nodateIv.setImageResource(R.mipmap.pyq_nodate); + } else { + binding.nodateTv.setText(getString(R.string.net_error_txt)); + binding.nodateIv.setImageResource(R.mipmap.pyq_nodate); + + } + + } else { + binding.refreshLayout.setVisibility(View.VISIBLE); + binding.nodateLy.setVisibility(View.GONE); + } + binding.nodateLy.setOnClickListener(view -> { + binding.refreshLayout.autoRefresh(); + }); + } + +} diff --git a/app/src/main/java/com/dskj/rbchat/wallet/PayPasswordActivity.java b/app/src/main/java/com/dskj/rbchat/wallet/PayPasswordActivity.java new file mode 100644 index 0000000..e4f66ab --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/wallet/PayPasswordActivity.java @@ -0,0 +1,239 @@ +package com.dskj.rbchat.wallet; + +import android.content.Intent; +import android.os.Bundle; +import android.view.MotionEvent; +import android.view.View; +import android.view.inputmethod.InputMethodManager; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import androidx.annotation.Nullable; + +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; + +import com.dskj.rbchat.custom.PasswordEditText; +import com.dskj.rbchat.databinding.ActivityChangePaypasswordBinding; +import com.dskj.rbchat.model.BindBean; +import com.dskj.rbchat.model.LoginBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.KeyboardUtil; +import com.dskj.rbchat.utils.LogUtils; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.corekit.im.IMKitClient; + +import java.util.HashMap; +import java.util.Map; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class PayPasswordActivity extends BaseActivity { + + String code; + + + private boolean isShowPass = false; + + LoginBean loginBean; + BindBean bean; + String passwordCode=""; + String passwordCode1=""; + ActivityChangePaypasswordBinding viewBinding; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + getWindow().setStatusBarColor(getResources().getColor(R.color.color_white)); + getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white)); + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR|View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR); + + super.onCreate(savedInstanceState); + viewBinding = ActivityChangePaypasswordBinding.inflate(getLayoutInflater()); + setContentView(viewBinding.getRoot()); + + initView(); + + } + protected void initView() { + + code = getIntent().getStringExtra("code"); + + viewBinding.backStep2Bt.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + onBackPressed(); + } + }); + + bindInfo(IMKitClient.account()); + + + viewBinding.sumbitBt.setOnClickListener(v -> { + if ( viewBinding.passwordEditTextCode.getVisibility() == View.VISIBLE) { + if(passwordCode.length()!=6){ + return; + } + KeyboardUtil.hideSoftInput(PayPasswordActivity.this); + showStep2(2); + } else if( viewBinding.passwordEditTextCode1.getVisibility() == View.VISIBLE){ + if(passwordCode.length()!=6){ + return; + } + if(!passwordCode.equals(passwordCode1)){ + ToastX.showShortToast(getString(R.string.lczfmmbyz_txt)); + + return; + } + KeyboardUtil.hideSoftInput(PayPasswordActivity.this); + changePayPassWord(); + }else { + onBackPressed(); + } + }); + viewBinding.passwordEditTextCode.setOnCompleteListener(new PasswordEditText.onCompletionListener() { + @Override + public void onCompletion(String code) { + passwordCode = code; + LogUtils.i("密码输入框监听:"+ passwordCode.length()); + changeNextStatus(passwordCode.length()==6); + } + }); + viewBinding.passwordEditTextCode1.setOnCompleteListener(new PasswordEditText.onCompletionListener() { + @Override + public void onCompletion(String code) { + passwordCode1 = code; + changeNextStatus(passwordCode1.length()==6); + } + }); + + } + + private void showStep2(int step) { + if(step == 1){ + viewBinding.titleStep2Tv.setText(R.string.qszzfmm_txt); + viewBinding.tips1.setText(R.string.qsrlwcszmm_txt); + viewBinding.passwordEditTextCode.setVisibility(View.VISIBLE); + viewBinding.passwordEditTextCode1.setVisibility(View.GONE); + }else{ + viewBinding.titleStep2Tv.setText(R.string.qqrzfmm_txt); + viewBinding.tips1.setText(R.string.qqrszdzfmm_txt); + viewBinding. passwordEditTextCode1.setVisibility(View.VISIBLE); + viewBinding.passwordEditTextCode.setVisibility(View.GONE); + } + } + + private void changePayPassWord() { + if (bean != null) { + if (bean != null) { + Map maps = new HashMap<>(); + maps.put("phone", bean.getPhone()); + maps.put("areaCode", bean.getAreaCode()); + maps.put("verifyCode", code); + maps.put("payPassword", passwordCode); + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + + Api.getInstance().setPayPasswordByVerifyCode(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + viewBinding.step2Ly.setVisibility(View.GONE); + viewBinding.succIv.setVisibility(View.VISIBLE); + viewBinding.succTv.setText(R.string.szzfmmcg_txt); + viewBinding.succTv.setVisibility(View.VISIBLE); + viewBinding.passwordEditTextCode1.setVisibility(View.GONE); + viewBinding.sumbitBt.setText(R.string.general_back); + } + + @Override + public void onError(int code, String msg) { +// LogUtils.i("获取到的错误:"+code+""+ msg); + ToastX.showShortToast(msg); + } + }); + } + } + + } + + private void changeNextStatus(boolean isShowPass) { + if(isShowPass) { + viewBinding.sumbitBt.setBackgroundResource(R.drawable.index_user_bg4); + }else{ + viewBinding.sumbitBt.setBackgroundResource(R.drawable.index_user_bg4); + } + } + + + @Override + protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (requestCode == 777 && resultCode == RESULT_OK) { + finish(); + } + } + + @Override + public void onBackPressed() { + if (viewBinding.succIv.getVisibility() == View.VISIBLE) { + setResult(RESULT_OK); + super.onBackPressed(); + + }else if(viewBinding.passwordEditTextCode1.getVisibility() == View.VISIBLE){ + showStep2(1); + changeNextStatus(passwordCode.length()==6); + }else{ + super.onBackPressed(); + } + } + + @Override + protected void onDestroy() { + super.onDestroy(); + } + + private void bindInfo(String user_uid) { + Api.getInstance().bindInfo(user_uid) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + bean = feedbackResp.data; + + + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); +// WidgetUtils.showToast(getActivity(), msg, WidgetUtils.ToastType.ERROR); + } + }); + } + + public boolean onTouchEvent(MotionEvent event) { + if(null != this.getCurrentFocus()){ + /** + * 点击空白位置 隐藏软键盘 + */ + InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + return mInputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0); + } + return super .onTouchEvent(event); + } + + private void changTitle() { + setTitle(getString(R.string.sfrz_txt)); + } + +} diff --git a/app/src/main/java/com/dskj/rbchat/wallet/PaySettingActivity.java b/app/src/main/java/com/dskj/rbchat/wallet/PaySettingActivity.java new file mode 100644 index 0000000..5c1aca7 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/wallet/PaySettingActivity.java @@ -0,0 +1,379 @@ +package com.dskj.rbchat.wallet; + +import static com.blankj.utilcode.util.SnackbarUtils.dismiss; +import static com.codersun.fingerprintcompat.FingerManager.SupportResult.DEVICE_UNSUPPORTED; + +import android.content.Intent; +import android.hardware.fingerprint.FingerprintManager; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.provider.Settings; +import android.text.TextUtils; +import android.view.MotionEvent; +import android.view.View; +import android.view.inputmethod.InputMethodManager; +import android.widget.Button; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; + +import com.codersun.fingerprintcompat.AonFingerChangeCallback; +import com.codersun.fingerprintcompat.FingerManager; +import com.codersun.fingerprintcompat.SimpleFingerCheckCallback; +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.ActivityCollectionAndPaymentBinding; +import com.dskj.rbchat.databinding.ActivityPaySettingBinding; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.dialog.MianMiDialog; +import com.dskj.rbchat.dialog.MianMiXieyiDialog; +import com.dskj.rbchat.dialog.PayCashFingerDialog; +import com.dskj.rbchat.dialog.PayDialog; +import com.dskj.rbchat.dialog.SelectPayTypeDialog; +import com.dskj.rbchat.game.JsBridgeActivity; +import com.dskj.rbchat.login.RegisterActivity; +import com.dskj.rbchat.main.mine.ChangeAccoutActionActivity; +import com.dskj.rbchat.model.BindBean; +import com.dskj.rbchat.model.LoginBean; +import com.dskj.rbchat.model.TopUpBean; +import com.dskj.rbchat.model.WalletBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.pay.CollectionAndPaymentActivity; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.activities.BrowseActivity; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.corekit.im.IMKitClient; + +import java.util.HashMap; +import java.util.Map; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class PaySettingActivity extends BaseActivity implements SelectPayTypeDialog.OnToTypeListener { + + BindBean bean; + LoginBean loginBean; + private int isShowFinger; + ActivityPaySettingBinding viewBinding; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + getWindow().setStatusBarColor(getResources().getColor(R.color.color_fcfcfc)); + getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white)); + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR|View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR); + + super.onCreate(savedInstanceState); + viewBinding = ActivityPaySettingBinding.inflate(getLayoutInflater()); + setContentView(viewBinding.getRoot()); + + initView(); + viewBinding.mianmiSc.setChecked(DataUtils.get(PaySettingActivity.this, "hasMianMi", false)); + viewBinding.zhiwenSc.setChecked(DataUtils.get(PaySettingActivity.this, "hasFinger", false)); + viewBinding.mianmiV.setOnClickListener(v -> { + if (bean != null && !bean.getPayPasswordSet()) { + showDialogPay(); + return; + } + boolean isCheck = DataUtils.get(PaySettingActivity.this, "hasMianMi", false); + if (isCheck) { + + ActionConfirmDialog actionDialog = new ActionConfirmDialog(PaySettingActivity.this, getString(R.string.querenzantingmianmizhifu_txt), + true); + actionDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + + DataUtils.set(PaySettingActivity.this, "hasMianMi", !DataUtils.get(PaySettingActivity.this, "hasMianMi", false)); + viewBinding.mianmiSc.setChecked(DataUtils.get(PaySettingActivity.this, "hasMianMi", false)); + } + + @Override + public void toCancel() { + viewBinding.mianmiSc.setChecked(DataUtils.get(PaySettingActivity.this, "hasMianMi", false)); + } + }); + actionDialog.show(); + + + + } else { + MianMiDialog mianMiDialog = new MianMiDialog(this); + mianMiDialog.setOnToActionListener(new MianMiDialog.OnToActionListener() { + @Override + public void toOpen() { + if (DataUtils.get(PaySettingActivity.this, "hasFinger", false)) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + checkPayFinger(false); + } + } else { + PayDialog payDialog = new PayDialog(PaySettingActivity.this, "", false); + payDialog.setOntoAlbumListener(new PayDialog.OnListItemClickListener() { + @Override + public void onPayPass(String position) { + DataUtils.set(PaySettingActivity.this, "hasMianMi", !DataUtils.get(PaySettingActivity.this, "hasMianMi", false)); + viewBinding.mianmiSc.setChecked(DataUtils.get(PaySettingActivity.this, "hasMianMi", false)); + } + + @Override + public void dimess() { + viewBinding.mianmiSc.setChecked(DataUtils.get(PaySettingActivity.this, "hasMianMi", false)); + } + }); + payDialog.show(); + } + + + } + + @Override + public void toXieYi() { +// MianMiXieyiDialog mianMiXieyiDialog = new MianMiXieyiDialog(PaySettingActivity.this); +// mianMiXieyiDialog.show(); + BrowseActivity.Companion.launch( + PaySettingActivity.this, getString(R.string.mianmi_title_txt1), IMUIKitConfig.MIANMI_AGREEMENT_CN_URL); + + } + }); + mianMiDialog.show(); + } + }); + viewBinding.zhiwenV.setOnClickListener(v -> { + if (bean != null && !bean.getPayPasswordSet()) { + showDialogPay(); + return; + } + if (isShowFinger == 1) { + if (!DataUtils.get(PaySettingActivity.this, "hasFinger", false)) { + ActionConfirmDialog actionDialog = new ActionConfirmDialog(PaySettingActivity.this, getResources().getString(R.string.zhiwen_tips_txt), + getString(R.string.general_got_it), getResources().getString(R.string.quluru_txt)); + actionDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + viewBinding.zhiwenSc.setChecked(DataUtils.get(PaySettingActivity.this, "hasFinger", false)); + dismiss(); + Intent intent = new Intent(Settings.ACTION_FINGERPRINT_ENROLL); + startActivity(intent); + } + + @Override + public void toCancel() { + viewBinding.zhiwenSc.setChecked(DataUtils.get(PaySettingActivity.this, "hasFinger", false)); + } + }); + actionDialog.show(); + } else { + DataUtils.set(PaySettingActivity.this, "hasFinger", !DataUtils.get(PaySettingActivity.this, "hasFinger", false)); + viewBinding.zhiwenSc.setChecked(DataUtils.get(PaySettingActivity.this, "hasFinger", false)); + + } + } else { + if (!DataUtils.get(PaySettingActivity.this, "hasFinger", false)) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + checkPayFinger(true); + } + } else { + ActionConfirmDialog actionDialog = new ActionConfirmDialog(PaySettingActivity.this, getString(R.string.qrztsyzwzfm_txt), + true); + actionDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + DataUtils.set(PaySettingActivity.this, "hasFinger", !DataUtils.get(PaySettingActivity.this, "hasFinger", false)); + viewBinding.zhiwenSc.setChecked(DataUtils.get(PaySettingActivity.this, "hasFinger", false)); + } + + @Override + public void toCancel() { + viewBinding.zhiwenSc.setChecked(DataUtils.get(PaySettingActivity.this, "hasFinger", false)); + } + }); + actionDialog.show(); + + + + } + } + }); + + } + + private void showDialogPay() { + + com.netease.yunxin.kit.chatkit.ui.dialog.ActionConfirmDialog actionDialog = new com.netease.yunxin.kit.chatkit.ui.dialog.ActionConfirmDialog(PaySettingActivity.this, + getString(com.netease.yunxin.kit.chatkit.ui.R.string.bind_phone_des_txt1), getString(com.netease.yunxin.kit.chatkit.ui.R.string.cancel_txt), getString(com.netease.yunxin.kit.chatkit.ui.R.string.to_sett_txt)); + actionDialog.setOnToActionListener(new com.netease.yunxin.kit.chatkit.ui.dialog.ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { +// Intent intent = new Intent(PaySettingActivity.this, ChangeAccoutActionActivity.class); +// intent.putExtra("type", 5); +// startActivity(intent); + Intent intent = new Intent(PaySettingActivity.this, SetPayPasswordActivity.class); + startActivity(intent); + } + + @Override + public void toCancel() { + + } + }); + actionDialog.show(); + } + + @RequiresApi(api = Build.VERSION_CODES.M) + private void checkPayFinger(boolean isZhiWen) { + + FingerManager.build().setApplication(IMApplication.getInstance()) + .setTitle(" ") + .setDes(" ") + .setNegativeText(" ") + .setFingerCheckCallback(new SimpleFingerCheckCallback() { + + @Override + public void onSucceed() { + ToastX.showShortToast("验证成功"); + success(isZhiWen); + } + + @Override + public void onError(String error) { + ToastX.showShortToast("验证失败"); + DataUtils.set(PaySettingActivity.this, "hasFinger", false); + if (isZhiWen) { + viewBinding.zhiwenSc.setChecked(DataUtils.get(PaySettingActivity.this, "hasFinger", false)); + } else { + viewBinding.mianmiSc.setChecked(DataUtils.get(PaySettingActivity.this, "hasMianMi", false)); + } + } + + @Override + public void onCancel() { + ToastX.showShortToast("您取消了识别"); + DataUtils.set(PaySettingActivity.this, "hasFinger", false); + if (isZhiWen) { + viewBinding.zhiwenSc.setChecked(DataUtils.get(PaySettingActivity.this, "hasFinger", false)); + } else { + viewBinding.mianmiSc.setChecked(DataUtils.get(PaySettingActivity.this, "hasMianMi", false)); + } + } + }) + .setFingerChangeCallback(new AonFingerChangeCallback() { + + @Override + protected void onFingerDataChange() { +// showToast("指纹数据发生了变化"); 重新录入了 +// ToastX.showShortToast("指纹数据发生了变化"); +// success(isZhiWen); + FingerManager.updateFingerData(PaySettingActivity.this); + new Handler().postDelayed(() -> checkPayFinger(isZhiWen), 1000); + } + }) + .create() + .startListener(PaySettingActivity.this); + } + + public void success(boolean isZhiWen) { + if (isZhiWen) { + DataUtils.set(PaySettingActivity.this, "hasFinger", !DataUtils.get(PaySettingActivity.this, "hasFinger", false)); + viewBinding.zhiwenSc.setChecked(DataUtils.get(PaySettingActivity.this, "hasFinger", false)); + } else { + DataUtils.set(PaySettingActivity.this, "hasMianMi", !DataUtils.get(PaySettingActivity.this, "hasMianMi", false)); + viewBinding.mianmiSc.setChecked(DataUtils.get(PaySettingActivity.this, "hasMianMi", false)); + } + } + + protected void initView() { + viewBinding.contactListActivityTitleBar.getBackImageView().setOnClickListener(v -> finish()); + + viewBinding.setPassBt.setOnClickListener(v -> { + Intent intent = new Intent(PaySettingActivity.this, SetPayPasswordActivity.class); + startActivity(intent); + }); + + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + switch (FingerManager.checkSupport(PaySettingActivity.this)) { + case DEVICE_UNSUPPORTED: + viewBinding.zhiwenFy.setVisibility(View.GONE); + viewBinding.zhiwenLine.setVisibility(View.GONE); + isShowFinger = 0; + break; + case SUPPORT_WITHOUT_DATA: + viewBinding.zhiwenFy.setVisibility(View.VISIBLE); + viewBinding.zhiwenLine.setVisibility(View.VISIBLE); + isShowFinger = 1; + + break; + case SUPPORT: + viewBinding.zhiwenFy.setVisibility(View.VISIBLE); + viewBinding.zhiwenLine.setVisibility(View.VISIBLE); + isShowFinger = 2; + break; + } + } + + + } + + @Override + protected void onResume() { + super.onResume(); + bindInfo(IMKitClient.account()); + } + + private void bindInfo(String user_uid) { + Api.getInstance().bindInfo(user_uid) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + bean = feedbackResp.data; + //只有这是个参数允许切换 +// viewBinding.bindWechatTv.setText(feedbackResp.data.getWechatBind()?getString(R.string.yibangding_txt):getString(R.string.weibangding_txt)); + if (bean.getPayPasswordSet()) { + viewBinding.setPassBt.setText(getString(R.string.set_pay_pass_txt2)); + } else { + viewBinding.setPassBt.setText(getString(R.string.set_pay_pass_txt)); + + } + + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); +// WidgetUtils.showToast(getActivity(), msg, WidgetUtils.ToastType.ERROR); + } + }); + } + + @Override + protected void onStop() { + super.onStop(); + + } + + + @Override + public void toType(int type) { + + } + public boolean onTouchEvent(MotionEvent event) { + if(null != this.getCurrentFocus()){ + /** + * 点击空白位置 隐藏软键盘 + */ + InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + return mInputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0); + } + return super .onTouchEvent(event); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/wallet/SetPayPasswordActivity.java b/app/src/main/java/com/dskj/rbchat/wallet/SetPayPasswordActivity.java new file mode 100644 index 0000000..06d9214 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/wallet/SetPayPasswordActivity.java @@ -0,0 +1,319 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.wallet; + + +import android.app.Activity; +import android.content.Intent; +import android.os.Build; +import android.os.Bundle; +import android.os.CountDownTimer; +import android.os.Handler; +import android.text.Html; +import android.text.TextUtils; +import android.view.MotionEvent; +import android.view.View; +import android.view.inputmethod.InputMethodManager; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; + +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.ActivityChongzhiBinding; +import com.dskj.rbchat.databinding.ActivityChongzhiPayBinding; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.login.LoginActivity; +import com.dskj.rbchat.model.BindBean; +import com.dskj.rbchat.model.CountryBean; +import com.dskj.rbchat.model.RegisteredBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.AnimUtil; +import com.dskj.rbchat.utils.Constant; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.welcome.WelcomeActivity; +import com.netease.yunxin.kit.alog.ALog; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.dialog.LoadingDialog; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.login.LoginCallback; + +import java.util.HashMap; +import java.util.Map; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +/** + * Welcome Page is launch page + */ +public class SetPayPasswordActivity extends BaseActivity { + protected ActivityResultLauncher permissionLauncher; + String passwordCode = null; + + private static final String TAG = "WelcomeActivity"; + private ActivityChongzhiPayBinding activityWelcomeBinding; + CountryBean countryBean; + + @RequiresApi(api = Build.VERSION_CODES.M) + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getWindow().setStatusBarColor(getResources().getColor(R.color.color_fcfcfc)); + getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white)); + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR|View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR); + + ALog.d(Constant.PROJECT_TAG, TAG, "onCreateView"); + IMApplication.setColdStart(true); + activityWelcomeBinding = ActivityChongzhiPayBinding.inflate(getLayoutInflater()); + setContentView(activityWelcomeBinding.getRoot()); + myCountDownTimer = new MyCountDownTimer(60000, 1000); + activityWelcomeBinding.aboutTitleBar.setOnBackIconClickListener(v -> { + onBackPressed(); + }); + + countryBean = DataUtils.getLocCountry(SetPayPasswordActivity.this); + changeArea(); + + activityWelcomeBinding.nextIv.setOnClickListener(v -> { + if (TextUtils.isEmpty(passwordCode)) { + ToastX.showShortToast(R.string.dxyzmbnwk_txt); + return; + } + checkVerfyCode(); + }); + + + activityWelcomeBinding.passwordEditTextCode.setOnCompleteListener(code -> { + passwordCode = code; + + }); + + + activityWelcomeBinding.sendSmsTv.setOnClickListener(v -> { + toStep2(); + }); + + + AnimUtil.setAnimViews(activityWelcomeBinding.sendSmsTv, activityWelcomeBinding.changePassTv, + activityWelcomeBinding.nextIv, activityWelcomeBinding.changeSmsCodeTv); + bindInfo(IMKitClient.account()); + + } + + + BindBean bean; + + private void bindInfo(String user_uid) { + Api.getInstance().bindInfo(user_uid) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + bean = feedbackResp.data; + activityWelcomeBinding.sendSmsTipsTv.setText(Html.fromHtml(String.format(getString(R.string.djfsyzm_txt), + bean.getAreaCode() + " " + bean.getPhone()))); + + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); +// WidgetUtils.showToast(getActivity(), msg, WidgetUtils.ToastType.ERROR); + } + }); + } + + private void checkVerfyCode() { + Map maps = new HashMap<>(); + maps.put("verifyCode", passwordCode); + maps.put("phone", bean.getPhone()); + maps.put("areaCode", bean.getAreaCode()); + if (!TextUtils.isEmpty(IMUIKitConfig.SUBSTATIONID)) { + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + } + Api.getInstance().preCheckVerifyCode(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { +// dimessLoadingDialog(); + if (feedbackResp.data.isCorrect()) { + Intent intent = new Intent(SetPayPasswordActivity.this, PayPasswordActivity.class); + intent.putExtra("code", passwordCode); + startActivityForResult(intent, 777); + } else { + ToastX.showShortToast(R.string.yzmbzq_txt); + } + } + + @Override + public void onError(int code, String msg) { +// dimessLoadingDialog(); + LogUtils.i("获取到的错误:" + code + "" + msg); + ToastX.showShortToast(msg); + + + } + }); + } + + + @Override + protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (requestCode == 777 && resultCode == RESULT_OK) { + finish(); + } + } + + private void toStep2() { + hideSoftInput(SetPayPasswordActivity.this); + Map maps = new HashMap<>(); + maps.put("phone", bean.getPhone()); + maps.put("areaCode", bean.getAreaCode()); + if (!TextUtils.isEmpty(IMUIKitConfig.SUBSTATIONID)) { + maps.put("substationId", IMUIKitConfig.SUBSTATIONID); + } + Api.getInstance().sendSmsForSetPayPassword(maps) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { + myCountDownTimer.start(); + ActionConfirmDialog actionConfirmDialog = new ActionConfirmDialog(SetPayPasswordActivity.this, getString(R.string.yzmyfs_txt), false); + actionConfirmDialog.show(); + activityWelcomeBinding.sendSmsTipsTv.setText(Html.fromHtml(String.format(getString(R.string.djfsyzm_txt1), + bean.getAreaCode() + " " + bean.getPhone()))); + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + ToastX.showShortToast(msg); + } + }); + + + } + + + MyCountDownTimer myCountDownTimer; + + //倒计时函数 + private class MyCountDownTimer extends CountDownTimer { + + public MyCountDownTimer(long millisInFuture, long countDownInterval) { + super(millisInFuture, countDownInterval); + } + + //计时过程 + @Override + public void onTick(long l) { + //防止计时过程中重复点击 + activityWelcomeBinding.sendSmsTv.setClickable(false); +// getcodeTv.setTextColor(getResources().getColor(R.color.color_adb5bd)); + activityWelcomeBinding.sendSmsTv.setText(String.format(getString(R.string.get_code1_txt), (l / 1000))); + + } + + //计时完毕的方法 + @Override + public void onFinish() { + //重新给Button设置文字 + activityWelcomeBinding.sendSmsTv.setText(R.string.get_code_txt); + //设置可点击 + activityWelcomeBinding.sendSmsTv.setClickable(true); +// getcodeTv.setTextColor(getResources().getColor(R.color.colorAccent)); + + } + } + + + /** + * 隐藏软键盘 + */ + public void hideSoftInput(Activity activity) { + InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + if (getCurrentFocus() != null && null != imm) { + imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0); + } +// View view = activity.getCurrentFocus(); +// +// if (view != null) { +// +// InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE); +// +// inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); +// +// } + } + + + @Override + public void onBackPressed() { + super.onBackPressed(); + } + + + private void changeArea() { + } + + private void showMainActivityAndFinish() { + ALog.d(Constant.PROJECT_TAG, TAG, "showMainActivityAndFinish"); + Intent intent = new Intent(); + intent.setClass(this, LoginActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); + this.startActivity(intent); + finish(); + } + + + public LoadingDialog loadingDialog; + + public void showLoadingDialog() { + if (loadingDialog == null) + loadingDialog = new LoadingDialog(this); + loadingDialog.show(); + } + + public void showLoadingDialog(String msg) { + if (loadingDialog == null) + loadingDialog = new LoadingDialog(this); + loadingDialog.setLoadingText(msg); + loadingDialog.show(); + } + + + public void dimessLoadingDialog() { + if (loadingDialog != null) { + loadingDialog.dismiss(); + } + + } + + public boolean onTouchEvent(MotionEvent event) { + if(null != this.getCurrentFocus()){ + /** + * 点击空白位置 隐藏软键盘 + */ + InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + return mInputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0); + } + return super .onTouchEvent(event); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/wallet/TopUpActivity.java b/app/src/main/java/com/dskj/rbchat/wallet/TopUpActivity.java new file mode 100644 index 0000000..543cbbc --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/wallet/TopUpActivity.java @@ -0,0 +1,338 @@ +package com.dskj.rbchat.wallet; + +import android.content.Intent; +import android.content.res.ColorStateList; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.os.Bundle; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.view.View; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; +import androidx.core.graphics.drawable.DrawableCompat; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.LinearLayoutManager; + +import com.blankj.utilcode.util.ToastUtils; +import com.bumptech.glide.Glide; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.databinding.ActivityTopupBinding; +import com.dskj.rbchat.databinding.ActivityWalletInfoBinding; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.login.PhoneLoginActivity; +import com.dskj.rbchat.main.mine.ChangeAccoutActionActivity; +import com.dskj.rbchat.model.BindBean; +import com.dskj.rbchat.model.ExchangeConfBean; +import com.dskj.rbchat.model.SendOrderBean; +import com.dskj.rbchat.model.WalletBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.pay.LipinDuiHuanActivity; +import com.dskj.rbchat.utils.AnimUtil; +import com.dskj.rbchat.utils.AppUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.activities.BrowseActivity; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.corekit.im.IMKitClient; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class TopUpActivity extends BaseActivity { + boolean isG; + ActivityTopupBinding viewBinding; + WalletBean walletBean; + BindBean bindBean; + private List globalAmountList = new ArrayList<>(); + CommonAdapter commonAdapter; + int defaultIndex = 0; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + getWindow().setStatusBarColor(getResources().getColor(R.color.color_403d51)); + getWindow().setNavigationBarColor(getResources().getColor(R.color.color_fffbfb)); + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR | View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR); + + super.onCreate(savedInstanceState); + viewBinding = ActivityTopupBinding.inflate(getLayoutInflater()); + setContentView(viewBinding.getRoot()); + initView(); + bindInfo(); + getConf(); + } + + @Override + protected void onResume() { + super.onResume(); + getWallet(); + } + + private void bindInfo() { + Api.getInstance().bindInfo(IMKitClient.account()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result feedbackResp) { + bindBean = feedbackResp.data; + LogUtils.i("获取到的数据:" + GsonUtils.beanToJSONString(bindBean)); + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + } + }); + + } + + protected void initView() { + Drawable drawable = viewBinding.contactListActivityTitleBar.getBackImageView().getDrawable().mutate();// + Drawable wrap = DrawableCompat.wrap(drawable); + DrawableCompat.setTint(wrap, ContextCompat.getColor(this, R.color.color_d4ab90)); + viewBinding.contactListActivityTitleBar.getBackImageView().setImageDrawable(wrap); + viewBinding.contactListActivityTitleBar.getBackImageView().setOnClickListener(v -> finish()); + iniAdapter(); + + viewBinding.editQueryEt.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) { + if (TextUtils.isEmpty(viewBinding.editQueryEt.getText().toString().trim())) { + defaultIndex = 0; + } else { + if (exchangeConfBean != null) { + defaultIndex = Integer.parseInt(viewBinding.editQueryEt.getText().toString().trim()) * exchangeConfBean.getExchangeRatio(); + } else { + defaultIndex = Integer.parseInt(viewBinding.editQueryEt.getText().toString().trim()); + } + } + showBottomType(); + } + + @Override + public void afterTextChanged(Editable s) { + commonAdapter.notifyDataSetChanged(); + } + }); + AnimUtil.setAnimViews(viewBinding.topupTv); + + viewBinding.topupTv.setOnClickListener(v -> { + if (bindBean != null) { + if (!bindBean.getPhoneBind()) { + showDialog(); + } else if (!bindBean.getPayPasswordSet()) { + showDialogPay(); + } else { + sumbit(); + } + } + }); + + + } + + private void showBottomType() { + viewBinding.tvCashvalue.setText("NT$:" + defaultIndex); +// if (exchangeConfBean != null) { +// if(TextUtils.isEmpty(viewBinding.editQueryEt.getText().toString().trim())){ +// viewBinding.showZidingyiLy.setVisibility(View.GONE); +// }else{ +// viewBinding.showZidingyiLy.setVisibility(View.VISIBLE); +// viewBinding.zidingyicashTv.setText(defaultIndex+""); +// } +// }else{ +// viewBinding.showZidingyiLy.setVisibility(View.GONE); +// +// } + + } + + private void sumbit() { + if (exchangeConfBean != null) { + if ((defaultIndex < exchangeConfBean.getMinAmount()) || (defaultIndex > exchangeConfBean.getMaxAmount())) { + ToastUtils.showShort(String.format(getString(R.string.taixiao_topup_txt), exchangeConfBean.getMinAmount() / exchangeConfBean.getExchangeRatio(), exchangeConfBean.getMaxAmount() / exchangeConfBean.getExchangeRatio())); + return; + } + + HashMap map = new HashMap<>(); + map.put("amount", defaultIndex); + map.put("type", "3"); //信用卡支付 + Api.getInstance().sendOrderV2(map) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + @Override + public void onSuccess(Result feedbackResp) { + startToWeb(feedbackResp.data); + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast(msg); + } + }); + } + + } + + private void startToWeb(SendOrderBean sendOrderBean) { + String url = IMUIKitConfig.ONLINE_PAYMENT_URL + "?" + sendOrderBean.getQuery() + "&exchangeRatio=" + exchangeConfBean.getExchangeRatio() + "&type=3"; + LogUtils.i("请求地址:" + url); + BrowseActivity.Companion.launch( + TopUpActivity.this, getString(R.string.cash_cuzhi_txt), url); + } + + + ExchangeConfBean exchangeConfBean; + + private void getConf() { + Api.getInstance().chargeConf() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + exchangeConfBean = feedbackResp.data; + if (feedbackResp != null && feedbackResp.data.getAmountItems() != null) { + globalAmountList = feedbackResp.data.getAmountItems(); + commonAdapter.setDates(globalAmountList); + } + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast(msg); + } + }); + } + + + private void iniAdapter() { + GridLayoutManager linearLayoutManager = new GridLayoutManager(TopUpActivity.this, 3); + viewBinding.recylerview.setLayoutManager(linearLayoutManager); + commonAdapter = new CommonAdapter(TopUpActivity.this, R.layout.item_bill_top, globalAmountList) { + @Override + public void convert(ViewHolder holder, ExchangeConfBean.AmountItemsDTO s, int index) { + holder.setText(R.id.title_tv, String.format("%d", s.getGoldAmount())); + holder.setText(R.id.des_tv, String.format("NT$ %d", s.getNtAmount())); + LinearLayout big_bg = holder.getView(R.id.big_bg); + if (s.getNtAmount() == defaultIndex) { + big_bg.setBackgroundResource(R.drawable.logout_btn_main2); + } else { + big_bg.setBackgroundResource(R.drawable.input_bg_t); + } + + big_bg.setOnClickListener(v -> { + viewBinding.editQueryEt.setText(""); + defaultIndex = s.getNtAmount(); + viewBinding.editQueryEt.clearFocus(); + notifyDataSetChanged(); + showBottomType(); + }); + + } + }; + viewBinding.recylerview.setAdapter(commonAdapter); + + + } + + private void showDialogPay() { + + com.netease.yunxin.kit.chatkit.ui.dialog.ActionConfirmDialog actionDialog = new com.netease.yunxin.kit.chatkit.ui.dialog.ActionConfirmDialog(TopUpActivity.this, + getString(com.netease.yunxin.kit.chatkit.ui.R.string.bind_phone_des_txt1), getString(com.netease.yunxin.kit.chatkit.ui.R.string.cancel_txt), getString(com.netease.yunxin.kit.chatkit.ui.R.string.to_sett_txt)); + actionDialog.setOnToActionListener(new com.netease.yunxin.kit.chatkit.ui.dialog.ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { +// Intent intent = new Intent(getActivity(), ChangeAccoutActionActivity.class); +// intent.putExtra("type", 5); +// startActivity(intent); + Intent intent = new Intent(TopUpActivity.this, SetPayPasswordActivity.class); + startActivity(intent); + } + + @Override + public void toCancel() { + + } + }); + actionDialog.show(); + } + + + private void showDialog() { + + ActionConfirmDialog actionDialog = new ActionConfirmDialog(TopUpActivity.this, + getString(R.string.bind_phone_des_txt), getString(R.string.nobind_txt), getString(R.string.tobind_txt)); + actionDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + Intent intent = new Intent(TopUpActivity.this, ChangeAccoutActionActivity.class); + intent.putExtra("type", ChangeAccoutActionActivity.TYPE_BIND_PHONE); + startActivity(intent); + } + + @Override + public void toCancel() { + + } + }); + actionDialog.show(); + } + + private void getWallet() { + Api.getInstance().walletInfo(IMKitClient.account()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { + walletBean = feedbackResp.data; + changeInfo(); + } + + @Override + public void onError(int code, String msg) { + + } + }); + + + } + + + private void changeInfo() { + viewBinding.dianshuTv.setText(AppUtils.getQian(walletBean.getGoldCoin())); + } + + @Override + protected void onStop() { + super.onStop(); + + } + + +} diff --git a/app/src/main/java/com/dskj/rbchat/wallet/TopUpReusltActivity.java b/app/src/main/java/com/dskj/rbchat/wallet/TopUpReusltActivity.java new file mode 100644 index 0000000..0055c1b --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/wallet/TopUpReusltActivity.java @@ -0,0 +1,213 @@ +package com.dskj.rbchat.wallet; + +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.os.CountDownTimer; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.view.View; +import android.widget.LinearLayout; + +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.GridLayoutManager; + +import com.blankj.utilcode.util.ToastUtils; +import com.bumptech.glide.Glide; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.databinding.ActivityTopupBinding; +import com.dskj.rbchat.databinding.ActivityTopupResultBinding; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.main.mine.ChangeAccoutActionActivity; +import com.dskj.rbchat.model.BindBean; +import com.dskj.rbchat.model.SendOrderBean; +import com.dskj.rbchat.model.WalletBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.AnimUtil; +import com.dskj.rbchat.utils.AppUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.activities.BrowseActivity; +import com.netease.yunxin.kit.corekit.im.IMKitClient; + +import java.util.ArrayList; +import java.util.List; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class TopUpReusltActivity extends BaseActivity { + ActivityTopupResultBinding viewBinding; + int paymentType = TYPE_PAYMENT_ING; + /**支付中*/ + private static final int TYPE_PAYMENT_ING = 1; + /**支付成功*/ + private static final int TYPE_PAYMENT_SUCCESS = 2; + /**支付失败*/ + private static final int TYPE_PAYMENT_FAILED = 3; + /**支付超时*/ + private static final int TYPE_PAYMENT_TIME_OUT = 4; + + SendOrderBean sendOrderBean = null; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + getWindow().setStatusBarColor(getResources().getColor(R.color.color_fcfcfc)); + getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white)); + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR|View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR); + + super.onCreate(savedInstanceState); + viewBinding = ActivityTopupResultBinding.inflate(getLayoutInflater()); + sendOrderBean = getIntent().getParcelableExtra("bean"); + setContentView(viewBinding.getRoot()); + initView(); + AnimUtil.setAnimViews(viewBinding.backTv,viewBinding.buttonTv); + viewBinding.backTv.setOnClickListener(v -> finish()); + viewBinding.buttonTv.setOnClickListener(v -> finish()); + showType(); + myCountDownTimer = new MyCountDownTimer(1000 * 60 * 15, 1000); + myCountDownTimer.start(); + startToWeb(sendOrderBean); + } + + + private void startToWeb(SendOrderBean sendOrderBean) { +// LogUtils.i("参数是啥:"+ IMUIKitConfig.ONLINE_PAYMENT_URL+"?"+sendOrderBean.getQuery()); +// Intent intent= new Intent(); +// intent.setAction("android.intent.action.VIEW"); +// Uri content_url = Uri.parse(IMUIKitConfig.ONLINE_PAYMENT_URL+"?"+sendOrderBean.getQuery()); +// intent.setData(content_url); +// startActivity(intent); + BrowseActivity.Companion.launch( + TopUpReusltActivity.this, getString(R.string.cash_cuzhi_txt), IMUIKitConfig.ONLINE_PAYMENT_URL+"?"+sendOrderBean.getQuery()); + } + + + private void showType() { + viewBinding.typeIngTv.setVisibility(View.GONE); + viewBinding.backTv.setVisibility(View.GONE); + viewBinding.typeSuccessLy.setVisibility(View.GONE); + switch (paymentType){ + case TYPE_PAYMENT_ING: + viewBinding.typeIngTv.setVisibility(View.VISIBLE); + viewBinding.statusIv.setImageResource(R.mipmap.zhifuzhong_img_top); + viewBinding.statusTv.setText(R.string.zhifuzhong_txt1); + viewBinding.contactListActivityTitleBar.getTitleTextView().setText(R.string.zhifuzhong_txt); + Glide.with(TopUpReusltActivity.this) + .load(R.mipmap.zhifuzhong_img) + .into(viewBinding.statusIv); + break; + case TYPE_PAYMENT_SUCCESS: + if(myCountDownTimer!=null){ + myCountDownTimer.cancel(); + myCountDownTimer = null; + } + viewBinding.typeSuccessLy.setVisibility(View.VISIBLE); + viewBinding.statusIv.setImageResource(R.mipmap.zhifusucc_img_top); + viewBinding.statusTv.setText(R.string.zhiufuchengg_txt); + viewBinding.contactListActivityTitleBar.getTitleTextView().setText(R.string.zhiufuchengg_txt); + viewBinding.jineTv.setText("NT$ "+sendOrderBean.getTotalAmount()); + viewBinding.cashDianshuTv.setText(""+sendOrderBean.getTotalAmount()); + break; + case TYPE_PAYMENT_FAILED: + if(myCountDownTimer!=null){ + myCountDownTimer.cancel(); + myCountDownTimer = null; + } + viewBinding.backTv.setVisibility(View.VISIBLE); + viewBinding.statusIv.setImageResource(R.mipmap.zhifufailed_img_top); + viewBinding.statusTv.setText(R.string.zhifushibai_txt); + viewBinding.contactListActivityTitleBar.getTitleTextView().setText(R.string.zhifushibai_txt); + + break; + case TYPE_PAYMENT_TIME_OUT: + if(myCountDownTimer!=null){ + myCountDownTimer.cancel(); + myCountDownTimer = null; + } + viewBinding.backTv.setVisibility(View.VISIBLE); + viewBinding.statusIv.setImageResource(R.mipmap.zhifufailed_img_top); + viewBinding.statusTv.setText(R.string.zhifushibai_txt1); + viewBinding.contactListActivityTitleBar.getTitleTextView().setText(R.string.zhifushibai_txt2); + + break; + } + } + + + + protected void initView() { + viewBinding.contactListActivityTitleBar.getBackImageView().setOnClickListener(v -> finish()); + + } + + + @Override + protected void onStop() { + super.onStop(); + + } + + + MyCountDownTimer myCountDownTimer; + int count = 0; + private class MyCountDownTimer extends CountDownTimer { + + public MyCountDownTimer(long millisInFuture, long countDownInterval) { + super(millisInFuture, countDownInterval); + } + + //计时过程 + @Override + public void onTick(long l) { + viewBinding.typeIngTv.setText(String.format(getString(R.string.shengyu_time_txt), getEndTime(l) + "")); + count++; + //每两秒轮询一次 + if(count == 2){ + count = 0; + getPlyResult(false); + } + + } + + //计时完毕的方法 + @Override + public void onFinish() { + + getPlyResult(true); + } + } + + private void getPlyResult(boolean isEnd) { + + if(isEnd){ + paymentType = TYPE_PAYMENT_TIME_OUT; + showType(); + } + } + + /** + * 订单剩余时间 分/秒/00 + * @param l + * @return + */ + private String getEndTime(long l) { + if(l/(1000*60)>0){ + long mm = l/(1000*60); + long ss = l%(1000*60)/1000; + return (mm<10?"0"+mm:""+mm)+":"+(ss<10?"0"+ss:""+ss)+":00"; + }else{ + long ss = l/1000; + return "00:"+(ss<10?"0"+ss:""+ss)+":00"; + } + } + + +} diff --git a/app/src/main/java/com/dskj/rbchat/wallet/WalletFragment.java b/app/src/main/java/com/dskj/rbchat/wallet/WalletFragment.java new file mode 100644 index 0000000..39e616b --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/wallet/WalletFragment.java @@ -0,0 +1,286 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.wallet; + +import android.content.Intent; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentActivity; +import androidx.viewpager2.adapter.FragmentStateAdapter; + +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.contact.UserInfoActivity; +import com.dskj.rbchat.databinding.FragmentVoomBinding; +import com.dskj.rbchat.databinding.FragmentWalletBinding; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.game.JsBridgeActivity; +import com.dskj.rbchat.main.MainActivity; +import com.dskj.rbchat.main.mine.ChangeAccoutActionActivity; +import com.dskj.rbchat.main.mine.setting.SettingNewActivity; +import com.dskj.rbchat.model.AuthorizeBean; +import com.dskj.rbchat.model.BindBean; +import com.dskj.rbchat.model.GameBean; +import com.dskj.rbchat.model.ListBeanResult; +import com.dskj.rbchat.model.StaffServiceIdBean; +import com.dskj.rbchat.model.WalletBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.pay.CollectionAndPaymentActivity; +import com.dskj.rbchat.utils.AnimUtil; +import com.dskj.rbchat.utils.Constant; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.voom.CircleFragment; +import com.dskj.rbchat.voom.MessageActivity; +import com.dskj.rbchat.voom.PushActivity; +import com.dskj.rbchat.voom.comm.CircleFragment1; +import com.dskj.rbchat.voom.comm.CircleFragment2; +import com.google.android.material.tabs.TabLayoutMediator; +import com.netease.yunxin.kit.alog.ALog; +import com.netease.yunxin.kit.common.ui.fragments.BaseFragment; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.utils.RouterConstant; +import com.netease.yunxin.kit.corekit.route.XKitRouter; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class WalletFragment extends BaseFragment { + private FragmentWalletBinding binding; + BindBean bindBean; + WalletBean walletBean; + + @Nullable + @Override + public View onCreateView( + @NonNull LayoutInflater inflater, + @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + binding = FragmentWalletBinding.inflate(inflater); + return binding.getRoot(); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + initShow(); + } + + private void initShow() { + binding.itemJinbiLy.setOnClickListener(v -> { + if (bindBean != null) { + if (!bindBean.getPhoneBind()) { + showDialog(); + } else { + Intent intent = new Intent(getActivity(), WalletInfoActivity.class); + intent.putExtra("isG", true); + startActivity(intent); + } + } + }); + binding.yinbiLy.setOnClickListener(v -> { + + if (bindBean != null) { + if (!bindBean.getPhoneBind()) { + showDialog(); + } else { + Intent intent = new Intent(getActivity(), WalletInfoActivity.class); + intent.putExtra("isG", false); + startActivity(intent); + } + } + + + }); + + binding.kefuImg.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Api.getInstance().helpCenterStaffServiceId(IMUIKitConfig.SUBSTATIONID,1) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { +// toRengongCallTop(feedbackResp.data.getStaffServiceId(),feedbackResp.data.getStaffServiceNickname()); + XKitRouter.withKey(RouterConstant.PATH_CHAT_P2P_PAGE) + .withParam(RouterConstant.CHAT_ID_KRY, feedbackResp.data.getStaffServiceId()+"") + .withContext(getActivity()) + .navigate(); + } + + @Override + public void onError(int code, String msg) { + ToastX.showShortToast( msg); + + } + }); + } + }); +// binding.tongbiLy.setOnClickListener(v -> { +// +// if (bindBean != null) { +// if (!bindBean.getPhoneBind()) { +// showDialog(); +// } else { +// Intent intent = new Intent(getActivity(), WalletInfoTongBiActivity.class); +// startActivity(intent); +// } +// } +// +// +// }); + + binding.paySettingTv.setOnClickListener(v -> { + if (bindBean != null) { + if (!bindBean.getPhoneBind()) { + showDialog(); + } else { + startActivity(new Intent(getActivity(), PaySettingActivity.class)); + } + } + }); + + + + binding.ivIndexfmSettingtop.setOnClickListener(v -> startActivity(new Intent(getActivity(), SettingNewActivity.class))); + + getWallet(); + bindInfo(); + + AnimUtil.setAnimViews(binding.itemJinbiLy, + binding.yinbiLy, binding.paySettingTv); + AnimUtil.setAnimViews(1.1f, binding.ivIndexfmSettingtop); + + } + + private void toTlt() { + MainActivity activity = (MainActivity) getActivity(); + activity.toTlt(); + } + + private void showDialogPay() { + + com.netease.yunxin.kit.chatkit.ui.dialog.ActionConfirmDialog actionDialog = new com.netease.yunxin.kit.chatkit.ui.dialog.ActionConfirmDialog(getActivity(), + getString(com.netease.yunxin.kit.chatkit.ui.R.string.bind_phone_des_txt1), getString(com.netease.yunxin.kit.chatkit.ui.R.string.cancel_txt), getString(com.netease.yunxin.kit.chatkit.ui.R.string.to_sett_txt)); + actionDialog.setOnToActionListener(new com.netease.yunxin.kit.chatkit.ui.dialog.ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { +// Intent intent = new Intent(getActivity(), ChangeAccoutActionActivity.class); +// intent.putExtra("type", 5); +// startActivity(intent); + Intent intent = new Intent(getActivity(), SetPayPasswordActivity.class); + startActivity(intent); + } + + @Override + public void toCancel() { + + } + }); + actionDialog.show(); + } + + + + + private void showDialog() { + + ActionConfirmDialog actionDialog = new ActionConfirmDialog(getActivity(), + getString(R.string.bind_phone_des_txt), getString(R.string.nobind_txt), getString(R.string.tobind_txt)); + actionDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + Intent intent = new Intent(getActivity(), ChangeAccoutActionActivity.class); + intent.putExtra("type", ChangeAccoutActionActivity.TYPE_BIND_PHONE); + startActivity(intent); + } + + @Override + public void toCancel() { + + } + }); + actionDialog.show(); + } + + + @Override + public void onResume() { + super.onResume(); + getWallet(); + if (bindBean == null || (!bindBean.getPhoneBind()) || (!bindBean.getPayPasswordSet())) { + bindInfo(); + } + } + + private void bindInfo() { + Api.getInstance().bindInfo(IMKitClient.account()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + bindBean = feedbackResp.data; + LogUtils.i("获取到的数据:" + GsonUtils.beanToJSONString(bindBean)); + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + } + }); + + } + + private void getWallet() { + Api.getInstance().walletInfo(IMKitClient.account()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { + walletBean = feedbackResp.data; + changeInfo(); + + } + + @Override + public void onError(int code, String msg) { + + } + }); + + + } + + + private void changeInfo() { + if (walletBean != null) { + binding.jinbiTv.setText(String.format("%.2f", walletBean.getGoldCoin() / 100f)); + binding.yinbiTv.setText(String.format("%.2f", walletBean.getSilverCoin() / 100f)); + + } + + } + + +} diff --git a/app/src/main/java/com/dskj/rbchat/wallet/WalletFragmentBf.java b/app/src/main/java/com/dskj/rbchat/wallet/WalletFragmentBf.java new file mode 100644 index 0000000..0dbfc07 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/wallet/WalletFragmentBf.java @@ -0,0 +1,264 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.wallet; + +import android.content.Intent; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.FragmentWalletBfBinding; +import com.dskj.rbchat.databinding.FragmentWalletBinding; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.main.MainActivity; +import com.dskj.rbchat.main.mine.ChangeAccoutActionActivity; +import com.dskj.rbchat.main.mine.setting.SettingNewActivity; +import com.dskj.rbchat.model.BindBean; +import com.dskj.rbchat.model.WalletBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.pay.CollectionAndPaymentActivity; +import com.dskj.rbchat.utils.AnimUtil; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.netease.yunxin.kit.common.ui.fragments.BaseFragment; +import com.netease.yunxin.kit.corekit.im.IMKitClient; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +@Deprecated +public class WalletFragmentBf extends BaseFragment { + private FragmentWalletBfBinding binding; + BindBean bindBean; + WalletBean walletBean; + + @Nullable + @Override + public View onCreateView( + @NonNull LayoutInflater inflater, + @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + binding = FragmentWalletBfBinding.inflate(inflater); + return binding.getRoot(); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + initShow(); + } + + private void initShow() { + binding.itemJinbiLy.setOnClickListener(v -> { + if (bindBean != null) { + if (!bindBean.getPhoneBind()) { + showDialog(); + } else { + Intent intent = new Intent(getActivity(), WalletInfoActivity.class); + intent.putExtra("isG", true); + startActivity(intent); + } + } + }); + binding.yinbiLy.setOnClickListener(v -> { + + if (bindBean != null) { + if (!bindBean.getPhoneBind()) { + showDialog(); + } else { + Intent intent = new Intent(getActivity(), WalletInfoActivity.class); + intent.putExtra("isG", false); + startActivity(intent); + } + } + + + }); +// binding.tongbiLy.setOnClickListener(v -> { +// +// if (bindBean != null) { +// if (!bindBean.getPhoneBind()) { +// showDialog(); +// } else { +// Intent intent = new Intent(getActivity(), WalletInfoTongBiActivity.class); +// startActivity(intent); +// } +// } +// +// +// }); + + binding.shoufukuanTv.setOnClickListener(v -> { + if (bindBean != null) { + if (!bindBean.getPhoneBind()) { + showDialog(); + } else { + + if (!bindBean.getPayPasswordSet()) { + showDialogPay(); + return; + } + + startActivity(new Intent(getActivity(), CollectionAndPaymentActivity.class)); + } + } + }); + binding.paySettingTv.setOnClickListener(v -> { + if (bindBean != null) { + if (!bindBean.getPhoneBind()) { + showDialog(); + } else { + startActivity(new Intent(getActivity(), PaySettingActivity.class)); + } + } + }); + + binding.saoyisaoTv.setOnClickListener(v -> { + MainActivity activity = (MainActivity) getActivity(); + activity.toScan(); + }); + + + binding.taoletingTv.setOnClickListener(v -> { + toTlt(); + }); + binding.wawajiLy.setOnClickListener(v -> { + toTlt(); + }); + binding.yinbiShopTv.setOnClickListener(v -> { + MainActivity activity = (MainActivity) getActivity(); + activity.toSShop(false); + }); + + binding.ivIndexfmSettingtop.setOnClickListener(v -> startActivity(new Intent(getActivity(), SettingNewActivity.class))); + getWallet(); + bindInfo(); + + AnimUtil.setAnimViews(binding.wawajiLy, binding.itemJinbiLy, + binding.yinbiLy); + AnimUtil.setAnimViews(1.1f, binding.taoletingTv, binding.ivIndexfmSettingtop, binding.shoufukuanTv, binding.paySettingTv, binding.yinbiShopTv); + + } + + private void toTlt() { + MainActivity activity = (MainActivity) getActivity(); + activity.toTlt(); + } + + private void showDialogPay() { + + com.netease.yunxin.kit.chatkit.ui.dialog.ActionConfirmDialog actionDialog = new com.netease.yunxin.kit.chatkit.ui.dialog.ActionConfirmDialog(getActivity(), + getString(com.netease.yunxin.kit.chatkit.ui.R.string.bind_phone_des_txt1), getString(com.netease.yunxin.kit.chatkit.ui.R.string.cancel_txt), getString(com.netease.yunxin.kit.chatkit.ui.R.string.to_sett_txt)); + actionDialog.setOnToActionListener(new com.netease.yunxin.kit.chatkit.ui.dialog.ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { +// Intent intent = new Intent(getActivity(), ChangeAccoutActionActivity.class); +// intent.putExtra("type", 5); +// startActivity(intent); + Intent intent = new Intent(getActivity(), SetPayPasswordActivity.class); + startActivity(intent); + } + + @Override + public void toCancel() { + + } + }); + actionDialog.show(); + } + + + + + private void showDialog() { + + ActionConfirmDialog actionDialog = new ActionConfirmDialog(getActivity(), + getString(R.string.bind_phone_des_txt), getString(R.string.nobind_txt), getString(R.string.tobind_txt)); + actionDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + Intent intent = new Intent(getActivity(), ChangeAccoutActionActivity.class); + intent.putExtra("type", ChangeAccoutActionActivity.TYPE_BIND_PHONE); + startActivity(intent); + } + + @Override + public void toCancel() { + + } + }); + actionDialog.show(); + } + + + @Override + public void onResume() { + super.onResume(); + getWallet(); + if (bindBean == null || (!bindBean.getPhoneBind()) || (!bindBean.getPayPasswordSet())) { + bindInfo(); + } + } + + private void bindInfo() { + Api.getInstance().bindInfo(IMKitClient.account()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + bindBean = feedbackResp.data; + LogUtils.i("获取到的数据:" + GsonUtils.beanToJSONString(bindBean)); + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + } + }); + + } + + private void getWallet() { + Api.getInstance().walletInfo(IMKitClient.account()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { + walletBean = feedbackResp.data; + changeInfo(); + + } + + @Override + public void onError(int code, String msg) { + + } + }); + + + } + + + private void changeInfo() { + if (walletBean != null) { + binding.jinbiTv.setText(String.format("%.2f", walletBean.getGoldCoin() / 100f)); + binding.yinbiTv.setText(String.format("%.2f", walletBean.getSilverCoin() / 100f)); + + } + + } + + +} diff --git a/app/src/main/java/com/dskj/rbchat/wallet/WalletInfoActivity.java b/app/src/main/java/com/dskj/rbchat/wallet/WalletInfoActivity.java new file mode 100644 index 0000000..c5b574d --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/wallet/WalletInfoActivity.java @@ -0,0 +1,214 @@ +package com.dskj.rbchat.wallet; + +import android.content.Intent; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.view.View; + +import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; +import androidx.core.graphics.drawable.DrawableCompat; + +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.ActivityWalletInfoBinding; +import com.dskj.rbchat.databinding.ActivityWalletInfoNewBinding; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.main.mine.ChangeAccoutActionActivity; +import com.dskj.rbchat.main.mine.MineFragment; +import com.dskj.rbchat.model.BindBean; +import com.dskj.rbchat.model.WalletBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.pay.CollectionAndPaymentActivity; +import com.dskj.rbchat.pay.LipinDuiHuanActivity; +import com.dskj.rbchat.utils.AnimUtil; +import com.dskj.rbchat.utils.AppUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.corekit.im.IMKitClient; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class WalletInfoActivity extends BaseActivity { + boolean isG; + ActivityWalletInfoNewBinding viewBinding; + WalletBean walletBean; + BindBean bindBean; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + + + super.onCreate(savedInstanceState); + viewBinding = ActivityWalletInfoNewBinding.inflate(getLayoutInflater()); + setContentView(viewBinding.getRoot()); + isG = getIntent().getBooleanExtra("isG", true); + initView(); + getWallet(); + bindInfo(); + } + + + private void bindInfo() { + Api.getInstance().bindInfo(IMKitClient.account()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + bindBean = feedbackResp.data; + LogUtils.i("获取到的数据:" + GsonUtils.beanToJSONString(bindBean)); + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + } + }); + + } + + protected void initView() { + viewBinding.contactListActivityTitleBar.getBackImageView().setOnClickListener(v -> finish()); + if(isG){ + getWindow().setStatusBarColor(getResources().getColor(R.color.color_3b3556)); + getWindow().setNavigationBarColor(getResources().getColor(R.color.color_3b3556)); + viewBinding.jinbiLy.setVisibility(View.VISIBLE); + viewBinding.yinbiLy.setVisibility(View.GONE); + viewBinding.contactListActivityTitleBar.getTitleTextView().setText(getString(R.string.wodejinbi_txt)); + viewBinding.contactListActivityTitleBar.setBackgroundColor(getResources().getColor(R.color.color_3b3556)); + getSupportFragmentManager().beginTransaction() + .replace(R.id.frameLayout, WalletInfoFragment.newInstance(0,getIntent().getIntExtra("type",-1),null)) + .commit(); + viewBinding.bigBg.setBackgroundResource(R.color.color_3b3556); + viewBinding.contactListActivityTitleBar.getTitleTextView().setTextColor(getColor(R.color.color_e5b797)); + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE); +//Drawable drawable = getResources().getDrawable(R.drawable.ic_func).mutate();这种获取drawable效果是一样的 + Drawable drawable = viewBinding.contactListActivityTitleBar.getBackImageView().getDrawable().mutate();// + Drawable wrap = DrawableCompat.wrap(drawable); + DrawableCompat.setTint(wrap, ContextCompat.getColor(this,R.color.color_e5b797)); + viewBinding.contactListActivityTitleBar.getBackImageView().setImageDrawable(wrap); + }else{ + getWindow().setStatusBarColor(getResources().getColor(R.color.color_ffeda6)); + getWindow().setNavigationBarColor(getResources().getColor(R.color.color_ffeda6)); + viewBinding.contactListActivityTitleBar.setBackgroundColor(getResources().getColor(R.color.color_ffeda6)); + + viewBinding.jinbiLy.setVisibility(View.GONE); + viewBinding.yinbiLy.setVisibility(View.VISIBLE); + viewBinding.contactListActivityTitleBar.getTitleTextView().setText(getString(R.string.wodeyinbi_txt)); + getSupportFragmentManager().beginTransaction() + .replace(R.id.frameLayout, WalletInfoFragment.newInstance(1,getIntent().getIntExtra("type",-1),null)) + .commit(); + viewBinding.bigBg.setBackgroundResource(R.color.color_ffeda6); + viewBinding.contactListActivityTitleBar.getTitleTextView().setTextColor(getColor(R.color.color_383838)); + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + + + } + + viewBinding.topupTv.setOnClickListener(v -> startActivity(new Intent(WalletInfoActivity.this, TopUpActivity.class))); +// viewBinding.withoutTv.setOnClickListener(v -> ToastX.showShortToast("敬请期待")); + viewBinding.lipinduihuanTv.setOnClickListener(v ->{ + if (bindBean != null) { + if (!bindBean.getPhoneBind()) { + showDialog(); + } else if (!bindBean.getPayPasswordSet()) { + showDialogPay(); + }else { + startActivity(new Intent(WalletInfoActivity.this, LipinDuiHuanActivity.class)); + } + } + } ); + + AnimUtil.setAnimViews(viewBinding.topupTv); + } + + + private void showDialogPay() { + + com.netease.yunxin.kit.chatkit.ui.dialog.ActionConfirmDialog actionDialog = new com.netease.yunxin.kit.chatkit.ui.dialog.ActionConfirmDialog(WalletInfoActivity.this, + getString(com.netease.yunxin.kit.chatkit.ui.R.string.bind_phone_des_txt1), getString(com.netease.yunxin.kit.chatkit.ui.R.string.cancel_txt), getString(com.netease.yunxin.kit.chatkit.ui.R.string.to_sett_txt)); + actionDialog.setOnToActionListener(new com.netease.yunxin.kit.chatkit.ui.dialog.ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { +// Intent intent = new Intent(getActivity(), ChangeAccoutActionActivity.class); +// intent.putExtra("type", 5); +// startActivity(intent); + Intent intent = new Intent(WalletInfoActivity.this, SetPayPasswordActivity.class); + startActivity(intent); + } + + @Override + public void toCancel() { + + } + }); + actionDialog.show(); + } + + + private void showDialog() { + + ActionConfirmDialog actionDialog = new ActionConfirmDialog(WalletInfoActivity.this, + getString(R.string.bind_phone_des_txt), getString(R.string.nobind_txt), getString(R.string.tobind_txt)); + actionDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + Intent intent = new Intent(WalletInfoActivity.this, ChangeAccoutActionActivity.class); + intent.putExtra("type", ChangeAccoutActionActivity.TYPE_BIND_PHONE); + startActivity(intent); + } + + @Override + public void toCancel() { + + } + }); + actionDialog.show(); + } + + private void getWallet() { + Api.getInstance().walletInfo(IMKitClient.account()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { + walletBean = feedbackResp.data; + changeInfo(); + + } + + @Override + public void onError(int code, String msg) { + + } + }); + + + } + + + private void changeInfo() { + if (walletBean != null) { + viewBinding.jinbiYueTv.setText(AppUtils.getQian(walletBean.getGoldCoin())); + viewBinding.yinbiYueTv.setText(AppUtils.getQian(walletBean.getSilverCoin())); + + } + + } + @Override + protected void onStop() { + super.onStop(); + + } + + + + +} diff --git a/app/src/main/java/com/dskj/rbchat/wallet/WalletInfoFragment.java b/app/src/main/java/com/dskj/rbchat/wallet/WalletInfoFragment.java new file mode 100644 index 0000000..72fd051 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/wallet/WalletInfoFragment.java @@ -0,0 +1,1015 @@ +package com.dskj.rbchat.wallet; + +import android.os.Bundle; +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.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + + +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; + +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.databinding.FragmentWalletInfoBinding; +import com.dskj.rbchat.dialog.SelectTypeDialog; +import com.dskj.rbchat.model.BillBean; +import com.dskj.rbchat.model.BindBean; +import com.dskj.rbchat.model.ListBeanResult; +import com.dskj.rbchat.model.RosterElementEntity; +import com.dskj.rbchat.model.StatisticsBean; +import com.dskj.rbchat.model.TaskBean; +import com.dskj.rbchat.model.TypeBean; +import com.dskj.rbchat.model.WithdrawCashBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.AppUtils; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.voom.MessageActivity; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.team.TeamService; +import com.netease.nimlib.sdk.team.model.Team; +import com.netease.nimlib.sdk.uinfo.UserService; +import com.netease.nimlib.sdk.uinfo.model.NimUserInfo; +import com.netease.yunxin.kit.common.ui.fragments.BaseFragment; +import com.netease.yunxin.kit.common.ui.utils.TimeFormatUtils; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.scwang.smart.refresh.layout.SmartRefreshLayout; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +//import com.bigkoo.pickerview.builder.TimePickerBuilder; +//import com.bigkoo.pickerview.view.TimePickerView; + +/** + * 主页模块 + * + * @author + */ +public class WalletInfoFragment extends BaseFragment { + int status; + + int pageSize = 1; + // private TimePickerView pvTime; + String time = "2022-06"; + int type = -1; + String typeInfo = ""; + String billBean = null; + CommonAdapter commonAdapter; + private ArrayList titles = new ArrayList<>(); + List taskBeans = null; + int loc = 0; + FragmentWalletInfoBinding binding; + + public static WalletInfoFragment newInstance(int status1, int type, String billBean) { + Bundle bundle = new Bundle(); + bundle.putInt("type", status1); + bundle.putInt("type1", type); + bundle.putString("bean", billBean); + WalletInfoFragment view = new WalletInfoFragment(); + view.setArguments(bundle); + return view; + } + + + @Nullable + @Override + public View onCreateView( + @NonNull LayoutInflater inflater, + @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + binding = FragmentWalletInfoBinding.inflate(inflater); + return binding.getRoot(); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + initViews(); + } + + + protected void initViews() { + this.status = getArguments().getInt("type"); + type = getArguments().getInt("type1"); + billBean = getArguments().getString("bean"); + if (this.status == 1) { + binding.typeNameTv.setText(getString(R.string.yinbimingxi_txt)); + } + if (this.status == 2) { + binding.typeNameTv.setText(getString(R.string.lijinmingxi_txt)); + } + if (billBean != null) { + taskBeans = GsonUtils.getListFromJSON(billBean, TaskBean.class); + } + Calendar selectedDate = Calendar.getInstance();//系统当前时间 + time = selectedDate.get(Calendar.YEAR) + "-" + ((selectedDate.get(Calendar.MONTH) + 1) < 10 ? "0" + (selectedDate.get(Calendar.MONTH) + 1) : (selectedDate.get(Calendar.MONTH) + 1)); + + + loc = DataUtils.get(IMApplication.getInstance(), "locale", 1); + +// } + binding.typeTv1.setOnClickListener(v -> { + SelectTypeDialog selectTypeDialog = new SelectTypeDialog(getActivity(), type, this.status == 0); + selectTypeDialog.setOnToVipListener(t -> { + type = t.getType(); + binding.typeTv1.setText(TypeBean.getTypeString1(type, this.status == 0)); + binding.refreshLayout.autoRefresh(); + }); + selectTypeDialog.show(); + }); + initList(); + initRefreshLayout(); + + + } + + private void getStatistics() { + Map map = new HashMap<>(); + if (status == 0) { + map.put("coinType", 0); + } else { + map.put("coinType", 1); + + } + if (TextUtils.isEmpty(typeInfo)) { + + } else { + String statTime = time + "-01 00:00:01"; + String endTime = time + "-" + getMonth(time) + " 23:59:59"; + map.put("timeGe", statTime); + map.put("timeLe", endTime); + } + if (!TextUtils.isEmpty(IMUIKitConfig.SUBSTATIONID)) { + map.put("substationId", IMUIKitConfig.SUBSTATIONID); + } + Api.getInstance().statistics(IMKitClient.account(), map) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + if (feedbackResp.data != null) { +// outTv.setText(String.format("%.2f", Math.abs(feedbackResp.data.getOutgoing()) / 100f)); +// incomeTv.setText(String.format("%.2f", feedbackResp.data.getIncoming() / 100f)); + } + } + + @Override + public void onError(int code, String msg) { + + } + }); + + } + + +// private void initCustomTimePicker() { +// /** +// * @description +// * +// * 注意事项: +// * 1.自定义布局中,id为 optionspicker 或者 timepicker 的布局以及其子控件必须要有,否则会报空指针. +// * 具体可参考demo 里面的两个自定义layout布局。 +// * 2.因为系统Calendar的月份是从0-11的,所以如果是调用Calendar的set方法来设置时间,月份的范围也要是从0-11 +// * setRangDate方法控制起始终止时间(如果不设置范围,则使用默认时间1900-2100年,此段代码可注释) +// */ +// Calendar selectedDate = Calendar.getInstance();//系统当前时间 +// Calendar startDate = Calendar.getInstance(); +// startDate.set(2023, 3, 1); +// Calendar endDate = Calendar.getInstance(); +//// endDate.set(selectedDate.get(Calendar.YEAR), selectedDate.get(Calendar.MONTH) , 28); +// //时间选择器 ,自定义布局 +// pvTime = new TimePickerBuilder(getActivity(), (date, v) -> {//选中事件回调 +// binding.dateTv.setText(getTime(date)); +// time = getTime(date); +// typeInfo = time; +// refreshLayout.autoRefresh(); +// getStatistics(); +// +// }).setBgColor(getResources().getColor(R.color.white)) +// .setContentTextSize(18) +// .setTextColorCenter(getResources().getColor(R.color.black)) +// .setTextColorOut(getResources().getColor(R.color.common_list_hint_text)) +// .setDividerColor(getResources().getColor(R.color.color_f7f7fc)) +// .setRangDate(startDate, endDate) +// .setDate(selectedDate) +// .setLayoutRes(R.layout.pickerview_time, v -> { +// final TextView tvSubmit = (TextView) v.findViewById(R.id.btnSubmit); +// tvSubmit.setTextColor(getResources().getColor(R.color.colorAccent)); +// TextView ivCancel = (TextView) v.findViewById(R.id.btnCancel); +// ivCancel.setTextColor(getResources().getColor(R.color.colorAccent)); +// +// ivCancel.setText(getString(R.string.all_time_txt)); +// tvSubmit.setOnClickListener(v12 -> { +// pvTime.returnData(); +// pvTime.dismiss(); +// }); +// ivCancel.setOnClickListener(v1 -> { +// typeInfo = ""; +// dateTv.setText(getString(R.string.all_time_txt)); +// pvTime.dismiss(); +// refreshLayout.autoRefresh(); +// getStatistics(); +// +// }); +// }) +// .setType(new boolean[]{true, true, false, false, false, false}) +// .setLabel(getString(R.string.time_year_txt), getString(R.string.time_month_txt), getString(R.string.time_day_txt), +// getString(R.string.time_shi_txt), getString(R.string.time_fen_txt), getString(R.string.time_miao_txt)) +// .setLineSpacingMultiplier(1.6f) +// .setTextXOffset(0, 0, 0, 40, 0, -40) +// .isCenterLabel(false) //是否只显示中间选中项的label文字,false则每项item全部都带有label。 +// .setDividerColor(0x00000000) +// .build(); +// } + + + private String getTime(Date date) {//可根据需要自行截取数据显示 + Log.d("getTime()", "choice date millis: " + date.getTime()); + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM"); + return format.format(date); + } + + + private void initList() { + LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity()); + binding.recyclerview.setLayoutManager(linearLayoutManager); + commonAdapter = new CommonAdapter(getContext(), R.layout.item_bill_list, titles) { + @Override + public void convert(ViewHolder holder, BillBean s, int index) { +// holder.setText(R.id.price_tv, AppUtils.getQian(s.getAmount()) + (status == 0 ? getString(R.string.species_txt) : +// getString(R.string.silver_coins_txt))); + holder.setText(R.id.price_tv, AppUtils.getQian(s.getAmount())); + TextView textView = holder.getView(R.id.price_tv); + if (s.getAmount() < 0) { + textView.setTextColor(getResources().getColor(R.color.black)); + } else { + textView.setTextColor(getResources().getColor(R.color.black)); + } + TextView statusTv = holder.getView(R.id.status_tv); + statusTv.setVisibility(View.GONE); + if (status == 0) { + if (s.getType() == 5) { + if (s.getWithdrawCashRecord() != null) { + statusTv.setVisibility(View.VISIBLE); + statusTv.setText(getStatusTxt(s.getWithdrawCashRecord())); + } + } + } + holder.setText(R.id.balan_tv, getString(R.string.yuee_2f_txt1) + AppUtils.getQian(s.getBalance())); +// holder.setText(R.id.title_tv,getUserInfo(s)+getTypeString(s.getType())); + holder.setText(R.id.title_tv, getTypeNoteString(s)); + + holder.setText(R.id.time_tv, s.getCreateTime()); + if (!TextUtils.isEmpty(s.getCreateTimestamp())) { + holder.setText(R.id.time_tv, TimeFormatUtils.formatMillisecond(getActivity(), Long.parseLong(s.getCreateTimestamp()))); + + } + holder.getView(R.id.big_bg).setOnClickListener(v -> { + + }); + ((ImageView) holder.getView(R.id.logo_iv)).setImageResource(getTypeRes(s)); + + } + }; + binding.recyclerview.setAdapter(commonAdapter); + } + + private String getStatusTxt(WithdrawCashBean withdrawCashRecord) { + //0 未处理,1 客服审核通过,2 已打款,3 拒绝 + switch (withdrawCashRecord.getStatus()) { + case 0: + return getString(R.string.weichuli_txt); + case 1: + return getString(R.string.kefushenhetongguo_txt); + case 2: + return getString(R.string.yidakuan_txt); + case 3: + return getString(R.string.yijujue_txt); + default: + return ""; + } + } + + //转账给商家 type 31 + private String getAmount(BillBean s, long amount) { + return status == 1 && s.getType() == 31 ? String.valueOf(amount) : AppUtils.getQian(amount); + } + + private String getTypeNoteString(BillBean s) { + //0 群红包,1 私聊红包,2 转账,3 金币银币互转 + + if (status == 1) { + if (s.getType() == 1) { + + if (s.getIsTimeout() == 1) { + return getString(R.string.yinbi_tuikuan_txt); + } else { + if (s.getAmount() > 0) { + String name = "红包"; +// RosterElementEntity friendInfo = MyApplication.getInstance2().getIMClientManager().getFriendsListProvider().getFriendInfoByUid2(s.getFromUserId() + ""); + NimUserInfo friendInfo = NIMClient.getService(UserService.class).getUserInfo(s.getFromUserId() + ""); + // ** 显示头像和昵称 + if (friendInfo != null) { + name = getString(R.string.yinbihongbao_laizi_txt) + friendInfo.getName(); + } else { + name = getString(R.string.yinbihongbao_laizi_txt) + s.getFromUserId(); + } + return name; + } else { + String name = "红包"; +// RosterElementEntity friendInfo = MyApplication.getInstance2().getIMClientManager().getFriendsListProvider().getFriendInfoByUid2(s.getToUserId() + ""); + NimUserInfo friendInfo = NIMClient.getService(UserService.class).getUserInfo(s.getToUserId() + ""); + + // ** 显示头像和昵称 + if (friendInfo != null) { + name = getString(R.string.yinbihonbao_wofagei_txt) + friendInfo.getName(); + } else { + name = getString(R.string.yinbihonbao_wofagei_txt) + s.getToUserId(); + + } + return name; + } + } + } else if (s.getType() == 2) { + + + if (s.getAmount() > 0) { + if ((s.getFromUserId() + "").equals(IMKitClient.account())) { + return getString(R.string.yinbizhuanzhang_tuikuan_txt); + } + + String name = "转账"; +// RosterElementEntity friendInfo = MyApplication.getInstance2().getIMClientManager().getFriendsListProvider().getFriendInfoByUid2(s.getFromUserId() + ""); + NimUserInfo friendInfo = NIMClient.getService(UserService.class).getUserInfo(s.getFromUserId() + ""); + + // ** 显示头像和昵称 + if (friendInfo != null) { + name = getString(R.string.yinbizhuanzhang_laizi_txt) + friendInfo.getName(); + } else { + name = getString(R.string.yinbizhuanzhang_laizi_txt) + s.getFromUserId(); + } + return name; + } else { + String name = "红利积分转账"; + NimUserInfo friendInfo = NIMClient.getService(UserService.class).getUserInfo(s.getToUserId() + ""); + // ** 显示头像和昵称 + if (friendInfo != null) { + name = getString(R.string.yinbizhuanzhang_wofagei_txt) + friendInfo.getName(); + } else { + name = getString(R.string.yinbizhuanzhang_wofagei_txt) + s.getToUserId(); + + } + return name; + } + + } else if (s.getType() == 0) { + if (s.getIsTimeout() != null && s.getIsTimeout() == 1) { + if ((s.getFromUserId() + "").equals(IMKitClient.account())) { + return getString(R.string.yinbiqunhongbao_tuikuan_txt); + } + return getString(R.string.yinbiqunhongbao_txt); + } else { + if (!TextUtils.isEmpty(s.getToGroupId())) { + String name = getString(R.string.yinbiqunhongbao_txt); +// GroupEntity groupEntity = MyApplication.getInstance2().getIMClientManager().getGroupsProvider().getGroupInfoByGid(s.getToGroupId()); + Team groupEntity = NIMClient.getService(TeamService.class).queryTeamBlock(s.getToGroupId() + ""); + if (groupEntity != null) { + name = getString(R.string.ybqhb_wfg_txt) + groupEntity.getName(); + } + return name; + } else { + String name = "群红包"; +// RosterElementEntity friendInfo = MyApplication.getInstance2().getIMClientManager().getFriendsListProvider().getFriendInfoByUid2(s.getFromUserId() + ""); + NimUserInfo friendInfo = NIMClient.getService(UserService.class).getUserInfo(s.getFromUserId() + ""); + + if (friendInfo != null) { + name = getString(R.string.yinbiqhb_laizi_txt) + friendInfo.getName(); + } else { + name = getString(R.string.yinbiqhb_laizi_txt) + s.getFromUserNickname(); + } + return name; + } + } + } else if (s.getType() == 3) { + return s.getAmount() < 0 ? getString(R.string.s_to_g_txt) : getString(R.string.g_to_s_txt); + } else if (s.getType() == 4) { + return getString(R.string.shenqi_topup_txt); + } else if (s.getType() == 5) { + return getString(R.string.shenqi_with_txt); + } else if (s.getType() == 6) { + if (s.getDailyTask() != null) { + switch (loc) { + case 1: + return s.getDailyTask().getTaskNameZhCn() + ""; + case 2: + return s.getDailyTask().getTaskNameEnUs() + ""; + case 3: + return s.getDailyTask().getTaskNameJaJp() + ""; + default: + return s.getDailyTask().getTaskNameZhTw() + ""; + } + + } else { + return getString(R.string.renwujiangli_txt); + } + } else if (s.getType() == 7) { + return getString(R.string.invcode_friend_txt); + } else if (s.getType() == 8) { + return getString(R.string.wawaji_txt); + } else if (s.getType() == 9) { + return getString(R.string.guanliyuanxiugai_txt); + } else if (s.getType() == 11 || s.getType() == 13 || s.getType() == 14) { + return s.getCoinModifyRemark() + ""; + } else if (s.getType() == 12) { + return getString(R.string.caipiaojiduijiang_txt); + } else if (s.getType() == 15) { + return getString(R.string.lipinqiangduihuan_txt); + } else if (s.getType() == 16) { + return getString(R.string.jfscxycj_txt); + } else if (s.getType() == 17) { + return getString(R.string.rgzslpjf_txt); + } else if (s.getType() == 18) { + return s.getCoinModifyRemark() + ""; + } else if (s.getType() == 19) { + return s.getCoinModifyRemark() + ""; + } else if (s.getType() == 20 || s.getType() == 23 || s.getType() == 24) { + return s.getCoinModifyRemark() + ""; + } else if (s.getType() == 22) { + return getString(R.string.lpgdh_txt) + s.getCoinModifyRemark() + ""; + } else if (s.getType() == 28) { + return getString(R.string.xywkcjf_txt); + } else { + return TextUtils.isEmpty(s.getCoinModifyRemark()) ? getString(R.string.weizhi_txt) : s.getCoinModifyRemark() + ""; + } + } else { + if (s.getType() == 1) { + + if (s.getIsTimeout() == 1) { + return getString(R.string.jinbihongbao_tuikuan_txt); + } else { + if (s.getAmount() > 0) { + String name = "红包"; +// RosterElementEntity friendInfo = MyApplication.getInstance2().getIMClientManager().getFriendsListProvider().getFriendInfoByUid2(s.getFromUserId() + ""); + NimUserInfo friendInfo = NIMClient.getService(UserService.class).getUserInfo(s.getFromUserId() + ""); + + // ** 显示头像和昵称 + if (friendInfo != null) { + name = getString(R.string.jinbihongbao_laizi_txt) + friendInfo.getName(); + } else { + name = getString(R.string.jinbihongbao_laizi_txt) + s.getFromUserId(); + } + return name; + } else { + String name = "红包"; +// RosterElementEntity friendInfo = MyApplication.getInstance2().getIMClientManager().getFriendsListProvider().getFriendInfoByUid2(s.getToUserId() + ""); + NimUserInfo friendInfo = NIMClient.getService(UserService.class).getUserInfo(s.getToUserId() + ""); + + // ** 显示头像和昵称 + if (friendInfo != null) { + name = getString(R.string.jinbihongbao_wfg_txt) + friendInfo.getName(); + } else { + name = getString(R.string.jinbihongbao_wfg_txt) + s.getToUserId(); + + } + return name; + } + } + } else if (s.getType() == 2) { + + + if (s.getAmount() > 0) { + if ((s.getFromUserId() + "").equals(IMKitClient.account())) { + return getString(R.string.jinbizhuanzhang_tk_txt); + } + + String name = "转账"; +// RosterElementEntity friendInfo = MyApplication.getInstance2().getIMClientManager().getFriendsListProvider().getFriendInfoByUid2(s.getFromUserId() + ""); + NimUserInfo friendInfo = NIMClient.getService(UserService.class).getUserInfo(s.getFromUserId() + ""); + + // ** 显示头像和昵称 + if (friendInfo != null) { + name = getString(R.string.jinbizhuanzhang_laizi_txt) + friendInfo.getName(); + } else { + name = getString(R.string.jinbizhuanzhang_laizi_txt) + s.getFromUserId(); + } + return name; + } else { + String name = "转账"; +// RosterElementEntity friendInfo = MyApplication.getInstance2().getIMClientManager().getFriendsListProvider().getFriendInfoByUid2(s.getToUserId() + ""); + NimUserInfo friendInfo = NIMClient.getService(UserService.class).getUserInfo(s.getToUserId() + ""); + + // ** 显示头像和昵称 + if (friendInfo != null) { + name = getString(R.string.jinbizhuanzhang_wofagei_txt) + friendInfo.getName(); + } else { + name = getString(R.string.jinbizhuanzhang_wofagei_txt) + s.getToUserId(); + + } + return name; + } + + } else if (s.getType() == 0) { + if (s.getIsTimeout() == 1) { + if ((s.getFromUserId() + "").equals(IMKitClient.account())) { + return getString(R.string.jinbiqunhongbao_tuikuan_txt); + } + return getString(R.string.jinbiqunhongbao_txt); + } else { + if (!TextUtils.isEmpty(s.getToGroupId())) { + String name = getString(R.string.jinbiqunhongbao_txt); +// GroupEntity groupEntity = MyApplication.getInstance2().getIMClientManager().getGroupsProvider().getGroupInfoByGid(s.getToGroupId()); + Team groupEntity = NIMClient.getService(TeamService.class).queryTeamBlock(s.getToGroupId() + ""); + + if (groupEntity != null) { + name = getString(R.string.jinbiqunhongbao_wfg_txt) + groupEntity.getName(); + } + return name; + } else { + String name = "群红包"; +// RosterElementEntity friendInfo = MyApplication.getInstance2().getIMClientManager().getFriendsListProvider().getFriendInfoByUid2(s.getFromUserId() + ""); + NimUserInfo friendInfo = NIMClient.getService(UserService.class).getUserInfo(s.getFromUserId() + ""); + + if (friendInfo != null) { + name = getString(R.string.jinbiqunhb_laizi_txt) + friendInfo.getName(); + } else { + name = getString(R.string.jinbiqunhb_laizi_txt) + s.getFromUserNickname(); + } + return name; + } + } + } else if (s.getType() == 3) { + return s.getAmount() < 0 ? getString(R.string.g_to_s_txt) : getString(R.string.s_to_g_txt); + } else if (s.getType() == 4) { + return getString(R.string.jinbichongzhi_f_bank_txt); + } else if (s.getType() == 21) { + return getString(R.string.jinbichongzhi_f_bank_txt1); + } else if (s.getType() == 22) { + return s.getCoinModifyRemark() + ""; + } else if (s.getType() == 5) { + return getString(R.string.jinbitixian_txt); + } else if (s.getType() == 8) { + if (s.getOauthApp() != null) { + return s.getOauthApp().getAppName() + getString(R.string.zhuanchu_txt); + } else { + return getString(R.string.fffcz_txt); + } + } else if (s.getType() == 9) { + if (s.getOauthApp() != null) { + return s.getOauthApp().getAppName() + getString(R.string.zhuanru_txt); + } else { + return getString(R.string.ffftx_txt); + } + } else if (s.getType() == 7) { + if (s.getOauthApp() != null) { + return getString(R.string.laxinsjf_txt); + } else { + return getString(R.string.fffcz_txt); + } + } else if (s.getType() == 10) { + return getString(R.string.wawaji_txt); + } else if (s.getType() == 12) { + return getString(R.string.guanliyuanxiugai_txt); + } else if (s.getType() == 13) { + return getString(R.string.niuniuxiazhudongjie_txt); + } else if (s.getType() == 14) { + return getString(R.string.niuniujiesuan_txt); + } else if (s.getType() == 15) { + return getString(R.string.niuniulingbaofei_txt); + } else if (s.getType() == 16) { + if (s.getAmount() > 0) { + return getString(R.string.erweimashouklaizi_txt1) + s.getFromUserNickname(); + } else { + NimUserInfo nimUserInfo = NIMClient.getService(UserService.class).getUserInfo(s.getToUserId() + ""); + if (nimUserInfo != null) { + return getString(R.string.saomafukuan_txt2) + nimUserInfo.getName(); + } else { + return getString(R.string.saomafukuan_txt1); + } + } + } else if (s.getType() == 18) { + return getString(R.string.erweimashouklaizi_txt1) + s.getFromUserNickname(); + } else if (s.getType() == 19) { + return getString(R.string.saomaduibi_txt); + } else if (s.getType() == 20) { + return getString(R.string.jinbiduihuanlebi_txt); + } else if (s.getType() == 17) { + NimUserInfo nimUserInfo = NIMClient.getService(UserService.class).getUserInfo(s.getToUserId() + ""); + if (nimUserInfo != null) { + return getString(R.string.saomafukuan_txt2) + nimUserInfo.getName(); + } else { + return getString(R.string.saomafukuan_txt1); + } + } else if (s.getType() == 11) { + if (s.getAmount() > 0) { + return "Dream Game " + getString(R.string.zhuanru_txt); + } else { + return "Dream Game " + getString(R.string.zhuanchu_txt); + + } + } else if (s.getType() == 27) { + return getString(R.string.danzhujiduizhu_txt); + } else if (s.getType() == 23 || s.getType() == 24) { + return s.getCoinModifyRemark() + ""; + } else { + return TextUtils.isEmpty(s.getCoinModifyRemark()) ? getString(R.string.weizhi_txt) : s.getCoinModifyRemark() + ""; + } + } + } + + private int getTypeRes(BillBean bean) { + int type = bean.getType(); + switch (type) { + case 0: + return R.mipmap.bill_hongbao_img; + case 1: + return R.mipmap.bill_hongbao_img; + case 2: + return R.mipmap.bill_zhuanzhang_img; + case 3: + return R.mipmap.bill_zhuanhan_img; + case 4: + return R.mipmap.bill_chongzhi_img; + case 21: + return R.mipmap.bill_chongzhi_img1; + case 22: + case 23: + if (status == 1) { + return R.mipmap.duihuan_bill_img; + } else { + return R.mipmap.bill_chongzhi_img; + } + case 24: + if (status == 1) { + return R.mipmap.duihuan_bill_img; + } else { + return R.mipmap.bill_chongzhi_img; + } + case 5: + return R.mipmap.bill_tixian_img; + case 6: + if (status == 1) { + if (bean.getDailyTask() != null) { + if (bean.getDailyTask().getTaskId() == 3) { + return R.mipmap.cir_task_img; + } else if (bean.getDailyTask().getTaskId() == 1) { + return R.mipmap.yaoqing_task_img; + } else { + return R.mipmap.game_task_img; + } + } + } else { + return R.mipmap.default_head_img; + } + case 7: + if (status == 1) { + return R.mipmap.yaoqing_task_img; + } else { + return R.mipmap.default_head_img; + } + case 8: + if (status == 1) { + return R.mipmap.wawaji_img; + } else { + return R.mipmap.bill_chongzhi_img; + } + case 9: + if (status == 1) { + return R.mipmap.guanli_xiugai_img; + } else { + return R.mipmap.bill_tixian_img; + } + case 10: + return R.mipmap.wawaji_img; + case 20: + if (status == 1) { + return R.mipmap.yinbi_type_20; + } else { + return R.mipmap.wawaji_img; + } + + case 12: + if (status == 1) { + return R.mipmap.bill_caipiaoji_duijiang_img; + } else { + return R.mipmap.guanli_xiugai_img; + } + case 11: + if (status == 1) { + + if (bean.getAmount() > 0) { + return R.mipmap.bill_chongzhi_img; + } else { + return R.mipmap.yinbishangcheng_bill_img; + } + } else { + return R.mipmap.bill_tixian_img; + } + case 13: + if (status == 1) { + return R.mipmap.duihuan_bill_img; + } else { + return R.mipmap.niuniu_jilu_img; + + } + case 14: + if (status == 1) { + return R.mipmap.jfcj; + } else { + return R.mipmap.niuniu_jilu_img; + } + case 15: + if (status == 1) { + return R.mipmap.duihuan_bill_img; + } else { + return R.mipmap.niuniu_jilu_img; + } + case 16: + if (status == 1) { + return R.mipmap.jfcj; + + } else { + if (bean.getAmount() > 0) { + return R.mipmap.erweishoukuan_bill_img; + } else { + return R.mipmap.erweifukuan_bill_img; + } + } + case 17: + if (status == 1) { + return R.mipmap.rzzs; + } else { + return R.mipmap.erweifukuan_bill_img; + } + case 18: + if (status == 1) { + return R.mipmap.mojiang_img; + } else { + return R.mipmap.erweishoukuan_bill_img; + } + case 19: + if (status == 1) { + return R.mipmap.duihuan_bill_img; + } else { + return R.mipmap.saomaduibi_img; + } + case 27: + return R.mipmap.type_g_27; + case 29: + if (status == 1) { + return R.mipmap.type_s_24; + + } else { + return R.mipmap.type_g_27; + + } + case 28: + if (status == 1) { + return R.mipmap.duihuan_bill_img; + } else { + return R.mipmap.erweifukuan_bill_img; + } + case 30: + return R.mipmap.type_s_24; + default: + return R.mipmap.guanli_xiugai_img; + } + } + + private void initRefreshLayout() { + binding.refreshLayout.setOnRefreshListener(refreshlayout -> { + pageSize = 1; + binding.refreshLayout.setVisibility(View.VISIBLE); + binding.nodateLy.setVisibility(View.GONE); + binding.refreshLayout.setEnableLoadMore(true); + getDateList(); + + }); + binding.refreshLayout.setOnLoadMoreListener(refreshLayout -> { + pageSize += 1; + getDateList(); + + }); + } + + @Override + public void onResume() { + super.onResume(); + String name = DataUtils.get(getActivity(), "wallet_info_" + IMKitClient.account(), ""); + if (status == 1) { + name = DataUtils.get(getActivity(), "wallet_info_s_" + IMKitClient.account(), ""); + } + binding.typeTv1.setVisibility(View.GONE); + + if (TextUtils.isEmpty(name)) { + binding.refreshLayout.autoRefresh(); + } else { + titles = (ArrayList) GsonUtils.getListFromJSON(name, BillBean.class); + if (titles != null && titles.size() > 0) { + commonAdapter.setDates(titles); + getDateList(); + } else { + binding.refreshLayout.autoRefresh(); + } + } + } + + private void getDateList() { + + if (status == 0) { + Map map = new HashMap<>(); + if (type == -1) { + if (TextUtils.isEmpty(typeInfo)) { + map.put("page", pageSize); + } else { + String statTime = time + "-01 00:00:01"; + String endTime = time + "-" + getMonth(time) + " 23:59:59"; + map.put("page", pageSize); + map.put("timeGe", statTime); + map.put("timeLe", endTime); + } + } else { + if (TextUtils.isEmpty(typeInfo)) { + map.put("page", pageSize); + map.put("type", type); + + } else { + String statTime = time + "-01 00:00:01"; + String endTime = time + "-" + getMonth(time) + " 23:59:59"; + + map.put("page", pageSize); + map.put("timeGe", statTime); + map.put("timeLe", endTime); + map.put("type", type); + } + } + if (!TextUtils.isEmpty(IMUIKitConfig.SUBSTATIONID)) { + map.put("substationId", IMUIKitConfig.SUBSTATIONID); + } + Api.getInstance().goldDetails(IMKitClient.account(), map) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>>() { + @Override + public void onSuccess(Result> feedbackResp) { + changeDate(feedbackResp.data); + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + binding.refreshLayout.finishRefresh(); + binding.refreshLayout.finishLoadMore(); + changeView(false); + } + }); + + } else { + Map map = new HashMap<>(); + if (type == -1) { + if (TextUtils.isEmpty(typeInfo)) { + map.put("page", pageSize); + } else { + String statTime = time + "-01 00:00:01"; + String endTime = time + "-" + getMonth(time) + " 23:59:59"; + map.put("page", pageSize); + map.put("timeGe", statTime); + map.put("timeLe", endTime); + } + } else { + if (TextUtils.isEmpty(typeInfo)) { + map.put("page", pageSize); + map.put("type", type); + + } else { + String statTime = time + "-01 00:00:01"; + String endTime = time + "-" + getMonth(time) + " 23:59:59"; + + map.put("page", pageSize); + map.put("timeGe", statTime); + map.put("timeLe", endTime); + map.put("type", type); + } + } + if (!TextUtils.isEmpty(IMUIKitConfig.SUBSTATIONID)) { + map.put("substationId", IMUIKitConfig.SUBSTATIONID); + } + Api.getInstance().silverDetails(IMKitClient.account(), map) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>>() { + @Override + public void onSuccess(Result> feedbackResp) { + changeDate(feedbackResp.data); + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("获取到的错误:" + code + "" + msg); + binding.refreshLayout.finishRefresh(); + binding.refreshLayout.finishLoadMore(); + changeView(false); + } + }); + } + + + } + + + private String getMonth(String time) { + if (time.endsWith("01") || time.endsWith("03") || time.endsWith("05") || time.endsWith("07") || time.endsWith("08") || time.endsWith("10") || time.endsWith("12")) { + return "31"; + } else if (time.endsWith("02")) { + Calendar selectedDate = Calendar.getInstance();//系统当前时间 + int year = selectedDate.get(Calendar.YEAR); + if (year % 400 == 0) {// 判断能否被400整除 + return "29"; + } else if (year % 100 == 0) {// 判断能否被100整除 + return "28"; + } else if (year % 4 == 0) {// 判断能否被4整除 + return "29"; + } else { + return "28"; + } + + } else { + return "30"; + } + } + + + private void changeDate(ListBeanResult data) { + if (data.getList() != null) { + if (pageSize == 1) { + titles = (ArrayList) data.getList(); + + if (status == 0) { + if (type == -1) + DataUtils.set(getActivity(), "wallet_info_" + IMKitClient.account(), GsonUtils.beanToJSONString(titles)); + } else { + if (type == -1) + DataUtils.set(getActivity(), "wallet_info_s_" + IMKitClient.account(), GsonUtils.beanToJSONString(titles)); + } + commonAdapter.setDates(titles); + } else { + commonAdapter.addDates(data.getList()); + titles = (ArrayList) commonAdapter.getDates(); + } + + } + binding.refreshLayout.finishRefresh(); + binding.refreshLayout.finishLoadMore(); + if (titles.size() == data.getTotal()) { + binding.refreshLayout.finishLoadMoreWithNoMoreData(); + } + changeView(true); + } + + private void changeView(boolean isNodate) { + if (titles == null || (titles.size() == 0)) { + binding.nodateLy.setVisibility(View.VISIBLE); + binding.refreshLayout.setVisibility(View.GONE); + if (isNodate) { + binding.nodateTv.setText(getString(R.string.nodate_txt)); + binding.nodateIv.setImageResource(R.mipmap.pyq_nodate); + } else { + binding.nodateTv.setText(getString(R.string.net_error_txt)); + binding.nodateIv.setImageResource(R.mipmap.pyq_nodate); + + } + + } else { + binding.refreshLayout.setVisibility(View.VISIBLE); + binding.nodateLy.setVisibility(View.GONE); + } + binding.nodateLy.setOnClickListener(view -> { + binding.refreshLayout.autoRefresh(); + }); + } + +} diff --git a/app/src/main/java/com/dskj/rbchat/wallet/WalletInfoFragment1.java b/app/src/main/java/com/dskj/rbchat/wallet/WalletInfoFragment1.java new file mode 100644 index 0000000..9187f7f --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/wallet/WalletInfoFragment1.java @@ -0,0 +1,138 @@ +package com.dskj.rbchat.wallet; + +import android.os.Bundle; +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.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.LinearLayoutManager; + +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.databinding.FragmentWalletInfo1Binding; +import com.dskj.rbchat.databinding.FragmentWalletInfoBinding; +import com.dskj.rbchat.dialog.SelectTypeDialog; +import com.dskj.rbchat.model.BillBean; +import com.dskj.rbchat.model.ListBeanResult; +import com.dskj.rbchat.model.StatisticsBean; +import com.dskj.rbchat.model.TaskBean; +import com.dskj.rbchat.model.TypeBean; +import com.dskj.rbchat.model.WithdrawCashBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.team.TeamService; +import com.netease.nimlib.sdk.team.model.Team; +import com.netease.nimlib.sdk.uinfo.UserService; +import com.netease.nimlib.sdk.uinfo.model.NimUserInfo; +import com.netease.yunxin.kit.common.ui.fragments.BaseFragment; +import com.netease.yunxin.kit.common.ui.utils.TimeFormatUtils; +import com.netease.yunxin.kit.corekit.im.IMKitClient; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +//import com.bigkoo.pickerview.builder.TimePickerBuilder; +//import com.bigkoo.pickerview.view.TimePickerView; + +/** + * 主页模块 + * + * @author + */ +public class WalletInfoFragment1 extends BaseFragment { + int status; + + int pageSize = 1; +// private TimePickerView pvTime; + String time = "2022-06"; + int type = -1; + String typeInfo = ""; + String billBean = null; + CommonAdapter commonAdapter; + private ArrayList titles = new ArrayList<>(); + List taskBeans = null; + int loc = 0; + FragmentWalletInfo1Binding binding; + public static WalletInfoFragment1 newInstance(int status1, int type, String billBean) { + Bundle bundle = new Bundle(); + bundle.putInt("type", status1); + bundle.putInt("type1", type); + bundle.putString("bean", billBean); + WalletInfoFragment1 view = new WalletInfoFragment1(); + view.setArguments(bundle); + return view; + } + + + @Nullable + @Override + public View onCreateView( + @NonNull LayoutInflater inflater, + @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + binding = FragmentWalletInfo1Binding.inflate(inflater); + return binding.getRoot(); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + initViews(); + } + + + protected void initViews() { + binding. nodateLy.setVisibility(View.VISIBLE); + binding. refreshLayout.setVisibility(View.GONE); + binding. nodateTv.setText(getString(R.string.nodate_txt)); + binding.nodateIv.setImageResource(R.mipmap.pyq_nodate); + + + } + + + private void changeView(boolean isNodate) { + if (titles == null || (titles.size() == 0)) { + binding. nodateLy.setVisibility(View.VISIBLE); + binding. refreshLayout.setVisibility(View.GONE); + if (isNodate) { + binding. nodateTv.setText(getString(R.string.nodate_txt)); + binding.nodateIv.setImageResource(R.mipmap.pyq_nodate); + } else { + binding.nodateTv.setText(getString(R.string.net_error_txt)); + binding.nodateIv.setImageResource(R.mipmap.pyq_nodate); + + } + + } else { + binding.refreshLayout.setVisibility(View.VISIBLE); + binding.nodateLy.setVisibility(View.GONE); + } + binding.nodateLy.setOnClickListener(view -> { + binding.refreshLayout.autoRefresh(); + }); + } + +} diff --git a/app/src/main/java/com/dskj/rbchat/wallet/WalletInfoTongBiActivity.java b/app/src/main/java/com/dskj/rbchat/wallet/WalletInfoTongBiActivity.java new file mode 100644 index 0000000..76e640f --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/wallet/WalletInfoTongBiActivity.java @@ -0,0 +1,55 @@ +package com.dskj.rbchat.wallet; + +import android.os.Bundle; +import android.view.View; + +import androidx.annotation.Nullable; + +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.ActivityWalletInfoTbBinding; +import com.dskj.rbchat.model.WalletBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.corekit.im.IMKitClient; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class WalletInfoTongBiActivity extends BaseActivity { + boolean isG; + ActivityWalletInfoTbBinding viewBinding; + WalletBean walletBean; + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + getWindow().setStatusBarColor(getResources().getColor(R.color.color_white)); + getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white)); + + super.onCreate(savedInstanceState); + viewBinding = ActivityWalletInfoTbBinding.inflate(getLayoutInflater()); + setContentView(viewBinding.getRoot()); + isG = getIntent().getBooleanExtra("isG",true); + initView(); + } + + protected void initView() { + viewBinding.contactListActivityTitleBar.getBackImageView().setOnClickListener(v -> finish()); + getSupportFragmentManager().beginTransaction().replace(R.id.frameLayout, + WalletInfoFragment1.newInstance(2,getIntent().getIntExtra("type",-1),null)) + .commit(); + + + } + + @Override + protected void onStop() { + super.onStop(); + + } + + + + +} diff --git a/app/src/main/java/com/dskj/rbchat/welcome/ServerActivity.java b/app/src/main/java/com/dskj/rbchat/welcome/ServerActivity.java new file mode 100644 index 0000000..a70a115 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/welcome/ServerActivity.java @@ -0,0 +1,90 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.welcome; + +import android.content.Intent; +import android.os.Bundle; +import android.os.Handler; +import android.view.LayoutInflater; +import androidx.annotation.Nullable; +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.ServerConfigActivityBinding; +import com.dskj.rbchat.utils.Constant; +import com.dskj.rbchat.utils.DataUtils; +import com.netease.yunxin.kit.alog.ALog; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.dialog.CommonConfirmDialog; + +public class ServerActivity extends BaseActivity { + + private static final String TAG = "ServerActivity"; + private ServerConfigActivityBinding viewBinding; + private int DELAY_RESTART = 500; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + ALog.d(TAG, "onCreate"); + changeStatusBarColor(R.color.color_eff1f4); + viewBinding = ServerConfigActivityBinding.inflate(LayoutInflater.from(this)); + setContentView(viewBinding.getRoot()); + loadData(); + initView(); + } + + private void initView() { + viewBinding.serverRadioGroup.setOnCheckedChangeListener( + (group, checkedId) -> { + CommonConfirmDialog.Companion.show( + ServerActivity.this, + getString(R.string.server_config_dialog_title), + getString(R.string.server_config_dialog_content), + getString(R.string.server_config_dialog_cancel), + getString(R.string.server_config_dialog_positive), + true, + true, + positive -> { + if (positive) { + int config = + (checkedId == viewBinding.serverChinaConfig.getId() + ? Constant.CHINA_CONFIG + : Constant.OVERSEA_CONFIG); + changeServerConfig(config); + } else { + viewBinding.serverRadioGroup.setOnCheckedChangeListener(null); + loadData(); + initView(); + } + }); + }); + viewBinding.typeSelectTitleBar.setOnBackIconClickListener(view -> this.finish()); + } + + private void loadData() { + int chinaConfig = + DataUtils.getConfigShared(this).getInt(Constant.SERVER_CONFIG, Constant.CHINA_CONFIG); + if (chinaConfig == Constant.CHINA_CONFIG) { + viewBinding.serverChinaConfig.setChecked(true); + } else { + viewBinding.serverOverseaConfig.setChecked(true); + } + } + + private void changeServerConfig(int config) { + DataUtils.getConfigShared(this).edit().putInt(Constant.SERVER_CONFIG, config).apply(); + new Handler() + .postDelayed( + () -> { + Intent intent = + getBaseContext() + .getPackageManager() + .getLaunchIntentForPackage(getBaseContext().getPackageName()); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + startActivity(intent); + android.os.Process.killProcess(android.os.Process.myPid()); + }, + DELAY_RESTART); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/welcome/WelcomeActivity.java b/app/src/main/java/com/dskj/rbchat/welcome/WelcomeActivity.java new file mode 100644 index 0000000..c3f4dff --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/welcome/WelcomeActivity.java @@ -0,0 +1,406 @@ +// Copyright (c) 2022 NetEase, Inc. All rights reserved. +// Use of this source code is governed by a MIT license that can be +// found in the LICENSE file. + +package com.dskj.rbchat.welcome; + + +import static com.blankj.utilcode.util.SnackbarUtils.dismiss; + +import android.content.ClipData; +import android.content.ClipboardManager; +import android.content.Intent; +import android.graphics.drawable.AnimationDrawable; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.os.Messenger; +import android.os.RemoteException; +import android.provider.Settings; +import android.text.TextUtils; +import android.view.View; +import android.view.Window; +import android.view.animation.Animation; +import android.view.animation.AnimationUtils; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.view.WindowCompat; + +import com.bumptech.glide.Glide; +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.dialog.ActionConfirmDialog; +import com.dskj.rbchat.login.ChongZhiActivity; +import com.dskj.rbchat.login.LoginActivity; +import com.dskj.rbchat.login.PhoneLoginActivity; +import com.dskj.rbchat.login.RegisterActivity; +import com.dskj.rbchat.model.LoginBean; +import com.dskj.rbchat.network.Api; +import com.dskj.rbchat.network.BaseObserver; +import com.dskj.rbchat.network.Result; +import com.dskj.rbchat.utils.AnimUtil; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.wallet.PaySettingActivity; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.auth.LoginInfo; +import com.dskj.rbchat.IMApplication; +import com.dskj.rbchat.R; +import com.dskj.rbchat.databinding.ActivityWelcomeBinding; +import com.dskj.rbchat.main.MainActivity; +import com.dskj.rbchat.utils.Constant; +import com.dskj.rbchat.utils.DataUtils; +import com.netease.yunxin.kit.alog.ALog; +import com.netease.yunxin.kit.chatkit.ui.common.RxBus; +import com.netease.yunxin.kit.chatkit.ui.model.RxBusToVoom; +import com.netease.yunxin.kit.common.ui.activities.BaseActivity; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.login.LoginCallback; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; +import rx.Subscription; + +/** + * Welcome Page is launch page + */ +public class WelcomeActivity extends BaseActivity { + + private static final String TAG = "WelcomeActivity"; + private ActivityWelcomeBinding activityWelcomeBinding; + String account = ""; + String token = ""; + private Subscription mEventSubscription; + int error_code = 0; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + ALog.d(Constant.PROJECT_TAG, TAG, "onCreateView"); + getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white)); + + IMApplication.setColdStart(true); + activityWelcomeBinding = ActivityWelcomeBinding.inflate(getLayoutInflater()); + setContentView(activityWelcomeBinding.getRoot()); + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR | View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR); + WindowCompat.setDecorFitsSystemWindows(getWindow(), false); + + Uri uri = getIntent().getData(); + getScheme(uri); +// initClip(); + activityWelcomeBinding.bigBg.setBackgroundResource(R.color.color_white); + if (TextUtils.isEmpty(NIMClient.getCurrentAccount())) { + startLogin(); + } else { + activityWelcomeBinding.bottomLy.setVisibility(View.GONE); + showIsLogin(true); + new Handler().postDelayed(() -> { + showMainActivityAndFinish(); + }, 3 * 1000); + } + mEventSubscription = RxBus.getInstance().toObservable(Integer.class) + .subscribeOn(rx.schedulers.Schedulers.io()) + .unsubscribeOn(rx.schedulers.Schedulers.io()) + .subscribe(changeImageViewBean -> {//回顶部 + if (changeImageViewBean == 117766) { + showFengJin(); + } else if (changeImageViewBean == 117765) { + finish(); + } + }); + + activityWelcomeBinding.loginBt.setOnClickListener(v -> { + startActivity(new Intent(WelcomeActivity.this, PhoneLoginActivity.class)); +// finish(); + }); + + activityWelcomeBinding.regBt.setOnClickListener(v -> startActivity(new Intent(WelcomeActivity.this, RegisterActivity.class))); + AnimUtil.setAnimViews(activityWelcomeBinding.loginBt, activityWelcomeBinding.regBt); +// if(DataUtils.get(WelcomeActivity.this,"voom_message_time_"+IMKitClient.account(),0)==0){ +// DataUtils.set(WelcomeActivity.this,"voom_message_time_"+IMKitClient.account(),System.currentTimeMillis()); +// } + + + } + + private void showIsLogin(boolean isLogin) { + getWindow().setBackgroundDrawableResource(com.netease.yunxin.nertc.ui.R.color.white); +// if (isLogin) { + AnimationDrawable mLoadingAnimationDrawable = (AnimationDrawable) activityWelcomeBinding.appYunxinIcon.getDrawable(); + //直接就开始执行,性能不是最佳的。 + mLoadingAnimationDrawable.start(); + new Handler().postDelayed(() -> { + getWindow().setBackgroundDrawableResource(R.color.transparent); + }, 2800); + if (!isLogin) { + // 计算动画执行的时间 + int duration = 0; + for (int i = 0; i < mLoadingAnimationDrawable.getNumberOfFrames(); i++) { + duration += mLoadingAnimationDrawable.getDuration(i); + } + new Handler().postDelayed(() -> { + activityWelcomeBinding.appYunxinIcon.setImageResource(R.drawable.kefu_loading2); + AnimationDrawable mLoadingAnimationDrawable1 = (AnimationDrawable) activityWelcomeBinding.appYunxinIcon.getDrawable(); + mLoadingAnimationDrawable1.start(); + }, duration); + } + } + + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + getScheme(getIntent().getData()); + } + + private void initClip() { + + try { + getWindow().getDecorView().post(() -> { + //获取剪切板内容 + ClipboardManager mClipboardManager = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); + if (mClipboardManager.hasPrimaryClip()) { + try { + ClipData clipData = mClipboardManager.getPrimaryClip(); + for (int i = 0; i < clipData.getItemCount(); i++) { + ClipData.Item item = clipData.getItemAt(i); + if (item != null) { + String text = item.getText().toString(); +// LogUtils.i("剪贴板上的内容:" + text); + String tStr = "https://play.google.com/store/apps/details"; + if (text.startsWith(tStr)) { + getScheme(Uri.parse(text)); + } + } + } + } catch (NullPointerException e) { + e.printStackTrace(); + } + } + }); + + } catch (Exception e) { + e.printStackTrace(); +// ToastUtils.showToast("启动:获取剪贴板异常"); + + } + } + + private void getScheme(Uri uri) { + if (uri != null) { + + // 完整的url信息 + // scheme部分 + String scheme = uri.getScheme(); + // host部分 + String host = uri.getHost(); + // 访问路劲 + String path = uri.getPath(); + //获取指定参数值 + if (scheme.equals("timego") && host.equals("time_go_chat")) { + if (path.contains("add_user")) { + String goodsId = uri.getQueryParameter("userId"); + LogUtils.i("111111111userId: " + goodsId); + IMApplication.schemeUserId = null; + if (!TextUtils.isEmpty(goodsId)) { + IMApplication.schemeUserId = goodsId; + } + } + + if (path.contains("join_group")) { + String teamId = uri.getQueryParameter("teamId"); + LogUtils.i("111111111teamId: " + teamId); + IMApplication.schemeTeamId = null; + if (!TextUtils.isEmpty(teamId)) { + IMApplication.schemeTeamId = teamId; + } + } + + if (path.contains("scan_score")) { + String silverQrCode = uri.getQueryParameter("silver_qr_code"); + LogUtils.i("111111111silverQrCode: " + silverQrCode); + IMApplication.schemeSilverQrCode = null; + if (!TextUtils.isEmpty(silverQrCode)) { + IMApplication.schemeSilverQrCode = silverQrCode; + } + } + } + + } + + } + + @Override + public void onBackPressed() { + super.onBackPressed(); +// System.exit(0); + + } + + @Override + protected void onResume() { + super.onResume(); + + } + + private void showFengJin() { + ActionConfirmDialog actionDialog = new ActionConfirmDialog(WelcomeActivity.this, getString(R.string.gzhyfj_txt), + getResources().getString(R.string.quluru_txt), getString(R.string.general_got_it), false); + actionDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + } + + @Override + public void toCancel() { + } + }); + actionDialog.show(); + } + + private void showMainActivityAndFinish() { + + ALog.d(Constant.PROJECT_TAG, TAG, "showMainActivityAndFinish"); + Intent intent = new Intent(); + intent.setClass(this, MainActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); +// Intent intent = new Intent(WelcomeActivity.this,MainActivity.class); + this.startActivity(intent); + new Handler().postDelayed(() -> { + finish(); + }, 500); + } + + + /** + * start login page, you can use to launch your own login + */ + private void startLogin() { + LogUtils.i(TAG, "startLogin"); + + account = DataUtils.get(WelcomeActivity.this, IMUIKitConfig.LOGIN_ACCOUNT, account); + token = DataUtils.get(WelcomeActivity.this, IMUIKitConfig.LOGIN_TOKEN, token); + //填入你的 account and token + if (!TextUtils.isEmpty(account) && !TextUtils.isEmpty(token)) { + LogUtils.i(TAG, "startLogin111111111"); + showIsLogin(true); + getUserInfo(); + } else { + showLoginView(); + } + } + + private void getUserInfo() { + LoginBean loginBean = DataUtils.getLocUserInfo(); + if (loginBean != null) { + Map map = new HashMap<>(); + map.put("refreshToken", loginBean.getRefreshToken()); + if (!TextUtils.isEmpty(IMUIKitConfig.SUBSTATIONID)) { + map.put("substationId", IMUIKitConfig.SUBSTATIONID); + } + Api.getInstance().refreshToken(map) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + @Override + public void onSuccess(Result feedbackResp) { + if (feedbackResp.data.getLiveStatus().equals("null") || feedbackResp.data.getLiveStatus() == null) { + feedbackResp.data.setLiveStatus("0"); + } + loginBean.setRefreshToken(feedbackResp.data.getRefreshToken()); + loginBean.setAccessToken(feedbackResp.data.getAccessToken()); + loginBean.setAllowGiftCoin(feedbackResp.data.getUser().getAllowGiftCoin()); + loginBean.setIsBiz(feedbackResp.data.getUser().getIsBiz()); + DataUtils.set(WelcomeActivity.this, "login_bean", GsonUtils.beanToJSONString(loginBean)); + new Handler().postDelayed(() -> loginIM(account, token), 3000); + + } + + @Override + public void onError(int code, String msg) { + LogUtils.i("异常逻辑:" + code + ";;" + msg); + if (code == 401) { + showLoginView(); + } else if (code == 1003 || code == 1002) { + if (!TextUtils.isEmpty(IMKitClient.account())) { + showMainActivityAndFinish(); + } else { + + ActionConfirmDialog actionConfirmDialog = new ActionConfirmDialog(WelcomeActivity.this, + getString(com.netease.yunxin.kit.contactkit.ui.R.string.contact_network_error_tip), + getString(R.string.teamsetting_exit), getString(R.string.chongshi_txt)); + actionConfirmDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() { + @Override + public void toSumbit() { + getUserInfo(); + } + + @Override + public void toCancel() { + System.exit(0); + + } + }); + actionConfirmDialog.show(); + } + } + } + }); + } + + } + + + private void showLoginView() { + LogUtils.i(TAG, "showLoginView"); + showIsLogin(false); + activityWelcomeBinding.bottomLy.setVisibility(View.VISIBLE); + + } + + private void launchLoginPage() { + activityWelcomeBinding.getRoot().setVisibility(View.VISIBLE); + activityWelcomeBinding.bottomLy.setVisibility(View.VISIBLE); + LogUtils.i(TAG, "launchLoginPage"); + //startActivity(new Intent(this, LoginActivity.class)); + } + + private void loginIM(String account, String token) { + ALog.d(Constant.PROJECT_TAG, TAG, "loginIM"); + activityWelcomeBinding.getRoot().setVisibility(View.GONE); + LoginInfo loginInfo = + LoginInfo.LoginInfoBuilder.loginInfoDefault(account, token) + .withAppKey(DataUtils.readAppKey(this)) + .build(); + IMKitClient.loginIM( + loginInfo, + new LoginCallback() { + @Override + public void onError(int errorCode, @NonNull String errorMsg) { + ToastX.showShortToast( + String.format(getResources().getString(R.string.login_fail), errorCode)); + launchLoginPage(); + } + + @Override + public void onSuccess(@Nullable LoginInfo data) { + showMainActivityAndFinish(); +// IMApplication.getInstance().toLogin(); + } + }); + } + + @Override + protected void onDestroy() { + if (mEventSubscription != null) { + mEventSubscription.unsubscribe(); + } + super.onDestroy(); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/widget/BezierCircleHeader.java b/app/src/main/java/com/dskj/rbchat/widget/BezierCircleHeader.java new file mode 100644 index 0000000..afe0e19 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/widget/BezierCircleHeader.java @@ -0,0 +1,364 @@ +package com.dskj.rbchat.widget; + + +import android.animation.ValueAnimator; +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.view.View; +import android.view.animation.AccelerateInterpolator; +import android.view.animation.DecelerateInterpolator; + +import androidx.annotation.ColorInt; +import androidx.annotation.NonNull; +import androidx.core.graphics.ColorUtils; + +import com.scwang.smart.refresh.layout.api.RefreshHeader; +import com.scwang.smart.refresh.layout.api.RefreshKernel; +import com.scwang.smart.refresh.layout.api.RefreshLayout; +import com.scwang.smart.refresh.layout.constant.SpinnerStyle; +import com.scwang.smart.refresh.layout.simple.SimpleComponent; +import com.scwang.smart.refresh.layout.util.SmartUtil; + +/** + * CircleRefresh + * Created by scwang on 2018/7/18. + * from https://github.com/tuesda/CircleRefreshLayout + */ +public class BezierCircleHeader extends SimpleComponent implements RefreshHeader { + + // + protected Path mPath; + protected Paint mBackPaint; + protected Paint mFrontPaint; + protected Paint mOuterPaint; + protected int mHeight; + protected float mWaveHeight; + protected float mHeadHeight; + protected float mSpringRatio; + protected float mFinishRatio; + + protected float mBollY;//弹出球体的Y坐标 + protected float mBollRadius;//球体半径 + protected boolean mShowOuter; + protected boolean mShowBoll;//是否显示中心球体 + protected boolean mShowBollTail;//是否显示球体拖拽的尾巴 + + protected int mRefreshStop = 90; + protected int mRefreshStart = 90; + protected boolean mOuterIsStart = true; + + protected static final int TARGET_DEGREE = 270; + protected boolean mWavePulling = false; + protected RefreshKernel mKernel; + // + + // + public BezierCircleHeader(Context context) { + this(context, null); + } + + public BezierCircleHeader(Context context, AttributeSet attrs) { + super(context, attrs, 0); + + mSpinnerStyle = SpinnerStyle.FixedBehind; + final View thisView = this; + thisView.setMinimumHeight(SmartUtil.dp2px(100)); + mBackPaint = new Paint(); + mBackPaint.setColor(0xff11bbff); + mBackPaint.setAntiAlias(true); + mFrontPaint = new Paint(); + mFrontPaint.setColor(0xffffffff); + mFrontPaint.setAntiAlias(true); + mOuterPaint = new Paint(); + mOuterPaint.setAntiAlias(true); + mOuterPaint.setColor(0xffffffff); + mOuterPaint.setStyle(Paint.Style.STROKE); + mOuterPaint.setStrokeWidth(SmartUtil.dp2px(2f)); + mPath = new Path(); + } + // + + // + @Override + protected void dispatchDraw(Canvas canvas) { + final View thisView = this; + final int viewWidth = thisView.getWidth(); + final int viewHeight = mHeight;//thisView.getHeight(); + //noinspection EqualsBetweenInconvertibleTypes + final boolean footer = mKernel != null && (this.equals(mKernel.getRefreshLayout().getRefreshFooter())); + + if (footer) { + canvas.save(); + canvas.translate(0, thisView.getHeight()); + canvas.scale(1, -1); + } + + if (thisView.isInEditMode()) { + mShowBoll = true; + mShowOuter = true; + mHeadHeight = viewHeight; + mRefreshStop = 270; + mBollY = mHeadHeight / 2; + mBollRadius = mHeadHeight / 6; + } + + drawWave(canvas, viewWidth, viewHeight); + drawSpringUp(canvas, viewWidth); + drawBoll(canvas, viewWidth); + drawOuter(canvas, viewWidth); + drawFinish(canvas, viewWidth); + + if (footer) { + canvas.restore(); + } + + super.dispatchDraw(canvas); + } + + protected void drawWave(Canvas canvas, int viewWidth, int viewHeight) { + float baseHeight = Math.min(mHeadHeight, viewHeight); + if (mWaveHeight != 0) { + mPath.reset(); + mPath.lineTo(viewWidth, 0); + mPath.lineTo(viewWidth, baseHeight); + mPath.quadTo(viewWidth / 2f, baseHeight + mWaveHeight * 2, 0, baseHeight); + mPath.close(); + canvas.drawPath(mPath, mBackPaint); + } else { + canvas.drawRect(0, 0, viewWidth, baseHeight, mBackPaint); + } + } + + protected void drawSpringUp(Canvas canvas, int viewWidth) { + if (mSpringRatio > 0) { + float leftX = (viewWidth / 2f - 4 * mBollRadius + mSpringRatio * 3 * mBollRadius); + if (mSpringRatio < 0.9) { + mPath.reset(); + mPath.moveTo(leftX, mBollY); + mPath.quadTo(viewWidth / 2f, mBollY - mBollRadius * mSpringRatio * 2, + viewWidth - leftX, mBollY); + canvas.drawPath(mPath, mFrontPaint); + } else { + canvas.drawCircle(viewWidth / 2f, mBollY, mBollRadius, mFrontPaint); + } + } + } + + protected void drawBoll(Canvas canvas, int viewWidth) { + if (mShowBoll) { + canvas.drawCircle(viewWidth / 2f, mBollY, mBollRadius, mFrontPaint); + + drawBollTail(canvas, viewWidth, (mHeadHeight + mWaveHeight) / mHeadHeight); + } + } + + protected void drawBollTail(Canvas canvas, int viewWidth, float fraction) { + if (mShowBollTail) { + final float bottom = mHeadHeight + mWaveHeight; + final float startY = mBollY + mBollRadius * fraction / 2; + final float startX = viewWidth / 2f + (float) Math.sqrt(mBollRadius * mBollRadius * (1 - fraction * fraction / 4)); + final float bezier1x = (viewWidth / 2f + (mBollRadius * 3 / 4) * (1 - fraction)); + final float bezier2x = bezier1x + mBollRadius; + + mPath.reset(); + mPath.moveTo(startX, startY); + mPath.quadTo(bezier1x, bottom, bezier2x, bottom); + mPath.lineTo(viewWidth - bezier2x, bottom); + mPath.quadTo(viewWidth - bezier1x, bottom, viewWidth - startX, startY); + canvas.drawPath(mPath, mFrontPaint); + } + } + + protected void drawOuter(Canvas canvas, int viewWidth) { + if (mShowOuter) { + float outerR = mBollRadius + mOuterPaint.getStrokeWidth() * 2; + + mRefreshStart += mOuterIsStart ? 3 : 10; + mRefreshStop += mOuterIsStart ? 10 : 3; + mRefreshStart = mRefreshStart % 360; + mRefreshStop = mRefreshStop % 360; + + int swipe = mRefreshStop - mRefreshStart; + swipe = swipe < 0 ? swipe + 360 : swipe; + + canvas.drawArc(new RectF(viewWidth / 2f - outerR, mBollY - outerR, viewWidth / 2f + outerR, mBollY + outerR), + mRefreshStart, swipe, false, mOuterPaint); + if (swipe >= TARGET_DEGREE) { + mOuterIsStart = false; + } else if (swipe <= 10) { + mOuterIsStart = true; + } + final View thisView = this; + thisView.invalidate(); + } + + } + + protected void drawFinish(Canvas canvas, int viewWidth) { + if (mFinishRatio > 0) { + int beforeColor = mOuterPaint.getColor(); + if (mFinishRatio < 0.3) { + canvas.drawCircle(viewWidth / 2f, mBollY, mBollRadius, mFrontPaint); + int outerR = (int) (mBollRadius + mOuterPaint.getStrokeWidth() * 2 * (1+mFinishRatio / 0.3f)); + int afterColor = ColorUtils.setAlphaComponent(beforeColor, (int) (0xff * (1 - mFinishRatio / 0.3f))); + mOuterPaint.setColor(afterColor); + canvas.drawArc(new RectF(viewWidth / 2f - outerR, mBollY - outerR, viewWidth / 2f + outerR, mBollY + outerR), + 0, 360, false, mOuterPaint); + } + mOuterPaint.setColor(beforeColor); + + if (mFinishRatio >= 0.3 && mFinishRatio < 0.7) { + float fraction = (mFinishRatio - 0.3f) / 0.4f; + mBollY = (int) (mHeadHeight / 2 + (mHeadHeight - mHeadHeight / 2) * fraction); + canvas.drawCircle(viewWidth / 2f, mBollY, mBollRadius, mFrontPaint); + if (mBollY >= mHeadHeight - mBollRadius * 2) { + mShowBollTail = true; + drawBollTail(canvas, viewWidth, fraction); + } + mShowBollTail = false; + } + + if (mFinishRatio >= 0.7 && mFinishRatio <= 1) { + float fraction = (mFinishRatio - 0.7f) / 0.3f; + int leftX = (int) (viewWidth / 2f - mBollRadius - 2 * mBollRadius * fraction); + mPath.reset(); + mPath.moveTo(leftX, mHeadHeight); + mPath.quadTo(viewWidth / 2f, mHeadHeight - (mBollRadius * (1 - fraction)), + viewWidth - leftX, mHeadHeight); + canvas.drawPath(mPath, mFrontPaint); + } + } + } + // + + // + @Override + public void onInitialized(@NonNull RefreshKernel kernel, int height, int maxDragHeight) { + mKernel = kernel; + } + + @Override + public void onMoving(boolean isDragging, float percent, int offset, int height, int maxDragHeight) { + mHeight = offset; + if (isDragging || mWavePulling) { + mWavePulling = true; + mHeadHeight = height; + mWaveHeight = Math.max(offset - height, 0) * .8f; + } + this.invalidate(); + } + + @Override + public void onReleased(@NonNull RefreshLayout refreshLayout, int height, int maxDragHeight) { + mWavePulling = false; + mHeadHeight = height; + mBollRadius = height / 6f; + DecelerateInterpolator interpolator = new DecelerateInterpolator(); + final float reboundHeight = Math.min(mWaveHeight * 0.8f, mHeadHeight / 2); + ValueAnimator waveAnimator = ValueAnimator.ofFloat( + mWaveHeight, 0, + -(reboundHeight*1.0f),0, + -(reboundHeight*0.4f),0 + ); + waveAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { + float speed = 0; + float springBollY; + float springRatio = 0; + int status = 0;//0 还没开始弹起 1 向上弹起 2 在弹起的最高点停住 + @Override + public void onAnimationUpdate(ValueAnimator animation) { + float curValue = (float) animation.getAnimatedValue(); + if (status == 0 && curValue <= 0) { + status = 1; + speed = Math.abs(curValue - mWaveHeight); + } + if (status == 1) { + springRatio = -curValue / reboundHeight; + if (springRatio >= mSpringRatio) { + mSpringRatio = springRatio; + mBollY = mHeadHeight + curValue; + speed = Math.abs(curValue - mWaveHeight); + } else { + status = 2; + mSpringRatio = 0; + mShowBoll = true; + mShowBollTail = true; + springBollY = mBollY; + } + } + if (status == 2) { + if (mBollY > mHeadHeight / 2) { + mBollY = Math.max(mHeadHeight / 2, mBollY - speed); + float bally = animation.getAnimatedFraction() * (mHeadHeight / 2 - springBollY) + springBollY; + if (mBollY > bally) { + mBollY = bally; + } + } + } + if (mShowBollTail && curValue < mWaveHeight) { + mShowOuter = true; + mShowBollTail = false; + mOuterIsStart = true; + mRefreshStart = 90; + mRefreshStop = 90; + } + if (!mWavePulling) { + mWaveHeight = curValue; + final View thisView = BezierCircleHeader.this; + thisView.invalidate(); + } + } + }); + waveAnimator.setInterpolator(interpolator); + waveAnimator.setDuration(1000); + waveAnimator.start(); + } + + @Override + public int onFinish(@NonNull RefreshLayout layout, boolean success) { + mShowBoll = false; + mShowOuter = false; + final int DURATION_FINISH = 800; //动画时长 + ValueAnimator animator = ValueAnimator.ofFloat(0, 1); + animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { + @Override + public void onAnimationUpdate(ValueAnimator animation) { + final View thisView = BezierCircleHeader.this; + mFinishRatio = (float) animation.getAnimatedValue(); + thisView.invalidate(); + } + }); + animator.setInterpolator(new AccelerateInterpolator()); + animator.setDuration(DURATION_FINISH); + animator.start(); + return DURATION_FINISH; + } + + /** + * @param colors 对应Xml中配置的 srlPrimaryColor srlAccentColor + * @deprecated 只由框架调用 + * 使用者使用 {@link RefreshLayout#setPrimaryColorsId(int...)} + */ + @Override + @Deprecated + public void setPrimaryColors(@ColorInt int ... colors) { + if (colors.length > 0) { + mBackPaint.setColor(colors[0]); + if (colors.length > 1) { + mFrontPaint.setColor(colors[1]); + mOuterPaint.setColor(colors[1]); + } + } + } + +// @NonNull +// @Override +// public SpinnerStyle getSpinnerStyle() { +// return SpinnerStyle.Scale; +// } + // +} diff --git a/app/src/main/java/com/dskj/rbchat/widget/CircleImageView.java b/app/src/main/java/com/dskj/rbchat/widget/CircleImageView.java new file mode 100644 index 0000000..48fa105 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/widget/CircleImageView.java @@ -0,0 +1,323 @@ +package com.dskj.rbchat.widget; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Matrix; +import android.graphics.Paint; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffXfermode; +import android.graphics.RectF; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; +import android.view.MotionEvent; + +import androidx.appcompat.widget.AppCompatImageView; + +import com.dskj.rbchat.R; + + +public class CircleImageView extends AppCompatImageView { + // paint when user press + private Paint pressPaint; + private int width; + private int height; + + // default bitmap config + private static final Bitmap.Config BITMAP_CONFIG = Bitmap.Config.ARGB_8888; + private static final int COLORDRAWABLE_DIMENSION = 1; + + // border color + private int borderColor; + // width of border + private int borderWidth; + // alpha when pressed + private int pressAlpha; + // color when pressed + private int pressColor; + // radius\ + private int radius; + // rectangle or round, 1 is circle, 2 is rectangle + private int shapeType; + + public CircleImageView(Context context) { + super(context); + init(context, null); + } + + public CircleImageView(Context context, AttributeSet attrs) { + super(context, attrs); + init(context, attrs); + } + + public CircleImageView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(context, attrs); + } + + + private void init(Context context, AttributeSet attrs) { + //init the value + borderWidth = 0; + borderColor = 0xddffffff; + pressAlpha = 0x42; + pressColor = 0x42000000; + radius = 16; + shapeType = 0; + + // get attribute of EaseImageView + if (attrs != null) { + TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.CircleImageView); + borderColor = array.getColor(R.styleable.CircleImageView_ease_border_color, borderColor); + borderWidth = array.getDimensionPixelOffset(R.styleable.CircleImageView_ease_border_width, borderWidth); + pressAlpha = array.getInteger(R.styleable.CircleImageView_ease_press_alpha, pressAlpha); + pressColor = array.getColor(R.styleable.CircleImageView_ease_press_color, pressColor); + radius = array.getDimensionPixelOffset(R.styleable.CircleImageView_ease_radius, radius); + shapeType = array.getInteger(R.styleable.CircleImageView_es_shape_type, shapeType); + array.recycle(); + } + + // set paint when pressed + pressPaint = new Paint(); + pressPaint.setAntiAlias(true); + pressPaint.setStyle(Paint.Style.FILL); + pressPaint.setColor(pressColor); + pressPaint.setAlpha(0); + pressPaint.setFlags(Paint.ANTI_ALIAS_FLAG); + + setDrawingCacheEnabled(true); + setWillNotDraw(false); + } + + @Override + protected void onDraw(Canvas canvas) { + + if (shapeType == 0) { + super.onDraw(canvas); + return; + } + Drawable drawable = getDrawable(); + if (drawable == null) { + return; + } + // the width and height is in xml file + if (getWidth() == 0 || getHeight() == 0) { + return; + } + Bitmap bitmap = getBitmapFromDrawable(drawable); + drawDrawable(canvas, bitmap); + + if (isClickable()) { + drawPress(canvas); + } + drawBorder(canvas); + } + + /** + * draw Rounded Rectangle + * + * @param canvas + * @param bitmap + */ + @SuppressLint("WrongConstant") + private void drawDrawable(Canvas canvas, Bitmap bitmap) { + Paint paint = new Paint(); + paint.setColor(0xffffffff); + paint.setAntiAlias(true); //smooths out the edges of what is being drawn + PorterDuffXfermode xfermode = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN); + // set flags + int saveFlags = Canvas.ALL_SAVE_FLAG + ; + canvas.saveLayer(0, 0, width, height, null, saveFlags); + + if (shapeType == 1) { + canvas.drawCircle(width / 2, height / 2, width / 2 - 1, paint); + } else if (shapeType == 2) { + RectF rectf = new RectF(1, 1, getWidth() - 1, getHeight() - 1); + canvas.drawRoundRect(rectf, radius + 1, radius + 1, paint); + } + + paint.setXfermode(xfermode); + + float scaleWidth = ((float) getWidth()) / bitmap.getWidth(); + float scaleHeight = ((float) getHeight()) / bitmap.getHeight(); + + Matrix matrix = new Matrix(); + matrix.postScale(scaleWidth, scaleHeight); + + //bitmap scale + bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); + + canvas.drawBitmap(bitmap, 0, 0, paint); + canvas.restore(); + } + + /** + * draw the effect when pressed + * + * @param canvas + */ + private void drawPress(Canvas canvas) { + // check is rectangle or circle + if (shapeType == 1) { + canvas.drawCircle(width / 2, height / 2, width / 2 - 1, pressPaint); + } else if (shapeType == 2) { + RectF rectF = new RectF(1, 1, width - 1, height - 1); + canvas.drawRoundRect(rectF, radius + 1, radius + 1, pressPaint); + } + } + + /** + * draw customized border + * + * @param canvas + */ + private void drawBorder(Canvas canvas) { + if (borderWidth > 0) { + Paint paint = new Paint(); + paint.setStrokeWidth(borderWidth); + paint.setStyle(Paint.Style.STROKE); + paint.setColor(borderColor); + paint.setAntiAlias(true); + // // check is rectangle or circle + if (shapeType == 1) { + canvas.drawCircle(width / 2, height / 2, (width - borderWidth) / 2, paint); + } else if (shapeType == 2) { + RectF rectf = new RectF(borderWidth / 2, borderWidth / 2, getWidth() - borderWidth / 2, + getHeight() - borderWidth / 2); + canvas.drawRoundRect(rectf, radius, radius, paint); + } + } + } + + /** + * monitor the size change + * + * @param w + * @param h + * @param oldw + * @param oldh + */ + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + width = w; + height = h; + } + + /** + * monitor if touched + * + * @param event + * @return + */ + @Override + public boolean onTouchEvent(MotionEvent event) { + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + pressPaint.setAlpha(pressAlpha); + invalidate(); + break; + case MotionEvent.ACTION_UP: + pressPaint.setAlpha(0); + invalidate(); + break; + case MotionEvent.ACTION_MOVE: + + break; + default: + pressPaint.setAlpha(0); + invalidate(); + break; + } + return super.onTouchEvent(event); + } + + /** + * @param drawable + * @return + */ + private Bitmap getBitmapFromDrawable(Drawable drawable) { + if (drawable == null) { + return null; + } + + if (drawable instanceof BitmapDrawable) { + return ((BitmapDrawable) drawable).getBitmap(); + } + + Bitmap bitmap; + int width = Math.max(drawable.getIntrinsicWidth(), 2); + int height = Math.max(drawable.getIntrinsicHeight(), 2); + try { + bitmap = Bitmap.createBitmap(width, height, BITMAP_CONFIG); + Canvas canvas = new Canvas(bitmap); + drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); + drawable.draw(canvas); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + bitmap = null; + } + return bitmap; + } + + /** + * set border color + * + * @param borderColor + */ + public void setBorderColor(int borderColor) { + this.borderColor = borderColor; + invalidate(); + } + + /** + * set border width + * + * @param borderWidth + */ + public void setBorderWidth(int borderWidth) { + this.borderWidth = borderWidth; + } + + /** + * set alpha when pressed + * + * @param pressAlpha + */ + public void setPressAlpha(int pressAlpha) { + this.pressAlpha = pressAlpha; + } + + /** + * set color when pressed + * + * @param pressColor + */ + public void setPressColor(int pressColor) { + this.pressColor = pressColor; + } + + /** + * set radius + * + * @param radius + */ + public void setRadius(int radius) { + this.radius = radius; + invalidate(); + } + + /** + * set shape,1 is circle, 2 is rectangle + * + * @param shapeType + */ + public void setShapeType(int shapeType) { + this.shapeType = shapeType; + invalidate(); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/widget/GridItemDecoration.java b/app/src/main/java/com/dskj/rbchat/widget/GridItemDecoration.java new file mode 100644 index 0000000..6dab42d --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/widget/GridItemDecoration.java @@ -0,0 +1,56 @@ +package com.dskj.rbchat.widget; + +import android.graphics.Rect; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.netease.yunxin.kit.common.utils.SizeUtils; + +public class GridItemDecoration extends RecyclerView.ItemDecoration { + + private int padding; + + public GridItemDecoration(int dpValue) { + this.padding = SizeUtils.dp2px(dpValue); + } + + + @Override + public void getItemOffsets( + @NonNull Rect outRect, + @NonNull View view, + @NonNull RecyclerView parent, + @NonNull RecyclerView.State state) { + GridLayoutManager manager = (GridLayoutManager) parent.getLayoutManager(); + int childSize = parent.getChildCount(); + int span = manager.getSpanCount(); + //为了Item大小均匀,将设定分割线平均分给左右两边Item各一半 + int offset = padding / 2; + //得到View的位置 + int childPosition = parent.getChildAdapterPosition(view); + //第一排,顶部不画 + if (childPosition < span) { + //最左边的,左边不画 + if (childPosition % span == 0) { + outRect.set(0, 0, offset, 0); + //最右边,右边不画 + } else if (childPosition % span == span - 1) { + outRect.set(offset, 0, 0, 0); + } else { + outRect.set(offset, 0, offset, 0); + } + } else { + //上下的分割线,就从第二排开始,每个区域的顶部直接添加设定大小,不用再均分了 + if (childPosition % span == 0) { + outRect.set(0, padding, offset, 0); + } else if (childPosition % span == span - 1) { + outRect.set(offset, padding, 0, 0); + } else { + outRect.set(offset, padding, offset, 0); + } + } + } +} diff --git a/app/src/main/java/com/dskj/rbchat/widget/StatusLayout.java b/app/src/main/java/com/dskj/rbchat/widget/StatusLayout.java new file mode 100644 index 0000000..943ce48 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/widget/StatusLayout.java @@ -0,0 +1,44 @@ +package com.dskj.rbchat.widget; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.ViewGroup; +import android.widget.LinearLayout; + +import androidx.annotation.Nullable; + +/** + * Created by kiun_2007 on 2018/3/29. + */ + +public class StatusLayout extends LinearLayout { + public StatusLayout(Context context) { + this(context, null); + } + + public StatusLayout(Context context, @Nullable AttributeSet attrs) { + this(context, attrs, 0); + } + + public StatusLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + private int getStatusBarHeight(Context context) { + int result = 0; + int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android"); + if (resourceId > 0) { + result = context.getResources().getDimensionPixelSize(resourceId); + } + return result; + } + + @Override + protected void onAttachedToWindow() { + ViewGroup.LayoutParams lp = this.getLayoutParams(); + lp.width = -1; + lp.height = getStatusBarHeight(getContext()); + this.setLayoutParams(lp); + super.onAttachedToWindow(); + } +} diff --git a/app/src/main/java/com/dskj/rbchat/wxapi/WXEntryActivity.java b/app/src/main/java/com/dskj/rbchat/wxapi/WXEntryActivity.java new file mode 100644 index 0000000..e6f8dad --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/wxapi/WXEntryActivity.java @@ -0,0 +1,62 @@ +package com.dskj.rbchat.wxapi; + +import android.app.Activity; +import android.content.Intent; +import android.os.Bundle; +import android.util.Log; + +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.wxapi.bean.WeiXin; +import com.netease.yunxin.kit.chatkit.ui.common.RxBus; +import com.tencent.mm.opensdk.constants.ConstantsAPI; +import com.tencent.mm.opensdk.modelbase.BaseReq; +import com.tencent.mm.opensdk.modelbase.BaseResp; +import com.tencent.mm.opensdk.modelmsg.SendAuth; +import com.tencent.mm.opensdk.openapi.IWXAPI; +import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler; +import com.tencent.mm.opensdk.openapi.WXAPIFactory; + +/** + * 微信登陆分享回调Activity + * @create time 2015-05-25 + */ +public class WXEntryActivity extends Activity implements IWXAPIEventHandler { + private IWXAPI wxAPI; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + wxAPI = WXAPIFactory.createWXAPI(this, IMUIKitConfig.WECHAT_APPID,true); + wxAPI.registerApp(IMUIKitConfig.WECHAT_APPID); + wxAPI.handleIntent(getIntent(), this); + } + + @Override + protected void onNewIntent(Intent intent){ + super.onNewIntent(intent); + wxAPI.handleIntent(getIntent(),this); + Log.i("ansen","WXEntryActivity onNewIntent"); + } + + @Override + public void onReq(BaseReq arg0) { + Log.i("ansen","WXEntryActivity onReq:"+arg0); + } + + @Override + public void onResp(BaseResp resp){ + if(resp.getType()== ConstantsAPI.COMMAND_SENDMESSAGE_TO_WX){//分享 + Log.i("ansen","微信分享操作....."); + WeiXin weiXin=new WeiXin(2,resp.errCode,""); + RxBus.getInstance().post(weiXin); + }else if(resp.getType()==ConstantsAPI.COMMAND_SENDAUTH){//登陆 + Log.i("ansen", "微信登录操作....."); + SendAuth.Resp authResp = (SendAuth.Resp) resp; + WeiXin weiXin=new WeiXin(1,resp.errCode,authResp.code); + RxBus.getInstance().post(weiXin); + } + finish(); + } + +} diff --git a/app/src/main/java/com/dskj/rbchat/wxapi/WXPayEntryActivity.java b/app/src/main/java/com/dskj/rbchat/wxapi/WXPayEntryActivity.java new file mode 100644 index 0000000..2454f48 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/wxapi/WXPayEntryActivity.java @@ -0,0 +1,55 @@ +package com.dskj.rbchat.wxapi; + +import android.app.Activity; +import android.content.Intent; +import android.os.Bundle; +import android.util.Log; + +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.wxapi.bean.WeiXin; +import com.netease.yunxin.kit.chatkit.ui.common.RxBus; +import com.tencent.mm.opensdk.constants.ConstantsAPI; +import com.tencent.mm.opensdk.modelbase.BaseReq; +import com.tencent.mm.opensdk.modelbase.BaseResp; +import com.tencent.mm.opensdk.openapi.IWXAPI; +import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler; +import com.tencent.mm.opensdk.openapi.WXAPIFactory; + +/** + * 微信支付回调Activity + * @create time 2017-09-15 + */ +public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler { + private IWXAPI wxAPI; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + wxAPI = WXAPIFactory.createWXAPI(this, IMUIKitConfig.WECHAT_APPID); + wxAPI.handleIntent(getIntent(), this); + } + + @Override + protected void onNewIntent(Intent intent){ + super.onNewIntent(intent); + setIntent(intent); + wxAPI.handleIntent(intent, this); + } + + @Override + public void onReq(BaseReq baseReq) {} + + @Override + public void onResp(BaseResp resp) { + Log.i("ansen", "微信支付回调 返回错误码:"+resp.errCode+" 错误名称:"+resp.errStr); + if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX){//微信支付 + WeiXin weiXin=new WeiXin(3,resp.errCode,""); + RxBus.getInstance().post(weiXin); + } + finish(); + } + + + + +} diff --git a/app/src/main/java/com/dskj/rbchat/wxapi/bean/WeiXin.java b/app/src/main/java/com/dskj/rbchat/wxapi/bean/WeiXin.java new file mode 100644 index 0000000..98584e5 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/wxapi/bean/WeiXin.java @@ -0,0 +1,43 @@ +package com.dskj.rbchat.wxapi.bean; + +/** + * @create time 2017-09-14 + */ +public class WeiXin { + private int type;//1:登录 2.分享 3:微信支付 + private int errCode;//微信返回的错误码 + private String code;//登录成功才会有的code + + public WeiXin() { + } + + public WeiXin(int type,int errCode, String code) { + this.type = type; + this.errCode=errCode; + this.code = code; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public int getErrCode() { + return errCode; + } + + public void setErrCode(int errCode) { + this.errCode = errCode; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/wxapi/bean/WeiXinInfo.java b/app/src/main/java/com/dskj/rbchat/wxapi/bean/WeiXinInfo.java new file mode 100644 index 0000000..70399f8 --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/wxapi/bean/WeiXinInfo.java @@ -0,0 +1,106 @@ +package com.dskj.rbchat.wxapi.bean; + +/** + * @create time 2017-09-14 + */ +public class WeiXinInfo { + private String openid;// + private String headimgurl;//用户头像URL + private String nickname=""; + private int age; + private int sex; + private String unionid; + private String invitedBy; + private int deviceType; + private String deviceId; + private String userId; + private String substationId; + + public String getSubstationId() { + return substationId; + } + + public void setSubstationId(String substationId) { + this.substationId = substationId; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public int getDeviceType() { + return deviceType; + } + + public void setDeviceType(int deviceType) { + this.deviceType = deviceType; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getInvitedBy() { + return invitedBy; + } + + public void setInvitedBy(String invitedBy) { + this.invitedBy = invitedBy; + } + + public int getSex() { + return sex; + } + + public void setSex(int sex) { + this.sex = sex; + } + + public String getUnionid() { + return unionid; + } + + public void setUnionid(String unionid) { + this.unionid = unionid; + } + + public String getHeadimgurl() { + return headimgurl; + } + + public void setHeadimgurl(String headimgurl) { + this.headimgurl = headimgurl; + } + + public String getNickname() { + return nickname; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + public String getOpenid() { + return openid; + } + + public void setOpenid(String openid) { + this.openid = openid; + } +} diff --git a/app/src/main/java/com/dskj/rbchat/wxapi/bean/WeiXinToken.java b/app/src/main/java/com/dskj/rbchat/wxapi/bean/WeiXinToken.java new file mode 100644 index 0000000..0f3268d --- /dev/null +++ b/app/src/main/java/com/dskj/rbchat/wxapi/bean/WeiXinToken.java @@ -0,0 +1,81 @@ +package com.dskj.rbchat.wxapi.bean; + +/** + * Created by xx on 16/6/25. + */ +public class WeiXinToken { + private String access_token;// 接口调用凭证 + private String expires_in;// access_token接口调用凭证超时时间,单位(秒) + private String refresh_token;// 用户刷新access_token + private String openid;// 授权用户唯一标识 + private String scope;// 用户授权的作用域,使用逗号(,)分隔 + private String unionid;// 只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。 + + // 错误返回样例 + private int errcode=0;// 错误码 + private String errmsg;// 错误说明 + + public String getAccess_token() { + return access_token; + } + + public void setAccess_token(String access_token) { + this.access_token = access_token; + } + + public String getExpires_in() { + return expires_in; + } + + public void setExpires_in(String expires_in) { + this.expires_in = expires_in; + } + + public String getRefresh_token() { + return refresh_token; + } + + public void setRefresh_token(String refresh_token) { + this.refresh_token = refresh_token; + } + + public String getOpenid() { + return openid; + } + + public void setOpenid(String openid) { + this.openid = openid; + } + + public String getScope() { + return scope; + } + + public void setScope(String scope) { + this.scope = scope; + } + + public String getUnionid() { + return unionid; + } + + public void setUnionid(String unionid) { + this.unionid = unionid; + } + + public int getErrcode() { + return errcode; + } + + public void setErrcode(int errcode) { + this.errcode = errcode; + } + + public String getErrmsg() { + return errmsg; + } + + public void setErrmsg(String errmsg) { + this.errmsg = errmsg; + } +} diff --git a/app/src/main/java/com/huawei/hms/hmsscankit/HtmlScanKitActivity.java b/app/src/main/java/com/huawei/hms/hmsscankit/HtmlScanKitActivity.java new file mode 100644 index 0000000..128083f --- /dev/null +++ b/app/src/main/java/com/huawei/hms/hmsscankit/HtmlScanKitActivity.java @@ -0,0 +1,466 @@ +package com.huawei.hms.hmsscankit; + +import android.Manifest; +import android.graphics.Bitmap; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.text.TextUtils; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.model.LoginBean; +import com.dskj.rbchat.model.UserShareBean; +import com.dskj.rbchat.utils.AdaptScreenUtils; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.utils.ShareDateUtils; +import com.dskj.rbchat.utils.ToolKits; +import com.google.android.material.bottomsheet.BottomSheetDialog; +import com.king.zxing.util.CodeUtils; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.msg.MessageBuilder; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.nimlib.sdk.msg.model.IMMessage; +import com.netease.nimlib.sdk.uinfo.UserService; +import com.netease.nimlib.sdk.uinfo.model.NimUserInfo; +import com.netease.yunxin.kit.chatkit.repo.ChatRepo; +import com.netease.yunxin.kit.common.ui.utils.AvatarColor; +import com.netease.yunxin.kit.common.ui.utils.Permission; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.common.ui.widgets.ContactAvatarView; +import com.netease.yunxin.kit.common.utils.PermissionUtils; +import com.netease.yunxin.kit.common.utils.UriUtils; +import com.netease.yunxin.kit.contactkit.ui.utils.ColorUtils; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.provider.FetchCallbackImpl; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +public class HtmlScanKitActivity extends ScanKitActivity { + private ShareDateUtils shareDateUtils; + LoginBean loginBean; + + @Override + protected void onCreate(Bundle bundle) { + super.onCreate(bundle); + loginBean = DataUtils.getLocUserInfo(); + + shareDateUtils = new ShareDateUtils(); + shareDateUtils.getAllSessionList(); + showView(); + } + + private void showView() { + + findViewById(R.id.img_btn).setVisibility(View.GONE); + + findViewById(R.id.layout_hide).setVisibility(View.GONE); + findViewById(R.id.bot_ly).setVisibility(View.GONE); + findViewById(R.id.ivFlash).setVisibility(View.GONE); + findViewById(R.id.flash_light_text).setVisibility(View.GONE); + } + + public void showQrcode(View view) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + showQrcodeView(); + } + } + + + private ImageView coloseIv; + private LinearLayout qrcodeLy; + private ImageView qrcodeIv; + private TextView qrcodeTipsTv; + private LinearLayout qrcodeActionLy; + private TextView copyTv; + private TextView shareTv; + private TextView saveTv; + private TextView shuaxinTv; + + @RequiresApi(api = Build.VERSION_CODES.M) + private void showQrcodeView() { + BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(this, R.style.BottomSheetDialog); + + View bottomView = LayoutInflater.from(HtmlScanKitActivity.this).inflate(R.layout.bottom_sheet_qrcode_layout, null); + + coloseIv = (ImageView) bottomView.findViewById(R.id.colose_iv); + qrcodeLy = (LinearLayout) bottomView.findViewById(R.id.qrcode_ly); + qrcodeIv = (ImageView) bottomView.findViewById(R.id.qrcode_iv); + qrcodeTipsTv = (TextView) bottomView.findViewById(R.id.qrcode_tips_tv); + qrcodeActionLy = (LinearLayout) bottomView.findViewById(R.id.qrcode_action_ly); + copyTv = (TextView) bottomView.findViewById(R.id.copy_tv); + shareTv = (TextView) bottomView.findViewById(R.id.share_tv); + saveTv = (TextView) bottomView.findViewById(R.id.save_tv); + shuaxinTv = (TextView) bottomView.findViewById(R.id.shuaxin_tv); + LoginBean loginBean = DataUtils.getLocUserInfo(); + Bitmap bitmap = CodeUtils.createQRCode(String.format(IMUIKitConfig.SHARE_INVCODE1, IMKitClient.account()), DataUtils.dip2px(this, 175.0f), null); + if(loginBean!=null){ + bitmap = CodeUtils.createQRCode(String.format(IMUIKitConfig.SHARE_ADD_USER,loginBean.getUser().getInviteCode(), IMKitClient.account()), DataUtils.dip2px(this, 175.0f), null); + } + if (bitmap != null) { + qrcodeIv.setImageBitmap(bitmap); + } + + shuaxinTv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + ToastX.showShortToast(R.string.shuaxinchenggong_txt); + } + }); + + coloseIv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + bottomSheetDialog.dismiss(); + } + }); + + saveTv.setOnClickListener(v -> { + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + if (PermissionUtils.hasPermissions( + HtmlScanKitActivity.this, Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO)) { + + doSaveQrcode(); + } else { + requestCameraPermission( + ); + } +// doSaveQrcode(); + } else { + if (PermissionUtils.hasPermissions( + HtmlScanKitActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE)) { + + doSaveQrcode(); + } else { + requestCameraPermission( + Manifest.permission.READ_EXTERNAL_STORAGE); + } + } + }); + + shareTv.setOnClickListener(v -> { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + if (PermissionUtils.hasPermissions( + HtmlScanKitActivity.this, Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO)) { + + showBottomShare(); + } else { + requestCameraPermission( + ); + } + } else { + if (PermissionUtils.hasPermissions( + HtmlScanKitActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE)) { + + showBottomShare(); + } else { + requestCameraPermission( + Manifest.permission.READ_EXTERNAL_STORAGE); + } + } + }); + + copyTv.setOnClickListener(v -> { + if (loginBean != null) { + LogUtils.i("数据是啥:" + GsonUtils.beanToJSONString(loginBean)); + String url = String.format(IMUIKitConfig.SHARE_INVCODE, loginBean.getUser().getInviteCode(), IMKitClient.account()); + DataUtils.copy(url, HtmlScanKitActivity.this); + ToastX.showShortToast(R.string.fuzhichenggong_txt); + } + }); + + bottomSheetDialog.setContentView(bottomView); + bottomSheetDialog.show(); + + bottomSheetDialog.setOnDismissListener(dialog -> getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white))); + AdaptScreenUtils.setWhiteNavigationBar(bottomSheetDialog); + + } + + + private void requestCameraPermission(String permission) { + + Permission.requirePermissions(IMKitClient.getApplicationContext(), new String[]{permission}) + .request( + new Permission.PermissionCallback() { + @Override + public void onGranted(List permissionsGranted) { + } + + @Override + public void onDenial( + List permissionsDenial, List permissionDenialForever) { + Toast.makeText(HtmlScanKitActivity.this, com.netease.yunxin.kit.chatkit.ui.R.string.permission_default, Toast.LENGTH_SHORT) + .show(); + } + + @Override + public void onException(Exception exception) { + Toast.makeText(HtmlScanKitActivity.this, com.netease.yunxin.kit.chatkit.ui.R.string.permission_default, Toast.LENGTH_SHORT) + .show(); + } + }); + } + + + private void requestCameraPermission() { + Permission.requirePermissions(IMKitClient.getApplicationContext(), new String[]{Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO}) + .request( + new Permission.PermissionCallback() { + @Override + public void onGranted(List permissionsGranted) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + showBottomShare(); + } + } + + @Override + public void onDenial( + List permissionsDenial, List permissionDenialForever) { + Toast.makeText(HtmlScanKitActivity.this, com.netease.yunxin.kit.chatkit.ui.R.string.permission_default, Toast.LENGTH_SHORT) + .show(); + } + + @Override + public void onException(Exception exception) { + Toast.makeText(HtmlScanKitActivity.this, com.netease.yunxin.kit.chatkit.ui.R.string.permission_default, Toast.LENGTH_SHORT) + .show(); + } + }); + } + + @RequiresApi(api = Build.VERSION_CODES.M) + public void showBottomShare() { + + titleUsers = shareDateUtils.getConverstionShareInfo(); + titleUsersIsCheck = new ArrayList<>(); + for (UserShareBean conversationInfo : titleUsers) { + titleUsersIsCheck.add(false); + } + if (titleUsers == null || titleUsers.size() == 0) { + ToastX.showShortToast(R.string.mykfxfddx_txt); + return; + } + BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(this, R.style.BottomSheetDialog); + + View bottomView = LayoutInflater.from(HtmlScanKitActivity.this).inflate(R.layout.bottom_sheet_layout, null); + + + coloseIvShare = (ImageView) bottomView.findViewById(R.id.colose_iv); + recyclerShare = (RecyclerView) bottomView.findViewById(R.id.recycler); + commentEtShare = (EditText) bottomView.findViewById(R.id.comment_et); + + shareBt = (TextView) bottomView.findViewById(R.id.share_bt); + initList(); + bottomSheetDialog.setContentView(bottomView); + bottomSheetDialog.show(); + coloseIvShare.setOnClickListener(v -> bottomSheetDialog.dismiss()); + shareBt.setOnClickListener(v -> { + + boolean isSelect = false; + for (Boolean type : titleUsersIsCheck) { + if (type) { + isSelect = true; + } + } + if (!isSelect) { + ToastX.showShortToast(getString(R.string.qxxzyfxddx_txt)); + return; + } + doSaveQrcodeShare(bottomSheetDialog); + }); + + + bottomSheetDialog.setOnDismissListener(dialog -> getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white))); + AdaptScreenUtils.setWhiteNavigationBar(bottomSheetDialog); + } + + private ImageView coloseIvShare; + private RecyclerView recyclerShare; + private EditText commentEtShare; + private TextView shareBt; + private LinearLayoutManager linearLayoutManager; + private CommonAdapter commonAdapter; + private ArrayList titleUsers; + private ArrayList titleUsersIsCheck; + + private void initList() { + + linearLayoutManager = new LinearLayoutManager(HtmlScanKitActivity.this); + linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); + recyclerShare.setLayoutManager(linearLayoutManager); + commonAdapter = new CommonAdapter<>(HtmlScanKitActivity.this, R.layout.item_share_list, titleUsers) { + @Override + public void convert(ViewHolder holder, UserShareBean s, int index) { + ImageView select_iv = holder.getView(R.id.select_iv); + if (titleUsersIsCheck.get(index)) { + select_iv.setImageResource(R.mipmap.dialog_item_gou); + } else { + select_iv.setImageResource(R.mipmap.dialog_item_quan); + } + + ContactAvatarView imageView = holder.getView(R.id.logo_iv); + + if (s.getTeamInfo() != null) { + if (TextUtils.isEmpty(s.getTeamInfo().getIcon())) { + imageView.setData(com.netease.yunxin.kit.conversationkit.ui.R.drawable.ic_group_defaulthead, s.getTeamInfo().getName()); + } else { + imageView.setData( + s.getTeamInfo().getIcon(), s.getTeamInfo().getName(), AvatarColor.avatarColor(s.getTeamInfo().getId())); + } + holder.setText(R.id.title_tv, s.getTeamInfo().getName()); + } else { + NimUserInfo user = NIMClient.getService(UserService.class).getUserInfo(s.getFriendInfo().getAccount()); + if (user != null) { + ColorUtils.loadAvator(user.getAvatar(), imageView); +// imageView.setData( +// user.getAvatar(), user.getName(), AvatarColor.avatarColor(user.getAccount())); + holder.setText(R.id.title_tv, user.getName()); + } + } + + holder.getView(R.id.big_bg).setOnClickListener(v -> { + titleUsersIsCheck.set(index, !titleUsersIsCheck.get(index)); + commonAdapter.notifyItemChanged(index, titleUsersIsCheck.get(index)); + LogUtils.i("0000000000"); + + changeItemButton(); + }); + } + }; + recyclerShare.setAdapter(commonAdapter); + } + + private void changeItemButton() { + LogUtils.i("1111111111111111"); + boolean isSelcet = false; + for (boolean item : titleUsersIsCheck) { + if (item) { + isSelcet = true; + break; + } + } + chagnBottom(isSelcet); + + } + + private void chagnBottom(boolean b) { + LogUtils.i("22222222222:" + b); + + if (b) { + shareBt.setBackground(getResources().getDrawable(R.drawable.button_true_bg)); + shareBt.setEnabled(true); + } else { + shareBt.setBackground(getResources().getDrawable(R.drawable.button_false_bg_new)); + shareBt.setEnabled(false); + + } + } + + /** + * 将2维码保存到系统相册。 + */ + private void doSaveQrcode() { + // 先生成bitmap对象 + Bitmap bmp = DataUtils.generateBitmap(qrcodeLy); + // bitmap对象生成成功 + if (bmp != null) { + // 保存到相册成功 + if (ToolKits.saveBmp2Gallery(HtmlScanKitActivity.this, bmp)) { + ToastX.showShortToast(getString(R.string.qrcode_generate_activity_qr_save_sucess)); + } else { + ToastX.showShortToast(getString(R.string.qrcode_generate_activity_qr_save_fail)); + } + } else { + Log.w("doSaveQrcode", "将2维码保存到相册时失败了,从view生成Bitmap对象失败,生成后的bmp=null!"); + ToastX.showShortToast(getString(R.string.qrcode_generate_activity_qr_generate_fail)); + } + } + + + /** + * 将2维码保存到系统相册。 + */ + private void doSaveQrcodeShare(BottomSheetDialog bottomSheetDialog) { + // 先生成bitmap对象 + Bitmap bmp = DataUtils.generateBitmap(qrcodeLy); + // bitmap对象生成成功 + if (bmp != null) { + // 保存到相册成功 + + Uri fileUri = ToolKits.saveBmp2GalleryShare(HtmlScanKitActivity.this, bmp); + if (fileUri != null) { +// ToastX.showShortToast(getString(R.string.qrcode_generate_activity_qr_save_sucess)); + sendMessage(fileUri); + } else { + ToastX.showShortToast(getString(R.string.qrcode_generate_activity_qr_save_fail)); + } + } else { + Log.w("doSaveQrcode", "将2维码保存到相册时失败了,从view生成Bitmap对象失败,生成后的bmp=null!"); + ToastX.showShortToast(getString(R.string.qrcode_generate_activity_qr_generate_fail)); + } + bottomSheetDialog.dismiss(); + } + + Handler mHandler = new Handler(); + + private void sendMessage(Uri uri) { + mHandler.postDelayed(() -> { + File imageFile = UriUtils.uri2File(uri); + + for (int i = 0; i < titleUsersIsCheck.size(); i++) { + if (titleUsersIsCheck.get(i)) { + toShareMessage(titleUsers.get(i), imageFile); + } + } + + }, 100); + } + + private void toShareMessage(UserShareBean conversationInfo, File imageFile) { + IMMessage imageMsg = null; + if (conversationInfo.getTeamInfo() != null) { + imageMsg = MessageBuilder.createImageMessage(conversationInfo.getTeamInfo().getId(), SessionTypeEnum.Team, imageFile); + } else if (conversationInfo.getFriendInfo() != null) { + imageMsg = MessageBuilder.createImageMessage(conversationInfo.getFriendInfo().getAccount(), SessionTypeEnum.P2P, imageFile); + } + if (imageMsg != null) { + ChatRepo.sendMessage( + imageMsg, + false, + new FetchCallbackImpl() { + @Override + public void onSuccess(@Nullable Void param) { + super.onSuccess(param); + ToastX.showShortToast(R.string.qrcode_share_succ_txt); + } + + @Override + public void onFailed(int code) { + + } + }); + } + } +} diff --git a/app/src/main/java/com/huawei/hms/hmsscankit/MyScanKitActivity.java b/app/src/main/java/com/huawei/hms/hmsscankit/MyScanKitActivity.java new file mode 100644 index 0000000..722f98f --- /dev/null +++ b/app/src/main/java/com/huawei/hms/hmsscankit/MyScanKitActivity.java @@ -0,0 +1,482 @@ +package com.huawei.hms.hmsscankit; + +import android.Manifest; +import android.graphics.Bitmap; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.text.TextUtils; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.dskj.rbchat.IMUIKitConfig; +import com.dskj.rbchat.R; +import com.dskj.rbchat.adapter.CommonAdapter; +import com.dskj.rbchat.adapter.ViewHolder; +import com.dskj.rbchat.model.LoginBean; +import com.dskj.rbchat.model.UserShareBean; +import com.dskj.rbchat.utils.AdaptScreenUtils; +import com.dskj.rbchat.utils.DataUtils; +import com.dskj.rbchat.utils.GsonUtils; +import com.dskj.rbchat.utils.LogUtils; +import com.dskj.rbchat.utils.ShareDateUtils; +import com.dskj.rbchat.utils.ToolKits; +import com.google.android.material.bottomsheet.BottomSheetDialog; +import com.king.zxing.util.CodeUtils; +import com.netease.nimlib.sdk.NIMClient; +import com.netease.nimlib.sdk.msg.MessageBuilder; +import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; +import com.netease.nimlib.sdk.msg.model.IMMessage; +import com.netease.nimlib.sdk.uinfo.UserService; +import com.netease.nimlib.sdk.uinfo.model.NimUserInfo; +import com.netease.yunxin.kit.chatkit.repo.ChatRepo; +import com.netease.yunxin.kit.common.ui.utils.AvatarColor; +import com.netease.yunxin.kit.common.ui.utils.Permission; +import com.netease.yunxin.kit.common.ui.utils.ToastX; +import com.netease.yunxin.kit.common.ui.widgets.ContactAvatarView; +import com.netease.yunxin.kit.common.utils.PermissionUtils; +import com.netease.yunxin.kit.common.utils.UriUtils; +import com.netease.yunxin.kit.contactkit.ui.utils.ColorUtils; +import com.netease.yunxin.kit.corekit.im.IMKitClient; +import com.netease.yunxin.kit.corekit.im.provider.FetchCallbackImpl; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +public class MyScanKitActivity extends ScanKitActivity { + private ShareDateUtils shareDateUtils; + LoginBean loginBean; + + @Override + protected void onCreate(Bundle bundle) { + super.onCreate(bundle); + loginBean = DataUtils.getLocUserInfo(); + + shareDateUtils = new ShareDateUtils(); + shareDateUtils.getAllSessionList(); + showView(); + } + + private void showView() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + if (PermissionUtils.hasPermissions( + MyScanKitActivity.this, Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO)) { + findViewById(R.id.img_btn).setVisibility(View.VISIBLE); + + } else{ + findViewById(R.id.img_btn).setVisibility(View.GONE); + } + } else { + if (PermissionUtils.hasPermissions( + MyScanKitActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE)) { + findViewById(R.id.img_btn).setVisibility(View.VISIBLE); + } else{ + findViewById(R.id.img_btn).setVisibility(View.GONE); + } + } + } + + public void showQrcode(View view) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + showQrcodeView(); + } + } + + + private ImageView coloseIv; + private LinearLayout qrcodeLy; + private ImageView qrcodeIv; + private TextView qrcodeTipsTv; + private LinearLayout qrcodeActionLy; + private TextView copyTv; + private TextView shareTv; + private TextView saveTv; + private TextView shuaxinTv; + + @RequiresApi(api = Build.VERSION_CODES.M) + private void showQrcodeView() { + BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(this, R.style.BottomSheetDialog); + + View bottomView = LayoutInflater.from(MyScanKitActivity.this).inflate(R.layout.bottom_sheet_qrcode_layout, null); + + coloseIv = (ImageView) bottomView.findViewById(R.id.colose_iv); + qrcodeLy = (LinearLayout) bottomView.findViewById(R.id.qrcode_ly); + qrcodeIv = (ImageView) bottomView.findViewById(R.id.qrcode_iv); + qrcodeTipsTv = (TextView) bottomView.findViewById(R.id.qrcode_tips_tv); + qrcodeActionLy = (LinearLayout) bottomView.findViewById(R.id.qrcode_action_ly); + copyTv = (TextView) bottomView.findViewById(R.id.copy_tv); + shareTv = (TextView) bottomView.findViewById(R.id.share_tv); + saveTv = (TextView) bottomView.findViewById(R.id.save_tv); + shuaxinTv = (TextView) bottomView.findViewById(R.id.shuaxin_tv); + LoginBean loginBean = DataUtils.getLocUserInfo(); + Bitmap bitmap = CodeUtils.createQRCode(String.format(IMUIKitConfig.SHARE_INVCODE1, IMKitClient.account()), DataUtils.dip2px(this, 175.0f), null); + if(loginBean!=null){ + bitmap = CodeUtils.createQRCode(String.format(IMUIKitConfig.SHARE_ADD_USER,loginBean.getUser().getInviteCode(), IMKitClient.account()), DataUtils.dip2px(this, 175.0f), null); + } + if (bitmap != null) { + qrcodeIv.setImageBitmap(bitmap); + } + + shuaxinTv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + ToastX.showShortToast(R.string.shuaxinchenggong_txt); + } + }); + + coloseIv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + bottomSheetDialog.dismiss(); + } + }); + + saveTv.setOnClickListener(v -> { + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + if (PermissionUtils.hasPermissions( + MyScanKitActivity.this, Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO)) { + findViewById(R.id.img_btn).setVisibility(View.VISIBLE); + + doSaveQrcode(); + } else { + requestCameraPermission( + ); + } +// doSaveQrcode(); + } else { + if (PermissionUtils.hasPermissions( + MyScanKitActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE)) { + findViewById(R.id.img_btn).setVisibility(View.VISIBLE); + + doSaveQrcode(); + } else { + requestCameraPermission( + Manifest.permission.READ_EXTERNAL_STORAGE); + } + } + }); + + shareTv.setOnClickListener(v -> { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + if (PermissionUtils.hasPermissions( + MyScanKitActivity.this, Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO)) { + findViewById(R.id.img_btn).setVisibility(View.VISIBLE); + + showBottomShare(); + } else { + requestCameraPermission( + ); + } + } else { + if (PermissionUtils.hasPermissions( + MyScanKitActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE)) { + findViewById(R.id.img_btn).setVisibility(View.VISIBLE); + + showBottomShare(); + } else { + requestCameraPermission( + Manifest.permission.READ_EXTERNAL_STORAGE); + } + } + }); + + copyTv.setOnClickListener(v -> { + if (loginBean != null) { + LogUtils.i("数据是啥:" + GsonUtils.beanToJSONString(loginBean)); + String url = String.format(IMUIKitConfig.SHARE_INVCODE, loginBean.getUser().getInviteCode(), IMKitClient.account()); + DataUtils.copy(url, MyScanKitActivity.this); + ToastX.showShortToast(R.string.fuzhichenggong_txt); + } + }); + + bottomSheetDialog.setContentView(bottomView); + bottomSheetDialog.show(); + + bottomSheetDialog.setOnDismissListener(dialog -> getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white))); + AdaptScreenUtils.setWhiteNavigationBar(bottomSheetDialog); + + } + + + private void requestCameraPermission(String permission) { + + Permission.requirePermissions(IMKitClient.getApplicationContext(), new String[]{permission}) + .request( + new Permission.PermissionCallback() { + @Override + public void onGranted(List permissionsGranted) { + } + + @Override + public void onDenial( + List permissionsDenial, List permissionDenialForever) { + Toast.makeText(MyScanKitActivity.this, com.netease.yunxin.kit.chatkit.ui.R.string.permission_default, Toast.LENGTH_SHORT) + .show(); + } + + @Override + public void onException(Exception exception) { + Toast.makeText(MyScanKitActivity.this, com.netease.yunxin.kit.chatkit.ui.R.string.permission_default, Toast.LENGTH_SHORT) + .show(); + } + }); + } + + + private void requestCameraPermission() { + Permission.requirePermissions(IMKitClient.getApplicationContext(), new String[]{Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO}) + .request( + new Permission.PermissionCallback() { + @Override + public void onGranted(List permissionsGranted) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + showBottomShare(); + } + } + + @Override + public void onDenial( + List permissionsDenial, List permissionDenialForever) { + Toast.makeText(MyScanKitActivity.this, com.netease.yunxin.kit.chatkit.ui.R.string.permission_default, Toast.LENGTH_SHORT) + .show(); + } + + @Override + public void onException(Exception exception) { + Toast.makeText(MyScanKitActivity.this, com.netease.yunxin.kit.chatkit.ui.R.string.permission_default, Toast.LENGTH_SHORT) + .show(); + } + }); + } + + @RequiresApi(api = Build.VERSION_CODES.M) + public void showBottomShare() { + findViewById(R.id.img_btn).setVisibility(View.VISIBLE); + + titleUsers = shareDateUtils.getConverstionShareInfo(); + titleUsersIsCheck = new ArrayList<>(); + for (UserShareBean conversationInfo : titleUsers) { + titleUsersIsCheck.add(false); + } + if (titleUsers == null || titleUsers.size() == 0) { + ToastX.showShortToast(R.string.mykfxfddx_txt); + return; + } + BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(this, R.style.BottomSheetDialog); + + View bottomView = LayoutInflater.from(MyScanKitActivity.this).inflate(R.layout.bottom_sheet_layout, null); + + + coloseIvShare = (ImageView) bottomView.findViewById(R.id.colose_iv); + recyclerShare = (RecyclerView) bottomView.findViewById(R.id.recycler); + commentEtShare = (EditText) bottomView.findViewById(R.id.comment_et); + + shareBt = (TextView) bottomView.findViewById(R.id.share_bt); + initList(); + bottomSheetDialog.setContentView(bottomView); + bottomSheetDialog.show(); + coloseIvShare.setOnClickListener(v -> bottomSheetDialog.dismiss()); + shareBt.setOnClickListener(v -> { + + boolean isSelect = false; + for (Boolean type : titleUsersIsCheck) { + if (type) { + isSelect = true; + } + } + if (!isSelect) { + ToastX.showShortToast(getString(R.string.qxxzyfxddx_txt)); + return; + } + doSaveQrcodeShare(bottomSheetDialog); + }); + + + bottomSheetDialog.setOnDismissListener(dialog -> getWindow().setNavigationBarColor(getResources().getColor(R.color.color_white))); + AdaptScreenUtils.setWhiteNavigationBar(bottomSheetDialog); + } + + private ImageView coloseIvShare; + private RecyclerView recyclerShare; + private EditText commentEtShare; + private TextView shareBt; + private LinearLayoutManager linearLayoutManager; + private CommonAdapter commonAdapter; + private ArrayList titleUsers; + private ArrayList titleUsersIsCheck; + + private void initList() { + + linearLayoutManager = new LinearLayoutManager(MyScanKitActivity.this); + linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); + recyclerShare.setLayoutManager(linearLayoutManager); + commonAdapter = new CommonAdapter<>(MyScanKitActivity.this, R.layout.item_share_list, titleUsers) { + @Override + public void convert(ViewHolder holder, UserShareBean s, int index) { + ImageView select_iv = holder.getView(R.id.select_iv); + if (titleUsersIsCheck.get(index)) { + select_iv.setImageResource(R.mipmap.dialog_item_gou); + } else { + select_iv.setImageResource(R.mipmap.dialog_item_quan); + } + + ContactAvatarView imageView = holder.getView(R.id.logo_iv); + + if (s.getTeamInfo() != null) { + if (TextUtils.isEmpty(s.getTeamInfo().getIcon())) { + imageView.setData(com.netease.yunxin.kit.conversationkit.ui.R.drawable.ic_group_defaulthead, s.getTeamInfo().getName()); + } else { + imageView.setData( + s.getTeamInfo().getIcon(), s.getTeamInfo().getName(), AvatarColor.avatarColor(s.getTeamInfo().getId())); + } + holder.setText(R.id.title_tv, s.getTeamInfo().getName()); + } else { + NimUserInfo user = NIMClient.getService(UserService.class).getUserInfo(s.getFriendInfo().getAccount()); + if (user != null) { + ColorUtils.loadAvator(user.getAvatar(), imageView); +// imageView.setData( +// user.getAvatar(), user.getName(), AvatarColor.avatarColor(user.getAccount())); + holder.setText(R.id.title_tv, user.getName()); + } + } + + holder.getView(R.id.big_bg).setOnClickListener(v -> { + titleUsersIsCheck.set(index, !titleUsersIsCheck.get(index)); + commonAdapter.notifyItemChanged(index, titleUsersIsCheck.get(index)); + LogUtils.i("0000000000"); + + changeItemButton(); + }); + } + }; + recyclerShare.setAdapter(commonAdapter); + } + + private void changeItemButton() { + LogUtils.i("1111111111111111"); + boolean isSelcet = false; + for (boolean item : titleUsersIsCheck) { + if (item) { + isSelcet = true; + break; + } + } + chagnBottom(isSelcet); + + } + + private void chagnBottom(boolean b) { + LogUtils.i("22222222222:" + b); + + if (b) { + shareBt.setBackground(getResources().getDrawable(R.drawable.button_true_bg)); + shareBt.setEnabled(true); + } else { + shareBt.setBackground(getResources().getDrawable(R.drawable.button_false_bg_new)); + shareBt.setEnabled(false); + + } + } + + /** + * 将2维码保存到系统相册。 + */ + private void doSaveQrcode() { + // 先生成bitmap对象 + Bitmap bmp = DataUtils.generateBitmap(qrcodeLy); + // bitmap对象生成成功 + if (bmp != null) { + // 保存到相册成功 + if (ToolKits.saveBmp2Gallery(MyScanKitActivity.this, bmp)) { + ToastX.showShortToast(getString(R.string.qrcode_generate_activity_qr_save_sucess)); + } else { + ToastX.showShortToast(getString(R.string.qrcode_generate_activity_qr_save_fail)); + } + } else { + Log.w("doSaveQrcode", "将2维码保存到相册时失败了,从view生成Bitmap对象失败,生成后的bmp=null!"); + ToastX.showShortToast(getString(R.string.qrcode_generate_activity_qr_generate_fail)); + } + } + + + /** + * 将2维码保存到系统相册。 + */ + private void doSaveQrcodeShare(BottomSheetDialog bottomSheetDialog) { + // 先生成bitmap对象 + Bitmap bmp = DataUtils.generateBitmap(qrcodeLy); + // bitmap对象生成成功 + if (bmp != null) { + // 保存到相册成功 + + Uri fileUri = ToolKits.saveBmp2GalleryShare(MyScanKitActivity.this, bmp); + if (fileUri != null) { +// ToastX.showShortToast(getString(R.string.qrcode_generate_activity_qr_save_sucess)); + sendMessage(fileUri); + } else { + ToastX.showShortToast(getString(R.string.qrcode_generate_activity_qr_save_fail)); + } + } else { + Log.w("doSaveQrcode", "将2维码保存到相册时失败了,从view生成Bitmap对象失败,生成后的bmp=null!"); + ToastX.showShortToast(getString(R.string.qrcode_generate_activity_qr_generate_fail)); + } + bottomSheetDialog.dismiss(); + } + + Handler mHandler = new Handler(); + + private void sendMessage(Uri uri) { + mHandler.postDelayed(() -> { + File imageFile = UriUtils.uri2File(uri); + + for (int i = 0; i < titleUsersIsCheck.size(); i++) { + if (titleUsersIsCheck.get(i)) { + toShareMessage(titleUsers.get(i), imageFile); + } + } + + }, 100); + } + + private void toShareMessage(UserShareBean conversationInfo, File imageFile) { + IMMessage imageMsg = null; + if (conversationInfo.getTeamInfo() != null) { + imageMsg = MessageBuilder.createImageMessage(conversationInfo.getTeamInfo().getId(), SessionTypeEnum.Team, imageFile); + } else if (conversationInfo.getFriendInfo() != null) { + imageMsg = MessageBuilder.createImageMessage(conversationInfo.getFriendInfo().getAccount(), SessionTypeEnum.P2P, imageFile); + } + if (imageMsg != null) { + ChatRepo.sendMessage( + imageMsg, + false, + new FetchCallbackImpl() { + @Override + public void onSuccess(@Nullable Void param) { + super.onSuccess(param); + ToastX.showShortToast(R.string.qrcode_share_succ_txt); + } + + @Override + public void onFailed(int code) { + + } + }); + } + } +} diff --git a/app/src/main/java/com/huawei/hms/hmsscankit/ScanUtilHtml.java b/app/src/main/java/com/huawei/hms/hmsscankit/ScanUtilHtml.java new file mode 100644 index 0000000..0825613 --- /dev/null +++ b/app/src/main/java/com/huawei/hms/hmsscankit/ScanUtilHtml.java @@ -0,0 +1,428 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package com.huawei.hms.hmsscankit; + +import android.annotation.SuppressLint; +import android.app.Activity; +import android.app.ActivityManager; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.graphics.Bitmap; +import android.graphics.Bitmap.Config; +import android.graphics.BitmapFactory; +import android.graphics.Rect; +import android.net.Uri; +import android.os.Build.VERSION; +import android.os.ParcelFileDescriptor; +import android.text.TextUtils; +import android.util.Log; + +import com.huawei.hms.feature.dynamic.DynamicModule; +import com.huawei.hms.ml.scan.HmsBuildBitmapOption; +import com.huawei.hms.ml.scan.HmsScan; +import com.huawei.hms.ml.scan.HmsScanAnalyzerOptions; +import com.huawei.hms.ml.scan.HmsScanFrame; +import com.huawei.hms.ml.scan.HmsScanFrameOptions; +import com.huawei.hms.ml.scan.HmsScanResult; +import com.huawei.hms.mlsdk.common.MLFrame; +import com.huawei.hms.scankit.p.c5; +import com.huawei.hms.scankit.p.o4; +import com.huawei.hms.scankit.p.w7; + +import java.io.FileNotFoundException; +import java.io.IOException; + +public class ScanUtilHtml { + public static final int SUCCESS = 0; + public static final int ERROR_NO_CAMERA_PERMISSION = 1; + public static final int ERROR_NO_READ_PERMISSION = 2; + public static final int ERROR_ABNORMAL_RESTART = 3; + public static final int ERROR_INVALID_PARAM = 4; + public static final int CAMERA_INIT_ERROR = -1000; + private static final int MAX_BITMAP_SIZE = 52428800; + static final String MODULE_SCANKIT = "huawei_module_scankit"; + static final String MODULE_SCANKIT_LOCAL = "huawei_module_scankit_local"; + static final String CREATOR_PATH = "com.huawei.hms.scankit.Creator"; + static final String CONTEXT_PATH = "com.huawei.hms.feature.DynamicModuleInitializer"; + static final String CONTEXT_METHOD = "initializeModule"; + public static final String RESULT = "SCAN_RESULT"; + public static final String RESULT_CODE = "SCAN_RESULT_CODE"; + public static final int SCAN_NO_DETECTED = 4096; + private static final int NEW_VERSION = 21002300; + private static final int WR_VERSION = 201000300; + private static final int LITE_VERSION = 10320300; + + public ScanUtilHtml() { + } + + public static int startScan(Activity var0, int var1, HmsScanAnalyzerOptions var2) { + Activity var10000 = var0; + o4.d("ScanUtil", "startScan before"); + int var3 = 28; + + label36: { + int var8; + try { + var8 = var10000.getPackageManager().getPackageInfo(var0.getPackageName(), 16384).applicationInfo.targetSdkVersion; + } catch (PackageManager.NameNotFoundException var4) { + o4.b("exception", "NameNotFoundException"); + break label36; + } catch (RuntimeException var5) { + o4.b("exception", "RuntimeException"); + break label36; + } + + var3 = var8; + } + + boolean var6 = selfPermissionGranted(var0, var3, "android.permission.CAMERA"); + if (!w7.c) { + o4.d("ScanUtil", "startScan failed"); + return 3; + } else if (!var6 && (var2 == null || !var2.showGuide)) { + return 1; + } else { + Intent var7; + var7 = new Intent(var0, HtmlScanKitActivity.class); + if (var2 != null) { + var7.putExtra("ScanFormatValue", var2.mode); + var7.putExtra("ScanViewValue", var2.viewType); + var7.putExtra("ScanErrorCheck", var2.errorCheck); + var7.putExtra("ScanGuide", var2.showGuide); + } + + o4.d("ScanUtil", "startScan success"); + w7.c = false; + var0.startActivityForResult(var7, var1); + return 0; + } + } + + public static HmsScanResult decode(Context var0, HmsScanFrame var1, HmsScanFrameOptions var2) { + if (var1 != null && (var1.getYuvImage() != null || var1.getBitmap() != null)) { + o4.d("Scankit", "frame height " + var1.getHeight() + " width " + var1.getWidth()); + if (var1.getHeight() * var1.getHeight() <= 52428800 && var1.getHeight() * var1.getHeight() != 0) { + label86: { + label100: { + int var10000; + boolean var10001; + try { + var10000 = g.d; + } catch (Exception var7) { + var10001 = false; + break label100; + } + + if (var10000 == Integer.MIN_VALUE) { + try { + g.d = g.a(var0); + } catch (Exception var6) { + var10001 = false; + break label100; + } + } + + try { + var10000 = g.e; + } catch (Exception var5) { + var10001 = false; + break label100; + } + + if (var10000 != Integer.MIN_VALUE) { + break label86; + } + + try { + g.e = DynamicModule.getRemoteVersion(var0.getApplicationContext(), "huawei_module_scankit"); + break label86; + } catch (Exception var4) { + var10001 = false; + } + } + + o4.b("Scankit", "get remote version failed"); + } + + if (var2 != null && var2.isMultiMode()) { + HmsScan[] var9; + if ((var9 = b.a(var0, var1, (new HmsScanAnalyzerOptions.Creator()).setHmsScanTypes(var2.getType(), new int[0]).setPhotoMode(var2.isPhotoMode()).setParseResult(var2.isParseResult()).create())).length == 0) { + return new HmsScanResult(4096, var9); + } else if (var9.length == 1 && var9[0].getZoomValue() > 1.0 && TextUtils.isEmpty(var9[0].getOriginalValue())) { + return new HmsScanResult(4098, var9); + } else { + return var9.length >= 1 && !TextUtils.isEmpty(var9[0].getOriginalValue()) ? new HmsScanResult(0, var9) : new HmsScanResult(4096, var9); + } + } else { + HmsScanAnalyzerOptions var3; + if (var2 == null) { + var3 = (new HmsScanAnalyzerOptions.Creator()).create(); + } else { + var3 = (new HmsScanAnalyzerOptions.Creator()).setHmsScanTypes(var2.getType(), new int[0]).setPhotoMode(var2.isPhotoMode()).setParseResult(var2.isParseResult()).create(); + } + + if (var1.getBitmap() != null) { + return checkHmsScan(f.a(var0, var1.getBitmap(), var3), var2); + } else if (var1.getYuvImage() != null) { + Log.i("scankit", "local version " + g.d + " remote version" + g.e); + if (checkVersion(g.d, g.e)) { + return f.a(var0, var1, var3); + } else { + Context var10 = var0; + byte[] var11 = var1.getYuvImage().getYuvData(); + int var8 = var1.getYuvImage().getWidth(); + return f.a(var10, var11, var8, var1.getYuvImage().getHeight(), var3); + } + } else { + return new HmsScanResult(4, new HmsScan[0]); + } + } + } else { + o4.e("ScanUtil", "input image is invalid:" + var1.getWidth() + " " + var1.getHeight()); + return new HmsScanResult(4, new HmsScan[0]); + } + } else { + return new HmsScanResult(4, new HmsScan[0]); + } + } + + public static HmsScan[] decodeWithBitmap(Context var0, Bitmap var1, HmsScanAnalyzerOptions var2) { + if (var1 != null && var1.getWidth() * var1.getHeight() <= 52428800) { + return f.a(var0, var1, var2); + } else { + if (var1 != null) { + o4.e("ScanUtil", "input image is too large:" + var1.getWidth()); + } + + return new HmsScan[0]; + } + } + + public static HmsScan[] detectForHmsDector(Context var0, MLFrame var1, HmsScanAnalyzerOptions var2) { + return b.a(var0, var1, var2); + } + + public static boolean isScanAvailable(Context var0) { + return true; + } + + @SuppressLint("WrongConstant") + public static boolean selfPermissionGranted(Context var0, int var1, String var2) { + boolean var3 = true; + if (VERSION.SDK_INT >= 23) { + boolean var4; + label28: { + if (var1 >= 23) { + if (w7.a(var2) == null) { + return true; + } + + if (var0.checkSelfPermission(var2) == 0) { + break label28; + } + } else if (w7.a(var0, var2) == 0) { + break label28; + } + + var4 = false; + var3 = var4; + return var3; + } + + var4 = true; + var3 = var4; + } + + return var3; + } + + public static Bitmap compressBitmap(Context var0, String var1) { + Context var10001 = var0; + BitmapFactory.Options var2; + BitmapFactory.Options var10003 = var2 = new BitmapFactory.Options(); +// var10003.(); + var10003.inJustDecodeBounds = true; + BitmapFactory.decodeFile(var1, var10003); + dealBitmapFactoryOption(var10001, var2); + return BitmapFactory.decodeFile(var1, var2); + } + + @SuppressLint("WrongConstant") + private static void dealBitmapFactoryOption(Context var0, BitmapFactory.Options var1) { + int var2; + int var10000 = var2 = var1.outWidth; + int var3 = var1.outHeight; + if (var10000 != 0 && var3 != 0) { + if (var2 > var3) { + var2 = var3; + } + + boolean var15 = true; + if (VERSION.SDK_INT >= 23) { + label61: { + double var4; + long var19; + label60: { + label59: { + label69: { + ActivityManager var17; + boolean var10001; + ActivityManager.MemoryInfo var20; + try { + var17 = (ActivityManager)var0.getSystemService("activity"); + var20 = new ActivityManager.MemoryInfo(); + } catch (NullPointerException var10) { + var10001 = false; + break label59; + } catch (Exception var11) { + var10001 = false; + break label69; + } + + ActivityManager.MemoryInfo var12; + ActivityManager.MemoryInfo var10002 = var12 = var20; + + ActivityManager.MemoryInfo var18; + double var21; + try { + var10002 = new ActivityManager.MemoryInfo(); + var17.getMemoryInfo(var20); + var18 = var12; + var21 = Math.pow(1024.0, 3.0); + } catch (NullPointerException var8) { + var10001 = false; + break label59; + } catch (Exception var9) { + var10001 = false; + break label69; + } + + var4 = var21; + + try { + var19 = var18.totalMem; + break label60; + } catch (NullPointerException var6) { + var10001 = false; + break label59; + } catch (Exception var7) { + var10001 = false; + } + } + + o4.b("exception", "Exception"); + break label61; + } + + o4.b("exception", "NullPointerException"); + break label61; + } + + boolean var13; + if ((double)var19 / var4 < 5.5) { + var13 = true; + var15 = var13; + } else { + var13 = false; + var15 = var13; + } + } + } + + int var14 = 1; + short var16; + if (var15) { + var16 = 1200; + } else { + var16 = 3000; + } + + if (var2 > var16) { + var14 = Math.round((float)var2 / (float)var16); + } + + var1.inSampleSize = var14; + var1.inJustDecodeBounds = false; + var1.inPreferredConfig = Config.ARGB_8888; + var1.inPurgeable = true; + var1.inInputShareable = true; + } + } + + public static Bitmap buildBitmap(String var0, int var1, int var2, int var3, HmsBuildBitmapOption var4) throws WriterException { + return (new c5()).a(var0, var1, var2, var3, var4); + } + + + private static Bitmap getBitmapFromUri(Context var0, Uri var1, BitmapFactory.Options var2) { + if (var1 == null) { + o4.a("ScanBitmap", "uri == null"); + return null; + } else { + label53: { + label54: { + label44: { + ParcelFileDescriptor var10000; + boolean var10001; + try { + var10000 = var0.getContentResolver().openFileDescriptor(var1, "r"); + } catch (FileNotFoundException var6) { + var10001 = false; + break label44; + } catch (Exception var8) { + var10001 = false; + break label54; + } + + ParcelFileDescriptor var9 = var10000; + + try { + Bitmap var10 = BitmapFactory.decodeFileDescriptor(var10000.getFileDescriptor(), (Rect)null, var2); + var9.close(); + return var10; + } catch (FileNotFoundException var3) { + var10001 = false; + } catch (IOException var4) { + var10001 = false; + break label53; + } catch (Exception var5) { + var10001 = false; + break label54; + } + } + + o4.b("exception", "FileNotFoundException"); + return null; + } + + o4.b("exception", "Exception"); + return null; + } + + o4.b("exception", "IOException"); + return null; + } + } + + private static HmsScanResult checkHmsScan(HmsScan[] var0, HmsScanFrameOptions var1) { + if (var0.length == 0) { + return new HmsScanResult(4096, (HmsScan[])null); + } else if (var0[0].getOriginalValue() == "" && var0[0].getZoomValue() > 1.0) { + return new HmsScanResult(4098, var0); + } else { + return var0[0].getOriginalValue() != "" ? new HmsScanResult(0, var0) : new HmsScanResult(4096, var0); + } + } + + private static boolean checkVersion(int var0, int var1) { + if (var0 != 10320300 || var1 >= 21002300 && var1 != 201000300) { + return var0 != 10320300 && (var0 < 21002300 || var1 == 201000300 || var1 < 21002300); + } else { + return true; + } + } +} diff --git a/app/src/main/java/com/huawei/hms/hmsscankit/ScanUtilNew.java b/app/src/main/java/com/huawei/hms/hmsscankit/ScanUtilNew.java new file mode 100644 index 0000000..19f5508 --- /dev/null +++ b/app/src/main/java/com/huawei/hms/hmsscankit/ScanUtilNew.java @@ -0,0 +1,427 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package com.huawei.hms.hmsscankit; + +import android.annotation.SuppressLint; +import android.app.Activity; +import android.app.ActivityManager; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Rect; +import android.graphics.Bitmap.Config; +import android.net.Uri; +import android.os.ParcelFileDescriptor; +import android.os.Build.VERSION; +import android.text.TextUtils; +import android.util.Log; + +import com.huawei.hms.feature.dynamic.DynamicModule; +import com.huawei.hms.ml.scan.HmsBuildBitmapOption; +import com.huawei.hms.ml.scan.HmsScan; +import com.huawei.hms.ml.scan.HmsScanAnalyzerOptions; +import com.huawei.hms.ml.scan.HmsScanFrame; +import com.huawei.hms.ml.scan.HmsScanFrameOptions; +import com.huawei.hms.ml.scan.HmsScanResult; +import com.huawei.hms.mlsdk.common.MLFrame; +import com.huawei.hms.scankit.p.c5; +import com.huawei.hms.scankit.p.o4; +import com.huawei.hms.scankit.p.w7; +import java.io.FileNotFoundException; +import java.io.IOException; + +public class ScanUtilNew { + public static final int SUCCESS = 0; + public static final int ERROR_NO_CAMERA_PERMISSION = 1; + public static final int ERROR_NO_READ_PERMISSION = 2; + public static final int ERROR_ABNORMAL_RESTART = 3; + public static final int ERROR_INVALID_PARAM = 4; + public static final int CAMERA_INIT_ERROR = -1000; + private static final int MAX_BITMAP_SIZE = 52428800; + static final String MODULE_SCANKIT = "huawei_module_scankit"; + static final String MODULE_SCANKIT_LOCAL = "huawei_module_scankit_local"; + static final String CREATOR_PATH = "com.huawei.hms.scankit.Creator"; + static final String CONTEXT_PATH = "com.huawei.hms.feature.DynamicModuleInitializer"; + static final String CONTEXT_METHOD = "initializeModule"; + public static final String RESULT = "SCAN_RESULT"; + public static final String RESULT_CODE = "SCAN_RESULT_CODE"; + public static final int SCAN_NO_DETECTED = 4096; + private static final int NEW_VERSION = 21002300; + private static final int WR_VERSION = 201000300; + private static final int LITE_VERSION = 10320300; + + public ScanUtilNew() { + } + + public static int startScan(Activity var0, int var1, HmsScanAnalyzerOptions var2) { + Activity var10000 = var0; + o4.d("ScanUtil", "startScan before"); + int var3 = 28; + + label36: { + int var8; + try { + var8 = var10000.getPackageManager().getPackageInfo(var0.getPackageName(), 16384).applicationInfo.targetSdkVersion; + } catch (PackageManager.NameNotFoundException var4) { + o4.b("exception", "NameNotFoundException"); + break label36; + } catch (RuntimeException var5) { + o4.b("exception", "RuntimeException"); + break label36; + } + + var3 = var8; + } + + boolean var6 = selfPermissionGranted(var0, var3, "android.permission.CAMERA"); + if (!w7.c) { + o4.d("ScanUtil", "startScan failed"); + return 3; + } else if (!var6 && (var2 == null || !var2.showGuide)) { + return 1; + } else { + Intent var7; + var7 = new Intent(var0, MyScanKitActivity.class); + if (var2 != null) { + var7.putExtra("ScanFormatValue", var2.mode); + var7.putExtra("ScanViewValue", var2.viewType); + var7.putExtra("ScanErrorCheck", var2.errorCheck); + var7.putExtra("ScanGuide", var2.showGuide); + } + + o4.d("ScanUtil", "startScan success"); + w7.c = false; + var0.startActivityForResult(var7, var1); + return 0; + } + } + + public static HmsScanResult decode(Context var0, HmsScanFrame var1, HmsScanFrameOptions var2) { + if (var1 != null && (var1.getYuvImage() != null || var1.getBitmap() != null)) { + o4.d("Scankit", "frame height " + var1.getHeight() + " width " + var1.getWidth()); + if (var1.getHeight() * var1.getHeight() <= 52428800 && var1.getHeight() * var1.getHeight() != 0) { + label86: { + label100: { + int var10000; + boolean var10001; + try { + var10000 = g.d; + } catch (Exception var7) { + var10001 = false; + break label100; + } + + if (var10000 == Integer.MIN_VALUE) { + try { + g.d = g.a(var0); + } catch (Exception var6) { + var10001 = false; + break label100; + } + } + + try { + var10000 = g.e; + } catch (Exception var5) { + var10001 = false; + break label100; + } + + if (var10000 != Integer.MIN_VALUE) { + break label86; + } + + try { + g.e = DynamicModule.getRemoteVersion(var0.getApplicationContext(), "huawei_module_scankit"); + break label86; + } catch (Exception var4) { + var10001 = false; + } + } + + o4.b("Scankit", "get remote version failed"); + } + + if (var2 != null && var2.isMultiMode()) { + HmsScan[] var9; + if ((var9 = b.a(var0, var1, (new HmsScanAnalyzerOptions.Creator()).setHmsScanTypes(var2.getType(), new int[0]).setPhotoMode(var2.isPhotoMode()).setParseResult(var2.isParseResult()).create())).length == 0) { + return new HmsScanResult(4096, var9); + } else if (var9.length == 1 && var9[0].getZoomValue() > 1.0 && TextUtils.isEmpty(var9[0].getOriginalValue())) { + return new HmsScanResult(4098, var9); + } else { + return var9.length >= 1 && !TextUtils.isEmpty(var9[0].getOriginalValue()) ? new HmsScanResult(0, var9) : new HmsScanResult(4096, var9); + } + } else { + HmsScanAnalyzerOptions var3; + if (var2 == null) { + var3 = (new HmsScanAnalyzerOptions.Creator()).create(); + } else { + var3 = (new HmsScanAnalyzerOptions.Creator()).setHmsScanTypes(var2.getType(), new int[0]).setPhotoMode(var2.isPhotoMode()).setParseResult(var2.isParseResult()).create(); + } + + if (var1.getBitmap() != null) { + return checkHmsScan(f.a(var0, var1.getBitmap(), var3), var2); + } else if (var1.getYuvImage() != null) { + Log.i("scankit", "local version " + g.d + " remote version" + g.e); + if (checkVersion(g.d, g.e)) { + return f.a(var0, var1, var3); + } else { + Context var10 = var0; + byte[] var11 = var1.getYuvImage().getYuvData(); + int var8 = var1.getYuvImage().getWidth(); + return f.a(var10, var11, var8, var1.getYuvImage().getHeight(), var3); + } + } else { + return new HmsScanResult(4, new HmsScan[0]); + } + } + } else { + o4.e("ScanUtil", "input image is invalid:" + var1.getWidth() + " " + var1.getHeight()); + return new HmsScanResult(4, new HmsScan[0]); + } + } else { + return new HmsScanResult(4, new HmsScan[0]); + } + } + + public static HmsScan[] decodeWithBitmap(Context var0, Bitmap var1, HmsScanAnalyzerOptions var2) { + if (var1 != null && var1.getWidth() * var1.getHeight() <= 52428800) { + return f.a(var0, var1, var2); + } else { + if (var1 != null) { + o4.e("ScanUtil", "input image is too large:" + var1.getWidth()); + } + + return new HmsScan[0]; + } + } + + public static HmsScan[] detectForHmsDector(Context var0, MLFrame var1, HmsScanAnalyzerOptions var2) { + return b.a(var0, var1, var2); + } + + public static boolean isScanAvailable(Context var0) { + return true; + } + + @SuppressLint("WrongConstant") + public static boolean selfPermissionGranted(Context var0, int var1, String var2) { + boolean var3 = true; + if (VERSION.SDK_INT >= 23) { + boolean var4; + label28: { + if (var1 >= 23) { + if (w7.a(var2) == null) { + return true; + } + + if (var0.checkSelfPermission(var2) == 0) { + break label28; + } + } else if (w7.a(var0, var2) == 0) { + break label28; + } + + var4 = false; + var3 = var4; + return var3; + } + + var4 = true; + var3 = var4; + } + + return var3; + } + + public static Bitmap compressBitmap(Context var0, String var1) { + Context var10001 = var0; + BitmapFactory.Options var2; + BitmapFactory.Options var10003 = var2 = new BitmapFactory.Options(); +// var10003.(); + var10003.inJustDecodeBounds = true; + BitmapFactory.decodeFile(var1, var10003); + dealBitmapFactoryOption(var10001, var2); + return BitmapFactory.decodeFile(var1, var2); + } + + @SuppressLint("WrongConstant") + private static void dealBitmapFactoryOption(Context var0, BitmapFactory.Options var1) { + int var2; + int var10000 = var2 = var1.outWidth; + int var3 = var1.outHeight; + if (var10000 != 0 && var3 != 0) { + if (var2 > var3) { + var2 = var3; + } + + boolean var15 = true; + if (VERSION.SDK_INT >= 23) { + label61: { + double var4; + long var19; + label60: { + label59: { + label69: { + ActivityManager var17; + boolean var10001; + ActivityManager.MemoryInfo var20; + try { + var17 = (ActivityManager)var0.getSystemService("activity"); + var20 = new ActivityManager.MemoryInfo(); + } catch (NullPointerException var10) { + var10001 = false; + break label59; + } catch (Exception var11) { + var10001 = false; + break label69; + } + + ActivityManager.MemoryInfo var12; + ActivityManager.MemoryInfo var10002 = var12 = var20; + + ActivityManager.MemoryInfo var18; + double var21; + try { + var10002 = new ActivityManager.MemoryInfo(); + var17.getMemoryInfo(var20); + var18 = var12; + var21 = Math.pow(1024.0, 3.0); + } catch (NullPointerException var8) { + var10001 = false; + break label59; + } catch (Exception var9) { + var10001 = false; + break label69; + } + + var4 = var21; + + try { + var19 = var18.totalMem; + break label60; + } catch (NullPointerException var6) { + var10001 = false; + break label59; + } catch (Exception var7) { + var10001 = false; + } + } + + o4.b("exception", "Exception"); + break label61; + } + + o4.b("exception", "NullPointerException"); + break label61; + } + + boolean var13; + if ((double)var19 / var4 < 5.5) { + var13 = true; + var15 = var13; + } else { + var13 = false; + var15 = var13; + } + } + } + + int var14 = 1; + short var16; + if (var15) { + var16 = 1200; + } else { + var16 = 3000; + } + + if (var2 > var16) { + var14 = Math.round((float)var2 / (float)var16); + } + + var1.inSampleSize = var14; + var1.inJustDecodeBounds = false; + var1.inPreferredConfig = Config.ARGB_8888; + var1.inPurgeable = true; + var1.inInputShareable = true; + } + } + + public static Bitmap buildBitmap(String var0, int var1, int var2, int var3, HmsBuildBitmapOption var4) throws WriterException { + return (new c5()).a(var0, var1, var2, var3, var4); + } + + + private static Bitmap getBitmapFromUri(Context var0, Uri var1, BitmapFactory.Options var2) { + if (var1 == null) { + o4.a("ScanBitmap", "uri == null"); + return null; + } else { + label53: { + label54: { + label44: { + ParcelFileDescriptor var10000; + boolean var10001; + try { + var10000 = var0.getContentResolver().openFileDescriptor(var1, "r"); + } catch (FileNotFoundException var6) { + var10001 = false; + break label44; + } catch (Exception var8) { + var10001 = false; + break label54; + } + + ParcelFileDescriptor var9 = var10000; + + try { + Bitmap var10 = BitmapFactory.decodeFileDescriptor(var10000.getFileDescriptor(), (Rect)null, var2); + var9.close(); + return var10; + } catch (FileNotFoundException var3) { + var10001 = false; + } catch (IOException var4) { + var10001 = false; + break label53; + } catch (Exception var5) { + var10001 = false; + break label54; + } + } + + o4.b("exception", "FileNotFoundException"); + return null; + } + + o4.b("exception", "Exception"); + return null; + } + + o4.b("exception", "IOException"); + return null; + } + } + + private static HmsScanResult checkHmsScan(HmsScan[] var0, HmsScanFrameOptions var1) { + if (var0.length == 0) { + return new HmsScanResult(4096, (HmsScan[])null); + } else if (var0[0].getOriginalValue() == "" && var0[0].getZoomValue() > 1.0) { + return new HmsScanResult(4098, var0); + } else { + return var0[0].getOriginalValue() != "" ? new HmsScanResult(0, var0) : new HmsScanResult(4096, var0); + } + } + + private static boolean checkVersion(int var0, int var1) { + if (var0 != 10320300 || var1 >= 21002300 && var1 != 201000300) { + return var0 != 10320300 && (var0 < 21002300 || var1 == 201000300 || var1 < 21002300); + } else { + return true; + } + } +} diff --git a/app/src/main/res/anim/in_anim.xml b/app/src/main/res/anim/in_anim.xml new file mode 100644 index 0000000..a98167e --- /dev/null +++ b/app/src/main/res/anim/in_anim.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/out_anim.xml b/app/src/main/res/anim/out_anim.xml new file mode 100644 index 0000000..ec3f1a9 --- /dev/null +++ b/app/src/main/res/anim/out_anim.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/push_bottom_int.xml b/app/src/main/res/anim/push_bottom_int.xml new file mode 100644 index 0000000..5053185 --- /dev/null +++ b/app/src/main/res/anim/push_bottom_int.xml @@ -0,0 +1,7 @@ + + + + diff --git a/app/src/main/res/anim/push_bottom_out.xml b/app/src/main/res/anim/push_bottom_out.xml new file mode 100644 index 0000000..e400042 --- /dev/null +++ b/app/src/main/res/anim/push_bottom_out.xml @@ -0,0 +1,7 @@ + + + + diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..eb6e252 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/add_cir_pic_bg_true.xml b/app/src/main/res/drawable/add_cir_pic_bg_true.xml new file mode 100644 index 0000000..30fbddf --- /dev/null +++ b/app/src/main/res/drawable/add_cir_pic_bg_true.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/app_chat_message_self_bg.xml b/app/src/main/res/drawable/app_chat_message_self_bg.xml new file mode 100644 index 0000000..55248d2 --- /dev/null +++ b/app/src/main/res/drawable/app_chat_message_self_bg.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/app_radio_blue_selector.xml b/app/src/main/res/drawable/app_radio_blue_selector.xml new file mode 100644 index 0000000..a28f1ca --- /dev/null +++ b/app/src/main/res/drawable/app_radio_blue_selector.xml @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/app_radio_button_green_not_selected.xml b/app/src/main/res/drawable/app_radio_button_green_not_selected.xml new file mode 100644 index 0000000..50f21a5 --- /dev/null +++ b/app/src/main/res/drawable/app_radio_button_green_not_selected.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/main/res/drawable/app_radio_button_green_selected.xml b/app/src/main/res/drawable/app_radio_button_green_selected.xml new file mode 100644 index 0000000..47b8f18 --- /dev/null +++ b/app/src/main/res/drawable/app_radio_button_green_selected.xml @@ -0,0 +1,16 @@ + + + + diff --git a/app/src/main/res/drawable/app_radio_button_not_selected.xml b/app/src/main/res/drawable/app_radio_button_not_selected.xml new file mode 100644 index 0000000..6f7206f --- /dev/null +++ b/app/src/main/res/drawable/app_radio_button_not_selected.xml @@ -0,0 +1,17 @@ + + + + + diff --git a/app/src/main/res/drawable/app_radio_button_select.xml b/app/src/main/res/drawable/app_radio_button_select.xml new file mode 100644 index 0000000..19cd581 --- /dev/null +++ b/app/src/main/res/drawable/app_radio_button_select.xml @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/app_radio_button_selected.xml b/app/src/main/res/drawable/app_radio_button_selected.xml new file mode 100644 index 0000000..182ea67 --- /dev/null +++ b/app/src/main/res/drawable/app_radio_button_selected.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable/app_radio_green_selector.xml b/app/src/main/res/drawable/app_radio_green_selector.xml new file mode 100644 index 0000000..acd4619 --- /dev/null +++ b/app/src/main/res/drawable/app_radio_green_selector.xml @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/app_skin_base.xml b/app/src/main/res/drawable/app_skin_base.xml new file mode 100644 index 0000000..b3425e5 --- /dev/null +++ b/app/src/main/res/drawable/app_skin_base.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + diff --git a/app/src/main/res/drawable/app_skin_common.xml b/app/src/main/res/drawable/app_skin_common.xml new file mode 100644 index 0000000..0ca4718 --- /dev/null +++ b/app/src/main/res/drawable/app_skin_common.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + diff --git a/app/src/main/res/drawable/app_white_round_bg.xml b/app/src/main/res/drawable/app_white_round_bg.xml new file mode 100644 index 0000000..f976485 --- /dev/null +++ b/app/src/main/res/drawable/app_white_round_bg.xml @@ -0,0 +1,16 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_chatfm_red_point.xml b/app/src/main/res/drawable/bg_chatfm_red_point.xml new file mode 100644 index 0000000..9970d6c --- /dev/null +++ b/app/src/main/res/drawable/bg_chatfm_red_point.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_d8d8d8_singleunselector.xml b/app/src/main/res/drawable/bg_d8d8d8_singleunselector.xml new file mode 100644 index 0000000..3399269 --- /dev/null +++ b/app/src/main/res/drawable/bg_d8d8d8_singleunselector.xml @@ -0,0 +1,16 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_inputed.xml b/app/src/main/res/drawable/bg_inputed.xml new file mode 100644 index 0000000..36d41f0 --- /dev/null +++ b/app/src/main/res/drawable/bg_inputed.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/bg_inputing.xml b/app/src/main/res/drawable/bg_inputing.xml new file mode 100644 index 0000000..39275f1 --- /dev/null +++ b/app/src/main/res/drawable/bg_inputing.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/bg_login_button.xml b/app/src/main/res/drawable/bg_login_button.xml new file mode 100644 index 0000000..aad485c --- /dev/null +++ b/app/src/main/res/drawable/bg_login_button.xml @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_send_giftredpacket_bg.xml b/app/src/main/res/drawable/bg_send_giftredpacket_bg.xml new file mode 100644 index 0000000..2a5f232 --- /dev/null +++ b/app/src/main/res/drawable/bg_send_giftredpacket_bg.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/bg_shape_red_dot.xml b/app/src/main/res/drawable/bg_shape_red_dot.xml new file mode 100644 index 0000000..f0f245e --- /dev/null +++ b/app/src/main/res/drawable/bg_shape_red_dot.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_topup_btn.xml b/app/src/main/res/drawable/bg_topup_btn.xml new file mode 100644 index 0000000..4cc6860 --- /dev/null +++ b/app/src/main/res/drawable/bg_topup_btn.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/bg_walletinfo_lijin_gradient_bg.xml b/app/src/main/res/drawable/bg_walletinfo_lijin_gradient_bg.xml new file mode 100644 index 0000000..f3f1aef --- /dev/null +++ b/app/src/main/res/drawable/bg_walletinfo_lijin_gradient_bg.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/bottom_dialog_nfcread_bg.xml b/app/src/main/res/drawable/bottom_dialog_nfcread_bg.xml new file mode 100644 index 0000000..43436c7 --- /dev/null +++ b/app/src/main/res/drawable/bottom_dialog_nfcread_bg.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/button_false_bg.xml b/app/src/main/res/drawable/button_false_bg.xml new file mode 100644 index 0000000..2f6b0b9 --- /dev/null +++ b/app/src/main/res/drawable/button_false_bg.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/button_false_bg1.xml b/app/src/main/res/drawable/button_false_bg1.xml new file mode 100644 index 0000000..a559102 --- /dev/null +++ b/app/src/main/res/drawable/button_false_bg1.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/button_false_bg_new.xml b/app/src/main/res/drawable/button_false_bg_new.xml new file mode 100644 index 0000000..77ecd91 --- /dev/null +++ b/app/src/main/res/drawable/button_false_bg_new.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/button_true_bg.xml b/app/src/main/res/drawable/button_true_bg.xml new file mode 100644 index 0000000..004fa67 --- /dev/null +++ b/app/src/main/res/drawable/button_true_bg.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/common_check_box_big_bg1.xml b/app/src/main/res/drawable/common_check_box_big_bg1.xml new file mode 100644 index 0000000..539f297 --- /dev/null +++ b/app/src/main/res/drawable/common_check_box_big_bg1.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/app/src/main/res/drawable/cornor_33ffffff_6dp.xml b/app/src/main/res/drawable/cornor_33ffffff_6dp.xml new file mode 100644 index 0000000..0c9b0fd --- /dev/null +++ b/app/src/main/res/drawable/cornor_33ffffff_6dp.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/cornor_6877fe_20dp.xml b/app/src/main/res/drawable/cornor_6877fe_20dp.xml new file mode 100644 index 0000000..eac5e9e --- /dev/null +++ b/app/src/main/res/drawable/cornor_6877fe_20dp.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/cornor_6d80ff_dp50.xml b/app/src/main/res/drawable/cornor_6d80ff_dp50.xml new file mode 100644 index 0000000..42611c4 --- /dev/null +++ b/app/src/main/res/drawable/cornor_6d80ff_dp50.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/cornor_80000000_4dp.xml b/app/src/main/res/drawable/cornor_80000000_4dp.xml new file mode 100644 index 0000000..b303e0a --- /dev/null +++ b/app/src/main/res/drawable/cornor_80000000_4dp.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/cornor_c9a3e6_2dp.xml b/app/src/main/res/drawable/cornor_c9a3e6_2dp.xml new file mode 100644 index 0000000..5953714 --- /dev/null +++ b/app/src/main/res/drawable/cornor_c9a3e6_2dp.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/cornor_d4d3d9_6dp.xml b/app/src/main/res/drawable/cornor_d4d3d9_6dp.xml new file mode 100644 index 0000000..661bd19 --- /dev/null +++ b/app/src/main/res/drawable/cornor_d4d3d9_6dp.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/cornor_e44f3e_6dp.xml b/app/src/main/res/drawable/cornor_e44f3e_6dp.xml new file mode 100644 index 0000000..36aa056 --- /dev/null +++ b/app/src/main/res/drawable/cornor_e44f3e_6dp.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/cornor_ee9033_6dp.xml b/app/src/main/res/drawable/cornor_ee9033_6dp.xml new file mode 100644 index 0000000..b19ec89 --- /dev/null +++ b/app/src/main/res/drawable/cornor_ee9033_6dp.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/cornor_f4f4f4_6dp.xml b/app/src/main/res/drawable/cornor_f4f4f4_6dp.xml new file mode 100644 index 0000000..ed70b71 --- /dev/null +++ b/app/src/main/res/drawable/cornor_f4f4f4_6dp.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/cornor_fffbfb_6dp.xml b/app/src/main/res/drawable/cornor_fffbfb_6dp.xml new file mode 100644 index 0000000..2609810 --- /dev/null +++ b/app/src/main/res/drawable/cornor_fffbfb_6dp.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/cornor_stroke_cbcbcb_2dp.xml b/app/src/main/res/drawable/cornor_stroke_cbcbcb_2dp.xml new file mode 100644 index 0000000..db52557 --- /dev/null +++ b/app/src/main/res/drawable/cornor_stroke_cbcbcb_2dp.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/cornor_stroke_eeeeee_6dp.xml b/app/src/main/res/drawable/cornor_stroke_eeeeee_6dp.xml new file mode 100644 index 0000000..042aaf2 --- /dev/null +++ b/app/src/main/res/drawable/cornor_stroke_eeeeee_6dp.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/cornor_stroke_fe6881_2dp.xml b/app/src/main/res/drawable/cornor_stroke_fe6881_2dp.xml new file mode 100644 index 0000000..0e8196d --- /dev/null +++ b/app/src/main/res/drawable/cornor_stroke_fe6881_2dp.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/cornor_stroke_thempink_12dp.xml b/app/src/main/res/drawable/cornor_stroke_thempink_12dp.xml new file mode 100644 index 0000000..62b80bf --- /dev/null +++ b/app/src/main/res/drawable/cornor_stroke_thempink_12dp.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/cornor_stroke_unselect.xml b/app/src/main/res/drawable/cornor_stroke_unselect.xml new file mode 100644 index 0000000..d2b5b75 --- /dev/null +++ b/app/src/main/res/drawable/cornor_stroke_unselect.xml @@ -0,0 +1,13 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/cornor_themblue_12dp.xml b/app/src/main/res/drawable/cornor_themblue_12dp.xml new file mode 100644 index 0000000..b78307c --- /dev/null +++ b/app/src/main/res/drawable/cornor_themblue_12dp.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/cornor_thempink_12dp.xml b/app/src/main/res/drawable/cornor_thempink_12dp.xml new file mode 100644 index 0000000..227844d --- /dev/null +++ b/app/src/main/res/drawable/cornor_thempink_12dp.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/dot_btn_false.xml b/app/src/main/res/drawable/dot_btn_false.xml new file mode 100644 index 0000000..bbdb65c --- /dev/null +++ b/app/src/main/res/drawable/dot_btn_false.xml @@ -0,0 +1,9 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/dot_btn_false1.xml b/app/src/main/res/drawable/dot_btn_false1.xml new file mode 100644 index 0000000..10511ac --- /dev/null +++ b/app/src/main/res/drawable/dot_btn_false1.xml @@ -0,0 +1,9 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/dot_btn_true.xml b/app/src/main/res/drawable/dot_btn_true.xml new file mode 100644 index 0000000..dc63954 --- /dev/null +++ b/app/src/main/res/drawable/dot_btn_true.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/dot_btn_true1.xml b/app/src/main/res/drawable/dot_btn_true1.xml new file mode 100644 index 0000000..77ee5c2 --- /dev/null +++ b/app/src/main/res/drawable/dot_btn_true1.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/erwei_bg_pay.xml b/app/src/main/res/drawable/erwei_bg_pay.xml new file mode 100644 index 0000000..7b25599 --- /dev/null +++ b/app/src/main/res/drawable/erwei_bg_pay.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/fun_setting_bg_switch_thumb_off.xml b/app/src/main/res/drawable/fun_setting_bg_switch_thumb_off.xml new file mode 100644 index 0000000..f6fa560 --- /dev/null +++ b/app/src/main/res/drawable/fun_setting_bg_switch_thumb_off.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/fun_setting_bg_switch_thumb_on.xml b/app/src/main/res/drawable/fun_setting_bg_switch_thumb_on.xml new file mode 100644 index 0000000..8b7aef9 --- /dev/null +++ b/app/src/main/res/drawable/fun_setting_bg_switch_thumb_on.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/fun_setting_bg_switch_thumb_selector.xml b/app/src/main/res/drawable/fun_setting_bg_switch_thumb_selector.xml new file mode 100644 index 0000000..885ab83 --- /dev/null +++ b/app/src/main/res/drawable/fun_setting_bg_switch_thumb_selector.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/fun_setting_bg_switch_track_off.xml b/app/src/main/res/drawable/fun_setting_bg_switch_track_off.xml new file mode 100644 index 0000000..3326058 --- /dev/null +++ b/app/src/main/res/drawable/fun_setting_bg_switch_track_off.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/fun_setting_bg_switch_track_on.xml b/app/src/main/res/drawable/fun_setting_bg_switch_track_on.xml new file mode 100644 index 0000000..401f0cd --- /dev/null +++ b/app/src/main/res/drawable/fun_setting_bg_switch_track_on.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/fun_setting_bg_switch_track_selector.xml b/app/src/main/res/drawable/fun_setting_bg_switch_track_selector.xml new file mode 100644 index 0000000..a38df66 --- /dev/null +++ b/app/src/main/res/drawable/fun_setting_bg_switch_track_selector.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/home_search_img.xml b/app/src/main/res/drawable/home_search_img.xml new file mode 100644 index 0000000..52c77e9 --- /dev/null +++ b/app/src/main/res/drawable/home_search_img.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_about.xml b/app/src/main/res/drawable/ic_about.xml new file mode 100644 index 0000000..47d12da --- /dev/null +++ b/app/src/main/res/drawable/ic_about.xml @@ -0,0 +1,21 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_collect.xml b/app/src/main/res/drawable/ic_collect.xml new file mode 100644 index 0000000..eac5365 --- /dev/null +++ b/app/src/main/res/drawable/ic_collect.xml @@ -0,0 +1,30 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_frame.xml b/app/src/main/res/drawable/ic_frame.xml new file mode 100644 index 0000000..f512087 --- /dev/null +++ b/app/src/main/res/drawable/ic_frame.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_frame_mine_right_arrow.xml b/app/src/main/res/drawable/ic_frame_mine_right_arrow.xml new file mode 100644 index 0000000..39221d2 --- /dev/null +++ b/app/src/main/res/drawable/ic_frame_mine_right_arrow.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..f5e4f8f --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,176 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_qchat_checked.xml b/app/src/main/res/drawable/ic_qchat_checked.xml new file mode 100644 index 0000000..b3fdcb2 --- /dev/null +++ b/app/src/main/res/drawable/ic_qchat_checked.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_qchat_unchecked.xml b/app/src/main/res/drawable/ic_qchat_unchecked.xml new file mode 100644 index 0000000..407a1e4 --- /dev/null +++ b/app/src/main/res/drawable/ic_qchat_unchecked.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_select_blue.xml b/app/src/main/res/drawable/ic_select_blue.xml new file mode 100644 index 0000000..fe62e05 --- /dev/null +++ b/app/src/main/res/drawable/ic_select_blue.xml @@ -0,0 +1,13 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_select_white.xml b/app/src/main/res/drawable/ic_select_white.xml new file mode 100644 index 0000000..fdfae65 --- /dev/null +++ b/app/src/main/res/drawable/ic_select_white.xml @@ -0,0 +1,13 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_user_setting.xml b/app/src/main/res/drawable/ic_user_setting.xml new file mode 100644 index 0000000..86573d2 --- /dev/null +++ b/app/src/main/res/drawable/ic_user_setting.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable/index_main_bg.xml b/app/src/main/res/drawable/index_main_bg.xml new file mode 100644 index 0000000..ac55316 --- /dev/null +++ b/app/src/main/res/drawable/index_main_bg.xml @@ -0,0 +1,16 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/index_user_bg.xml b/app/src/main/res/drawable/index_user_bg.xml new file mode 100644 index 0000000..b16cd02 --- /dev/null +++ b/app/src/main/res/drawable/index_user_bg.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/index_user_bg1.xml b/app/src/main/res/drawable/index_user_bg1.xml new file mode 100644 index 0000000..4f8e22b --- /dev/null +++ b/app/src/main/res/drawable/index_user_bg1.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/index_user_bg2.xml b/app/src/main/res/drawable/index_user_bg2.xml new file mode 100644 index 0000000..bd3d6d4 --- /dev/null +++ b/app/src/main/res/drawable/index_user_bg2.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + #4d363636 + 0 + 2 + + + + diff --git a/app/src/main/res/drawable/index_user_bg3.xml b/app/src/main/res/drawable/index_user_bg3.xml new file mode 100644 index 0000000..310cdeb --- /dev/null +++ b/app/src/main/res/drawable/index_user_bg3.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + #4d363636 + 0 + 2 + + + + diff --git a/app/src/main/res/drawable/index_user_bg4.xml b/app/src/main/res/drawable/index_user_bg4.xml new file mode 100644 index 0000000..0db8fd2 --- /dev/null +++ b/app/src/main/res/drawable/index_user_bg4.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + #4d363636 + 0 + 2 + + + + diff --git a/app/src/main/res/drawable/index_v_lines.xml b/app/src/main/res/drawable/index_v_lines.xml new file mode 100644 index 0000000..7761479 --- /dev/null +++ b/app/src/main/res/drawable/index_v_lines.xml @@ -0,0 +1,9 @@ + + + + + diff --git a/app/src/main/res/drawable/input_bg.xml b/app/src/main/res/drawable/input_bg.xml new file mode 100644 index 0000000..e092679 --- /dev/null +++ b/app/src/main/res/drawable/input_bg.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/input_bg1.xml b/app/src/main/res/drawable/input_bg1.xml new file mode 100644 index 0000000..ebad78b --- /dev/null +++ b/app/src/main/res/drawable/input_bg1.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/input_bg_t.xml b/app/src/main/res/drawable/input_bg_t.xml new file mode 100644 index 0000000..e50ab5a --- /dev/null +++ b/app/src/main/res/drawable/input_bg_t.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/input_bg_t1.xml b/app/src/main/res/drawable/input_bg_t1.xml new file mode 100644 index 0000000..4132927 --- /dev/null +++ b/app/src/main/res/drawable/input_bg_t1.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/input_bg_t2.xml b/app/src/main/res/drawable/input_bg_t2.xml new file mode 100644 index 0000000..c9251e3 --- /dev/null +++ b/app/src/main/res/drawable/input_bg_t2.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/input_bg_tongji1.xml b/app/src/main/res/drawable/input_bg_tongji1.xml new file mode 100644 index 0000000..1877f0d --- /dev/null +++ b/app/src/main/res/drawable/input_bg_tongji1.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/item_button_bg_w.xml b/app/src/main/res/drawable/item_button_bg_w.xml new file mode 100644 index 0000000..dd6b274 --- /dev/null +++ b/app/src/main/res/drawable/item_button_bg_w.xml @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/kefu_loading.xml b/app/src/main/res/drawable/kefu_loading.xml new file mode 100644 index 0000000..e99307f --- /dev/null +++ b/app/src/main/res/drawable/kefu_loading.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/kefu_loading1.xml b/app/src/main/res/drawable/kefu_loading1.xml new file mode 100644 index 0000000..4962a22 --- /dev/null +++ b/app/src/main/res/drawable/kefu_loading1.xml @@ -0,0 +1,723 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/kefu_loading2.xml b/app/src/main/res/drawable/kefu_loading2.xml new file mode 100644 index 0000000..7467a35 --- /dev/null +++ b/app/src/main/res/drawable/kefu_loading2.xml @@ -0,0 +1,194 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/lefu_bg.xml b/app/src/main/res/drawable/lefu_bg.xml new file mode 100644 index 0000000..d85da5e --- /dev/null +++ b/app/src/main/res/drawable/lefu_bg.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/logout_btn1.xml b/app/src/main/res/drawable/logout_btn1.xml new file mode 100644 index 0000000..1353b22 --- /dev/null +++ b/app/src/main/res/drawable/logout_btn1.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/logout_btn2.xml b/app/src/main/res/drawable/logout_btn2.xml new file mode 100644 index 0000000..d6d0625 --- /dev/null +++ b/app/src/main/res/drawable/logout_btn2.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/logout_btn2_index.xml b/app/src/main/res/drawable/logout_btn2_index.xml new file mode 100644 index 0000000..07dea1d --- /dev/null +++ b/app/src/main/res/drawable/logout_btn2_index.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/logout_btn_c1.xml b/app/src/main/res/drawable/logout_btn_c1.xml new file mode 100644 index 0000000..5e3e84f --- /dev/null +++ b/app/src/main/res/drawable/logout_btn_c1.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/logout_btn_g.xml b/app/src/main/res/drawable/logout_btn_g.xml new file mode 100644 index 0000000..aa09c06 --- /dev/null +++ b/app/src/main/res/drawable/logout_btn_g.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/logout_btn_main1.xml b/app/src/main/res/drawable/logout_btn_main1.xml new file mode 100644 index 0000000..579104c --- /dev/null +++ b/app/src/main/res/drawable/logout_btn_main1.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/logout_btn_main2.xml b/app/src/main/res/drawable/logout_btn_main2.xml new file mode 100644 index 0000000..a913888 --- /dev/null +++ b/app/src/main/res/drawable/logout_btn_main2.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/logout_btn_red.xml b/app/src/main/res/drawable/logout_btn_red.xml new file mode 100644 index 0000000..efc5864 --- /dev/null +++ b/app/src/main/res/drawable/logout_btn_red.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/logout_btn_sl.xml b/app/src/main/res/drawable/logout_btn_sl.xml new file mode 100644 index 0000000..ce9809d --- /dev/null +++ b/app/src/main/res/drawable/logout_btn_sl.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/logout_btn_sl_88.xml b/app/src/main/res/drawable/logout_btn_sl_88.xml new file mode 100644 index 0000000..610ee73 --- /dev/null +++ b/app/src/main/res/drawable/logout_btn_sl_88.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/logout_btn_w.xml b/app/src/main/res/drawable/logout_btn_w.xml new file mode 100644 index 0000000..f6c7304 --- /dev/null +++ b/app/src/main/res/drawable/logout_btn_w.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/logout_btn_z.xml b/app/src/main/res/drawable/logout_btn_z.xml new file mode 100644 index 0000000..b5927f3 --- /dev/null +++ b/app/src/main/res/drawable/logout_btn_z.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/logout_btn_z_88.xml b/app/src/main/res/drawable/logout_btn_z_88.xml new file mode 100644 index 0000000..dcb2bbc --- /dev/null +++ b/app/src/main/res/drawable/logout_btn_z_88.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/map_txt_bg.xml b/app/src/main/res/drawable/map_txt_bg.xml new file mode 100644 index 0000000..60b9a9e --- /dev/null +++ b/app/src/main/res/drawable/map_txt_bg.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/password_button_bg.xml b/app/src/main/res/drawable/password_button_bg.xml new file mode 100644 index 0000000..9325b49 --- /dev/null +++ b/app/src/main/res/drawable/password_button_bg.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/password_button_bg_s.xml b/app/src/main/res/drawable/password_button_bg_s.xml new file mode 100644 index 0000000..683a7c3 --- /dev/null +++ b/app/src/main/res/drawable/password_button_bg_s.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/point_chat_ff4e54.xml b/app/src/main/res/drawable/point_chat_ff4e54.xml new file mode 100644 index 0000000..0afa6a9 --- /dev/null +++ b/app/src/main/res/drawable/point_chat_ff4e54.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ps_demo_pink_num_normal.xml b/app/src/main/res/drawable/ps_demo_pink_num_normal.xml new file mode 100644 index 0000000..17018eb --- /dev/null +++ b/app/src/main/res/drawable/ps_demo_pink_num_normal.xml @@ -0,0 +1,13 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ps_demo_pink_num_selected.xml b/app/src/main/res/drawable/ps_demo_pink_num_selected.xml new file mode 100644 index 0000000..7d7d1b2 --- /dev/null +++ b/app/src/main/res/drawable/ps_demo_pink_num_selected.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ps_demo_pink_num_selector.xml b/app/src/main/res/drawable/ps_demo_pink_num_selector.xml new file mode 100644 index 0000000..51414d3 --- /dev/null +++ b/app/src/main/res/drawable/ps_demo_pink_num_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/qr_code_bg.xml b/app/src/main/res/drawable/qr_code_bg.xml new file mode 100644 index 0000000..9ea3295 --- /dev/null +++ b/app/src/main/res/drawable/qr_code_bg.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/rectangle_white_reduce_bg.xml b/app/src/main/res/drawable/rectangle_white_reduce_bg.xml new file mode 100644 index 0000000..666b743 --- /dev/null +++ b/app/src/main/res/drawable/rectangle_white_reduce_bg.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ripple_with_color_mask.xml b/app/src/main/res/drawable/ripple_with_color_mask.xml new file mode 100644 index 0000000..637554c --- /dev/null +++ b/app/src/main/res/drawable/ripple_with_color_mask.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/saoma_btn1.xml b/app/src/main/res/drawable/saoma_btn1.xml new file mode 100644 index 0000000..3072698 --- /dev/null +++ b/app/src/main/res/drawable/saoma_btn1.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/search_bg.xml b/app/src/main/res/drawable/search_bg.xml new file mode 100644 index 0000000..a55685f --- /dev/null +++ b/app/src/main/res/drawable/search_bg.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/seek_bar_bg.xml b/app/src/main/res/drawable/seek_bar_bg.xml new file mode 100644 index 0000000..eac2ace --- /dev/null +++ b/app/src/main/res/drawable/seek_bar_bg.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/seek_bar_thumb1.xml b/app/src/main/res/drawable/seek_bar_thumb1.xml new file mode 100644 index 0000000..b8a14a5 --- /dev/null +++ b/app/src/main/res/drawable/seek_bar_thumb1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_common_unread_bg.xml b/app/src/main/res/drawable/shape_common_unread_bg.xml new file mode 100644 index 0000000..7bd5ced --- /dev/null +++ b/app/src/main/res/drawable/shape_common_unread_bg.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_dialog_bg2.xml b/app/src/main/res/drawable/shape_dialog_bg2.xml new file mode 100644 index 0000000..8fd9f84 --- /dev/null +++ b/app/src/main/res/drawable/shape_dialog_bg2.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_dialog_bg22.xml b/app/src/main/res/drawable/shape_dialog_bg22.xml new file mode 100644 index 0000000..5678aa6 --- /dev/null +++ b/app/src/main/res/drawable/shape_dialog_bg22.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_dialog_bg_new.xml b/app/src/main/res/drawable/shape_dialog_bg_new.xml new file mode 100644 index 0000000..470ad71 --- /dev/null +++ b/app/src/main/res/drawable/shape_dialog_bg_new.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shengri_item_bg.xml b/app/src/main/res/drawable/shengri_item_bg.xml new file mode 100644 index 0000000..71e96d0 --- /dev/null +++ b/app/src/main/res/drawable/shengri_item_bg.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/splash_bg.xml b/app/src/main/res/drawable/splash_bg.xml new file mode 100644 index 0000000..d1b1f3d --- /dev/null +++ b/app/src/main/res/drawable/splash_bg.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/splash_bg1.xml b/app/src/main/res/drawable/splash_bg1.xml new file mode 100644 index 0000000..a99f3f7 --- /dev/null +++ b/app/src/main/res/drawable/splash_bg1.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/switch_thumb_off.xml b/app/src/main/res/drawable/switch_thumb_off.xml new file mode 100644 index 0000000..71a207f --- /dev/null +++ b/app/src/main/res/drawable/switch_thumb_off.xml @@ -0,0 +1,17 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/switch_thumb_on.xml b/app/src/main/res/drawable/switch_thumb_on.xml new file mode 100644 index 0000000..f7eb60f --- /dev/null +++ b/app/src/main/res/drawable/switch_thumb_on.xml @@ -0,0 +1,17 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/switch_thumb_selector.xml b/app/src/main/res/drawable/switch_thumb_selector.xml new file mode 100644 index 0000000..fb76bac --- /dev/null +++ b/app/src/main/res/drawable/switch_thumb_selector.xml @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tab_background_selected.xml b/app/src/main/res/drawable/tab_background_selected.xml new file mode 100644 index 0000000..b3789a3 --- /dev/null +++ b/app/src/main/res/drawable/tab_background_selected.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/tab_background_unselected.xml b/app/src/main/res/drawable/tab_background_unselected.xml new file mode 100644 index 0000000..80c4d19 --- /dev/null +++ b/app/src/main/res/drawable/tab_background_unselected.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/tab_line1.xml b/app/src/main/res/drawable/tab_line1.xml new file mode 100644 index 0000000..ffdcf4c --- /dev/null +++ b/app/src/main/res/drawable/tab_line1.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tab_line2.xml b/app/src/main/res/drawable/tab_line2.xml new file mode 100644 index 0000000..fde0408 --- /dev/null +++ b/app/src/main/res/drawable/tab_line2.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tab_line3.xml b/app/src/main/res/drawable/tab_line3.xml new file mode 100644 index 0000000..3e245a0 --- /dev/null +++ b/app/src/main/res/drawable/tab_line3.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/teammembers_delete_btn.xml b/app/src/main/res/drawable/teammembers_delete_btn.xml new file mode 100644 index 0000000..81761f1 --- /dev/null +++ b/app/src/main/res/drawable/teammembers_delete_btn.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/user_type_bg.xml b/app/src/main/res/drawable/user_type_bg.xml new file mode 100644 index 0000000..24975e5 --- /dev/null +++ b/app/src/main/res/drawable/user_type_bg.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/wallet_page_bg.xml b/app/src/main/res/drawable/wallet_page_bg.xml new file mode 100644 index 0000000..ed08f9f --- /dev/null +++ b/app/src/main/res/drawable/wallet_page_bg.xml @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/app/src/main/res/drawable/xuxian_bg.xml b/app/src/main/res/drawable/xuxian_bg.xml new file mode 100644 index 0000000..715be03 --- /dev/null +++ b/app/src/main/res/drawable/xuxian_bg.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout-en/activity_tiktok.xml b/app/src/main/res/layout-en/activity_tiktok.xml new file mode 100644 index 0000000..8906a6a --- /dev/null +++ b/app/src/main/res/layout-en/activity_tiktok.xml @@ -0,0 +1,39 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-ja/activity_tiktok.xml b/app/src/main/res/layout-ja/activity_tiktok.xml new file mode 100644 index 0000000..5e0ba54 --- /dev/null +++ b/app/src/main/res/layout-ja/activity_tiktok.xml @@ -0,0 +1,38 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_about.xml b/app/src/main/res/layout/activity_about.xml new file mode 100644 index 0000000..f82307e --- /dev/null +++ b/app/src/main/res/layout/activity_about.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_activity_change.xml b/app/src/main/res/layout/activity_activity_change.xml new file mode 100644 index 0000000..508c001 --- /dev/null +++ b/app/src/main/res/layout/activity_activity_change.xml @@ -0,0 +1,179 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_addfriends.xml b/app/src/main/res/layout/activity_addfriends.xml new file mode 100644 index 0000000..4b4ab1c --- /dev/null +++ b/app/src/main/res/layout/activity_addfriends.xml @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_addphotos.xml b/app/src/main/res/layout/activity_addphotos.xml new file mode 100644 index 0000000..eecdcef --- /dev/null +++ b/app/src/main/res/layout/activity_addphotos.xml @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +