Compare commits
431 Commits
v5.6.0-470
...
feature-is
| Author | SHA1 | Date | |
|---|---|---|---|
| 8a7d588206 | |||
| 42ae45c743 | |||
| 3246dd0d70 | |||
| 06ac1fd8b0 | |||
| 81da40d786 | |||
| 9eb919b3cf | |||
| b4cbff3d6a | |||
| c7dfac8f46 | |||
| 08af4a99f8 | |||
| f3a358eb2d | |||
| 6abac72ee7 | |||
| b027c57a7c | |||
| 84b876394d | |||
| 3fb031c329 | |||
| e46afac397 | |||
| fdf2c80667 | |||
| d12a1037a2 | |||
| 056400d4d1 | |||
| 26cbdeaf2d | |||
| 6a5f7f8284 | |||
| f272e486f8 | |||
| 7b0514c055 | |||
| 909e7f33a8 | |||
| 677511b119 | |||
| 26a2605cd7 | |||
| b02f650a34 | |||
| e1d82e7fbd | |||
| 4263f53315 | |||
| f235959372 | |||
| 7bc6655b99 | |||
| 7ecc227df5 | |||
| 3046d33f91 | |||
| a32829fd0d | |||
| 4819bf3ddf | |||
| c2e02d356d | |||
| dafaeef184 | |||
| a9917c9201 | |||
| c0b61822c0 | |||
| a16a16cbdf | |||
| 0decb62237 | |||
| cdedea5002 | |||
| 88c4ebe5a0 | |||
| 10cbcdd768 | |||
| 7afbfb30a2 | |||
| 090a567887 | |||
| e55faee9fe | |||
| 362e34be8a | |||
| bf1e5586b0 | |||
| bad10158bd | |||
| 5cc58e2182 | |||
| fd836137a5 | |||
| b122e460cc | |||
| 3b29fcbef7 | |||
| 9f60a2ba86 | |||
| 8df7b3d9ee | |||
| e2040f9a2d | |||
| e39cd494b5 | |||
| f70b721441 | |||
| 877acf54f4 | |||
| a31d7a06f7 | |||
| f52937830b | |||
| b5202cc931 | |||
| dd2bfbc53f | |||
| d2f3cdadf6 | |||
| 73a88f9099 | |||
| a86c957872 | |||
| 45588a2580 | |||
| 3b55269319 | |||
| 01966a87ec | |||
| b4a8e5c68d | |||
| aeb7842299 | |||
| e0bcf947bf | |||
| 30bf685962 | |||
| 1e6fa023dc | |||
| b5920fc409 | |||
| 16ceb7115e | |||
| 279ed66270 | |||
| 9bfa8a33c8 | |||
| 99bd4da08a | |||
| 4824814981 | |||
| 10237d2fde | |||
| c1b236080e | |||
| 83d16a16b8 | |||
| 52ccffb97a | |||
| 9ed9e22df4 | |||
| 5aa29782cc | |||
| 82fcde1245 | |||
| eab945acfc | |||
| 8ed57cbfb8 | |||
| d3ed6d750b | |||
| bb4878eab4 | |||
| 53d8444c85 | |||
| 7db009a3cd | |||
| 4932fc2d7b | |||
| ca55ac02b7 | |||
| c535ffb2e0 | |||
| 9c6eb22d9d | |||
| 9ec6ec0281 | |||
| 327441e62b | |||
| ae3f07a3ee | |||
| f967e1f283 | |||
| ba1308c568 | |||
| 3144e3b007 | |||
| ec1c5713ad | |||
| 15adc93340 | |||
| c9b27f6ebe | |||
| cff7f7d2e2 | |||
| cb5d0c4840 | |||
| dea6abe399 | |||
| 20c792d4fa | |||
| b8cbd5a0fb | |||
| 0a34f23e62 | |||
| 7413b4e4ac | |||
| d2025c32c9 | |||
| 5c5dd35409 | |||
| b509e9046e | |||
| 46e99434c9 | |||
| b6ff94aed3 | |||
| 25e0bd19bc | |||
| fe5b398fad | |||
| 417ed1401e | |||
| 48698f06cd | |||
| b70a7eaf8b | |||
| ad86d7bbcc | |||
| a2eb550099 | |||
| e736855a4a | |||
| 0b49f531ac | |||
| c36f4d9abf | |||
| db72b0a5c9 | |||
| b19d21fc39 | |||
| 2d172d70ad | |||
| cc434771c0 | |||
| f5a9502261 | |||
| c48d970b0a | |||
| 9a53c7a84e | |||
| ce17ae2d2b | |||
| d97f65e9b3 | |||
| 9f1f3a2d66 | |||
| 4c9609ba52 | |||
| 270203266f | |||
| edc326ff3c | |||
| 0856b8a2ab | |||
| 8f95517dd7 | |||
| c828f3f479 | |||
| b90d026a74 | |||
| 819beb779c | |||
| de31dcaf0b | |||
| 587c217b7c | |||
| b03e86f903 | |||
| ea80942937 | |||
| 06153cbf58 | |||
| 0b94f777a2 | |||
| 3d6917cd5d | |||
| e4300ab315 | |||
| ed80533198 | |||
| 4b5c741ff9 | |||
| a93b49eb76 | |||
| 9fb25b80ea | |||
| 5c64deb874 | |||
| 33cb09e201 | |||
| 032a9750e2 | |||
| ff6fcd038e | |||
| cc3908b416 | |||
| 50a7527e7c | |||
| 75e085b80a | |||
| 39eecf0920 | |||
| 0e9f267117 | |||
| 02bb977cc0 | |||
| c4a89b9302 | |||
| cde9401b36 | |||
| edcb4a949e | |||
| 4e0516e43f | |||
| d702cafc4f | |||
| 6cd9076dff | |||
| a5c113e527 | |||
| 048bdbc367 | |||
| 1e287f56e2 | |||
| 2aacab80a6 | |||
| f9d7255556 | |||
| 2b2cf1ca8f | |||
| c651a97bbb | |||
| b54f1d125e | |||
| ead711446d | |||
| b19f0ac69c | |||
| 25a325f7f7 | |||
| 8be52f7bdd | |||
| 3cb1cd3ba6 | |||
| b68a9a43de | |||
| 0f80f5bc03 | |||
| 647ef1d8d3 | |||
| 6c6a7f0677 | |||
| 56dc30845a | |||
| da14711bbc | |||
| 33fe057a5f | |||
| a052f981c5 | |||
| 5042bddec7 | |||
| 0803e61828 | |||
| 119f304e2f | |||
| 3db6f93b73 | |||
| 3f74d8efc9 | |||
| 15aabc4db7 | |||
| 3ed3a8d47a | |||
| 3719f5e1cd | |||
| 957fca8960 | |||
| 0066d2eb7b | |||
| cbae38b41d | |||
| 021886c3cb | |||
| 6d62dd7fd1 | |||
| 20d28525cf | |||
| a406127cda | |||
| 3301b30ec2 | |||
| f761715ebd | |||
| 1f0216662a | |||
| f483f1effc | |||
| cf5b0bcd41 | |||
| 4e51830c58 | |||
| 830a45e6d2 | |||
| 24c32b7a4b | |||
| 7e30f1702d | |||
| 68ae4bf1b2 | |||
| 0b757f24d1 | |||
| 99d0525c0a | |||
| 4f3ec7aa18 | |||
| bd228459fa | |||
| c9227c20a2 | |||
| 5270bc3ed7 | |||
| e1de3dc873 | |||
| 9303f534d9 | |||
| 629a694279 | |||
| 0ef0ed7c50 | |||
| 48d335ad67 | |||
| 231434caeb | |||
| 220fd340ce | |||
| 5badb44e3e | |||
| 82d405c14c | |||
| 2157dcd51a | |||
| 872d9d89c5 | |||
| dae4543a82 | |||
| 60204d9ab2 | |||
| 0c86965260 | |||
| d0ad110d9e | |||
| 5cd88cdb7f | |||
| 60acd1bac4 | |||
| 990efacb89 | |||
| 7076a6acaa | |||
| acc4d6d8ab | |||
| 0a3ae4379d | |||
| 8197f161c0 | |||
| 0cd5f0d640 | |||
| 790093b585 | |||
| 46093c065d | |||
| 9cc1a0dd4e | |||
| 72a5d2881a | |||
| 7eabb1098c | |||
| 7a295a5d05 | |||
| da26247d30 | |||
| c797779598 | |||
| f66bf2398c | |||
| 010ce39e20 | |||
| 9320059a76 | |||
| 3003a310a0 | |||
| 91af5e6fe6 | |||
| d02dfbdaf7 | |||
| c3e06cc1ff | |||
| 3e86e368d8 | |||
| df231d1530 | |||
| 006f71def7 | |||
| 047dc9a7ae | |||
| 05abf00994 | |||
| c8278f6364 | |||
| 8cd951c669 | |||
| c43700e4d6 | |||
| fa2174319e | |||
| 4d6a71c8be | |||
| c866f16157 | |||
| b99e579ccd | |||
| 01eb074df1 | |||
| f6473b0e5e | |||
| e244797e7d | |||
| f267908122 | |||
| 6128e364e6 | |||
| 32a4fda9bc | |||
| 792ce39792 | |||
| 94b80b3f8b | |||
| 0e49985edf | |||
| 164f508cbc | |||
| cdfda4d963 | |||
| c3b850972f | |||
| 89f8aebefe | |||
| 52eca3b1ab | |||
| 0e26943d25 | |||
| 8286b0137f | |||
| 0a8bef8ac3 | |||
| a8fa4cf872 | |||
| 775f454e38 | |||
| b7de326a21 | |||
| 5b0d2e8294 | |||
| ec34de4675 | |||
| 0f6aa5ca9f | |||
| b0cdd1029e | |||
| e554e9ca5f | |||
| ff879454c1 | |||
| 7d3baaa501 | |||
| 5a57a58f0a | |||
| e01bfb4676 | |||
| 3617004de2 | |||
| de8234868a | |||
| 3d31d9a435 | |||
| 9220f13c9e | |||
| 10a3ed7f15 | |||
| 680ec6e285 | |||
| d99fbe5292 | |||
| 554eb671b2 | |||
| 9f2e46d876 | |||
| d2efb8391c | |||
| ac04cc4525 | |||
| 03855609c1 | |||
| 2408af31d9 | |||
| fc2dcbd4b0 | |||
| 3012bf6a46 | |||
| e07529846c | |||
| 8805763b1d | |||
| 5fa578c9ed | |||
| 5056dddf26 | |||
| 010c41c3c9 | |||
| bb7cea3dee | |||
| d7a81d2268 | |||
| 9b9aa8c060 | |||
| ee445c0819 | |||
| 0060312d52 | |||
| 3a4f4eaf24 | |||
| afa8c776b9 | |||
| 60cfee7ce3 | |||
| e418f5d3ea | |||
| 80f30b82b6 | |||
| 58999418ab | |||
| f4e90aa9da | |||
| 1308737382 | |||
| c1b1b2a6ce | |||
| 82ec3569dc | |||
| 3dd2b5df49 | |||
| 34ac01cde8 | |||
| c09efbfa78 | |||
| 054f6200f3 | |||
| dabe88b703 | |||
| 35dee07537 | |||
| 67e44d378c | |||
| 09d9fc446e | |||
| 1971e3bb81 | |||
| b560cdfa6e | |||
| 0bfdedfae8 | |||
| 5cd424a680 | |||
| 012103e706 | |||
| 2ad067b80d | |||
| 2f551db4c7 | |||
| 343aa77c86 | |||
| b7bbf8688f | |||
| 67a98023c6 | |||
| f0c6486855 | |||
| 201884643f | |||
| 410ad346e6 | |||
| 782bb3a825 | |||
| e77b21719c | |||
| fffdd596d2 | |||
| 6e2b6cc397 | |||
| 97ac478c8d | |||
| 1b655f27d1 | |||
| 9760aa23d7 | |||
| 6656676636 | |||
| 32549fc16f | |||
| 55d83d12bb | |||
| fd1e7f7f4c | |||
| 0fc5a16f80 | |||
| 4992845195 | |||
| e9db55bcb6 | |||
| 11056df05e | |||
| ffd04b6f60 | |||
| abdbe601b4 | |||
| bca7e2e4cf | |||
| fcdd78d668 | |||
| 09f1bdb915 | |||
| 8e5168005e | |||
| c210c3b286 | |||
| 9020022fdc | |||
| b13aede1d3 | |||
| cca1f76b85 | |||
| f667ef562e | |||
| 3565214e38 | |||
| 8f11ad7d6c | |||
| 4612f7452f | |||
| 2850789b29 | |||
| bf3dbb623d | |||
| 9cb7cc8c07 | |||
| c7cfb7d7b7 | |||
| 018959aa03 | |||
| e64f87bc0c | |||
| 891958c4d9 | |||
| f921ff6f4d | |||
| 8a0809498a | |||
| 447e3f4421 | |||
| e2172a6fe4 | |||
| ccf3e43dc1 | |||
| 218091e1be | |||
| ee1eafe5a1 | |||
| 79e95a8146 | |||
| 3d05bad997 | |||
| 09011ac18b | |||
| 42a958a9cc | |||
| 2922878163 | |||
| 4608891a88 | |||
| c1c63d82af | |||
| b78eb5a268 | |||
| f9361ab134 | |||
| efb6a07a13 | |||
| 6b0bacc018 | |||
| 9f2f0734ff | |||
| 5d54fbde39 | |||
| 93bfbe9c36 | |||
| 5e9e5c1892 | |||
| ee3c431ef6 | |||
| d4baa0b4d8 | |||
| 70b411a946 | |||
| 0e3189404e | |||
| d95b2eccaf | |||
| 4f4097a7a9 | |||
| 098639042b | |||
| 3a9bc99f07 | |||
| 37e1a18349 | |||
| 3aa387a72a | |||
| 52cfa3def9 | |||
| 506b3effdc |
4
.gitmodules
vendored
4
.gitmodules
vendored
@ -1,7 +1,7 @@
|
||||
[submodule "libraries/LGLibrary"]
|
||||
path = libraries/LGLibrary
|
||||
url = git@git.ghzs.com:android/common-library.git
|
||||
url = git@git.shanqu.cc:android/common-library.git
|
||||
branch = master
|
||||
[submodule "assistant_flutter"]
|
||||
path = assistant_flutter
|
||||
url = git@git.ghzs.com:halo/android/flutter-module.git
|
||||
url = git@git.shanqu.cc:halo/android/flutter-module.git
|
||||
|
||||
15
README.md
15
README.md
@ -14,9 +14,9 @@
|
||||
4. 遵循最小改动原则,在提交代码前务必先检查变动的代码,尽量以可控的变动规模来构成一个 commit ,以便日后追踪问题
|
||||
5. 代码规范可参考 [AOSP Java 风格](https://source.android.com/setup/contribute/code-style)
|
||||
6. 尽量使用 Kotlin 来写新文件
|
||||
7. 尽量不要使用 DataBinding,因为回影响编译性能
|
||||
7. 尽量不要使用 DataBinding
|
||||
8. Commit 前请确保不带入非项目必须文件,可手动修改 [.gitignore](https://stackoverflow.com/questions/8527597/how-do-i-ignore-files-in-a-directory-in-git) 文件忽略
|
||||
9. 新页面请勿使用 ButterKnife 来进行 View 获取和绑定,请使用 ViewBinding
|
||||
9. 优先使用 ViewBinding 获取 View 对象
|
||||
10. No AsyncTask!
|
||||
|
||||
### 公用部分
|
||||
@ -25,7 +25,7 @@
|
||||
|
||||
### 首次拉取项目代码
|
||||
|
||||
`git clone -b dev git@git.ghzs.com:halo/android/assistant-android.git --recursive`
|
||||
`git clone -b dev git@git.shanqu.cc:halo/android/assistant-android.git --recursive`
|
||||
|
||||
### git 版本管理
|
||||
|
||||
@ -45,8 +45,8 @@
|
||||
|
||||
### 第三方appkey等配置
|
||||
|
||||
* 修改`gradle.properties`文件将各种key填入其中,实现统一管理
|
||||
* 通过gradle文件内的resValue/buildConfigField/manifestPlaceHolder方式实现编译期间修改,具体情况请参考``./build.gradle``和``./app/build.gradle``配置
|
||||
* 修改 `gradle.properties` 文件将各种key填入其中,实现统一管理
|
||||
* 通过 gradle 文件内的 resValue/buildConfigField/manifestPlaceHolder 方式实现编译期间修改,具体情况请参考 ``./build.gradle`` 和 ``./app/build.gradle`` 配置
|
||||
|
||||
### 混淆配置
|
||||
|
||||
@ -55,11 +55,8 @@
|
||||
|
||||
### APK打包配置
|
||||
|
||||
* 本项目使用了 [VasDolly](https://github.com/Tencent/VasDolly) 作为渠道包实现方案
|
||||
* 打包命令,具体参数请见相应文件:
|
||||
|
||||
> 打内部测试包:`./scripts/test_build.sh`
|
||||
> 打正式发布包:`./scripts/build_with_simple_backup.sh`
|
||||
> 打邮件测试包:`./scripts/jenkins_build.sh`
|
||||
|
||||
### TODO
|
||||
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
// This comment exists for a reason, do not delete
|
||||
apply plugin: 'com.android.application'
|
||||
apply plugin: 'kotlin-android' // kotlin
|
||||
apply plugin: 'kotlin-android-extensions'
|
||||
apply plugin: 'kotlin-parcelize'
|
||||
apply plugin: 'kotlin-kapt'
|
||||
apply plugin: 'AndResGuard'
|
||||
|
||||
@ -9,13 +9,9 @@ import groovy.xml.XmlUtil
|
||||
|
||||
android {
|
||||
|
||||
androidExtensions {
|
||||
experimental = true
|
||||
}
|
||||
|
||||
buildFeatures {
|
||||
viewBinding = true
|
||||
dataBinding = true
|
||||
viewBinding true
|
||||
dataBinding true
|
||||
}
|
||||
|
||||
compileOptions {
|
||||
@ -48,6 +44,7 @@ android {
|
||||
|
||||
defaultConfig {
|
||||
|
||||
vectorDrawables.useSupportLibrary = true
|
||||
multiDexEnabled true
|
||||
javaCompileOptions {
|
||||
annotationProcessorOptions {
|
||||
@ -92,8 +89,10 @@ android {
|
||||
|
||||
/**
|
||||
* Build Time 供区分 jenkins 打包时间用
|
||||
* IS_NIGHT_MODE_ON 供区分夜间模式功能是否启用
|
||||
*/
|
||||
buildConfigField "long", "BUILD_TIME", "0"
|
||||
buildConfigField "boolean", "IS_NIGHT_MODE_ON", "true"
|
||||
}
|
||||
|
||||
// gradle 2.2以上默认同时启用v1和v2(优先用于Android N)
|
||||
@ -138,7 +137,7 @@ android {
|
||||
variantFilter { variant ->
|
||||
def names = variant.flavors*.name
|
||||
def isDebugType = variant.buildType.name == "debug"
|
||||
if ((names.contains("tea") || name.contains("gdt")) && isDebugType) {
|
||||
if ((names.contains("tea")) && isDebugType) {
|
||||
setIgnore(true)
|
||||
}
|
||||
}
|
||||
@ -155,9 +154,6 @@ android {
|
||||
tea {
|
||||
java.srcDirs = ['src/main/java', 'src/tea/java']
|
||||
}
|
||||
gdt {
|
||||
java.srcDirs = ['src/main/java', 'src/gdt/java']
|
||||
}
|
||||
}
|
||||
|
||||
productFlavors {
|
||||
@ -186,13 +182,6 @@ android {
|
||||
|
||||
manifestPlaceholders.put("APPLOG_SCHEME", "rangersapplog.byAx6uYt".toLowerCase())
|
||||
}
|
||||
|
||||
gdt {
|
||||
dimension "env"
|
||||
|
||||
buildConfigField "String", "DEV_API_HOST", "\"${API_HOST}\""
|
||||
buildConfigField "String", "NEW_DEV_API_HOST", "\"${NEW_API_HOST}\""
|
||||
}
|
||||
}
|
||||
|
||||
lintOptions {
|
||||
@ -210,7 +199,6 @@ repositories {
|
||||
dependencies {
|
||||
|
||||
implementation fileTree(include: ['*.jar', '*.aar'], dir: 'libs')
|
||||
gdtImplementation fileTree(include: ['*.jar', '*.aar'], dir: 'src/gdt/libs')
|
||||
|
||||
testImplementation 'junit:junit:4.12'
|
||||
|
||||
@ -218,6 +206,7 @@ dependencies {
|
||||
debugImplementation "com.squareup.okhttp3:logging-interceptor:${okHttp}"
|
||||
// debugImplementation "com.gu.android:toolargetool:${toolargetool}" // 需要使用调试时才启用
|
||||
debugImplementation "com.github.nichbar:WhatTheStack:${whatTheStack}"
|
||||
debugImplementation "io.github.didi.dokit:dokitx:${dokit}"
|
||||
|
||||
implementation "androidx.core:core-ktx:${core}"
|
||||
implementation "androidx.fragment:fragment-ktx:${fragment}"
|
||||
@ -230,6 +219,7 @@ dependencies {
|
||||
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifeCycle"
|
||||
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifeCycle"
|
||||
implementation "androidx.lifecycle:lifecycle-common-java8:$lifeCycle"
|
||||
implementation "androidx.lifecycle:lifecycle-extensions:$lifeCycleExtensions"
|
||||
implementation "androidx.room:room-runtime:${room}"
|
||||
implementation "androidx.room:room-rxjava2:${room}"
|
||||
implementation "androidx.core:core-ktx:${ktx}"
|
||||
@ -258,8 +248,6 @@ dependencies {
|
||||
implementation "com.j256.ormlite:ormlite-android:${ormlite}"
|
||||
implementation "com.j256.ormlite:ormlite-core:${ormlite}"
|
||||
|
||||
implementation "com.jakewharton:butterknife:${butterKnife}"
|
||||
kapt "com.jakewharton:butterknife-compiler:${butterKnife}"
|
||||
implementation "org.jetbrains.kotlin:kotlin-stdlib:${kotlin_version}"
|
||||
|
||||
implementation "org.greenrobot:eventbus:${eventbus}"
|
||||
@ -299,7 +287,7 @@ dependencies {
|
||||
})
|
||||
implementation "com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-exo_player2:$gsyVideo"
|
||||
|
||||
implementation "android.arch.work:work-runtime:${workManager}"
|
||||
implementation "androidx.work:work-runtime:${workManager}"
|
||||
|
||||
implementation "com.llew.huawei:verifier:${verifier}"
|
||||
|
||||
@ -347,7 +335,7 @@ dependencies {
|
||||
|
||||
implementation "com.louiscad.splitties:splitties-fun-pack-android-base-with-views-dsl:${splitties}"
|
||||
|
||||
compileOnly "com.github.axen1314.lancet:lancet-base:$lancet_version"
|
||||
compileOnly "com.github.axen1314.lancet:lancet-base:${lancet_version}"
|
||||
|
||||
implementation project(':libraries:LGLibrary')
|
||||
implementation project(':libraries:QQShare')
|
||||
@ -607,4 +595,4 @@ project.afterEvaluate {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -220,10 +220,6 @@
|
||||
-keepattributes Signature
|
||||
-keepattributes Annotation
|
||||
|
||||
### 广点通
|
||||
-dontwarn com.qq.gdt.action.**
|
||||
-keep class com.qq.gdt.action.** {*;}
|
||||
|
||||
### AndroidX
|
||||
-keep class androidx.core.app.CoreComponentFactory { *; }
|
||||
|
||||
@ -267,5 +263,4 @@
|
||||
-keep class com.ut.**{*;}
|
||||
-keep class com.ta.**{*;}
|
||||
|
||||
-keep class com.gh.gamecenter.GdtHelper { *; }
|
||||
-keep class com.gh.gamecenter.TeaHelper { *; }
|
||||
@ -41,12 +41,6 @@
|
||||
-keepclassmembers class cn.trinea.android.* { *; }
|
||||
-dontwarn cn.trinea.android.**
|
||||
|
||||
### Butterknife
|
||||
-keep public class * implements butterknife.Unbinder { public <init>(**, android.view.View); }
|
||||
-keep class butterknife.*
|
||||
-keepclasseswithmembernames class * { @butterknife.* <methods>; }
|
||||
-keepclasseswithmembernames class * { @butterknife.* <fields>; }
|
||||
|
||||
### eventbus
|
||||
-keepclassmembers class * {
|
||||
@org.greenrobot.eventbus.Subscribe <methods>;
|
||||
@ -100,10 +94,6 @@
|
||||
@androidx.annotation.Keep *;
|
||||
}
|
||||
|
||||
### 广点通
|
||||
-dontwarn com.qq.gdt.action.**
|
||||
-keep class com.qq.gdt.action.* {*;}
|
||||
|
||||
### 阿里云上传
|
||||
-keep class com.alibaba.sdk.android.oss.* { *; }
|
||||
-dontwarn okio.**
|
||||
@ -130,8 +120,7 @@
|
||||
-keep class com.ut.*{*;}
|
||||
-keep class com.ta.*{*;}
|
||||
|
||||
### GDT & TEA
|
||||
-keep class com.gh.gamecenter.GdtHelper { *; }
|
||||
### TEA
|
||||
-keep class com.gh.gamecenter.TeaHelper { *; }
|
||||
|
||||
### 阿里云日志
|
||||
@ -153,6 +142,9 @@
|
||||
### emoji4j
|
||||
-keep class emoji4j.* {*;}
|
||||
|
||||
### dokit
|
||||
-keep class com.didichuxing.** {*;}
|
||||
|
||||
# Flutter模块
|
||||
-keep class com.gh.common.util.DirectUtils {
|
||||
public static void directToQa(...);
|
||||
|
||||
@ -1,77 +0,0 @@
|
||||
package com.gh.gamecenter
|
||||
|
||||
import android.app.Application
|
||||
import android.text.TextUtils
|
||||
import android.util.Log
|
||||
import com.gh.common.util.ToastUtils
|
||||
import com.lightgame.utils.Utils
|
||||
import com.qq.gdt.action.GDTAction
|
||||
import org.json.JSONObject
|
||||
|
||||
/**
|
||||
* 广点通辅助类 [https://gitlab.ghzhushou.com/pm/halo-app-issues/issues/403]
|
||||
*
|
||||
* 更换帐号 [https://gitlab.ghzs.com/pm/yunying/issues/893]
|
||||
*/
|
||||
object GdtHelper {
|
||||
|
||||
const val NETWORK_TYPE = "NETWORK_TYPE"
|
||||
const val PAGE_TYPE = "PAGE_TYPE"
|
||||
const val CONTENT_TYPE = "CONTENT_TYPE"
|
||||
const val CONTENT_ID = "CONTENT_ID"
|
||||
const val KEYWORD = "KEYWORD"
|
||||
const val GAME_ID = "GAME_ID"
|
||||
const val SCORE = "SCORE"
|
||||
const val PLATFORM = "PLATFORM"
|
||||
|
||||
@JvmStatic
|
||||
fun init(application: Application, channel: String) {
|
||||
if (shouldUseGdtHelper()) {
|
||||
if (channel == "GH_728") {
|
||||
GDTAction.init(application, "1111012969", "9d3d9da5b0948a317c03d08f14d445dc")
|
||||
} else if (channel == "GH_729") {
|
||||
GDTAction.init(application, "1111013063", "f53dabf458a356b101d99fc4069eb7f1")
|
||||
} else if (channel == "GH_765") {
|
||||
GDTAction.init(application, "1111327925", "588d503f0990f98f9b2394fbb795c570")
|
||||
} else {
|
||||
GDTAction.init(application, "1110680399", "f5ddaafbf520d7d7385499232a408d0a")
|
||||
}
|
||||
}
|
||||
Utils.log("init GdtHelper")
|
||||
}
|
||||
|
||||
// fun logAction(type: String) {
|
||||
// if (shouldUseGdtHelper()) {
|
||||
// GDTAction.logAction(type)
|
||||
// Utils.log("GDT", type)
|
||||
// }
|
||||
// }
|
||||
@JvmStatic
|
||||
fun logAction(type: String, vararg kv: String?) {
|
||||
try {
|
||||
val actionParam = JSONObject()
|
||||
for (i in kv.indices) {
|
||||
if (i % 2 != 0) {
|
||||
val key = kv[i - 1]
|
||||
val value = kv[i]
|
||||
if (!TextUtils.isEmpty(key) && !TextUtils.isEmpty(value)) {
|
||||
actionParam.put(key, value)
|
||||
}
|
||||
}
|
||||
}
|
||||
Utils.log("GDT", "$type + [${kv.joinToString(" , ")}]")
|
||||
GDTAction.logAction(type, actionParam)
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
}
|
||||
|
||||
// TODO 确认开启的渠道条件
|
||||
private fun shouldUseGdtHelper(): Boolean {
|
||||
return true
|
||||
//
|
||||
// val channel = HaloApp.getInstance().channel
|
||||
// return !(TextUtils.isEmpty(channel) || channel.contains("GDT".toLowerCase(Locale.CHINA)))
|
||||
}
|
||||
|
||||
}
|
||||
Binary file not shown.
@ -25,6 +25,8 @@
|
||||
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
|
||||
<!-- 允许应用程序快捷方式 -->
|
||||
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
|
||||
<!-- 前台服务权限-->
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
|
||||
|
||||
<uses-permission
|
||||
android:name="android.permission.PACKAGE_USAGE_STATS"
|
||||
@ -32,6 +34,8 @@
|
||||
|
||||
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
|
||||
|
||||
<uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" />
|
||||
|
||||
<!-- 如果有视频相关的广告且使用textureView播放,请务必添加,否则黑屏 -->
|
||||
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
||||
|
||||
@ -162,7 +166,7 @@
|
||||
|
||||
<activity
|
||||
android:name="com.gh.gamecenter.WebActivity"
|
||||
android:screenOrientation="portrait" />
|
||||
android:screenOrientation="portrait"/>
|
||||
|
||||
<activity
|
||||
android:name="com.gh.gamecenter.SingletonWebActivity"
|
||||
@ -240,11 +244,6 @@
|
||||
android:screenOrientation="portrait"
|
||||
android:windowSoftInputMode="stateAlwaysHidden|adjustResize" />
|
||||
|
||||
<activity
|
||||
android:name="com.gh.gamecenter.ToolBoxActivity"
|
||||
android:screenOrientation="portrait"
|
||||
android:windowSoftInputMode="stateHidden" />
|
||||
|
||||
<activity
|
||||
android:name="com.gh.gamecenter.WeiBoShareActivity"
|
||||
android:screenOrientation="portrait"
|
||||
@ -284,18 +283,10 @@
|
||||
android:screenOrientation="portrait"
|
||||
android:windowSoftInputMode="stateHidden" />
|
||||
|
||||
<activity
|
||||
android:name="com.gh.gamecenter.qa.search.AskSearchActivity"
|
||||
android:screenOrientation="portrait" />
|
||||
|
||||
<activity
|
||||
android:name="com.gh.gamecenter.qa.answer.detail.AnswerDetailActivity"
|
||||
android:screenOrientation="portrait" />
|
||||
|
||||
<activity
|
||||
android:name="com.gh.gamecenter.qa.questions.detail.QuestionsDetailActivity"
|
||||
android:screenOrientation="portrait" />
|
||||
|
||||
<activity
|
||||
android:name=".qa.answer.fold.AnswerFoldActivity"
|
||||
android:screenOrientation="portrait" />
|
||||
@ -316,14 +307,6 @@
|
||||
android:name="com.gh.gamecenter.MessageKeFuActivity"
|
||||
android:screenOrientation="portrait" />
|
||||
|
||||
<activity
|
||||
android:name="com.gh.gamecenter.qa.select.CommunitiesSelectActivity"
|
||||
android:screenOrientation="portrait" />
|
||||
|
||||
<activity
|
||||
android:name="com.gh.gamecenter.qa.subject.CommunitySubjectActivity"
|
||||
android:screenOrientation="portrait" />
|
||||
|
||||
<activity
|
||||
android:name="com.gh.gamecenter.MessageInviteActivity"
|
||||
android:screenOrientation="portrait" />
|
||||
@ -340,10 +323,6 @@
|
||||
android:name="com.gh.gamecenter.qa.myqa.MyAskActivity"
|
||||
android:screenOrientation="portrait" />
|
||||
|
||||
<activity
|
||||
android:name="com.gh.gamecenter.qa.column.order.AskTabOrderActivity"
|
||||
android:screenOrientation="portrait" />
|
||||
|
||||
<activity
|
||||
android:name="com.gh.gamecenter.qa.questions.edit.QuestionEditActivity"
|
||||
android:screenOrientation="portrait" />
|
||||
@ -365,10 +344,6 @@
|
||||
android:name="com.gh.gamecenter.amway.AmwayActivity"
|
||||
android:screenOrientation="portrait" />
|
||||
|
||||
<activity
|
||||
android:name="com.gh.gamecenter.qa.column.detail.AskColumnDetailActivity"
|
||||
android:screenOrientation="portrait" />
|
||||
|
||||
<activity
|
||||
android:name="com.gh.gamecenter.NetworkDiagnosisActivity"
|
||||
android:screenOrientation="portrait" />
|
||||
@ -414,14 +389,6 @@
|
||||
android:screenOrientation="portrait"
|
||||
android:windowSoftInputMode="stateVisible" />
|
||||
|
||||
<activity
|
||||
android:name="com.gh.gamecenter.qa.questions.edit.manager.HistoryDetailActivity"
|
||||
android:screenOrientation="portrait" />
|
||||
|
||||
<activity
|
||||
android:name="com.gh.gamecenter.qa.questions.edit.manager.HistoryActivity"
|
||||
android:screenOrientation="portrait" />
|
||||
|
||||
<activity
|
||||
android:name="com.gh.gamecenter.qa.editor.InsertAnswerWrapperActivity"
|
||||
android:screenOrientation="portrait" />
|
||||
@ -455,10 +422,6 @@
|
||||
android:name="com.gh.gamecenter.tag.TagsActivity"
|
||||
android:screenOrientation="portrait" />
|
||||
|
||||
<activity
|
||||
android:name="com.gh.gamecenter.qa.article.SimpleArticleListActivity"
|
||||
android:screenOrientation="portrait" />
|
||||
|
||||
<activity
|
||||
android:name="com.gh.gamecenter.video.videomanager.VideoManagerActivity"
|
||||
android:screenOrientation="portrait" />
|
||||
@ -507,13 +470,11 @@
|
||||
|
||||
<activity
|
||||
android:name="com.gh.gamecenter.qa.comment.CommentActivity"
|
||||
android:screenOrientation="portrait"
|
||||
android:theme="@style/Theme.Transparent"
|
||||
android:windowSoftInputMode="adjustNothing" />
|
||||
|
||||
<activity
|
||||
android:name=".qa.dialog.ChooseForumActivity"
|
||||
android:screenOrientation="portrait"
|
||||
android:theme="@style/Theme.Transparent"
|
||||
android:windowSoftInputMode="adjustNothing" />
|
||||
|
||||
@ -668,7 +629,6 @@
|
||||
|
||||
<activity
|
||||
android:name=".qa.editor.FullScreenVideoActivity"
|
||||
android:screenOrientation="landscape"
|
||||
android:theme="@style/AppFullScreenTheme" />
|
||||
|
||||
<activity
|
||||
@ -764,16 +724,23 @@
|
||||
android:name=".qa.editor.InsertGameCollectionWrapperActivity"
|
||||
android:screenOrientation="portrait" />
|
||||
|
||||
<activity
|
||||
android:name=".qa.editor.InsertVideoWrapperActivity"
|
||||
android:screenOrientation="portrait" />
|
||||
|
||||
<activity
|
||||
android:name="com.gh.gamecenter.toolbox.ToolBoxBlockActivity"
|
||||
android:screenOrientation="portrait" />
|
||||
|
||||
<activity
|
||||
android:name="com.gh.gamecenter.qa.subject.CommunitySubjectActivity"
|
||||
android:screenOrientation="portrait" />
|
||||
|
||||
<activity
|
||||
android:name="${applicationId}.wxapi.WXEntryActivity"
|
||||
android:exported="true"
|
||||
android:label="@string/app_name"
|
||||
android:launchMode="singleTop"
|
||||
android:screenOrientation="portrait"
|
||||
android:theme="@android:style/Theme.Translucent.NoTitleBar"></activity>
|
||||
|
||||
<!-- <activity-->
|
||||
@ -793,9 +760,22 @@
|
||||
</provider>
|
||||
|
||||
<provider
|
||||
android:name="androidx.work.impl.WorkManagerInitializer"
|
||||
android:authorities="${applicationId}.workmanager-init"
|
||||
tools:node="remove" />
|
||||
android:name="com.gh.gamecenter.provider.GhContentProvider"
|
||||
android:authorities="${applicationId}.provider"
|
||||
android:enabled="true"
|
||||
android:exported="true"/>
|
||||
|
||||
<provider
|
||||
android:name="androidx.startup.InitializationProvider"
|
||||
android:authorities="${applicationId}.androidx-startup"
|
||||
android:exported="false"
|
||||
tools:node="merge">
|
||||
<!-- If you are using androidx.startup to initialize other components -->
|
||||
<meta-data
|
||||
android:name="androidx.work.WorkManagerInitializer"
|
||||
android:value="androidx.startup"
|
||||
tools:node="remove" />
|
||||
</provider>
|
||||
|
||||
<receiver
|
||||
android:name="com.gh.gamecenter.receiver.DownloadReceiver"
|
||||
@ -820,48 +800,6 @@
|
||||
</intent-filter>
|
||||
</receiver>
|
||||
|
||||
<!-- <receiver android:name="com.gh.gamecenter.receiver.UmengMessageReceiver">-->
|
||||
<!-- <intent-filter>-->
|
||||
<!-- <action android:name="com.gh.gamecenter.UMENG" />-->
|
||||
<!-- </intent-filter>-->
|
||||
<!-- </receiver>-->
|
||||
|
||||
<!-- <!–魅族push应用定义消息receiver声明 –>-->
|
||||
<!-- <receiver android:name="com.gh.gamecenter.receiver.UmengMeizuPushReceiver">-->
|
||||
<!-- <intent-filter>-->
|
||||
<!-- <!– 接收push消息 –>-->
|
||||
<!-- <action android:name="com.meizu.flyme.push.intent.MESSAGE" />-->
|
||||
<!-- <!– 接收register消息 –>-->
|
||||
<!-- <action android:name="com.meizu.flyme.push.intent.REGISTER.FEEDBACK" />-->
|
||||
<!-- <!– 接收unregister消息–>-->
|
||||
<!-- <action android:name="com.meizu.flyme.push.intent.UNREGISTER.FEEDBACK" />-->
|
||||
<!-- <!– 兼容低版本Flyme3推送服务配置 –>-->
|
||||
<!-- <action android:name="com.meizu.c2dm.intent.REGISTRATION" />-->
|
||||
<!-- <action android:name="com.meizu.c2dm.intent.RECEIVE" />-->
|
||||
|
||||
<!-- <category android:name="${applicationId}" />-->
|
||||
<!-- </intent-filter>-->
|
||||
<!-- </receiver>-->
|
||||
|
||||
<!-- <receiver-->
|
||||
<!-- android:name="com.gh.common.im.ImReceiver"-->
|
||||
<!-- android:enabled="true">-->
|
||||
<!-- <intent-filter android:priority="2147483647">-->
|
||||
<!-- <action android:name="com.gh.im" />-->
|
||||
<!-- <action android:name="action_finish" />-->
|
||||
<!-- </intent-filter>-->
|
||||
<!-- </receiver>-->
|
||||
|
||||
<!-- <meta-data-->
|
||||
<!-- android:name="com.huawei.hms.client.appid"-->
|
||||
<!-- android:value="@string/huawei_push_appid" />-->
|
||||
|
||||
<!-- <service-->
|
||||
<!-- android:name="com.gh.base.GHUmengNotificationService"-->
|
||||
<!-- android:permission="android.permission.BIND_JOB_SERVICE" />-->
|
||||
|
||||
<!--<service android:name = "com.gh.gamecenter.statistics.AppStaticService" />-->
|
||||
|
||||
<!-- 梦工厂配置 开始 -->
|
||||
<!--<meta-data
|
||||
android:name="MGC_APPID"
|
||||
|
||||
File diff suppressed because one or more lines are too long
1
app/src/main/assets/lottie/loading.json
Normal file
1
app/src/main/assets/lottie/loading.json
Normal file
@ -0,0 +1 @@
|
||||
{"v":"5.6.9","fr":60,"ip":0,"op":76,"w":90,"h":90,"nm":"loading","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":2,"ty":4,"nm":"圆环1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[45,45,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"d":1,"ty":"el","s":{"a":0,"k":[63,63],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.75],"y":[0.833]},"o":{"x":[0.25],"y":[0.167]},"t":28,"s":[0]},{"t":76,"s":[96]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.75],"y":[0.833]},"o":{"x":[0.25],"y":[0.167]},"t":0,"s":[4]},{"t":48,"s":[100]}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.75],"y":[0.712]},"o":{"x":[0.25],"y":[0.288]},"t":0,"s":[-7.2]},{"t":76,"s":[367.2]}],"ix":3},"m":1,"ix":2,"nm":"修剪路径 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.141176477075,0.588235318661,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":9,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"描边 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":0,"op":76,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"圆环2","sr":1,"ks":{"o":{"a":0,"k":40,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[45,45,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"d":1,"ty":"el","s":{"a":0,"k":[63,63],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.75],"y":[0.861]},"o":{"x":[0.25],"y":[0.139]},"t":36,"s":[0]},{"t":76,"s":[96]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.75],"y":[0.806]},"o":{"x":[0.25],"y":[0.194]},"t":0,"s":[4]},{"t":56,"s":[100]}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.75],"y":[0.712]},"o":{"x":[0.25],"y":[0.288]},"t":0,"s":[-7.2]},{"t":76,"s":[367.2]}],"ix":3},"m":1,"ix":2,"nm":"修剪路径 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.141176477075,0.588235318661,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":9,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"描边 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":0,"op":76,"st":0,"bm":0}],"markers":[{"tm":-5940,"cm":"S:[false]","dr":0},{"tm":0.740234375,"cm":"FOCUSED -- TO SELECTION","dr":0}]}
|
||||
1
app/src/main/assets/lottie/switch_turnoff.json
Normal file
1
app/src/main/assets/lottie/switch_turnoff.json
Normal file
@ -0,0 +1 @@
|
||||
{"v":"5.6.9","fr":60,"ip":0,"op":36,"w":120,"h":66,"nm":"开关动画-关闭","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"按钮手柄","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.667,"y":0},"t":0,"s":[87,33,0],"to":[7.682,0,0],"ti":[-13.443,0,0]},{"i":{"x":0.333,"y":1},"o":{"x":0.333,"y":0},"t":18,"s":[31,33,0],"to":[2.306,0,0],"ti":[-1.318,0,0]},{"t":24,"s":[33,33,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[16,16],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","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":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"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":"椭圆形","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":37,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"指示器-on","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.667],"y":[0]},"t":0,"s":[100]},{"t":18,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[33,33,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.667,0.667],"y":[0,0]},"t":0,"s":[6.5,6.5]},{"t":18,"s":[4.5,4.5]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.966666666667,0.966666666667,0.966666666667,0.420000005762],"ix":3},"o":{"a":0,"k":40,"ix":4},"w":{"a":0,"k":1.5,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"描边 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"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":"椭圆形","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":37,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"指示器-off","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[87,33,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.667,0.667],"y":[0,0]},"t":0,"s":[1.5,4]},{"t":18,"s":[1.5,6]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0.75,"ix":4},"nm":"矩形路径 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":5,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":90,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.667],"y":[0]},"t":0,"s":[0]},{"t":18,"s":[100]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"矩形","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":37,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"按钮背景","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[60,33,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"sy":[{"c":{"a":0,"k":[0,0,0,1],"ix":2},"o":{"a":0,"k":5,"ix":3},"a":{"a":0,"k":120,"ix":5},"s":{"a":0,"k":1,"ix":8},"d":{"a":0,"k":0,"ix":6},"ch":{"a":0,"k":100,"ix":7},"bm":{"a":0,"k":5,"ix":1},"no":{"a":0,"k":0,"ix":9},"ty":2,"nm":"内阴影"}],"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[40,22],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":12,"ix":4},"nm":"矩形路径 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.667],"y":[0]},"t":0,"s":[0.141176477075,0.588235318661,1,1]},{"t":18,"s":[0.933333337307,0.933333337307,0.933333337307,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"filling","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0.118,0.006],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"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":"矩形","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":37,"st":0,"bm":0}],"markers":[]}
|
||||
1
app/src/main/assets/lottie/switch_turnon.json
Normal file
1
app/src/main/assets/lottie/switch_turnon.json
Normal file
@ -0,0 +1 @@
|
||||
{"v":"5.6.9","fr":60,"ip":0,"op":36,"w":120,"h":66,"nm":"开关动画-打开","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"按钮手柄","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.667,"y":0},"t":0,"s":[33,33,0],"to":[7.682,0,0],"ti":[-13.443,0,0]},{"i":{"x":0.333,"y":1},"o":{"x":0.333,"y":0},"t":18,"s":[89,33,0],"to":[2.306,0,0],"ti":[-1.318,0,0]},{"t":24,"s":[87,33,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[16,16],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","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":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"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":"椭圆形","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":37,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"指示器-on","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.667],"y":[0]},"t":0,"s":[0]},{"t":18,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[33,33,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.667,0.667],"y":[0,0]},"t":0,"s":[4.5,4.5]},{"t":18,"s":[6.5,6.5]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.966666666667,0.966666666667,0.966666666667,0.420000005762],"ix":3},"o":{"a":0,"k":40,"ix":4},"w":{"a":0,"k":1.5,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"描边 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"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":"椭圆形","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":37,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"指示器-off","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[87,33,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.667,0.667],"y":[0,0]},"t":0,"s":[1.5,6]},{"t":18,"s":[1.5,4]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0.75,"ix":4},"nm":"矩形路径 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":5,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":90,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.667],"y":[0]},"t":0,"s":[100]},{"t":18,"s":[0]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"矩形","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":37,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"按钮背景","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[60,33,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"sy":[{"c":{"a":0,"k":[0,0,0,1],"ix":2},"o":{"a":0,"k":5,"ix":3},"a":{"a":0,"k":120,"ix":5},"s":{"a":0,"k":1,"ix":8},"d":{"a":0,"k":0,"ix":6},"ch":{"a":0,"k":100,"ix":7},"bm":{"a":0,"k":5,"ix":1},"no":{"a":0,"k":0,"ix":9},"ty":2,"nm":"内阴影"}],"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[40,22],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":12,"ix":4},"nm":"矩形路径 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.667],"y":[0]},"t":0,"s":[0.933332979679,0.933332979679,0.933332979679,1]},{"t":18,"s":[0.141176477075,0.588235318661,1,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"filling","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0.118,0.006],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"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":"矩形","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":37,"st":0,"bm":0}],"markers":[]}
|
||||
File diff suppressed because it is too large
Load Diff
@ -280,12 +280,8 @@ RE.replaceAllDfImage = function(imgRuleFlag, gifRuleFlag) {
|
||||
i--;
|
||||
} else {
|
||||
if(img.src.indexOf(".gif") > 0) {
|
||||
if(gifRuleFlag.indexOf(",default") > 0) {
|
||||
img.style.cssText = "max-width: 100%; display:block; margin:8px auto; height: auto;"
|
||||
img.src = img.src.split("?")[0] + gifRuleFlag
|
||||
}
|
||||
img.src = img.src.split("?")[0] + gifRuleFlag
|
||||
} else {
|
||||
img.style.cssText = "max-width: 100%; display:block; margin:8px auto; height: auto;"
|
||||
img.src = img.src.split("?")[0] + imgRuleFlag
|
||||
}
|
||||
}
|
||||
@ -301,7 +297,7 @@ RE.hideShowBigPic = function() {
|
||||
var img = imgs[i];
|
||||
var imageClassName = img.className;
|
||||
if (imageClassName == "image-link" || img.className == "poster") continue;
|
||||
if(img.src.indexOf(",thumbnail") > 0 && img.src.indexOf(".gif") == -1) {
|
||||
if (img.src.indexOf(".gif") == -1) {
|
||||
j++;
|
||||
}
|
||||
}
|
||||
@ -327,7 +323,6 @@ RE.replaceDfImageByUrl = function(imgUrl, imgRuleFlag, gifRuleFlag) {
|
||||
var imageClassName = img.className;
|
||||
if (imageClassName == "image-link" || img.className == "poster") continue;
|
||||
if (img.src.indexOf(imgUrl) != -1) {
|
||||
img.style.cssText = "max-width: 100%; display:block; margin:8px auto; height: auto;"
|
||||
if(img.src.indexOf(".gif") > 0) {
|
||||
img.src = img.src.split("?")[0] + gifRuleFlag
|
||||
} else {
|
||||
|
||||
@ -1,6 +1,9 @@
|
||||
package com.gh.base;
|
||||
|
||||
import static com.gh.common.util.EntranceUtils.KEY_ENTRANCE;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.content.res.ColorStateList;
|
||||
import android.content.res.Configuration;
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.Color;
|
||||
@ -14,6 +17,7 @@ import android.text.TextUtils;
|
||||
import android.util.TypedValue;
|
||||
import android.view.Gravity;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.Window;
|
||||
import android.view.WindowManager;
|
||||
import android.widget.LinearLayout;
|
||||
@ -21,7 +25,9 @@ import android.widget.RelativeLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.app.AppCompatDelegate;
|
||||
import androidx.core.content.ContextCompat;
|
||||
import androidx.core.view.LayoutInflaterCompat;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.lifecycle.Lifecycle;
|
||||
|
||||
@ -33,10 +39,11 @@ import com.gh.common.util.DialogUtils;
|
||||
import com.gh.common.util.DisplayUtils;
|
||||
import com.gh.common.util.EntranceUtils;
|
||||
import com.gh.common.util.EnvHelper;
|
||||
import com.gh.common.util.PackageFlavorHelper;
|
||||
import com.gh.common.util.ExtensionsKt;
|
||||
import com.gh.common.util.MtaHelper;
|
||||
import com.gh.common.util.NetworkUtils;
|
||||
import com.gh.common.util.NightModeUtils;
|
||||
import com.gh.common.util.PackageFlavorHelper;
|
||||
import com.gh.common.util.PackageInstaller;
|
||||
import com.gh.common.util.QuickLoginHelper;
|
||||
import com.gh.common.util.RunningUtils;
|
||||
@ -63,14 +70,11 @@ import org.json.JSONObject;
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.util.List;
|
||||
|
||||
import butterknife.ButterKnife;
|
||||
import kotlin.Pair;
|
||||
import pub.devrel.easypermissions.EasyPermissions;
|
||||
|
||||
import static com.gh.common.util.EntranceUtils.KEY_ENTRANCE;
|
||||
|
||||
/**
|
||||
* 只提供基础的服务(EventBus/ButterKnife/Share/GlobalDialog/Permissions)
|
||||
* 只提供基础的服务(EventBus/Share/GlobalDialog/Permissions)
|
||||
* <p>
|
||||
* 需要工具栏的页面请继承{@link ToolBarActivity}
|
||||
*/
|
||||
@ -83,12 +87,14 @@ public abstract class BaseActivity extends BaseAppCompatActivity implements Easy
|
||||
public final static String PLUGGABLE = "plugin";
|
||||
public final static String SIGNATURE_CONFLICT = "signature_conflict";
|
||||
public final static int ID_ROOT_INDICATOR = 999;
|
||||
public final static int ID_NIGHT_INDICATOR = 998;
|
||||
public final int MAX_BUNDLE_SIZE = 300;
|
||||
|
||||
@NonNull
|
||||
protected String mEntrance;
|
||||
|
||||
private boolean mIsExistLogoutDialog;
|
||||
protected boolean mNightMode;
|
||||
public long startPageTime = 0;
|
||||
|
||||
protected final Handler mBaseHandler = new BaseHandler(this);
|
||||
@ -128,10 +134,13 @@ public abstract class BaseActivity extends BaseAppCompatActivity implements Easy
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
if (PackageFlavorHelper.IS_TEST_FLAVOR && isAutoResetViewBackgroundEnabled()) {
|
||||
LayoutInflaterCompat.setFactory2(getLayoutInflater(), new CustomLayoutInflaterFactory(this));
|
||||
}
|
||||
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
if (useEventBus()) EventBus.getDefault().register(this);
|
||||
if (useButterKnife()) ButterKnife.bind(this);
|
||||
mEntrance = getIntent().getStringExtra(KEY_ENTRANCE);
|
||||
if (TextUtils.isEmpty(mEntrance)) {
|
||||
mEntrance = Constants.ENTRANCE_UNKNOWN;
|
||||
@ -161,12 +170,20 @@ public abstract class BaseActivity extends BaseAppCompatActivity implements Easy
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
mNightMode = NightModeUtils.INSTANCE.isNightMode(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
startPageTime = System.currentTimeMillis();
|
||||
|
||||
if (BuildConfig.IS_NIGHT_MODE_ON
|
||||
&& !NightModeUtils.INSTANCE.getSystemMode()
|
||||
&& mNightMode != NightModeUtils.INSTANCE.isNightMode(this)) {
|
||||
onNightModeChange();
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("ConstantConditions")
|
||||
@ -257,6 +274,9 @@ public abstract class BaseActivity extends BaseAppCompatActivity implements Easy
|
||||
|
||||
screenRootView.addView(view);
|
||||
screenRootView.addView(ll);
|
||||
if (BuildConfig.IS_NIGHT_MODE_ON) {
|
||||
screenRootView.addView(getNightModeIndicatorView());
|
||||
}
|
||||
|
||||
RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) ll.getLayoutParams();
|
||||
lp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
|
||||
@ -264,6 +284,80 @@ public abstract class BaseActivity extends BaseAppCompatActivity implements Easy
|
||||
return screenRootView;
|
||||
}
|
||||
|
||||
private View getNightModeIndicatorView() {
|
||||
LinearLayout ll = new LinearLayout(this);
|
||||
TextView tv = new TextView(this);
|
||||
String envText = NightModeUtils.INSTANCE.isNightMode(this) ? "夜间模式" : "日间模式";
|
||||
tv.setBackground(ContextCompat.getDrawable(this, R.color.theme));
|
||||
tv.setText(envText);
|
||||
tv.setGravity(Gravity.CENTER);
|
||||
tv.setTextColor(Color.WHITE);
|
||||
tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 13);
|
||||
tv.measure(0, 0);
|
||||
tv.setAlpha(NightModeUtils.INSTANCE.isNightMode(this) ? 0.8F : 0.15F);
|
||||
tv.setId(ID_NIGHT_INDICATOR);
|
||||
int height = tv.getMeasuredHeight();
|
||||
int width = tv.getMeasuredWidth();
|
||||
tv.setPadding(DisplayUtils.dip2px(20), 0, DisplayUtils.dip2px(20), 0);
|
||||
ll.setTranslationX(DisplayUtils.dip2px(-20));
|
||||
ll.setRotation(-45);
|
||||
ll.addView(tv);
|
||||
ll.setPadding(0, (width - height) / 2, 0, (width - height) / 2);
|
||||
|
||||
if (PackageFlavorHelper.IS_TEST_FLAVOR) {
|
||||
tv.setOnClickListener(v -> {
|
||||
//切换深色模式
|
||||
String mode;
|
||||
String positive;
|
||||
String negative;
|
||||
if (NightModeUtils.INSTANCE.getSystemMode()) {
|
||||
mode = "跟随系统模式";
|
||||
positive = "普通模式";
|
||||
negative = "深色模式";
|
||||
} else if (NightModeUtils.INSTANCE.getNightMode()) {
|
||||
mode = "深色模式";
|
||||
positive = "跟随系统模式";
|
||||
negative = "普通模式";
|
||||
} else {
|
||||
mode = "普通模式";
|
||||
positive = "跟随系统模式";
|
||||
negative = "深色模式";
|
||||
}
|
||||
DialogHelper.showCenterDialog(this, "选择模式", "当前为 " + mode, positive, negative, () -> {
|
||||
if (NightModeUtils.INSTANCE.getSystemMode()) {
|
||||
NightModeUtils.INSTANCE.setNightMode(false);
|
||||
NightModeUtils.INSTANCE.setSystemMode(false);
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
|
||||
getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_NO);
|
||||
}
|
||||
} else {
|
||||
NightModeUtils.INSTANCE.setSystemMode(true);
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
|
||||
getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
|
||||
}
|
||||
}
|
||||
NightModeUtils.INSTANCE.initNightMode();
|
||||
}, () -> {
|
||||
if (NightModeUtils.INSTANCE.getSystemMode()) {
|
||||
NightModeUtils.INSTANCE.setNightMode(true);
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
|
||||
getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_YES);
|
||||
}
|
||||
} else {
|
||||
boolean nightMode = NightModeUtils.INSTANCE.getNightMode();
|
||||
NightModeUtils.INSTANCE.setNightMode(!NightModeUtils.INSTANCE.getNightMode());
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
|
||||
getDelegate().setLocalNightMode(nightMode ? AppCompatDelegate.MODE_NIGHT_NO : AppCompatDelegate.MODE_NIGHT_YES);
|
||||
}
|
||||
}
|
||||
NightModeUtils.INSTANCE.setSystemMode(false);
|
||||
NightModeUtils.INSTANCE.initNightMode();
|
||||
});
|
||||
});
|
||||
}
|
||||
return ll;
|
||||
}
|
||||
|
||||
@Subscribe(threadMode = ThreadMode.MAIN)
|
||||
public void onEventMainThread(final EBShowDialog showDialog) {
|
||||
if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)
|
||||
@ -294,7 +388,8 @@ public abstract class BaseActivity extends BaseAppCompatActivity implements Easy
|
||||
DialogHelper.showCenterDialog(this, "你的账号已在另外一台设备登录"
|
||||
, StringUtils.buildString("(", model, ")")
|
||||
, "知道了", "重新登录"
|
||||
, () -> {}
|
||||
, () -> {
|
||||
}
|
||||
, () -> {
|
||||
if (SPUtils.getBoolean(Constants.SP_HAS_GET_PHONE_INFO) || NetworkUtils.isOpenMobileData(BaseActivity.this)) {
|
||||
QuickLoginHelper.startLogin(BaseActivity.this, "你的账号已在另外一台设备登录多设备-重新登录");
|
||||
@ -387,10 +482,6 @@ public abstract class BaseActivity extends BaseAppCompatActivity implements Easy
|
||||
return true;
|
||||
}
|
||||
|
||||
protected boolean useButterKnife() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Resources getResources() {
|
||||
Resources resources = super.getResources();
|
||||
@ -451,4 +542,88 @@ public abstract class BaseActivity extends BaseAppCompatActivity implements Easy
|
||||
public Pair<String, String> getBusinessId() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConfigurationChanged(@NonNull Configuration newConfig) {
|
||||
super.onConfigurationChanged(newConfig);
|
||||
onNightModeChange();
|
||||
}
|
||||
|
||||
protected void onNightModeChange() {
|
||||
if (BuildConfig.IS_NIGHT_MODE_ON) {
|
||||
mNightMode = NightModeUtils.INSTANCE.isNightMode(this);
|
||||
TextView tv = findViewById(ID_NIGHT_INDICATOR);
|
||||
if (tv != null) {
|
||||
tv.setText(NightModeUtils.INSTANCE.isNightMode(this) ? "夜间模式" : "日间模式");
|
||||
tv.setAlpha(NightModeUtils.INSTANCE.isNightMode(this) ? 0.8F : 0.15F);
|
||||
}
|
||||
if (isAutoResetViewBackgroundEnabled()) {
|
||||
updateStaticViewBackground(getWindow().getDecorView());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected boolean isAutoResetViewBackgroundEnabled() {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 自动重置部分 view 的背景颜色/资源
|
||||
*
|
||||
* @param view 父 view
|
||||
*/
|
||||
private void updateStaticViewBackground(View view) {
|
||||
if (view instanceof ViewGroup) {
|
||||
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
|
||||
View child = ((ViewGroup) view).getChildAt(i);
|
||||
updateStaticViewBackground(child);
|
||||
}
|
||||
}
|
||||
|
||||
String backgroundString = (String) view.getTag(CustomLayoutInflaterFactory.TAG_BACKGROUND_ID);
|
||||
String textColorString = (String) view.getTag(CustomLayoutInflaterFactory.TAG_TEXT_COLOR_ID);
|
||||
if (backgroundString != null) {
|
||||
if (backgroundString.startsWith("#")) return;
|
||||
int backgroundId = Integer.parseInt(
|
||||
backgroundString
|
||||
.replace("@", "")
|
||||
.replace("?", "")
|
||||
);
|
||||
|
||||
if (backgroundId != 0) {
|
||||
try {
|
||||
TypedValue value = new TypedValue();
|
||||
getResources().getValue(backgroundId, value, true);
|
||||
|
||||
if (value.type >= TypedValue.TYPE_FIRST_COLOR_INT && value.type <= TypedValue.TYPE_LAST_COLOR_INT) {
|
||||
view.setBackgroundColor(ExtensionsKt.toColor(backgroundId, this));
|
||||
} else {
|
||||
view.setBackground(ExtensionsKt.toDrawable(backgroundId, this));
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (textColorString != null && view instanceof TextView) {
|
||||
if (textColorString.startsWith("#")) return;
|
||||
int textColorId = Integer.parseInt(
|
||||
textColorString
|
||||
.replace("@", "")
|
||||
.replace("?", "")
|
||||
);
|
||||
|
||||
if (textColorId != 0) {
|
||||
try {
|
||||
final ColorStateList colorStateList = ContextCompat.getColorStateList(this, textColorId);
|
||||
((TextView) view).setTextColor(colorStateList);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -15,9 +15,9 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.core.content.ContextCompat;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.viewpager.widget.ViewPager;
|
||||
import butterknife.BindView;
|
||||
|
||||
/**
|
||||
* Created by khy on 15/03/18.
|
||||
@ -27,14 +27,9 @@ public abstract class BaseActivity_TabLayout extends ToolBarActivity implements
|
||||
|
||||
public static final String PAGE_INDEX = "PAGE_INDEX";
|
||||
|
||||
@BindView(R.id.activity_tab_layout)
|
||||
protected TabLayout mTabLayout;
|
||||
@BindView(R.id.activity_view_pager)
|
||||
protected NoScrollableViewPager mViewPager;
|
||||
@BindView(R.id.activity_tab_indicator)
|
||||
protected TabIndicatorView mTabIndicatorView;
|
||||
@Nullable
|
||||
@BindView(R.id.dividerLine)
|
||||
protected View mDividerLineView;
|
||||
|
||||
protected List<Fragment> mFragmentsList;
|
||||
@ -74,6 +69,12 @@ public abstract class BaseActivity_TabLayout extends ToolBarActivity implements
|
||||
@Override
|
||||
public void onCreate(@Nullable Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
mTabLayout = findViewById(R.id.activity_tab_layout);
|
||||
mViewPager = findViewById(R.id.activity_view_pager);
|
||||
mTabIndicatorView = findViewById(R.id.activity_tab_indicator);
|
||||
mDividerLineView = findViewById(R.id.dividerLine);
|
||||
|
||||
if (getIntent() != null) mCheckedIndex = getIntent().getIntExtra(PAGE_INDEX, 0);
|
||||
mTabTitleList = new ArrayList<>();
|
||||
initTabTitleList(mTabTitleList);
|
||||
@ -98,7 +99,7 @@ public abstract class BaseActivity_TabLayout extends ToolBarActivity implements
|
||||
String tabTitle = tab.getText() != null ? tab.getText().toString() : "";
|
||||
View tabView = provideTabView(i, tabTitle);
|
||||
if (tabView == null)
|
||||
tabView = BaseFragment_TabLayout.createDefaultTabCustomView(tabTitle);
|
||||
tabView = BaseFragment_TabLayout.createDefaultTabCustomView(this, tabTitle);
|
||||
tab.setCustomView(tabView);
|
||||
}
|
||||
|
||||
@ -133,4 +134,22 @@ public abstract class BaseActivity_TabLayout extends ToolBarActivity implements
|
||||
public void onPageScrollStateChanged(int state) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onNightModeChange() {
|
||||
super.onNightModeChange();
|
||||
View container = findViewById(R.id.activity_tab_container);
|
||||
if (container != null) {
|
||||
container.setBackgroundColor(ContextCompat.getColor(this, R.color.background_white));
|
||||
for (int i = 0; i < mTabLayout.getTabCount(); i++) {
|
||||
TabLayout.Tab tab = mTabLayout.getTabAt(i);
|
||||
if (tab != null) {
|
||||
BaseFragment_TabLayout.updateTabStyle(tab, tab.isSelected());
|
||||
}
|
||||
}
|
||||
}
|
||||
if (mDividerLineView != null) {
|
||||
mDividerLineView.setBackgroundColor(ContextCompat.getColor(this, R.color.divider));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -3,8 +3,6 @@ package com.gh.base;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import android.view.View;
|
||||
|
||||
import butterknife.ButterKnife;
|
||||
|
||||
/**
|
||||
* 目前仅提供butterknife bind方法
|
||||
*
|
||||
@ -20,7 +18,6 @@ public abstract class BaseRecyclerViewHolder<T> extends RecyclerView.ViewHolder
|
||||
|
||||
public BaseRecyclerViewHolder(View itemView) {
|
||||
super(itemView);
|
||||
ButterKnife.bind(this, itemView);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -14,17 +14,13 @@ import android.widget.CheckBox
|
||||
import android.widget.FrameLayout
|
||||
import android.widget.TextView
|
||||
import androidx.lifecycle.Observer
|
||||
import butterknife.OnClick
|
||||
import com.gh.common.AppExecutor
|
||||
import com.gh.common.runOnIoThread
|
||||
import com.gh.common.util.*
|
||||
import com.gh.common.view.RichEditor
|
||||
import com.gh.gamecenter.CropImageActivity
|
||||
import com.gh.gamecenter.R
|
||||
import com.gh.gamecenter.entity.GameEntity
|
||||
import com.gh.gamecenter.entity.GamesCollectionEntity
|
||||
import com.gh.gamecenter.entity.LocalVideoEntity
|
||||
import com.gh.gamecenter.entity.VideoEntity
|
||||
import com.gh.gamecenter.entity.*
|
||||
import com.gh.gamecenter.qa.editor.*
|
||||
import com.gh.gamecenter.qa.entity.AnswerEntity
|
||||
import com.gh.gamecenter.qa.entity.ArticleEntity
|
||||
@ -37,7 +33,6 @@ import com.lightgame.utils.Util_System_Keyboard
|
||||
import com.lightgame.utils.Utils
|
||||
import com.lightgame.view.CheckableImageView
|
||||
import io.reactivex.disposables.Disposable
|
||||
import kotterknife.bindView
|
||||
import org.json.JSONArray
|
||||
import org.json.JSONObject
|
||||
import java.io.File
|
||||
@ -45,30 +40,30 @@ import java.io.File
|
||||
abstract class BaseRichEditorActivity<VM : BaseRichEditorViewModel> : ToolBarActivity(),
|
||||
KeyboardHeightObserver, UploadVideoListener {
|
||||
|
||||
val mRichEditor by bindView<RichEditor>(R.id.rich_editor)
|
||||
lateinit var mRichEditor: RichEditor
|
||||
|
||||
private val mEditorTextNumTv by bindView<TextView>(R.id.editorTextNumTv)
|
||||
private val mEditorFont by bindView<CheckableImageView>(R.id.editor_font)
|
||||
private val mEditorLink by bindView<CheckableImageView>(R.id.editor_link)
|
||||
private lateinit var mEditorTextNumTv: TextView
|
||||
private lateinit var mEditorFont: CheckableImageView
|
||||
private lateinit var mEditorLink: CheckableImageView
|
||||
|
||||
private val mEditorFontBold by bindView<CheckableImageView>(R.id.editor_font_bold)
|
||||
private val mEditorFontItalic by bindView<CheckableImageView>(R.id.editor_font_italic)
|
||||
private val mEditorFontStrikeThrough by bindView<CheckableImageView>(R.id.editor_font_strikethrough)
|
||||
private val mEditorFontUnderline by bindView<CheckableImageView>(R.id.editor_font_underline)
|
||||
private val mEditorParagraphH1 by bindView<CheckableImageView>(R.id.editor_paragraph_h1)
|
||||
private val mEditorParagraphH2 by bindView<CheckableImageView>(R.id.editor_paragraph_h2)
|
||||
private val mEditorParagraphH3 by bindView<CheckableImageView>(R.id.editor_paragraph_h3)
|
||||
private val mEditorParagraphH4 by bindView<CheckableImageView>(R.id.editor_paragraph_h4)
|
||||
private val mEditorParagraphQuote by bindView<CheckableImageView>(R.id.editor_paragraph_quote)
|
||||
private val mEditorFontContainer by bindView<View>(R.id.editor_font_container)
|
||||
private val mEditorParagraphContainer by bindView<View>(R.id.editor_paragraph_container)
|
||||
private val mEditorLinkContainer by bindView<View>(R.id.editor_link_container)
|
||||
private val mEditorInsertDetailContainer by bindView<View>(R.id.editor_insert_detail_container)
|
||||
private val mTagsContainer by bindView<FrameLayout>(R.id.tagsContainer)
|
||||
private val mUploadVideoGuideContainer by bindView<View>(R.id.uploadVideoGuideContainer)
|
||||
protected val mOriginalCb by bindView<CheckBox>(R.id.originalCb)
|
||||
private val mOriginalTipsContainer by bindView<View>(R.id.originalTipsContainer)
|
||||
private val mOriginalTipsClose by bindView<TextView>(R.id.originalTipsClose)
|
||||
private lateinit var mEditorFontBold: CheckableImageView
|
||||
private lateinit var mEditorFontItalic: CheckableImageView
|
||||
private lateinit var mEditorFontStrikeThrough: CheckableImageView
|
||||
private lateinit var mEditorFontUnderline: CheckableImageView
|
||||
private lateinit var mEditorParagraphH1: CheckableImageView
|
||||
private lateinit var mEditorParagraphH2: CheckableImageView
|
||||
private lateinit var mEditorParagraphH3: CheckableImageView
|
||||
private lateinit var mEditorParagraphH4: CheckableImageView
|
||||
private lateinit var mEditorParagraphQuote: CheckableImageView
|
||||
private lateinit var mEditorFontContainer: View
|
||||
private lateinit var mEditorParagraphContainer: View
|
||||
private lateinit var mEditorLinkContainer: View
|
||||
private lateinit var mEditorInsertDetailContainer: View
|
||||
private lateinit var mTagsContainer: FrameLayout
|
||||
private lateinit var mUploadVideoGuideContainer: View
|
||||
protected lateinit var mOriginalCb: CheckBox
|
||||
private lateinit var mOriginalTipsContainer: View
|
||||
private lateinit var mOriginalTipsClose: TextView
|
||||
|
||||
private var mCurrentParagraphStyle = ""
|
||||
private var mIsExtendedKeyboardShow = false
|
||||
@ -123,10 +118,8 @@ abstract class BaseRichEditorActivity<VM : BaseRichEditorViewModel> : ToolBarAct
|
||||
REQUEST_CODE_IMAGE -> {
|
||||
if (data != null) mViewModel.uploadPic(data)
|
||||
}
|
||||
INSERT_VIDEO_CODE -> {
|
||||
val localVideoList =
|
||||
data?.getParcelableArrayListExtra<LocalVideoEntity>(LocalVideoEntity::class.java.name)
|
||||
?: arrayListOf()
|
||||
INSERT_MEDIA_VIDEO_CODE -> {
|
||||
val localVideoList = data?.getParcelableArrayListExtra<LocalVideoEntity>(LocalVideoEntity::class.java.name) ?: arrayListOf()
|
||||
if (localVideoList.isNotEmpty()) {
|
||||
mRichEditor.focusEditor()
|
||||
uploadVideo(localVideoList)
|
||||
@ -138,6 +131,14 @@ abstract class BaseRichEditorActivity<VM : BaseRichEditorViewModel> : ToolBarAct
|
||||
mViewModel.uploadPoster(imagePath)
|
||||
}
|
||||
}
|
||||
INSERT_VIDEO_CODE -> {
|
||||
val videoEntity = data?.getParcelableExtra<MyVideoEntity>(MyVideoEntity::class.java.simpleName)
|
||||
if (videoEntity != null) {
|
||||
mRichEditor.focusEditor()
|
||||
insertData = EditorInsertEntity.transform(videoEntity)
|
||||
mRichEditor.insertCustomStyleLink(insertData)
|
||||
}
|
||||
}
|
||||
}
|
||||
closeExtendedKeyboard()
|
||||
AppExecutor.uiExecutor.executeWithDelay(Runnable {
|
||||
@ -170,9 +171,36 @@ abstract class BaseRichEditorActivity<VM : BaseRichEditorViewModel> : ToolBarAct
|
||||
|
||||
}
|
||||
|
||||
private fun findView() {
|
||||
mRichEditor = findViewById(R.id.rich_editor)
|
||||
mEditorTextNumTv = findViewById(R.id.editorTextNumTv)
|
||||
mEditorFont = findViewById(R.id.editor_font)
|
||||
mEditorLink = findViewById(R.id.editor_link)
|
||||
mEditorFontBold = findViewById(R.id.editor_font_bold)
|
||||
mEditorFontItalic = findViewById(R.id.editor_font_italic)
|
||||
mEditorFontStrikeThrough = findViewById(R.id.editor_font_strikethrough)
|
||||
mEditorFontUnderline = findViewById(R.id.editor_font_underline)
|
||||
mEditorParagraphH1 = findViewById(R.id.editor_paragraph_h1)
|
||||
mEditorParagraphH2 = findViewById(R.id.editor_paragraph_h2)
|
||||
mEditorParagraphH3 = findViewById(R.id.editor_paragraph_h3)
|
||||
mEditorParagraphH4 = findViewById(R.id.editor_paragraph_h4)
|
||||
mEditorParagraphQuote = findViewById(R.id.editor_paragraph_quote)
|
||||
mEditorFontContainer = findViewById(R.id.editor_font_container)
|
||||
mEditorParagraphContainer = findViewById(R.id.editor_paragraph_container)
|
||||
mEditorLinkContainer = findViewById(R.id.editor_link_container)
|
||||
mEditorInsertDetailContainer = findViewById(R.id.editor_insert_detail_container)
|
||||
mTagsContainer = findViewById(R.id.tagsContainer)
|
||||
mUploadVideoGuideContainer = findViewById(R.id.uploadVideoGuideContainer)
|
||||
mOriginalCb = findViewById(R.id.originalCb)
|
||||
mOriginalTipsContainer = findViewById(R.id.originalTipsContainer)
|
||||
mOriginalTipsClose = findViewById(R.id.originalTipsClose)
|
||||
}
|
||||
|
||||
@SuppressLint("AddJavascriptInterface", "ClickableViewAccessibility")
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
findView()
|
||||
onRichClick()
|
||||
mViewModel = provideViewModel()
|
||||
mViewModel.setUploadVideoListener(this)
|
||||
mKeyboardHeightProvider = KeyboardHeightProvider(this)
|
||||
@ -247,161 +275,156 @@ abstract class BaseRichEditorActivity<VM : BaseRichEditorViewModel> : ToolBarAct
|
||||
mEditorFont.isEnabled = isEnabled
|
||||
}
|
||||
|
||||
@OnClick(
|
||||
R.id.editor_image, R.id.editor_font, R.id.editor_link, R.id.editor_font_underline,
|
||||
R.id.editor_font_bold, R.id.editor_font_italic, R.id.editor_font_strikethrough,
|
||||
R.id.editor_paragraph_h1, R.id.editor_paragraph_h2, R.id.editor_paragraph_h3,
|
||||
R.id.editor_paragraph_h4, R.id.editor_font_container, R.id.editor_paragraph_container,
|
||||
R.id.editor_paragraph_quote, R.id.editor_link_answer, R.id.editor_link_article,
|
||||
R.id.editor_link_game, R.id.editor_link_video, R.id.uploadVideoGuideClose,
|
||||
R.id.originalTipsClose, R.id.editor_link_game_collection
|
||||
)
|
||||
fun onRichClick(view: View) {
|
||||
when (view.id) {
|
||||
R.id.editor_font -> {
|
||||
controlEditorFontContainer()
|
||||
private fun onRichClick() {
|
||||
mEditorFont.setOnClickListener {
|
||||
controlEditorFontContainer()
|
||||
}
|
||||
mEditorLink.setOnClickListener {
|
||||
controlEditorLinkContainer()
|
||||
}
|
||||
mEditorFontBold.setOnClickListener {
|
||||
mEditorFontBold.isChecked = !mEditorFontBold.isChecked
|
||||
mRichEditor.setBold()
|
||||
if (mEditorFontBold.isChecked) {
|
||||
MtaHelper.onEvent(mtaEventName(), "文字样式", "文字样式-加粗")
|
||||
}
|
||||
R.id.editor_link -> {
|
||||
controlEditorLinkContainer()
|
||||
}
|
||||
mEditorFontItalic.setOnClickListener {
|
||||
mEditorFontItalic.isChecked = !mEditorFontItalic.isChecked
|
||||
mRichEditor.setItalic()
|
||||
if (mEditorFontItalic.isChecked) {
|
||||
MtaHelper.onEvent(mtaEventName(), "文字样式", "文字样式-斜体")
|
||||
}
|
||||
R.id.editor_font_bold -> {
|
||||
mEditorFontBold.isChecked = !mEditorFontBold.isChecked
|
||||
mRichEditor.setBold()
|
||||
if (mEditorFontBold.isChecked) {
|
||||
MtaHelper.onEvent(mtaEventName(), "文字样式", "文字样式-加粗")
|
||||
}
|
||||
}
|
||||
R.id.editor_font_italic -> {
|
||||
mEditorFontItalic.isChecked = !mEditorFontItalic.isChecked
|
||||
mRichEditor.setItalic()
|
||||
if (mEditorFontItalic.isChecked) {
|
||||
MtaHelper.onEvent(mtaEventName(), "文字样式", "文字样式-斜体")
|
||||
}
|
||||
}
|
||||
R.id.editor_font_strikethrough -> {
|
||||
mEditorFontStrikeThrough.isChecked = !mEditorFontStrikeThrough.isChecked
|
||||
mRichEditor.setStrikeThrough()
|
||||
}
|
||||
mEditorFontStrikeThrough.setOnClickListener {
|
||||
mEditorFontStrikeThrough.isChecked = !mEditorFontStrikeThrough.isChecked
|
||||
mRichEditor.setStrikeThrough()
|
||||
|
||||
if (mEditorFontStrikeThrough.isChecked) {
|
||||
MtaHelper.onEvent(mtaEventName(), "文字样式", "文字样式-删除线")
|
||||
}
|
||||
if (mEditorFontStrikeThrough.isChecked) {
|
||||
MtaHelper.onEvent(mtaEventName(), "文字样式", "文字样式-删除线")
|
||||
}
|
||||
R.id.editor_font_underline -> {
|
||||
mEditorFontUnderline.isChecked = !mEditorFontUnderline.isChecked
|
||||
mRichEditor.setUnderline()
|
||||
}
|
||||
mEditorFontUnderline.setOnClickListener {
|
||||
mEditorFontUnderline.isChecked = !mEditorFontUnderline.isChecked
|
||||
mRichEditor.setUnderline()
|
||||
|
||||
if (mEditorFontUnderline.isChecked) {
|
||||
MtaHelper.onEvent(mtaEventName(), "文字样式", "文字样式-下滑线")
|
||||
}
|
||||
if (mEditorFontUnderline.isChecked) {
|
||||
MtaHelper.onEvent(mtaEventName(), "文字样式", "文字样式-下滑线")
|
||||
}
|
||||
R.id.editor_paragraph_h1 -> {
|
||||
if (mEditorParagraphH1.isChecked) {
|
||||
mRichEditor.formatBlock()
|
||||
} else {
|
||||
MtaHelper.onEvent(mtaEventName(), "段落样式", "段落样式-1级标题")
|
||||
mRichEditor.setHeading(1)
|
||||
}
|
||||
mEditorParagraphH1.isChecked = !mEditorParagraphH1.isChecked
|
||||
}
|
||||
mEditorParagraphH1.setOnClickListener {
|
||||
if (mEditorParagraphH1.isChecked) {
|
||||
mRichEditor.formatBlock()
|
||||
} else {
|
||||
MtaHelper.onEvent(mtaEventName(), "段落样式", "段落样式-1级标题")
|
||||
mRichEditor.setHeading(1)
|
||||
}
|
||||
R.id.editor_paragraph_h2 -> {
|
||||
if (mEditorParagraphH2.isChecked) {
|
||||
mRichEditor.formatBlock()
|
||||
} else {
|
||||
MtaHelper.onEvent(mtaEventName(), "段落样式", "段落样式-2级标题")
|
||||
mRichEditor.setHeading(2)
|
||||
}
|
||||
mEditorParagraphH2.isChecked = !mEditorParagraphH2.isChecked
|
||||
mEditorParagraphH1.isChecked = !mEditorParagraphH1.isChecked
|
||||
}
|
||||
mEditorParagraphH2.setOnClickListener {
|
||||
if (mEditorParagraphH2.isChecked) {
|
||||
mRichEditor.formatBlock()
|
||||
} else {
|
||||
MtaHelper.onEvent(mtaEventName(), "段落样式", "段落样式-2级标题")
|
||||
mRichEditor.setHeading(2)
|
||||
}
|
||||
R.id.editor_paragraph_h3 -> {
|
||||
if (mEditorParagraphH3.isChecked) {
|
||||
mRichEditor.formatBlock()
|
||||
} else {
|
||||
MtaHelper.onEvent(mtaEventName(), "段落样式", "段落样式-3级标题")
|
||||
mRichEditor.setHeading(3)
|
||||
}
|
||||
mEditorParagraphH3.isChecked = !mEditorParagraphH3.isChecked
|
||||
mEditorParagraphH2.isChecked = !mEditorParagraphH2.isChecked
|
||||
}
|
||||
mEditorParagraphH3.setOnClickListener {
|
||||
if (mEditorParagraphH3.isChecked) {
|
||||
mRichEditor.formatBlock()
|
||||
} else {
|
||||
MtaHelper.onEvent(mtaEventName(), "段落样式", "段落样式-3级标题")
|
||||
mRichEditor.setHeading(3)
|
||||
}
|
||||
R.id.editor_paragraph_h4 -> {
|
||||
if (mEditorParagraphH4.isChecked) {
|
||||
mRichEditor.formatBlock()
|
||||
} else {
|
||||
MtaHelper.onEvent(mtaEventName(), "段落样式", "段落样式-4级标题")
|
||||
mRichEditor.setHeading(4)
|
||||
}
|
||||
mEditorParagraphH4.isChecked = !mEditorParagraphH4.isChecked
|
||||
mEditorParagraphH3.isChecked = !mEditorParagraphH3.isChecked
|
||||
}
|
||||
mEditorParagraphH4.setOnClickListener {
|
||||
if (mEditorParagraphH4.isChecked) {
|
||||
mRichEditor.formatBlock()
|
||||
} else {
|
||||
MtaHelper.onEvent(mtaEventName(), "段落样式", "段落样式-4级标题")
|
||||
mRichEditor.setHeading(4)
|
||||
}
|
||||
R.id.editor_paragraph_quote -> {
|
||||
if (mEditorParagraphQuote.isChecked) {
|
||||
mRichEditor.formatBlock()
|
||||
} else {
|
||||
MtaHelper.onEvent(mtaEventName(), "段落样式", "段落样式-引用")
|
||||
mRichEditor.setBlockquote()
|
||||
}
|
||||
mEditorParagraphQuote.isChecked = !mEditorParagraphQuote.isChecked
|
||||
mEditorParagraphH4.isChecked = !mEditorParagraphH4.isChecked
|
||||
}
|
||||
mEditorParagraphQuote.setOnClickListener {
|
||||
if (mEditorParagraphQuote.isChecked) {
|
||||
mRichEditor.formatBlock()
|
||||
} else {
|
||||
MtaHelper.onEvent(mtaEventName(), "段落样式", "段落样式-引用")
|
||||
mRichEditor.setBlockquote()
|
||||
}
|
||||
R.id.editor_link_answer -> {
|
||||
MtaHelper.onEvent(mtaEventName(), "插入链接", "插入链接-回答")
|
||||
startActivityForResult(
|
||||
InsertAnswerWrapperActivity.getIntent(this),
|
||||
INSERT_ANSWER_CODE
|
||||
mEditorParagraphQuote.isChecked = !mEditorParagraphQuote.isChecked
|
||||
}
|
||||
findViewById<View>(R.id.editor_link_answer).setOnClickListener {
|
||||
MtaHelper.onEvent(mtaEventName(), "插入链接", "插入链接-回答")
|
||||
startActivityForResult(
|
||||
InsertAnswerWrapperActivity.getIntent(this),
|
||||
INSERT_ANSWER_CODE
|
||||
)
|
||||
}
|
||||
findViewById<View>(R.id.editor_link_article).setOnClickListener {
|
||||
MtaHelper.onEvent(mtaEventName(), "插入链接", "插入链接-文章")
|
||||
startActivityForResult(
|
||||
InsertArticleWrapperActivity.getIntent(this),
|
||||
INSERT_ARTICLE_CODE
|
||||
)
|
||||
}
|
||||
findViewById<View>(R.id.editor_link_game).setOnClickListener {
|
||||
MtaHelper.onEvent(mtaEventName(), "插入链接", "插入链接-游戏")
|
||||
startActivityForResult(
|
||||
GameActivity.getIntent(this, GameActivity.INSERT_GAME_TITLE),
|
||||
INSERT_GAME_CODE
|
||||
)
|
||||
}
|
||||
findViewById<View>(R.id.editor_link_video).setOnClickListener {
|
||||
startActivityForResult(
|
||||
InsertVideoWrapperActivity.getIntent(this),
|
||||
INSERT_VIDEO_CODE
|
||||
)
|
||||
}
|
||||
findViewById<View>(R.id.editor_link_game_collection).setOnClickListener {
|
||||
startActivityForResult(
|
||||
InsertGameCollectionWrapperActivity.getIntent(this),
|
||||
INSERT_GAME_COLLECTION_CODE
|
||||
)
|
||||
}
|
||||
findViewById<View>(R.id.editor_video).setOnClickListener {
|
||||
chooseVideo()
|
||||
}
|
||||
findViewById<View>(R.id.editor_image).setOnClickListener {
|
||||
if (!mAgreePostPic && !NetworkUtils.isWifiOr4GOr3GConnected(this)) {
|
||||
mAgreePostPic = true
|
||||
DialogHelper.showDialog(
|
||||
this,
|
||||
"警告",
|
||||
"当前使用移动网络,上传图片会消耗手机流量",
|
||||
"我知道了", "", { chooseImage() },
|
||||
extraConfig = DialogHelper.Config(centerTitle = true, centerContent = true)
|
||||
)
|
||||
return@setOnClickListener
|
||||
}
|
||||
R.id.editor_link_article -> {
|
||||
MtaHelper.onEvent(mtaEventName(), "插入链接", "插入链接-文章")
|
||||
startActivityForResult(
|
||||
InsertArticleWrapperActivity.getIntent(this),
|
||||
INSERT_ARTICLE_CODE
|
||||
)
|
||||
chooseImage()
|
||||
NewLogUtils.logChooseMedia(
|
||||
"view_media",
|
||||
if (mtaEventName() == "提问帖") "提问帖" else "帖子",
|
||||
"图片"
|
||||
)
|
||||
}
|
||||
findViewById<View>(R.id.uploadVideoGuideClose).setOnClickListener {
|
||||
hideUploadVideoGuide()
|
||||
if (mGuideDisposable != null && !mGuideDisposable!!.isDisposed) {
|
||||
mGuideDisposable!!.dispose()
|
||||
mGuideDisposable = null
|
||||
}
|
||||
R.id.editor_link_game -> {
|
||||
MtaHelper.onEvent(mtaEventName(), "插入链接", "插入链接-游戏")
|
||||
startActivityForResult(
|
||||
GameActivity.getIntent(this, GameActivity.INSERT_GAME_TITLE),
|
||||
INSERT_GAME_CODE
|
||||
)
|
||||
}
|
||||
R.id.editor_link_game_collection -> {
|
||||
startActivityForResult(
|
||||
InsertGameCollectionWrapperActivity.getIntent(this),
|
||||
INSERT_GAME_COLLECTION_CODE
|
||||
)
|
||||
}
|
||||
R.id.editor_link_video -> {
|
||||
chooseVideo()
|
||||
}
|
||||
R.id.editor_image -> {
|
||||
if (!mAgreePostPic && !NetworkUtils.isWifiOr4GOr3GConnected(this)) {
|
||||
mAgreePostPic = true
|
||||
DialogHelper.showDialog(
|
||||
this,
|
||||
"警告",
|
||||
"当前使用移动网络,上传图片会消耗手机流量",
|
||||
"我知道了", "", { chooseImage() },
|
||||
extraConfig = DialogHelper.Config(centerTitle = true, centerContent = true)
|
||||
)
|
||||
return
|
||||
}
|
||||
chooseImage()
|
||||
NewLogUtils.logChooseMedia(
|
||||
"view_media",
|
||||
if (mtaEventName() == "提问帖") "提问帖" else "帖子",
|
||||
"图片"
|
||||
)
|
||||
}
|
||||
R.id.uploadVideoGuideClose -> {
|
||||
hideUploadVideoGuide()
|
||||
if (mGuideDisposable != null && !mGuideDisposable!!.isDisposed) {
|
||||
mGuideDisposable!!.dispose()
|
||||
mGuideDisposable = null
|
||||
}
|
||||
}
|
||||
R.id.originalTipsClose -> {
|
||||
val animator = ObjectAnimator.ofFloat(mOriginalTipsContainer, "alpha", 1f, 0f).setDuration(200)
|
||||
animator.doOnEnd {
|
||||
mOriginalTipsContainer.visibility = View.GONE
|
||||
}
|
||||
animator.start()
|
||||
}
|
||||
findViewById<View>(R.id.originalTipsClose).setOnClickListener {
|
||||
val animator = ObjectAnimator.ofFloat(mOriginalTipsContainer, "alpha", 1f, 0f).setDuration(200)
|
||||
animator.doOnEnd {
|
||||
mOriginalTipsContainer.visibility = View.GONE
|
||||
}
|
||||
animator.start()
|
||||
}
|
||||
}
|
||||
|
||||
@ -423,7 +446,7 @@ abstract class BaseRichEditorActivity<VM : BaseRichEditorViewModel> : ToolBarAct
|
||||
LocalMediaActivity.ChooseType.VIDEO,
|
||||
maxChooseCount,
|
||||
if (mtaEventName() == "提问帖") "发提问帖" else "发帖子"
|
||||
), INSERT_VIDEO_CODE
|
||||
), INSERT_MEDIA_VIDEO_CODE
|
||||
)
|
||||
NewLogUtils.logChooseMedia(
|
||||
"view_media",
|
||||
@ -727,11 +750,12 @@ abstract class BaseRichEditorActivity<VM : BaseRichEditorViewModel> : ToolBarAct
|
||||
const val INSERT_ARTICLE_CODE = 412
|
||||
const val INSERT_GAME_CODE = 413
|
||||
const val INSERT_GAME_COLLECTION_CODE = 414
|
||||
const val INSERT_VIDEO_CODE = 415
|
||||
const val MAX_INPUT_TEXT_NUM = 10000
|
||||
const val MAX_MEDIA_COUNT = 20
|
||||
|
||||
const val REQUEST_CODE_IMAGE = 120
|
||||
const val INSERT_VIDEO_CODE = 121
|
||||
const val INSERT_MEDIA_VIDEO_CODE = 121
|
||||
const val REQUEST_CODE_IMAGE_CROP = 122
|
||||
}
|
||||
}
|
||||
53
app/src/main/java/com/gh/base/CustomLayoutInflaterFactory.kt
Normal file
53
app/src/main/java/com/gh/base/CustomLayoutInflaterFactory.kt
Normal file
@ -0,0 +1,53 @@
|
||||
package com.gh.base
|
||||
|
||||
import android.content.Context
|
||||
import android.util.AttributeSet
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import com.gh.gamecenter.R
|
||||
|
||||
class CustomLayoutInflaterFactory(
|
||||
private val mAppCompatActivity: AppCompatActivity
|
||||
) : LayoutInflater.Factory2 {
|
||||
|
||||
override fun onCreateView(
|
||||
parent: View?,
|
||||
name: String,
|
||||
context: Context,
|
||||
attrs: AttributeSet
|
||||
): View? {
|
||||
|
||||
val view: View?
|
||||
|
||||
try {
|
||||
view = mAppCompatActivity.delegate.createView(parent, name, context, attrs)
|
||||
?: mAppCompatActivity.onCreateView(parent, name, context, attrs)
|
||||
?: mAppCompatActivity.layoutInflater.createView(name, null, attrs)
|
||||
} catch (e: Exception) {
|
||||
return null
|
||||
}
|
||||
|
||||
val n = attrs.attributeCount
|
||||
for (i in 0 until n) {
|
||||
val attributeName = attrs.getAttributeName(i).toString()
|
||||
if (attributeName.contains("background")) {
|
||||
view?.setTag(TAG_BACKGROUND_ID, attrs.getAttributeValue(i))
|
||||
} else if (attributeName.contains("textColor")) {
|
||||
view?.setTag(TAG_TEXT_COLOR_ID, attrs.getAttributeValue(i))
|
||||
}
|
||||
}
|
||||
|
||||
return view
|
||||
}
|
||||
|
||||
override fun onCreateView(name: String, context: Context, attrs: AttributeSet): View? {
|
||||
return mAppCompatActivity.onCreateView(name, context, attrs)
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val TAG_BACKGROUND_ID = R.string.background_id
|
||||
const val TAG_TEXT_COLOR_ID = R.string.text_color_id
|
||||
}
|
||||
|
||||
}
|
||||
@ -91,7 +91,7 @@ class GlobalActivityLifecycleObserver : Application.ActivityLifecycleCallbacks {
|
||||
}
|
||||
|
||||
override fun onActivityDestroyed(activity: Activity) {
|
||||
// do nothing
|
||||
AppManager.getInstance().finishActivity(activity)
|
||||
}
|
||||
|
||||
}
|
||||
@ -13,6 +13,7 @@ import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.Window;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
@ -21,6 +22,7 @@ import androidx.annotation.Nullable;
|
||||
import androidx.annotation.StringRes;
|
||||
import androidx.appcompat.widget.ActionMenuView;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
import androidx.core.content.ContextCompat;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.lifecycle.ViewModelProviders;
|
||||
|
||||
@ -310,4 +312,25 @@ public abstract class ToolBarActivity extends BaseActivity implements ToolbarCon
|
||||
mToolbarContainer.setVisibility(isHide ? View.GONE : View.VISIBLE);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onNightModeChange() {
|
||||
super.onNightModeChange();
|
||||
if (mToolbar != null) {
|
||||
mToolbar.setBackgroundColor(ContextCompat.getColor(this, R.color.background_white));
|
||||
}
|
||||
if (mBackBtn != null) {
|
||||
if (mBackBtn instanceof ImageView) {
|
||||
((ImageView) mBackBtn).setImageDrawable(ContextCompat.getDrawable(this, R.drawable.ic_bar_back));
|
||||
} else if (mBackBtn instanceof TextView) {
|
||||
((TextView) mBackBtn).setTextColor(ContextCompat.getColor(this, R.color.text_subtitle));
|
||||
}
|
||||
}
|
||||
if (mTitleTv != null) {
|
||||
mTitleTv.setTextColor(ContextCompat.getColor(this, R.color.text_black));
|
||||
}
|
||||
if (showDownloadMenu() && getMenuItem(R.id.menu_download) != null) {
|
||||
((ImageView) getMenuItem(R.id.menu_download).getActionView().findViewById(R.id.menu_download_iv)).setImageDrawable(ContextCompat.getDrawable(this, R.drawable.toolbar_download));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,10 +1,12 @@
|
||||
package com.gh.base.fragment;
|
||||
|
||||
import android.app.Dialog;
|
||||
import android.content.res.Configuration;
|
||||
import android.os.Bundle;
|
||||
import android.view.KeyEvent;
|
||||
|
||||
import com.gh.common.util.ClickUtils;
|
||||
import com.gh.common.util.NightModeUtils;
|
||||
import com.gh.gamecenter.R;
|
||||
import com.lightgame.utils.RuntimeUtils;
|
||||
import com.lightgame.utils.Utils;
|
||||
@ -28,6 +30,14 @@ import androidx.lifecycle.Lifecycle;
|
||||
|
||||
public class BaseDialogFragment extends DialogFragment {
|
||||
|
||||
protected boolean mNightMode;
|
||||
|
||||
@Override
|
||||
public void onCreate(@Nullable Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
mNightMode = NightModeUtils.INSTANCE.isNightMode(requireContext());
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
||||
@ -95,6 +105,16 @@ public class BaseDialogFragment extends DialogFragment {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConfigurationChanged(@NonNull Configuration newConfig) {
|
||||
super.onConfigurationChanged(newConfig);
|
||||
onNightModeChange();
|
||||
}
|
||||
|
||||
protected void onNightModeChange() {
|
||||
mNightMode = NightModeUtils.INSTANCE.isNightMode(requireContext());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
package com.gh.base.fragment;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.content.res.Configuration;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.Message;
|
||||
@ -8,6 +9,7 @@ import android.text.TextUtils;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.LayoutRes;
|
||||
import androidx.annotation.NonNull;
|
||||
@ -23,6 +25,7 @@ import com.gh.common.constant.Constants;
|
||||
import com.gh.common.syncpage.ISyncAdapterHandler;
|
||||
import com.gh.common.syncpage.SyncDataEntity;
|
||||
import com.gh.common.syncpage.SyncPageRepository;
|
||||
import com.gh.common.util.NightModeUtils;
|
||||
import com.gh.gamecenter.BuildConfig;
|
||||
import com.gh.gamecenter.R;
|
||||
import com.gh.gamecenter.eventbus.EBMiPush;
|
||||
@ -38,7 +41,6 @@ import java.lang.ref.WeakReference;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import butterknife.ButterKnife;
|
||||
import io.reactivex.Observable;
|
||||
import io.reactivex.android.schedulers.AndroidSchedulers;
|
||||
import io.reactivex.schedulers.Schedulers;
|
||||
@ -59,6 +61,8 @@ public abstract class BaseFragment<T> extends Fragment implements OnRequestCallB
|
||||
|
||||
protected boolean isEverPause;
|
||||
|
||||
protected boolean mNightMode;
|
||||
|
||||
@NonNull
|
||||
protected String mEntrance = "";
|
||||
|
||||
@ -154,15 +158,17 @@ public abstract class BaseFragment<T> extends Fragment implements OnRequestCallB
|
||||
mCachedView = View.inflate(getContext(), getLayoutId(), null);
|
||||
}
|
||||
|
||||
if (useButterKnife()) {
|
||||
ButterKnife.bind(this, mCachedView);
|
||||
}
|
||||
|
||||
initView(mCachedView);
|
||||
|
||||
if (addSyncPageObserver()) {
|
||||
initSyncPageObserver();
|
||||
}
|
||||
|
||||
if (BuildConfig.IS_NIGHT_MODE_ON) {
|
||||
mNightMode = NightModeUtils.INSTANCE.isNightMode(requireContext());
|
||||
} else {
|
||||
mNightMode = false;
|
||||
}
|
||||
}
|
||||
|
||||
private void initSyncPageObserver() {
|
||||
@ -235,6 +241,12 @@ public abstract class BaseFragment<T> extends Fragment implements OnRequestCallB
|
||||
super.onResume();
|
||||
isEverPause = false;
|
||||
startPageTime = System.currentTimeMillis();
|
||||
|
||||
if (BuildConfig.IS_NIGHT_MODE_ON
|
||||
&& !NightModeUtils.INSTANCE.getSystemMode()
|
||||
&& mNightMode != NightModeUtils.INSTANCE.isNightMode(requireContext())) {
|
||||
onNightModeChange();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -320,7 +332,9 @@ public abstract class BaseFragment<T> extends Fragment implements OnRequestCallB
|
||||
|
||||
// 为 fragment 附加 bundle (setArgument())
|
||||
public BaseFragment with(Bundle bundle) {
|
||||
this.setArguments(bundle);
|
||||
if (!isStateSaved()) {
|
||||
this.setArguments(bundle);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
@ -337,7 +351,15 @@ public abstract class BaseFragment<T> extends Fragment implements OnRequestCallB
|
||||
return false;
|
||||
}
|
||||
|
||||
protected boolean useButterKnife() {
|
||||
return true;
|
||||
@Override
|
||||
public void onConfigurationChanged(@NonNull Configuration newConfig) {
|
||||
super.onConfigurationChanged(newConfig);
|
||||
if (BuildConfig.IS_NIGHT_MODE_ON) {
|
||||
onNightModeChange();
|
||||
}
|
||||
}
|
||||
|
||||
protected void onNightModeChange() {
|
||||
mNightMode = NightModeUtils.INSTANCE.isNightMode(requireContext());
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
package com.gh.base.fragment;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.graphics.Typeface;
|
||||
import android.os.Bundle;
|
||||
@ -8,6 +9,12 @@ import android.view.View;
|
||||
import android.widget.CheckedTextView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.core.content.ContextCompat;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.viewpager.widget.ViewPager;
|
||||
|
||||
import com.gh.base.adapter.FragmentAdapter;
|
||||
import com.gh.common.view.TabIndicatorView;
|
||||
import com.gh.gamecenter.R;
|
||||
@ -20,12 +27,6 @@ import com.lightgame.view.NoScrollableViewPager;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.viewpager.widget.ViewPager;
|
||||
import butterknife.BindView;
|
||||
|
||||
/**
|
||||
* Created by khy on 15/03/18.
|
||||
*/
|
||||
@ -34,14 +35,10 @@ public abstract class BaseFragment_TabLayout extends NormalFragment implements V
|
||||
|
||||
public static final String PAGE_INDEX = "PAGE_INDEX";
|
||||
|
||||
@BindView(R.id.fragment_tab_layout)
|
||||
protected TabLayout mTabLayout;
|
||||
@BindView(R.id.fragment_view_pager)
|
||||
protected NoScrollableViewPager mViewPager;
|
||||
@BindView(R.id.fragment_tab_indicator)
|
||||
protected TabIndicatorView mTabIndicatorView;
|
||||
@Nullable
|
||||
@BindView(R.id.dividerLine)
|
||||
protected View mDividerLineView;
|
||||
|
||||
protected List<Fragment> mFragmentsList;
|
||||
@ -78,19 +75,6 @@ public abstract class BaseFragment_TabLayout extends NormalFragment implements V
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate(@Nullable Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
if (getArguments() != null) mCheckedIndex = getArguments().getInt(PAGE_INDEX, 0);
|
||||
mTabTitleList = new ArrayList<>();
|
||||
initTabTitleList(mTabTitleList);
|
||||
mFragmentsList = new ArrayList<>(restoreFragments());
|
||||
if (mFragmentsList.isEmpty() || mFragmentsList.size() != mTabTitleList.size()) {
|
||||
mFragmentsList.clear();
|
||||
initFragmentList(mFragmentsList);
|
||||
}
|
||||
}
|
||||
|
||||
private ArrayList<Fragment> restoreFragments() {
|
||||
String tag = "android:switcher:" + mViewPager.getId() + ":";
|
||||
ArrayList<Fragment> fragments = new ArrayList<>();
|
||||
@ -108,6 +92,21 @@ public abstract class BaseFragment_TabLayout extends NormalFragment implements V
|
||||
@Override
|
||||
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
|
||||
super.onViewCreated(view, savedInstanceState);
|
||||
|
||||
mTabLayout = view.findViewById(R.id.fragment_tab_layout);
|
||||
mViewPager = view.findViewById(R.id.fragment_view_pager);
|
||||
mTabIndicatorView = view.findViewById(R.id.fragment_tab_indicator);
|
||||
mDividerLineView = view.findViewById(R.id.dividerLine);
|
||||
|
||||
if (getArguments() != null) mCheckedIndex = getArguments().getInt(PAGE_INDEX, 0);
|
||||
mTabTitleList = new ArrayList<>();
|
||||
initTabTitleList(mTabTitleList);
|
||||
mFragmentsList = new ArrayList<>(restoreFragments());
|
||||
if (mFragmentsList.isEmpty() || mFragmentsList.size() != mTabTitleList.size()) {
|
||||
mFragmentsList.clear();
|
||||
initFragmentList(mFragmentsList);
|
||||
}
|
||||
|
||||
mViewPager.setOffscreenPageLimit(mFragmentsList.size());
|
||||
mViewPager.addOnPageChangeListener(this);
|
||||
mViewPager.setAdapter(new FragmentAdapter(getChildFragmentManager(), mFragmentsList, mTabTitleList));
|
||||
@ -122,7 +121,7 @@ public abstract class BaseFragment_TabLayout extends NormalFragment implements V
|
||||
if (tab == null) continue;
|
||||
String tabTitle = tab.getText() != null ? tab.getText().toString() : "";
|
||||
View tabView = provideTabView(i, tabTitle);
|
||||
if (tabView == null) tabView = createDefaultTabCustomView(tabTitle);
|
||||
if (tabView == null) tabView = createDefaultTabCustomView(requireContext(), tabTitle);
|
||||
tab.setCustomView(tabView);
|
||||
}
|
||||
|
||||
@ -155,7 +154,7 @@ public abstract class BaseFragment_TabLayout extends NormalFragment implements V
|
||||
});
|
||||
}
|
||||
|
||||
private static void updateTabStyle(TabLayout.Tab tab, boolean isChecked) {
|
||||
public static void updateTabStyle(TabLayout.Tab tab, boolean isChecked) {
|
||||
View tabView = tab.getCustomView();
|
||||
if (tabView == null) {
|
||||
Utils.log("TabLayout->Tab样式不是通用样式,请检查");
|
||||
@ -174,12 +173,13 @@ public abstract class BaseFragment_TabLayout extends NormalFragment implements V
|
||||
return;
|
||||
}
|
||||
tabTitle.setTypeface(isChecked ? Typeface.DEFAULT_BOLD : Typeface.DEFAULT);
|
||||
tabTitle.setTextColor(ContextCompat.getColorStateList(tabTitle.getContext(), R.color.text_tabbar_style));
|
||||
}
|
||||
|
||||
// 如果不设置View的话,无法动态设置字体样式
|
||||
@NonNull
|
||||
public static View createDefaultTabCustomView(String title) {
|
||||
View view = LayoutInflater.from(HaloApp.getInstance().getApplication().getBaseContext()).inflate(R.layout.tab_item, null);
|
||||
public static View createDefaultTabCustomView(Context context, String title) {
|
||||
View view = LayoutInflater.from(context).inflate(R.layout.tab_item, null);
|
||||
View tabTitle = view.findViewById(R.id.tab_title);
|
||||
if (tabTitle instanceof CheckedTextView) {
|
||||
((CheckedTextView) tabTitle).setText(title);
|
||||
@ -201,4 +201,22 @@ public abstract class BaseFragment_TabLayout extends NormalFragment implements V
|
||||
public void onPageScrollStateChanged(int state) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onNightModeChange() {
|
||||
super.onNightModeChange();
|
||||
View container = requireView().findViewById(R.id.fragment_tab_container);
|
||||
if (container != null) {
|
||||
container.setBackgroundColor(ContextCompat.getColor(requireContext(), R.color.background_white));
|
||||
for (int i = 0; i < mTabLayout.getTabCount(); i++) {
|
||||
TabLayout.Tab tab = mTabLayout.getTabAt(i);
|
||||
if (tab != null) {
|
||||
updateTabStyle(tab, tab.isSelected());
|
||||
}
|
||||
}
|
||||
}
|
||||
if (mDividerLineView != null) {
|
||||
mDividerLineView.setBackgroundColor(ContextCompat.getColor(requireContext(), R.color.divider));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -3,26 +3,20 @@ package com.gh.base.fragment
|
||||
import android.content.Intent
|
||||
import android.os.Bundle
|
||||
import android.view.View
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.viewpager.widget.PagerAdapter
|
||||
import androidx.viewpager.widget.ViewPager
|
||||
import butterknife.BindView
|
||||
import com.gh.base.adapter.FragmentAdapter
|
||||
import com.gh.common.view.TabIndicatorView
|
||||
import com.gh.gamecenter.R
|
||||
import com.google.android.material.tabs.TabLayout
|
||||
import com.lightgame.view.NoScrollableViewPager
|
||||
import java.util.*
|
||||
|
||||
abstract class BaseLazyTabFragment : BaseLazyFragment(), ViewPager.OnPageChangeListener {
|
||||
|
||||
@BindView(R.id.fragment_tab_layout)
|
||||
lateinit var mTabLayout: TabLayout
|
||||
|
||||
@BindView(R.id.fragment_view_pager)
|
||||
lateinit var mViewPager: NoScrollableViewPager
|
||||
|
||||
@BindView(R.id.fragment_tab_indicator)
|
||||
lateinit var mTabIndicatorView: TabIndicatorView
|
||||
|
||||
var mFragmentsList: MutableList<Fragment> = arrayListOf()
|
||||
@ -67,6 +61,14 @@ abstract class BaseLazyTabFragment : BaseLazyFragment(), ViewPager.OnPageChangeL
|
||||
return null
|
||||
}
|
||||
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
|
||||
mTabLayout = view.findViewById(R.id.fragment_tab_layout)
|
||||
mViewPager = view.findViewById(R.id.fragment_view_pager)
|
||||
mTabIndicatorView = view.findViewById(R.id.fragment_tab_indicator)
|
||||
}
|
||||
|
||||
override fun onFragmentFirstVisible() {
|
||||
super.onFragmentFirstVisible()
|
||||
mTabTitleList.clear()
|
||||
@ -92,7 +94,7 @@ abstract class BaseLazyTabFragment : BaseLazyFragment(), ViewPager.OnPageChangeL
|
||||
val tab = mTabLayout.getTabAt(i) ?: continue
|
||||
val tabTitle = if (tab.text != null) tab.text.toString() else ""
|
||||
var tabView = provideTabView(i, tabTitle)
|
||||
if (tabView == null) tabView = BaseFragment_TabLayout.createDefaultTabCustomView(tabTitle)
|
||||
if (tabView == null) tabView = BaseFragment_TabLayout.createDefaultTabCustomView(requireContext(), tabTitle)
|
||||
tab.customView = tabView
|
||||
}
|
||||
BaseFragment_TabLayout.initTabStyle(mTabLayout, mCheckedIndex)
|
||||
@ -120,6 +122,20 @@ abstract class BaseLazyTabFragment : BaseLazyFragment(), ViewPager.OnPageChangeL
|
||||
|
||||
override fun onPageScrollStateChanged(state: Int) {}
|
||||
|
||||
override fun onNightModeChange() {
|
||||
super.onNightModeChange()
|
||||
val container = requireView().findViewById<View>(R.id.fragment_tab_container)
|
||||
if (container != null) {
|
||||
container.setBackgroundColor(ContextCompat.getColor(requireContext(), R.color.background_white))
|
||||
for (i in 0 until mTabLayout.tabCount) {
|
||||
val tab = mTabLayout.getTabAt(i)
|
||||
if (tab != null) {
|
||||
BaseFragment_TabLayout.updateTabStyle(tab, tab.isSelected)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val PAGE_INDEX = "PAGE_INDEX"
|
||||
}
|
||||
|
||||
@ -44,8 +44,6 @@ abstract class LazyFragment : BaseLazyFragment() {
|
||||
getStubLayoutId()
|
||||
}
|
||||
|
||||
override fun useButterKnife() = false
|
||||
|
||||
override fun initView(view: View?) {
|
||||
super.initView(view)
|
||||
if (!isRecreatedByFragmentManager()) {
|
||||
|
||||
@ -4,12 +4,14 @@ import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.WindowManager;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
|
||||
import com.gh.common.util.DisplayUtils;
|
||||
import com.gh.common.util.ExtensionsKt;
|
||||
import com.gh.gamecenter.R;
|
||||
|
||||
@ -53,6 +55,14 @@ public class WaitingDialogFragment extends BaseDialogFragment {
|
||||
return view;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
|
||||
super.onViewCreated(view, savedInstanceState);
|
||||
WindowManager.LayoutParams layoutParams = getDialog().getWindow().getAttributes();
|
||||
layoutParams.width = DisplayUtils.dip2px(160);
|
||||
getDialog().getWindow().setAttributes(layoutParams);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void show(FragmentManager manager, String tag) {
|
||||
try {
|
||||
|
||||
@ -3,6 +3,7 @@ package com.gh.common
|
||||
import android.os.Handler
|
||||
import android.os.Looper
|
||||
import com.gh.base.GHThreadFactory
|
||||
import com.gh.common.AppExecutor.heavyWeightIoExecutor
|
||||
import com.gh.common.AppExecutor.ioExecutor
|
||||
import com.gh.common.AppExecutor.lightWeightIoExecutor
|
||||
import com.gh.common.AppExecutor.logExecutor
|
||||
@ -16,31 +17,33 @@ import java.util.concurrent.*
|
||||
* [ioExecutor] 是一个最大线程数固定的线程池,较为繁重的 IO 任务可以交给它
|
||||
* [uiExecutor] 是主线程的包裹,需要切换至主线程执行可以用它
|
||||
* [lightWeightIoExecutor] 是一个单线程的线程池,轻量级且需要保证同一线程的 IO 任务可以交给它
|
||||
* [heavyWeightIoExecutor] 重量级的线程池,一些高频调用但不用保证结果的任务可以交给它
|
||||
* [logExecutor] 只为上传 log 而使用的线程池
|
||||
*/
|
||||
object AppExecutor {
|
||||
|
||||
private val mCoreSize = Runtime.getRuntime().availableProcessors()
|
||||
private val mMinimumPoolSize = 16.coerceAtLeast(mCoreSize * 4)
|
||||
private val mMaximumPoolSize = 64.coerceAtLeast(mCoreSize * 16)
|
||||
|
||||
// TODO 因为 LinkedBlockingQueue 过大导致 MaximumPoolSize 的值几乎无效,下版本改造 [PackageRepository] 启动请求一堆游戏摘要信息的接口?
|
||||
private val mMinimumPoolSize = 6.coerceAtLeast(mCoreSize)
|
||||
private val mMaximumPoolSize = 24.coerceAtLeast(mCoreSize * 3)
|
||||
|
||||
@JvmStatic
|
||||
val uiExecutor by lazy { MainThreadExecutor() }
|
||||
|
||||
@JvmStatic
|
||||
val lightWeightIoExecutor by lazy { Executors.newSingleThreadExecutor(GHThreadFactory("GH_LIGHT_WEIGHT_IO_THREAD")) }
|
||||
val lightWeightIoExecutor: ExecutorService by lazy { Executors.newSingleThreadExecutor(GHThreadFactory("GH_LIGHT_WEIGHT_IO_THREAD")) }
|
||||
|
||||
@JvmStatic
|
||||
val logExecutor by lazy { Executors.newSingleThreadExecutor(GHThreadFactory("GH_LOG_THREAD")) }
|
||||
val heavyWeightIoExecutor: ExecutorService by lazy { Executors.newFixedThreadPool(2, GHThreadFactory("GH_HEAVY_WEIGHT_IO_THREAD")) }
|
||||
|
||||
@JvmStatic
|
||||
val logExecutor: ExecutorService by lazy { Executors.newSingleThreadExecutor(GHThreadFactory("GH_LOG_THREAD")) }
|
||||
|
||||
@JvmStatic
|
||||
val ioExecutor = ThreadPoolExecutor(
|
||||
mMinimumPoolSize,
|
||||
mMaximumPoolSize,
|
||||
20L, TimeUnit.SECONDS,
|
||||
LinkedBlockingQueue<Runnable>(1000),
|
||||
LinkedBlockingQueue(256),
|
||||
GHThreadFactory("GH_IO_THREAD"))
|
||||
|
||||
val cachedScheduler by lazy { Schedulers.from(ioExecutor) }
|
||||
@ -58,14 +61,14 @@ object AppExecutor {
|
||||
}
|
||||
}
|
||||
|
||||
fun runOnIoThread(isLightWeightTask: Boolean = false, f: () -> Unit) {
|
||||
if (isLightWeightTask) {
|
||||
AppExecutor.lightWeightIoExecutor.execute(f)
|
||||
} else {
|
||||
AppExecutor.ioExecutor.execute(f)
|
||||
fun runOnIoThread(isLightWeightTask: Boolean = false, isHeavyWightTask: Boolean = false, f: () -> Unit) {
|
||||
when {
|
||||
isLightWeightTask -> lightWeightIoExecutor.execute(f)
|
||||
isHeavyWightTask -> heavyWeightIoExecutor.execute(f)
|
||||
else -> ioExecutor.execute(f)
|
||||
}
|
||||
}
|
||||
|
||||
fun runOnUiThread(f: () -> Unit) {
|
||||
AppExecutor.uiExecutor.execute(f)
|
||||
uiExecutor.execute(f)
|
||||
}
|
||||
@ -17,9 +17,7 @@ import com.gh.common.view.dsbridge.CompletionHandler
|
||||
import com.gh.gamecenter.*
|
||||
import com.gh.gamecenter.energy.EnergyCenterActivity
|
||||
import com.gh.gamecenter.energy.EnergyHouseActivity
|
||||
import com.gh.gamecenter.entity.Badge
|
||||
import com.gh.gamecenter.entity.MtaEvent
|
||||
import com.gh.gamecenter.entity.NotificationUgc
|
||||
import com.gh.gamecenter.entity.*
|
||||
import com.gh.gamecenter.help.QaFeedbackDialogFragment
|
||||
import com.gh.gamecenter.manager.UserManager
|
||||
import com.gh.gamecenter.personalhome.border.AvatarBorderActivity
|
||||
@ -33,7 +31,6 @@ import java.io.BufferedOutputStream
|
||||
import java.io.File
|
||||
import java.io.FileOutputStream
|
||||
import java.util.*
|
||||
import kotlin.collections.ArrayList
|
||||
|
||||
class DefaultJsApi(var context: Context) {
|
||||
|
||||
@ -126,10 +123,14 @@ class DefaultJsApi(var context: Context) {
|
||||
handler.complete(false)
|
||||
}
|
||||
})
|
||||
|
||||
LoginHelper.unregisterCallback()
|
||||
}
|
||||
|
||||
override fun onLoginFailure(loginType: LoginTag, error: String) {
|
||||
handler.complete(false)
|
||||
|
||||
LoginHelper.unregisterCallback()
|
||||
}
|
||||
})
|
||||
}
|
||||
@ -398,7 +399,25 @@ class DefaultJsApi(var context: Context) {
|
||||
|
||||
@JavascriptInterface
|
||||
fun checkUpdateGhzs(msg: Any) {
|
||||
context.startActivity(AboutActivity.getIntent(context, true));
|
||||
context.startActivity(AboutActivity.getIntent(context, true))
|
||||
}
|
||||
|
||||
@JavascriptInterface
|
||||
public fun clickGameActivityDownloadBtn(event: Any) {
|
||||
val gameActivityEvent = event.toString().toObject() ?: GameActivityEvent()
|
||||
GameActivityDownloadHelper.start(context, gameActivityEvent)
|
||||
}
|
||||
|
||||
@JavascriptInterface
|
||||
fun isGameActivityTaskCompleted(event: Any, handler: CompletionHandler<Any>) {
|
||||
val gameActivityEvent = event.toString().toObject() ?: GameActivityEvent()
|
||||
GameActivityDownloadHelper.checkTaskComplete(context, gameActivityEvent, handler)
|
||||
}
|
||||
|
||||
@JavascriptInterface
|
||||
fun postGameActivityExposureEvent(event: Any) {
|
||||
val gameActivityEvent = event.toString().toObject() ?: GameActivityEvent()
|
||||
GameActivityDownloadHelper.postExposureEvent(gameActivityEvent)
|
||||
}
|
||||
|
||||
@Keep
|
||||
@ -420,4 +439,12 @@ class DefaultJsApi(var context: Context) {
|
||||
|
||||
@Keep
|
||||
internal data class BrowseTaskEvent(var timeout: String = "", var isFinished: String = "")
|
||||
|
||||
@Keep
|
||||
data class GameActivityEvent(
|
||||
var gameId: String = "",
|
||||
var activityTitle: String = "",
|
||||
var activityId: String = "",
|
||||
var platform: String = ""
|
||||
)
|
||||
}
|
||||
|
||||
@ -5,6 +5,7 @@ import android.content.Intent
|
||||
import android.net.Uri
|
||||
import android.text.TextUtils
|
||||
import android.util.Base64
|
||||
import com.gh.base.CurrentActivityHolder
|
||||
import com.gh.common.constant.Constants
|
||||
import com.gh.common.util.*
|
||||
import com.gh.common.util.DirectUtils.directToFeedback
|
||||
@ -32,6 +33,14 @@ object DefaultUrlHandler {
|
||||
|
||||
@JvmStatic
|
||||
fun interceptUrl(context: Context, url: String, entrance: String): Boolean {
|
||||
return interceptUrl(context, url, entrance, false)
|
||||
}
|
||||
|
||||
/**
|
||||
* @param bringAppToFront 是否需要在不匹配 host 的时候把 APP 调回到前台 (如微信调起)
|
||||
*/
|
||||
@JvmStatic
|
||||
fun interceptUrl(context: Context, url: String, entrance: String, bringAppToFront: Boolean = false): Boolean {
|
||||
val uri = Uri.parse(url)
|
||||
if ("ghzhushou" == uri.scheme) {
|
||||
Utils.log("url = $url")
|
||||
@ -42,11 +51,21 @@ object DefaultUrlHandler {
|
||||
if (!TextUtils.isEmpty(path)) {
|
||||
id = path!!.substring(1)
|
||||
}
|
||||
if (TextUtils.isEmpty(id)) {
|
||||
id = uri.getQueryParameter("id") ?: ""
|
||||
}
|
||||
|
||||
val intent: Intent
|
||||
when (host) {
|
||||
"article" -> context.startActivity(NewsDetailActivity.getIntentById(context, id, entrance))
|
||||
|
||||
"game" -> DirectUtils.directToGameDetail(context, id = id, tab = uri.getQueryParameter("to"), autoDownload = uri.getQueryParameter("auto_download") == "true", entrance = entrance)
|
||||
"game" -> DirectUtils.directToGameDetail(
|
||||
context,
|
||||
id = id,
|
||||
tab = uri.getQueryParameter("to"),
|
||||
autoDownload = uri.getQueryParameter("auto_download") == "true",
|
||||
entrance = entrance
|
||||
)
|
||||
|
||||
"column" -> SubjectActivity.startSubjectActivity(context, id, uri.getQueryParameter("name"), false, entrance)
|
||||
|
||||
@ -122,8 +141,9 @@ object DefaultUrlHandler {
|
||||
}
|
||||
if ("articles" == type) {
|
||||
DirectUtils.directToCommunityArticle(
|
||||
context, typeId, communityId,
|
||||
entrance, "文章链接")
|
||||
context, typeId, communityId,
|
||||
entrance, "文章链接"
|
||||
)
|
||||
}
|
||||
}
|
||||
EntranceUtils.HOST_UPLOAD_VIDEO -> {
|
||||
@ -154,7 +174,7 @@ object DefaultUrlHandler {
|
||||
val fieldId = uri.getQueryParameter("fieldId") ?: ""
|
||||
val sectionName = uri.getQueryParameter("sectionName") ?: ""
|
||||
val paginationType = uri.getQueryParameter("paginationType")
|
||||
?: "page"//活动分页方式 page filter
|
||||
?: "page"//活动分页方式 page filter
|
||||
val location = if (!TextUtils.isEmpty(act)) {
|
||||
VideoDetailContainerViewModel.Location.VIDEO_ACTIVITY.value
|
||||
} else if (!TextUtils.isEmpty(fieldId)) {
|
||||
@ -162,15 +182,31 @@ object DefaultUrlHandler {
|
||||
} else {
|
||||
id
|
||||
}
|
||||
directToLegacyVideoDetail(context, id, location, false, gameId, entrance, "", referer, type, act, paginationType, fieldId, sectionName)
|
||||
directToLegacyVideoDetail(
|
||||
context,
|
||||
id,
|
||||
location,
|
||||
false,
|
||||
gameId,
|
||||
entrance,
|
||||
"",
|
||||
referer,
|
||||
type,
|
||||
act,
|
||||
paginationType,
|
||||
fieldId,
|
||||
sectionName
|
||||
)
|
||||
}
|
||||
EntranceUtils.HOST_VIDEO_DETAIL -> {
|
||||
DirectUtils.directToVideoDetail(context, id, entrance, path)
|
||||
}
|
||||
EntranceUtils.HOST_VIDEO_SINGLE -> {
|
||||
val referer = uri.getQueryParameter("referer") ?: ""
|
||||
DirectUtils.directToVideoDetail(context, id, VideoDetailContainerViewModel.Location.SINGLE_VIDEO.value,
|
||||
false, "", entrance, "", if (TextUtils.isEmpty(referer)) "" else referer)
|
||||
DirectUtils.directToVideoDetail(
|
||||
context, id, VideoDetailContainerViewModel.Location.SINGLE_VIDEO.value,
|
||||
false, "", entrance, "", if (TextUtils.isEmpty(referer)) "" else referer
|
||||
)
|
||||
}
|
||||
EntranceUtils.HOST_VIDEO_STREAMING_HOME -> {
|
||||
intent = Intent(context, MainActivity::class.java)
|
||||
@ -213,7 +249,7 @@ object DefaultUrlHandler {
|
||||
|
||||
EntranceUtils.HOST_BLOCK -> {
|
||||
val name = uri.getQueryParameter("name")
|
||||
?: ""
|
||||
?: ""
|
||||
val entity = SubjectRecommendEntity(link = id, name = name, text = name)
|
||||
DirectUtils.directToBlock(context, entity, entrance)
|
||||
}
|
||||
@ -228,13 +264,13 @@ object DefaultUrlHandler {
|
||||
|
||||
EntranceUtils.HOST_HELP -> {
|
||||
val name = uri.getQueryParameter("name")
|
||||
?: ""
|
||||
?: ""
|
||||
DirectUtils.directToQa(context, name, id)
|
||||
}
|
||||
|
||||
EntranceUtils.HOST_HELP_COLLECTION -> {
|
||||
val name = uri.getQueryParameter("name")
|
||||
?: ""
|
||||
?: ""
|
||||
DirectUtils.directToQaCollection(context, name, id)
|
||||
}
|
||||
|
||||
@ -262,10 +298,11 @@ object DefaultUrlHandler {
|
||||
|
||||
EntranceUtils.HOST_GAME_NEWS -> {
|
||||
DirectUtils.directToGameNews(
|
||||
context,
|
||||
uri.getQueryParameter(EntranceUtils.KEY_GAME_ID),
|
||||
uri.getQueryParameter(EntranceUtils.KEY_GAME_NAME),
|
||||
entrance);
|
||||
context,
|
||||
uri.getQueryParameter(EntranceUtils.KEY_GAME_ID),
|
||||
uri.getQueryParameter(EntranceUtils.KEY_GAME_NAME),
|
||||
entrance
|
||||
);
|
||||
}
|
||||
|
||||
EntranceUtils.HOST_GAME_CALENDAR -> {
|
||||
@ -282,10 +319,11 @@ object DefaultUrlHandler {
|
||||
|
||||
EntranceUtils.HOST_GAME_RATING_DETAIL -> {
|
||||
DirectUtils.directToGameRatingDetail(
|
||||
context,
|
||||
uri.getQueryParameter(EntranceUtils.KEY_GAME_ID),
|
||||
uri.getQueryParameter(EntranceUtils.KEY_COMMENT_ID),
|
||||
EntranceUtils.ENTRANCE_BROWSER)
|
||||
context,
|
||||
uri.getQueryParameter(EntranceUtils.KEY_GAME_ID),
|
||||
uri.getQueryParameter(EntranceUtils.KEY_COMMENT_ID),
|
||||
EntranceUtils.ENTRANCE_BROWSER
|
||||
)
|
||||
}
|
||||
|
||||
EntranceUtils.HOST_FORUM -> {
|
||||
@ -297,23 +335,39 @@ object DefaultUrlHandler {
|
||||
EntranceUtils.HOST_UPLOAD_VIDEO_NEW -> {
|
||||
val activityName = uri.getQueryParameter("activity_name") ?: ""
|
||||
val activityId = uri.getQueryParameter("activity_id") ?: ""
|
||||
val original = uri.getQueryParameter("original") ?: ""
|
||||
val forumName = uri.getQueryParameter("forum_name") ?: ""
|
||||
val forumId = uri.getQueryParameter("forum_id") ?: ""
|
||||
val forumIcon = uri.getQueryParameter("forum_icon") ?: ""
|
||||
val forumType = uri.getQueryParameter("forum_type") ?: BbsType.OFFICIAL_BBS.value
|
||||
val gameId = uri.getQueryParameter("game_id") ?: ""
|
||||
val gameName = uri.getQueryParameter("game_name") ?: ""
|
||||
val icon = uri.getQueryParameter("game_icon") ?: ""
|
||||
val iconSubscript = uri.getQueryParameter("game_icon_subscript") ?: ""
|
||||
val gameEntity =
|
||||
if (forumType == BbsType.OFFICIAL_BBS.value && gameId.isNotEmpty() && gameName.isNotEmpty() && icon.isNotEmpty()) {
|
||||
GameEntity(id = gameId, mName = gameName, mIcon = icon, mIconSubscript = iconSubscript)
|
||||
} else null
|
||||
val activityLabelEntity = if (activityId.isNotEmpty() && activityName.isNotEmpty()) {
|
||||
ActivityLabelEntity(id = activityId, name = activityName, original = original.ifEmpty { "false" }.toBoolean())
|
||||
} else null
|
||||
val communityEntity = if (forumId.isNotEmpty() && forumName.isNotEmpty() && forumIcon.isNotEmpty()) {
|
||||
CommunityEntity(id = forumId, name = forumName, icon = forumIcon)
|
||||
} else null
|
||||
|
||||
val activityLabelEntity = ActivityLabelEntity(id = activityId, name = activityName)
|
||||
val communityEntity = CommunityEntity(id = forumId, name = forumName, icon = forumIcon)
|
||||
|
||||
context.startActivity(VideoPublishActivity.getIntent(
|
||||
context.startActivity(
|
||||
VideoPublishActivity.getIntent(
|
||||
context,
|
||||
communityEntity,
|
||||
gameEntity,
|
||||
activityLabelEntity,
|
||||
forumType,
|
||||
false,
|
||||
disableForumSelection = false,
|
||||
isFromCommunityActivity = true,
|
||||
entrance,
|
||||
""
|
||||
))
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
EntranceUtils.HOST_SUGGESTION -> {
|
||||
@ -322,13 +376,17 @@ object DefaultUrlHandler {
|
||||
val gameId = uri.getQueryParameter(EntranceUtils.KEY_GAMEID)
|
||||
val packageMd5 = uri.getQueryParameter(EntranceUtils.KEY_PACKAGE_MD5)
|
||||
val isQaFeedback = uri.getQueryParameter(EntranceUtils.KEY_IS_QA_FEEDBACK) == "true"
|
||||
val content = if (TextUtils.isEmpty(gameId) || TextUtils.isEmpty(packageMd5)) String.format("%s-%s-V%s,",
|
||||
uri.getQueryParameter(EntranceUtils.KEY_GAME_NAME),
|
||||
if (TextUtils.isEmpty(platformName)) platform else platformName,
|
||||
uri.getQueryParameter(EntranceUtils.KEY_VERSION)) else String.format("%s-%s-V%s\n游戏ID:%s\n游戏包MD5:%s\n",
|
||||
uri.getQueryParameter(EntranceUtils.KEY_GAME_NAME),
|
||||
if (TextUtils.isEmpty(platformName)) platform else platformName,
|
||||
uri.getQueryParameter(EntranceUtils.KEY_VERSION), gameId, packageMd5)
|
||||
val content = if (TextUtils.isEmpty(gameId) || TextUtils.isEmpty(packageMd5)) String.format(
|
||||
"%s-%s-V%s,",
|
||||
uri.getQueryParameter(EntranceUtils.KEY_GAME_NAME),
|
||||
if (TextUtils.isEmpty(platformName)) platform else platformName,
|
||||
uri.getQueryParameter(EntranceUtils.KEY_VERSION)
|
||||
) else String.format(
|
||||
"%s-%s-V%s\n游戏ID:%s\n游戏包MD5:%s\n",
|
||||
uri.getQueryParameter(EntranceUtils.KEY_GAME_NAME),
|
||||
if (TextUtils.isEmpty(platformName)) platform else platformName,
|
||||
uri.getQueryParameter(EntranceUtils.KEY_VERSION), gameId, packageMd5
|
||||
)
|
||||
val qaId = uri.getQueryParameter("qa_id") ?: ""
|
||||
val qaContentId = uri.getQueryParameter(EntranceUtils.KEY_QA_CONTENT_ID) ?: ""
|
||||
val qaTitle = uri.getQueryParameter(EntranceUtils.KEY_QA_TITLE)
|
||||
@ -373,7 +431,20 @@ object DefaultUrlHandler {
|
||||
context.startActivity(GameCollectionEditActivity.getIntent(context, entrance))
|
||||
}
|
||||
|
||||
else -> DialogHelper.showUpgradeDialog(context)
|
||||
else -> {
|
||||
if (bringAppToFront) {
|
||||
DirectUtils.directToMainActivity(context)
|
||||
if (!TextUtils.isEmpty(host)) {
|
||||
AppExecutor.uiExecutor.executeWithDelay({
|
||||
CurrentActivityHolder.getCurrentActivity()?.let {
|
||||
DialogHelper.showUpgradeDialog(it)
|
||||
}
|
||||
}, 200)
|
||||
}
|
||||
} else {
|
||||
DialogHelper.showUpgradeDialog(context)
|
||||
}
|
||||
}
|
||||
}
|
||||
return true
|
||||
} else if ("zhiqu" == uri.scheme) {
|
||||
@ -423,10 +494,11 @@ object DefaultUrlHandler {
|
||||
fun transformNormalScheme(context: Context, url: String, entrance: String): Boolean {
|
||||
val uri = Uri.parse(url)
|
||||
if (uri.host == "www.ghzs666.com"
|
||||
|| uri.host == "www.ghzs.com"
|
||||
|| uri.host == "ask.ghzs.com"
|
||||
|| uri.host == "m.ghzs.com"
|
||||
|| uri.host == "m.ghzs666.com") {
|
||||
|| uri.host == "www.ghzs.com"
|
||||
|| uri.host == "ask.ghzs.com"
|
||||
|| uri.host == "m.ghzs.com"
|
||||
|| uri.host == "m.ghzs666.com"
|
||||
) {
|
||||
Utils.log(uri.path)
|
||||
uri.path?.apply {
|
||||
when {
|
||||
@ -449,7 +521,9 @@ object DefaultUrlHandler {
|
||||
var communityId = ""
|
||||
var type = ""
|
||||
var typeId = ""
|
||||
val split = replace("/communities", "").replace("/bbs", "").replace(".html", "").split("/".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
|
||||
val split =
|
||||
replace("/communities", "").replace("/bbs", "").replace(".html", "").split("/".toRegex()).dropLastWhile { it.isEmpty() }
|
||||
.toTypedArray()
|
||||
for (text in split) {
|
||||
if (TextUtils.isEmpty(communityId)) {
|
||||
communityId = text
|
||||
@ -465,8 +539,9 @@ object DefaultUrlHandler {
|
||||
}
|
||||
if ("articles" == type || "article" == type) {
|
||||
DirectUtils.directToCommunityArticle(
|
||||
context, typeId, communityId,
|
||||
entrance, "文章链接")
|
||||
context, typeId, communityId,
|
||||
entrance, "文章链接"
|
||||
)
|
||||
}
|
||||
}
|
||||
contains("article") -> {
|
||||
@ -494,4 +569,24 @@ object DefaultUrlHandler {
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
/**
|
||||
* 将 url 转换为 LinkEntity (实际只有 type 和 link 两个字段,仅供日志,不保证能用)
|
||||
*/
|
||||
fun urlToLinkEntity(url: String): LinkEntity? {
|
||||
val uri = Uri.parse(url)
|
||||
if ("ghzhushou" == uri.scheme) {
|
||||
Utils.log("url = $url")
|
||||
Utils.log("url = " + uri.scheme!!)
|
||||
val host = uri.host
|
||||
val path = uri.path
|
||||
var id = ""
|
||||
if (!TextUtils.isEmpty(path)) {
|
||||
id = path!!.substring(1)
|
||||
}
|
||||
return LinkEntity(type = host, link = id)
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
}
|
||||
@ -49,6 +49,8 @@ public class Constants {
|
||||
// 最近显示的弹窗信息
|
||||
public static final String SP_LAST_OPENING_ID = "last_opening_dialog_id";
|
||||
public static final String SP_LAST_OPENING_TIME = "last_opening_dialog_time";
|
||||
|
||||
public static final String SP_LAST_ACCEPTED_PRIVACY_DIALOG_ID = "last_accepted_privacy_dialog_id";
|
||||
|
||||
// 游戏图标和图标角标
|
||||
public static final String RAW_GAME_ICON = "raw_game_icon";
|
||||
@ -245,6 +247,8 @@ public class Constants {
|
||||
public static final String SP_MY_GAME_GUIDE = "my_game_guide";
|
||||
//微信绑定配置信息
|
||||
public static final String SP_WECHAT_CONFIG = "wechat_config";
|
||||
//游戏库导航栏小红点提示
|
||||
public static final String SP_GAME_NAVIGATION = "game_navigation";
|
||||
|
||||
//手机号码匹配规则
|
||||
public static final String REGEX_MOBILE = "^((13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$";
|
||||
@ -413,4 +417,11 @@ public class Constants {
|
||||
public static final String SP_BROWSER_HINT_URL = "browser_hint_url";
|
||||
public static final String DEFAULT_OPPO_BROWSER_HINT_URL = "https://static-web.ghzs.com/ghzs_help/help.html?content=5fa90fe143d91a022e0d33ff";
|
||||
public static final String DEFAULT_VIVO_BROWSER_HINT_URL = "https://static-web.ghzs.com/ghzs_help/help.html?content=618112ce04796e63e97643a4&from=ghzs";
|
||||
|
||||
public static final int FOLLOW_HINT_TRIGGER_HEIGHT = 10;
|
||||
|
||||
// 深色模式
|
||||
public static final String SP_NIGHT_MODE = "night_mode";
|
||||
// 跟随系统模式
|
||||
public static final String SP_SYSTEM_MODE = "system_mode";
|
||||
}
|
||||
|
||||
@ -16,7 +16,6 @@ import android.widget.TextView;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.core.content.ContextCompat;
|
||||
import androidx.databinding.BindingAdapter;
|
||||
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
|
||||
|
||||
import com.facebook.drawee.view.SimpleDraweeView;
|
||||
@ -34,6 +33,7 @@ import com.gh.common.util.DataUtils;
|
||||
import com.gh.common.util.DialogUtils;
|
||||
import com.gh.common.util.DisplayUtils;
|
||||
import com.gh.common.util.DownloadDialogHelper;
|
||||
import com.gh.common.util.ExtensionsKt;
|
||||
import com.gh.common.util.GameUtils;
|
||||
import com.gh.common.util.GameViewUtils;
|
||||
import com.gh.common.util.ImageUtils;
|
||||
@ -84,22 +84,18 @@ import java.util.List;
|
||||
|
||||
public class BindingAdapters {
|
||||
|
||||
@BindingAdapter("imageIcon")
|
||||
public static void loadIcon(SimpleDraweeView view, String imageUrl) {
|
||||
ImageUtils.displayIcon(view, imageUrl);
|
||||
}
|
||||
|
||||
@BindingAdapter("imageUrl")
|
||||
public static void loadImage(SimpleDraweeView view, String imageUrl) {
|
||||
ImageUtils.display(view, imageUrl);
|
||||
}
|
||||
|
||||
@BindingAdapter("setTextSize")
|
||||
public static void setTextSize(TextView view, int number) {
|
||||
view.setTextSize(number);
|
||||
}
|
||||
|
||||
@BindingAdapter("setTypeface")
|
||||
public static void setTypeface(TextView view, String type) {
|
||||
if (type == null) return;
|
||||
|
||||
@ -119,7 +115,6 @@ public class BindingAdapters {
|
||||
}
|
||||
}
|
||||
|
||||
@BindingAdapter({"addDetailKaiFuView", "addDetailKaiFuViewListener", "isReadyPatch"})
|
||||
public static void addDetailKaiFuView(LinearLayout view, List<ServerCalendarEntity> list
|
||||
, OnViewClickListener listener, Boolean isReadyPatch) {
|
||||
if (list == null) return;
|
||||
@ -127,13 +122,13 @@ public class BindingAdapters {
|
||||
for (int i = 0; i < list.size() + 1; i++) { // 1 is Title
|
||||
View inflate = LayoutInflater.from(view.getContext()).inflate(R.layout.kaifu_detail_item_row, null);
|
||||
KaifuDetailItemRowBinding binding = KaifuDetailItemRowBinding.bind(inflate);
|
||||
binding.setIsCloseBottom(i == list.size());
|
||||
binding.setIsReadyPatch(isReadyPatch);
|
||||
if (i == 0) {
|
||||
binding.setIsTitle(true);
|
||||
} else {
|
||||
ServerCalendarEntity serverEntity = list.get(i - 1);
|
||||
binding.setEntity(serverEntity);
|
||||
binding.getRoot().setBackgroundColor(isReadyPatch != null && isReadyPatch ? ExtensionsKt.toColor(R.color.theme) : ExtensionsKt.toColor(R.color.white));
|
||||
binding.getRoot().setPadding(DisplayUtils.dip2px(1), DisplayUtils.dip2px(1), DisplayUtils.dip2px(1), i == list.size() ? DisplayUtils.dip2px(1) : 0);
|
||||
ServerCalendarEntity serverEntity = list.get(i - 1);
|
||||
binding.timeTv.setText(i == 0 ? "时间" : serverEntity.getFormatTime("HH:mm"));
|
||||
binding.remarkTv.setText(i == 0 ? "备注" : serverEntity.getRemark());
|
||||
binding.nameTv.setText(i == 0 ? "名字" : (TextUtils.isEmpty(serverEntity.getNote()) ? "-" : serverEntity.getNote()));
|
||||
if (i != 0) {
|
||||
binding.getRoot().setOnClickListener(v -> {
|
||||
listener.onClick(v, isReadyPatch != null && isReadyPatch ? serverEntity : null);
|
||||
});
|
||||
@ -155,12 +150,10 @@ public class BindingAdapters {
|
||||
}
|
||||
|
||||
// 如果超过10000,则转换为1.0W
|
||||
@BindingAdapter("transSimpleCount")
|
||||
public static void transSimpleCount(TextView view, int count) {
|
||||
view.setText(NumberUtils.transSimpleCount(count));
|
||||
}
|
||||
|
||||
@BindingAdapter("textColorFromString")
|
||||
public static void textColorFromString(TextView tv, String hexString) {
|
||||
if (TextUtils.isEmpty(hexString)) return;
|
||||
|
||||
@ -171,7 +164,6 @@ public class BindingAdapters {
|
||||
}
|
||||
}
|
||||
|
||||
@BindingAdapter("visibleGone")
|
||||
public static void showHide(View view, Boolean show) {
|
||||
if (show != null && show) {
|
||||
view.setVisibility(View.VISIBLE);
|
||||
@ -180,7 +172,6 @@ public class BindingAdapters {
|
||||
}
|
||||
}
|
||||
|
||||
@BindingAdapter("goneIf")
|
||||
public static void goneIf(View view, Boolean gone) {
|
||||
if (gone != null && gone) {
|
||||
view.setVisibility(View.GONE);
|
||||
@ -192,7 +183,6 @@ public class BindingAdapters {
|
||||
/**
|
||||
* lazy 的 paddingTop
|
||||
*/
|
||||
@BindingAdapter("lazyPaddingLeft")
|
||||
public static void lazyPaddingLeft(View view, int paddingLeftInDp) {
|
||||
view.setPadding(DisplayUtils.dip2px(paddingLeftInDp), view.getPaddingTop(), view.getPaddingRight(), view.getPaddingBottom());
|
||||
}
|
||||
@ -200,7 +190,6 @@ public class BindingAdapters {
|
||||
/**
|
||||
* lazy 的 paddingTop
|
||||
*/
|
||||
@BindingAdapter("lazyPaddingTop")
|
||||
public static void lazyPaddingTop(View view, int paddingTopInDp) {
|
||||
view.setPadding(view.getPaddingLeft(), DisplayUtils.dip2px(paddingTopInDp), view.getPaddingRight(), view.getPaddingBottom());
|
||||
}
|
||||
@ -208,12 +197,10 @@ public class BindingAdapters {
|
||||
/**
|
||||
* lazy 的 paddingBottom
|
||||
*/
|
||||
@BindingAdapter("lazyPaddingBottom")
|
||||
public static void lazyPaddingBottom(View view, int paddingBottomInDp) {
|
||||
view.setPadding(view.getPaddingLeft(), view.getPaddingTop(), view.getPaddingRight(), DisplayUtils.dip2px(paddingBottomInDp));
|
||||
}
|
||||
|
||||
@BindingAdapter("visibleInvisible")
|
||||
public static void visibleInvisible(View view, Boolean show) {
|
||||
if (show != null && show) {
|
||||
view.setVisibility(View.VISIBLE);
|
||||
@ -222,7 +209,6 @@ public class BindingAdapters {
|
||||
}
|
||||
}
|
||||
|
||||
@BindingAdapter("messageUnread")
|
||||
public static void setMessageUnread(TextView view, int unreadCount) {
|
||||
if (unreadCount < 100) {
|
||||
view.setText(String.valueOf(unreadCount));
|
||||
@ -231,7 +217,6 @@ public class BindingAdapters {
|
||||
}
|
||||
}
|
||||
|
||||
@BindingAdapter("serverTypePadding")
|
||||
public static void setServerTypePadding(TextView view, String serverType) {
|
||||
int paddRight = 0;
|
||||
if (TextUtils.isEmpty(serverType)) {
|
||||
@ -249,7 +234,6 @@ public class BindingAdapters {
|
||||
view.setPadding(0, 0, paddRight, 0);
|
||||
}
|
||||
|
||||
@BindingAdapter("serverType")
|
||||
public static void setServerType(TextView view, String serverType) {
|
||||
view.setText(serverType);
|
||||
if ("删档内测".equals(serverType) || "不删档内测".equals(serverType)) {
|
||||
@ -259,26 +243,22 @@ public class BindingAdapters {
|
||||
}
|
||||
}
|
||||
|
||||
@BindingAdapter("game")
|
||||
public static void setGame(View view, GameEntity gameEntity) {
|
||||
if (gameEntity != null && view instanceof GameIconView) {
|
||||
((GameIconView) view).displayGameIcon(gameEntity);
|
||||
}
|
||||
}
|
||||
|
||||
@BindingAdapter("gameIcon")
|
||||
public static void setGameIcon(View view, GameEntity gameEntity) {
|
||||
if (gameEntity != null && view instanceof GameIconView) {
|
||||
((GameIconView) view).displayGameIcon(gameEntity.getIcon(), gameEntity.getIconSubscript());
|
||||
}
|
||||
}
|
||||
|
||||
@BindingAdapter("articleType")
|
||||
public static void setArticleType(TextView view, String articleType) {
|
||||
NewsUtils.setNewsType(view, articleType, 0, 0);
|
||||
}
|
||||
|
||||
@BindingAdapter("detailDownloadText")
|
||||
public static void setDetailDownloadText(TextView view, GameEntity gameEntity) {
|
||||
if (gameEntity == null || gameEntity.getApk().isEmpty()) {
|
||||
view.setBackgroundResource(R.drawable.game_item_btn_pause_style);
|
||||
@ -287,7 +267,6 @@ public class BindingAdapters {
|
||||
}
|
||||
}
|
||||
|
||||
@BindingAdapter("liBaoBtn")
|
||||
public static void setLiBaoBtn(TextView view, String status) {
|
||||
if (TextUtils.isEmpty(status)) return;
|
||||
switch (status) {
|
||||
@ -352,7 +331,6 @@ public class BindingAdapters {
|
||||
}
|
||||
|
||||
// 大图下的进度条
|
||||
@BindingAdapter({"downloadButton", "traceEvent", "clickCallBack", "entrance", "location"})
|
||||
public static void setDownloadButton(DownloadProgressBar progressBar,
|
||||
GameEntity gameEntity,
|
||||
ExposureEvent traceEvent,
|
||||
@ -602,6 +580,7 @@ public class BindingAdapters {
|
||||
case notfound:
|
||||
case uncertificated:
|
||||
case unqualified:
|
||||
case unavailable:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@ -692,13 +671,11 @@ public class BindingAdapters {
|
||||
}
|
||||
}
|
||||
|
||||
@BindingAdapter("gameLabelList")
|
||||
public static void setGameLabelList(LinearLayout layout, List<TagStyleEntity> tagStyle) {
|
||||
GameViewUtils.setLabelList(layout.getContext(), layout, tagStyle);
|
||||
}
|
||||
|
||||
// 包含测试开服标签
|
||||
@BindingAdapter("setGameTags")
|
||||
public static void setGameTags(LinearLayout layout, GameEntity gameEntity) {
|
||||
try {
|
||||
if (layout.getVisibility() == View.GONE) return;
|
||||
@ -739,7 +716,6 @@ public class BindingAdapters {
|
||||
}
|
||||
}
|
||||
|
||||
@BindingAdapter("setVideoDetailGameTags")
|
||||
public static void setVideoDetailGameTags(LinearLayout layout, GameEntity gameEntity) {
|
||||
try {
|
||||
ArrayList<TagStyleEntity> tagStyle = new ArrayList<>();
|
||||
@ -767,14 +743,12 @@ public class BindingAdapters {
|
||||
}
|
||||
}
|
||||
|
||||
@BindingAdapter("isRefreshing")
|
||||
public static void isRefreshing(SwipeRefreshLayout layout, LoadStatus status) {
|
||||
if (status != LoadStatus.INIT_LOADING && status != LoadStatus.LIST_LOADING) {
|
||||
layout.setRefreshing(false);
|
||||
}
|
||||
}
|
||||
|
||||
@BindingAdapter({"setGameName", "isShowPlatform", "isShowSuffix"})
|
||||
public static void setGameName(TextView view, GameEntity game, boolean isShowPlatform, @Nullable Boolean isShowSuffix) {
|
||||
if (isShowSuffix == null) isShowSuffix = true; // 默认显示
|
||||
if (isShowPlatform && game.getApk().size() > 0) {
|
||||
@ -787,7 +761,6 @@ public class BindingAdapters {
|
||||
|
||||
}
|
||||
|
||||
@BindingAdapter({"setCommunityImage", "setCommunityVideoImage"})
|
||||
public static void setCommunityImage(SimpleDraweeView imageView, List<String> images, List<CommunityVideoEntity> videos) {
|
||||
if (videos.size() > 0) {
|
||||
CommunityVideoEntity videoEntity = videos.get(0);
|
||||
@ -801,7 +774,6 @@ public class BindingAdapters {
|
||||
}
|
||||
}
|
||||
|
||||
@BindingAdapter({"setCommunityVideoDuration"})
|
||||
public static void setCommunityVideoDuration(TextView mVideoDuration, List<CommunityVideoEntity> videos) {
|
||||
if (videos != null && videos.size() > 0) {
|
||||
CommunityVideoEntity videoEntity = videos.get(0);
|
||||
@ -813,7 +785,6 @@ public class BindingAdapters {
|
||||
}
|
||||
}
|
||||
|
||||
@BindingAdapter({"setGameTags", "setMaxGameTags"})
|
||||
public static void setGameTags(TextView view, List<TagStyleEntity> tags, int maxTags) {
|
||||
if (tags == null) {
|
||||
view.setText("");
|
||||
@ -842,7 +813,6 @@ public class BindingAdapters {
|
||||
view.setText(span);
|
||||
}
|
||||
|
||||
@BindingAdapter({"setVideoData"})
|
||||
public static void setVideoData(TextView view, int count) {
|
||||
if (count > 0) {
|
||||
view.setCompoundDrawablesWithIntrinsicBounds(ContextCompat.getDrawable(view.getContext(), R.drawable.ic_video_data_up), null, null, null);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -87,7 +87,7 @@ class ApplyModeratorDialogFragment : BaseDialogFragment() {
|
||||
}
|
||||
}.show(
|
||||
activity.supportFragmentManager,
|
||||
PrivacyDialogFragment::class.java.simpleName
|
||||
ApplyModeratorDialogFragment::class.java.simpleName
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@ -129,10 +129,17 @@ class CertificationDialog(context: Context, private val authDialogEntity: AuthDi
|
||||
val currentActivity = AppManager.getInstance().currentActivity() ?: return
|
||||
|
||||
AvoidOnResultManager.getInstance(currentActivity as AppCompatActivity)
|
||||
.startForResult(ShellActivity.getIntent(context, ShellActivity.Type.REAL_NAME_INFO, null), object : Callback {
|
||||
.startForResult(
|
||||
ShellActivity.getIntent(
|
||||
context,
|
||||
ShellActivity.Type.REAL_NAME_INFO,
|
||||
).apply {
|
||||
putExtra(EntranceUtils.KEY_GAME_ID, gameId)
|
||||
}, object : Callback {
|
||||
override fun onActivityResult(resultCode: Int, data: Intent?) {
|
||||
if (resultCode == Activity.RESULT_OK && data != null) {
|
||||
val isAuthSuccess = data.getBooleanExtra(UserInfoEditFragment.AUTH_SUCCESS, false)
|
||||
val isAuthSuccess =
|
||||
data.getBooleanExtra(UserInfoEditFragment.AUTH_SUCCESS, false)
|
||||
if (isAuthSuccess) {
|
||||
listener.onConfirm()
|
||||
dismiss()
|
||||
|
||||
@ -23,6 +23,7 @@ import com.gh.common.constant.Constants
|
||||
import com.gh.common.util.*
|
||||
import com.gh.download.DownloadManager
|
||||
import com.gh.gamecenter.R
|
||||
import com.gh.gamecenter.databinding.DialogDeviceRemindBinding
|
||||
import com.gh.gamecenter.entity.DeviceDialogEntity
|
||||
import com.gh.gamecenter.entity.GameEntity
|
||||
import com.google.gson.reflect.TypeToken
|
||||
@ -31,14 +32,13 @@ import com.lightgame.download.DataWatcher
|
||||
import com.lightgame.download.DownloadEntity
|
||||
import com.lightgame.download.DownloadStatus
|
||||
import io.reactivex.disposables.Disposable
|
||||
import kotlinx.android.synthetic.main.dialog_device_remind.view.*
|
||||
import java.lang.ref.WeakReference
|
||||
|
||||
/**
|
||||
* 设备提醒弹窗
|
||||
*/
|
||||
class DeviceRemindDialog(context: Context, val entity: DeviceDialogEntity, val gameEntity: GameEntity) : Dialog(context, R.style.GhAlertDialog) {
|
||||
private lateinit var view: View
|
||||
private val mBinding: DialogDeviceRemindBinding by lazy { DialogDeviceRemindBinding.inflate(layoutInflater) }
|
||||
private var currentPage = 0
|
||||
private var mSlideLooperInterval = 3000L
|
||||
private lateinit var mLooperHandle: LooperHandle
|
||||
@ -96,13 +96,12 @@ class DeviceRemindDialog(context: Context, val entity: DeviceDialogEntity, val g
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
|
||||
view = LayoutInflater.from(context).inflate(R.layout.dialog_device_remind, null)
|
||||
setContentView(view)
|
||||
setContentView(mBinding.root)
|
||||
mDatas.addAll(entity.gallery)
|
||||
view.titleTv.text = entity.title
|
||||
view.contentTv.text = entity.content
|
||||
mBinding.titleTv.text = entity.title
|
||||
mBinding.contentTv.text = entity.content
|
||||
|
||||
view.bannerView.apply {
|
||||
mBinding.bannerView.apply {
|
||||
orientation = ViewPager2.ORIENTATION_HORIZONTAL
|
||||
mAdapter = BannerAdapter()
|
||||
val recyclerView = getChildAt(0) as RecyclerView
|
||||
@ -133,36 +132,36 @@ class DeviceRemindDialog(context: Context, val entity: DeviceDialogEntity, val g
|
||||
}
|
||||
val isFirst = SPUtils.getBoolean(Constants.SP_FIRST_DEVICE_REMIND, false)
|
||||
if (!isFirst) {
|
||||
view.cancelTv.isEnabled = false
|
||||
view.cancelTv.background = ContextCompat.getDrawable(context, R.drawable.button_round_f5f5f5)
|
||||
mBinding.cancelTv.isEnabled = false
|
||||
mBinding.cancelTv.background = ContextCompat.getDrawable(context, R.drawable.button_round_f5f5f5)
|
||||
disposable = countDownTimer(3) { finish, time ->
|
||||
if (finish) {
|
||||
view.cancelTv.isEnabled = true
|
||||
view.cancelTv.background = ContextCompat.getDrawable(context, R.drawable.button_blue_oval)
|
||||
view.cancelTv.text = "我知道了"
|
||||
view.cancelTv.setTextColor(ContextCompat.getColor(context, R.color.white))
|
||||
mBinding.cancelTv.isEnabled = true
|
||||
mBinding.cancelTv.background = ContextCompat.getDrawable(context, R.drawable.button_blue_oval)
|
||||
mBinding.cancelTv.text = "我知道了"
|
||||
mBinding.cancelTv.setTextColor(ContextCompat.getColor(context, R.color.white))
|
||||
} else {
|
||||
view.cancelTv.text = "我知道了(${time}S)"
|
||||
mBinding.cancelTv.text = "我知道了(${time}S)"
|
||||
}
|
||||
}
|
||||
|
||||
SPUtils.setBoolean(Constants.SP_FIRST_DEVICE_REMIND, true)
|
||||
} else {
|
||||
view.noRemindAgainCb.visibility = View.VISIBLE
|
||||
view.cancelTv.text = "我知道了"
|
||||
view.cancelTv.isEnabled = true
|
||||
view.cancelTv.setTextColor(ContextCompat.getColor(context, R.color.white))
|
||||
view.cancelTv.background = ContextCompat.getDrawable(context, R.drawable.button_blue_oval)
|
||||
mBinding.noRemindAgainCb.visibility = View.VISIBLE
|
||||
mBinding.cancelTv.text = "我知道了"
|
||||
mBinding.cancelTv.isEnabled = true
|
||||
mBinding.cancelTv.setTextColor(ContextCompat.getColor(context, R.color.white))
|
||||
mBinding.cancelTv.background = ContextCompat.getDrawable(context, R.drawable.button_blue_oval)
|
||||
}
|
||||
view.cancelTv.setOnClickListener {
|
||||
SPUtils.setBoolean(Constants.SP_NO_REMIND_AGAIN, view.noRemindAgainCb.isChecked)
|
||||
mBinding.cancelTv.setOnClickListener {
|
||||
SPUtils.setBoolean(Constants.SP_NO_REMIND_AGAIN, mBinding.noRemindAgainCb.isChecked)
|
||||
dismiss()
|
||||
}
|
||||
DownloadManager.getInstance().addObserver(dataWatcher)
|
||||
}
|
||||
|
||||
private fun addIndicator() {
|
||||
view.indicatorLl.removeAllViews()
|
||||
mBinding.indicatorLl.removeAllViews()
|
||||
mDatas.forEach { _ ->
|
||||
val indicatorView = ImageView(context).apply {
|
||||
setImageResource(R.drawable.selector_device_remind_indicator)
|
||||
@ -171,13 +170,13 @@ class DeviceRemindDialog(context: Context, val entity: DeviceDialogEntity, val g
|
||||
params.rightMargin = DisplayUtils.dip2px(1F)
|
||||
layoutParams = params
|
||||
}
|
||||
view.indicatorLl.addView(indicatorView)
|
||||
mBinding.indicatorLl.addView(indicatorView)
|
||||
}
|
||||
}
|
||||
|
||||
private fun slideIndicator(position: Int) {
|
||||
for (i in 0 until view.indicatorLl.childCount) {
|
||||
val childAt = view.indicatorLl.getChildAt(i)
|
||||
for (i in 0 until mBinding.indicatorLl.childCount) {
|
||||
val childAt = mBinding.indicatorLl.getChildAt(i)
|
||||
childAt.isSelected = i == position
|
||||
}
|
||||
}
|
||||
@ -210,7 +209,7 @@ class DeviceRemindDialog(context: Context, val entity: DeviceDialogEntity, val g
|
||||
|
||||
fun scrollToNextPage() {
|
||||
currentPage++
|
||||
view.bannerView.setCurrentItem(currentPage, true)
|
||||
mBinding.bannerView.setCurrentItem(currentPage, true)
|
||||
}
|
||||
|
||||
fun startScroll() {
|
||||
|
||||
@ -19,6 +19,7 @@ import com.gh.common.util.PermissionHelper.INSTALL_PERMISSION_CODE
|
||||
import com.gh.common.xapk.XapkInstaller
|
||||
import com.gh.gamecenter.R
|
||||
import com.lightgame.download.DownloadEntity
|
||||
import com.lightgame.utils.Utils
|
||||
import kotlin.random.Random
|
||||
|
||||
class InstallPermissionDialogFragment : BaseTrackableDialogFragment() {
|
||||
@ -26,7 +27,7 @@ class InstallPermissionDialogFragment : BaseTrackableDialogFragment() {
|
||||
lateinit var mView: View
|
||||
var isXapk = false
|
||||
var url: String = ""
|
||||
var mCallBack: (() -> Unit)? = null
|
||||
var mCallBack: ((isFromPermissionGrantedCallback: Boolean) -> Unit)? = null
|
||||
|
||||
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
|
||||
mView = inflater.inflate(R.layout.dialog_install_permission, null, false)
|
||||
@ -56,7 +57,7 @@ class InstallPermissionDialogFragment : BaseTrackableDialogFragment() {
|
||||
closeTv.setOnClickListener {
|
||||
MtaHelper.onEvent(getEvent(), getKey(), "文案样式_点击以后再说")
|
||||
if (isXapk) {
|
||||
mCallBack?.invoke()
|
||||
mCallBack?.invoke(false)
|
||||
}
|
||||
dismiss()
|
||||
}
|
||||
@ -77,9 +78,11 @@ class InstallPermissionDialogFragment : BaseTrackableDialogFragment() {
|
||||
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
||||
super.onActivityResult(requestCode, resultCode, data)
|
||||
if (resultCode == RESULT_OK && requestCode == INSTALL_PERMISSION_CODE) {
|
||||
SPUtils.setString(Constants.SP_XAPK_UNZIP_ACTIVITY, "")
|
||||
SPUtils.setString(Constants.SP_XAPK_URL, "")
|
||||
mCallBack?.invoke()
|
||||
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.R) {
|
||||
SPUtils.setString(Constants.SP_XAPK_UNZIP_ACTIVITY, "")
|
||||
SPUtils.setString(Constants.SP_XAPK_URL, "")
|
||||
}
|
||||
mCallBack?.invoke(true)
|
||||
dismiss()
|
||||
}
|
||||
}
|
||||
@ -90,27 +93,27 @@ class InstallPermissionDialogFragment : BaseTrackableDialogFragment() {
|
||||
|
||||
companion object {
|
||||
@JvmStatic
|
||||
fun show(activity: AppCompatActivity, downloadEntity: DownloadEntity, callBack: (() -> Unit)?) {
|
||||
fun show(activity: AppCompatActivity, downloadEntity: DownloadEntity, callBack: ((isFromPermissionGrantedCallback: Boolean) -> Unit)?) {
|
||||
val isXapk = XapkInstaller.XAPK_EXTENSION_NAME == downloadEntity.path.getExtension()
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
|
||||
callBack?.invoke()
|
||||
callBack?.invoke(false)
|
||||
return
|
||||
}
|
||||
val haveInstallPermission = activity.packageManager.canRequestPackageInstalls()
|
||||
if (haveInstallPermission) {
|
||||
callBack?.invoke()
|
||||
callBack?.invoke(false)
|
||||
return
|
||||
}
|
||||
if (isXapk) {
|
||||
val xapkUnzipVersions = Config.getSettings()?.permissionPopupAppliedVersions?.xapkUnzip
|
||||
if (xapkUnzipVersions?.contains(Build.VERSION.SDK_INT.toString()) == false) {
|
||||
callBack?.invoke()
|
||||
callBack?.invoke(false)
|
||||
return
|
||||
}
|
||||
} else {
|
||||
val installVersions = Config.getSettings()?.permissionPopupAppliedVersions?.install
|
||||
if (installVersions?.contains(Build.VERSION.SDK_INT.toString()) == false) {
|
||||
callBack?.invoke()
|
||||
callBack?.invoke(false)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
@ -16,10 +16,10 @@ import com.gh.common.util.PermissionHelper
|
||||
import com.gh.common.util.fromHtml
|
||||
import com.gh.gamecenter.BuildConfig
|
||||
import com.gh.gamecenter.R
|
||||
import com.gh.gamecenter.databinding.DialogNotificationHintBinding
|
||||
import com.gh.gamecenter.entity.NotificationStyleEntity
|
||||
import com.gh.gamecenter.entity.NotificationUgc
|
||||
import com.lightgame.utils.Utils
|
||||
import kotlinx.android.synthetic.main.dialog_notification_hint.*
|
||||
import org.json.JSONArray
|
||||
import java.io.BufferedReader
|
||||
import java.io.IOException
|
||||
@ -30,9 +30,10 @@ import kotlin.random.Random
|
||||
class NotificationHintDialogFragment : BaseTrackableDialogFragment() {
|
||||
|
||||
private var mNotificationUgc: NotificationUgc? = null
|
||||
private val mBinding: DialogNotificationHintBinding by lazy { DialogNotificationHintBinding.inflate(layoutInflater) }
|
||||
|
||||
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
|
||||
return inflater.inflate(R.layout.dialog_notification_hint, null)
|
||||
return mBinding.root
|
||||
}
|
||||
|
||||
@Suppress("DEPRECATION")
|
||||
@ -55,39 +56,41 @@ class NotificationHintDialogFragment : BaseTrackableDialogFragment() {
|
||||
val styleEntityJson = jsonObj.getJSONObject(mNotificationUgc!!.value)
|
||||
val styleEntity = GsonUtils.fromJson(styleEntityJson.toString(), NotificationStyleEntity::class.java)
|
||||
val drawableId = resources.getIdentifier(styleEntity.image, "drawable", requireContext().packageName)
|
||||
notificationIv.setImageDrawable(ContextCompat.getDrawable(requireContext(), drawableId))
|
||||
notificationTitle.text = styleEntity.title
|
||||
notificationContent.text = styleEntity.content.fromHtml()
|
||||
if (index == 0) {
|
||||
closeIv.setImageDrawable(ContextCompat.getDrawable(requireContext(), R.drawable.ic_notification_close_1))
|
||||
} else {
|
||||
activateTv.background = ContextCompat.getDrawable(requireContext(), R.drawable.bg_notification_open_btn_style_1)
|
||||
activateTv.text = "优雅的开启"
|
||||
}
|
||||
mBinding.run {
|
||||
notificationIv.setImageDrawable(ContextCompat.getDrawable(requireContext(), drawableId))
|
||||
notificationTitle.text = styleEntity.title
|
||||
notificationContent.text = styleEntity.content.fromHtml()
|
||||
if (index == 0) {
|
||||
closeIv.setImageDrawable(ContextCompat.getDrawable(requireContext(), R.drawable.ic_notification_close_1))
|
||||
} else {
|
||||
activateTv.background = ContextCompat.getDrawable(requireContext(), R.drawable.bg_notification_open_btn_style_1)
|
||||
activateTv.text = "优雅的开启"
|
||||
}
|
||||
|
||||
activateTv.setOnClickListener {
|
||||
MtaHelper.onEventWithBasicDeviceInfo(getEvent(), getKey(), "点击立即开启")
|
||||
MtaHelper.onEventWithBasicDeviceInfo(getEvent(), getKey(), "${styleEntity.scenes}_${styleEntity.styleNo}_点击立即开启")
|
||||
dismissAllowingStateLoss()
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
//这种方案适用于 API 26, 即8.0(含8.0)以上可以用
|
||||
val intent = Intent()
|
||||
intent.action = Settings.ACTION_APP_NOTIFICATION_SETTINGS
|
||||
intent.putExtra(Settings.EXTRA_APP_PACKAGE, BuildConfig.APPLICATION_ID)
|
||||
try {
|
||||
startActivity(intent)
|
||||
} catch (e: ActivityNotFoundException) {
|
||||
activateTv.setOnClickListener {
|
||||
MtaHelper.onEventWithBasicDeviceInfo(getEvent(), getKey(), "点击立即开启")
|
||||
MtaHelper.onEventWithBasicDeviceInfo(getEvent(), getKey(), "${styleEntity.scenes}_${styleEntity.styleNo}_点击立即开启")
|
||||
dismissAllowingStateLoss()
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
//这种方案适用于 API 26, 即8.0(含8.0)以上可以用
|
||||
val intent = Intent()
|
||||
intent.action = Settings.ACTION_APP_NOTIFICATION_SETTINGS
|
||||
intent.putExtra(Settings.EXTRA_APP_PACKAGE, BuildConfig.APPLICATION_ID)
|
||||
try {
|
||||
startActivity(intent)
|
||||
} catch (e: ActivityNotFoundException) {
|
||||
PermissionHelper.toPermissionSetting(requireActivity())
|
||||
}
|
||||
} else {
|
||||
PermissionHelper.toPermissionSetting(requireActivity())
|
||||
}
|
||||
} else {
|
||||
PermissionHelper.toPermissionSetting(requireActivity())
|
||||
}
|
||||
}
|
||||
|
||||
closeIv.setOnClickListener {
|
||||
dismissAllowingStateLoss()
|
||||
MtaHelper.onEventWithBasicDeviceInfo(getEvent(), getKey(), "点击关闭")
|
||||
MtaHelper.onEventWithBasicDeviceInfo(getEvent(), getKey(), "${styleEntity.scenes}_${styleEntity.styleNo}_点击关闭")
|
||||
closeIv.setOnClickListener {
|
||||
dismissAllowingStateLoss()
|
||||
MtaHelper.onEventWithBasicDeviceInfo(getEvent(), getKey(), "点击关闭")
|
||||
MtaHelper.onEventWithBasicDeviceInfo(getEvent(), getKey(), "${styleEntity.scenes}_${styleEntity.styleNo}_点击关闭")
|
||||
}
|
||||
}
|
||||
|
||||
dialog?.setCanceledOnTouchOutside(true)
|
||||
|
||||
@ -62,9 +62,11 @@ class PackageCheckDialogFragment : BaseDialogFragment() {
|
||||
detectionObjects?.forEach { detectionObject ->
|
||||
if (detectionObject.packages.contains(packageName)) {
|
||||
val packageLink = gameEntity?.packageDialog?.links?.find { it.buttonLink }
|
||||
LogUtils.uploadPackageCheck("pkg_check_pop_download", if (DownloadStatus.add == downloadEntity.status) "下载开始" else "下载完成",
|
||||
gameEntity, packageLink?.text ?: "", packageLink?.title
|
||||
?: "", downloadEntity.gameId, downloadEntity.getMetaExtra(Constants.GAME_NAME))
|
||||
LogUtils.uploadPackageCheck(
|
||||
"pkg_check_pop_download", if (DownloadStatus.add == downloadEntity.status) "下载开始" else "下载完成",
|
||||
gameEntity, packageLink?.text ?: "", packageLink?.title
|
||||
?: "", downloadEntity.gameId, downloadEntity.getMetaExtra(Constants.GAME_NAME)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -98,8 +100,10 @@ class PackageCheckDialogFragment : BaseDialogFragment() {
|
||||
|
||||
val spanBuilder = SpanBuilder(it.linkHintText).build()
|
||||
it.links.forEachIndexed { index, link ->
|
||||
val linkSpan = SpanBuilder(link.title ?: "").click(0, (link.title
|
||||
?: "").length, R.color.theme_font, true) {
|
||||
val linkSpan = SpanBuilder(link.title ?: "").click(
|
||||
0, (link.title
|
||||
?: "").length, R.color.theme_font, true
|
||||
) {
|
||||
LogUtils.uploadPackageCheck("pkg_check_pop_click", "点击链接", gameEntity, link.text, link.title, "", "")
|
||||
DirectUtils.directToLinkPage(requireContext(), link, "包名检测弹窗", "")
|
||||
}.build()
|
||||
@ -205,6 +209,7 @@ class PackageCheckDialogFragment : BaseDialogFragment() {
|
||||
if (it >= mDuration) {
|
||||
mDisposable?.dispose()
|
||||
binding.downloadBtn.isEnabled = true
|
||||
binding.downloadBtn.background = R.drawable.bg_notification_open_btn_style_2.toDrawable()
|
||||
}
|
||||
}
|
||||
val animator = ValueAnimator.ofInt(0, 100)
|
||||
@ -273,7 +278,8 @@ class PackageCheckDialogFragment : BaseDialogFragment() {
|
||||
}
|
||||
}
|
||||
|
||||
inner class PackageCheckAdapter(val context: Context, val entities: ArrayList<DetectionObjectEntity>) : BaseRecyclerAdapter<RecyclerView.ViewHolder>(context) {
|
||||
inner class PackageCheckAdapter(val context: Context, val entities: ArrayList<DetectionObjectEntity>) :
|
||||
BaseRecyclerAdapter<RecyclerView.ViewHolder>(context) {
|
||||
private var index = -1
|
||||
|
||||
fun notifyPackages() {
|
||||
@ -282,7 +288,7 @@ class PackageCheckDialogFragment : BaseDialogFragment() {
|
||||
}
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
|
||||
return PackageCheckViewHolder(PackageCheckItemBinding.bind(LayoutInflater.from(context).inflate(R.layout.package_check_item, parent, false)))
|
||||
return PackageCheckViewHolder(parent.toBinding())
|
||||
}
|
||||
|
||||
override fun getItemCount(): Int = entities.size
|
||||
@ -290,7 +296,7 @@ class PackageCheckDialogFragment : BaseDialogFragment() {
|
||||
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
|
||||
if (holder is PackageCheckViewHolder) {
|
||||
val entity = entities[position]
|
||||
holder.binding.entity = entity
|
||||
holder.binding.gameNameTv.text = entity.text
|
||||
if (position <= index) {
|
||||
val isAllInstalled = checkDetectionsInstalled(mAllInstalledPackages, entity.packages)
|
||||
if (isAllInstalled) {
|
||||
@ -339,7 +345,8 @@ class PackageCheckDialogFragment : BaseDialogFragment() {
|
||||
|
||||
if (!activity.lifecycle.currentState.isAtLeast(Lifecycle.State.RESUMED)) return
|
||||
|
||||
var dialogFragment = activity.supportFragmentManager.findFragmentByTag(PackageCheckDialogFragment::class.java.simpleName) as? PackageCheckDialogFragment
|
||||
var dialogFragment =
|
||||
activity.supportFragmentManager.findFragmentByTag(PackageCheckDialogFragment::class.java.simpleName) as? PackageCheckDialogFragment
|
||||
if (dialogFragment == null) {
|
||||
dialogFragment = PackageCheckDialogFragment()
|
||||
dialogFragment.gameEntity = gameEntity
|
||||
|
||||
@ -1,157 +0,0 @@
|
||||
package com.gh.common.dialog
|
||||
|
||||
import android.app.Dialog
|
||||
import android.content.DialogInterface
|
||||
import android.os.Bundle
|
||||
import android.text.SpannableStringBuilder
|
||||
import android.text.Spanned
|
||||
import android.text.TextPaint
|
||||
import android.text.method.ScrollingMovementMethod
|
||||
import android.text.style.ClickableSpan
|
||||
import android.view.*
|
||||
import android.widget.TextView
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.fragment.app.FragmentTransaction
|
||||
import com.gh.base.fragment.BaseDialogFragment
|
||||
import com.gh.common.util.dip2px
|
||||
import com.gh.common.view.CustomLinkMovementMethod
|
||||
import com.gh.gamecenter.R
|
||||
import com.gh.gamecenter.WebActivity
|
||||
|
||||
class PrivacyDialogFragment : BaseDialogFragment() {
|
||||
|
||||
// private val mLocalPrivacyHtml = "file:///android_asset/privacy_policies.html"
|
||||
// private val mLocalRegulationHtml = "file:///android_asset/user_regulation.html"
|
||||
|
||||
var containerView: View? = null
|
||||
var mCallBack: ((isSuccess: Boolean) -> Unit)? = null
|
||||
|
||||
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
|
||||
containerView = LayoutInflater.from(requireContext()).inflate(R.layout.dialog_privacy_protocol, null, false)
|
||||
return containerView
|
||||
}
|
||||
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
// val mWebViewPrivacy = containerView?.findViewById<WebView>(R.id.webView)
|
||||
// val mWebViewRegulation = containerView?.findViewById<WebView>(R.id.webView2)
|
||||
//
|
||||
// mWebViewPrivacy?.isHorizontalScrollBarEnabled = false
|
||||
// mWebViewRegulation?.isHorizontalScrollBarEnabled = false
|
||||
|
||||
val contentTv = containerView?.findViewById<TextView>(R.id.contentTv)
|
||||
val descTv = containerView?.findViewById<TextView>(R.id.descTv)
|
||||
contentTv?.movementMethod = ScrollingMovementMethod()
|
||||
|
||||
val skipText = SpannableStringBuilder("查看完整版的隐私政策和用户协议")
|
||||
skipText.setSpan(object : ClickableSpan() {
|
||||
override fun updateDrawState(ds: TextPaint) {
|
||||
super.updateDrawState(ds)
|
||||
ds.color = ContextCompat.getColor(requireContext(), R.color.theme_font)
|
||||
ds.isUnderlineText = false
|
||||
}
|
||||
|
||||
override fun onClick(widget: View) {
|
||||
val intent = WebActivity.getIntent(requireContext(), context!!.getString(R.string.privacy_policy_url), true)
|
||||
context?.startActivity(intent)
|
||||
}
|
||||
}, skipText.length - 9, skipText.length - 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
|
||||
|
||||
skipText.setSpan(object : ClickableSpan() {
|
||||
override fun updateDrawState(ds: TextPaint) {
|
||||
super.updateDrawState(ds)
|
||||
ds.color = ContextCompat.getColor(requireContext(), R.color.theme_font)
|
||||
ds.isUnderlineText = false
|
||||
}
|
||||
|
||||
override fun onClick(widget: View) {
|
||||
val intent = WebActivity.getIntent(requireContext(), context!!.getString(R.string.disclaimer_url), true)
|
||||
context?.startActivity(intent)
|
||||
}
|
||||
}, skipText.length - 4, skipText.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
|
||||
descTv?.movementMethod = CustomLinkMovementMethod()
|
||||
descTv?.text = skipText
|
||||
|
||||
// val mWebViewPrivacy = containerView?.findViewById<WebView>(R.id.webView)
|
||||
//
|
||||
// mWebViewPrivacy?.isHorizontalScrollBarEnabled = false
|
||||
//
|
||||
// val settingsArrayList = arrayListOf(mWebViewPrivacy?.settings, mWebViewRegulation?.settings)
|
||||
//
|
||||
// for (settings in settingsArrayList) {
|
||||
// settings?.javaScriptEnabled = true
|
||||
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||
// settings?.mixedContentMode = WebSettings.MIXED_CONTENT_ALWAYS_ALLOW
|
||||
// }
|
||||
// // 避免提示网页有害信息不能访问
|
||||
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
// settings?.safeBrowsingEnabled = false
|
||||
// }
|
||||
//
|
||||
// // 适配大于屏幕宽度的页面
|
||||
// settings?.useWideViewPort = true
|
||||
// settings?.loadWithOverviewMode = true
|
||||
// settings?.domStorageEnabled = true
|
||||
//
|
||||
// // 自适应屏幕
|
||||
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
||||
// settings?.layoutAlgorithm = WebSettings.LayoutAlgorithm.TEXT_AUTOSIZING
|
||||
// }
|
||||
// }
|
||||
|
||||
// mWebViewPrivacy?.webViewClient = client
|
||||
// mWebViewRegulation?.webViewClient = client
|
||||
|
||||
containerView?.findViewById<View>(R.id.refuseTv)?.setOnClickListener {
|
||||
mCallBack?.invoke(false)
|
||||
dismissAllowingStateLoss()
|
||||
}
|
||||
containerView?.findViewById<View>(R.id.agreeTv)?.setOnClickListener {
|
||||
mCallBack?.invoke(true)
|
||||
dismissAllowingStateLoss()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
|
||||
val createDialog = super.onCreateDialog(savedInstanceState)
|
||||
createDialog.setCanceledOnTouchOutside(false)
|
||||
createDialog.setOnKeyListener(object : DialogInterface.OnKeyListener {
|
||||
override fun onKey(dialog: DialogInterface?, keyCode: Int, event: KeyEvent?): Boolean {
|
||||
if (keyCode == KeyEvent.KEYCODE_BACK) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
})
|
||||
|
||||
val window = createDialog.window
|
||||
window?.setGravity(Gravity.CENTER)
|
||||
return createDialog
|
||||
}
|
||||
|
||||
override fun onStart() {
|
||||
super.onStart()
|
||||
val width = requireContext().resources.displayMetrics.widthPixels - 60F.dip2px()
|
||||
val height = ViewGroup.LayoutParams.WRAP_CONTENT
|
||||
dialog?.window?.setLayout(width, height)
|
||||
}
|
||||
|
||||
companion object {
|
||||
@JvmStatic
|
||||
fun show(activity: AppCompatActivity, callBack: ((isSuccess: Boolean) -> Unit)?) {
|
||||
var privacyDialogFragment = activity.supportFragmentManager.findFragmentByTag(PrivacyDialogFragment::class.java.simpleName) as? PrivacyDialogFragment
|
||||
if (privacyDialogFragment != null) {
|
||||
privacyDialogFragment.mCallBack = callBack
|
||||
val transaction: FragmentTransaction = activity.supportFragmentManager.beginTransaction()
|
||||
transaction.show(privacyDialogFragment)
|
||||
transaction.commit()
|
||||
} else {
|
||||
privacyDialogFragment = PrivacyDialogFragment().apply {
|
||||
mCallBack = callBack
|
||||
}
|
||||
privacyDialogFragment.show(activity.supportFragmentManager, PrivacyDialogFragment::class.java.simpleName)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,190 @@
|
||||
package com.gh.common.dialog
|
||||
|
||||
import android.app.Dialog
|
||||
import android.content.DialogInterface
|
||||
import android.os.Bundle
|
||||
import android.text.SpannableStringBuilder
|
||||
import android.text.Spanned
|
||||
import android.text.TextPaint
|
||||
import android.text.method.ScrollingMovementMethod
|
||||
import android.text.style.ClickableSpan
|
||||
import android.view.*
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.fragment.app.FragmentActivity
|
||||
import androidx.fragment.app.FragmentTransaction
|
||||
import com.gh.base.fragment.BaseDialogFragment
|
||||
import com.gh.common.constant.Constants
|
||||
import com.gh.common.util.SPUtils
|
||||
import com.gh.common.util.dip2px
|
||||
import com.gh.common.util.fromHtml
|
||||
import com.gh.common.view.CustomLinkMovementMethod
|
||||
import com.gh.gamecenter.R
|
||||
import com.gh.gamecenter.WebActivity
|
||||
import com.gh.gamecenter.databinding.DialogPrivacyProtocolBinding
|
||||
import com.gh.gamecenter.entity.DialogEntity
|
||||
import com.lightgame.utils.AppManager
|
||||
import splitties.bundle.put
|
||||
|
||||
class PrivacyPolicyDialogFragment : BaseDialogFragment() {
|
||||
|
||||
private var mCallBack: ((isSuccess: Boolean) -> Unit)? = null
|
||||
private val mBinding by lazy { DialogPrivacyProtocolBinding.inflate(layoutInflater) }
|
||||
|
||||
override fun onCreateView(
|
||||
inflater: LayoutInflater,
|
||||
container: ViewGroup?,
|
||||
savedInstanceState: Bundle?
|
||||
): View {
|
||||
return mBinding.root
|
||||
}
|
||||
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
|
||||
mBinding.contentTv.movementMethod = ScrollingMovementMethod()
|
||||
|
||||
val privacyPolicyEntity = arguments?.get(KEY_DATA) as? DialogEntity.PrivacyPolicyEntity
|
||||
if (privacyPolicyEntity == null) {
|
||||
showPreLaunchStyle()
|
||||
} else {
|
||||
showUpdatedStyle(privacyPolicyEntity)
|
||||
}
|
||||
}
|
||||
|
||||
private fun showUpdatedStyle(privacyPolicyEntity: DialogEntity.PrivacyPolicyEntity) {
|
||||
mBinding.titleIv.visibility = View.VISIBLE
|
||||
mBinding.privacyTitleTv.text = "光环助手《隐私协议》更新"
|
||||
mBinding.contentTv.text = privacyPolicyEntity.content.fromHtml()
|
||||
|
||||
val skipText = SpannableStringBuilder("查看隐私政策详情")
|
||||
skipText.setSpan(object : ClickableSpan() {
|
||||
override fun updateDrawState(ds: TextPaint) {
|
||||
super.updateDrawState(ds)
|
||||
ds.color = ContextCompat.getColor(requireContext(), R.color.theme_font)
|
||||
ds.isUnderlineText = false
|
||||
}
|
||||
|
||||
override fun onClick(widget: View) {
|
||||
val intent = WebActivity.getIntent(requireContext(), context!!.getString(R.string.privacy_policy_url), true)
|
||||
context?.startActivity(intent)
|
||||
}
|
||||
}, skipText.length - 6, skipText.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
|
||||
mBinding.descTv.movementMethod = CustomLinkMovementMethod()
|
||||
mBinding.descTv.text = skipText
|
||||
|
||||
if (privacyPolicyEntity.alertType == "INFORM") {
|
||||
mBinding.refuseTv.visibility = View.GONE
|
||||
mBinding.agreeTv.text = "我知道了"
|
||||
mBinding.agreeTv.setOnClickListener {
|
||||
SPUtils.setString(Constants.SP_LAST_ACCEPTED_PRIVACY_DIALOG_ID, privacyPolicyEntity.id)
|
||||
mCallBack?.invoke(true)
|
||||
dismissAllowingStateLoss()
|
||||
}
|
||||
} else {
|
||||
mBinding.refuseTv.text = "不同意退出"
|
||||
mBinding.agreeTv.text = "同意"
|
||||
mBinding.refuseTv.setOnClickListener {
|
||||
dismissAllowingStateLoss()
|
||||
AppManager.getInstance().finishAllActivity()
|
||||
}
|
||||
mBinding.agreeTv.setOnClickListener {
|
||||
SPUtils.setString(Constants.SP_LAST_ACCEPTED_PRIVACY_DIALOG_ID, privacyPolicyEntity.id)
|
||||
mCallBack?.invoke(true)
|
||||
dismissAllowingStateLoss()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun showPreLaunchStyle() {
|
||||
val skipText = SpannableStringBuilder("查看完整版的隐私政策和用户协议")
|
||||
|
||||
skipText.setSpan(object : ClickableSpan() {
|
||||
override fun updateDrawState(ds: TextPaint) {
|
||||
super.updateDrawState(ds)
|
||||
ds.color = ContextCompat.getColor(requireContext(), R.color.theme_font)
|
||||
ds.isUnderlineText = false
|
||||
}
|
||||
|
||||
override fun onClick(widget: View) {
|
||||
val intent = WebActivity.getIntent(requireContext(), context!!.getString(R.string.privacy_policy_url), true)
|
||||
context?.startActivity(intent)
|
||||
}
|
||||
}, skipText.length - 9, skipText.length - 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
|
||||
|
||||
skipText.setSpan(object : ClickableSpan() {
|
||||
override fun updateDrawState(ds: TextPaint) {
|
||||
super.updateDrawState(ds)
|
||||
ds.color = ContextCompat.getColor(requireContext(), R.color.theme_font)
|
||||
ds.isUnderlineText = false
|
||||
}
|
||||
|
||||
override fun onClick(widget: View) {
|
||||
val intent = WebActivity.getIntent(requireContext(), context!!.getString(R.string.disclaimer_url), true)
|
||||
context?.startActivity(intent)
|
||||
}
|
||||
}, skipText.length - 4, skipText.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
|
||||
mBinding.descTv.movementMethod = CustomLinkMovementMethod()
|
||||
mBinding.descTv.text = skipText
|
||||
|
||||
mBinding.refuseTv.setOnClickListener {
|
||||
mCallBack?.invoke(false)
|
||||
dismissAllowingStateLoss()
|
||||
}
|
||||
mBinding.agreeTv.setOnClickListener {
|
||||
mCallBack?.invoke(true)
|
||||
dismissAllowingStateLoss()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
|
||||
val createDialog = super.onCreateDialog(savedInstanceState)
|
||||
createDialog.setCanceledOnTouchOutside(false)
|
||||
createDialog.setOnKeyListener(object : DialogInterface.OnKeyListener {
|
||||
override fun onKey(dialog: DialogInterface?, keyCode: Int, event: KeyEvent?): Boolean {
|
||||
if (keyCode == KeyEvent.KEYCODE_BACK) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
})
|
||||
|
||||
val window = createDialog.window
|
||||
window?.setGravity(Gravity.CENTER)
|
||||
return createDialog
|
||||
}
|
||||
|
||||
override fun onStart() {
|
||||
super.onStart()
|
||||
val width = requireContext().resources.displayMetrics.widthPixels - 60F.dip2px()
|
||||
val height = ViewGroup.LayoutParams.WRAP_CONTENT
|
||||
dialog?.window?.setLayout(width, height)
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val KEY_DATA = "data"
|
||||
|
||||
@JvmStatic
|
||||
fun show(activity: FragmentActivity,
|
||||
privacyPolicyEntity: DialogEntity.PrivacyPolicyEntity? = null,
|
||||
callBack: ((isSuccess: Boolean) -> Unit)?) {
|
||||
var privacyDialogFragment = activity.supportFragmentManager.findFragmentByTag(PrivacyPolicyDialogFragment::class.java.simpleName) as? PrivacyPolicyDialogFragment
|
||||
if (privacyDialogFragment != null) {
|
||||
privacyDialogFragment.mCallBack = callBack
|
||||
val transaction: FragmentTransaction = activity.supportFragmentManager.beginTransaction()
|
||||
transaction.show(privacyDialogFragment)
|
||||
transaction.commit()
|
||||
} else {
|
||||
privacyDialogFragment = PrivacyPolicyDialogFragment().apply {
|
||||
mCallBack = callBack
|
||||
}
|
||||
}
|
||||
privacyDialogFragment.arguments = Bundle().apply {
|
||||
put(KEY_DATA, privacyPolicyEntity)
|
||||
}
|
||||
privacyDialogFragment.show(
|
||||
activity.supportFragmentManager,
|
||||
PrivacyPolicyDialogFragment::class.java.simpleName
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,384 +1,384 @@
|
||||
package com.gh.common.dialog
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.app.Application
|
||||
import android.os.Bundle
|
||||
import android.text.Html
|
||||
import android.view.*
|
||||
import android.view.animation.AnimationUtils
|
||||
import android.widget.EditText
|
||||
import android.widget.TextView
|
||||
import androidx.lifecycle.AndroidViewModel
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import androidx.lifecycle.Observer
|
||||
import butterknife.BindView
|
||||
import butterknife.ButterKnife
|
||||
import butterknife.OnClick
|
||||
import com.gh.base.fragment.BaseDialogFragment
|
||||
import com.gh.common.AppExecutor
|
||||
import com.gh.common.constant.Config
|
||||
import com.gh.common.history.HistoryHelper
|
||||
import com.gh.common.repository.ReservationRepository
|
||||
import com.gh.common.util.*
|
||||
import com.gh.gamecenter.R
|
||||
import com.gh.gamecenter.entity.GameEntity
|
||||
import com.gh.gamecenter.entity.NotificationUgc
|
||||
import com.gh.gamecenter.manager.UserManager
|
||||
import com.gh.gamecenter.retrofit.BiResponse
|
||||
import com.gh.gamecenter.retrofit.RetrofitManager
|
||||
import com.halo.assistant.HaloApp
|
||||
import com.lightgame.utils.Utils
|
||||
import io.reactivex.android.schedulers.AndroidSchedulers
|
||||
import io.reactivex.schedulers.Schedulers
|
||||
import okhttp3.ResponseBody
|
||||
import org.json.JSONArray
|
||||
import org.json.JSONObject
|
||||
|
||||
// 预约弹窗
|
||||
@Deprecated("v5.6.0废弃")
|
||||
class ReserveDialogFragment
|
||||
: BaseDialogFragment(), KeyboardHeightObserver {
|
||||
// : BaseTrackableDialogFragment() {
|
||||
|
||||
@BindView(R.id.reserve_hint_tv)
|
||||
lateinit var reserveHintTv: TextView
|
||||
|
||||
@BindView(R.id.reserve_content_tv)
|
||||
lateinit var reserveContentTv: TextView
|
||||
|
||||
@BindView(R.id.reserve_completed_content_tv)
|
||||
lateinit var reserveCompletedContentTv: TextView
|
||||
|
||||
@BindView(R.id.mobile_et)
|
||||
lateinit var mobileEt: EditText
|
||||
|
||||
@BindView(R.id.reserve_container)
|
||||
lateinit var reserveContainer: View
|
||||
|
||||
@BindView(R.id.reserve_completed_container)
|
||||
lateinit var reserveCompletedContainer: View
|
||||
|
||||
@BindView(R.id.customizable_btn)
|
||||
lateinit var customizableBtn: TextView
|
||||
|
||||
@BindView(R.id.content_container)
|
||||
lateinit var contentContainer: View
|
||||
|
||||
@BindView(R.id.mobile_index_container)
|
||||
lateinit var mobileIndexContainer: View
|
||||
|
||||
@BindView(R.id.mobile_index_reserve)
|
||||
lateinit var mobileIndexReserve: TextView
|
||||
|
||||
@BindView(R.id.mobile_index_user)
|
||||
lateinit var mobileIndexUser: TextView
|
||||
|
||||
@BindView(R.id.mobile_et_delete)
|
||||
lateinit var mobileEtDelete: View
|
||||
|
||||
@BindView(R.id.layout_container)
|
||||
lateinit var layoutContainer: View
|
||||
|
||||
private lateinit var mViewModel: ReserveViewModel
|
||||
|
||||
var successCallback: SuccessCallback? = null
|
||||
|
||||
private var mGame: GameEntity? = null
|
||||
private var mGameId: String = ""
|
||||
private var mGameName: String = ""
|
||||
|
||||
private var mKeyboardHeightProvider: KeyboardHeightProvider? = null
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
|
||||
mGame = requireArguments().getParcelable(EntranceUtils.KEY_GAME)
|
||||
mGameId = mGame?.id ?:""
|
||||
mGameName = mGame?.name ?:""
|
||||
|
||||
mViewModel = viewModelProvider()
|
||||
mKeyboardHeightProvider = KeyboardHeightProvider(activity)
|
||||
mKeyboardHeightProvider?.start()
|
||||
}
|
||||
|
||||
override fun onActivityCreated(savedInstanceState: Bundle?) {
|
||||
super.onActivityCreated(savedInstanceState)
|
||||
dialog?.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE)
|
||||
}
|
||||
|
||||
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
|
||||
return inflater.inflate(R.layout.dialog_reserve_game, null)
|
||||
}
|
||||
|
||||
// override fun getEvent(): String {
|
||||
// return "预约游戏"
|
||||
//package com.gh.common.dialog
|
||||
//
|
||||
//import android.annotation.SuppressLint
|
||||
//import android.app.Application
|
||||
//import android.os.Bundle
|
||||
//import android.text.Html
|
||||
//import android.view.*
|
||||
//import android.view.animation.AnimationUtils
|
||||
//import android.widget.EditText
|
||||
//import android.widget.TextView
|
||||
//import androidx.lifecycle.AndroidViewModel
|
||||
//import androidx.lifecycle.MutableLiveData
|
||||
//import androidx.lifecycle.Observer
|
||||
//import butterknife.BindView
|
||||
//import butterknife.ButterKnife
|
||||
//import butterknife.OnClick
|
||||
//import com.gh.base.fragment.BaseDialogFragment
|
||||
//import com.gh.common.AppExecutor
|
||||
//import com.gh.common.constant.Config
|
||||
//import com.gh.common.history.HistoryHelper
|
||||
//import com.gh.common.repository.ReservationRepository
|
||||
//import com.gh.common.util.*
|
||||
//import com.gh.gamecenter.R
|
||||
//import com.gh.gamecenter.entity.GameEntity
|
||||
//import com.gh.gamecenter.entity.NotificationUgc
|
||||
//import com.gh.gamecenter.manager.UserManager
|
||||
//import com.gh.gamecenter.retrofit.BiResponse
|
||||
//import com.gh.gamecenter.retrofit.RetrofitManager
|
||||
//import com.halo.assistant.HaloApp
|
||||
//import com.lightgame.utils.Utils
|
||||
//import io.reactivex.android.schedulers.AndroidSchedulers
|
||||
//import io.reactivex.schedulers.Schedulers
|
||||
//import okhttp3.ResponseBody
|
||||
//import org.json.JSONArray
|
||||
//import org.json.JSONObject
|
||||
//
|
||||
//// 预约弹窗
|
||||
//@Deprecated("v5.6.0废弃")
|
||||
//class ReserveDialogFragment
|
||||
// : BaseDialogFragment(), KeyboardHeightObserver {
|
||||
//// : BaseTrackableDialogFragment() {
|
||||
//
|
||||
// @BindView(R.id.reserve_hint_tv)
|
||||
// lateinit var reserveHintTv: TextView
|
||||
//
|
||||
// @BindView(R.id.reserve_content_tv)
|
||||
// lateinit var reserveContentTv: TextView
|
||||
//
|
||||
// @BindView(R.id.reserve_completed_content_tv)
|
||||
// lateinit var reserveCompletedContentTv: TextView
|
||||
//
|
||||
// @BindView(R.id.mobile_et)
|
||||
// lateinit var mobileEt: EditText
|
||||
//
|
||||
// @BindView(R.id.reserve_container)
|
||||
// lateinit var reserveContainer: View
|
||||
//
|
||||
// @BindView(R.id.reserve_completed_container)
|
||||
// lateinit var reserveCompletedContainer: View
|
||||
//
|
||||
// @BindView(R.id.customizable_btn)
|
||||
// lateinit var customizableBtn: TextView
|
||||
//
|
||||
// @BindView(R.id.content_container)
|
||||
// lateinit var contentContainer: View
|
||||
//
|
||||
// @BindView(R.id.mobile_index_container)
|
||||
// lateinit var mobileIndexContainer: View
|
||||
//
|
||||
// @BindView(R.id.mobile_index_reserve)
|
||||
// lateinit var mobileIndexReserve: TextView
|
||||
//
|
||||
// @BindView(R.id.mobile_index_user)
|
||||
// lateinit var mobileIndexUser: TextView
|
||||
//
|
||||
// @BindView(R.id.mobile_et_delete)
|
||||
// lateinit var mobileEtDelete: View
|
||||
//
|
||||
// @BindView(R.id.layout_container)
|
||||
// lateinit var layoutContainer: View
|
||||
//
|
||||
// private lateinit var mViewModel: ReserveViewModel
|
||||
//
|
||||
// var successCallback: SuccessCallback? = null
|
||||
//
|
||||
// private var mGame: GameEntity? = null
|
||||
// private var mGameId: String = ""
|
||||
// private var mGameName: String = ""
|
||||
//
|
||||
// private var mKeyboardHeightProvider: KeyboardHeightProvider? = null
|
||||
//
|
||||
// override fun onCreate(savedInstanceState: Bundle?) {
|
||||
// super.onCreate(savedInstanceState)
|
||||
//
|
||||
// mGame = requireArguments().getParcelable(EntranceUtils.KEY_GAME)
|
||||
// mGameId = mGame?.id ?:""
|
||||
// mGameName = mGame?.name ?:""
|
||||
//
|
||||
// mViewModel = viewModelProvider()
|
||||
// mKeyboardHeightProvider = KeyboardHeightProvider(activity)
|
||||
// mKeyboardHeightProvider?.start()
|
||||
// }
|
||||
//
|
||||
// override fun getKey(): String {
|
||||
// return "预约功能操作"
|
||||
// override fun onActivityCreated(savedInstanceState: Bundle?) {
|
||||
// super.onActivityCreated(savedInstanceState)
|
||||
// dialog?.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE)
|
||||
// }
|
||||
|
||||
@Suppress("DEPRECATION")
|
||||
@SuppressLint("SetTextI18n")
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
ButterKnife.bind(this, view)
|
||||
|
||||
val reserveContent = "游戏上线,您将收到<font color='#1383EB'>免费短信</font>提醒"
|
||||
reserveContentTv.text = Html.fromHtml(reserveContent)
|
||||
|
||||
|
||||
mobileEt.setTextChangedListener { s, _, _, _ ->
|
||||
mobileIndexContainer.visibility = View.GONE
|
||||
mobileEtDelete.goneIf(s.trim().isEmpty())
|
||||
}
|
||||
|
||||
mViewModel.reservation.observeNonNull(this) {
|
||||
if (it.success) {
|
||||
showSuccessDialog(it.withMobile, it.boundWechat)
|
||||
successCallback?.onSuccess()
|
||||
HistoryHelper.insertGameEntity(mGame!!)
|
||||
}
|
||||
}
|
||||
|
||||
mViewModel.reserveMobile.observe(viewLifecycleOwner, Observer {
|
||||
setMobileIndexHint(it)
|
||||
})
|
||||
|
||||
dialog?.setCanceledOnTouchOutside(true)
|
||||
}
|
||||
|
||||
private fun showSuccessDialog(withMobile: Boolean, boundWechat: Boolean) {
|
||||
reserveHintTv.text = "游戏预约成功"
|
||||
reserveContainer.visibility = View.GONE
|
||||
reserveCompletedContainer.visibility = View.VISIBLE
|
||||
|
||||
val reservation = Config.getSettings()?.appointment
|
||||
val dialogConfig = if (withMobile) reservation?.withMobile else reservation?.withoutMobile
|
||||
|
||||
reserveCompletedContentTv.text = dialogConfig?.htmlContent?.fromHtml()
|
||||
if (dialogConfig?.text.isNullOrEmpty()
|
||||
|| (dialogConfig?.type == "wechat_bind" && boundWechat)) {
|
||||
customizableBtn.visibility = View.GONE
|
||||
} else {
|
||||
customizableBtn.text = dialogConfig?.text
|
||||
customizableBtn.setOnClickListener {
|
||||
// MtaHelper.onEvent("预约游戏", "预约功能操作", "点击跳转按钮")
|
||||
DirectUtils.directToLinkPage(
|
||||
requireContext(),
|
||||
dialogConfig!!.toLinkEntity(),
|
||||
"(游戏预约)",
|
||||
"")
|
||||
dismissAllowingStateLoss()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun setMobileIndexHint(reserveMobile: String?) {
|
||||
var userMobile = UserManager.getInstance().userInfoEntity?.mobile
|
||||
if (reserveMobile == userMobile) userMobile = null
|
||||
|
||||
if (!reserveMobile.isNullOrEmpty()) {
|
||||
mobileIndexReserve.visibility = View.VISIBLE
|
||||
mobileIndexReserve.text = reserveMobile
|
||||
} else {
|
||||
mobileIndexReserve.visibility = View.GONE
|
||||
}
|
||||
|
||||
if (!userMobile.isNullOrEmpty()) {
|
||||
mobileIndexUser.visibility = View.VISIBLE
|
||||
mobileIndexUser.text = userMobile
|
||||
} else {
|
||||
mobileIndexUser.visibility = View.GONE
|
||||
}
|
||||
mobileIndexContainer.goneIf(mobileIndexUser.visibility == View.GONE && mobileIndexReserve.visibility == View.GONE)
|
||||
if (mobileIndexContainer.visibility ==View.VISIBLE) {
|
||||
mobileIndexContainer.animation = AnimationUtils.loadAnimation(requireContext(), R.anim.reserve_dialog_index_anim)
|
||||
}
|
||||
}
|
||||
|
||||
@OnClick(R.id.reserve_with_mobile_btn,
|
||||
R.id.reserve_without_mobile_btn,
|
||||
R.id.content_container,
|
||||
R.id.close_btn,
|
||||
R.id.customizable_btn,
|
||||
R.id.mobile_index_reserve,
|
||||
R.id.mobile_index_user,
|
||||
R.id.mobile_et_delete,
|
||||
R.id.mobile_et,
|
||||
R.id.layout_container)
|
||||
fun onClick(view: View) {
|
||||
when (view.id) {
|
||||
R.id.reserve_without_mobile_btn -> {
|
||||
// MtaHelper.onEvent("预约游戏", "预约功能操作", "点击无手机号预约")
|
||||
if (mobileIndexContainer.visibility == View.VISIBLE) {
|
||||
mobileIndexContainer.visibility = View.GONE
|
||||
return
|
||||
}
|
||||
|
||||
mViewModel.reserve(gameId = mGameId, gameName = mGameName)
|
||||
}
|
||||
|
||||
R.id.reserve_with_mobile_btn -> {
|
||||
if (mobileIndexContainer.visibility == View.VISIBLE) {
|
||||
mobileIndexContainer.visibility = View.GONE
|
||||
return
|
||||
}
|
||||
|
||||
val mobile = mobileEt.text.toString()
|
||||
if (mobile.length < 11 || !mobile.startsWith("1")) {
|
||||
Utils.toast(context, "手机号格式错误,请检查并重新输入")
|
||||
return
|
||||
}
|
||||
|
||||
// MtaHelper.onEvent("预约游戏", "预约功能操作", "点击立即预约")
|
||||
mViewModel.reserve(gameId = mGameId, gameName = mGameName, mobile = mobile)
|
||||
}
|
||||
|
||||
R.id.close_btn -> {
|
||||
// MtaHelper.onEvent("预约游戏", "预约功能操作", "点击关闭")
|
||||
dismissAllowingStateLoss()
|
||||
AppExecutor.uiExecutor.executeWithDelay(Runnable {
|
||||
NotificationHelper.showNotificationHintDialog(NotificationUgc.RESERVE_GAME)
|
||||
}, 1000)
|
||||
}
|
||||
R.id.content_container -> {
|
||||
mobileIndexContainer.visibility = View.GONE
|
||||
}
|
||||
R.id.mobile_index_reserve -> {
|
||||
mobileEt.setText(mobileIndexReserve.text.toString())
|
||||
mobileEt.setSelection(mobileEt.text.length)
|
||||
mobileIndexContainer.visibility = View.GONE
|
||||
}
|
||||
R.id.mobile_index_user -> {
|
||||
mobileEt.setText(mobileIndexUser.text.toString())
|
||||
mobileEt.setSelection(mobileEt.text.length)
|
||||
mobileIndexContainer.visibility = View.GONE
|
||||
}
|
||||
R.id.mobile_et_delete -> {
|
||||
mobileEt.setText("")
|
||||
}
|
||||
R.id.mobile_et -> {
|
||||
mobileIndexContainer.visibility = View.GONE
|
||||
}
|
||||
R.id.layout_container -> {
|
||||
dismissAllowingStateLoss()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
if (HaloApp.getInstance().mCacheKeyboardHeight > 0) {
|
||||
val attributes = dialog?.window?.attributes
|
||||
val heightPixels = requireContext().resources.displayMetrics.heightPixels
|
||||
val mCacheKeyboardHeight = HaloApp.getInstance().mCacheKeyboardHeight
|
||||
val statusBarHeight = DisplayUtils.getStatusBarHeight(requireContext().resources)
|
||||
dialog?.window?.attributes?.height = heightPixels - mCacheKeyboardHeight - statusBarHeight
|
||||
attributes?.gravity = Gravity.TOP
|
||||
dialog?.window?.attributes = attributes
|
||||
}
|
||||
mKeyboardHeightProvider?.setKeyboardHeightObserver(this)
|
||||
}
|
||||
|
||||
override fun onPause() {
|
||||
super.onPause()
|
||||
mKeyboardHeightProvider?.setKeyboardHeightObserver(null)
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
super.onDestroy()
|
||||
mKeyboardHeightProvider?.close()
|
||||
}
|
||||
|
||||
override fun onKeyboardHeightChanged(height: Int, orientation: Int) {
|
||||
if (height > 0) {
|
||||
val attributes = dialog?.window?.attributes
|
||||
attributes?.gravity = Gravity.CENTER
|
||||
dialog?.window?.attributes = attributes
|
||||
HaloApp.getInstance().mCacheKeyboardHeight = height
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
@JvmStatic
|
||||
fun getInstance(gameEntity: GameEntity, successCallback: SuccessCallback) = ReserveDialogFragment().apply {
|
||||
arguments = Bundle().apply {
|
||||
putParcelable(EntranceUtils.KEY_GAME, gameEntity)
|
||||
}
|
||||
this.successCallback = successCallback
|
||||
}
|
||||
}
|
||||
|
||||
interface SuccessCallback {
|
||||
fun onSuccess()
|
||||
}
|
||||
}
|
||||
|
||||
class ReserveViewModel(application: Application) : AndroidViewModel(application) {
|
||||
val reservation = MutableLiveData<Reservation>()
|
||||
|
||||
val reserveMobile = MutableLiveData<String>()
|
||||
|
||||
init {
|
||||
getAppointmentMobile()
|
||||
}
|
||||
|
||||
@SuppressLint("CheckResult")
|
||||
fun reserve(gameId: String, gameName: String, mobile: String = "") {
|
||||
|
||||
val requestMap = hashMapOf<String, String>()
|
||||
requestMap["game_id"] = gameId
|
||||
if (mobile.isNotEmpty()) {
|
||||
requestMap["mobile"] = mobile
|
||||
}
|
||||
|
||||
RetrofitManager.getInstance().api
|
||||
.createNewGameReservation(requestMap.createRequestBody())
|
||||
.subscribeOn(Schedulers.io())
|
||||
.subscribe(object : BiResponse<ResponseBody>() {
|
||||
override fun onSuccess(data: ResponseBody) {
|
||||
var boundWechat = false
|
||||
tryWithDefaultCatch {
|
||||
boundWechat = JSONObject(data.string() ?: "").getBoolean("wechat_bind")
|
||||
}
|
||||
|
||||
reservation.postValue(Reservation(success = true, withMobile = mobile.isNotEmpty(), boundWechat = boundWechat))
|
||||
ReservationRepository.addReservationToMemoryAndRefresh(gameId)
|
||||
|
||||
// MtaHelper.onEvent("预约游戏", "预约", gameName)
|
||||
}
|
||||
|
||||
override fun onFailure(exception: Exception) {
|
||||
Utils.toast(getApplication(), exception.message)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
@SuppressLint("CheckResult")
|
||||
private fun getAppointmentMobile() {
|
||||
RetrofitManager.getInstance().api
|
||||
.getAppointmentMobile(UserManager.getInstance().userId)
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(object : BiResponse<ResponseBody>() {
|
||||
override fun onSuccess(data: ResponseBody) {
|
||||
var mobile: String? = null
|
||||
tryCatchInRelease {
|
||||
val jsonArray = JSONArray(data.string())
|
||||
if (jsonArray.length() > 0) {
|
||||
mobile = jsonArray.get(0).toString()
|
||||
}
|
||||
}
|
||||
|
||||
reserveMobile.postValue(mobile)
|
||||
}
|
||||
|
||||
override fun onFailure(exception: Exception) {
|
||||
reserveMobile.postValue(null)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
class Reservation(var success: Boolean = false, var withMobile: Boolean = false, var boundWechat: Boolean = false)
|
||||
}
|
||||
//
|
||||
// override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
|
||||
// return inflater.inflate(R.layout.dialog_reserve_game, null)
|
||||
// }
|
||||
//
|
||||
//// override fun getEvent(): String {
|
||||
//// return "预约游戏"
|
||||
//// }
|
||||
////
|
||||
//// override fun getKey(): String {
|
||||
//// return "预约功能操作"
|
||||
//// }
|
||||
//
|
||||
// @Suppress("DEPRECATION")
|
||||
// @SuppressLint("SetTextI18n")
|
||||
// override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
// super.onViewCreated(view, savedInstanceState)
|
||||
// ButterKnife.bind(this, view)
|
||||
//
|
||||
// val reserveContent = "游戏上线,您将收到<font color='#1383EB'>免费短信</font>提醒"
|
||||
// reserveContentTv.text = Html.fromHtml(reserveContent)
|
||||
//
|
||||
//
|
||||
// mobileEt.setTextChangedListener { s, _, _, _ ->
|
||||
// mobileIndexContainer.visibility = View.GONE
|
||||
// mobileEtDelete.goneIf(s.trim().isEmpty())
|
||||
// }
|
||||
//
|
||||
// mViewModel.reservation.observeNonNull(this) {
|
||||
// if (it.success) {
|
||||
// showSuccessDialog(it.withMobile, it.boundWechat)
|
||||
// successCallback?.onSuccess()
|
||||
// HistoryHelper.insertGameEntity(mGame!!)
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// mViewModel.reserveMobile.observe(viewLifecycleOwner, Observer {
|
||||
// setMobileIndexHint(it)
|
||||
// })
|
||||
//
|
||||
// dialog?.setCanceledOnTouchOutside(true)
|
||||
// }
|
||||
//
|
||||
// private fun showSuccessDialog(withMobile: Boolean, boundWechat: Boolean) {
|
||||
// reserveHintTv.text = "游戏预约成功"
|
||||
// reserveContainer.visibility = View.GONE
|
||||
// reserveCompletedContainer.visibility = View.VISIBLE
|
||||
//
|
||||
// val reservation = Config.getSettings()?.appointment
|
||||
// val dialogConfig = if (withMobile) reservation?.withMobile else reservation?.withoutMobile
|
||||
//
|
||||
// reserveCompletedContentTv.text = dialogConfig?.htmlContent?.fromHtml()
|
||||
// if (dialogConfig?.text.isNullOrEmpty()
|
||||
// || (dialogConfig?.type == "wechat_bind" && boundWechat)) {
|
||||
// customizableBtn.visibility = View.GONE
|
||||
// } else {
|
||||
// customizableBtn.text = dialogConfig?.text
|
||||
// customizableBtn.setOnClickListener {
|
||||
//// MtaHelper.onEvent("预约游戏", "预约功能操作", "点击跳转按钮")
|
||||
// DirectUtils.directToLinkPage(
|
||||
// requireContext(),
|
||||
// dialogConfig!!.toLinkEntity(),
|
||||
// "(游戏预约)",
|
||||
// "")
|
||||
// dismissAllowingStateLoss()
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// private fun setMobileIndexHint(reserveMobile: String?) {
|
||||
// var userMobile = UserManager.getInstance().userInfoEntity?.mobile
|
||||
// if (reserveMobile == userMobile) userMobile = null
|
||||
//
|
||||
// if (!reserveMobile.isNullOrEmpty()) {
|
||||
// mobileIndexReserve.visibility = View.VISIBLE
|
||||
// mobileIndexReserve.text = reserveMobile
|
||||
// } else {
|
||||
// mobileIndexReserve.visibility = View.GONE
|
||||
// }
|
||||
//
|
||||
// if (!userMobile.isNullOrEmpty()) {
|
||||
// mobileIndexUser.visibility = View.VISIBLE
|
||||
// mobileIndexUser.text = userMobile
|
||||
// } else {
|
||||
// mobileIndexUser.visibility = View.GONE
|
||||
// }
|
||||
// mobileIndexContainer.goneIf(mobileIndexUser.visibility == View.GONE && mobileIndexReserve.visibility == View.GONE)
|
||||
// if (mobileIndexContainer.visibility ==View.VISIBLE) {
|
||||
// mobileIndexContainer.animation = AnimationUtils.loadAnimation(requireContext(), R.anim.reserve_dialog_index_anim)
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// @OnClick(R.id.reserve_with_mobile_btn,
|
||||
// R.id.reserve_without_mobile_btn,
|
||||
// R.id.content_container,
|
||||
// R.id.close_btn,
|
||||
// R.id.customizable_btn,
|
||||
// R.id.mobile_index_reserve,
|
||||
// R.id.mobile_index_user,
|
||||
// R.id.mobile_et_delete,
|
||||
// R.id.mobile_et,
|
||||
// R.id.layout_container)
|
||||
// fun onClick(view: View) {
|
||||
// when (view.id) {
|
||||
// R.id.reserve_without_mobile_btn -> {
|
||||
//// MtaHelper.onEvent("预约游戏", "预约功能操作", "点击无手机号预约")
|
||||
// if (mobileIndexContainer.visibility == View.VISIBLE) {
|
||||
// mobileIndexContainer.visibility = View.GONE
|
||||
// return
|
||||
// }
|
||||
//
|
||||
// mViewModel.reserve(gameId = mGameId, gameName = mGameName)
|
||||
// }
|
||||
//
|
||||
// R.id.reserve_with_mobile_btn -> {
|
||||
// if (mobileIndexContainer.visibility == View.VISIBLE) {
|
||||
// mobileIndexContainer.visibility = View.GONE
|
||||
// return
|
||||
// }
|
||||
//
|
||||
// val mobile = mobileEt.text.toString()
|
||||
// if (mobile.length < 11 || !mobile.startsWith("1")) {
|
||||
// Utils.toast(context, "手机号格式错误,请检查并重新输入")
|
||||
// return
|
||||
// }
|
||||
//
|
||||
//// MtaHelper.onEvent("预约游戏", "预约功能操作", "点击立即预约")
|
||||
// mViewModel.reserve(gameId = mGameId, gameName = mGameName, mobile = mobile)
|
||||
// }
|
||||
//
|
||||
// R.id.close_btn -> {
|
||||
//// MtaHelper.onEvent("预约游戏", "预约功能操作", "点击关闭")
|
||||
// dismissAllowingStateLoss()
|
||||
// AppExecutor.uiExecutor.executeWithDelay(Runnable {
|
||||
// NotificationHelper.showNotificationHintDialog(NotificationUgc.RESERVE_GAME)
|
||||
// }, 1000)
|
||||
// }
|
||||
// R.id.content_container -> {
|
||||
// mobileIndexContainer.visibility = View.GONE
|
||||
// }
|
||||
// R.id.mobile_index_reserve -> {
|
||||
// mobileEt.setText(mobileIndexReserve.text.toString())
|
||||
// mobileEt.setSelection(mobileEt.text.length)
|
||||
// mobileIndexContainer.visibility = View.GONE
|
||||
// }
|
||||
// R.id.mobile_index_user -> {
|
||||
// mobileEt.setText(mobileIndexUser.text.toString())
|
||||
// mobileEt.setSelection(mobileEt.text.length)
|
||||
// mobileIndexContainer.visibility = View.GONE
|
||||
// }
|
||||
// R.id.mobile_et_delete -> {
|
||||
// mobileEt.setText("")
|
||||
// }
|
||||
// R.id.mobile_et -> {
|
||||
// mobileIndexContainer.visibility = View.GONE
|
||||
// }
|
||||
// R.id.layout_container -> {
|
||||
// dismissAllowingStateLoss()
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// override fun onResume() {
|
||||
// super.onResume()
|
||||
// if (HaloApp.getInstance().mCacheKeyboardHeight > 0) {
|
||||
// val attributes = dialog?.window?.attributes
|
||||
// val heightPixels = requireContext().resources.displayMetrics.heightPixels
|
||||
// val mCacheKeyboardHeight = HaloApp.getInstance().mCacheKeyboardHeight
|
||||
// val statusBarHeight = DisplayUtils.getStatusBarHeight(requireContext().resources)
|
||||
// dialog?.window?.attributes?.height = heightPixels - mCacheKeyboardHeight - statusBarHeight
|
||||
// attributes?.gravity = Gravity.TOP
|
||||
// dialog?.window?.attributes = attributes
|
||||
// }
|
||||
// mKeyboardHeightProvider?.setKeyboardHeightObserver(this)
|
||||
// }
|
||||
//
|
||||
// override fun onPause() {
|
||||
// super.onPause()
|
||||
// mKeyboardHeightProvider?.setKeyboardHeightObserver(null)
|
||||
// }
|
||||
//
|
||||
// override fun onDestroy() {
|
||||
// super.onDestroy()
|
||||
// mKeyboardHeightProvider?.close()
|
||||
// }
|
||||
//
|
||||
// override fun onKeyboardHeightChanged(height: Int, orientation: Int) {
|
||||
// if (height > 0) {
|
||||
// val attributes = dialog?.window?.attributes
|
||||
// attributes?.gravity = Gravity.CENTER
|
||||
// dialog?.window?.attributes = attributes
|
||||
// HaloApp.getInstance().mCacheKeyboardHeight = height
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// companion object {
|
||||
// @JvmStatic
|
||||
// fun getInstance(gameEntity: GameEntity, successCallback: SuccessCallback) = ReserveDialogFragment().apply {
|
||||
// arguments = Bundle().apply {
|
||||
// putParcelable(EntranceUtils.KEY_GAME, gameEntity)
|
||||
// }
|
||||
// this.successCallback = successCallback
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// interface SuccessCallback {
|
||||
// fun onSuccess()
|
||||
// }
|
||||
//}
|
||||
//
|
||||
//class ReserveViewModel(application: Application) : AndroidViewModel(application) {
|
||||
// val reservation = MutableLiveData<Reservation>()
|
||||
//
|
||||
// val reserveMobile = MutableLiveData<String>()
|
||||
//
|
||||
// init {
|
||||
// getAppointmentMobile()
|
||||
// }
|
||||
//
|
||||
// @SuppressLint("CheckResult")
|
||||
// fun reserve(gameId: String, gameName: String, mobile: String = "") {
|
||||
//
|
||||
// val requestMap = hashMapOf<String, String>()
|
||||
// requestMap["game_id"] = gameId
|
||||
// if (mobile.isNotEmpty()) {
|
||||
// requestMap["mobile"] = mobile
|
||||
// }
|
||||
//
|
||||
// RetrofitManager.getInstance().api
|
||||
// .createNewGameReservation(requestMap.createRequestBody())
|
||||
// .subscribeOn(Schedulers.io())
|
||||
// .subscribe(object : BiResponse<ResponseBody>() {
|
||||
// override fun onSuccess(data: ResponseBody) {
|
||||
// var boundWechat = false
|
||||
// tryWithDefaultCatch {
|
||||
// boundWechat = JSONObject(data.string() ?: "").getBoolean("wechat_bind")
|
||||
// }
|
||||
//
|
||||
// reservation.postValue(Reservation(success = true, withMobile = mobile.isNotEmpty(), boundWechat = boundWechat))
|
||||
// ReservationRepository.addReservationToMemoryAndRefresh(gameId)
|
||||
//
|
||||
//// MtaHelper.onEvent("预约游戏", "预约", gameName)
|
||||
// }
|
||||
//
|
||||
// override fun onFailure(exception: Exception) {
|
||||
// Utils.toast(getApplication(), exception.message)
|
||||
// }
|
||||
// })
|
||||
// }
|
||||
//
|
||||
// @SuppressLint("CheckResult")
|
||||
// private fun getAppointmentMobile() {
|
||||
// RetrofitManager.getInstance().api
|
||||
// .getAppointmentMobile(UserManager.getInstance().userId)
|
||||
// .subscribeOn(Schedulers.io())
|
||||
// .observeOn(AndroidSchedulers.mainThread())
|
||||
// .subscribe(object : BiResponse<ResponseBody>() {
|
||||
// override fun onSuccess(data: ResponseBody) {
|
||||
// var mobile: String? = null
|
||||
// tryCatchInRelease {
|
||||
// val jsonArray = JSONArray(data.string())
|
||||
// if (jsonArray.length() > 0) {
|
||||
// mobile = jsonArray.get(0).toString()
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// reserveMobile.postValue(mobile)
|
||||
// }
|
||||
//
|
||||
// override fun onFailure(exception: Exception) {
|
||||
// reserveMobile.postValue(null)
|
||||
// }
|
||||
// })
|
||||
// }
|
||||
//
|
||||
// class Reservation(var success: Boolean = false, var withMobile: Boolean = false, var boundWechat: Boolean = false)
|
||||
//}
|
||||
@ -3,7 +3,7 @@ package com.gh.common.exposure
|
||||
import android.os.Parcelable
|
||||
import androidx.annotation.Keep
|
||||
import com.google.gson.annotations.SerializedName
|
||||
import kotlinx.android.parcel.Parcelize
|
||||
import kotlinx.parcelize.Parcelize
|
||||
|
||||
@Keep
|
||||
@Parcelize
|
||||
@ -12,6 +12,8 @@ data class ExposureEntity(
|
||||
val gameId: String? = "",
|
||||
@SerializedName("subject_id")
|
||||
val subjectId: String? = null, // 专题 id
|
||||
@SerializedName("carousel_id")
|
||||
val carouselId: String? = "", // 轮播图 id
|
||||
val gameName: String? = "",
|
||||
val gameVersion: String? = "",
|
||||
val sequence: Int? = 0,
|
||||
@ -43,6 +45,8 @@ data class ExposureEntity(
|
||||
var categoryId: String? = null,
|
||||
@SerializedName("category_v2_id")
|
||||
var categoryV2Id: String? = null,
|
||||
@SerializedName("navigation_id")
|
||||
var navigationId: String? = null,
|
||||
|
||||
// 专题详情的来源页面和来源 id
|
||||
@SerializedName("source_page")
|
||||
@ -69,6 +73,7 @@ data class ExposureEntity(
|
||||
BLOCK_ID -> blockId = id
|
||||
CATEGORY_ID -> categoryId = id
|
||||
CATEGORY_V2_ID -> categoryV2Id = id
|
||||
NAVIGATION_ID -> navigationId = id
|
||||
}
|
||||
|
||||
containerId = null
|
||||
@ -80,5 +85,6 @@ data class ExposureEntity(
|
||||
const val BLOCK_ID = "block_id"
|
||||
const val CATEGORY_ID = "category_id"
|
||||
const val CATEGORY_V2_ID = "category_v2_id"
|
||||
const val NAVIGATION_ID = "navigation_id"
|
||||
}
|
||||
}
|
||||
@ -12,7 +12,7 @@ import com.gh.common.util.getFirstElementDividedByDivider
|
||||
import com.gh.download.server.BrowserInstallHelper
|
||||
import com.gh.gamecenter.entity.GameEntity
|
||||
import com.lightgame.download.DownloadEntity
|
||||
import kotlinx.android.parcel.Parcelize
|
||||
import kotlinx.parcelize.Parcelize
|
||||
import java.util.*
|
||||
import kotlin.collections.ArrayList
|
||||
|
||||
|
||||
@ -2,7 +2,7 @@ package com.gh.common.exposure
|
||||
|
||||
import android.os.Parcelable
|
||||
import androidx.annotation.Keep
|
||||
import kotlinx.android.parcel.Parcelize
|
||||
import kotlinx.parcelize.Parcelize
|
||||
|
||||
@Keep
|
||||
@Parcelize
|
||||
|
||||
@ -2,7 +2,7 @@ package com.gh.common.exposure.meta
|
||||
|
||||
import android.os.Parcelable
|
||||
import androidx.annotation.Keep
|
||||
import kotlinx.android.parcel.Parcelize
|
||||
import kotlinx.parcelize.Parcelize
|
||||
|
||||
@Keep
|
||||
@Parcelize
|
||||
|
||||
@ -15,7 +15,6 @@ import com.gh.common.util.tryWithDefaultCatch
|
||||
import com.gh.gamecenter.BuildConfig
|
||||
import com.gh.gamecenter.manager.UserManager
|
||||
import com.halo.assistant.HaloApp
|
||||
import com.leon.channel.helper.ChannelReaderUtil
|
||||
import com.walkud.rom.checker.RomIdentifier
|
||||
|
||||
object MetaUtil {
|
||||
|
||||
@ -16,7 +16,7 @@ import com.gh.gamecenter.room.converter.*
|
||||
import com.gh.gamecenter.room.dao.*
|
||||
import com.halo.assistant.HaloApp
|
||||
|
||||
@Database(entities = [AnswerEntity::class, ArticleEntity::class, NewsEntity::class, HistoryGameEntity::class, MyVideoEntity::class, GamesCollectionEntity::class], version = 10, exportSchema = false)
|
||||
@Database(entities = [AnswerEntity::class, ArticleEntity::class, NewsEntity::class, HistoryGameEntity::class, MyVideoEntity::class, GamesCollectionEntity::class], version = 11, exportSchema = false)
|
||||
@TypeConverters(CountConverter::class,
|
||||
CommunityConverter::class,
|
||||
TimeConverter::class,
|
||||
@ -32,7 +32,8 @@ import com.halo.assistant.HaloApp
|
||||
QuestionsConverter::class,
|
||||
MeConverter::class,
|
||||
SimpleGameListConverter::class,
|
||||
TagInfoListConverter::class)
|
||||
TagInfoListConverter::class,
|
||||
ActivityLabelListConverter::class)
|
||||
|
||||
abstract class HistoryDatabase : RoomDatabase() {
|
||||
|
||||
@ -113,6 +114,12 @@ abstract class HistoryDatabase : RoomDatabase() {
|
||||
}
|
||||
}
|
||||
|
||||
val MIGRATION_10_11: Migration = object : Migration(10, 11) {
|
||||
override fun migrate(database: SupportSQLiteDatabase) {
|
||||
database.execSQL("Alter TABLE GamesCollectionEntity add activityTags TEXT DEFAULT ''")
|
||||
}
|
||||
}
|
||||
|
||||
val instance by lazy {
|
||||
Room.databaseBuilder(HaloApp.getInstance().application, HistoryDatabase::class.java, "USER_TRACK_HISTORY_DATABASE")
|
||||
.addMigrations(MIGRATION_2_3)
|
||||
@ -123,6 +130,7 @@ abstract class HistoryDatabase : RoomDatabase() {
|
||||
.addMigrations(MIGRATION_7_8)
|
||||
.addMigrations(MIGRATION_8_9)
|
||||
.addMigrations(MIGRATION_9_10)
|
||||
.addMigrations(MIGRATION_10_11)
|
||||
.build()
|
||||
}
|
||||
}
|
||||
|
||||
@ -52,7 +52,6 @@ object HistoryHelper {
|
||||
historyGame.iconSubscript = updateEntity.iconSubscript
|
||||
historyGame.name = updateEntity.name
|
||||
historyGame.tagStyle = updateEntity.tagStyle
|
||||
historyGame.tag = updateEntity.tag
|
||||
return historyGame
|
||||
}
|
||||
|
||||
@ -161,7 +160,10 @@ object HistoryHelper {
|
||||
|
||||
gamesCollectionEntity.id = gamesCollectionDetailEntity.id
|
||||
gamesCollectionEntity.tags = gamesCollectionDetailEntity.tags
|
||||
gamesCollectionEntity.games = ArrayList(gamesCollectionDetailEntity.games?.take(3)?.map { it.toSimpleGame() })
|
||||
gamesCollectionEntity.activityTags = gamesCollectionDetailEntity.activityTags
|
||||
gamesCollectionDetailEntity.games?.take(3)?.map { it.toSimpleGame() }?.run {
|
||||
gamesCollectionEntity.games = ArrayList(this)
|
||||
}
|
||||
gamesCollectionEntity.title = gamesCollectionDetailEntity.title
|
||||
gamesCollectionEntity.intro = gamesCollectionDetailEntity.intro
|
||||
gamesCollectionEntity.cover = gamesCollectionDetailEntity.cover
|
||||
|
||||
@ -4,7 +4,7 @@ import android.os.Parcelable
|
||||
import androidx.annotation.Keep
|
||||
import androidx.room.Entity
|
||||
import androidx.room.PrimaryKey
|
||||
import kotlinx.android.parcel.Parcelize
|
||||
import kotlinx.parcelize.Parcelize
|
||||
import java.util.*
|
||||
|
||||
@Keep
|
||||
|
||||
@ -36,7 +36,14 @@ object LoghubHelper {
|
||||
}
|
||||
|
||||
private fun createClient(logStore: String): LogProducerClient {
|
||||
val config = LogProducerConfig(ENDPOINT, PROJECT, logStore, ACCESS_KEY_ID, ACCESS_KEY_SECRET).apply {
|
||||
val config = LogProducerConfig(
|
||||
HaloApp.getInstance().applicationContext,
|
||||
ENDPOINT,
|
||||
PROJECT,
|
||||
logStore,
|
||||
ACCESS_KEY_ID,
|
||||
ACCESS_KEY_SECRET
|
||||
).apply {
|
||||
// 1 开启断点续传功能, 0 关闭
|
||||
// 每次发送前会把日志保存到本地的binlog文件,只有发送成功才会删除,保证日志上传At Least Once
|
||||
setPersistent(1)
|
||||
@ -74,17 +81,25 @@ object LoghubHelper {
|
||||
return if (!PackageFlavorHelper.IS_TEST_FLAVOR) {
|
||||
LogProducerClient(config)
|
||||
} else {
|
||||
return LogProducerClient(config,
|
||||
LogProducerCallback { resultCode, reqId, errorMessage, logBytes, compressedBytes ->
|
||||
|
||||
// resultCode 返回结果代码
|
||||
// reqId 请求id
|
||||
// errorMessage 错误信息,没有为null
|
||||
// logBytes 日志大小
|
||||
// compressedBytes 压缩后日志大小
|
||||
Utils.log("LoghubHelper -> ${String.format("%s %s %s %s %s",
|
||||
LogProducerResult.fromInt(resultCode), reqId, errorMessage, logBytes, compressedBytes)}")
|
||||
})
|
||||
LogProducerClient(config) { resultCode, reqId, errorMessage, logBytes, compressedBytes ->
|
||||
// resultCode 返回结果代码
|
||||
// reqId 请求id
|
||||
// errorMessage 错误信息,没有为null
|
||||
// logBytes 日志大小
|
||||
// compressedBytes 压缩后日志大小
|
||||
Utils.log(
|
||||
"LoghubHelper -> ${
|
||||
String.format(
|
||||
"%s %s %s %s %s",
|
||||
LogProducerResult.fromInt(resultCode),
|
||||
reqId,
|
||||
errorMessage,
|
||||
logBytes,
|
||||
compressedBytes
|
||||
)
|
||||
}"
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -12,13 +12,15 @@ import android.view.MotionEvent
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.FrameLayout
|
||||
import android.widget.TextView
|
||||
import androidx.cardview.widget.CardView
|
||||
import androidx.core.view.ViewCompat
|
||||
import com.facebook.drawee.view.SimpleDraweeView
|
||||
import com.gh.common.util.DisplayUtils
|
||||
import com.gh.common.util.ImageUtils
|
||||
import com.gh.common.util.doOnEnd
|
||||
import com.gh.common.util.doOnStart
|
||||
import com.gh.gamecenter.R
|
||||
import kotlinx.android.synthetic.main.view_notifier.view.*
|
||||
|
||||
class NotifierView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyle: Int = 0)
|
||||
: FrameLayout(context, attrs, defStyle) {
|
||||
@ -65,13 +67,21 @@ class NotifierView @JvmOverloads constructor(context: Context, attrs: AttributeS
|
||||
|
||||
var showVerticalTranslateAnimation: Boolean = true
|
||||
|
||||
private var mCardView: CardView
|
||||
private var mContentTv: TextView
|
||||
private var mIconIv: SimpleDraweeView
|
||||
|
||||
init {
|
||||
inflate(context, R.layout.view_notifier, this)
|
||||
|
||||
ViewCompat.setTranslationZ(this, Integer.MAX_VALUE.toFloat())
|
||||
|
||||
cardView.scaleX = SCALE_MINI
|
||||
cardView.scaleY = SCALE_MINI
|
||||
mCardView = findViewById(R.id.cardView)
|
||||
mContentTv = findViewById(R.id.tvText)
|
||||
mIconIv = findViewById(R.id.ivIcon)
|
||||
|
||||
mCardView.scaleX = SCALE_MINI
|
||||
mCardView.scaleY = SCALE_MINI
|
||||
|
||||
verticalAnimationOffset = dp2px(100F)
|
||||
|
||||
@ -113,7 +123,7 @@ class NotifierView @JvmOverloads constructor(context: Context, attrs: AttributeS
|
||||
expandAnimator.duration = DEFAULT_DURATION
|
||||
expandAnimator.addUpdateListener { a ->
|
||||
val progress = a?.animatedValue as Float
|
||||
tvText.width = (textWidth * progress).toInt()
|
||||
mContentTv.width = (textWidth * progress).toInt()
|
||||
}
|
||||
expandAnimator.doOnEnd {
|
||||
enableSwipeToDismiss()
|
||||
@ -124,46 +134,46 @@ class NotifierView @JvmOverloads constructor(context: Context, attrs: AttributeS
|
||||
shrinkAnimator.duration = DEFAULT_DURATION
|
||||
shrinkAnimator.addUpdateListener { a ->
|
||||
val progress = a?.animatedValue as Float
|
||||
tvText.width = (textWidth * progress).toInt()
|
||||
mContentTv.width = (textWidth * progress).toInt()
|
||||
}
|
||||
shrinkAnimator.doOnEnd {
|
||||
val lp = FrameLayout.LayoutParams(cardView.layoutParams)
|
||||
val lp = FrameLayout.LayoutParams(mCardView.layoutParams)
|
||||
lp.gravity = Gravity.NO_GRAVITY
|
||||
cardView.layoutParams = lp
|
||||
mCardView.layoutParams = lp
|
||||
|
||||
disableSwipeToDismiss()
|
||||
}
|
||||
|
||||
translateToLeftAnimator = ObjectAnimator.ofFloat(cardView, "translationX", veryRight, centerX)
|
||||
translateToLeftAnimator = ObjectAnimator.ofFloat(mCardView, "translationX", veryRight, centerX)
|
||||
translateToLeftAnimator.duration = DEFAULT_DURATION
|
||||
translateToLeftAnimator.doOnEnd {
|
||||
onShowListener?.onShow()
|
||||
|
||||
val lp = FrameLayout.LayoutParams(cardView.layoutParams)
|
||||
val lp = FrameLayout.LayoutParams(mCardView.layoutParams)
|
||||
lp.gravity = Gravity.CENTER_HORIZONTAL
|
||||
cardView.layoutParams = lp
|
||||
cardView.translationX = 0f
|
||||
mCardView.layoutParams = lp
|
||||
mCardView.translationX = 0f
|
||||
|
||||
expandAnimator.start()
|
||||
}
|
||||
|
||||
translateToRightAnimator = ObjectAnimator.ofFloat(cardView, "translationX", centerX, veryRight)
|
||||
translateToRightAnimator = ObjectAnimator.ofFloat(mCardView, "translationX", centerX, veryRight)
|
||||
translateToRightAnimator.duration = DEFAULT_DURATION
|
||||
|
||||
translateUpAnimator = ObjectAnimator.ofFloat(cardView, "translationY", veryBottom + verticalAnimationOffset, veryBottom)
|
||||
translateUpAnimator = ObjectAnimator.ofFloat(mCardView, "translationY", veryBottom + verticalAnimationOffset, veryBottom)
|
||||
translateUpAnimator.duration = DEFAULT_DURATION
|
||||
translateUpAnimator.doOnStart { cardView.translationX = veryRight }
|
||||
translateUpAnimator.doOnStart { mCardView.translationX = veryRight }
|
||||
|
||||
translateDownAnimator = ObjectAnimator.ofFloat(cardView, "translationY", veryBottom, veryBottom + verticalAnimationOffset)
|
||||
translateDownAnimator = ObjectAnimator.ofFloat(mCardView, "translationY", veryBottom, veryBottom + verticalAnimationOffset)
|
||||
translateDownAnimator.duration = DEFAULT_DURATION
|
||||
|
||||
zoomInAnimator = ObjectAnimator.ofPropertyValuesHolder(cardView, PropertyValuesHolder.ofFloat("scaleX", SCALE_DEFAULT),
|
||||
zoomInAnimator = ObjectAnimator.ofPropertyValuesHolder(mCardView, PropertyValuesHolder.ofFloat("scaleX", SCALE_DEFAULT),
|
||||
PropertyValuesHolder.ofFloat("scaleY", SCALE_DEFAULT))
|
||||
zoomInAnimator.duration = DEFAULT_DURATION
|
||||
zoomInAnimator.doOnStart { cardView.translationX = veryRight }
|
||||
zoomInAnimator.doOnStart { cardView.translationY = veryBottom }
|
||||
zoomInAnimator.doOnStart { mCardView.translationX = veryRight }
|
||||
zoomInAnimator.doOnStart { mCardView.translationY = veryBottom }
|
||||
|
||||
zoomOutAnimator = ObjectAnimator.ofPropertyValuesHolder(cardView, PropertyValuesHolder.ofFloat("scaleX", SCALE_MINI),
|
||||
zoomOutAnimator = ObjectAnimator.ofPropertyValuesHolder(mCardView, PropertyValuesHolder.ofFloat("scaleX", SCALE_MINI),
|
||||
PropertyValuesHolder.ofFloat("scaleY", SCALE_MINI))
|
||||
zoomOutAnimator.duration = DEFAULT_DURATION
|
||||
zoomOutAnimator.doOnEnd { removeFromParent() }
|
||||
@ -177,7 +187,7 @@ class NotifierView @JvmOverloads constructor(context: Context, attrs: AttributeS
|
||||
}
|
||||
|
||||
private fun enableSwipeToDismiss() {
|
||||
cardView?.setOnTouchListener(SwipeDismissTouchListener(cardView, object : SwipeDismissTouchListener.DismissCallbacks {
|
||||
mCardView?.setOnTouchListener(SwipeDismissTouchListener(mCardView, object : SwipeDismissTouchListener.DismissCallbacks {
|
||||
override fun canDismiss(): Boolean {
|
||||
return true
|
||||
}
|
||||
@ -193,7 +203,7 @@ class NotifierView @JvmOverloads constructor(context: Context, attrs: AttributeS
|
||||
}
|
||||
|
||||
private fun disableSwipeToDismiss() {
|
||||
cardView?.setOnTouchListener(null)
|
||||
mCardView?.setOnTouchListener(null)
|
||||
}
|
||||
|
||||
override fun onDetachedFromWindow() {
|
||||
@ -264,13 +274,13 @@ class NotifierView @JvmOverloads constructor(context: Context, attrs: AttributeS
|
||||
|
||||
fun setText(text: String?) {
|
||||
if (!TextUtils.isEmpty(text)) {
|
||||
tvText.text = text
|
||||
tvText.measure(0, 0)
|
||||
textWidth = tvText.measuredWidth
|
||||
tvText.width = 0
|
||||
mContentTv.text = text
|
||||
mContentTv.measure(0, 0)
|
||||
textWidth = mContentTv.measuredWidth
|
||||
mContentTv.width = 0
|
||||
|
||||
cardView.measure(0, 0)
|
||||
cardViewWidth = cardView.measuredWidth
|
||||
mCardView.measure(0, 0)
|
||||
cardViewWidth = mCardView.measuredWidth
|
||||
}
|
||||
}
|
||||
|
||||
@ -284,7 +294,7 @@ class NotifierView @JvmOverloads constructor(context: Context, attrs: AttributeS
|
||||
}
|
||||
|
||||
fun setIcon(url: String) {
|
||||
ImageUtils.display(ivIcon, url)
|
||||
ImageUtils.display(mIconIv, url)
|
||||
}
|
||||
|
||||
private fun dp2px(dp: Float): Int {
|
||||
|
||||
@ -91,6 +91,9 @@ class SimulatorDownloadManager private constructor() {
|
||||
DownloadStatus.unqualified == downloadEntity.status -> {
|
||||
ToastUtils.showToast("未成年人暂不允许在此时间下载游戏")
|
||||
}
|
||||
DownloadStatus.unavailable == downloadEntity.status -> {
|
||||
ToastUtils.showToast("该游戏未接入防沉迷系统,暂不支持下载")
|
||||
}
|
||||
DownloadStatus.hijack == downloadEntity.status -> {
|
||||
ToastUtils.showToast("网络劫持,请稍后重试")
|
||||
}
|
||||
|
||||
@ -101,7 +101,8 @@ object SimulatorGameManager {
|
||||
|
||||
@SuppressLint("CheckResult")
|
||||
private fun jumpToSimulator(downloadEntity: DownloadEntity, gameEntity: GameEntity) {
|
||||
Single.just(gameEntity.icon ?: "")
|
||||
val gameIcon = gameEntity.icon ?: gameEntity.rawIcon ?: ""
|
||||
Single.just(ImageUtils.getCachedUrl(gameIcon))
|
||||
.flatMap {
|
||||
getBitmapFormCache(it)
|
||||
}.map {
|
||||
@ -122,7 +123,7 @@ object SimulatorGameManager {
|
||||
intent.putExtra("default_path", downloadEntity.path.substring(0, downloadEntity.path.lastIndexOf('/')))
|
||||
intent.putExtra("game_type", gameEntity.simulatorType)
|
||||
intent.putExtra("title", downloadEntity.name)
|
||||
intent.putExtra("icon", gameEntity.icon ?: "")
|
||||
intent.putExtra("icon", gameIcon)
|
||||
intent.putExtra("iconStream", it)
|
||||
intent.putExtra("meta", LogUtils.getMetaObject().toString())
|
||||
intent.putExtra("simulatorId", gameEntity.simulator?.id)
|
||||
|
||||
@ -16,7 +16,6 @@ import com.gh.gamecenter.qa.answer.detail.AnswerDetailActivity
|
||||
import com.gh.gamecenter.qa.article.detail.ArticleDetailActivity
|
||||
import com.gh.gamecenter.qa.entity.AnswerEntity
|
||||
import com.gh.gamecenter.qa.entity.Questions
|
||||
import com.gh.gamecenter.qa.questions.detail.QuestionsDetailActivity
|
||||
|
||||
class ExampleAdapter(context: Context) : ListAdapter<AnswerEntity>(context), ISyncAdapterHandler {
|
||||
|
||||
@ -63,10 +62,11 @@ class ExampleAdapter(context: Context) : ListAdapter<AnswerEntity>(context), ISy
|
||||
binding.title.setOnClickListener {
|
||||
if ("community_article" == answer.type) {
|
||||
mContext.startActivity(ArticleDetailActivity.getIntent(mContext, UserManager.getInstance().community, answer.id!!, "", getPath()))
|
||||
} else {
|
||||
val questions = answer.questions
|
||||
mContext.startActivity(QuestionsDetailActivity.getIntent(mContext, questions.id, "", getPath()))
|
||||
}
|
||||
// else {
|
||||
// val questions = answer.questions
|
||||
// mContext.startActivity(QuestionsDetailActivity.getIntent(mContext, questions.id, "", getPath()))
|
||||
// }
|
||||
}
|
||||
|
||||
answerViewHolder.itemView.setOnClickListener {
|
||||
|
||||
125
app/src/main/java/com/gh/common/util/AsyncImageLoader.kt
Normal file
125
app/src/main/java/com/gh/common/util/AsyncImageLoader.kt
Normal file
@ -0,0 +1,125 @@
|
||||
package com.gh.common.util
|
||||
|
||||
import androidx.annotation.Keep
|
||||
import androidx.core.util.Pools
|
||||
import com.facebook.drawee.view.SimpleDraweeView
|
||||
import com.facebook.imagepipeline.request.Postprocessor
|
||||
|
||||
class AsyncImageLoader private constructor() {
|
||||
|
||||
fun addAsyncImage(view: SimpleDraweeView?, url: String, isAutoPlayGif: Boolean, processor: Postprocessor?) {
|
||||
try {
|
||||
val loopThread = LoopThread.getInstance()
|
||||
val params = loopThread.obtainImageParams()
|
||||
params.view = view
|
||||
params.url = url
|
||||
params.isAutoPlayGif = isAutoPlayGif
|
||||
params.processor = processor
|
||||
loopThread.addAsyncImage(params)
|
||||
} catch (e: InterruptedException) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
}
|
||||
|
||||
private class LoopThread private constructor() : Thread("GH_LOOP_IMAGE_LOADER") {
|
||||
|
||||
private var mIsLoop = false
|
||||
private val mRetryCount = 3
|
||||
private val mInterval = 10L
|
||||
private val mImageList = ArrayList<ImageLoadParams>()
|
||||
private val mImageListTemp = ArrayList<ImageLoadParams>()
|
||||
private val mImagePool = Pools.SynchronizedPool<ImageLoadParams>(15)
|
||||
|
||||
init {
|
||||
start()
|
||||
}
|
||||
|
||||
@Synchronized
|
||||
fun addAsyncImage(image: ImageLoadParams) {
|
||||
if (mIsLoop) {
|
||||
mImageListTemp.add(image)
|
||||
} else {
|
||||
mImageList.add(image)
|
||||
}
|
||||
}
|
||||
|
||||
override fun run() {
|
||||
rxTimerWithIoThread(mInterval) {
|
||||
try {
|
||||
if (!mIsLoop) {
|
||||
runInner()
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun runInner() {
|
||||
if (mImageList.isEmpty()) return
|
||||
|
||||
mIsLoop = true
|
||||
mImageList.forEach { image ->
|
||||
val width = image.view?.width ?: 0
|
||||
if (width == 0) {
|
||||
if (image.retryCount >= mRetryCount) {
|
||||
loadImage(image, true)
|
||||
} else {
|
||||
image.retryCount += 1
|
||||
mImageListTemp.add(image)
|
||||
}
|
||||
} else {
|
||||
if (image.view?.getTag(ImageUtils.TAG_TARGET_WIDTH) == null) {
|
||||
image.view?.setTag(ImageUtils.TAG_TARGET_WIDTH, width)
|
||||
}
|
||||
loadImage(image)
|
||||
}
|
||||
}
|
||||
mImageList.clear()
|
||||
|
||||
if (mImageListTemp.isNotEmpty()) {
|
||||
mImageList.addAll(mImageListTemp)
|
||||
mImageListTemp.clear()
|
||||
}
|
||||
mIsLoop = false
|
||||
}
|
||||
|
||||
|
||||
private fun loadImage(params: ImageLoadParams, isIgnoreWidth: Boolean = false) {
|
||||
ImageUtils.display(params.view, params.url, params.isAutoPlayGif, params.processor, isIgnoreWidth)
|
||||
releaseImageParams(params)
|
||||
}
|
||||
|
||||
fun obtainImageParams(): ImageLoadParams {
|
||||
var acquire = mImagePool.acquire()
|
||||
if (acquire == null) {
|
||||
acquire = ImageLoadParams()
|
||||
}
|
||||
return acquire
|
||||
}
|
||||
|
||||
private fun releaseImageParams(params: ImageLoadParams) {
|
||||
params.run {
|
||||
view = null
|
||||
url = ""
|
||||
isAutoPlayGif = false
|
||||
processor = null
|
||||
retryCount = 0
|
||||
mImagePool.release(this)
|
||||
}
|
||||
}
|
||||
|
||||
companion object : SingletonHolder<LoopThread>({ LoopThread() })
|
||||
}
|
||||
|
||||
companion object : SingletonHolder<AsyncImageLoader>({ AsyncImageLoader() })
|
||||
}
|
||||
|
||||
@Keep
|
||||
data class ImageLoadParams(
|
||||
var view: SimpleDraweeView? = null,
|
||||
var url: String = "",
|
||||
var isAutoPlayGif: Boolean = true,
|
||||
var processor: Postprocessor? = null,
|
||||
var retryCount: Int = 0
|
||||
)
|
||||
@ -141,7 +141,7 @@ object CommentHelper {
|
||||
val context = view.context
|
||||
val dialogOptions = ArrayList<String>()
|
||||
|
||||
if (isShowTop && (articleId != null || questionId != null) && commentEntity.me?.isContentAuthor == true) {
|
||||
if (isShowTop && (articleId != null || questionId != null || videoId != null) && commentEntity.me?.isContentAuthor == true) {
|
||||
dialogOptions.add(if (commentEntity.isTop) "取消置顶" else "置顶")
|
||||
}
|
||||
if (questionId != null && commentEntity.me?.isContentAuthor == true) {
|
||||
@ -158,9 +158,8 @@ object CommentHelper {
|
||||
}
|
||||
if (questionId != null &&
|
||||
commentEntity.me?.isModerator == true &&
|
||||
(commentEntity.me?.moderatorPermissions?.highlightAnswer
|
||||
?: Permissions.GUEST) > Permissions.GUEST &&
|
||||
!commentEntity.choiceness) {
|
||||
(commentEntity.me?.moderatorPermissions?.highlightAnswer ?: Permissions.GUEST) > Permissions.GUEST && !commentEntity.choiceness
|
||||
) {
|
||||
dialogOptions.add("加精选")
|
||||
}
|
||||
if (questionId != null &&
|
||||
|
||||
@ -2,7 +2,6 @@ package com.gh.common.util;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.view.View;
|
||||
import android.widget.LinearLayout;
|
||||
|
||||
import com.facebook.drawee.drawable.ScalingUtils;
|
||||
@ -19,11 +18,9 @@ import java.util.List;
|
||||
**/
|
||||
public class ConcernContentUtils {
|
||||
|
||||
private static final ArrayList<SimpleDraweeView> imageViewList = new ArrayList<>();
|
||||
|
||||
public static void addContentPic(Context context, LinearLayout linearLayout, List<String> list,
|
||||
String entrance, int width) {
|
||||
imageViewList.clear();
|
||||
ArrayList<SimpleDraweeView> imageViewList = new ArrayList<>();
|
||||
int count = list.size();
|
||||
int index = 0;
|
||||
for (int i = 0, size = (int) Math.ceil(list.size() / 3.0f); i < size; i++) {
|
||||
@ -36,6 +33,11 @@ public class ConcernContentUtils {
|
||||
for (int j = 0; j < 3; j++) {
|
||||
SimpleDraweeView draweeView = getImageView(context, list, entrance, index, width, 0);
|
||||
imageViewList.add(draweeView);
|
||||
int position = index;
|
||||
draweeView.setOnClickListener(v -> {
|
||||
Intent checkIntent = ImageViewerActivity.getIntent(context, (ArrayList<String>) list, position, imageViewList, entrance);
|
||||
context.startActivity(checkIntent);
|
||||
});
|
||||
ll.addView(draweeView);
|
||||
index += 1;
|
||||
}
|
||||
@ -45,6 +47,11 @@ public class ConcernContentUtils {
|
||||
case 1:
|
||||
SimpleDraweeView draweeView = getImageView(context, list, entrance, index, width, 1);
|
||||
imageViewList.add(draweeView);
|
||||
int position1 = index;
|
||||
draweeView.setOnClickListener(v -> {
|
||||
Intent checkIntent = ImageViewerActivity.getIntent(context, (ArrayList<String>) list, position1, imageViewList, entrance);
|
||||
context.startActivity(checkIntent);
|
||||
});
|
||||
linearLayout.addView(draweeView);
|
||||
count -= 1;
|
||||
index += 1;
|
||||
@ -55,6 +62,11 @@ public class ConcernContentUtils {
|
||||
for (int j = 0; j < 2; j++) {
|
||||
SimpleDraweeView imageView = getImageView(context, list, entrance, index, width, 2);
|
||||
imageViewList.add(imageView);
|
||||
int position2 = index;
|
||||
imageView.setOnClickListener(v -> {
|
||||
Intent checkIntent = ImageViewerActivity.getIntent(context, (ArrayList<String>) list, position2, imageViewList, entrance);
|
||||
context.startActivity(checkIntent);
|
||||
});
|
||||
ll.addView(imageView);
|
||||
index += 1;
|
||||
}
|
||||
@ -102,10 +114,6 @@ public class ConcernContentUtils {
|
||||
ScalingUtils.ScaleType.CENTER_CROP, list.get(position));
|
||||
break;
|
||||
}
|
||||
imageView.setOnClickListener(v -> {
|
||||
Intent checkIntent = ImageViewerActivity.getIntent(context, (ArrayList<String>) list, position, imageViewList, entrance);
|
||||
context.startActivity(checkIntent);
|
||||
});
|
||||
return imageView;
|
||||
}
|
||||
|
||||
|
||||
@ -3,16 +3,23 @@ package com.gh.common.util;
|
||||
import android.annotation.SuppressLint;
|
||||
import android.app.Activity;
|
||||
import android.app.Application;
|
||||
import android.content.ContentResolver;
|
||||
import android.content.ContentValues;
|
||||
import android.content.Context;
|
||||
import android.net.Uri;
|
||||
import android.os.Build;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.text.TextUtils;
|
||||
|
||||
import androidx.annotation.RequiresApi;
|
||||
|
||||
import com.gh.common.AppExecutor;
|
||||
import com.gh.common.constant.Constants;
|
||||
import com.gh.common.exposure.meta.MetaUtil;
|
||||
import com.gh.gamecenter.BuildConfig;
|
||||
import com.gh.gamecenter.entity.IdCardEntity;
|
||||
import com.gh.gamecenter.entity.UserInfoEntity;
|
||||
import com.gh.gamecenter.provider.GhContentProvider;
|
||||
import com.gh.gamecenter.retrofit.BiResponse;
|
||||
import com.gh.gamecenter.retrofit.RetrofitManager;
|
||||
import com.gh.gid.GidCallback;
|
||||
@ -24,7 +31,6 @@ import com.lightgame.utils.Utils;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import io.reactivex.android.schedulers.AndroidSchedulers;
|
||||
import io.reactivex.schedulers.Schedulers;
|
||||
import io.sentry.Sentry;
|
||||
import io.sentry.android.core.SentryAndroid;
|
||||
@ -42,11 +48,10 @@ public class DataUtils {
|
||||
* @param channel
|
||||
*/
|
||||
public static void init(final Application context, String channel) {
|
||||
|
||||
if (CommonDebug.IS_DEBUG) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// 初始化 Sentry 约占用 90ms,这里切换到子线程初始化
|
||||
AppExecutor.getIoExecutor().execute(() -> initSentry(context, channel));
|
||||
|
||||
@ -118,23 +123,23 @@ public class DataUtils {
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
|
||||
private static void initSentry(Context context, String channel) {
|
||||
SentryAndroid.init(context, options -> {
|
||||
// Sentry 疯狂报 ANR (很大一部分还是莫名奇妙的 ANR)严重影响到其它闪退日志的收集
|
||||
// 这里将它局限到只有官网渠道的包才统计 ANR
|
||||
if ("GH_206".equals(channel)) {
|
||||
if ("GH_206".equals(channel) || "GH_BETA".equals(channel)) {
|
||||
options.setAnrEnabled(true);
|
||||
options.setAnrTimeoutIntervalMillis(6000);
|
||||
} else {
|
||||
options.setAnrEnabled(false);
|
||||
}
|
||||
|
||||
|
||||
options.setDebug(BuildConfig.DEBUG);
|
||||
options.setEnableSessionTracking(true);
|
||||
options.setEnvironment(BuildConfig.FLAVOR);
|
||||
options.setDsn("https://6b1caf0d17c1408e8680f3f73ff80bd0@sentry.shanqu.cc/22");
|
||||
|
||||
|
||||
options.setBeforeSend((event, hint) -> {
|
||||
if (BuildConfig.DEBUG) {
|
||||
return null;
|
||||
@ -143,7 +148,7 @@ public class DataUtils {
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
Sentry.configureScope(scope -> {
|
||||
if (BuildConfig.BUILD_TIME != 0L) {
|
||||
scope.setTag("alias", "内测版" + BuildConfig.VERSION_NAME);
|
||||
@ -203,6 +208,22 @@ public class DataUtils {
|
||||
@Override
|
||||
public void onSuccess(UserInfoEntity data) {
|
||||
SPUtils.setString(Constants.SP_DEVICE_CERTIFICATION_PREFIX + gid, GsonUtils.toJson(data));
|
||||
|
||||
ContentValues values = new ContentValues();
|
||||
IdCardEntity idCardEntity = data.getIdCard();
|
||||
|
||||
if (idCardEntity != null) {
|
||||
values.put(GhContentProvider.KEY_IS_CERTIFICATED, !TextUtils.isEmpty(data.getIdCard().getId())); // 是否认证
|
||||
values.put(GhContentProvider.KEY_IS_ADULT,
|
||||
data.getIdCard().getMinor() == null
|
||||
|| !data.getIdCard().getMinor()
|
||||
);
|
||||
} else {
|
||||
values.put(GhContentProvider.KEY_IS_CERTIFICATED, false);
|
||||
values.put(GhContentProvider.KEY_IS_ADULT, false);
|
||||
}
|
||||
|
||||
HaloApp.getInstance().getContentResolver().insert(Uri.parse("content://com.gh.gamecenter.provider/certification"), values);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@ -200,6 +200,7 @@ public class DetailDownloadUtils {
|
||||
case notfound:
|
||||
case uncertificated:
|
||||
case unqualified:
|
||||
case unavailable:
|
||||
detailInitDownload(viewHolder, false);
|
||||
break;
|
||||
default:
|
||||
|
||||
@ -170,6 +170,8 @@ public class DeviceUtils {
|
||||
}
|
||||
|
||||
public static String getNetwork(Context context) {
|
||||
context = context.getApplicationContext();
|
||||
|
||||
ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
|
||||
if (connManager == null) return null;
|
||||
NetworkInfo info = connManager.getActiveNetworkInfo();
|
||||
|
||||
@ -176,6 +176,8 @@ object DialogHelper {
|
||||
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE)
|
||||
dialog.setContentView(binding.root)
|
||||
dialog.setCanceledOnTouchOutside(false)
|
||||
dialog.window?.setBackgroundDrawableResource(R.drawable.background_shape_white_radius_8)
|
||||
dialog.window?.attributes = dialog.window?.attributes?.apply { width = 160F.dip2px() }
|
||||
uiModificationCallback?.invoke(binding)
|
||||
dialog.show()
|
||||
return dialog
|
||||
|
||||
@ -44,13 +44,9 @@ import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.constraintlayout.widget.ConstraintLayout;
|
||||
import androidx.core.content.ContextCompat;
|
||||
import androidx.databinding.DataBindingUtil;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import kotlin.Unit;
|
||||
import kotlin.jvm.functions.Function0;
|
||||
|
||||
import com.facebook.drawee.generic.GenericDraweeHierarchy;
|
||||
import com.facebook.drawee.view.SimpleDraweeView;
|
||||
import com.gh.common.AppExecutor;
|
||||
@ -81,6 +77,7 @@ import com.gh.gamecenter.entity.ApkEntity;
|
||||
import com.gh.gamecenter.entity.Badge;
|
||||
import com.gh.gamecenter.entity.BadgeEntity;
|
||||
import com.gh.gamecenter.entity.GameEntity;
|
||||
import com.gh.gamecenter.entity.PermissionsEntity;
|
||||
import com.gh.gamecenter.entity.PrivacyPolicyEntity;
|
||||
import com.gh.gamecenter.entity.SettingsEntity;
|
||||
import com.gh.gamecenter.entity.SimpleGameEntity;
|
||||
@ -101,6 +98,9 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
import kotlin.Unit;
|
||||
import kotlin.jvm.functions.Function0;
|
||||
|
||||
public class DialogUtils {
|
||||
|
||||
public static Dialog showWaitDialog(Context context, String msg) {
|
||||
@ -113,6 +113,10 @@ public class DialogUtils {
|
||||
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
|
||||
dialog.setContentView(view);
|
||||
dialog.setCanceledOnTouchOutside(false);
|
||||
dialog.getWindow().setBackgroundDrawableResource(R.drawable.background_shape_white_radius_8);
|
||||
WindowManager.LayoutParams layoutParams = dialog.getWindow().getAttributes();
|
||||
layoutParams.width = DisplayUtils.dip2px(160);
|
||||
dialog.getWindow().setAttributes(layoutParams);
|
||||
dialog.show();
|
||||
return dialog;
|
||||
}
|
||||
@ -842,7 +846,7 @@ public class DialogUtils {
|
||||
|
||||
LinearLayout container = new LinearLayout(context);
|
||||
container.setOrientation(LinearLayout.VERTICAL);
|
||||
container.setBackgroundColor(Color.WHITE);
|
||||
container.setBackgroundColor(ContextCompat.getColor(context, R.color.background_white));
|
||||
container.setPadding(0, DisplayUtils.dip2px(context, 12f), 0, DisplayUtils.dip2px(context, 12f));
|
||||
|
||||
for (String option : options) {
|
||||
@ -994,7 +998,10 @@ public class DialogUtils {
|
||||
if (holder instanceof PrivacyPolicyItemViewHolder) {
|
||||
PrivacyPolicyItemViewHolder viewHolder = (PrivacyPolicyItemViewHolder) holder;
|
||||
PrivacyItemBinding binding = viewHolder.getBinding();
|
||||
binding.setData(entity.getPermissions().get(position));
|
||||
final PermissionsEntity permissionsEntity = entity.getPermissions().get(position);
|
||||
ImageUtils.display(binding.icon, permissionsEntity.getIcon());
|
||||
binding.name.setText(permissionsEntity.getName());
|
||||
binding.intro.setText(permissionsEntity.getIntro());
|
||||
GenericDraweeHierarchy hierarchy = binding.icon.getHierarchy();
|
||||
if (hierarchy != null) {
|
||||
if (position == 0) {
|
||||
@ -1393,11 +1400,12 @@ public class DialogUtils {
|
||||
} else {
|
||||
final Dialog dialog = new Dialog(context, R.style.GhAlertDialog);
|
||||
|
||||
DialogOverseaConfirmationBinding binding = DataBindingUtil.inflate(LayoutInflater.from(context), R.layout.dialog_oversea_confirmation, null, false);
|
||||
DialogOverseaConfirmationBinding binding = DialogOverseaConfirmationBinding.inflate(LayoutInflater.from(context), null, false);
|
||||
|
||||
View contentView = binding.getRoot();
|
||||
|
||||
binding.setGame(gameEntity);
|
||||
binding.gameIcon.displayGameIcon(gameEntity);
|
||||
binding.gameNameTv.setText(context.getString(R.string.dialog_oversea_hint, gameEntity.getName()));
|
||||
binding.urlTv.setText(gameEntity.getOverseasAddressDialog().getLink());
|
||||
binding.closeIv.setOnClickListener(v -> dialog.dismiss());
|
||||
binding.downloadBtn.setText("下载(" + gameEntity.getApk().get(0).getSize() + ")");
|
||||
@ -1434,7 +1442,7 @@ public class DialogUtils {
|
||||
params = window.getAttributes();
|
||||
params.width = (int) (context.getResources().getDisplayMetrics().widthPixels * 0.9);
|
||||
window.setAttributes(params);
|
||||
window.setBackgroundDrawableResource(R.drawable.full_dialog_background);
|
||||
window.setBackgroundDrawableResource(R.drawable.textview_white_up);
|
||||
}
|
||||
|
||||
inflate.findViewById(R.id.imprint_close).setOnClickListener(v -> dialog.dismiss());
|
||||
@ -1453,10 +1461,11 @@ public class DialogUtils {
|
||||
continue;
|
||||
}
|
||||
View item = LayoutInflater.from(context).inflate(R.layout.imprint_content_item, null);
|
||||
ImprintContentItemBinding bind = DataBindingUtil.bind(item);
|
||||
bind.setApk(apk);
|
||||
ImprintContentItemBinding bind = ImprintContentItemBinding.bind(item);
|
||||
String platform = TextUtils.isEmpty(apk.getRemark()) ? apk.getPlatformName() : apk.getPlatformName() + "\n" + apk.getRemark();
|
||||
bind.setPlatformName(platform);
|
||||
bind.imprintPlatform.setText(platform);
|
||||
bind.imprintVersion.setText(apk.getVersion());
|
||||
bind.imprintTime.setText(NewsUtils.getFormattedTime(apk.getTime() != null ? apk.getTime() : 0));
|
||||
content.addView(item, LinearLayout.LayoutParams.MATCH_PARENT, DisplayUtils.dip2px(40));
|
||||
}
|
||||
|
||||
@ -2209,7 +2218,7 @@ public class DialogUtils {
|
||||
dialog.show();
|
||||
}
|
||||
|
||||
public static void showReserveSuccess2WechatBindDialog(Context context, ConfirmListener confirmListener,CancelListener cancelListener) {
|
||||
public static void showReserveSuccess2WechatBindDialog(Context context, ConfirmListener confirmListener, CancelListener cancelListener) {
|
||||
context = checkDialogContext(context);
|
||||
|
||||
final Dialog dialog = new Dialog(context, R.style.DialogWindowTransparent);
|
||||
|
||||
@ -19,6 +19,7 @@ import com.gh.common.constant.Constants
|
||||
import com.gh.common.exposure.ExposureEvent
|
||||
import com.gh.common.exposure.ExposureEvent.Companion.createEvent
|
||||
import com.gh.common.exposure.ExposureManager.log
|
||||
import com.gh.common.exposure.ExposureSource
|
||||
import com.gh.common.exposure.ExposureTraceUtils.appendTrace
|
||||
import com.gh.common.exposure.ExposureType
|
||||
import com.gh.common.util.EntranceUtils.*
|
||||
@ -49,9 +50,7 @@ import com.gh.gamecenter.personalhome.background.PersonalityBackgroundActivity
|
||||
import com.gh.gamecenter.personalhome.border.AvatarBorderActivity
|
||||
import com.gh.gamecenter.personalhome.home.UserHistoryViewModel
|
||||
import com.gh.gamecenter.qa.answer.detail.SimpleAnswerDetailActivity
|
||||
import com.gh.gamecenter.qa.article.SimpleArticleListActivity
|
||||
import com.gh.gamecenter.qa.article.detail.ArticleDetailActivity
|
||||
import com.gh.gamecenter.qa.column.detail.AskColumnDetailActivity
|
||||
import com.gh.gamecenter.qa.questions.newdetail.NewQuestionDetailActivity
|
||||
import com.gh.gamecenter.qa.subject.CommunitySubjectActivity
|
||||
import com.gh.gamecenter.qa.video.detail.ForumVideoDetailActivity
|
||||
@ -160,7 +159,7 @@ object DirectUtils {
|
||||
entrance: String,
|
||||
path: String,
|
||||
exposureEvent: ExposureEvent? = null,
|
||||
unknownCallback: (() -> Unit)?
|
||||
unknownCallback: (() -> Unit)?,
|
||||
) {
|
||||
when (linkEntity.type) {
|
||||
"article", "news", "文章" -> {
|
||||
@ -706,7 +705,7 @@ object DirectUtils {
|
||||
fun directToToolbox(context: Context, gameId: String, toolboxUrl: String, entrance: String = ENTRANCE_BROWSER) {
|
||||
val bundle = Bundle()
|
||||
bundle.putString(KEY_ENTRANCE, entrance)
|
||||
bundle.putString(KEY_TO, ToolBoxActivity::class.java.simpleName)
|
||||
bundle.putString(KEY_TO, ToolBoxBlockActivity::class.java.name)
|
||||
bundle.putString(KEY_GAMEID, gameId)
|
||||
bundle.putString(KEY_URL, toolboxUrl)
|
||||
jumpActivity(context, bundle)
|
||||
@ -1146,7 +1145,13 @@ object DirectUtils {
|
||||
* 跳转新分类
|
||||
*/
|
||||
@JvmStatic
|
||||
fun directCatalog(context: Context, catalogId: String, catalogTitle: String, entrance: String? = null, path: String? = "") {
|
||||
fun directCatalog(
|
||||
context: Context,
|
||||
catalogId: String,
|
||||
catalogTitle: String,
|
||||
entrance: String? = null,
|
||||
path: String? = "",
|
||||
) {
|
||||
if (catalogId.isEmpty()) return
|
||||
val bundle = Bundle()
|
||||
bundle.putString(KEY_TO, CatalogActivity::class.java.name)
|
||||
@ -1160,7 +1165,13 @@ object DirectUtils {
|
||||
* 跳转新分类2.0
|
||||
*/
|
||||
@JvmStatic
|
||||
fun directCategoryV2(context: Context, categoryId: String, categoryTitle: String, entrance: String? = null, path: String? = "") {
|
||||
fun directCategoryV2(
|
||||
context: Context,
|
||||
categoryId: String,
|
||||
categoryTitle: String,
|
||||
entrance: String? = null,
|
||||
path: String? = "",
|
||||
) {
|
||||
if (categoryId.isEmpty()) return
|
||||
val bundle = Bundle()
|
||||
bundle.putString(KEY_TO, CategoryV2Activity::class.java.name)
|
||||
@ -1175,13 +1186,13 @@ object DirectUtils {
|
||||
*/
|
||||
@JvmStatic
|
||||
fun directAskColumnLabelDetail(context: Context, tag: String, community: CommunityEntity, entrance: String? = null, path: String? = "") {
|
||||
val bundle = Bundle()
|
||||
bundle.putString(KEY_TO, AskColumnDetailActivity::class.java.name)
|
||||
bundle.putString(KEY_ASK_TAG, tag)
|
||||
bundle.putParcelable(KEY_COMMUNITY_DATA, community)
|
||||
bundle.putString(KEY_ENTRANCE, entrance ?: ENTRANCE_BROWSER)
|
||||
bundle.putString(KEY_PATH, path)
|
||||
jumpActivity(context, bundle)
|
||||
// val bundle = Bundle()
|
||||
// bundle.putString(KEY_TO, AskColumnDetailActivity::class.java.name)
|
||||
// bundle.putString(KEY_ASK_TAG, tag)
|
||||
// bundle.putParcelable(KEY_COMMUNITY_DATA, community)
|
||||
// bundle.putString(KEY_ENTRANCE, entrance ?: ENTRANCE_BROWSER)
|
||||
// bundle.putString(KEY_PATH, path)
|
||||
// jumpActivity(context, bundle)
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1189,14 +1200,14 @@ object DirectUtils {
|
||||
*/
|
||||
@JvmStatic
|
||||
fun directAskColumnDetail(context: Context, columnId: String, community: CommunityEntity, entrance: String? = null, path: String? = "") {
|
||||
if (columnId.isEmpty()) return
|
||||
val bundle = Bundle()
|
||||
bundle.putString(KEY_TO, AskColumnDetailActivity::class.java.name)
|
||||
bundle.putString(KEY_COLUMN_ID, columnId)
|
||||
bundle.putParcelable(KEY_COMMUNITY_DATA, community)
|
||||
bundle.putString(KEY_ENTRANCE, entrance ?: ENTRANCE_BROWSER)
|
||||
bundle.putString(KEY_PATH, path)
|
||||
jumpActivity(context, bundle)
|
||||
// if (columnId.isEmpty()) return
|
||||
// val bundle = Bundle()
|
||||
// bundle.putString(KEY_TO, AskColumnDetailActivity::class.java.name)
|
||||
// bundle.putString(KEY_COLUMN_ID, columnId)
|
||||
// bundle.putParcelable(KEY_COMMUNITY_DATA, community)
|
||||
// bundle.putString(KEY_ENTRANCE, entrance ?: ENTRANCE_BROWSER)
|
||||
// bundle.putString(KEY_PATH, path)
|
||||
// jumpActivity(context, bundle)
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1239,13 +1250,13 @@ object DirectUtils {
|
||||
*/
|
||||
@JvmStatic
|
||||
fun directSimpleArticleList(context: Context, sortType: String, entrance: String? = null, path: String? = "") {
|
||||
if (sortType.isEmpty()) return
|
||||
val bundle = Bundle()
|
||||
bundle.putString(KEY_TO, SimpleArticleListActivity::class.java.name)
|
||||
bundle.putString(KEY_TYPE, sortType)
|
||||
bundle.putString(KEY_ENTRANCE, entrance ?: ENTRANCE_BROWSER)
|
||||
bundle.putString(KEY_PATH, path)
|
||||
jumpActivity(context, bundle)
|
||||
// if (sortType.isEmpty()) return
|
||||
// val bundle = Bundle()
|
||||
// bundle.putString(KEY_TO, SimpleArticleListActivity::class.java.name)
|
||||
// bundle.putString(KEY_TYPE, sortType)
|
||||
// bundle.putString(KEY_ENTRANCE, entrance ?: ENTRANCE_BROWSER)
|
||||
// bundle.putString(KEY_PATH, path)
|
||||
// jumpActivity(context, bundle)
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
@ -1771,8 +1782,8 @@ object DirectUtils {
|
||||
fun directToSuggestion(
|
||||
context: Context,
|
||||
type: SuggestType,
|
||||
suggestHintType: String,
|
||||
content: String,
|
||||
suggestHintType: String? = null,
|
||||
content: String? = null,
|
||||
isQaFeedback: Boolean = false,
|
||||
qaContentId: String = ""
|
||||
) {
|
||||
@ -1791,8 +1802,8 @@ object DirectUtils {
|
||||
fun directToSuggestion(
|
||||
context: Context,
|
||||
type: SuggestType,
|
||||
suggestHintType: String,
|
||||
content: String,
|
||||
suggestHintType: String? = null,
|
||||
content: String? = null,
|
||||
game: SimpleGameEntity,
|
||||
platform: String = ""
|
||||
) {
|
||||
|
||||
@ -18,13 +18,16 @@ import android.view.ViewGroup;
|
||||
import android.view.Window;
|
||||
import android.view.WindowManager;
|
||||
|
||||
import androidx.annotation.ColorInt;
|
||||
import androidx.annotation.ColorRes;
|
||||
import androidx.core.content.ContextCompat;
|
||||
import androidx.core.graphics.ColorUtils;
|
||||
|
||||
import com.halo.assistant.HaloApp;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
import androidx.core.content.ContextCompat;
|
||||
|
||||
public class DisplayUtils {
|
||||
|
||||
/**
|
||||
@ -223,6 +226,27 @@ public class DisplayUtils {
|
||||
}
|
||||
}
|
||||
|
||||
public static void setStatusBarColor(Activity activity, @ColorRes int colorRes) {
|
||||
Window window = activity.getWindow();
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||
int colorInt = ContextCompat.getColor(activity, colorRes);
|
||||
// 设置状态栏底色颜色
|
||||
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
|
||||
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
|
||||
window.setStatusBarColor(colorInt);
|
||||
// 如果亮色,设置状态栏文字为黑色
|
||||
if (isLightColor(colorInt)) {
|
||||
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
|
||||
} else {
|
||||
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean isLightColor(@ColorInt int color) {
|
||||
return ColorUtils.calculateLuminance(color) >= 0.5;
|
||||
}
|
||||
|
||||
|
||||
private static boolean isMiuiOs() {
|
||||
String property = getSystemProperty("ro.miui.ui.version.name", "");
|
||||
|
||||
@ -114,7 +114,7 @@ object DownloadItemUtils {
|
||||
// 已预约
|
||||
holder.gameDownloadBtn.visibility = View.VISIBLE
|
||||
holder.gameDownloadBtn.text = "已预约"
|
||||
holder.gameDownloadBtn.setTextColor(ContextCompat.getColor(holder.gameDes.context, R.color.aaaaaa))
|
||||
holder.gameDownloadBtn.setTextColor(ContextCompat.getColor(holder.gameDes.context, R.color.text_subtitleDesc))
|
||||
holder.gameDownloadBtn.setBackgroundResource(R.drawable.button_round_f5f5f5)
|
||||
updateItemViewStatus(holder, false, null, null)
|
||||
}
|
||||
@ -166,6 +166,7 @@ object DownloadItemUtils {
|
||||
hideDownloadBtnIfNoAvailableContent: Boolean = false,
|
||||
pluginLocation: PluginLocation? = PluginLocation.only_game
|
||||
) {
|
||||
downloadBtn.background = R.drawable.download_button_normal_style.toDrawable(context)
|
||||
// 控制是否显示下载按钮
|
||||
downloadBtn.goneIf(!Config.isShowDownload(gameEntity.id) || context.getString(R.string.app_name) == gameEntity.name)
|
||||
// 青少年模式显示查看
|
||||
@ -181,8 +182,8 @@ object DownloadItemUtils {
|
||||
setBackgroundResource(R.drawable.button_reserve)
|
||||
} else {
|
||||
text = "已预约"
|
||||
setTextColor(Color.WHITE)
|
||||
setBackgroundResource(R.drawable.game_item_btn_pause_dn)
|
||||
setTextColor(R.color.text_subtitleDesc.toColor())
|
||||
setBackgroundResource(R.drawable.bg_shape_f5_radius_999)
|
||||
}
|
||||
}
|
||||
return
|
||||
@ -208,7 +209,7 @@ object DownloadItemUtils {
|
||||
} else {
|
||||
text = context.getString(R.string.none)
|
||||
setTextColor(R.color.button_gray.toColor())
|
||||
setBackgroundResource(R.drawable.news_detail_comment)
|
||||
setBackgroundResource(R.drawable.button_border_gray_oval)
|
||||
if (hideDownloadBtnIfNoAvailableContent) {
|
||||
visibility = View.GONE
|
||||
}
|
||||
@ -227,16 +228,18 @@ object DownloadItemUtils {
|
||||
setTextColor(ContextCompat.getColorStateList(context, R.color.text_downloading_style))
|
||||
} else if (status == DownloadStatus.waiting) {
|
||||
setText(R.string.waiting)
|
||||
setBackgroundResource(R.drawable.game_item_btn_downloading_style)
|
||||
setTextColor(ContextCompat.getColorStateList(context, R.color.text_downloading_style))
|
||||
setBackgroundResource(R.drawable.button_round_border_eeeeee)
|
||||
setTextColor(ContextCompat.getColorStateList(context, R.color.text_subtitleDesc))
|
||||
} else if (status == DownloadStatus.pause || status == DownloadStatus.timeout || status == DownloadStatus.neterror || status == DownloadStatus.subscribe || status == DownloadStatus.overflow) {
|
||||
if (status == DownloadStatus.waiting) {
|
||||
setText(R.string.waiting)
|
||||
setBackgroundResource(R.drawable.button_round_border_eeeeee)
|
||||
setTextColor(ContextCompat.getColorStateList(context, R.color.text_subtitleDesc))
|
||||
} else {
|
||||
setText(R.string.downloading)
|
||||
setBackgroundResource(R.drawable.game_item_btn_downloading_style)
|
||||
setTextColor(ContextCompat.getColorStateList(context, R.color.text_downloading_style))
|
||||
}
|
||||
setBackgroundResource(R.drawable.game_item_btn_downloading_style)
|
||||
setTextColor(ContextCompat.getColorStateList(context, R.color.text_downloading_style))
|
||||
} else if (status == DownloadStatus.done) {
|
||||
val xapkStatus = downloadEntity.meta[XapkInstaller.XAPK_UNZIP_STATUS]
|
||||
if (XapkUnzipStatus.UNZIPPING.name == xapkStatus) {
|
||||
@ -416,6 +419,7 @@ object DownloadItemUtils {
|
||||
holder.recommendTv.text = recommendStyle.text
|
||||
if (TextUtils.isEmpty(recommendStyle.icon)) {
|
||||
holder.recommendIv.visibility = View.GONE
|
||||
holder.recommendContainer?.setPadding(6F.dip2px(), 0, 8F.dip2px(), 0)
|
||||
} else {
|
||||
holder.recommendIv.visibility = View.VISIBLE
|
||||
ImageUtils.display(holder.recommendIv, recommendStyle.icon)
|
||||
|
||||
@ -112,6 +112,7 @@ object DownloadNotificationHelper {
|
||||
|| entity.status == DownloadStatus.cancel
|
||||
|| entity.status == DownloadStatus.hijack
|
||||
|| entity.status == DownloadStatus.unqualified
|
||||
|| entity.status == DownloadStatus.unavailable
|
||||
|| entity.status == DownloadStatus.uncertificated
|
||||
|| entity.status == DownloadStatus.notfound
|
||||
|| entity.status == DownloadStatus.overflow
|
||||
@ -186,6 +187,6 @@ object DownloadNotificationHelper {
|
||||
}
|
||||
|
||||
private fun getNotificationIcon(): Int {
|
||||
return if (mShouldUseAlternativeNotificationIcon) R.drawable.ic_notification else R.mipmap.logo
|
||||
return if (mShouldUseAlternativeNotificationIcon) R.drawable.ic_download_notification else R.mipmap.logo
|
||||
}
|
||||
}
|
||||
@ -36,11 +36,11 @@ import okhttp3.MediaType
|
||||
import okhttp3.RequestBody
|
||||
import org.greenrobot.eventbus.EventBus
|
||||
import org.json.JSONObject
|
||||
import java.util.*
|
||||
|
||||
object DownloadObserver {
|
||||
|
||||
private val mApplication = HaloApp.getInstance().application
|
||||
|
||||
// 简单 debounce 因为内存更新 downloadEntity 对象造成的触发双重下载完成事件
|
||||
// TODO 修复因为更改内存对象造成的双重下载完成事件问题,具体触发代码见 DownloadDao.updateSnapshotList
|
||||
private var mDoneDebouncePair: Pair<String, Long>? = null
|
||||
@ -75,15 +75,18 @@ object DownloadObserver {
|
||||
val currentActivity = AppManager.getInstance().currentActivity() ?: return
|
||||
|
||||
DialogHelper.showDialog(currentActivity, "下载失败", "下载链接已失效,建议提交反馈", "立即反馈", "取消", {
|
||||
SuggestionActivity.startSuggestionActivity(currentActivity,
|
||||
SuggestType.gameQuestion, "notfound",
|
||||
StringUtils.buildString(downloadEntity.name, ",问题反馈:下载链接失效"),
|
||||
SimpleGameEntity(gameId, downloadEntity.name, ""))
|
||||
SuggestionActivity.startSuggestionActivity(
|
||||
currentActivity,
|
||||
SuggestType.gameQuestion, "notfound",
|
||||
StringUtils.buildString(downloadEntity.name, ",问题反馈:下载链接失效"),
|
||||
SimpleGameEntity(gameId, downloadEntity.name, "")
|
||||
)
|
||||
}, extraConfig = DialogHelper.Config(centerTitle = true, centerContent = true))
|
||||
return
|
||||
} else if (DownloadStatus.neterror == downloadEntity.status || DownloadStatus.timeout == downloadEntity.status) {
|
||||
if (downloadEntity.meta[Constants.MARK_RETRY_DOWNLOAD].isNullOrEmpty()
|
||||
&& NetworkUtils.isWifiConnected(HaloApp.getInstance().application)) {
|
||||
&& NetworkUtils.isWifiConnected(HaloApp.getInstance().application)
|
||||
) {
|
||||
downloadEntity.meta[Constants.MARK_RETRY_DOWNLOAD] = downloadEntity.progress.toString()
|
||||
downloadManager.updateDownloadEntity(downloadEntity)
|
||||
downloadManager.resumeDownload(downloadEntity.url)
|
||||
@ -105,6 +108,20 @@ object DownloadObserver {
|
||||
// 未成年
|
||||
RealNameHelper.showRealNameUnqualifiedDialog(downloadEntity)
|
||||
|
||||
// 删除任务
|
||||
downloadEntity.status = DownloadStatus.cancel
|
||||
downloadManager.cancel(downloadEntity.url)
|
||||
} else if (DownloadStatus.unavailable == downloadEntity.status) {
|
||||
// 未接入防沉迷系统
|
||||
val currentActivity = AppManager.getInstance().currentActivity() ?: return
|
||||
|
||||
DialogHelper.showDialog(
|
||||
context = currentActivity,
|
||||
title = "温馨提示",
|
||||
content = "该游戏未接入防沉迷系统,暂不支持下载",
|
||||
confirmText = "知道了",
|
||||
cancelText = "")
|
||||
|
||||
// 删除任务
|
||||
downloadEntity.status = DownloadStatus.cancel
|
||||
downloadManager.cancel(downloadEntity.url)
|
||||
@ -123,7 +140,8 @@ object DownloadObserver {
|
||||
performDownloadCompleteAction(downloadEntity, gameId, downloadManager)
|
||||
} else {
|
||||
if (mDoneDebouncePair?.second == 0L
|
||||
|| (mDoneDebouncePair?.second ?: 0) - System.currentTimeMillis() > 500) {
|
||||
|| System.currentTimeMillis() - (mDoneDebouncePair?.second ?: 0) > 500
|
||||
) {
|
||||
performDownloadCompleteAction(downloadEntity, gameId, downloadManager)
|
||||
}
|
||||
}
|
||||
@ -137,7 +155,8 @@ object DownloadObserver {
|
||||
|
||||
// 如果已下载大小发生变化,表示成功恢复下载,则重置重试标记
|
||||
if (downloadEntity.status == DownloadStatus.downloading &&
|
||||
downloadEntity.progress.toString() != downloadEntity.meta[Constants.MARK_RETRY_DOWNLOAD]) {
|
||||
downloadEntity.progress.toString() != downloadEntity.meta[Constants.MARK_RETRY_DOWNLOAD]
|
||||
) {
|
||||
downloadEntity.meta[Constants.MARK_RETRY_DOWNLOAD] = ""
|
||||
downloadManager.updateDownloadEntity(downloadEntity)
|
||||
}
|
||||
@ -149,9 +168,11 @@ object DownloadObserver {
|
||||
|
||||
}
|
||||
|
||||
private fun performDownloadCompleteAction(downloadEntity: DownloadEntity,
|
||||
gameId: String,
|
||||
downloadManager: DownloadManager) {
|
||||
private fun performDownloadCompleteAction(
|
||||
downloadEntity: DownloadEntity,
|
||||
gameId: String,
|
||||
downloadManager: DownloadManager
|
||||
) {
|
||||
if (downloadEntity.name.contains(mApplication.getString(R.string.app_name))) {
|
||||
statDoneEvent(downloadEntity)
|
||||
MtaHelper.onEvent("软件更新", "下载完成")
|
||||
@ -167,6 +188,8 @@ object DownloadObserver {
|
||||
} else {
|
||||
statDoneEvent(downloadEntity)
|
||||
|
||||
GameActivityDownloadHelper.clear()
|
||||
|
||||
EnergyTaskHelper.postEnergyTask(
|
||||
"download_game",
|
||||
downloadEntity.gameId,
|
||||
@ -196,8 +219,10 @@ object DownloadObserver {
|
||||
val currentActivity = AppManager.getInstance().currentActivity()
|
||||
?: return
|
||||
|
||||
SimulatorDownloadManager.getInstance().showDownloadDialog(currentActivity, simulator,
|
||||
SimulatorDownloadManager.SimulatorLocation.LAUNCH, downloadEntity.gameId, gameName, null)
|
||||
SimulatorDownloadManager.getInstance().showDownloadDialog(
|
||||
currentActivity, simulator,
|
||||
SimulatorDownloadManager.SimulatorLocation.LAUNCH, downloadEntity.gameId, gameName, null
|
||||
)
|
||||
}
|
||||
SimulatorGameManager.recordDownloadSimulatorGame(downloadEntity.gameId, simulator.type)
|
||||
SimulatorGameManager.postPlayedGame(downloadEntity.gameId, downloadEntity.packageName)
|
||||
@ -205,7 +230,8 @@ object DownloadObserver {
|
||||
val downloadType = downloadEntity.getMetaExtra(Constants.EXTRA_DOWNLOAD_TYPE)
|
||||
// 是否是自动安装
|
||||
val isAutoInstall = PreferenceManager.getDefaultSharedPreferences(mApplication).getBoolean(
|
||||
GameDownloadSettingFragment.AUTO_INSTALL_SP_KEY, true)
|
||||
GameDownloadSettingFragment.AUTO_INSTALL_SP_KEY, true
|
||||
)
|
||||
if (downloadType == Constants.SIMULATOR_DOWNLOAD || isAutoInstall) {
|
||||
if (FileUtils.isEmptyFile(downloadEntity.path)) {
|
||||
Utils.toast(mApplication, R.string.install_failure_hint)
|
||||
@ -252,7 +278,8 @@ object DownloadObserver {
|
||||
val simulator = HaloApp.get(downloadEntity.name, true) as? SimulatorEntity
|
||||
?: return@showSimulatorParseErrorDialog
|
||||
DownloadManager.getInstance().cancel(downloadEntity.url, true, true)
|
||||
SimulatorDownloadManager.getInstance().showDownloadDialog(currentActivity, simulator, SimulatorDownloadManager.SimulatorLocation.SIMULATOR_GAME)
|
||||
SimulatorDownloadManager.getInstance()
|
||||
.showDownloadDialog(currentActivity, simulator, SimulatorDownloadManager.SimulatorLocation.SIMULATOR_GAME)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -290,15 +317,18 @@ object DownloadObserver {
|
||||
}
|
||||
val isPlatformRecommend = java.lang.Boolean.parseBoolean(downloadEntity.getMetaExtra(Constants.IS_PLATFORM_RECOMMEND))
|
||||
ExposureUtils.logADownloadCompleteExposureEvent(
|
||||
GameEntity(id = downloadEntity.gameId,
|
||||
mName = downloadEntity.name.removeSuffix(Constants.GAME_NAME_DECORATOR),
|
||||
gameVersion = downloadEntity.versionName ?: "",
|
||||
isPlatformRecommend = isPlatformRecommend),
|
||||
downloadEntity.platform,
|
||||
downloadEntity.exposureTrace,
|
||||
downloadEntity.meta[DownloadEntity.DOWNLOAD_HOST_KEY] ?: "unknown",
|
||||
downloadEntity.meta[DownloadEntity.DOWNLOAD_PATH_KEY] ?: "unknown",
|
||||
type)
|
||||
GameEntity(
|
||||
id = downloadEntity.gameId,
|
||||
mName = downloadEntity.name.removeSuffix(Constants.GAME_NAME_DECORATOR),
|
||||
gameVersion = downloadEntity.versionName ?: "",
|
||||
isPlatformRecommend = isPlatformRecommend
|
||||
),
|
||||
downloadEntity.platform,
|
||||
downloadEntity.exposureTrace,
|
||||
downloadEntity.meta[DownloadEntity.DOWNLOAD_HOST_KEY] ?: "unknown",
|
||||
downloadEntity.meta[DownloadEntity.DOWNLOAD_PATH_KEY] ?: "unknown",
|
||||
type
|
||||
)
|
||||
|
||||
DataCollectionUtils.uploadDownload(mApplication, downloadEntity, "完成")
|
||||
}
|
||||
@ -320,12 +350,14 @@ object DownloadObserver {
|
||||
val params = HashMap<String, String>()
|
||||
params["game"] = id
|
||||
params["platform"] = platform ?: ""
|
||||
val body = RequestBody.create(MediaType.parse("application/json"),
|
||||
JSONObject(params as Map<*, *>).toString())
|
||||
val body = RequestBody.create(
|
||||
MediaType.parse("application/json"),
|
||||
JSONObject(params as Map<*, *>).toString()
|
||||
)
|
||||
RetrofitManager.getInstance().api.postDownload(body)
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(Response())
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(Response())
|
||||
}
|
||||
|
||||
}
|
||||
@ -28,6 +28,9 @@ import java.util.Set;
|
||||
*/
|
||||
public class EmojiUtils {
|
||||
|
||||
private EmojiUtils() {
|
||||
}
|
||||
|
||||
// Generated from https://unicode.org/Public/14.0.0/ucd/emoji/emoji-data.txt
|
||||
private static final Set<String> EMOJI_HASH_SET = new HashSet<>(Arrays.asList(
|
||||
"1f000", "1f001", "1f002", "1f003", "1f004", "1f005", "1f006", "1f007", "1f008", "1f009",
|
||||
@ -398,10 +401,6 @@ public class EmojiUtils {
|
||||
"e0072", "e0073", "e0074", "e0075", "e0076", "e0077", "e0078", "e0079", "e007a", "e007b",
|
||||
"e007c", "e007d", "e007e", "e007f", "fe0f"));
|
||||
|
||||
private static String toHexStr(char c) {
|
||||
return Integer.toHexString(c);
|
||||
}
|
||||
|
||||
private static String toHexStr(int c) {
|
||||
return Integer.toHexString(c);
|
||||
}
|
||||
|
||||
@ -47,6 +47,7 @@ public class EntranceUtils {
|
||||
public static final String KEY_GAMENAME = "gameName";
|
||||
public static final String KEY_PACKAGE_MD5 = "package_md5";
|
||||
public static final String HOST_ARTICLE = "article";
|
||||
public static final String HOST_INVOKE_ONLY = "invoke_only";
|
||||
public static final String HOST_UPLOAD_VIDEO = "upload_video";//上传视频
|
||||
public static final String HOST_UPLOAD_VIDEO_NEW = "upload_video_new"; // 上传视频新(AKA 发视频)
|
||||
public static final String HOST_VIDEO_SINGLE = "video_single";//指定视频-不能划动
|
||||
@ -257,12 +258,15 @@ public class EntranceUtils {
|
||||
public static final String KEY_BLOCK_ID = "block_id";
|
||||
public static final String KEY_BLOCK_NAME = "block_name";
|
||||
public static final String KEY_INSERT_GAME_COLLECTION = "insert_game_collection";
|
||||
public static final String KEY_INSERT_BBS_VIDEO = "insert_bbs_video";
|
||||
public static final String KEY_IS_FROM_SQUARE = "is_from_square";
|
||||
public static final String KEY_FORUM_NAME = "forum_name";//版块名称
|
||||
public static final String KEY_GAME_COLLECTION_TITLE = "game_collection_title";//游戏单标题
|
||||
public static final String KEY_GAME_COLLECTION_ID = "game_collection_id";//游戏单ID
|
||||
public static final String KEY_ASSIST_RES = "assist_res";
|
||||
public static final String KEY_LAST_SELECTED_POSITION = "last_selected_position";
|
||||
public static final String KEY_RECOMMEND_ID = "recommend_id";
|
||||
public static final String KEY_LAST_PAGE_DATA = "last_page_data";
|
||||
|
||||
public static void jumpActivity(Context context, Bundle bundle) {
|
||||
bundle.putBoolean(KEY_REQUIRE_REDIRECT, true);
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
package com.gh.common.util
|
||||
|
||||
import android.animation.Animator
|
||||
import android.app.Activity
|
||||
import android.content.ClipData
|
||||
import android.content.ClipboardManager
|
||||
import android.content.Context
|
||||
@ -20,11 +21,13 @@ import android.util.Log
|
||||
import android.util.TypedValue
|
||||
import android.view.*
|
||||
import android.view.inputmethod.InputMethodManager
|
||||
import android.webkit.WebView
|
||||
import android.widget.EditText
|
||||
import android.widget.PopupWindow
|
||||
import android.widget.SeekBar
|
||||
import android.widget.TextView
|
||||
import androidx.annotation.ColorRes
|
||||
import androidx.annotation.DrawableRes
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.core.text.HtmlCompat
|
||||
import androidx.fragment.app.Fragment
|
||||
@ -34,6 +37,8 @@ import androidx.lifecycle.Observer
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import androidx.viewbinding.ViewBinding
|
||||
import androidx.viewpager.widget.ViewPager
|
||||
import androidx.webkit.WebSettingsCompat
|
||||
import androidx.webkit.WebViewFeature
|
||||
import com.airbnb.lottie.LottieAnimationView
|
||||
import com.facebook.drawee.view.SimpleDraweeView
|
||||
import com.gh.common.DefaultUrlHandler
|
||||
@ -752,10 +757,11 @@ fun <T> Array<out T>.secondOrNull(): T? {
|
||||
*/
|
||||
fun ExpandTextView.setTextWithInterceptingInternalUrl(
|
||||
shrankText: CharSequence,
|
||||
expandedText: CharSequence
|
||||
expandedText: CharSequence,
|
||||
clickedCallback: (url: String) -> Unit
|
||||
) {
|
||||
var shrankSsb = shrankText.interceptUrlSpanAndRoundImageSpan()
|
||||
var expandedSsb = expandedText.interceptUrlSpanAndRoundImageSpan()
|
||||
var shrankSsb = shrankText.interceptUrlSpanAndRoundImageSpan(clickedCallback)
|
||||
var expandedSsb = expandedText.interceptUrlSpanAndRoundImageSpan(clickedCallback)
|
||||
|
||||
// 去掉旧版本 Android 系统 [Html.FROM_HTML_MODE_LEGACY] 产生的两个换行符 (丑陋的代码)
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
|
||||
@ -830,7 +836,7 @@ fun TextView.setTextWithInterceptingInternalUrl(text: CharSequence) {
|
||||
setText(ssb)
|
||||
}
|
||||
|
||||
fun CharSequence.interceptUrlSpanAndRoundImageSpan(): SpannableStringBuilder {
|
||||
fun CharSequence.interceptUrlSpanAndRoundImageSpan(clickedCallback: ((url: String) -> Unit)? = null): SpannableStringBuilder {
|
||||
return SpannableStringBuilder.valueOf(this).apply {
|
||||
getSpans(0, length, URLSpan::class.java).forEach {
|
||||
setSpan(
|
||||
@ -845,6 +851,7 @@ fun CharSequence.interceptUrlSpanAndRoundImageSpan(): SpannableStringBuilder {
|
||||
}
|
||||
|
||||
override fun onClick(widget: View) {
|
||||
clickedCallback?.invoke(it.url)
|
||||
if (!DefaultUrlHandler.interceptUrl(widget.context, it.url, "")) {
|
||||
widget.context.startActivity(
|
||||
WebActivity.getIntent(
|
||||
@ -879,14 +886,32 @@ fun Int.toColor(): Int {
|
||||
return ContextCompat.getColor(HaloApp.getInstance().application, this)
|
||||
}
|
||||
|
||||
/**
|
||||
* 只能传Activity的context,如果是Application的context会导致切换夜间模式变不了色
|
||||
*/
|
||||
fun Int.toColor(context: Context): Int {
|
||||
return ContextCompat.getColor(context, this)
|
||||
}
|
||||
|
||||
fun Int.toDrawable(): Drawable? {
|
||||
return ContextCompat.getDrawable(HaloApp.getInstance().application, this)
|
||||
}
|
||||
|
||||
/**
|
||||
* 只能传Activity的context,如果是Application的context会导致切换夜间模式变不了色
|
||||
*/
|
||||
fun Int.toDrawable(context: Context): Drawable? {
|
||||
return ContextCompat.getDrawable(context, this)
|
||||
}
|
||||
|
||||
fun Int.toResString(): String {
|
||||
return HaloApp.getInstance().application.resources.getString(this)
|
||||
}
|
||||
|
||||
fun Int.toPx(): Int {
|
||||
return HaloApp.getInstance().application.resources.getDimension(this).toInt()
|
||||
}
|
||||
|
||||
fun Int.toSimpleCount(): String {
|
||||
return NumberUtils.transSimpleCount(this)
|
||||
}
|
||||
@ -905,8 +930,13 @@ fun Long.toProperReadableSize(): String {
|
||||
/**
|
||||
* Image related
|
||||
*/
|
||||
fun SimpleDraweeView.display(url: String) {
|
||||
ImageUtils.display(this, url)
|
||||
fun SimpleDraweeView.display(url: String?, goneIfEmpty: Boolean = false) {
|
||||
if (goneIfEmpty && TextUtils.isEmpty(url)) {
|
||||
visibility = View.GONE
|
||||
} else {
|
||||
ImageUtils.display(this, url)
|
||||
visibility = View.VISIBLE
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1036,6 +1066,13 @@ inline fun rxTimer(interval: Long, crossinline block: (times: Long) -> Unit): Di
|
||||
}
|
||||
}
|
||||
|
||||
inline fun rxTimerWithIoThread(interval: Long, crossinline block: (times: Long) -> Unit): Disposable {
|
||||
return Observable.interval(0, interval, TimeUnit.MILLISECONDS)
|
||||
.subscribe {
|
||||
block.invoke(it)
|
||||
}
|
||||
}
|
||||
|
||||
fun LottieAnimationView.doOnAnimationEnd(action: () -> Unit) {
|
||||
this.addAnimatorListener(object : Animator.AnimatorListener {
|
||||
override fun onAnimationRepeat(animation: Animator?) {
|
||||
@ -1154,6 +1191,20 @@ fun View.getBitmapFromView(): Bitmap? {
|
||||
return bitmap
|
||||
}
|
||||
|
||||
fun View.setRootBackgroundColor(@ColorRes res: Int) {
|
||||
if (this.id == View.NO_ID) {
|
||||
this.id = R.id.root_container
|
||||
}
|
||||
this.setBackgroundColor(res.toColor(this.context))
|
||||
}
|
||||
|
||||
fun View.setRootBackgroundDrawable(@DrawableRes res: Int) {
|
||||
if (this.id == View.NO_ID) {
|
||||
this.id = R.id.root_container
|
||||
}
|
||||
this.background = res.toDrawable(this.context)
|
||||
}
|
||||
|
||||
fun String.hexStringToIntColor(): Int {
|
||||
val colorStr = if (this.length == 9) {
|
||||
"#${this.substring(3)}"
|
||||
@ -1176,4 +1227,25 @@ fun String.lengthOfEmojiHalf(): Int {
|
||||
fun String.emojiCount(): Int {
|
||||
val onlyText = EmojiUtils.removeEmoji(this)
|
||||
return (this.length - onlyText.length) / 2
|
||||
}
|
||||
|
||||
/**
|
||||
* WebView启用强制深色模式
|
||||
*/
|
||||
fun WebView.enableForceDark(nightMode: Boolean) {
|
||||
if (BuildConfig.IS_NIGHT_MODE_ON && WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) {
|
||||
WebSettingsCompat.setForceDark(settings, if (nightMode) WebSettingsCompat.FORCE_DARK_ON else WebSettingsCompat.FORCE_DARK_OFF)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 日夜间模式切换更新状态栏底色
|
||||
*/
|
||||
fun Activity.updateStatusBarColor(@ColorRes nightColor: Int, @ColorRes dayColor: Int) {
|
||||
if (BuildConfig.IS_NIGHT_MODE_ON) {
|
||||
DisplayUtils.setStatusBarColor(
|
||||
this,
|
||||
if (NightModeUtils.isNightMode(this)) nightColor else dayColor
|
||||
)
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,413 @@
|
||||
package com.gh.common.util
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.Context
|
||||
import android.text.TextUtils
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import com.gh.common.DefaultJsApi
|
||||
import com.gh.common.constant.Constants
|
||||
import com.gh.common.dialog.CertificationDialog
|
||||
import com.gh.common.exposure.ExposureEvent
|
||||
import com.gh.common.exposure.ExposureManager
|
||||
import com.gh.common.exposure.ExposureSource
|
||||
import com.gh.common.exposure.ExposureType
|
||||
import com.gh.common.history.HistoryHelper
|
||||
import com.gh.common.repository.ReservationRepository
|
||||
import com.gh.common.runOnUiThread
|
||||
import com.gh.common.view.dsbridge.CompletionHandler
|
||||
import com.gh.download.DownloadManager
|
||||
import com.gh.download.dialog.DownloadDialog
|
||||
import com.gh.gamecenter.R
|
||||
import com.gh.gamecenter.WebActivity
|
||||
import com.gh.gamecenter.entity.ApkEntity
|
||||
import com.gh.gamecenter.entity.GameEntity
|
||||
import com.gh.gamecenter.entity.PluginLocation
|
||||
import com.gh.gamecenter.gamedetail.dialog.GamePermissionDialogFragment
|
||||
import com.gh.gamecenter.manager.UserManager
|
||||
import com.gh.gamecenter.retrofit.EmptyResponse
|
||||
import com.gh.gamecenter.retrofit.Response
|
||||
import com.gh.gamecenter.retrofit.RetrofitManager
|
||||
import com.gh.gamecenter.teenagermode.TeenagerModeActivity
|
||||
import com.gh.gamecenter.user.ApiResponse
|
||||
import com.lightgame.download.FileUtils
|
||||
|
||||
/**
|
||||
* 游戏活动下载辅助类
|
||||
*/
|
||||
object GameActivityDownloadHelper {
|
||||
|
||||
private var mTraceEvent: ExposureEvent? = null
|
||||
private var mGameEntity: GameEntity? = null
|
||||
|
||||
fun start(context: Context, event: DefaultJsApi.GameActivityEvent) {
|
||||
if (mGameEntity != null && mGameEntity?.id == event.gameId) {
|
||||
runOnUiThread {
|
||||
handleGameEntity(context, event, mGameEntity!!)
|
||||
}
|
||||
} else {
|
||||
RetrofitManager.getInstance()
|
||||
.api
|
||||
.getGameDigest(event.gameId)
|
||||
.map(ApkActiveUtils.filterMapper)
|
||||
.compose(observableToMain())
|
||||
.subscribe(object : Response<GameEntity>() {
|
||||
override fun onResponse(gameEntity: GameEntity?) {
|
||||
mGameEntity = gameEntity
|
||||
gameEntity?.let {
|
||||
handleGameEntity(context, event, it)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
private fun handleGameEntity(
|
||||
context: Context,
|
||||
event: DefaultJsApi.GameActivityEvent,
|
||||
gameEntity: GameEntity
|
||||
) {
|
||||
// 青少年模式
|
||||
if (isTeenageMode(context)) return
|
||||
|
||||
val entrance = "(游戏活动[${event.activityTitle}])"
|
||||
val location = "游戏活动:${event.activityTitle}-${gameEntity.name}"
|
||||
if (mTraceEvent == null) {
|
||||
val exposureSources = arrayListOf(
|
||||
ExposureSource("游戏活动", "${event.activityTitle}+${event.activityId}")
|
||||
)
|
||||
mTraceEvent = ExposureEvent.createEvent(gameEntity, exposureSources, null, ExposureType.EXPOSURE)
|
||||
}
|
||||
|
||||
mTraceEvent?.run {
|
||||
when {
|
||||
// 预约
|
||||
gameEntity.isReservable -> reserve(context, gameEntity, entrance, this)
|
||||
// 开始玩
|
||||
gameEntity.getApk().size == 0 && gameEntity.h5Link != null -> play(context, gameEntity)
|
||||
// 下载
|
||||
else -> handleDownload(context, event, gameEntity, entrance, location, this)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 青少年模式
|
||||
private fun isTeenageMode(context: Context): Boolean {
|
||||
if (SPUtils.getBoolean(Constants.SP_TEENAGER_MODE)) {
|
||||
DialogHelper.showDialog(
|
||||
context,
|
||||
"提示",
|
||||
"当前处于儿童/青少年模式, \n暂不提供游戏下载",
|
||||
"退出青少年模式",
|
||||
"关闭",
|
||||
{ context.startActivity(TeenagerModeActivity.getIntent(context)) },
|
||||
{},
|
||||
DialogHelper.Config(
|
||||
centerTitle = true,
|
||||
centerContent = true
|
||||
)
|
||||
)
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// 预约
|
||||
private fun reserve(
|
||||
context: Context,
|
||||
gameEntity: GameEntity,
|
||||
entrance: String,
|
||||
traceEvent: ExposureEvent
|
||||
) {
|
||||
if (!ReservationRepository.thisGameHasBeenReserved(gameEntity.id)) {
|
||||
CheckLoginUtils.checkLogin(context, entrance) {
|
||||
ReservationHelper.reserve(context, gameEntity.id, object : EmptyCallback {
|
||||
override fun onCallback() {
|
||||
LogUtils.logReservation(gameEntity, traceEvent)
|
||||
clear()
|
||||
}
|
||||
})
|
||||
}
|
||||
} else {
|
||||
ToastUtils.toast("游戏已成功预约")
|
||||
}
|
||||
}
|
||||
|
||||
// 开始玩(H5链接)
|
||||
private fun play(context: Context, gameEntity: GameEntity) {
|
||||
val linkEntity = gameEntity.h5Link
|
||||
val isPlay = "play" == linkEntity!!.type // 是否为开始玩
|
||||
if (isPlay) {
|
||||
HistoryHelper.insertGameEntity(gameEntity)
|
||||
}
|
||||
val i = WebActivity.getIntentForWebGame(
|
||||
context,
|
||||
gameEntity.h5Link!!.link,
|
||||
gameEntity.name,
|
||||
isPlay,
|
||||
linkEntity.closeButton
|
||||
)
|
||||
context.startActivity(i)
|
||||
}
|
||||
|
||||
// 下载
|
||||
private fun handleDownload(
|
||||
context: Context,
|
||||
event: DefaultJsApi.GameActivityEvent,
|
||||
gameEntity: GameEntity,
|
||||
entrance: String,
|
||||
location: String,
|
||||
traceEvent: ExposureEvent
|
||||
) {
|
||||
val apk = getApk(gameEntity, event, true) ?: return
|
||||
val downloadEntity = DownloadManager.getInstance().getDownloadEntitySnapshotByUrl(apk.url)
|
||||
if (downloadEntity != null) {
|
||||
ToastUtils.toast("${gameEntity.name}已加入下载队列")
|
||||
} else {
|
||||
val str = GameUtils.getDownloadBtnText(context, gameEntity, PluginLocation.only_game)
|
||||
if (str == context.getString(R.string.download)) {
|
||||
GamePermissionDialogFragment.show((context as AppCompatActivity), gameEntity, gameEntity.info) {
|
||||
CertificationDialog.showCertificationDialog(context, gameEntity) {
|
||||
DialogUtils.checkDownload(context, apk.size) { isSubscribe: Boolean ->
|
||||
download(context, gameEntity, apk, isSubscribe, entrance, location, traceEvent)
|
||||
}
|
||||
}
|
||||
}
|
||||
DataLogUtils.uploadGameLog(context, gameEntity.id, gameEntity.name, entrance)
|
||||
} else if (str == context.getString(R.string.attempt)) {
|
||||
RealNameHelper.checkIfAuth(context, gameEntity, object : EmptyCallback {
|
||||
override fun onCallback() {
|
||||
GamePermissionDialogFragment.show((context as AppCompatActivity), gameEntity, gameEntity.info) {
|
||||
CertificationDialog.showCertificationDialog(context, gameEntity) {
|
||||
DialogUtils.checkDownload(context, apk.size) { isSubscribe: Boolean ->
|
||||
download(context, gameEntity, apk, isSubscribe, entrance, location, traceEvent)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
DataLogUtils.uploadGameLog(context, gameEntity.id, gameEntity.name, entrance)
|
||||
} else if (str.contains("化")) {
|
||||
if (gameEntity.pluggableCollection != null) {
|
||||
DownloadDialog.showDownloadDialog(context, gameEntity, traceEvent, entrance, location)
|
||||
} else {
|
||||
CertificationDialog.showCertificationDialog(context, gameEntity) {
|
||||
DialogUtils.checkDownload(context, apk.size) { isSubscribe: Boolean ->
|
||||
plugin(context, gameEntity, apk, entrance, location, isSubscribe, traceEvent)
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (str == context.getString(R.string.install) || str == context.getString(R.string.launch)) {
|
||||
ToastUtils.toast("${gameEntity.name}已加入下载队列")
|
||||
} else if (str == context.getString(R.string.update)) {
|
||||
DialogUtils.checkDownload(context, apk.size) { isSubscribe: Boolean ->
|
||||
update(context, gameEntity, apk, entrance, location, isSubscribe, traceEvent)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun getApk(
|
||||
gameEntity: GameEntity,
|
||||
event: DefaultJsApi.GameActivityEvent,
|
||||
isRemoveOther: Boolean
|
||||
): ApkEntity? {
|
||||
return when {
|
||||
gameEntity.getApk().isEmpty() -> null
|
||||
|
||||
gameEntity.getApk().size == 1 -> gameEntity.getApk()[0]
|
||||
|
||||
// 找出对应平台版本Apk且移除掉其他平台版本Apk
|
||||
isRemoveOther -> {
|
||||
// 当前游戏为多版本时,只保留活动指定的版本即可,方便之后判断
|
||||
var apk: ApkEntity? = null
|
||||
val iterator = gameEntity.getApk().iterator()
|
||||
while (iterator.hasNext()) {
|
||||
val tempApk = iterator.next()
|
||||
if (tempApk.getPlatform() == event.platform) {
|
||||
apk = tempApk
|
||||
} else {
|
||||
iterator.remove()
|
||||
}
|
||||
}
|
||||
apk
|
||||
}
|
||||
|
||||
// 找出对应平台版本Apk即可
|
||||
else -> {
|
||||
var apk: ApkEntity? = null
|
||||
run outside@{
|
||||
gameEntity.getApk().forEach {
|
||||
if (it.getPlatform() == event.platform) {
|
||||
apk = it
|
||||
return@outside
|
||||
}
|
||||
}
|
||||
}
|
||||
apk
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun download(
|
||||
context: Context,
|
||||
gameEntity: GameEntity,
|
||||
apk: ApkEntity,
|
||||
isSubscribe: Boolean,
|
||||
entrance: String,
|
||||
location: String,
|
||||
traceEvent: ExposureEvent
|
||||
) {
|
||||
val msg = FileUtils.isCanDownload(context, apk.size)
|
||||
if (TextUtils.isEmpty(msg)) {
|
||||
DataUtils.onGameDownloadEvent(context, gameEntity.name, apk.getPlatform(), entrance, "下载开始", "下载")
|
||||
DownloadManager.createDownload(context, apk, gameEntity, context.getString(
|
||||
R.string.download), entrance, location, isSubscribe, traceEvent)
|
||||
ToastUtils.toast("${gameEntity.name}已加入下载队列")
|
||||
} else {
|
||||
ToastUtils.toast(msg)
|
||||
}
|
||||
}
|
||||
|
||||
// 插件化
|
||||
private fun plugin(
|
||||
context: Context,
|
||||
gameEntity: GameEntity,
|
||||
apk: ApkEntity,
|
||||
entrance: String,
|
||||
location: String,
|
||||
isSubscribe: Boolean,
|
||||
traceEvent: ExposureEvent?
|
||||
) {
|
||||
val msg = FileUtils.isCanDownload(context, apk.size)
|
||||
if (TextUtils.isEmpty(msg)) {
|
||||
DataUtils.onGameDownloadEvent(context, gameEntity.name, apk.getPlatform(), entrance, "下载开始", "插件化")
|
||||
DownloadManager.createDownload(context, apk, gameEntity, "插件化", entrance, location, isSubscribe, traceEvent)
|
||||
ToastUtils.toast("${gameEntity.name}已加入下载队列")
|
||||
} else {
|
||||
ToastUtils.toast(msg)
|
||||
}
|
||||
}
|
||||
|
||||
// 更新
|
||||
private fun update(
|
||||
context: Context,
|
||||
gameEntity: GameEntity,
|
||||
apk: ApkEntity,
|
||||
entrance: String,
|
||||
location: String,
|
||||
isSubscribe: Boolean,
|
||||
traceEvent: ExposureEvent?
|
||||
) {
|
||||
DataUtils.onGameUpdateEvent(context, gameEntity.name, apk.getPlatform(), "下载开始")
|
||||
DownloadManager.createDownload(context, apk, gameEntity, "更新", entrance, location, isSubscribe, traceEvent)
|
||||
ToastUtils.toast("${gameEntity.name}已加入下载队列")
|
||||
}
|
||||
|
||||
@SuppressLint("CheckResult")
|
||||
fun postTaskComplete(gameId: String) {
|
||||
val api = RetrofitManager.getInstance().newApi
|
||||
val single = if (UserManager.getInstance().isLoggedIn) {
|
||||
api.postGameActivityTask(gameId)
|
||||
} else {
|
||||
api.postGameActivityTaskForNoLogin(gameId)
|
||||
}
|
||||
single.compose(singleToMain()).subscribe(EmptyResponse())
|
||||
}
|
||||
|
||||
// 判断是否完成任务(预约完成或者已安装且无更新)
|
||||
@SuppressLint("CheckResult")
|
||||
fun checkTaskComplete(
|
||||
context: Context,
|
||||
event: DefaultJsApi.GameActivityEvent,
|
||||
handler: CompletionHandler<Any>
|
||||
) {
|
||||
// 预约完成
|
||||
if (ReservationRepository.thisGameHasBeenReserved(event.gameId)) {
|
||||
postTaskComplete(event.gameId)
|
||||
handler.complete(true)
|
||||
return
|
||||
}
|
||||
|
||||
if (mGameEntity != null && mGameEntity?.id == event.gameId) {
|
||||
handleCheckTaskComplete(context, mGameEntity, event, handler)
|
||||
} else {
|
||||
RetrofitManager.getInstance()
|
||||
.api
|
||||
.getGameDigest(event.gameId)
|
||||
.map(ApkActiveUtils.filterMapper)
|
||||
.compose(observableToMain())
|
||||
.subscribe(object : Response<GameEntity>() {
|
||||
override fun onResponse(gameEntity: GameEntity?) {
|
||||
mGameEntity = gameEntity
|
||||
handleCheckTaskComplete(context, gameEntity, event, handler)
|
||||
}
|
||||
|
||||
override fun onApiFailure(e: ApiResponse<GameEntity>?) {
|
||||
super.onApiFailure(e)
|
||||
handler.complete(false)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
private fun handleCheckTaskComplete(
|
||||
context: Context,
|
||||
gameEntity: GameEntity?,
|
||||
event: DefaultJsApi.GameActivityEvent,
|
||||
handler: CompletionHandler<Any>
|
||||
) {
|
||||
if (gameEntity == null) {
|
||||
handler.complete(false)
|
||||
} else {
|
||||
val apk = getApk(gameEntity, event, false)
|
||||
if (apk == null) {
|
||||
handler.complete(false)
|
||||
} else {
|
||||
// 已安装
|
||||
if (PackageUtils.isInstalled(context, apk.packageName)) {
|
||||
// 是否可更新
|
||||
if (PackageUtils.isCanUpdate(apk, event.gameId)
|
||||
|| PackageUtils.isNonPluginUpdatable(apk, gameEntity)) {
|
||||
handler.complete(false)
|
||||
} else {
|
||||
// 已安装且无更新
|
||||
postTaskComplete(event.gameId)
|
||||
handler.complete(true)
|
||||
}
|
||||
} else {
|
||||
handler.complete(false)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun postExposureEvent(event: DefaultJsApi.GameActivityEvent) {
|
||||
RetrofitManager.getInstance()
|
||||
.api
|
||||
.getGameDigest(event.gameId)
|
||||
.map(ApkActiveUtils.filterMapper)
|
||||
.compose(observableToMain())
|
||||
.subscribe(object : Response<GameEntity>() {
|
||||
override fun onResponse(gameEntity: GameEntity?) {
|
||||
mGameEntity = gameEntity
|
||||
gameEntity?.let {
|
||||
val exposureSources = arrayListOf(
|
||||
ExposureSource("游戏活动", "${event.activityTitle}+${event.activityId}")
|
||||
)
|
||||
mTraceEvent = ExposureEvent.createEvent(
|
||||
gameEntity,
|
||||
exposureSources,
|
||||
null,
|
||||
ExposureType.EXPOSURE
|
||||
)
|
||||
mTraceEvent?.run { ExposureManager.log(this) }
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
fun clear() {
|
||||
mTraceEvent = null
|
||||
mGameEntity = null
|
||||
}
|
||||
}
|
||||
@ -6,6 +6,7 @@ import android.app.Application
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.view.Gravity
|
||||
import android.view.View
|
||||
import android.widget.ImageView
|
||||
import android.widget.ProgressBar
|
||||
import com.gh.base.CurrentActivityHolder
|
||||
@ -105,7 +106,7 @@ object GameCollectionSquareBrowseTaskHelper {
|
||||
HaloApp.getInstance().unregisterActivityLifecycleCallbacks(mActivityLifecycleCallbacks)
|
||||
}
|
||||
|
||||
fun resumeTimeCount() {
|
||||
private fun resumeTimeCount() {
|
||||
if (!mIsBrowseTimeCountEnabled) return
|
||||
|
||||
mIsBrowseTimeCountValid = true
|
||||
@ -113,30 +114,42 @@ object GameCollectionSquareBrowseTaskHelper {
|
||||
mThreadService.execute {
|
||||
while (mIsBrowseTimeCountEnabled && mIsBrowseTimeCountValid) {
|
||||
val topActivity = CurrentActivityHolder.getCurrentActivity() ?: continue
|
||||
if (isGameCollectionSquare(topActivity, false) && mIsFirstEnterSquare) {
|
||||
mIsFirstEnterSquare = false
|
||||
topActivity.intent.putExtra(KEY_IS_FORM_BROWSE_TASK, true)
|
||||
}
|
||||
if (isTopActivityGameCollectionRelated(topActivity)) {
|
||||
tryWithDefaultCatch {
|
||||
showOrUpdateFloatView(topActivity, if (mIsFinished) mBrowseTimeTimeout else mBrowseTimeCount)
|
||||
if (mIsFinished) {
|
||||
disableBrowseTimeCount()
|
||||
} else {
|
||||
mBrowseTimeCount++
|
||||
if (mBrowseTimeCount >= mBrowseTimeTimeout) {
|
||||
showOrUpdateFloatView(topActivity, mBrowseTimeTimeout)
|
||||
postBrowseFinish()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
checkFirstEnterSquare(topActivity)
|
||||
runBrowseTask(topActivity)
|
||||
Thread.sleep(1000)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun pauseTimeCount() {
|
||||
private fun checkFirstEnterSquare(topActivity: Activity) {
|
||||
if (isGameCollectionSquare(topActivity, false) && mIsFirstEnterSquare) {
|
||||
mIsFirstEnterSquare = false
|
||||
topActivity.intent.putExtra(KEY_IS_FORM_BROWSE_TASK, true)
|
||||
}
|
||||
}
|
||||
|
||||
private fun runBrowseTask(topActivity: Activity) {
|
||||
if (isTopActivityGameCollectionRelated(topActivity)) {
|
||||
tryWithDefaultCatch {
|
||||
showOrUpdateFloatView(topActivity, if (mIsFinished) mBrowseTimeTimeout else mBrowseTimeCount)
|
||||
if (mIsFinished) {
|
||||
disableBrowseTimeCount()
|
||||
} else {
|
||||
countBrowseTimeout(topActivity)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun countBrowseTimeout(topActivity: Activity) {
|
||||
mBrowseTimeCount++
|
||||
if (mBrowseTimeCount >= mBrowseTimeTimeout) {
|
||||
showOrUpdateFloatView(topActivity, mBrowseTimeTimeout)
|
||||
postBrowseFinish()
|
||||
}
|
||||
}
|
||||
|
||||
private fun pauseTimeCount() {
|
||||
if (!mIsBrowseTimeCountEnabled) return
|
||||
|
||||
mIsBrowseTimeCountValid = false
|
||||
@ -165,49 +178,61 @@ object GameCollectionSquareBrowseTaskHelper {
|
||||
val isFinished = time == mBrowseTimeTimeout
|
||||
val floatView = EasyFloat.getFloatView(FLOATING_SQUARE_BROWSE_TASK_VIEW)
|
||||
if (floatView != null) {
|
||||
if (mBrowsePro == null) {
|
||||
mBrowsePro = floatView.findViewById(R.id.browsePro)
|
||||
}
|
||||
mBrowsePro?.progress = time
|
||||
if (isFinished) {
|
||||
floatView.findViewById<ImageView>(R.id.browsePic)
|
||||
.setImageResource(R.drawable.pic_browse_square_finish)
|
||||
}
|
||||
updateFloatView(floatView, isFinished, time)
|
||||
} else {
|
||||
EasyFloat.with(activity)
|
||||
.setLayout(R.layout.layout_square_browse_task_float)
|
||||
.setTag(FLOATING_SQUARE_BROWSE_TASK_VIEW)
|
||||
.setAnimator(null)
|
||||
.setGravity(Gravity.END.or(Gravity.CENTER_VERTICAL), 0, 0)
|
||||
.setSidePattern(SidePattern.RIGHT)
|
||||
.setShowPattern(ShowPattern.CURRENT_ACTIVITY)
|
||||
.setDragEnable(false)
|
||||
.registerCallback {
|
||||
createResult { _, _, view ->
|
||||
if (isFinished) {
|
||||
view?.findViewById<ProgressBar>(R.id.browsePro)?.run {
|
||||
max = mBrowseTimeTimeout
|
||||
progress = mBrowseTimeTimeout
|
||||
}
|
||||
view?.findViewById<ImageView>(R.id.browsePic)
|
||||
?.setImageResource(R.drawable.pic_browse_square_finish)
|
||||
} else {
|
||||
view?.findViewById<ProgressBar>(R.id.browsePro)?.run {
|
||||
mBrowsePro = this
|
||||
max = mBrowseTimeTimeout
|
||||
progress = 0
|
||||
}
|
||||
view?.findViewById<ImageView>(R.id.browsePic)
|
||||
?.setImageResource(R.drawable.pic_browse_square)
|
||||
}
|
||||
}
|
||||
}
|
||||
.show()
|
||||
showFloatView(activity, isFinished)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun dismissFloatView() {
|
||||
private fun showFloatView(activity: Activity, isFinished: Boolean) {
|
||||
EasyFloat.with(activity)
|
||||
.setLayout(R.layout.layout_square_browse_task_float)
|
||||
.setTag(FLOATING_SQUARE_BROWSE_TASK_VIEW)
|
||||
.setAnimator(null)
|
||||
.setGravity(Gravity.END.or(Gravity.CENTER_VERTICAL), 0, 0)
|
||||
.setSidePattern(SidePattern.RIGHT)
|
||||
.setShowPattern(ShowPattern.CURRENT_ACTIVITY)
|
||||
.setDragEnable(false)
|
||||
.registerCallback {
|
||||
createResult { _, _, view ->
|
||||
initFloatView(view, isFinished)
|
||||
}
|
||||
}
|
||||
.show()
|
||||
}
|
||||
|
||||
private fun initFloatView(view: View?, isFinished: Boolean) {
|
||||
if (isFinished) {
|
||||
view?.findViewById<ProgressBar>(R.id.browsePro)?.run {
|
||||
max = mBrowseTimeTimeout
|
||||
progress = mBrowseTimeTimeout
|
||||
}
|
||||
view?.findViewById<ImageView>(R.id.browsePic)
|
||||
?.setImageResource(R.drawable.pic_browse_square_finish)
|
||||
} else {
|
||||
view?.findViewById<ProgressBar>(R.id.browsePro)?.run {
|
||||
mBrowsePro = this
|
||||
max = mBrowseTimeTimeout
|
||||
progress = 0
|
||||
}
|
||||
view?.findViewById<ImageView>(R.id.browsePic)
|
||||
?.setImageResource(R.drawable.pic_browse_square)
|
||||
}
|
||||
}
|
||||
|
||||
private fun updateFloatView(floatView: View, isFinished: Boolean, time: Int) {
|
||||
if (mBrowsePro == null) {
|
||||
mBrowsePro = floatView.findViewById(R.id.browsePro)
|
||||
}
|
||||
mBrowsePro?.progress = time
|
||||
if (isFinished) {
|
||||
floatView.findViewById<ImageView>(R.id.browsePic)
|
||||
.setImageResource(R.drawable.pic_browse_square_finish)
|
||||
}
|
||||
}
|
||||
|
||||
private fun dismissFloatView() {
|
||||
EasyFloat.dismiss(FLOATING_SQUARE_BROWSE_TASK_VIEW)
|
||||
}
|
||||
|
||||
|
||||
@ -118,10 +118,9 @@ public class GameUtils {
|
||||
if (PackagesManager.INSTANCE.isCanUpdate(gameEntity.getId(), apkEntity.getPackageName())) {
|
||||
updateCount++;
|
||||
}
|
||||
if (PackagesManager.INSTANCE.isInstalled(apkEntity.getPackageName())) {
|
||||
if (PackagesManager.isInstalled(apkEntity.getPackageName())) {
|
||||
gh_id = PackageUtils.getMetaData(context, apkEntity.getPackageName(), "gh_id");
|
||||
if (gameEntity.getTag() != null && gameEntity.getTag().size() != 0
|
||||
&& !TextUtils.isEmpty(apkEntity.getGhVersion())
|
||||
if (!TextUtils.isEmpty(apkEntity.getGhVersion())
|
||||
&& !PackageUtils.isSignedByGh(context, apkEntity.getPackageName())
|
||||
&& apkEntity.isShowPlugin(pluginLocation)) {
|
||||
pluginCount++;
|
||||
@ -231,7 +230,6 @@ public class GameUtils {
|
||||
gameUpdateEntity.setPlatform(apkEntity.getPlatform());
|
||||
gameUpdateEntity.setEtag(apkEntity.getEtag());
|
||||
gameUpdateEntity.setPluggable(true);
|
||||
gameUpdateEntity.setTag(gameEntity.getTag());
|
||||
gameUpdateEntity.setTagStyle(gameEntity.getTagStyle());
|
||||
gameUpdateEntity.setBrief(gameEntity.getBrief());
|
||||
gameUpdateEntity.setPlugin(apkEntity.getPlugin());
|
||||
|
||||
@ -32,6 +32,7 @@ import com.gh.common.structure.FixedSizeLinkedHashSet
|
||||
import com.gh.gamecenter.R
|
||||
import com.halo.assistant.HaloApp
|
||||
import com.lightgame.utils.Utils
|
||||
import com.squareup.picasso.LruCache
|
||||
import com.squareup.picasso.Picasso
|
||||
import io.reactivex.Single
|
||||
import io.reactivex.android.schedulers.AndroidSchedulers
|
||||
@ -60,6 +61,13 @@ object ImageUtils {
|
||||
)
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
val picasso: Picasso by lazy {
|
||||
// Picasso 的 Lru 缓存改为 5M,默认设定是 1/7 的 heap 大小,太大了
|
||||
// https://stackoverflow.com/a/20105828/4812571
|
||||
Picasso.Builder(HaloApp.getInstance()).memoryCache(LruCache(5 * 1024 * 1024)).build()
|
||||
}
|
||||
|
||||
/**
|
||||
* 禁用动图,全局设置
|
||||
*/
|
||||
@ -393,9 +401,10 @@ object ImageUtils {
|
||||
view: SimpleDraweeView?,
|
||||
url: String?,
|
||||
isAutoPlayGif: Boolean = true,
|
||||
processor: Postprocessor? = null
|
||||
processor: Postprocessor? = null,
|
||||
isIgnoreWidth: Boolean = false
|
||||
) {
|
||||
displayInternal(view, url, isAutoPlayGif, processor)
|
||||
displayInternal(view, url, isAutoPlayGif, processor, isIgnoreWidth)
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
@ -403,7 +412,8 @@ object ImageUtils {
|
||||
view: SimpleDraweeView?,
|
||||
url: String?,
|
||||
isAutoPlayGif: Boolean = true,
|
||||
processor: Postprocessor? = null
|
||||
processor: Postprocessor? = null,
|
||||
isIgnoreWidth: Boolean = false
|
||||
) {
|
||||
mImageDecorationThread.execute {
|
||||
if (url.isNullOrEmpty()) return@execute
|
||||
@ -414,6 +424,10 @@ object ImageUtils {
|
||||
val height = view?.layoutParams?.height
|
||||
val shouldNotSaveMemoryCache = view?.getTag(TAG_NO_MEMORY_CACHE) == true
|
||||
|
||||
if (view != null && width == 0 && !isIgnoreWidth) {
|
||||
AsyncImageLoader.getInstance().addAsyncImage(view, url, isAutoPlayGif, processor)
|
||||
return@execute
|
||||
}
|
||||
var lowResUrl = ""
|
||||
var highResUrl = ""
|
||||
|
||||
@ -471,12 +485,12 @@ object ImageUtils {
|
||||
loadImageClosure(shouldLoadAsGif, highResUrl, lowResUrl)
|
||||
} else {
|
||||
if (width != null && width > 0) {
|
||||
highResUrl = resizeGif(url, view!!.width, height ?: 0)
|
||||
highResUrl = resizeGif(url, width, height ?: 0)
|
||||
loadImageClosure(shouldLoadAsGif, highResUrl, lowResUrl)
|
||||
} else {
|
||||
runOnUiThread {
|
||||
view ?: return@runOnUiThread
|
||||
highResUrl = resizeGif(url, view.width, height ?: 0)
|
||||
highResUrl = resizeGif(url, width ?: view.width, height ?: 0)
|
||||
loadImageClosure(shouldLoadAsGif, highResUrl, lowResUrl)
|
||||
}
|
||||
}
|
||||
|
||||
@ -58,7 +58,7 @@ public class IntentUtils {
|
||||
"\n" +
|
||||
"光环助手官网地址:\n" +
|
||||
"\n" +
|
||||
"http://www.ghzs.com/link?source=appshare333");
|
||||
"https://www.ghzs.com/link?source=appshare333");
|
||||
return data;
|
||||
}
|
||||
|
||||
|
||||
@ -8,6 +8,7 @@ import android.text.Html;
|
||||
import android.text.Spanned;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import android.widget.Button;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.core.content.ContextCompat;
|
||||
@ -170,8 +171,8 @@ public class LibaoUtils {
|
||||
break;
|
||||
case "coming":
|
||||
libaoBtn.setText(R.string.libao_coming);
|
||||
libaoBtn.setBackgroundResource(R.drawable.button_normal_round_border);
|
||||
libaoBtn.setTextColor(context.getResources().getColor(R.color.theme_font));
|
||||
libaoBtn.setBackgroundResource(R.drawable.bg_shape_f5_radius_999);
|
||||
libaoBtn.setTextColor(context.getResources().getColor(R.color.text_subtitleDesc));
|
||||
break;
|
||||
case "used_up":
|
||||
libaoBtn.setText(R.string.libao_used_up);
|
||||
@ -185,8 +186,8 @@ public class LibaoUtils {
|
||||
break;
|
||||
case "linged":
|
||||
libaoBtn.setText(R.string.libao_linged);
|
||||
libaoBtn.setBackgroundResource(R.drawable.button_border_round_gray);
|
||||
libaoBtn.setTextColor(context.getResources().getColor(R.color.button_gray));
|
||||
libaoBtn.setBackgroundResource(R.drawable.bg_shape_f5_radius_999);
|
||||
libaoBtn.setTextColor(context.getResources().getColor(R.color.text_subtitleDesc));
|
||||
break;
|
||||
case "taoed":
|
||||
libaoBtn.setText(R.string.libao_taoed);
|
||||
|
||||
@ -22,8 +22,6 @@ import com.tencent.tauth.Tencent
|
||||
import com.tencent.tauth.UiError
|
||||
import org.json.JSONException
|
||||
import org.json.JSONObject
|
||||
import java.lang.ref.WeakReference
|
||||
|
||||
|
||||
/**
|
||||
* 第三方登录辅助类
|
||||
@ -42,7 +40,7 @@ object LoginHelper {
|
||||
private var mQqLoginListener: IUiListener
|
||||
|
||||
private var mAccessToken: Oauth2AccessToken? = null // weibo
|
||||
private var mLoginCallback: WeakReference<LoginCallback>? = null
|
||||
private var mLoginCallback: LoginCallback? = null
|
||||
|
||||
init {
|
||||
val context = HaloApp.getInstance().application.applicationContext
|
||||
@ -70,11 +68,11 @@ object LoginHelper {
|
||||
)
|
||||
content.put("access_token", o.getString("access_token"))
|
||||
|
||||
mLoginCallback?.get()?.onLoginSuccess(LoginTag.qq, content) // 回调QQ登录成功
|
||||
mLoginCallback?.onLoginSuccess(LoginTag.qq, content) // 回调QQ登录成功
|
||||
} catch (e: JSONException) {
|
||||
val errorString = "QQ登录数据回调异常::$e"
|
||||
|
||||
mLoginCallback?.get()?.onLoginFailure(LoginTag.qq, errorString) // 回调QQ登录失败
|
||||
mLoginCallback?.onLoginFailure(LoginTag.qq, errorString) // 回调QQ登录失败
|
||||
|
||||
Utils.log(errorString)
|
||||
e.printStackTrace()
|
||||
@ -83,7 +81,7 @@ object LoginHelper {
|
||||
}
|
||||
|
||||
override fun onCancel() {
|
||||
mLoginCallback?.get()?.onLoginFailure(LoginTag.qq, "登录取消")
|
||||
mLoginCallback?.onLoginFailure(LoginTag.qq, "登录取消")
|
||||
Utils.log("QQ 登录取消")
|
||||
}
|
||||
|
||||
@ -92,7 +90,7 @@ object LoginHelper {
|
||||
}
|
||||
|
||||
override fun onError(p0: UiError?) {
|
||||
mLoginCallback?.get()?.onLoginFailure(LoginTag.qq, "登录失败")
|
||||
mLoginCallback?.onLoginFailure(LoginTag.qq, "登录失败")
|
||||
Utils.log("QQ 登录失败")
|
||||
}
|
||||
}
|
||||
@ -110,22 +108,22 @@ object LoginHelper {
|
||||
|
||||
@JvmStatic
|
||||
fun onWechatLoginSuccess(content: JSONObject) {
|
||||
mLoginCallback?.get()?.onLoginSuccess(LoginTag.wechat, content)
|
||||
mLoginCallback?.onLoginSuccess(LoginTag.wechat, content)
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun onWechatLoginFailure(error: String) {
|
||||
mLoginCallback?.get()?.onLoginFailure(LoginTag.wechat, error)
|
||||
mLoginCallback?.onLoginFailure(LoginTag.wechat, error)
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun onDouYinLoginSuccess(content: JSONObject) {
|
||||
mLoginCallback?.get()?.onLoginSuccess(LoginTag.douyin, content)
|
||||
mLoginCallback?.onLoginSuccess(LoginTag.douyin, content)
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun onDouYinLoginFailure(error: String) {
|
||||
mLoginCallback?.get()?.onLoginFailure(LoginTag.douyin, error)
|
||||
mLoginCallback?.onLoginFailure(LoginTag.douyin, error)
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
@ -136,7 +134,7 @@ object LoginHelper {
|
||||
// QQ登录
|
||||
@JvmStatic
|
||||
fun loginWithQQ(loginCallback: LoginCallback, activity: Activity) {
|
||||
mLoginCallback = WeakReference(loginCallback)
|
||||
mLoginCallback = loginCallback
|
||||
if (!mTencent.isSessionValid) {
|
||||
Utils.log("QQLogin")
|
||||
mTencent.login(activity, "all", mQqLoginListener)
|
||||
@ -153,7 +151,7 @@ object LoginHelper {
|
||||
// 微信登录
|
||||
@JvmStatic
|
||||
fun loginWithWechat(loginCallback: LoginCallback) {
|
||||
mLoginCallback = WeakReference(loginCallback)
|
||||
mLoginCallback = loginCallback
|
||||
val register = mIWXAPI.registerApp(Config.WECHAT_APPID)
|
||||
|
||||
val req = SendAuth.Req()
|
||||
@ -180,7 +178,7 @@ object LoginHelper {
|
||||
}
|
||||
|
||||
mWBAPI = WBAPIFactory.createWBAPI(context) //初始化微博分享
|
||||
mLoginCallback = WeakReference(loginCallback)
|
||||
mLoginCallback = loginCallback
|
||||
mWBAPI.registerApp(
|
||||
context,
|
||||
AuthInfo(context, Config.WEIBO_APPKEY, "http://www.sina.com", WEIBO_SCOPE)
|
||||
@ -208,19 +206,18 @@ object LoginHelper {
|
||||
)
|
||||
content.put("refresh_token", token.refreshToken)
|
||||
// content.put("refresh_token_expire", Utils.getTime(mContext) + 86400 * 30); // refresh_token 有效期30天
|
||||
mLoginCallback?.get()?.onLoginSuccess(LoginTag.weibo, content)// 微博 登录回调
|
||||
mLoginCallback?.onLoginSuccess(LoginTag.weibo, content)// 微博 登录回调
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun onError(error: com.sina.weibo.sdk.common.UiError?) {
|
||||
mLoginCallback?.get()?.onLoginFailure(LoginTag.weibo, "微博登录需要客户端支持,请先安装微博")
|
||||
mLoginCallback?.onLoginFailure(LoginTag.weibo, "微博登录需要客户端支持,请先安装微博")
|
||||
}
|
||||
|
||||
override fun onCancel() {
|
||||
mLoginCallback?.get()?.onLoginFailure(LoginTag.weibo, "取消授权")
|
||||
mLoginCallback?.onLoginFailure(LoginTag.weibo, "取消授权")
|
||||
}
|
||||
|
||||
})
|
||||
|
||||
// 第一次启动本应用,AccessToken 不可用
|
||||
@ -240,6 +237,14 @@ object LoginHelper {
|
||||
// douYinOpenApi.authorize(request)
|
||||
}
|
||||
|
||||
/**
|
||||
* 移除登录 callback 引用,避免内存泄漏
|
||||
*/
|
||||
@JvmStatic
|
||||
fun unregisterCallback() {
|
||||
mLoginCallback = null
|
||||
}
|
||||
|
||||
interface LoginCallback {
|
||||
fun onLoginSuccess(loginType: LoginTag, jsonContent: JSONObject)
|
||||
|
||||
|
||||
@ -20,6 +20,7 @@ public class NetworkUtils {
|
||||
*/
|
||||
public static boolean isNetworkConnected(Context context) {
|
||||
if (context != null) {
|
||||
context = context.getApplicationContext();
|
||||
ConnectivityManager mConnectivityManager = (ConnectivityManager) context
|
||||
.getSystemService(Context.CONNECTIVITY_SERVICE);
|
||||
NetworkInfo mNetworkInfo = mConnectivityManager
|
||||
@ -39,6 +40,7 @@ public class NetworkUtils {
|
||||
*/
|
||||
public static boolean isWifiConnected(Context context) {
|
||||
if (context != null) {
|
||||
context = context.getApplicationContext();
|
||||
ConnectivityManager mConnectivityManager = (ConnectivityManager) context
|
||||
.getSystemService(Context.CONNECTIVITY_SERVICE);
|
||||
NetworkInfo mWiFiNetworkInfo = mConnectivityManager
|
||||
@ -108,6 +110,7 @@ public class NetworkUtils {
|
||||
*/
|
||||
public static String getConnectedType(Context context) {
|
||||
if (context != null) {
|
||||
context = context.getApplicationContext();
|
||||
ConnectivityManager mConnectivityManager = (ConnectivityManager) context
|
||||
.getSystemService(Context.CONNECTIVITY_SERVICE);
|
||||
NetworkInfo mNetworkInfo = mConnectivityManager
|
||||
|
||||
@ -5,6 +5,7 @@ import com.gh.common.json.JsonObjectBuilder
|
||||
import com.gh.common.json.json
|
||||
import com.gh.common.loghub.LoghubUtils
|
||||
import com.gh.common.tracker.Tracker
|
||||
import com.gh.gamecenter.entity.AdditionalParamsEntity
|
||||
import com.gh.gamecenter.entity.LinkEntity
|
||||
import com.gh.gamecenter.entity.QuoteCountEntity
|
||||
import com.gh.gamecenter.entity.WechatConfigEntity
|
||||
@ -50,15 +51,17 @@ object NewLogUtils {
|
||||
}
|
||||
|
||||
@SuppressLint("CheckResult")
|
||||
fun logForumContentBrowser(contentId: String, contentType: String) {
|
||||
val requestBody = hashMapOf(
|
||||
Pair("content_id", contentId),
|
||||
Pair("content_type", contentType)
|
||||
).createRequestBody()
|
||||
fun logForumContentBrowser(contentId: String, contentType: String, recommendId: String) {
|
||||
val requestMap = hashMapOf<String, Any>()
|
||||
requestMap["content_id"] = contentId
|
||||
requestMap["content_type"] = contentType
|
||||
if (recommendId.isNotBlank()) {
|
||||
requestMap["recommend_id"] = recommendId
|
||||
}
|
||||
|
||||
RetrofitManager.getInstance()
|
||||
.api
|
||||
.postBrowses(requestBody)
|
||||
.postBrowses(requestMap.toRequestBody())
|
||||
.subscribeOn(Schedulers.io())
|
||||
.subscribe(EmptyResponse<ResponseBody>())
|
||||
}
|
||||
@ -569,12 +572,21 @@ object NewLogUtils {
|
||||
|
||||
//分享结果
|
||||
@JvmStatic
|
||||
fun logShareResult(shareResult: Boolean) {
|
||||
fun logShareResult(additionalParams: AdditionalParamsEntity? = null, shareResult: Boolean) {
|
||||
val json = json {
|
||||
"location" to "分享面板"
|
||||
"event" to "share_result"
|
||||
"meta" to LogUtils.getMetaObject()
|
||||
"share_success" to shareResult
|
||||
|
||||
additionalParams?.let {
|
||||
"content_type" to it.contentType
|
||||
"content_id" to it.contentId
|
||||
"bbs_id" to it.bbsId
|
||||
"bbs_type" to it.bbsType
|
||||
"ref_user_id" to it.refUserId
|
||||
}
|
||||
|
||||
"launch_id" to Tracker.launchId
|
||||
"session_id" to Tracker.sessionId
|
||||
"timestamp" to System.currentTimeMillis() / 1000
|
||||
@ -1781,6 +1793,29 @@ object NewLogUtils {
|
||||
log(json, "event", false)
|
||||
}
|
||||
|
||||
// 自定义栏目点击跳转
|
||||
fun logCustomColumnClicked(
|
||||
gameId: String?,
|
||||
gameName: String?,
|
||||
title: String?,
|
||||
entrance: String?,
|
||||
linkType: String?,
|
||||
linkTitle: String?
|
||||
) {
|
||||
val json = json {
|
||||
"event" to "custom_column_jump"
|
||||
"title" to title
|
||||
"game_id" to gameId
|
||||
"game_name" to gameName
|
||||
"link_type" to linkType
|
||||
"link_title" to linkTitle
|
||||
"entrance" to entrance
|
||||
"timestamp" to System.currentTimeMillis() / 1000
|
||||
parseAndPutMeta().invoke(this)
|
||||
}
|
||||
log(json, "event", false)
|
||||
}
|
||||
|
||||
//成功预约游戏
|
||||
@JvmStatic
|
||||
fun logReserveGameSuccess(wechatConfigEntity: WechatConfigEntity) {
|
||||
@ -1848,4 +1883,39 @@ object NewLogUtils {
|
||||
}
|
||||
log(json, "appointment", false)
|
||||
}
|
||||
|
||||
//选择图片上传方式
|
||||
@JvmStatic
|
||||
fun logShowGameCollectionCoverTypeDialog() {
|
||||
val json = json {
|
||||
"event" to "dialog_game_collect_chose_picture"
|
||||
"timestamp" to System.currentTimeMillis() / 1000
|
||||
parseAndPutMeta().invoke(this)
|
||||
}
|
||||
log(json, "event", false)
|
||||
}
|
||||
|
||||
//选择图片上传方式点击
|
||||
@JvmStatic
|
||||
fun logClickGameCollectionChooseCoverDialog(action: String) {
|
||||
val json = json {
|
||||
"event" to "click_dialog_game_collect_chose_picture"
|
||||
"action" to action
|
||||
"timestamp" to System.currentTimeMillis() / 1000
|
||||
parseAndPutMeta().invoke(this)
|
||||
}
|
||||
log(json, "event", false)
|
||||
}
|
||||
|
||||
//默认封面点击事件
|
||||
@JvmStatic
|
||||
fun logClickGameCollectionDefaultCoverDialog(action: String) {
|
||||
val json = json {
|
||||
"event" to "click_dialog_game_collect_chose_default_picture"
|
||||
"action" to action
|
||||
"timestamp" to System.currentTimeMillis() / 1000
|
||||
parseAndPutMeta().invoke(this)
|
||||
}
|
||||
log(json, "event", false)
|
||||
}
|
||||
}
|
||||
61
app/src/main/java/com/gh/common/util/NightModeUtils.kt
Normal file
61
app/src/main/java/com/gh/common/util/NightModeUtils.kt
Normal file
@ -0,0 +1,61 @@
|
||||
package com.gh.common.util
|
||||
|
||||
import android.content.Context
|
||||
import android.content.res.Configuration
|
||||
import androidx.appcompat.app.AppCompatDelegate
|
||||
import com.gh.common.constant.Constants
|
||||
import com.gh.gamecenter.BuildConfig
|
||||
|
||||
object NightModeUtils {
|
||||
/**
|
||||
* 当前系统是否是深色模式
|
||||
*/
|
||||
fun isNightMode(context: Context): Boolean {
|
||||
// 仅配置开启的包才提供夜间模式功能
|
||||
return if (BuildConfig.IS_NIGHT_MODE_ON) {
|
||||
val uiMode = context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK
|
||||
uiMode == Configuration.UI_MODE_NIGHT_YES
|
||||
} else {
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取是否跟随系统,默认true
|
||||
*/
|
||||
fun getSystemMode() = SPUtils.getBoolean(Constants.SP_SYSTEM_MODE, true)
|
||||
|
||||
fun setSystemMode(nightMode: Boolean) = SPUtils.setBoolean(Constants.SP_SYSTEM_MODE, nightMode)
|
||||
|
||||
/**
|
||||
* 获取是否设置深色模式,默认false
|
||||
*/
|
||||
fun getNightMode() = SPUtils.getBoolean(Constants.SP_NIGHT_MODE, false)
|
||||
|
||||
fun setNightMode(nightMode: Boolean) = SPUtils.setBoolean(Constants.SP_NIGHT_MODE, nightMode)
|
||||
|
||||
fun initNightMode() {
|
||||
initNightMode(getSystemMode(), getNightMode())
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化App深色模式
|
||||
*
|
||||
* @param systemMode 是否是跟随系统
|
||||
* @param nightMode 是否是深色模式
|
||||
*/
|
||||
fun initNightMode(systemMode: Boolean, nightMode: Boolean) {
|
||||
// 仅配置开启的包才提供夜间模式功能
|
||||
if (BuildConfig.IS_NIGHT_MODE_ON) {
|
||||
if (systemMode) {
|
||||
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
|
||||
} else {
|
||||
if (nightMode) {
|
||||
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
|
||||
} else {
|
||||
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,6 +1,7 @@
|
||||
package com.gh.common.util
|
||||
|
||||
import java.text.DecimalFormat
|
||||
import kotlin.math.roundToInt
|
||||
|
||||
object NumberUtils {
|
||||
|
||||
@ -45,8 +46,8 @@ object NumberUtils {
|
||||
fun transSimpleUsageTime(second: Long): String {
|
||||
val totalMinute = second / 60
|
||||
if (totalMinute < 60) return ((if (totalMinute == 0L) 1 else totalMinute).toString() + "分钟")
|
||||
val hour = Math.round((totalMinute / 60).toFloat())
|
||||
val minute = Math.round((totalMinute - hour * 60).toFloat())
|
||||
val hour = (totalMinute / 60).toFloat().roundToInt()
|
||||
val minute = (totalMinute - hour * 60).toFloat().roundToInt()
|
||||
return hour.toString() + "小时" + if (minute == 0) "" else minute.toString() + "分钟"
|
||||
}
|
||||
|
||||
|
||||
@ -15,7 +15,7 @@ object OptionDialogHelper {
|
||||
val dialog = Dialog(context)
|
||||
val container = LinearLayout(context)
|
||||
container.orientation = LinearLayout.VERTICAL
|
||||
container.setBackgroundColor(Color.WHITE)
|
||||
container.setBackgroundColor(R.color.background_white.toColor(context))
|
||||
container.setPadding(0, DisplayUtils.dip2px(context, 12f), 0, DisplayUtils.dip2px(context, 12f))
|
||||
|
||||
for (type in typeList) {
|
||||
|
||||
@ -53,15 +53,23 @@ object PackageInstaller {
|
||||
// TODO 此处可能遇到 activity 是 WXEntryActivity
|
||||
// TODO 当 activity 全部出栈,但是应用还在下载游戏,下载完会唤不起安装!
|
||||
if (currentActivity is AppCompatActivity && !currentActivity.isFinishing) {
|
||||
InstallPermissionDialogFragment.show(currentActivity, downloadEntity) {
|
||||
InstallPermissionDialogFragment.show(currentActivity, downloadEntity) { isFromPermissionGrantedCallback ->
|
||||
// 取消状态栏下载完成的通知,若存在
|
||||
downloadEntity.meta[Constants.MARK_ALREADY_TRIGGERED_INSTALLATION] = "YES"
|
||||
DownloadNotificationHelper.addOrUpdateDownloadNotification(downloadEntity)
|
||||
|
||||
if (isXapk) {
|
||||
XapkInstaller.install(context, downloadEntity, showUnzipToast)
|
||||
if (isFromPermissionGrantedCallback && Build.VERSION.SDK_INT >= 31) {
|
||||
val pm = context.packageManager
|
||||
val intent = pm.getLaunchIntentForPackage(context.packageName)
|
||||
val mainIntent = Intent.makeRestartActivityTask(intent!!.component)
|
||||
context.startActivity(mainIntent)
|
||||
Runtime.getRuntime().exit(0)
|
||||
} else {
|
||||
install(context, downloadEntity.isPlugin, downloadEntity.path)
|
||||
if (isXapk) {
|
||||
XapkInstaller.install(context, downloadEntity, showUnzipToast)
|
||||
} else {
|
||||
install(context, downloadEntity.isPlugin, downloadEntity.path)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -82,7 +82,6 @@ public class PackageUtils {
|
||||
updateEntity.setPlatform(apkEntity.getPlatform());
|
||||
updateEntity.setEtag(apkEntity.getEtag());
|
||||
updateEntity.setBrief(gameEntity.getBrief());
|
||||
updateEntity.setTag(gameEntity.getTag());
|
||||
updateEntity.setTagStyle(gameEntity.getTagStyle());
|
||||
updateEntity.setDownload(gameEntity.getDownload());
|
||||
updateEntity.setIndexPlugin(gameEntity.getIndexPlugin());
|
||||
@ -131,7 +130,6 @@ public class PackageUtils {
|
||||
updateEntity.setPlatform(apkEntity.getPlatform());
|
||||
updateEntity.setEtag(apkEntity.getEtag());
|
||||
updateEntity.setBrief(gameEntity.getBrief());
|
||||
updateEntity.setTag(gameEntity.getTag());
|
||||
updateEntity.setTagStyle(gameEntity.getTagStyle());
|
||||
updateEntity.setIndexPlugin(gameEntity.getIndexPlugin());
|
||||
updateEntity.setPluginDesc(gameEntity.getPluginDesc());
|
||||
@ -411,10 +409,15 @@ public class PackageUtils {
|
||||
}
|
||||
|
||||
PackageManager packageManager = context.getApplicationContext().getPackageManager();
|
||||
PackageInfo info = packageManager.getPackageArchiveInfo(path, 0);
|
||||
if (info != null) {
|
||||
ApplicationInfo appInfo = info.applicationInfo;
|
||||
return appInfo.packageName;
|
||||
try {
|
||||
PackageInfo info = packageManager.getPackageArchiveInfo(path, 0);
|
||||
if (info != null) {
|
||||
ApplicationInfo appInfo = info.applicationInfo;
|
||||
return appInfo.packageName;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
SentryHelper.INSTANCE.onEvent("GET_PACKAGE_INFO_ERROR", "path", path);
|
||||
}
|
||||
|
||||
return null;
|
||||
@ -736,7 +739,6 @@ public class PackageUtils {
|
||||
updateEntity.setPlatform(apkEntity.getPlatform());
|
||||
updateEntity.setEtag(apkEntity.getEtag());
|
||||
updateEntity.setBrief(gameEntity.getBrief());
|
||||
updateEntity.setTag(gameEntity.getTag());
|
||||
updateEntity.setTagStyle(gameEntity.getTagStyle());
|
||||
updateEntity.setIndexPlugin(gameEntity.getIndexPlugin());
|
||||
updateEntity.setPluginDesc(gameEntity.getPluginDesc());
|
||||
|
||||
@ -34,7 +34,7 @@ public class PicassoImageGetter implements Html.ImageGetter {
|
||||
BitmapDrawablePlaceHolder drawable = new BitmapDrawablePlaceHolder();
|
||||
|
||||
Context context = HaloApp.getInstance().getApplication();
|
||||
Picasso.with(context)
|
||||
ImageUtils.getPicasso()
|
||||
.load(source)
|
||||
.transform(new CircleTransformation())
|
||||
.placeholder(ResourcesCompat.getDrawable(context.getResources(), R.drawable.personal_user_default_icon, context
|
||||
|
||||
@ -151,6 +151,43 @@ public class PostCommentUtils {
|
||||
});
|
||||
}
|
||||
|
||||
public static void unLikeComment(
|
||||
String articleId,
|
||||
String articleCommunityId,
|
||||
String videoId,
|
||||
String questionId,
|
||||
final String commentId,
|
||||
final PostCommentListener listener) {
|
||||
Observable<ResponseBody> observable;
|
||||
|
||||
if (!TextUtils.isEmpty(questionId)) {
|
||||
observable = RetrofitManager.getInstance().getApi().postUnVoteQuestionComment(questionId, commentId);
|
||||
} else if (!TextUtils.isEmpty(articleCommunityId) && !TextUtils.isEmpty(articleId)) {
|
||||
observable = RetrofitManager.getInstance().getApi().postUnVoteArticleComment(articleCommunityId, articleId, commentId);
|
||||
} else {
|
||||
observable = RetrofitManager.getInstance().getApi().postUnVoteVideoComment(videoId, commentId);
|
||||
}
|
||||
observable
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(new Response<ResponseBody>() {
|
||||
@Override
|
||||
public void onResponse(ResponseBody response) {
|
||||
if (listener != null) {
|
||||
listener.postSuccess(null);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(HttpException e) {
|
||||
if (listener != null) {
|
||||
listener.postFailed(e);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
public static void addCommentVote(final String commentId,
|
||||
final PostCommentListener listener) {
|
||||
RetrofitManager.getInstance().getApi()
|
||||
@ -260,10 +297,11 @@ public class PostCommentUtils {
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public static void reportQuestionComment(final String questionId,
|
||||
final String commentId,
|
||||
final String reportData,
|
||||
final PostCommentListener listener) {
|
||||
final String commentId,
|
||||
final String reportData,
|
||||
final PostCommentListener listener) {
|
||||
RequestBody body = RequestBody.create(MediaType.parse("application/json"), reportData);
|
||||
RetrofitManager.getInstance().getApi()
|
||||
.postQuestionCommentReport(questionId, commentId, body)
|
||||
|
||||
@ -2,6 +2,7 @@ package com.gh.common.util
|
||||
|
||||
import android.Manifest
|
||||
import android.annotation.SuppressLint
|
||||
import android.app.Activity
|
||||
import android.app.Dialog
|
||||
import android.content.Context
|
||||
import android.content.pm.PackageManager
|
||||
@ -16,6 +17,7 @@ import com.cmic.sso.sdk.auth.LoginClickListener
|
||||
import com.cmic.sso.sdk.auth.TokenListener
|
||||
import com.gh.common.constant.Config
|
||||
import com.gh.common.constant.Constants
|
||||
import com.gh.common.runOnUiThread
|
||||
import com.gh.common.util.PermissionHelper.checkReadPhoneStatePermissionBeforeAction
|
||||
import com.gh.common.util.ToastUtils.toast
|
||||
import com.gh.gamecenter.LoginActivity
|
||||
@ -29,7 +31,6 @@ import com.gh.gamecenter.user.UserRepository
|
||||
import com.lightgame.utils.AppManager
|
||||
import com.lightgame.utils.Utils
|
||||
import org.json.JSONObject
|
||||
import java.util.*
|
||||
|
||||
/**
|
||||
* 一键登录辅助类
|
||||
@ -163,14 +164,18 @@ object QuickLoginHelper {
|
||||
}
|
||||
|
||||
private fun loginAuth(context: Context) {
|
||||
mPreDialog = Dialog(context, R.style.DialogWindowTransparent).apply {
|
||||
val binding = SetWaitDialogBinding.inflate(LayoutInflater.from(context)).apply {
|
||||
setWaitMessage.text = "请求登录中"
|
||||
runOnUiThread {
|
||||
val dialogContext = DialogUtils.checkDialogContext(context)
|
||||
if (dialogContext is Activity && dialogContext.isFinishing) return@runOnUiThread
|
||||
mPreDialog = Dialog(dialogContext, R.style.DialogWindowTransparent).apply {
|
||||
val binding = SetWaitDialogBinding.inflate(LayoutInflater.from(dialogContext)).apply {
|
||||
setWaitMessage.text = "请求登录中"
|
||||
}
|
||||
requestWindowFeature(Window.FEATURE_NO_TITLE)
|
||||
setContentView(binding.root)
|
||||
setCanceledOnTouchOutside(false)
|
||||
show()
|
||||
}
|
||||
requestWindowFeature(Window.FEATURE_NO_TITLE)
|
||||
setContentView(binding.root)
|
||||
setCanceledOnTouchOutside(false)
|
||||
show()
|
||||
}
|
||||
// 2.授权请求
|
||||
mAuthnHelper?.loginAuth(Config.QUICK_LOGIN_APPID, Config.QUICK_LOGIN_APPKEY, mTokenListener, REQUEST_LOGIN_AUTH_CODE)
|
||||
|
||||
@ -28,6 +28,7 @@ import androidx.recyclerview.widget.RecyclerView;
|
||||
import com.gh.common.constant.Config;
|
||||
import com.gh.gamecenter.R;
|
||||
import com.gh.gamecenter.WeiBoShareActivity;
|
||||
import com.gh.gamecenter.entity.AdditionalParamsEntity;
|
||||
import com.gh.gamecenter.entity.ShareEntity;
|
||||
import com.gh.gamecenter.eventbus.EBShare;
|
||||
import com.lightgame.utils.Utils;
|
||||
@ -129,6 +130,7 @@ public class ShareUtils {
|
||||
public static String resourceId = "";//分享内容的id(事件上报用)
|
||||
public static ShareEntity shareEntity;//分享信息(事件上报用)
|
||||
private static ShareType mShareType;//分享类型(事件上报用)
|
||||
public static AdditionalParamsEntity additionalParams;//附加参数(事件上报用)
|
||||
|
||||
private WeakReference<Activity> mActivity;
|
||||
|
||||
@ -148,7 +150,7 @@ public class ShareUtils {
|
||||
if (ShareUtils.shareEntrance == ShareUtils.ShareEntrance.askNormal ||
|
||||
ShareUtils.shareEntrance == ShareEntrance.communityArticle ||
|
||||
ShareUtils.shareEntrance == ShareUtils.ShareEntrance.video) {
|
||||
NewLogUtils.logShareResult(true);
|
||||
NewLogUtils.logShareResult(ShareUtils.additionalParams, true);
|
||||
} else if (ShareUtils.shareEntrance == ShareEntrance.gameCollection) {
|
||||
String shareType;
|
||||
if (mShareType == ShareType.qq) {
|
||||
@ -176,7 +178,7 @@ public class ShareUtils {
|
||||
if (ShareUtils.shareEntrance == ShareUtils.ShareEntrance.askNormal ||
|
||||
ShareUtils.shareEntrance == ShareEntrance.communityArticle ||
|
||||
ShareUtils.shareEntrance == ShareUtils.ShareEntrance.video) {
|
||||
NewLogUtils.logShareResult(false);
|
||||
NewLogUtils.logShareResult(ShareUtils.additionalParams, false);
|
||||
}
|
||||
}
|
||||
|
||||
@ -191,7 +193,7 @@ public class ShareUtils {
|
||||
if (ShareUtils.shareEntrance == ShareUtils.ShareEntrance.askNormal ||
|
||||
ShareUtils.shareEntrance == ShareEntrance.communityArticle ||
|
||||
ShareUtils.shareEntrance == ShareUtils.ShareEntrance.video) {
|
||||
NewLogUtils.logShareResult(false);
|
||||
NewLogUtils.logShareResult(ShareUtils.additionalParams, false);
|
||||
}
|
||||
}
|
||||
|
||||
@ -232,7 +234,7 @@ public class ShareUtils {
|
||||
public void shareInviteFriends(Activity activity, String url, String way) {
|
||||
if (activity.isFinishing()) return;
|
||||
this.mActivity = new WeakReference<>(activity);
|
||||
this.shareIcon = activity.getString(R.string.gh_icon_url);
|
||||
this.shareIcon = getHttpsUrl(activity.getString(R.string.gh_icon_url));
|
||||
this.shareUrl = url;
|
||||
this.mSummary = "卡牌神器,海量游戏下载,积分大礼,等你尝鲜";
|
||||
this.mTitle = "推荐一款好玩的游戏下载APP【光环助手】";
|
||||
@ -270,7 +272,7 @@ public class ShareUtils {
|
||||
public void showShareUserHomeWindows(Activity activity, View view, String url, String icon, String shareTitle, String shareSummary, ShareEntrance shareEntrance, String id, ShareCallBack callBack) {
|
||||
if (activity.isFinishing()) return;
|
||||
this.mActivity = new WeakReference<>(activity);
|
||||
this.shareIcon = icon;
|
||||
this.shareIcon = getHttpsUrl(icon);
|
||||
this.shareUrl = url;
|
||||
this.mSummary = shareSummary;
|
||||
this.mTitle = shareTitle;
|
||||
@ -331,7 +333,7 @@ public class ShareUtils {
|
||||
public void showShareWindowsCallback(Activity activity, View view, String url, String icon, String shareTitle, String shareSummary, ShareEntrance shareEntrance, String id, ShareCallBack callBack) {
|
||||
if (activity.isFinishing()) return;
|
||||
this.mActivity = new WeakReference<>(activity);
|
||||
this.shareIcon = icon;
|
||||
this.shareIcon = getHttpsUrl(icon);
|
||||
this.shareUrl = url;
|
||||
this.mSummary = shareSummary;
|
||||
this.mTitle = shareTitle;
|
||||
@ -416,14 +418,19 @@ public class ShareUtils {
|
||||
});
|
||||
}
|
||||
|
||||
public void shareParamsDetail(Activity activity, String url, String icon, String shareTitle, String shareSummary, ShareEntrance shareEntrance, String id, ShareCallBack callBack) {
|
||||
public void shareParamsDetail(Activity activity, String url, String icon, String shareTitle, String shareSummary, ShareEntrance shareEntrance, String id) {
|
||||
shareParamsDetail(activity, url, icon, shareTitle, shareSummary, shareEntrance, id, null);
|
||||
}
|
||||
|
||||
public void shareParamsDetail(Activity activity, String url, String icon, String shareTitle, String shareSummary, ShareEntrance shareEntrance, String id, AdditionalParamsEntity params) {
|
||||
if (activity.isFinishing()) return;
|
||||
this.mActivity = new WeakReference<>(activity);
|
||||
this.shareIcon = icon;
|
||||
this.shareIcon = getHttpsUrl(icon);
|
||||
this.shareUrl = url;
|
||||
this.mSummary = shareSummary;
|
||||
this.mTitle = shareTitle;
|
||||
this.mShareEntrance = shareEntrance;
|
||||
ShareUtils.additionalParams = params;
|
||||
ShareUtils.shareEntrance = mShareEntrance;
|
||||
ShareUtils.resourceId = id;
|
||||
ShareUtils.shareEntity = new ShareEntity(shareUrl, mTitle, mSummary);
|
||||
@ -888,6 +895,13 @@ public class ShareUtils {
|
||||
}
|
||||
}
|
||||
|
||||
private String getHttpsUrl(String url) {
|
||||
if (url.startsWith("http://")) {
|
||||
return url.replace("http://", "https://");
|
||||
}
|
||||
return url;
|
||||
}
|
||||
|
||||
interface OnItemClickListener {
|
||||
void onItemClick(int position);
|
||||
}
|
||||
|
||||
@ -39,7 +39,7 @@ object TextHelper {
|
||||
val str = editText.text.toString().substring(0, length)
|
||||
editText.setText(str)
|
||||
editText.setSelection(str.length)
|
||||
if (!ClickUtils.isFastDoubleClick(R.id.userinfo_nickname_et, 2000)) {
|
||||
if (!ClickUtils.isFastDoubleClick(R.id.inputEt, 2000)) {
|
||||
exceedCallback?.onExceed()
|
||||
}
|
||||
}
|
||||
|
||||
@ -38,23 +38,23 @@ public class UserIconUtils {
|
||||
public static String getUserIconUrl(int i) {
|
||||
switch (i) {
|
||||
case 1:
|
||||
return "http://image.ghzs666.com/pic/default_icon_1.png";
|
||||
return "https://image.ghzs666.com/pic/default_icon_1.png";
|
||||
case 2:
|
||||
return "http://image.ghzs666.com/pic/default_icon_2.png";
|
||||
return "https://image.ghzs666.com/pic/default_icon_2.png";
|
||||
case 3:
|
||||
return "http://image.ghzs666.com/pic/default_icon_3.png";
|
||||
return "https://image.ghzs666.com/pic/default_icon_3.png";
|
||||
case 4:
|
||||
return "http://image.ghzs666.com/pic/default_icon_4.png";
|
||||
return "https://image.ghzs666.com/pic/default_icon_4.png";
|
||||
case 5:
|
||||
return "http://image.ghzs666.com/pic/default_icon_5.png";
|
||||
return "https://image.ghzs666.com/pic/default_icon_5.png";
|
||||
case 6:
|
||||
return "http://image.ghzs666.com/pic/default_icon_6.png";
|
||||
return "https://image.ghzs666.com/pic/default_icon_6.png";
|
||||
case 7:
|
||||
return "http://image.ghzs666.com/pic/default_icon_7.png";
|
||||
return "https://image.ghzs666.com/pic/default_icon_7.png";
|
||||
case 8:
|
||||
return "http://image.ghzs666.com/pic/default_icon_8.png";
|
||||
return "https://image.ghzs666.com/pic/default_icon_8.png";
|
||||
default:
|
||||
return "http://image.ghzs666.com/pic/default_icon_1.png";
|
||||
return "https://image.ghzs666.com/pic/default_icon_1.png";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -4,7 +4,7 @@ import android.os.Parcelable
|
||||
import androidx.annotation.Keep
|
||||
import androidx.room.Entity
|
||||
import androidx.room.PrimaryKey
|
||||
import kotlinx.android.parcel.Parcelize
|
||||
import kotlinx.parcelize.Parcelize
|
||||
import java.util.*
|
||||
|
||||
@Keep
|
||||
|
||||
@ -10,6 +10,7 @@ import android.widget.ImageView
|
||||
import android.widget.LinearLayout
|
||||
import android.widget.PopupWindow
|
||||
import android.widget.TextView
|
||||
import androidx.annotation.ColorInt
|
||||
import androidx.core.content.ContextCompat
|
||||
import com.gh.common.util.toColor
|
||||
import com.gh.common.util.visibleIf
|
||||
@ -74,13 +75,23 @@ class CatalogFilterView @JvmOverloads constructor(context: Context, attrs: Attri
|
||||
mOnCatalogFilterSetupListener = onCatalogFilterSetupListener
|
||||
}
|
||||
|
||||
fun setRootBackgroundColor(@ColorInt color: Int) {
|
||||
findViewById<View>(R.id.config_controller).setBackgroundColor(color)
|
||||
}
|
||||
|
||||
fun setItemTextColor(@ColorInt color: Int) {
|
||||
mTypeTv.setTextColor(color)
|
||||
mCatalogTv.setTextColor(color)
|
||||
mSizeTv.setTextColor(color)
|
||||
}
|
||||
|
||||
private fun toggleHighlightedTextView(targetTextView: TextView, highlightIt: Boolean) {
|
||||
if (highlightIt) {
|
||||
targetTextView.background = ContextCompat.getDrawable(targetTextView.context, R.drawable.bg_tag_text)
|
||||
targetTextView.setTextColor(Color.WHITE)
|
||||
} else {
|
||||
targetTextView.background = null
|
||||
targetTextView.setTextColor(ContextCompat.getColor(targetTextView.context, R.color.text_757575))
|
||||
targetTextView.setTextColor(R.color.text_757575.toColor(context))
|
||||
}
|
||||
}
|
||||
|
||||
@ -90,7 +101,7 @@ class CatalogFilterView @JvmOverloads constructor(context: Context, attrs: Attri
|
||||
drawableUp?.setBounds(0, 0, drawableUp.minimumWidth, drawableUp.minimumHeight)
|
||||
drawableDown?.setBounds(0, 0, drawableDown.minimumWidth, drawableDown.minimumHeight)
|
||||
|
||||
typeTv.setTextColor(R.color.theme_font.toColor())
|
||||
typeTv.setTextColor(R.color.theme_font.toColor(context))
|
||||
typeTv.setCompoundDrawables(null, null, drawableUp, null)
|
||||
|
||||
val inflater = LayoutInflater.from(typeTv.context)
|
||||
@ -134,7 +145,7 @@ class CatalogFilterView @JvmOverloads constructor(context: Context, attrs: Attri
|
||||
}
|
||||
|
||||
popupWindow.setOnDismissListener {
|
||||
typeTv.setTextColor(R.color.text_757575.toColor())
|
||||
typeTv.setTextColor(R.color.text_757575.toColor(context))
|
||||
typeTv.setCompoundDrawables(null, null, drawableDown, null)
|
||||
}
|
||||
|
||||
@ -150,7 +161,7 @@ class CatalogFilterView @JvmOverloads constructor(context: Context, attrs: Attri
|
||||
drawableUp?.setBounds(0, 0, drawableUp.minimumWidth, drawableUp.minimumHeight)
|
||||
drawableDown?.setBounds(0, 0, drawableDown.minimumWidth, drawableDown.minimumHeight)
|
||||
|
||||
catalogTv.setTextColor(R.color.theme_font.toColor())
|
||||
catalogTv.setTextColor(R.color.theme_font.toColor(context))
|
||||
catalogTv.setCompoundDrawables(null, null, drawableUp, null)
|
||||
|
||||
val inflater = LayoutInflater.from(catalogTv.context)
|
||||
@ -196,7 +207,7 @@ class CatalogFilterView @JvmOverloads constructor(context: Context, attrs: Attri
|
||||
}
|
||||
|
||||
popupWindow.setOnDismissListener {
|
||||
catalogTv.setTextColor(R.color.text_757575.toColor())
|
||||
catalogTv.setTextColor(R.color.text_757575.toColor(context))
|
||||
catalogTv.setCompoundDrawables(null, null, drawableDown, null)
|
||||
}
|
||||
|
||||
@ -212,7 +223,7 @@ class CatalogFilterView @JvmOverloads constructor(context: Context, attrs: Attri
|
||||
drawableUp?.setBounds(0, 0, drawableUp.minimumWidth, drawableUp.minimumHeight)
|
||||
drawableDown?.setBounds(0, 0, drawableDown.minimumWidth, drawableDown.minimumHeight)
|
||||
|
||||
sizeTv.setTextColor(R.color.theme_font.toColor())
|
||||
sizeTv.setTextColor(R.color.theme_font.toColor(context))
|
||||
sizeTv.setCompoundDrawables(null, null, drawableUp, null)
|
||||
|
||||
val inflater = LayoutInflater.from(sizeTv.context)
|
||||
@ -266,7 +277,7 @@ class CatalogFilterView @JvmOverloads constructor(context: Context, attrs: Attri
|
||||
}
|
||||
|
||||
popupWindow.setOnDismissListener {
|
||||
sizeTv.setTextColor(R.color.text_757575.toColor())
|
||||
sizeTv.setTextColor(R.color.text_757575.toColor(context))
|
||||
sizeTv.setCompoundDrawables(null, null, drawableDown, null)
|
||||
}
|
||||
|
||||
|
||||
@ -2,7 +2,6 @@ package com.gh.common.view
|
||||
|
||||
import android.content.Context
|
||||
import android.graphics.Color
|
||||
import android.graphics.drawable.GradientDrawable
|
||||
import android.util.AttributeSet
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
@ -17,18 +16,25 @@ import com.gh.gamecenter.R
|
||||
import com.gh.gamecenter.entity.SubjectSettingEntity
|
||||
import com.google.android.flexbox.FlexboxLayout
|
||||
|
||||
class ConfigFilterView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0)
|
||||
: ConstraintLayout(context, attrs, defStyleAttr) {
|
||||
class ConfigFilterView @JvmOverloads constructor(
|
||||
context: Context,
|
||||
attrs: AttributeSet? = null,
|
||||
defStyleAttr: Int = 0
|
||||
) : ConstraintLayout(context, attrs, defStyleAttr) {
|
||||
|
||||
private var mSizeTv: TextView
|
||||
private var mPopupWindow: PopupWindow? = null
|
||||
|
||||
var newestTv: TextView
|
||||
var ratingTv: TextView //目前只在专题页面显示
|
||||
var recommendedTv: TextView
|
||||
var updateTv: TextView //更新
|
||||
var container: View
|
||||
|
||||
var sizeFilterArray: ArrayList<SubjectSettingEntity.Size>? = null
|
||||
|
||||
private var mOnConfigFilterSetupListener: OnConfigFilterSetupListener? = null
|
||||
private var mSelectionTvList: ArrayList<TextView>
|
||||
|
||||
init {
|
||||
View.inflate(context, R.layout.layout_config_filter, this)
|
||||
@ -36,7 +42,11 @@ class ConfigFilterView @JvmOverloads constructor(context: Context, attrs: Attrib
|
||||
mSizeTv = findViewById(R.id.size_tv)
|
||||
newestTv = findViewById(R.id.newest_tv)
|
||||
ratingTv = findViewById(R.id.rating_tv)
|
||||
updateTv = findViewById(R.id.updateTv)
|
||||
recommendedTv = findViewById(R.id.recommended_tv)
|
||||
container = findViewById(R.id.config_controller)
|
||||
|
||||
mSelectionTvList = arrayListOf(newestTv, ratingTv, updateTv, recommendedTv)
|
||||
|
||||
mSizeTv.setOnClickListener {
|
||||
mOnConfigFilterSetupListener?.onShowSortSize()
|
||||
@ -45,55 +55,85 @@ class ConfigFilterView @JvmOverloads constructor(context: Context, attrs: Attrib
|
||||
|
||||
ratingTv.setOnClickListener {
|
||||
mOnConfigFilterSetupListener?.onSetupSortType(SortType.RATING)
|
||||
toggleHighlightedTextView(ratingTv, true)
|
||||
toggleHighlightedTextView(newestTv, false)
|
||||
toggleHighlightedTextView(recommendedTv, false)
|
||||
updateHighlightedTextView(ratingTv)
|
||||
}
|
||||
|
||||
updateTv.setOnClickListener {
|
||||
mOnConfigFilterSetupListener?.onSetupSortType(SortType.UPDATE)
|
||||
updateHighlightedTextView(updateTv)
|
||||
}
|
||||
|
||||
newestTv.setOnClickListener {
|
||||
mOnConfigFilterSetupListener?.onSetupSortType(SortType.NEWEST)
|
||||
toggleHighlightedTextView(ratingTv, false)
|
||||
toggleHighlightedTextView(newestTv, true)
|
||||
toggleHighlightedTextView(recommendedTv, false)
|
||||
updateHighlightedTextView(newestTv)
|
||||
}
|
||||
|
||||
recommendedTv.setOnClickListener {
|
||||
mOnConfigFilterSetupListener?.onSetupSortType(SortType.RECOMMENDED)
|
||||
toggleHighlightedTextView(ratingTv, false)
|
||||
toggleHighlightedTextView(newestTv, false)
|
||||
toggleHighlightedTextView(recommendedTv, true)
|
||||
updateHighlightedTextView(recommendedTv)
|
||||
}
|
||||
}
|
||||
|
||||
private fun updateHighlightedTextView(highlightedTv: TextView) {
|
||||
for (tv in mSelectionTvList) {
|
||||
toggleHighlightedTextView(tv, tv == highlightedTv)
|
||||
}
|
||||
}
|
||||
|
||||
fun updateAllTextView(sortType: SortType) {
|
||||
when (sortType) {
|
||||
SortType.RECOMMENDED -> updateHighlightedTextView(recommendedTv)
|
||||
SortType.NEWEST -> updateHighlightedTextView(newestTv)
|
||||
SortType.RATING -> updateHighlightedTextView(ratingTv)
|
||||
SortType.UPDATE -> updateHighlightedTextView(updateTv)
|
||||
}
|
||||
mSizeTv.setTextColor(R.color.text_757575.toColor(context))
|
||||
}
|
||||
|
||||
fun setOnConfigSetupListener(onConfigFilterSetupListener: OnConfigFilterSetupListener) {
|
||||
mOnConfigFilterSetupListener = onConfigFilterSetupListener
|
||||
}
|
||||
|
||||
private fun toggleHighlightedTextView(targetTextView: TextView, highlightIt: Boolean) {
|
||||
if (highlightIt) {
|
||||
targetTextView.background = ContextCompat.getDrawable(targetTextView.context, R.drawable.bg_tag_text)
|
||||
targetTextView.background =
|
||||
ContextCompat.getDrawable(targetTextView.context, R.drawable.bg_tag_text)
|
||||
targetTextView.setTextColor(Color.WHITE)
|
||||
} else {
|
||||
targetTextView.background = null
|
||||
targetTextView.setTextColor(ContextCompat.getColor(targetTextView.context, R.color.text_757575))
|
||||
targetTextView.setTextColor(
|
||||
ContextCompat.getColor(
|
||||
targetTextView.context,
|
||||
R.color.text_757575
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
fun updatePopupWindow() {
|
||||
if (mPopupWindow != null) {
|
||||
mPopupWindow?.dismiss()
|
||||
showSelectionPopupWindow(this, mSizeTv, mSizeTv.text.toString())
|
||||
}
|
||||
}
|
||||
|
||||
private fun showSelectionPopupWindow(containerView: View, sizeTv: TextView, sizeText: String) {
|
||||
val drawableUp = ContextCompat.getDrawable(sizeTv.context, R.drawable.ic_filter_arrow_up)
|
||||
val drawableDown = ContextCompat.getDrawable(sizeTv.context, R.drawable.ic_filter_arrow_down)
|
||||
val drawableDown =
|
||||
ContextCompat.getDrawable(sizeTv.context, R.drawable.ic_filter_arrow_down)
|
||||
drawableUp?.setBounds(0, 0, drawableUp.minimumWidth, drawableUp.minimumHeight)
|
||||
drawableDown?.setBounds(0, 0, drawableDown.minimumWidth, drawableDown.minimumHeight)
|
||||
|
||||
sizeTv.setTextColor(R.color.theme_font.toColor())
|
||||
sizeTv.setTextColor(R.color.theme_font.toColor(sizeTv.context))
|
||||
sizeTv.setCompoundDrawables(null, null, drawableUp, null)
|
||||
|
||||
val inflater = LayoutInflater.from(sizeTv.context)
|
||||
val layout = inflater.inflate(R.layout.layout_filter_size, null)
|
||||
val popupWindow = PopupWindow(
|
||||
layout,
|
||||
LinearLayout.LayoutParams.MATCH_PARENT,
|
||||
LinearLayout.LayoutParams.WRAP_CONTENT)
|
||||
layout,
|
||||
LinearLayout.LayoutParams.MATCH_PARENT,
|
||||
LinearLayout.LayoutParams.WRAP_CONTENT
|
||||
).apply { mPopupWindow = this }
|
||||
|
||||
val flexboxLayout = layout.findViewById<FlexboxLayout>(R.id.flexbox)
|
||||
val backgroundView = layout.findViewById<View>(R.id.background)
|
||||
@ -143,8 +183,9 @@ class ConfigFilterView @JvmOverloads constructor(context: Context, attrs: Attrib
|
||||
}
|
||||
|
||||
popupWindow.setOnDismissListener {
|
||||
sizeTv.setTextColor(R.color.text_757575.toColor())
|
||||
sizeTv.setTextColor(R.color.text_757575.toColor(sizeTv.context))
|
||||
sizeTv.setCompoundDrawables(null, null, drawableDown, null)
|
||||
mPopupWindow = null
|
||||
}
|
||||
|
||||
popupWindow.isTouchable = true
|
||||
@ -173,7 +214,8 @@ class ConfigFilterView @JvmOverloads constructor(context: Context, attrs: Attrib
|
||||
enum class SortType {
|
||||
RECOMMENDED,
|
||||
NEWEST,
|
||||
RATING
|
||||
RATING,
|
||||
UPDATE
|
||||
}
|
||||
|
||||
}
|
||||
@ -170,7 +170,7 @@ public class DownloadProgressBar extends ProgressBar {
|
||||
case INSTALL_NORMAL:
|
||||
case H5_GAME:
|
||||
if (mDownloadStyle == DOWNLOAD_IMAGE_STYLE) {
|
||||
setProgressDrawable(getResources().getDrawable(R.drawable.detail_download_normal_image_style));
|
||||
setProgressDrawable(getResources().getDrawable(R.drawable.text_white_background));
|
||||
mDefaultColor = Color.BLACK;
|
||||
} else {
|
||||
setProgressDrawable(getResources().getDrawable(R.drawable.download_button_normal_style));
|
||||
@ -185,7 +185,7 @@ public class DownloadProgressBar extends ProgressBar {
|
||||
setProgress(0);
|
||||
break;
|
||||
case NONE:
|
||||
setProgressDrawable(getResources().getDrawable(R.drawable.news_detail_comment));
|
||||
setProgressDrawable(getResources().getDrawable(R.drawable.button_border_gray_oval));
|
||||
mDefaultColor = ContextCompat.getColor(getContext(), R.color.hint);
|
||||
setProgress(0);
|
||||
break;
|
||||
@ -209,8 +209,8 @@ public class DownloadProgressBar extends ProgressBar {
|
||||
}
|
||||
break;
|
||||
case DOWNLOADING_PLUGIN:
|
||||
setProgressDrawable(getResources().getDrawable(R.drawable.detail_downloading_plugin_style));
|
||||
mDefaultColor = ContextCompat.getColor(getContext(), R.color.text_00B8B8);
|
||||
setProgressDrawable(getResources().getDrawable(R.drawable.detail_downloading_normal_style));
|
||||
mDefaultColor = ContextCompat.getColor(getContext(), R.color.theme_font);
|
||||
break;
|
||||
case RESERVABLE:
|
||||
setProgressDrawable(getResources().getDrawable(R.drawable.button_reserve));
|
||||
@ -221,8 +221,8 @@ public class DownloadProgressBar extends ProgressBar {
|
||||
mDefaultColor = ContextCompat.getColor(getContext(), R.color.white);
|
||||
break;
|
||||
case RESERVED:
|
||||
setProgressDrawable(getResources().getDrawable(R.drawable.game_item_btn_pause_dn));
|
||||
mDefaultColor = ContextCompat.getColor(getContext(), R.color.white);
|
||||
setProgressDrawable(getResources().getDrawable(R.drawable.bg_shape_f5_radius_999));
|
||||
mDefaultColor = ContextCompat.getColor(getContext(), R.color.text_subtitleDesc);
|
||||
break;
|
||||
case XAPK_FAILURE:
|
||||
case XAPK_SUCCESS:
|
||||
|
||||
@ -13,7 +13,6 @@ import android.widget.TextView
|
||||
import androidx.annotation.ColorRes
|
||||
import androidx.annotation.DrawableRes
|
||||
import androidx.core.content.ContextCompat
|
||||
import com.gh.common.databind.DrawablesBindingAdapter
|
||||
import com.gh.common.util.DisplayUtils
|
||||
import com.gh.common.util.dip2px
|
||||
import com.halo.assistant.HaloApp
|
||||
|
||||
@ -183,7 +183,7 @@ class FilterView @JvmOverloads constructor(context: Context, attrs: AttributeSet
|
||||
holder.binding.titleTv.setBackgroundResource(R.drawable.bg_tag_text)
|
||||
holder.binding.titleTv.setTextColor(R.color.white.toColor())
|
||||
} else {
|
||||
holder.binding.titleTv.setBackgroundColor(Color.WHITE)
|
||||
holder.binding.titleTv.setBackgroundColor(R.color.background_white.toColor(holder.binding.root.context))
|
||||
holder.binding.titleTv.setTextColor(R.color.text_777777.toColor())
|
||||
}
|
||||
|
||||
|
||||
@ -14,6 +14,7 @@ import androidx.core.content.ContextCompat
|
||||
import com.gh.common.util.DisplayUtils
|
||||
import com.gh.common.util.dip2px
|
||||
import com.gh.common.util.sp2px
|
||||
import com.gh.common.util.toColor
|
||||
import com.gh.gamecenter.R
|
||||
import com.gh.gamecenter.entity.TagStyleEntity
|
||||
import kotlin.math.ceil
|
||||
@ -43,7 +44,7 @@ class FlexLinearLayout @JvmOverloads constructor(context: Context, attrs: Attrib
|
||||
mMargin = ta.getDimensionPixelSize(R.styleable.FlexLinearLayout_itemMargin, 4f.dip2px())
|
||||
mTextSize = ta.getDimension(R.styleable.FlexLinearLayout_itemTextSize, 10f.sp2px().toFloat())
|
||||
mLastItemWidth = ta.getDimensionPixelSize(R.styleable.FlexLinearLayout_lastItemWidth, 18f.dip2px())
|
||||
mStrokeWidth = ta.getDimensionPixelSize(R.styleable.FlexLinearLayout_strokeWidth, 1f.dip2px())
|
||||
mStrokeWidth = ta.getDimensionPixelSize(R.styleable.FlexLinearLayout_strokeWidth, 0.5f.dip2px())
|
||||
|
||||
ta.recycle()
|
||||
}
|
||||
@ -107,7 +108,7 @@ class FlexLinearLayout @JvmOverloads constructor(context: Context, attrs: Attrib
|
||||
includeFontPadding = false
|
||||
textSize = DisplayUtils.px2sp(context, mTextSize).toFloat()
|
||||
gravity = Gravity.CENTER
|
||||
setTextColor(Color.parseColor("#333333"))
|
||||
setTextColor(R.color.text_title.toColor(context))
|
||||
|
||||
val params = LayoutParams(LayoutParams.WRAP_CONTENT, mItemHeight)
|
||||
params.setMargins(0, 0, mMargin, 0)
|
||||
@ -125,7 +126,7 @@ class FlexLinearLayout @JvmOverloads constructor(context: Context, attrs: Attrib
|
||||
private fun createBackgroundDrawable(): GradientDrawable {
|
||||
val gradientDrawable = GradientDrawable()
|
||||
gradientDrawable.setColor(Color.TRANSPARENT)
|
||||
gradientDrawable.setStroke(mStrokeWidth, Color.parseColor("#C2C6CC"))
|
||||
gradientDrawable.setStroke(mStrokeWidth, Color.parseColor("#CCCCCC"))
|
||||
gradientDrawable.cornerRadius = DisplayUtils.dip2px(2f).toFloat()
|
||||
return gradientDrawable
|
||||
}
|
||||
|
||||
@ -79,9 +79,20 @@ class GameIconView : CardView {
|
||||
}
|
||||
|
||||
fun displayGameIcon(icon: String?, iconSubscript: String?) {
|
||||
ImageUtils.display(mGameIconIv, icon)
|
||||
ImageUtils.display(mGameIconDecorationIv, iconSubscript)
|
||||
displayGameIcon(icon, iconSubscript, false)
|
||||
}
|
||||
|
||||
fun displayGameIcon(icon: String?, iconSubscript: String?, goneIfEmpty: Boolean = false) {
|
||||
if (getTag(ImageUtils.TAG_TARGET_WIDTH) == null) {
|
||||
setTag(ImageUtils.TAG_TARGET_WIDTH, layoutParams.width)
|
||||
}
|
||||
|
||||
mGameIconIv?.display(icon)
|
||||
mGameIconDecorationIv?.display(iconSubscript)
|
||||
mGameIconDecorationIv?.goneIf(TextUtils.isEmpty(iconSubscript))
|
||||
if (goneIfEmpty) {
|
||||
visibility = if(TextUtils.isEmpty(icon)) View.GONE else View.VISIBLE
|
||||
}
|
||||
}
|
||||
|
||||
fun getIconIv(): SimpleDraweeView = mGameIconIv!!
|
||||
|
||||
@ -12,6 +12,7 @@ import android.widget.LinearLayout
|
||||
import android.widget.TextView
|
||||
import androidx.core.content.ContextCompat
|
||||
import com.gh.common.util.DisplayUtils
|
||||
import com.gh.common.util.toColor
|
||||
import com.gh.gamecenter.R
|
||||
import com.gh.gamecenter.entity.TagStyleEntity
|
||||
import kotlin.math.ceil
|
||||
@ -80,7 +81,7 @@ class GameTagFlexLinearLayout @JvmOverloads constructor(context: Context, attrs:
|
||||
includeFontPadding = false
|
||||
textSize = mTextSize
|
||||
gravity = Gravity.CENTER
|
||||
setTextColor(Color.parseColor("#666666"))
|
||||
setTextColor(R.color.text_subtitle.toColor(context))
|
||||
|
||||
val params = LayoutParams(LayoutParams.WRAP_CONTENT, mItemHeight)
|
||||
params.setMargins(0, 0, mMargin, 0)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user